diff --git a/ABOUT-NLS b/ABOUT-NLS
deleted file mode 100644
index 47d5e39..0000000
--- a/ABOUT-NLS
+++ /dev/null
@@ -1,625 +0,0 @@
-Notes on the Free Translation Project
-*************************************
-
-   Free software is going international!  The Free Translation Project
-is a way to get maintainers of free software, translators, and users all
-together, so that will gradually become able to speak many languages.
-A few packages already provide translations for their messages.
-
-   If you found this `ABOUT-NLS' file inside a distribution, you may
-assume that the distributed package does use GNU `gettext' internally,
-itself available at your nearest GNU archive site.  But you do _not_
-need to install GNU `gettext' prior to configuring, installing or using
-this package with messages translated.
-
-   Installers will find here some useful hints.  These notes also
-explain how users should proceed for getting the programs to use the
-available translations.  They tell how people wanting to contribute and
-work at translations should contact the appropriate team.
-
-   When reporting bugs in the `intl/' directory or bugs which may be
-related to internationalization, you should tell about the version of
-`gettext' which is used.  The information can be found in the
-`intl/VERSION' file, in internationalized packages.
-
-Quick configuration advice
-==========================
-
-   If you want to exploit the full power of internationalization, you
-should configure it using
-
-     ./configure --with-included-gettext
-
-to force usage of internationalizing routines provided within this
-package, despite the existence of internationalizing capabilities in the
-operating system where this package is being installed.  So far, only
-the `gettext' implementation in the GNU C library version 2 provides as
-many features (such as locale alias, message inheritance, automatic
-charset conversion or plural form handling) as the implementation here.
-It is also not possible to offer this additional functionality on top
-of a `catgets' implementation.  Future versions of GNU `gettext' will
-very likely convey even more functionality.  So it might be a good idea
-to change to GNU `gettext' as soon as possible.
-
-   So you need _not_ provide this option if you are using GNU libc 2 or
-you have installed a recent copy of the GNU gettext package with the
-included `libintl'.
-
-INSTALL Matters
-===============
-
-   Some packages are "localizable" when properly installed; the
-programs they contain can be made to speak your own native language.
-Most such packages use GNU `gettext'.  Other packages have their own
-ways to internationalization, predating GNU `gettext'.
-
-   By default, this package will be installed to allow translation of
-messages.  It will automatically detect whether the system already
-provides the GNU `gettext' functions.  If not, the GNU `gettext' own
-library will be used.  This library is wholly contained within this
-package, usually in the `intl/' subdirectory, so prior installation of
-the GNU `gettext' package is _not_ required.  Installers may use
-special options at configuration time for changing the default
-behaviour.  The commands:
-
-     ./configure --with-included-gettext
-     ./configure --disable-nls
-
-will respectively bypass any pre-existing `gettext' to use the
-internationalizing routines provided within this package, or else,
-_totally_ disable translation of messages.
-
-   When you already have GNU `gettext' installed on your system and run
-configure without an option for your new package, `configure' will
-probably detect the previously built and installed `libintl.a' file and
-will decide to use this.  This might be not what is desirable.  You
-should use the more recent version of the GNU `gettext' library.  I.e.
-if the file `intl/VERSION' shows that the library which comes with this
-package is more recent, you should use
-
-     ./configure --with-included-gettext
-
-to prevent auto-detection.
-
-   The configuration process will not test for the `catgets' function
-and therefore it will not be used.  The reason is that even an
-emulation of `gettext' on top of `catgets' could not provide all the
-extensions of the GNU `gettext' library.
-
-   Internationalized packages have usually many `po/LL.po' files, where
-LL gives an ISO 639 two-letter code identifying the language.  Unless
-translations have been forbidden at `configure' time by using the
-`--disable-nls' switch, all available translations are installed
-together with the package.  However, the environment variable `LINGUAS'
-may be set, prior to configuration, to limit the installed set.
-`LINGUAS' should then contain a space separated list of two-letter
-codes, stating which languages are allowed.
-
-Using This Package
-==================
-
-   As a user, if your language has been installed for this package, you
-only have to set the `LANG' environment variable to the appropriate
-`LL_CC' combination.  Here `LL' is an ISO 639 two-letter language code,
-and `CC' is an ISO 3166 two-letter country code.  For example, let's
-suppose that you speak German and live in Germany.  At the shell
-prompt, merely execute `setenv LANG de_DE' (in `csh'),
-`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
-This can be done from your `.login' or `.profile' file, once and for
-all.
-
-   You might think that the country code specification is redundant.
-But in fact, some languages have dialects in different countries.  For
-example, `de_AT' is used for Austria, and `pt_BR' for Brazil.  The
-country code serves to distinguish the dialects.
-
-   The locale naming convention of `LL_CC', with `LL' denoting the
-language and `CC' denoting the country, is the one use on systems based
-on GNU libc.  On other systems, some variations of this scheme are
-used, such as `LL' or `LL_CC.ENCODING'.  You can get the list of
-locales supported by your system for your country by running the command
-`locale -a | grep '^LL''.
-
-   Not all programs have translations for all languages.  By default, an
-English message is shown in place of a nonexistent translation.  If you
-understand other languages, you can set up a priority list of languages.
-This is done through a different environment variable, called
-`LANGUAGE'.  GNU `gettext' gives preference to `LANGUAGE' over `LANG'
-for the purpose of message handling, but you still need to have `LANG'
-set to the primary language; this is required by other parts of the
-system libraries.  For example, some Swedish users who would rather
-read translations in German than English for when Swedish is not
-available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
-
-   In the `LANGUAGE' environment variable, but not in the `LANG'
-environment variable, `LL_CC' combinations can be abbreviated as `LL'
-to denote the language's main dialect.  For example, `de' is equivalent
-to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
-(Portuguese as spoken in Portugal) in this context.
-
-Translating Teams
-=================
-
-   For the Free Translation Project to be a success, we need interested
-people who like their own language and write it well, and who are also
-able to synergize with other translators speaking the same language.
-Each translation team has its own mailing list.  The up-to-date list of
-teams can be found at the Free Translation Project's homepage,
-`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams"
-area.
-
-   If you'd like to volunteer to _work_ at translating messages, you
-should become a member of the translating team for your own language.
-The subscribing address is _not_ the same as the list itself, it has
-`-request' appended.  For example, speakers of Swedish can send a
-message to `sv-request@li.org', having this message body:
-
-     subscribe
-
-   Keep in mind that team members are expected to participate
-_actively_ in translations, or at solving translational difficulties,
-rather than merely lurking around.  If your team does not exist yet and
-you want to start one, or if you are unsure about what to do or how to
-get started, please write to `translation@iro.umontreal.ca' to reach the
-coordinator for all translator teams.
-
-   The English team is special.  It works at improving and uniformizing
-the terminology in use.  Proven linguistic skill are praised more than
-programming skill, here.
-
-Available Packages
-==================
-
-   Languages are not equally supported in all packages.  The following
-matrix shows the current state of internationalization, as of May 2003.
-The matrix shows, in regard of each package, for which languages PO
-files have been submitted to translation coordination, with a
-translation percentage of at least 50%.
-
-     Ready PO files       am az be bg ca cs da de el en en_GB eo es
-                        +-------------------------------------------+
-     a2ps               |       []          [] [] []                |
-     aegis              |                      ()                   |
-     anubis             |                                           |
-     ap-utils           |                                           |
-     bash               |                      []             [] [] |
-     batchelor          |                                           |
-     bfd                |                   []                   [] |
-     binutils           |                   []                   [] |
-     bison              |                   [] []                [] |
-     bluez-pin          |                []                   []    |
-     clisp              |                                           |
-     clisp              |                      []    []          [] |
-     coreutils          |             []    [] []                [] |
-     cpio               |                   [] []                [] |
-     darkstat           |                   ()                   [] |
-     diffutils          |             [] [] [] [] []          [] [] |
-     e2fsprogs          |                []    []                   |
-     enscript           |             []    [] []        []         |
-     error              |             []    [] []        []      [] |
-     fetchmail          |             [] () [] [] []             [] |
-     fileutils          |                   [] []                [] |
-     findutils          |             []    [] [] []          [] [] |
-     flex               |             []    [] []                [] |
-     gas                |                                        [] |
-     gawk               |             []    [] []                [] |
-     gcal               |             []                            |
-     gcc                |                   []                   [] |
-     gettext            |       []    []    [] []                [] |
-     gettext-runtime    |       []    []    [] []                [] |
-     gettext-tools      |                      []                [] |
-     gimp-print         |                [] [] []        []      [] |
-     gliv               |                                           |
-     glunarclock        |    []             [] []                   |
-     gnucash            |                      ()        []         |
-     gnucash-glossary   |                   [] ()                [] |
-     gnupg              |             [] ()    [] []          [] [] |
-     gpe-calendar       |                      []                   |
-     gpe-conf           |                      []                   |
-     gpe-contacts       |                      []                   |
-     gpe-edit           |                                           |
-     gpe-login          |                      []                   |
-     gpe-ownerinfo      |                      []                   |
-     gpe-sketchbook     |                      []                   |
-     gpe-timesheet      |                                           |
-     gpe-today          |                      []                   |
-     gpe-todo           |                      []                   |
-     gphoto2            |                [] [] []                [] |
-     gprof              |                   []                   [] |
-     gpsdrive           |                      ()    ()          () |
-     grep               |          [] []       [] []             [] |
-     gretl              |                                        [] |
-     hello              |             []    [] [] []          [] [] |
-     id-utils           |                   [] []                   |
-     indent             |             []       []             [] [] |
-     jpilot             |                [] [] []                [] |
-     jwhois             |                                        [] |
-     kbd                |                [] [] [] []             [] |
-     ld                 |                   []                   [] |
-     libc               |             [] [] [] [] []             [] |
-     libgpewidget       |                      []                   |
-     libiconv           |             []    [] []             [] [] |
-     lifelines          |                   [] ()                   |
-     lilypond           |                   []                      |
-     lingoteach         |                                           |
-     lingoteach_lessons |                      ()                () |
-     lynx               |             [] [] [] []                   |
-     m4                 |                [] [] [] []                |
-     mailutils          |             []                         [] |
-     make               |                   [] []                [] |
-     man-db             |             [] () [] []                () |
-     mysecretdiary      |                   [] []                [] |
-     nano               |             [] () [] []                [] |
-     nano_1_0           |             [] () [] []                [] |
-     opcodes            |                   []                   [] |
-     parted             |             [] [] [] []                [] |
-     ptx                |             []    [] []             [] [] |
-     python             |                                           |
-     radius             |                                           |
-     recode             |       []          [] [] []          [] [] |
-     screem             |                                           |
-     sed                |             []    [] []             [] [] |
-     sh-utils           |                   [] []                [] |
-     sharutils          |             [] [] [] [] []             [] |
-     sketch             |                   [] ()                [] |
-     soundtracker       |                   [] []                [] |
-     sp                 |                      []                   |
-     tar                |                [] [] []                [] |
-     texinfo            |                [] [] []             []    |
-     textutils          |             []    [] []                [] |
-     tin                |                      ()        ()         |
-     util-linux         |             [] [] [] []                [] |
-     vorbis-tools       |                [] []                   [] |
-     wastesedge         |                      ()                   |
-     wdiff              |             []    [] []                [] |
-     wget               |          [] [] [] [] [] []             [] |
-     xchat              |             []          []             [] |
-     xpad               |                                           |
-                        +-------------------------------------------+
-                          am az be bg ca cs da de el en en_GB eo es
-                           0  1  4  2 31 17 54 60 14  1   4   12 56
-     
-                          et fa fi fr ga gl he hr hu id it ja ko
-                        +----------------------------------------+
-     a2ps               | []    [] []                   ()    () |
-     aegis              |                                        |
-     anubis             |          []                            |
-     ap-utils           |          []                            |
-     bash               |          []             []             |
-     batchelor          |             []                         |
-     bfd                |          []                      []    |
-     binutils           |          []                      []    |
-     bison              | []       []                [] []       |
-     bluez-pin          |          [] []          [] []          |
-     clisp              |                                        |
-     clisp              |          []                            |
-     coreutils          | []       []                   [] []    |
-     cpio               |          []    []       []          [] |
-     darkstat           |          () []          [] []          |
-     diffutils          |       [] []    [] []    [] []    []    |
-     e2fsprogs          |                                        |
-     enscript           |          []          []                |
-     error              |       [] [] []          []             |
-     fetchmail          |                                  []    |
-     fileutils          | []       []             []    [] []    |
-     findutils          | []    [] [] [] []    [] [] [] [] [] [] |
-     flex               |          []                         [] |
-     gas                |          []                            |
-     gawk               |          []       []                   |
-     gcal               |          []                            |
-     gcc                |          []                            |
-     gettext            |          []                      [] [] |
-     gettext-runtime    |          []                []    [] [] |
-     gettext-tools      |                                  []    |
-     gimp-print         |          []                      []    |
-     gliv               |          ()                            |
-     glunarclock        |             [] []       []       []    |
-     gnucash            |                               []       |
-     gnucash-glossary   |                               []       |
-     gnupg              | []    [] []    []          [] [] []    |
-     gpe-calendar       |                            []          |
-     gpe-conf           |                                        |
-     gpe-contacts       |          []                            |
-     gpe-edit           |          []                []          |
-     gpe-login          |          []                            |
-     gpe-ownerinfo      |          []             [] []          |
-     gpe-sketchbook     |          []                            |
-     gpe-timesheet      |          [] []             []          |
-     gpe-today          |          [] []                         |
-     gpe-todo           |          []                []          |
-     gphoto2            |          []             []       []    |
-     gprof              |          []                []          |
-     gpsdrive           |          ()             []    () ()    |
-     grep               | []    [] [] [] [] [] [] [] [] [] []    |
-     gretl              |          []                            |
-     hello              | [] [] [] [] [] [] [] [] [] [] [] [] [] |
-     id-utils           |          []             [] []          |
-     indent             | []    [] []    []       [] [] [] []    |
-     jpilot             |          []                      ()    |
-     jwhois             |          []             [] [] []       |
-     kbd                |          []                            |
-     ld                 |          []                            |
-     libc               |       [] []    []       []       [] [] |
-     libgpewidget       |          [] []             []          |
-     libiconv           |       [] [] [] []    [] [] [] []       |
-     lifelines          |          ()                            |
-     lilypond           |          []                            |
-     lingoteach         |          []                []          |
-     lingoteach_lessons |                                        |
-     lynx               | []                      []    [] []    |
-     m4                 |          []    []          []    []    |
-     mailutils          |                                        |
-     make               |          []    [] [] []          [] [] |
-     man-db             |          []                   () ()    |
-     mysecretdiary      |          []                []          |
-     nano               |          []    []          [] []       |
-     nano_1_0           |          []    []          [] []       |
-     opcodes            |          []                []          |
-     parted             |          []    []                []    |
-     ptx                | []    [] [] [] []       [] []          |
-     python             |                                        |
-     radius             |                                        |
-     recode             |          []    [] []    [] [] []       |
-     screem             |                                        |
-     sed                | []       [] [] []       [] [] [] []    |
-     sh-utils           | []    [] []             []    [] []    |
-     sharutils          | []       []    []       []       []    |
-     sketch             |          []                            |
-     soundtracker       |          []    []    []                |
-     sp                 |          []                      ()    |
-     tar                | []    [] []    []    [] [] [] [] []    |
-     texinfo            |          []       [] []          []    |
-     textutils          |          []    []       []       [] [] |
-     tin                | []       ()                            |
-     util-linux         | []    [] []             []    () []    |
-     vorbis-tools       |          []                            |
-     wastesedge         |          ()                            |
-     wdiff              | []       []    []       [] []          |
-     wget               | []    [] []    [] [] [] []       []    |
-     xchat              | []       []                      []    |
-     xpad               |                                        |
-                        +----------------------------------------+
-                          et fa fi fr ga gl he hr hu id it ja ko
-                          20  1 15 73 14 24  8 10 30 31 19 31  9
-     
-                          lg lt lv ms nb nl nn no pl pt pt_BR ro
-                        +----------------------------------------+
-     a2ps               |          []    []    () () ()  []   [] |
-     aegis              |                ()                      |
-     anubis             |          []                         [] |
-     ap-utils           |                         ()             |
-     bash               |                                []      |
-     batchelor          |                                        |
-     bfd                |                                        |
-     binutils           |                                        |
-     bison              |          []    []              []   [] |
-     bluez-pin          |                                     [] |
-     clisp              |                                        |
-     clisp              |                []                      |
-     coreutils          |                         []             |
-     cpio               |                []       []     []      |
-     darkstat           |          []    []              []   [] |
-     diffutils          |          []             []     []      |
-     e2fsprogs          |                                        |
-     enscript           |                []              []      |
-     error              |                []              []      |
-     fetchmail          |                         ()     ()      |
-     fileutils          |                         []             |
-     findutils          |                []       []     []   [] |
-     flex               |                                []      |
-     gas                |                                        |
-     gawk               |                                []      |
-     gcal               |                                        |
-     gcc                |                                        |
-     gettext            |                         []             |
-     gettext-runtime    |                         []             |
-     gettext-tools      |                                        |
-     gimp-print         |                []                      |
-     gliv               |                                []      |
-     glunarclock        |          []                            |
-     gnucash            |                                        |
-     gnucash-glossary   |                []          []          |
-     gnupg              |                                        |
-     gpe-calendar       |                            []       [] |
-     gpe-conf           |                            []       [] |
-     gpe-contacts       |                            []          |
-     gpe-edit           |                            []       [] |
-     gpe-login          |                            []       [] |
-     gpe-ownerinfo      |                            []       [] |
-     gpe-sketchbook     |                            []       [] |
-     gpe-timesheet      |                            []       [] |
-     gpe-today          |                            []       [] |
-     gpe-todo           |                            []       [] |
-     gphoto2            |                                        |
-     gprof              |                                []      |
-     gpsdrive           |                ()    ()        ()      |
-     grep               |                         [] []  []   [] |
-     gretl              |                                        |
-     hello              |       [] [] [] [] [] [] []     []   [] |
-     id-utils           |                []              []   [] |
-     indent             |                []              []   [] |
-     jpilot             |                ()    ()                |
-     jwhois             |                []              []   [] |
-     kbd                |                                        |
-     ld                 |                                        |
-     libc               |             []       [] []     []      |
-     libgpewidget       |                            []       [] |
-     libiconv           |                                []   [] |
-     lifelines          |                                        |
-     lilypond           |                []                      |
-     lingoteach         |                                        |
-     lingoteach_lessons |                                        |
-     lynx               |                []              []      |
-     m4                 |                []       []     []   [] |
-     mailutils          |                                        |
-     make               |                []              []      |
-     man-db             |                                []      |
-     mysecretdiary      |                                []      |
-     nano               |          []    []       []          [] |
-     nano_1_0           |          [] []    []    []             |
-     opcodes            |                []              []   [] |
-     parted             |                   []       []  []      |
-     ptx                |             [] []    [] [] []  []   [] |
-     python             |                                        |
-     radius             |                                        |
-     recode             |                         []     []   [] |
-     screem             |                                        |
-     sed                |                                []   [] |
-     sh-utils           |             []                         |
-     sharutils          |                []                      |
-     sketch             |                                []      |
-     soundtracker       |                                        |
-     sp                 |                                        |
-     tar                |          [] []       [] []     []   [] |
-     texinfo            |                                     [] |
-     textutils          |             []                         |
-     tin                |                                        |
-     util-linux         |                []              []      |
-     vorbis-tools       |                []                   [] |
-     wastesedge         |                                        |
-     wdiff              |          []             []     []   [] |
-     wget               |                []       []          [] |
-     xchat              |       []       []                      |
-     xpad               |                                     [] |
-                        +----------------------------------------+
-                          lg lt lv ms nb nl nn no pl pt pt_BR ro
-                           0  0  2 11  7 26  3  4 18 15  34   34
-     
-                          ru sk sl sr sv ta tr uk vi wa zh_CN zh_TW
-                        +-------------------------------------------+
-     a2ps               | []    []    []    [] []                   | 16
-     aegis              | ()                                        |  0
-     anubis             |                   [] []                   |  5
-     ap-utils           |                      ()                   |  1
-     bash               | []                                        |  7
-     batchelor          |                                           |  1
-     bfd                |             []    []           []         |  7
-     binutils           |             []    []           []         |  7
-     bison              | []          []                            | 13
-     bluez-pin          |                                           |  7
-     clisp              |                                           |  0
-     clisp              |                                           |  5
-     coreutils          | []    []    []    []                 []   | 14
-     cpio               | []          []                 []         | 13
-     darkstat           |             []                 ()    ()   |  9
-     diffutils          | []          []    []                 []   | 21
-     e2fsprogs          |                   []                      |  3
-     enscript           | []          []    []                      | 11
-     error              |    []             []                 []   | 14
-     fetchmail          |                   []                      |  7
-     fileutils          | []    []    []    []           []    []   | 15
-     findutils          | [] [] []    []    []           []         | 27
-     flex               | []          []    []                      | 10
-     gas                |                   []                      |  3
-     gawk               |             []    []                      |  9
-     gcal               |             []    []                      |  4
-     gcc                |                   []                      |  4
-     gettext            | [] [] []    []    []                 []   | 15
-     gettext-runtime    | [] [] []    []    []                 []   | 16
-     gettext-tools      |    [] []                                  |  5
-     gimp-print         |    []       []                            | 10
-     gliv               |                                           |  1
-     glunarclock        | []          []             []             | 11
-     gnucash            |    []                                []   |  4
-     gnucash-glossary   |    []       []                       []   |  8
-     gnupg              |    []       []    []                 []   | 16
-     gpe-calendar       |                                      []   |  5
-     gpe-conf           |                                           |  3
-     gpe-contacts       |                                      []   |  4
-     gpe-edit           |                                      []   |  5
-     gpe-login          |                                      []   |  5
-     gpe-ownerinfo      |                                      []   |  7
-     gpe-sketchbook     |                                      []   |  5
-     gpe-timesheet      |                                      []   |  6
-     gpe-today          |                                      []   |  6
-     gpe-todo           |                                      []   |  6
-     gphoto2            |             []                 []         |  9
-     gprof              |             []    []                      |  7
-     gpsdrive           |    []       []                            |  3
-     grep               | []    []          [] []                   | 24
-     gretl              |                                           |  2
-     hello              | [] []       []    [] []                   | 33
-     id-utils           | []          []    []                      | 11
-     indent             | [] []       []    []                      | 19
-     jpilot             |             []    []    []     []    []   | 10
-     jwhois             | ()          ()    []                 []   | 10
-     kbd                |             []    []                      |  8
-     ld                 |             []    []                      |  5
-     libc               |    []       []    []           []         | 20
-     libgpewidget       |                                           |  6
-     libiconv           | [] [] []    []    [] []                   | 21
-     lifelines          |             []                            |  2
-     lilypond           |             []                            |  4
-     lingoteach         |                                           |  2
-     lingoteach_lessons |                                ()         |  0
-     lynx               | []          []    [] []                   | 14
-     m4                 | []          []                 []         | 15
-     mailutils          |                                           |  2
-     make               | []          []    []           []         | 15
-     man-db             |             []                            |  6
-     mysecretdiary      |             []    []                      |  8
-     nano               | []          []       []                   | 15
-     nano_1_0           | []          []       []                   | 15
-     opcodes            |             []    []                      |  9
-     parted             |             []    []                      | 13
-     ptx                | []          []    []                      | 22
-     python             |                                           |  0
-     radius             |                                           |  0
-     recode             | []    []    []    []                      | 19
-     screem             |             []                            |  1
-     sed                |    [] []    []    [] []                   | 20
-     sh-utils           | []    []          []                      | 13
-     sharutils          | []          []    []                 []   | 16
-     sketch             |             []                            |  5
-     soundtracker       |             []                            |  7
-     sp                 |                   []                      |  3
-     tar                |    [] []    []    []           []         | 24
-     texinfo            | []          []    []           []         | 13
-     textutils          | []    []    []    []                 []   | 15
-     tin                |                                           |  1
-     util-linux         |             []    []                      | 14
-     vorbis-tools       | []                                        |  7
-     wastesedge         |                                           |  0
-     wdiff              | [] []       []    []                      | 17
-     wget               | [] [] []    []    [] []              []   | 25
-     xchat              |    [] []    []                            | 11
-     xpad               |                                           |  1
-                        +-------------------------------------------+
-       50 teams           ru sk sl sr sv ta tr uk vi wa zh_CN zh_TW
-       97 domains         32 19 16  0 56  0 48 10  1  1  12    23    913
-
-   Some counters in the preceding matrix are higher than the number of
-visible blocks let us expect.  This is because a few extra PO files are
-used for implementing regional variants of languages, or language
-dialects.
-
-   For a PO file in the matrix above to be effective, the package to
-which it applies should also have been internationalized and
-distributed as such by its maintainer.  There might be an observable
-lag between the mere existence a PO file and its wide availability in a
-distribution.
-
-   If May 2003 seems to be old, you may fetch a more recent copy of
-this `ABOUT-NLS' file on most GNU archive sites.  The most up-to-date
-matrix with full percentage details can be found at
-`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
-
-Using `gettext' in new packages
-===============================
-
-   If you are writing a freely available program and want to
-internationalize it you are welcome to use GNU `gettext' in your
-package.  Of course you have to respect the GNU Library General Public
-License which covers the use of the GNU `gettext' library.  This means
-in particular that even non-free programs can use `libintl' as a shared
-library, whereas only free software can use `libintl' as a static
-library or use modified versions of `libintl'.
-
-   Once the sources are changed appropriately and the setup can handle
-the use of `gettext' the only thing missing are the translations.  The
-Free Translation Project is also available for packages which are not
-developed inside the GNU project.  Therefore the information given above
-applies also for every other Free Software Project.  Contact
-`translation@iro.umontreal.ca' to make the `.pot' files available to
-the translation teams.
-
diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644
index 0a3ca6f..0000000
--- a/AUTHORS
+++ /dev/null
@@ -1,8 +0,0 @@
-Authors of GNU Bison.
-
-Bison was written primarily by Robert Corbett.
-
-Richard Stallman made it Yacc-compatible.
-
-Wilfred Hansen of Carnegie Mellon University added multicharacter
-string literals and other features.
diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index 5ce7308..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,84 +0,0 @@
-# 
-# Copyright 2006 The Android Open Source Project
-#
-# Android Asset Packaging Tool
-#
-
-ifeq ($(HOST_OS),linux)
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
-	lib/abitset.c \
-	lib/argmatch.c \
-	lib/basename.c \
-	lib/bitset.c \
-	lib/bitset_stats.c \
-	lib/bitsetv-print.c \
-	lib/bitsetv.c \
-	lib/dirname.c \
-	lib/dup-safer.c \
-	lib/ebitset.c \
-	lib/exitfail.c \
-	lib/fd-safer.c \
-	lib/fopen-safer.c \
-	lib/get-errno.c \
-	lib/hard-locale.c \
-	lib/hash.c \
-	lib/lbitset.c \
-	lib/mbswidth.c \
-	lib/pipe-safer.c \
-	lib/quote.c \
-	lib/quotearg.c \
-	lib/stripslash.c \
-	lib/subpipe.c \
-	lib/timevar.c \
-	lib/vbitset.c \
-	lib/xalloc-die.c \
-	lib/xmalloc.c \
-	lib/xstrndup.c \
-	\
-	src/LR0.c \
-	src/assoc.c \
-	src/closure.c \
-	src/complain.c \
-	src/conflicts.c \
-	src/derives.c \
-	src/files.c \
-	src/getargs.c \
-	src/gram.c \
-	src/lalr.c \
-	src/location.c \
-	src/main.c \
-	src/muscle_tab.c \
-	src/nullable.c \
-	src/output.c \
-	src/parse-gram.c \
-	src/print.c \
-	src/print_graph.c \
-	src/reader.c \
-	src/reduce.c \
-	src/relation.c \
-	src/scan-gram-c.c \
-	src/scan-skel-c.c \
-	src/state.c \
-	src/symlist.c \
-	src/symtab.c \
-	src/tables.c \
-	src/uniqstr.c \
-	src/vcg.c
-
-LOCAL_MODULE := bison
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_IS_HOST_MODULE := true
-intermediates := $(call local-intermediates-dir)
-
-LOCAL_CFLAGS := -DHAVE_CONFIG_H -DPKGDATADIR=\"$(LOCAL_PATH)/data\"
-
-LOCAL_C_INCLUDES := \
-	$(LOCAL_PATH)/lib
-
-include $(BUILD_HOST_EXECUTABLE)
-
-endif
diff --git a/COPYING b/COPYING
deleted file mode 100644
index 3912109..0000000
--- a/COPYING
+++ /dev/null
@@ -1,340 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  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
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  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.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the 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 a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE 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.
-
-		     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
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the 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 2 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, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision 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, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This 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 Library General
-Public License instead of this License.
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100644
index c44f0e4..0000000
--- a/ChangeLog
+++ /dev/null
@@ -1,16034 +0,0 @@
-2006-06-05  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Version 2.3.
-	* configure.ac (AC_INIT): Likewise.
-
-2006-05-30  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (YYRECOVERING): Define to be a function-like macro
-	with no arguments, not as an object-like macro.  This is for
-	compatibility with data/yacc.c.  Problem reported by John P. Hartmann in
-	<http://lists.gnu.org/archive/html/bug-bison/2006-05/msg00059.html>.
-	* doc/bison.texinfo (Action Features, Error Recovery, Table of Symbols):
-	Document this.
-
-2006-05-30  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* src/getargs.c (usage): Back out yesterday's modification of the
-	--help output so that we don't have to wait for translation before
-	releasing 2.3.
-
-2006-05-29  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* doc/bison.texinfo (Introduction): Don't say "GLR grammar".
-	Problem reported by Akim Demaille.
-
-2006-05-29  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* src/getargs.c (usage): Mention GLR not just LALR(1) in --help output.
-
-2006-05-26  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/yacc.c (yy_reduce_print): Omit trailing white space in
-	generated source code.  Problem reported by Frans Englich in
-	<http://lists.gnu.org/archive/html/bug-bison/2006-05/msg00049.html>.
-
-2006-05-22  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* Makefile.maint (gzip_rsyncable, GZIP_ENV): Compute within the
-	shell, not within 'make', so that 'make' by an ordinary builder
-	(using GNU make) does not worry about configuring gzip.  This also
-	works around a bug reported independently by Keith Thompson and by
-	Georg Schwarz, whereby gzip 1.2.4 --help would output usage on
-	stderr rather than stdout, messing up the build logs.
-
-2006-05-21  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* data/yacc.c (yyparse): Wrap the final return from yyparse inside YYID
-	to make sure that YYID will never be unused.  This fixes a 'make
-	maintainer-check' failure caused by the recent changes to the 'Trivial
-	grammars' test case, which caused g++ 4.1.0 to complain that YYID was
-	not used.
-	* data/glr.c (yyparse): Wrap yyparse's return inside YYID just in case.
-
-2006-05-21  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* data/glr.c (yyresolveLocations): Remove bogus YYASSERT that the
-	state before an empty RHS is always resolved here.  Only the location
-	of that state is guaranteed to be resolved, and that's enough.  This
-	fixes the remaining bug reported by Derek M. Jones in
-	<http://lists.gnu.org/archive/html/bug-bison/2006-05/msg00027.html>.
-	* tests/glr-regression.at (Uninitialized location when reporting
-	ambiguity): Test the above case.
-	Also, the embedded comments in this test case claim it checks the case
-	of an empty RHS that has inherited the initial location.  However, the
-	corresponding LHS was already resolved, so yyresolveLocations didn't
-	actually have reason to modify it.  Fix this by forcing
-	nondeterministic operation at the beginning of the parse.
-
-2006-05-20  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/c.m4 (b4_yy_symbol_print_generate):
-	(b4_yy_symbol_print_generate): Use 'YYSTYPE const' rather than
-	'const YYSTYPE', and similarly for YYLTYPE.  This fixes one
-	of the bugs reported today by Derek M Jones in
-	<http://lists.gnu.org/archive/html/bug-bison/2006-05/msg00027.html>.
-	* doc/bison.texinfo (Value Type): Document that YYSTYPE must be
-	defined to be a type name without parens or brackets.
-	(Location Type): Similarly for YYLTYPE.
-	* tests/regression.at (Trivial grammars): Put in a test for this
-	bug that will be caught by 'make maintainer-check' (though not,
-	alas, by 'make check' unless your compiler is picky).
-
-2006-05-19  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Version 2.2.
-	* configure.ac (AC_INIT): Likewise.
-
-2006-05-17  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* data/glr.c (yyreportTree): Make room in yystates for the state
-	preceding the RHS.  This fixes the segmentation fault reported by Derek
-	M. Jones in
-	<http://lists.gnu.org/archive/html/help-bison/2006-05/msg00035.html>.
-	(yyreportTree, yypdumpstack): Subtract 1 from yyrule before printing
-	to the user.  Reported for yyreportTree by Derek M. Jones later in the
-	same thread.
-	* THANKS: Add Derek M. Jones.
-	Update my email address.
-	Fix typo in Steve Murphy's name.
-
-2006-05-14  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (yyreportSyntaxError): Fix off-by-one error in
-	checking against YYLAST that caused the parser to miss a potential
-	alternative in its diagnostic.
-	Problem reported by Maria Jose Moron Fernandez in
-	<http://lists.gnu.org/archive/html/bug-bison/2006-05/msg00024.html>.
-	* data/lalr1.cc (yysyntax_error_): Likewise.
-	* data/yacc.c (yysyntax_error): Likewise.
-	* tests/regression.at (_AT_DATA_DANCER_Y): Use static array for
-	tokens, in case we run into an older C compiler.
-	(_AT_DATA_EXPECT2_Y, AT_CHECK_EXPECT2): New macros.
-	Use them to check for the off-by-one error fixed above.
-
-	* data/yacc.c (yytnamerr): Fix typo: local var should be of type
-	YYSIZE_T, not size_t.
-	* tests/regression.at (Trivial grammars): New test, to catch
-	the error fixed by the above patch.
-
-2006-05-14  Akim Demaille  <akim@lrde.epita.fr>
-
-	* doc/bison.texinfo (C++ Bison Interface): Clarify the naming
-	scheme.
-	Reported by Steve Murphy.
-
-2006-05-14  Akim Demaille  <akim@lrde.epita.fr>
-
-	* data/glr.cc, data/lalr1.cc: Using %defines is mandatory.
-	* data/glr.cc: b4_location_flag is now b4_locations_flag.
-
-2006-05-14  Akim Demaille  <akim@lrde.epita.fr>
-
-	Implement --trace=m4.
-	* src/getargs.c (trace_types, trace_args): Accept trace_m4.
-	* src/output.c (output_skeleton): When set, pass -dV to m4.
-
-	Factor the handling of flags in m4.
-	* src/output.c (prepare): Rename the muscle names debug, defines,
-	error_verbose to debug_flag, defines_flag, error_verbose_flag.
-	* data/c.m4: Adjust.
-	(_b4_define_flag_if, b4_define_flag_if, b4_defines_if): New.
-	Use b4_define_flag_if to define other b4_FLAG_if macros.
-	(b4_location_if): As a consequence, rename as...
-	(b4_locations_if): this, for consistency.
-	Adjust all the skeletons.
-
-2006-05-14  Akim Demaille  <akim@lrde.epita.fr>
-
-	* etc/bench.pm: Shorten bench names.
-
-2006-05-14  Akim Demaille  <akim@lrde.epita.fr>
-
-	* src/output.h, src/output.c (error_verbose): Move to...
-	* src/getargs.h, src/getargs.c: here.
-	Sort the flags.
-	Adjust dependencies.
-
-2006-05-13  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/c.m4 (b4_copyright): Put the special exception for Bison
-	skeletons here, so we don't have to put it in each skeleton.  All
-	uses changed.  Suggested by Akim Demaille.  Also, wrap the
-	copyright notice, in case it is longer than 80 columns.  Replace
-	comma by newline after title.
-
-2006-05-11  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* doc/bison.texinfo (Calc++ Scanner): The flex behavior is an
-	incompatibility, not a bug.  Mention that it wasn't fixed as of
-	flex 2.5.33.
-
-2006-05-11  Akim Demaille  <akim@lrde.epita.fr>
-
-	* examples/extexi: Enforce the precedence of concatenation over
-	>>.
-	Reported by Tommy Nordgren.
-
-2006-05-11  Akim Demaille  <akim@lrde.epita.fr>
-
-	* data/lalr1.cc (yytranslate_): Rename token as t to avoid clashes
-	with the member "token".
-	Reported by Martin Nylin.
-
-2006-05-08  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c: Switch to Bison 2.2 special-exception language in
-	the copyright notice.  Use more-regular format for titles and
-	copyright notices.
-	* data/glr.cc: Likewise.
-	* data/location.cc: Likewise.
-	* data/yacc.cc: Likewise.
-	* doc/bison.texinfo (Conditions): Document this.
-	* NEWS: likewise.  Upgrade version to 2.2.
-
-2006-04-27  Akim Demaille  <akim@lrde.epita.fr>
-
-	* data/glr.cc: Remove dead code.
-
-2006-04-25  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* bootstrap: Comment out the AM_CPPFLAGS line, since we don't use
-	that variable and the line breaks the bootstrap.  Problem reported
-	by Juan M. Guerrero.
-
-2006-04-24  Akim Demaille  <akim@lrde.epita.fr>
-
-	* doc/bison.texinfo (Multiple start-symbols): New.
-
-2006-04-24  Akim Demaille  <akim@lrde.epita.fr>
-
-	* etc/README, etc/bench.pl: New.
-
-2006-04-03  Akim Demaille  <akim@lrde.epita.fr>
-
-	* src/scan-gram.l: Be robust to BRACED_CODE appearing before any
-	rule.
-	Reported by Mickael Labau.
-	* tests/input.at (Torturing the Scanner): Test it.
-
-2006-03-16  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* doc/bison.texinfo (Decl Summary): Don't mention yylloc twice.
-	Problem reported by Bob Rossi.
-
-2006-03-13  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* doc/bison.texinfo: Remove @shorttitlepage stuff; it wasn't used
-	and didn't really work.
-	For the index, use @ifnotinfo, not @iftex.
-	Minor cleanups of spacing and terminology.
-
-2006-03-12  Akim Demaille  <akim@lrde.epita.fr>
-
-	* tests/local.at (_AT_BISON_OPTION_PUSHDEFS): Fix the definition
-	of AT_NAME_PREFIX when %name-prefix is not used.
-
-2006-03-12  Akim Demaille  <akim@lrde.epita.fr>
-
-	Apply --prefix to C++ skeletons too: they change the namespace.
-	The test suite already exercize these cases.
-	* data/c++.m4 (b4_namespace): New.
-	* data/lalr1.cc, data/glr.cc, data/location.cc: Use it instead of `yy'.
-	* data/lalr1.cc (yytnameerr_): Move its definition into the namespace.
-	* data/yacc.c, data/glr.c: Remove a useless `[]'.
-	* doc/bison.texinfo: Document it.
-	(Option Cross Key): Use @multitable in all formats.  It looks
-	nicer, even in TeX outputs.
-	(Rules): Use the same code whatever the output type is.
-	* tests/local.at (_AT_BISON_OPTION_PUSHDEFS)
-	(_AT_BISON_OPTION_POPDEFS): Support AT_NAME_PREFIX.
-	* tests/calc.at: Use it, instead of hard coding `yy'.
-
-2006-03-10  Akim Demaille  <akim@lrde.epita.fr>
-
-	* TODO: Remove dead items.
-
-2006-03-10  Akim Demaille  <akim@lrde.epita.fr>
-
-	* doc/FAQ: Remove, merged into...
-	* doc/bison.texinfo (FAQ): this.
-	* doc/Makefile.am (EXTRA_DIST): Adjust.
-
-2006-03-10  Akim Demaille  <akim@lrde.epita.fr>
-
-	* data/c.m4 (b4_token_enum): Always define the enum of tokens,
-	even if empty.
-	* data/lalrl1.cc, data/glr.cc (parser::token_type): New.
-	* doc/bison.texinfo (Calc++ Scanner): Use it.
-
-2006-03-09  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Fix two nits reported by twlevo, plus one more that I discovered.
-
-	* src/assoc.h (assoc_to_string): Give a name to the arg, as
-	this is the usual Bison style.
-	* src/location.h (location_print): Likewise.
-
-	* src/reader.h (token_name): Likewise.
-
-2006-03-08  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Fix some nits reported by twlevo.
-	* doc/FAQ: Remove ancient Y2K FAQ, replacing it with "secure"
-	and "POSIX".  Use more-modern syntax for URLs.  Mention C++
-	and ask for Java.  Don't hardwire OS version numbers.  Add
-	copyright notice.
-	* m4/.cvsignore: Add unistd_h.m4, for latest gnulib.
-	* src/conflicts.c (solved_conflicts_obstack): Now static.
-
-2006-03-08  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* doc/bison.texinfo (Introduction): Mention GLR and C++ as on the web
-	page.  Say "you can use it" not "you may use it" as on the web page;
-	we're describing capabilities not granting permission.
-
-2006-03-06  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (yyresolveLocations): Rename local variables to avoid
-	shadowing warnings.  Use usual patter for iterating through RHS.
-	* tests/glr-regression.at
-	(Uninitialized location when reporting ambiguity):
-	Modify yylex so that it uses its argument, rather than trying
-	to rely on ARGSUSED (which doesn't work for gcc with warnings).
-	const char -> char const.
-
-	* tests/Makefile.am ($(srcdir)/package.m4, maintainer-check-valgrind):
-	Don't use tabs inside commands; it messes up 'ps'.
-	Problem reported by twlevo.
-
-2006-03-06  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* tests/glr-regression.at (Uninitialized location when reporting
-	ambiguity): New test case.
-	* data/glr.c (yyresolveLocations): New function, which uses
-	YYLLOC_DEFAULT.
-	(yyresolveValue): Invoke yyresolveLocations before reporting an
-	ambiguity.
-	* doc/bison.texinfo (Default Action for Locations): Note
-	YYLLOC_DEFAULT's usage for ambiguity locations.
-	(GLR Semantic Actions): Cross-reference those notes.
-
-2006-03-04  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* tests/glr-regression.at (Leaked semantic values when reporting
-	ambiguity): Remove unnecessary union and type declarations.
-	(Leaked lookahead after nondeterministic parse syntax error): New test
-	case.
-	* data/glr.c (yyparse): Check for zero stacks remaining before
-	attempting to shift the lookahead so that you don't lose it.
-
-2006-03-02  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	Avoid memory leaks by not invoking longjmp in yyreportAmbiguity.
-	* tests/glr-regression.at (Leaked semantic values when reporting
-	ambiguity): New test case.
-	* data/glr.c (yyreportAmbiguity): Invoke yyyerror directly and return
-	yyabort rather than invoking yyFail, which invokes longjmp.  Remove the
-	now unnecessary yystackp parameter.
-	(yyresolveValue): Return yyreportAmbiguity's result.  Now the necessary
-	destructors can be called.
-
-	* tests/glr-regression.at: Don't invoke bison with `-t' unnecessarily
-	in existing testcases.
-
-2006-03-02  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	Don't leak semantic values for parent RHS when a user action cuts the
-	parser, and clean up related code a bit.
-	* tests/glr-regression.at (Leaked merged semantic value if user action
-	cuts parse): Rename to...
-	(Leaked semantic values if user action cuts parse): ... this.  Add check
-	for leaked parent RHS values.
-	* data/glr.c (yydestroyGLRState): In debugging output, distinguish
-	between an unresolved state (non-empty chain of semantic options) and
-	an incomplete one (signaled by an empty chain).
-	(yyresolveStates): Document the interface.  Move all manipulation of a
-	successfully or unsuccessfully resolved yyGLRState to...
-	(yyresolveValue): ... here so that yyresolveValue always leaves a
-	yyGLRState with consistent data and thus is easier to understand.
-	Remove the yyvalp and yylocp parameters since they are always just
-	taken from the yys parameter.  When reporting a discarded merged value
-	in debugging output, note that it is incompletely merged.  Document the
-	interface.
-	(yyresolveAction): If resolving any of the RHS states fails, destroy
-	them all rather than leaking them.  Thus, as long as user actions are
-	written to clean up the RHS correctly, yyresolveAction always cleans up
-	the RHS of a semantic option.  Document the interface.
-
-2006-02-27  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (yyexpandGLRStack): Catch an off-by-one error that
-	led to a segmentation fault in GNU Pascal.  Problem reported
-	by Waldek Hebisch.
-
-2006-02-21  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* doc/bison.texinfo (Mid-Rule Actions): Explain how to bury a
-	mid-rule action inside a nonterminal symbol in order to declare a
-	destructor for its semantic value.
-
-2006-02-16  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/yacc.c [(! defined yyoverflow || YYERROR_VERBOSE) && !
-	YYSTACK_USE_ALLOCA && ! defined YYSTACK_ALLOC && defined
-	__cplusplus && ! defined _STDLIB_H && !
-	((defined YYMALLOC || defined malloc) && (defined YYFREE ||
-	defined free))]: Include <stdlib.h> rather than rolling our own
-	declarations of malloc and free, to avoid problems with
-	incompatible declarations (using 'throw') C++'s stdlib.h.  This
-	should fix Debian bug 340012
-	<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=340012>,
-	reported by Guillaume Melquiond.
-
-2006-02-13  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Clarify symbols versus types in unused-value warnings.
-
-	* configure.ac (AC_INIT): Bump version number.
-
-2006-02-13  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Version 2.1a.
-	* tests/headers.at (AT_TEST_CPP_GUARD_H): Declare yyerror and yylex,
-	since C99 requires this.
-
-2006-02-11  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* m4/c-working.m4: New file.
-	* configure.ac (BISON_TEST_FOR_WORKING_C_COMPILER): Use it.
-
-2006-02-10  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* Makefile.maint: Merge from coreutils.
-
-2006-02-09  Paul Eggert  <eggert@cs.ucla.edu>
-
-	More portability fixes for problems summarized by Nelson H. F. Beebe.
-
-	* m4/cxx.m4 (BISON_TEST_FOR_WORKING_CXX_COMPILER): Catch a
-	configuration screwup "./configure CC=/opt/SUNWspro/bin/c89
-	CFLAGS="-xarch=generic64" CXX=/opt/SUNWspro/bin/CC
-	LDFLAGS="-xarch=generic64" with Sun C 5.7 on Solaris 10; this
-	messes up because C++ code is compiled in 32-bit mode but linked
-	in 64-bit mode.
-
-2006-02-08  Paul Eggert  <eggert@cs.ucla.edu>
-
-	More portability fixes for problems summarized by Nelson H. F. Beebe.
-
-	* doc/bison.texinfo (Calc++ Scanner): Work around a bug in flex
-	2.5.31.  This resembles the 2005-10-10 patch to src/scan-skel.l.
-
-	* examples/calc++/Makefile.am (check_PROGRAMS): Renamed from
-	nodist_PROGRAMS, since we don't need to actually compile the
-	example if we're just doing a plain 'make'.  This avoids bothering
-	the installer unnecessarily about problems due to weird C++
-	compilers.
-
-2006-02-06  Paul Eggert  <eggert@cs.ucla.edu>
-
-	More portability fixes for problems summarized by Nelson H. F. Beebe.
-
-	* tests/headers.at (AT_TEST_CPP_GUARD_H): Use #include <...> rather
-	than #include "...", and compile with -I'.'.  The old method was
-	not portable, according to Posix and the C standard, and it does
-	not work with Sun C 5.7, where previous #line directives affect
-	the working directory used in later #include "..." directives.
-
-2006-02-06  Juan Manuel Guerrero  <juan.guerrero@gmx.de>
-
-	Various DJGGP specific issues in /djgpp
-
-2006-02-02  Paul Eggert  <eggert@cs.ucla.edu>
-
-	More portability fixes for problems summarized by Nelson H. F. Beebe.
-
-	* m4/cxx.m4 (BISON_TEST_FOR_WORKING_CXX_COMPILER): Check that
-	'#include <map>' works and that you can apply ++ to iterators.
-
-2006-02-01  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Work around portability problems summarized by Nelson H. F. Beebe in
-	<http://lists.gnu.org/archive/html/bug-bison/2005-09/msg00021.html>.
-
-	* m4/cxx.m4 (BISON_TEST_FOR_WORKING_CXX_COMPILER): Check
-	that '#include <string>' works.
-
-	* data/lalr1.cc (yytranslate_): No longer inline, to work around a
-	porting problem to g++ 3.4.3 on Darwin 7.9.0, where g++ complained
-	"warning: sorry: semantics of inline function static data `const
-	unsigned char translate_table[262]' are wrong (you'll wind up with
-	multiple copies)".
-
-	* lib/bbitset.h (struct bitset_vtable): Rename members not, and,
-	or, xor to not_, and_, or_, and xor_, respectively.  This works
-	around a bug in GCC 3.4.3 on Irix 6.5, which apparently has a
-	random system header somewhere that includes the equivalent of
-	<iso646.h>.
-
-	* tests/headers.at (AT_TEST_CPP_GUARD_H): Don't assume that "$CC
-	-E" works; it apparently doesn't work with PathScale EKO Compiler
-	Suite Version 2.0.
-
-2006-01-30  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	During deterministic GLR operation, user actions should be able to
-	influence the parse by changing yychar.  To make this easier to fix and
-	to make glr.c easier to evolve in general, don't maintain yytoken in
-	parallel with yychar; just compute yytoken when needed.
-	* tests/glr-regression.at (Incorrect lookahead during deterministic
-	GLR): Check that setting yychar in a user action has the intended
-	effect.
-	* data/glr.c (yyGLRStack): Remove yytokenp member.
-	(yyclearin): Don't set *yytokenp.
-	(yyprocessOneStack, yyreportSyntaxError, yyrecoverSyntaxError): Examine
-	yychar rather than *yytokenp to determine the current lookahead.
-	Compute yytoken locally when needed.
-	(yyparse): Likewise.  Remove the local yytoken that yytokenp used to
-	point to.
-
-	* doc/bison.texinfo (Bison Options): Remove stray sentence fragment
-	after `--report' documentation.
-
-2006-01-30  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/parse-gram.y (grammar_declaration): Location of printer
-	symbol is @1, not list->location.  Bug reported by twlevo.
-	* tests/input.at (Incompatible Aliases): Adjust to above change.
-
-2006-01-29  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* tests/input.at (AT_CHECK_UNUSED_VALUES): Remove.  Instead, do
-	all the test at once.  This makes the output easier to read in the
-	normal case.
-
-	Fix a longstanding bug uncovered by bro-0.9a9/src/parse.y, which I
-	got from <http://bro-ids.org/download.html>.  The bug is that
-	when two actions appeared in succession, the second one was
-	scanned before the first one was added to the grammar rule
-	as a midrule action.  Bison then output the incorrect warning
-	"parse.y:905.17-906.36: warning: unused value: $3".
-	* src/parse-gram.y (BRACED_CODE, action): These are no longer
-	associated with a value.
-	(rhs): Don't invoke grammar_current_rule_action_append.
-	(action): Invoke it here instead.
-	* src/reader.c (grammar_midrule_action): Now extern.
-	(grammar_current_rule_action_append): Don't invoke
-	grammar_midrule_action; that is now the scanner's job.
-	* src/reader.h (last_string, last_braced_code_loc):
-	(grammar_midrule_action): New decls.
-	* src/scan-gram.l (last_string): Now extern, sigh.
-	(last_braced_code_loc): New extern variable.
-	(<INITIAL>"{"): Invoke grammar_midrule_action if the current
-	rule already has an action.
-	(<SC_BRACED_CODE>"}"): Set last_braced_code_loc before returning.
-	* tests/input.at (AT_CHECK_UNUSED_VALUES):
-	Add some tests to check that the above changes fixed the bug.
-
-2006-01-27  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/reader.c (symbol_should_be_used): Renamed from symbol_typed_p.
-	All used changed.  Check whether the symbol has a destructor,
-	not whether it is typed.
-	* tests/input.at (AT_CHECK_UNUSED_VALUES): Add a destructor, so
-	that the values are still reported as unused.  All line numbers
-	adjusted.
-
-2006-01-23  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Work around a bug in bro 0.8, which underparenthesizes its
-	definition of YYLLOC_DEFAULT.
-	* data/glr.c: Change all uses of YYLLOC_DEFAULT to parenthesize
-	their arguments.
-	* data/lalr1.cc: Likewise.
-	* data/yacc.cc: Likewise.
-
-2006-01-22  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Work around a bug in Pike 7.0, and give the Pike folks a
-	better way to override the usual int widths.
-	* data/yacc.c (b4_int_type): Use yytype_uint8, etc., so that the
-	user can override the types.
-	(short): #undef, to work around a bug in Pike 7.0.
-	(yytype_uint8, yytype_int8, yytype_uint16, yytype_int16): New types.
-	(union yyalloc.yyss): Use yytype_int16 rather than short.
-	All uses changed.
-	(yysigned_char): Remove.
-	* src/parse-gram.y (YYTYPE_UINT8, YYTYPE_INT8, YYTYPE_UINT16):
-	(YYTYPE_INT16): New macros, to test the new facility in yacc.c.
-	* tests/regression.at (Web2c Actions): Adjust to above changes.
-
-	* src/reader.c (check_and_convert_grammar): New function.
-	(reader): Close the input file even if something went wrong during
-	parsing.  Minor file descriptor leak reported by twlevo.
-
-	* src/assoc.c (assoc_to_string): Use a default: abort (); case
-	to pacify gcc -Wswitch-default.
-	* src/scan-gram.l (adjust_location): Use a default: break; case
-	to pacify gcc -Wswitch-default.
-	* src/scan-skel.h (skel_get_lineno, skel_get_in, skel_get_out):
-	(skel_get_leng, skel_get_text, skel_set_lineno, skel_set_in):
-	(skel_set_out, skel_get_debug, skel_set_debug, skel_lex_destroy):
-	Move these decls to scan-skel.l, since they don't need to be
-	visible elsewhere.
-	* src/scan-skel.l: Accept the above decls.
-	(skel_lex): New decl, to pacify GCC when unpatched flex 2.5.31
-	is used.
-
-2006-01-21  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* Makefile.cfg (local-checks-to-skip): Add changelog-check,
-	since we don't want to insist on a version number at the start
-	of the changelog every time.
-	* Makefile.maint: Sync from coreutils a bit better.
-	(sc_trailing_blank): Renamed from sc_trailing_space.
-	All uses changed.
-	(sc_no_if_have_config_h, sc_require_config_h):
-	(sc_prohibit_assert_without_use): New rules.
-	(sc_obsolete_symbols): Don't catch Makefile.maint itself.
-	(sc_dd_max_sym_length): Fix leading spaces in rule.
-	(sc_system_h_headers): Prefix with @.
-	(sc_useless_cpp_parens, m4-check): Output line numbers.
-	(changelog-check): Allow version only in head.
-	* data/c.m4: Use "defined FOO" instead of "defined (FOO)", to
-	satisfy new Makefile.maint rule.
-	* data/glr.c: Likewise.
-	* data/glr.cc: Likewise.
-	* data/lalr1.cc: Likewise.
-	* data/yacc.c: Likewise.
-	* lib/ebitsetv.c: Likewise.
-	* lib/lbitset.c: Likewise.
-	* lib/subpipe.c: Likewise.
-	* lib/timevar.c: Likewise.
-	* src/system.h: Likewise.
-	* data/yacc.c (YYSTYPE): Don't generate trailing spaces in output.
-	* djgpp/Makefile.maint: Add copyright notice.
-	* djgpp/README.in: Likewise.
-	* djgpp/config.bat: Likewise.
-	* djgpp/config.site: Likewise.
-	* djgpp/config_h.sed: Likewise.
-	* djgpp/djunpack.bat: Likewise.
-	* djgpp/config.sed: Fix copyright notice to match standard format.
-	* djgpp/subpipe.h: Likewise.
-	* lib/bitsetv-print.c: Likewise.
-	* lib/bitsetv.c: Likewise.
-	* lib/subpipe.h: Likewise.
-	* lib/timevar.c: Likewise.
-	* lib/timevar.h: Likewise.
-	* djgpp/subpipe.c: Use standard recipe for config.h.
-	* lib/abitset.c: Likewise.
-	* lib/bitset.c: Likewise.
-	* lib/bitset_stats.c: Likewise.
-	* lib/bitsetv-print.c: Likewise.
-	* lib/bitsetv.c: Likewise.
-	* lib/ebitsetv.c: Likewise.
-	* lib/get-errno.c: Likewise.
-	* lib/lbitset.c: Likewise.
-	* lib/subpipe.c: Likewise.
-	* lib/timevar.c: Likewise.
-	* lib/vbitset.c: Likewise.
-	* tests/local.at: Likewise.
-	* src/scan-gram.l: Don't include verify.h, since system.h does
-	that for us.
-	* .x-sc_require_config_h: New file.
-	* .x-sc_unmarked_diagnostics: New file.
-
-2006-01-20  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Be a bit more systematic about using 'abort'.
-	* lib/abitset.c (abitset_test): Remove ATTRIBUTE_UNUSED; not needed.
-	* lib/bitset.c (bitset_bytes, bitset_init, bitset_op4_cmp):
-	Put 'default: abort ();' before some other case, to satisfy older
-	pedantic compilers.
-	* lib/bitset_stats.c (bitset_stats_init): Likewise.
-	* lib/ebitset.c (ebitset_elt_find, ebitset_op3_cmp): Likewise.
-	* lib/lbitset.c (lbitset_elt_find, lbitset_op3_cmp): Likewise.
-	* src/conflicts.c (resolve_sr_conflict): Likewise.
-	* src/vcg.c (get_color_str, get_textmode_str, get_shape_str):
-	(get_decision_str, get_orientation_str, get_node_alignment_str):
-	(get_arrow_mode_str, get_crossing_type_str, get_view_str):
-	(get_linestyle_str, get_arrowstyle_str): Likewise.
-	* src/conflicts.c (resolve_sr_conflict):
-	Use a default case rather than one for the one remaining enum
-	value, to catch invalid enum values as well.
-	* src/lalr.c (set_goto_map, map_goto):
-	Prefer "assert (FOO);" to "if (!FOO) abort ();".
-	* src/nullable.c (nullable_compute, token_definitions_output):
-	Likewise.
-	* src/reader.c (packgram, reader): Likewise.
-	* src/state.c (transitions_to, state_new, state_reduction_find):
-	Likewise.
-	* src/symtab.c (symbol_user_token_number_set, symbol_make_alias):
-	(symbol_pack): Likewise.
-	* src/tables.c (conflict_row, pack_vector): Likewise.
-	* src/scan-skel.l (QPUTS): Remove unnecessary parens.
-	(BASE_QPUTS, "@output ".*\n): Remove unnecessary asserts.
-	* src/system.h: Don't include <assert.h>.
-	(assert): New macro.
-
-	* doc/bison.texinfo (Prologue, Rules, Actions, Union Decl, Action Decl):
-	(Destructor Decl, Parser Function, Pure Calling):
-	Describe rules for braces inside C code more carefully.
-
-2006-01-19  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Fix some porting glitches found by Nelson H. F. Beebe.
-	* lib/abitset.c (abitset_resize): Rewrite to avoid warnings from
-	compilers that don't understand that abort () does not return.
-	* src/state.c (transitions_to): Likewise.
-	* m4/cxx.m4 (BISON_TEST_FOR_WORKING_CXX_COMPILER): Check
-	that '#include <cstdlib>' works.
-	* src/system.h (INT8_MIN, INT16_MIN, INT32_MIN, INT8_MAX):
-	(INT16_MAX, UINT8_MAX, INT32_MAX, UINT16_MAX, UINT32_MAX):
-	#undef if ! defined __STDC_VERSION__ || __STDC_VERSION__ < 199901,
-	for the benefit of some pre-C99 compilers.
-
-	* bootstrap: Undo changes to gnulib files that autoreconf made.
-
-	Minor fixups to get 'make maintainer-check' to work.
-	* configure.ac: Don't use -Wnested-externs, as it's incompatible
-	with the new verify.h implementation.
-	* data/c.m4 (b4_yy_symbol_print_generate): YYUSE (yyoutput).
-	* data/glr.c (YYUSE): Depend on __GNUC__ as well.
-	* data/yacc.c (YYUSE): Likewise.
-	* data/lalr1.cc (yysyntax_error_): YYUSE (yystate).
-	* lib/subpipe.c (end_of_output_subpipe): The args are unused.
-	* src/parse-gram.y (declaration): Don't pass a string constant
-	to a function that expects char *, since GCC might complain
-	about the constant value.
-	* src/reader.c (symbol_typed_p): Add parens to pacify GCC.
-	* tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): #undef yylloc and yylval
-	before #defining them.
-	* tests/glr-regression.at
-	(Incorrectly initialized location for empty right-hand side in GLR):
-	In yyerror, use the msg arg.
-	(Corrupted semantic options if user action cuts parse):
-	(Incorrect lookahead during deterministic GLR):
-	(Incorrect lookahead during nondeterministic GLR):
-	Don't name a local var 'index'; it shadows string.h's 'index'.
-
-2006-01-19  Akim Demaille  <akim@epita.fr>
-
-	* tests/calc.at (_AT_DATA_CALC_Y): Initialize the whole initial
-	location, not just parts of it.
-
-2006-01-18  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Document the fact that multiple %unions are now allowed.
-	* doc/bison.texinfo (Union Decl): Likewise.
-	* TODO: This feature is now implemented, so remove it from
-	the wishlist.
-
-	* Makefile.maint: Merge with coreutils Makefile.maint.
-	(CVS_LIST): Use build-aux version if available.
-	(VERSION_REGEXP): New macro.
-	(syntax-check-rules): Add sc_no_if_have_config_h,
-	sc_prohibit_assert_without_use, sc_require_config_h,
-	sc_useless_cpp_parens.
-	(sc_obsolete_symbols): Check for O_NDELAY.
-	(sc_dd_max_sym_length): Track coreutils.
-	(sc_unmarked_diagnostics): Look in all files, not just *.c.
-	(sc_useless_cpp_parens): New rule.
-	(news-date-check): Look for version or today's date.
-	(changelog-check): Don't require version number near head.
-	(copyright-check): Use current year instead of hardwiring 2005.
-	(my-distcheck): Depend on $(release_archive_dir)/$(prev-tgz).
-	(announcement): Add --gpg-key-ID.
-
-	* djgpp/config.sed: Add copyright notice, and replace "filesystem"
-	with "file system".
-
-	Avoid undefined behavior that addressed just before the start of an
-	array.  Problem reported by twlevo.
-	* src/reader.c (packgram): Prepend a new sentinel before ritem.
-	* src/lalr.c (build_relations): Rely on new sentinel.
-	* src/gram.c (gram_free): Adjust to new sentinel.
-
-2006-01-12  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* data/glr.c (yyGLRStateSet): Rename yylookaheadStatuses to
-	yylookaheadNeeds.  All uses updated.
-	(yysplitStack): Rename local yynewLookaheadStatuses to
-	yynewLookaheadNeeds.
-	* data/glr-regression.at (Incorrect lookahead during nondeterministic
-	GLR): In comments, change `lookahead status' to `lookahead need'.
-
-2006-01-11  Paul Hilfinger  <hilfingr@tully.CS.Berkeley.EDU>
-
-	* data/glr.c (yysplitStack): A little stylistic rewrite.
-
-2006-01-11  Paul Hilfinger  <hilfingr@tully.CS.Berkeley.EDU>
-
-	* data/glr.c (yyaddDeferredAction): Flesh out the comment.
-
-2006-01-11  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* doc/bison.texinfo: Fix some typos.
-	(GLR Semantic Actions): New subsection discussing special
-	considerations because GLR semantic actions might be deferred.
-	(Actions): Mention look-ahead usage of yylval.
-	(Actions and Locations): Mention look-ahead usage of yylloc.
-	(Special Features for Use in Actions): Add YYEOF entry and mention it
-	in the yychar entry.
-	In the yychar entry, remove mention of the local yychar case (pure
-	parser) since this is irrelevant information when writing semantic
-	actions and since it's already discussed in `Bison Symbols' where
-	yychar is otherwise described as an external variable.
-	In the yychar entry, don't call it the `current' look-ahead since it
-	isn't when semantic actions are deferred.
-	In the yychar and yyclearin entries, add note about deferred semantic
-	actions.
-	Add yylloc and yylval entries discussing look-ahead usage.
-	(Look-Ahead Tokens): When discussing yychar, don't call it the
-	`current' look-ahead, and do mention yylval and yylloc.
-	(Error Recovery): Cross-reference `Action Features' when mentioning
-	yyclearin.
-	(Bison Symbols): In the yychar entry, don't call it the `current'
-	look-ahead.
-	In the yylloc and yylval entries, mention look-ahead usage.
-
-2006-01-08  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* tests/glr-regression.at: Update copyright year to 2006.
-
-2006-01-06  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* data/glr.c (yyGLRStateSet): Add yybool* yylookaheadStatuses member to
-	use during nondeterministic operation to track which stacks have
-	actually needed the current lookahead.
-	(yyinitStateSet, yyfreeStateSet, yyremoveDeletes, yysplitStack):
-	Allocate, deallocate, resize, and otherwise shuffle space for
-	yylookaheadStatuses in parallel with yystates member of yyGLRStateSet.
-	(yysplitStack, yyprocessOneStack, yyparse): Set lookahead status
-	appropriately during nondeterministic operation.
-	(yySemanticOption): Add int yyrawchar, YYSTYPE yyval, and YYLTYPE yyloc
-	members to store the current lookahead to be used by the deferred
-	user action.
-	(yyaddDeferredAction): Add size_t yyk parameter specifying the stack
-	from which the RHS is taken.  Set the lookahead members of the new
-	yySemanticOption according to the lookahead status for stack yyk.
-	(yyglrShiftDefer, yyglrReduce): Pass yyk parameter on to
-	yyaddDeferredAction.
-	(yyresolveAction): Set yychar, yylval, and yylloc to the lookahead
-	members of yySemanticOption before invoking yyuserAction, and then set
-	them back to their current values afterward.
-	(yyparse): Set yychar = YYEMPTY where yytoken = YYEMPTY.
-	(yyreportAmbiguity): Add /*ARGSUSED*/ to pacify lint.
-	* tests/glr-regression.at: Remove `.' from the ends of recent test case
-	titles for consistency.
-	(Leaked merged semantic value if user action cuts parse): In order to
-	suppress lint warnings, use arguments in merge function, and assign
-	char value < 128 in main.
-	(Incorrect lookahead during deterministic GLR): New test case.
-	(Incorrect lookahead during nondeterministic GLR): New test case.
-
-2006-01-06  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* data/c.m4 (b4_yy_symbol_print_generate): In yy_symbol_print, accept
-	!yyvaluep as signal that no semantic value is available to print.
-	* data/glr.c (yydestroyGLRState): If state is not resolved, don't try
-	to print a semantic value.
-
-2006-01-06  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* tests/glr-regression.at: For consistency with my newer test cases,
-	don't thank myself.
-
-2006-01-05  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* data/glr.c (yyresolveValue): When merging semantic options, if at
-	least one user action succeeds but a later one cuts the parse, then
-	destroy the semantic value before returning rather than leaking it.
-	(yyresolveStates): If a user action cuts the parse and thus
-	yyresolveValue fails, ignore the (unset) semantic value rather than
-	corrupting the yyGLRState, and empty the semantic options list since
-	the user actions should have called all necessary destructors.
-	Simplify code with YYCHK.
-	* tests/glr-regression.at (Corrupted semantic options if user action
-	cuts parse): New test case.
-	(Undesirable destructors if user action cuts parse): New test case.
-	Before applying any of this patch, this test case never actually failed
-	for me... but only because the corrupted semantic options usually
-	masked this bug.
-	(Leaked merged semantic value if user action cuts parse): New test
-	case.
-
-2006-01-05  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c, src/symlist.h, src/symlist.c: s/mid_rule/midrule/.
-
-2006-01-04  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/c.m4 (b4_c_modern): New macro, with a new provision for
-	_MSC_VER.  Problem reported by Cenzato Marco.
-	(b4_c_function_def): Use it.
-	* data/yacc.c (YYMODERN_C): Remove.  All uses replaced by
-	b4_c_modern.
-	(yystrlen, yystpcpy, yyparse): Use b4_c_function... macros rather
-	than rolling our own.
-
-2006-01-04  Akim Demaille  <akim@epita.fr>
-
-	Also warn about non-used mid-rule values.
-	* src/symlist.h, src/symlist.c (symbol_list): Add a mid_rule
-	member.
-	(symbol_list_new): Adjust.
-	* src/reader.c (symbol_typed_p): New.
-	(grammar_rule_check): Use it.
-	(grammar_midrule_action): Bind a mid-rule LHS to its rule.
-	Check its rule.
-	* tests/input.at (AT_CHECK_UNUSED_VALUES): New.
-	Use it.
-	* tests/actions.at (Exotic Dollars): Adjust.
-
-2006-01-04  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (grammar_midrule_action): If $$ is set in a
-	mid-rule, move the `used' bit to its lhs.
-	* tests/input.at (Unused values): New.
-	* tests/actions.at (Exotic Dollars): Adjust: exp is not typed.
-
-2006-01-03  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* doc/bison.texinfo (Bison Options): Say more accurately what
-	--yacc does.
-	* src/parse-gram.y (rules_or_grammar_declaration): Don't complain
-	about declarations in the grammar when in Yacc mode, as POSIX does
-	not require a diagnostic when the grammar uses extensions.
-
-	* src/reduce.c (reduce_grammar): Remove unnecessary cast to bool.
-
-	Warn about dubious constructions like "%token T T".
-	Reported by twlevo.
-	* src/symtab.h (struct symbol.declared): New member.
-	* src/symtab.c (symbol_new): Initialize it to false.
-	(symbol_class_set): New arg DECLARING, specifying whether
-	this is a declaration that we want to warn about, if there
-	is more than one of them.  All uses changed.
-
-	* data/glr.c, data/glr.cc, data/lalr1.cc, data/yacc.c:
-	Allow multiple %union directives, whose contents concatenate.
-	* src/parse-gram.y (grammar_declaration): Likewise.
-	Use muscle_code_grow, so that we don't need stype_line any more.
-	All uses changed.
-
-	* src/muscle_tab.c (muscle_grow): Fix comment.
-
-	* ChangeLog, data/c.m4, data/glr.c, data/glr.cc, data/location.cc:
-	* data/yacc.c, src/getargs.c, src/output.c, tests/cxx-type.at:
-	Update copyright year to 2006.
-
-2006-01-03  Akim Demaille  <akim@epita.fr>
-
-	Have glr.cc pass (some of) the calc.at tests.
-	* data/glr.cc (b4_parse_param_orig): New.
-	(b4_parse_param): Improve its definition, and bound it more
-	clearly in the skeleton.
-	(b4_epilogue): Append, instead of prepending, in order to keep
-	#line consistency.
-	Simplify the generation of auxiliary functions: locations and
-	purity are mandated.
-	(b4_global_tokens_and_yystype): Honor it.
-	* data/location.cc (c++.m4): Don't include it.
-	* tests/local.at (_AT_BISON_OPTION_PUSHDEFS): Define AT_GLR_CC_IF
-	and AT_SKEL_CC_IF.
-	* tests/calc.at (AT_CHECK_CALC): Rely on AT_SKEL_CC_IF instead of
-	AT_LALR1_CC_IF.
-	Be sure to initialize the first position's filename.
-	(AT_CHECK_CALC_LALR1_CC): Add %location and %defines, they are
-	mandated anyway.
-	(AT_CHECK_CALC_GLR_CC): New.
-	Use it to exercise glr.cc as a lalr1.cc drop-in replacement.
-
-2006-01-02  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output_skeleton): Don't hard wire the inclusion of
-	c.m4.
-	* data/c++.m4, data/glr.c, data/yacc.c: Include c.m4.
-	* data/glr.cc: Do not include stack.hh.
-
-2006-01-02  Joel E. Denny  <jdenny@ces.clemson.edu>
-
-	* data/glr.c: Reformat whitespace with tabs.
-	(b4_lpure_formals): Remove this unused m4 macro.
-	* tests/cxx-type.at: Reformat whitespace with tabs.
-	(_AT_TEST_GLR_CXXTYPES): In union Node, rename node_info to nodeInfo
-	since it's a member.  Rename type to isNterm for clarity.
-
-2005-12-29  Akim  <akim@sulaco.local>
-
-	Let glr.cc catch up with symbol_value_print.
-	* data/glr.cc (b4_yysymprint_generate): Replace by...
-	(b4_yy_symbol_print_generate): this.
-	(yy_symbol_print, yy_symbol_value_print): Declare them.
-
-2005-12-28  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/location.h (boundary): Note that a line or column equal
-	to INT_MAX indicates an overflow.
-	* src/scan-gram.l: Include verify.h.  Don't include get-errno.h.
-	(rule_length_overflow, increment_rule_length, add_column_width):
-	New functions.
-	(<INITIAL>{id}, <SC_ESCAPED_STRING>"\"", <SC_ESCAPED_CHARACTER>"'"):
-	(<SC_BRACED_CODE>"}"):
-	Use increment_rule_length rather than incrementing it by hand.
-	(adjust_location, handle_syncline): Diagnose overflow.
-	(handle_action_dollar, handle_action_at):
-	Fix bug with monstrosities like $-2147483648.
-	Remove now-unnecessary checks.
-	(scan_integer): Verify assumptions and remove now-unnecessary checks.
-	(convert_ucn_to_byte): Verify assumptions.
-	(handle_syncline): New arg LOC.  All callers changed.
-	Don't store through a value derived from char const * pointer.
-
-	* src/reader.c (grammar_rule_check): Rewrite slightly to avoid
-	GCC warnings.
-
-2005-12-27  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/reader.c (grammar_midrule_action, grammar_symbol_append):
-	Remove unnecessary forward static decls.
-
-2005-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (grammar_current_rule_check): Also check that $$
-	is used.
-	Take the rule to check as argument, hence rename as...
-	(grammar_rule_check): this.
-	* src/reader.h, src/reader.c (grammar_rule_begin, grammar_rule_end):
-	Rename as...
-	(grammar_rule_begin, grammar_rule_end): these, for consistency.
-	(grammar_midrule_action, grammar_symbol_append): Now static.
-	* tests/torture.at (input): Don't rely on the default action
-	being always performed.
-	* tests/calc.at: "Set" $$ even when the action is "cut" with
-	YYERROR or other.
-	* tests/actions.at (Exotic Dollars): Instead of using unused
-	values, check that the warning is issued.
-
-2005-12-22  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Improve wording for unused-value warnings.
-
-2005-12-22  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc, data/yacc.c, data/glr.c, data/c.m4
-	(b4_yysymprint_generate): Rename as...
-	(b4_yy_symbol_print_generate): this.
-	Generate yy_symbol_print instead of yysymprint.
-	Generate also yy_symbol_value_print, and use it.
-
-2005-12-22  Akim Demaille  <akim@epita.fr>
-
-	* NEWS: Warn about unused values.
-	* src/symlist.h, src/symlist.c (symbol_list, symbol_list_new): Add
-	a `used' member.
-	(symbol_list_n_get, symbol_list_n_used_set): New.
-	(symbol_list_n_type_name_get): Use symbol_list_n_get.
-	* src/scan-gram.l (handle_action_dollar): Flag used symbols.
-	* src/reader.c (grammar_current_rule_check): Check that values are
-	used.
-	* src/symtab.c (symbol_print): Accept 0.
-	* tests/existing.at: Remove the type information.
-	Empty the actions.
-	Remove useless actions (beware of mid-rule actions: perl -000
-	-pi -e 's/\s*\{\}(?=[\n\s]*[|;])//g').
-	* tests/actions.at (Exotic Dollars): Use unused values.
-	* tests/calc.at: Likewise.
-	* tests/glr-regression.at (No users destructors if stack 0 deleted):
-	Likewise.
-
-	* src/gram.c (rule_useful_p, rule_never_reduced_p): Use
-	rule_useful_p.
-
-2005-12-21  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Undo 2005-12-01 tentative license wording change.  The wording is
-	still being reviewed by the lawyers, and we don't want to wait for
-	them before publishing a test release.  For now, revert to the
-	previous wording.
-	* NEWS: Undo 2005-12-01 change.
-	* data/glr.c: Revert to previous license wording.
-	* data/glr.cc: Likewise.
-	* data/lalr1.cc: Likewise.
-	* data/location.cc: Likewise.
-	* data/yacc.c: Likewise.
-
-	* NEWS: Reword %destructor vs YYABORT etc.
-	* data/glr.c: Use American spacing, for consistency.
-	* data/glr.cc: Likewise.
-	* data/lalr1.cc: Likewise.
-	* data/yacc.c: Likewise.
-	* data/yacc.c: Reformat comments slightly.
-	* doc/bison.texinfo: Replace "non-" with "non" when that makes sense,
-	for consistency.  Fix some spelling errors and reword recently-included
-	text slightly.
-	* tests/cxx-type.at: Cast results of malloc, for C++.
-
-2005-12-21  Joel E. Denny  <address@hidden>
-
-	* tests/cxx-type.at: Construct a tree, count the parents of shared
-	nodes, and free each node once and only once.  Previously, the memory
-	for semantic values was leaked instead.
-
-2005-12-21  Joel E. Denny  <address@hidden>
-
-	* data/glr.c (struct yyGLRStack): If pure, add yyval and yyloc members.
-	(yylval, yylloc): If pure, #define to yystackp->yyval and
-	yystackp->yyloc similar to yychar and yynerrs.
-	(yyparse): If pure, remove local yylval and yylloc. Add local
-	yystackp to accommodate pure definitions of yylval and yylloc.
-	(b4_lex_param, b4_lyyerror_args, b4_lpure_args): If pure, change
-	yylvalp and yyllocp to &yylval and &yylloc.
-	(nerrs, char, lval, lloc): If pure, add #define's for b4_prefix[]
-	namespace. Previously, nerrs and char were missing, but lval and lloc
-	weren't necessary.
-	(yyprocessOneStack, yyreportSyntaxError, yyrecoverSyntaxError): Remove
-	yylvalp and yyllocp parameters since, if pure, these are now always
-	accessible through yystackp.  If not pure, they are still accessible
-	globally.
-	* data/glr.c, data/yacc.c (YYLLOC_DEFAULT): Change `if (N)' to
-	`if (YYID (N))' to pacify lint.
-
-2005-12-21  Akim Demaille  <akim@epita.fr>
-
-	YYACCEPT, YYERROR, and YYABORT, as user actions, should not
-	destroy the RHS symbols of a rule.
-	* data/yacc.c (yylen): Initialize to 0.
-	Keep its value to the number of items to possibly shift.
-	In particular, a regular successful parse that ends on YYFINAL by
-	a (internal) YYACCEPT must not have yylen != 0.
-	(yyerrorlab, yyreturn): Pop the RHS.
-	Reorder a bit to emphasize the `shifting' bits of code.
-	(YYPOPSTACK): Now accept a number of items to pop.
-	* data/lalr1.cc: Likewise.
-	* data/glr.c: Formatting changes.
-	Use goto instead of fall through.
-	* doc/bison.texinfo (Destructor Decl): Complete.
-
-2005-12-20  Juan Manuel Guerrero  <juan.guerrero@gmx.de>
-
-	* Makefile.am: DJGPP specific files added to EXTRA_DIST.
-	* djgpp/Makefile.maint: Fix PACKAGE variable computation.
-	* djgpp/config.bat: Replace every occurence of the file name
-	scan-gram-c.c with c-scan-gram.c. The same for scan-skel-c.c with
-	c-scan-skel.c to conform with the 8.3 file name restriction on MSDOS.
-	* djgpp/config.sed: Replace every occurence of the file name
-	scan-gram-c.c with c-scan-gram.c. The same for scan-skel-c.c with
-	c-scan-skel.c to conform with the 8.3 file name restriction on MSDOS.
-	* djgpp/djunpack.bat: DJGPP specific file.
-	* djgpp/fnchange.lst: DJGPP specific file.
-	* djgpp/README.in: Add new information about how to unpack the bison
-	source on MSDOS and other systems which have 8.3 file name restrictions
-	using djunpack.bat and fnchange.lst.
-
-2005-12-12  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* bootstrap (build_cvs_prefix): Remove; unused.
-	(CVS_PREFIX): Adjust to yesterday's Savannah reorganization
-	when getting gnulib.
-
-2005-12-12  "Joel E. Denny" <jdenny@ces.clemson.edu>
-
-	* data/glr.c: Reorder typedef declarations for structs to match order
-	of struct declarations.
-	Rename yystack everywhere to yystackp except in yyparse where it's not
-	a pointer.
-	(yyglrShift): Change parameter YYSTYPE yysval to YYSTYPE* yyvalp for
-	consistency.
-	(yyis_table_ninf): Change 0 to YYID (0) to pacify lint.
-	(yyreportSyntaxError): Add /*ARGSUSED*/ to pacify lint.
-	(yyparse): Change while (yytrue) to while ( YYID (yytrue)) to pacify
-	lint.
-
-2005-12-09  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* tests/sets.at (Accept): Fix typos in regular expression used to
-	sed out the final state number.
-
-	Work around portability problem on Solaris 10: flex-generated
-	files include <stdio.h> before <config.h>, which messes up
-	because the latter defines __EXTENSIONS__.  Address the problem
-	by creating two new little files that include <config.h> first,
-	then include the flex-generated files.  Rewrite everyone else
-	to include <config.h> first, as well.
-	* lib/timevar.c: Always include "config.h".
-	* src/Makefile.am (bison_SOURCES): Replace scan-gram.l with
-	scan-gram-c.c, and scan-skel.l with scan-skel-c.c.
-	(EXTRA_bison_SOURCES): New macro.
-	* src/scan-gram-c.c, src/scan-skel-c.c: New files.
-	* src/system.h: Don't include config.h.
-	* src/LR0.c: Include <config.h> first.
-	* src/assoc.c: Likewise.
-	* src/closure.c: Likewise.
-	* src/complain.c: Likewise.
-	* src/conflicts.c: Likewise.
-	* src/derives.c: Likewise.
-	* src/files.c: Likewise.
-	* src/getargs.c: Likewise.
-	* src/gram.c: Likewise.
-	* src/lalr.c: Likewise.
-	* src/location.c: Likewise.
-	* src/main.c: Likewise.
-	* src/muscle_tab.c: Likewise.
-	* src/nullable.c: Likewise.
-	* src/output.c: Likewise.
-	* src/parse-gram.y: Likewise.
-	* src/print.c: Likewise.
-	* src/print_graph.c: Likewise.
-	* src/reader.c: Likewise.
-	* src/reduce.c: Likewise.
-	* src/relation.c: Likewise.
-	* src/state.c: Likewise.
-	* src/symlist.c: Likewise.
-	* src/symtab.c: Likewise.
-	* src/tables.c: Likewise.
-	* src/uniqstr.c: Likewise.
-	* src/vcg.c: Likewise.
-
-	* src/parse-gram.y: Fix minor problems uncovered by lint.
-	(current_lhs, current_lhs_location): Now static.
-	(current_assoc): Remove unused variable.
-
-	Cleanups so that Bison-generated parsers have less lint.
-	* data/c.m4 (b4_yydestruct_generate, b4_yysymprint_generate):
-	Prepend /*ARGSUSED*/, for lint's sake.
-	* data/glr.c (YYUSE): Properly parenthesize, and use an alternate
-	definition if 'lint' is defined.
-	(YYID): New macro (or function, if lint).
-	All uses of /*CONSTCOND*/0 replaced by YYID(0).
-	* data/yacc.c: Likewise.
-	* data/glr.c (yyuserAction, yyuserMerge, yy_reduce_print):
-	(yyrecoverSyntaxError): Prepend /*ARGSUSED*/.
-	* data/glr.cc (YYLLOC_DEFAULT): Omit /*CONSTCOND*/ since this code
-	is C++ only.
-	* data/lalr1.cc (YYUSE): Just use a cast, since this code is C++ only.
-	* data/yacc.c (YYSTACK_FREE) [defined YYSTACK_ALLOC]:
-	Use YYID(0) rather than 0, for lint.
-	(yystrlen): Rewrite to avoid lint warning about ptrdiff_t overflow.
-	(yysyntax_error): Rewrite to avoid lint warnings about parenthesization.
-
-2005-12-07  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* tests/glr-regression.at
-	(Improper handling of embedded actions and dollar(-N) in GLR parsers):
-	Close memory leak reported by twlevo.
-
-2005-12-06  "Joel E. Denny" <jdenny@ces.clemson.edu>
-
-	* data/glr.c (yyprocessOneStack, yyparse): Synchronize the shift for
-	all stacks.
-	(yyparse): Iterate another stack in order to call user destructors.
-	* tests/glr-regression.at (No users destructors if stack 0 deleted):
-	New test case.
-	(Duplicated user destructor for lookahead): This test now is expected
-	to succeed.
-
-2005-12-01  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Document the following change.
-	* data/yacc.c: Say "parser skeleton" rather than "file", since
-	it's no longer just a file.
-	* data/glr.c: Grant a special exception for C GLR parsers, that
-	reads like the already-existing exception for C LALR(1) parsers.
-	* data/glr.cc: Likewise.
-	* data/lalr1.cc: Likewise.
-	* data/location.cc: Likewise.
-	* data/yacc.c: Reword the "written by" statement to clarify that
-	it was the parser skeleton, not the entire output file.
-	* data/glr.c: Written by Paul Hilfinger.
-	* data/glr.cc: Written by Akim Demaille.
-	* data/lalr1.cc: Likewise.
-
-2005-11-18  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/yacc.c (yy_reduce_print, YY_REDUCE_PRINT):
-	Fix typos in previous change that broke 'make check'.
-	YY_REDUCE_PRINT cannot be a pseudo-varargs macro; that isn't
-	supported in C.
-	* tests/calc.at (_AT_CHECK_CALC,_AT_CHECK_CALC_ERROR):
-	Don't check NUM-STDERR-LINES, since the output format is fluctuating.
-	We can revert this once things settle down.
-
-	* src/conflicts.c (conflicts_print): Don't print file name twice
-	when %expect fails because there were no conflicts.
-	* doc/bison.texinfo (Expect Decl): Tighten up wording in previous
-	change.
-	* tests/conflicts.at (%expect not enough, %expect too much):
-	(%expect with reduce conflicts): Adjust to new behavior.
-
-2005-11-18  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (conflicts_print): Unsatisfied %expectation are
-	errors.
-	* NEWS: Document this.
-	* doc/bison.texinfo (Expect Decl): Likewise.
-
-2005-11-16  Akim Demaille  <akim@epita.fr>
-
-	Generalize the display of semantic values and locations in traces.
-	* data/glr.c (yy_reduce_print): Fix indices (again).
-	* data/c++.m4 (b4_rhs_value, b4_rhs_location): Don't expect
-	literal integers.
-	* data/lalr1.cc (yyreduce_print): Rename as...
-	(yy_reduce_print): this.
-	Display values and locations.
-	* data/yacc.c (yy_reduce_print): Likewise.
-	(YY_REDUCE_PRINT): Adjust to pass the required arguments.
-	(yysymprint): Move higher to be visible from yy_reduce_print).
-	(yyparse): Adjust.
-	* tests/calc.at: Adjust the expected length of the traces.
-
-2005-11-14  Akim Demaille  <akim@epita.fr>
-
-	* data/glr.c (yy_reduce_print): The loop was quite wrong: type are
-	from 1 to N, while values and location start at 0.
-	(b4_rhs_location, b4_rhs_value): Add parens around $1 and $2.
-
-2005-11-14  Akim Demaille  <akim@epita.fr>
-
-	* data/glr.c (yy_reduce_print): Fix the $ number.
-
-2005-11-14  Akim Demaille  <akim@epita.fr>
-
-	"Use" parse parameters.
-	* data/c.m4 (b4_parse_param_for, b4_parse_param_use): New.
-	* data/glr.c, data/glr.cc: Use them.
-	* data/glr.c (YYUSE): Have a C++ definition that supports
-	non-pointer types.
-
-2005-11-14  Akim Demaille  <akim@epita.fr>
-
-	* data/glr.c (yyexpandGLRStack): Declare only if defined.
-
-2005-11-14  Akim Demaille  <akim@epita.fr>
-
-	* data/glr.cc: New.
-	* data/m4sugar/m4sugar.m4 (m4_prepend): New.
-
-2005-11-12  Akim Demaille  <akim@epita.fr>
-
-	Let position and location be PODs.
-	* data/location.cc (position::initialize, location::initialize): New.
-	(position::position, location::location): Define only if
-	b4_location_constructors is defined.
-	* data/lalr1.cc (b4_location_constructors): Define it for backward
-	compatibility.
-	* doc/bison.texinfo (Initial Action Decl): Use initialize.
-
-2005-11-12  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc: Move the body of the ctor and dtor into the
-	parser file (instead of the header).
-	Wrap the implementations in a "namespace yy".
-
-2005-11-12  Akim Demaille  <akim@epita.fr>
-
-	Have glr.c include its header file when created.
-	* data/glr.c (b4_shared_declarations): New.
-	Output them verbatim in the parser if !%defines, otherwise
-	output then in the header file, and include it instead.
-
-2005-11-11  Akim Demaille  <akim@epita.fr>
-
-	* data/glr.c: Comment changes.
-
-2005-11-11  Akim Demaille  <akim@epita.fr>
-
-	When yydebug, report semantic and location values for reductions.
-	* data/glr.c (yy_reduce_print): Report the semantic values and the
-	locations.
-	(YY_REDUCE_PRINT): Adjust.
-	(yyglrReduce): Use them.
-	(b4_rhs_value, b4_rhs_location): Remove m4_eval invocations.
-	* data/c.m4 (b4_yysymprint_generate): Specify the const arguments.
-	* tests/calc.at (_AT_CHECK_CALC_ERROR): Remove the reduction
-	traces.
-
-2005-11-10  Akim Demaille  <akim@epita.fr>
-
-	* data/glr.c (yynewGLRStackItem, YY_RESERVE_GLRSTACK): New.
-	(yyaddDeferredAction, yyglrShift, yyglrShiftDefer): Use them.
-	(yyexpandGLRStack, YYRELOC): Define only when YYSTACKEXPANDABLE.
-
-2005-11-09  Albert Chin-A-Young  <china@thewrittenword.com>
-
-	* m4/cxx.m4, examples/Makefile.am: Don't build
-	examples/calc++ if no C++ compiler is available.  (trivial change)
-
-2005-11-09  Akim Demaille  <akim@epita.fr>
-
-	* src/scan-skel.l: Use a couple of asserts.
-
-2005-11-03  Akim Demaille  <akim@epita.fr>
-
-	In some (weird) cases, the final state number is incorrect.
-	Reported by Alexandre Duret-Lutz.
-	* src/LR0.c (state_list_append): Remove the computation of
-	final_state.
-	(save_reductions): Do it here.
-	(get_state): Alpha conversion.
-	(generate_states): Use a for loop.
-	* src/gram.h (item_number_is_rule_number)
-	(item_number_is_symbol_number): New.
-	* src/state.c: Use assert.
-	* src/system.h: Include assert.h.
-	* tests/sets.at (Accept): New.
-
-2005-10-30  Paul Hilfinger  <hilfingr@tully.CS.Berkeley.EDU>
-
-	* data/glr.c (yyfill): Adjust comment.
-	(yyresolveAction): Initialize default location properly
-	for empty right-hand sides.
-	(yydoAction): Ditto.
-	Add comment explaining apparently dead code.
-	* tests/glr-regression.at
-	(Incorrectly initialized location for empty right-hand side in GLR):
-	New test.
-
-2005-10-30  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* bootstrap (cleanup_gnulib): New function.  Use it to clean up
-	gnulib when interrupted.  This fixes some race conditions and
-	works around some portability problems (one noted by Paul
-	Hilfinger).
-
-2005-10-22  Akim  <akim@epita.fr>
-
-	* Makefile.cfg: Adjust to config -> build-aux.
-	Reported by twledo.
-
-2005-10-21  Akim Demaille  <akim@epita.fr>
-
-	* data/c.m4 (b4_yydestruct_generate, b4_yysymprint_generate): Pass
-	the %parse-params.
-	* data/glr.c (YY_SYMBOL_PRINT, yydestroyGLRState): Adjust.
-	* data/yacc.c (b4_Pure_if): Rename as...
-	(b4_yacc_pure_if): this.
-	(YY_SYMBOL_PRINT, yyparse): Adjust.
-	* doc/bison.texinfo: Formatting changes.
-
-2005-10-21  Akim Demaille  <akim@epita.fr>
-
-	Finish the transition config -> build-aux.
-	* configure.ac, Makefile.am: Use build-aux.
-	* config/prev-version, config/announce-gen, config/Makefile.am:
-	Move to...
-	* build-aux/prev-version, build-aux/announce-gen,
-	* build-aux/Makefile.am: here.
-
-2005-10-14  Akim Demaille  <akim@epita.fr>
-
-	* examples/calc++/test: Use set -x only when VERBOSE.
-
-2005-10-13  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Bison now warns if it finds a stray `$' or `@' in an action.
-	* src/scan-gram.l (<SC_BRACED_CODE>[$@]): Implement this.
-
-2005-10-13  Akim Demaille  <akim@epita.fr>
-
-	* src/scan-skel.l: Output the base name parts of the parser and
-	header file names.
-	* tests/output.at (AT_CHECK_OUTPUT): Support subdirectories, and
-	additional checks.
-	Use this to exercise C++ outputs in subdirs.
-	Reported by Oleg Smolsky.
-
-2005-10-12  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/c.m4 (b4_c_function_def): Look at __C99_FUNC__, not at
-	__STDC_VERSION__, as IBM cc 7.0 doesn't define the latter either.
-	Problem reported by John P. Hartmann.
-	* data/yacc.c (YYMODERN_C): Likewise.  Don't define if the user has
-	already defined it.
-
-2005-10-12  Akim Demaille  <akim@epita.fr>
-
-	* src/parse-gram.y (version_check): Exit 63 to please missing
-	(stands for "version mismatch).
-	* tests/input.at, doc/bison.texinfo: Adjust.
-
-2005-10-10  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Work around portability problems with Visual Age C compiler
-	(xlc and xlC_r) reported by John P. Hartmann.
-	* data/location.cc (initial_column, initial_line): Remove.
-	All uses replaced by 0 and 1.
-	* src/scan-gram.l (gram_wrap): Redefine to avoid bug in flex 2.5.31
-	that xlc complains about.
-	* src/scan-skel.l (skel_wrap): Likewise.
-	* data/c.m4 (b4_c_function_def): Look at __STDC_VERSION__ as well
-	as __STDC__.
-	* data/yacc.c (YYMODERN_C): New macro, which also looks at
-	__STDC_VERSION__.  Use it everywhere instead of looking at
-	__STDC__ and __cplusplus.
-
-2005-10-10  Akim Demaille  <akim@epita.fr>
-
-	* examples/calc++/test: Be quiet unless VERBOSE.
-
-2005-10-05  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/c.m4 (yydestruct, yysymprint):
-	Use YYUSE instead of casting to void.
-	* data/glr.c (YYUSE): New macro.
-	(yyuserMerge, yyreportAmbiguity, yyreportSyntaxError):
-	Use it instead of rolling our own.
-	(YYLLOC_DEFAULT, YYCHK, YYDPRINTF, YY_SYMBOL_PRINT, YY_REDUCE_PRINT):
-	(YYCHK1):
-	Use /*CONSTCOND*/ to suppress lint warnings.
-	* data/lalr1.cc (YYLLOC_DEFAULT, YY_SYMBOL_PRINT, YY_REDUCE_PRINT):
-	(YY_STACK_PRINT): Use 'false' not '0'.
-	(YYUSE): New macro.
-	(yysymprint_, yydestruct_): Use it instead of rolling our own.
-	* data/yacc.c (YYUSE): New macro.
-	(YYCOPY, YYSTACK_RELOCATE, YYBACKUP, YYLLOC_DEFAULT):
-	(YYDPRINTF, YY_SYMBOL_PRINT, YY_STACK_PRINT, YY_REDUCE_PRINT):
-	(yyerrorlab): Use /*CONSTCOND*/ to suppress lint warnings.
-
-
-	* data/m4sugar/m4sugar.m4 (_m4_map): New macro.
-	(m4_map, m4_map_sep): Use it.  Handle the empty list correctly.
-
-2005-10-04  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Undo the parts of the unlocked-I/O change that substituted
-	putc or puts for printf.  This might hurt performance a bit,
-	but some people prefer the printf style.
-	* data/c.m4 (yysymprint): Prefer printf to puts and putc.
-	* data/glr.c (YYFPUTC, YYFPUTS, YYDPUTS): Remove.
-	All uses replaced by YYFPRINTF and YYDPRINTF.
-	* data/yacc.c: Likewise.
-	* lib/bitset.c (bitset_print): Likewise.
-	* lib/bitsetv.c (bitsetv_dump, debug-bitsetv): Prefer printf to
-	putc and puts.
-	* lib/lbitset.c (debug_lbitset): Likewise.
-	* src/closure.c (print_firsts, print_fderives): Likewise.
-	* src/gram.c (grammar_dump): Likewise.
-	* src/lalr.c (look_ahead_tokens_print): Likewise.
-	* src/output.c (escaped_output): Likewise.
-	(user_actions_output): Break apart two printfs.
-	* src/parse-gram.y (%printer): Prefer printf to putc and puts.
-	* src/reduce.c (reduce_print): Likewise.
-	* src/state.c (state_rule_look_ahead_tokens_print): Likewise.
-	* src/system.h: Include unlocked-io.h rathe than stdio.h.
-
-	* data/glr.c (yyuserMerge, yyreportAmbiguity, yyreportSyntaxError):
-	Use assignments rather than casts-to-void to suppress
-	unused-variable warnings.  This pacifies 'lint'.
-	* data/lalr1.cc (yysymprint_, yydestruct_): Use a call to suppress
-	unused-variable warnings.
-
-2005-10-03  Juan Manuel Guerrero  <juan.guerrero@gmx.de>
-
-	* Makefile.am: DJGPP specific files added to EXTRA_DIST.
-
-2005-10-02  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Use unlocked I/O for a minor performance improvement on hosts like
-	GNU/Linux and Solaris that support unlocked I/O.  The basic idea
-	is to use the gnlib unlocked-io module, and to prefer putc and
-	puts to printf when either will work (since the latter doesn't
-	come in an unlocked flavor).
-	* bootstrap (gnulib_modules): Add unlocked-io.
-	* data/c.m4 (yysymprint): Prefer puts and putc to printf.
-	* data/glr.c (YYFPUTC, YYFPUTS, YYDPUTS): New macros.
-	Prefer them to YYFPRINTF and YYDPRINTF if either will do,
-	and similarly for puts and putc and printf.
-	* data/yacc.c: Likewise.
-	* lib/bitset.c (bitset_print): Likewise.
-	* lib/bitset.h [USE_UNLOCKED_IO]: Include unlocked-io.h.
-	* lib/bitsetv.c (bitsetv_dump, debug-bitsetv): Prefer putc and puts
-	to printf.
-	* lib/lbitset.c (debug_lbitset): Likewise.
-	* src/closure.c (print_firsts, print_fderives): Likewise.
-	* src/gram.c (grammar_dump): Likewise.
-	* src/lalr.c (look_ahead_tokens_print): Likewise.
-	* src/output.c (escaped_output): Likewise.
-	(user_actions_output): Coalesce two printfs.
-	* src/parse-gram.y (%printer): Prefer putc and puts to printf.
-	* src/reduce.c (reduce_print): Likewise.
-	* src/state.c (state_rule_look_ahead_tokens_print): Likewise.
-	* src/system.h: Include unlocked-io.h rather than stdio.h.
-
-	* data/lalr1.cc: Don't put an unmatched ' in a dnl comment, as
-	this confuses xgettext.
-
-2005-10-02  Akim Demaille  <akim@epita.fr>
-
-	* bootstrap (gnulib_modules): Add strverscmp.
-	* lib/.cvsignore: Add strverscmp.c, strverscmp.h.
-	* m4/.cvsignore: Add strverscmp.m4.
-	* src/parse-gram.y (%require): New token, new rule.
-	(version_check): New.
-	* src/scan-gram.l (%require): Adjust.
-	* tests/input.at (AT_REQUIRE): New.
-	Use it.
-	* doc/bison.texinfo (Require Decl): New.
-	(Calc++ Parser): Use %require.
-
-2005-10-02  Akim Demaille  <akim@epita.fr>
-
-	* data/location.cc: New.
-
-2005-10-02  Paul Eggert  <eggert@cs.ucla.edu>,
-	    Akim Demaille  <akim@epita.fr>
-
-	Make sure -odir/foo.cc creates dir/location.hh etc.
-	* src/files.h (spec_outfile, parser_file_name, spec_name_prefix)
-	(spec_file_prefix, spec_verbose_file, spec_graph_file)
-	(spec_defines_file): Now const.
-	(dir_prefix): New.
-	(short_base_name): Remove.
-	* src/files.c: Adjust.
-	(dirname.h): Include.
-	(base_name): Don't prototype it.
-	(finput): Remove, duplicates gram_in.
-	(full_base_name, short_base_name): Replace by...
-	(all_but_ext, all_but_tab_ext): these.
-	(compute_base_names): Rename as...
-	(compute_file_name_parts): this.
-	Update to compute the new variables, including dir_prefix.
-	Adjust dependencies.
-	* src/output.c (prepare): Output them.
-	* src/reader.c: Adjust to use gram_in, not finput.
-	* src/scan-skel.l (@dir_prefix@): New.
-
-2005-10-02  Juan Manuel Guerrero  <juan.guerrero@gmx.de>
-
-	* lib/subpipe.c: New function end_of_output_subpipe() added
-	to allow support for non-posix systems. This is a no-op function
-	for posix systems.
-
-	* lib/subpipe.h: New function end_of_output_subpipe() added
-	to allow support for non-posix systems. This is a no-op function
-	for posix systems.
-
-	* src/output.c (output_skeleton): Use end_of_output_subpipe() to
-	handle the lack of pipe/fork functionality on non-posix systems.
-
-	* djgpp/Makefile.maint: DJGPP specific file.
-
-	* djgpp/README.in: DJGPP specific file.
-
-	* djgpp/config.bat: DJGPP specific configuration file.
-
-	* djgpp/config.sed: DJGPP specific configuration file.
-
-	* djgpp/config.site: DJGPP specific configuration file.
-
-	* djgpp/config_h.sed: DJGPP specific configuration file.
-
-	* djgpp/subpipe.c: DJGPP specific replacement file for lib/subpipe.c.
-
-	* djgpp/subpipe.h: DJGPP specific replacement file for lib/subpipe.h.
-
-2005-10-02  Akim Demaille  <akim@epita.fr>
-
-	* data/location.cc: New, extract from...
-	* data/lalr1.cc: here.
-	(location.hh): Include it after the user prologue, in case the
-	filename type is defined by the user.
-	Forward declation location and position before the pre-prologue.
-	(yyresult_): Rename as...
-	(yyresult): this, it's a local variable, not an attribute.
-	* data/Makefile.am (dist_pkgdata_DATA): Adjust.
-
-2005-10-01  Akim Demaille  <akim@epita.fr>
-
-	* examples/extexi: Restore the #line generation.
-
-2005-09-30  Akim Demaille  <akim@epita.fr>,
-	    Alexandre Duret-Lutz <adl@gnu.org>
-
-	Move the token type and YYSTYPE in the parser class.
-	* data/lalr1.cc (stack.hh, location.hh): Include earlier.
-	(parser::token): New, from the moved free definition of tokens.
-	(parser::semantic_value): Now a full definition instead of an
-	indirection to YYSTYPE.
-	(b4_post_prologue): No longer included in the header file, but
-	in the implementation file.
-	* doc/bison.texi (C+ Language Interface): Update.
-	* src/parse-gram.y: Support unary %define.
-	* tests/actions.at: Define global_tokens_and_yystype for backward
-	compatibility until we update the tests.
-	* tests/calc.at: Idem.
-	(first_line, first_column, last_line, last_column): Define for lalr1.cc
-	to simplify the code.
-
-2005-09-29  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Port to SunOS 4.1.4, which lacks strtoul and strerror.
-	Ah, the good old days!  Problem reported by Peter Klein.
-	* bootstrap (gnulib_modules): Add strerror, strtoul.
-	* lib/.cvsignore: Add strerror.c, strtol.c, strtoul.c
-	* m4/.cvsignore: Add strerror.m4, strtol.m4, strtoul.m4.
-
-2005-09-29  Akim Demaille  <akim@epita.fr>
-
-	* data/c.m4 (b4_error_verbose_if): New.
-	* data/lalr1.cc: Use it.
-	(YYERROR_VERBOSE_IF): Remove.
-	(yyn_, yylen_, yystate_, yynerrs_, yyerrstatus_): Remove as
-	parser members, replaced by...
-	(yyn, yylen, yystate, yynerss, yyerrstatus): these parser::parse
-	local variables.
-	(yysyntax_error_): Takes the state number as argument.
-	(yyreduce_print_): Use the argument yyrule, not the former
-	attribute yyn_.
-
-2005-09-26  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* bootstrap (gnulib_modules): Add verify.
-	* lib/.cvsignore: Add verify.h.
-	* src/getargs.c: Use ARGMATCH_VERIFY rather than verify.
-	* src/system.h (verify): Remove.
-	Include verify.h instead.
-	* src/tables.c (tables_generate): Use new API for 'verify'.
-
-2005-09-21  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* tests/local.at (_AT_BISON_OPTION_PUSHDEFS): Do not use
-	local variables whose names begin with 'yy'.
-	* tests/calc.at (_AT_DATA_CALC_Y): Likewise.
-	Trivial changes from Joel E. Denny.
-
-	* bootstrap (gnulib_modules): Remove alloca.  Bison doesn't need
-	it itself.
-	* src/main.c (main) [C_ALLOCA]: Don't flush alloca'ed memory; we
-	don't use alloca any more.
-
-	* data/yacc.c [YYSTACK_USE_ALLOCA && !defined __GNUC__ && ! defined
-	__BUILTIN_VA_ARG_INCR && ! defined _AIX && ! defined _MSC_VER &&
-	defined _ALLOCA_H]: Don't include <stdlib.h>; not needed in this case.
-	* tests/torture.at (Exploding the Stack Size with Alloca): Adjust
-	to match yacc.c, to test more hosts.
-
-2005-09-20  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/yacc.c (YYSIZE_T): Reindent to make it clearer.  This
-	doesn't affect behavior.
-	(YYSTACK_ALLOC) [YYSTACK_USE_ALLOCA]: Improve support for
-	Solaris, AIX, MSC.
-	(_STDLIB_H): Renamed from YYINCLUDED_STDLIB_H.  All uses changed.
-	This works a bit better with glibc, if user code has already included
-	stdlib.h.
-	* doc/bison.texinfo (Bison Parser): Document that users can't
-	arbitrarily use malloc and free for other purposes.  Document
-	that <alloca.h> and <malloc.h> might be included.
-	(Table of Symbols): Under YYSTACK_USE_ALLOCA, Don't claim that the
-	user must declare alloca.
-
-	* HACKING (release): Forwarn the Translation Project about
-	stable releses.
-
-2005-09-20  Akim Demaille  <akim@epita.fr>
-
-	* data/glr.c: Use b4_token_enums, not b4_token_enums_defines.
-
-2005-09-19  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/yacc.c (YYSIZE_MAXIMUM): New macro.
-	(YYSTACK_ALLOC_MAXIMUM): Use it.
-	(yysyntax_error): New function.
-	(yyparse) [YYERROR_VERBOSE]: Don't leak memory indefinitely if
-	multiple syntax errors are reported, and alloca is being used.
-	Instead, reallocate buffers twice as big each time, so that
-	we waste at most half the allocated memory.  Start with a small
-	(128-byte) buffer that will suffice in most cases anyway.
-	Use yysyntax_error to do most of the work.
-
-	* doc/bison.texinfo (Error Reporting, Table of Symbols):
-	yynerrs is the number of errors reported, not the number of
-	errors encountered.
-
-	* tests/glr-regression.at (Duplicated user destructor for lookahead):
-	Mark it as expected to fail.
-	Cast result of malloc; problem reported by twlevo@xs4all.nl.
-	* tests/actions.at, tests/calc.at, tests/glr-regression.at:
-	Don't start user-code symbols with "yy", to avoid name space problems.
-
-2005-09-19  Akim Demaille  <akim@epita.fr>
-
-	Remove the traits, failed experiment.
-	It never proved useful, and anyway because of the current
-	definition, it was not possible to have several specialization of
-	this traits, making it useless.
-	* data/lalr1.cc (yy:traits): Remove.
-	Inline its definitions in the parser class.
-
-2005-09-19  Akim Demaille  <akim@epita.fr>
-
-	* tests/atlocal.in (LIBS): Pass INTLLIBS to address failures on at
-	least Mac OSX with a /usr/local install of gettext.
-
-2005-09-19  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (yyparse): Rename yylooka and yyilooka as yychar
-	and yytoken for similarity with the other skeletons.
-
-2005-09-19  Akim Demaille  <akim@epita.fr>
-
-	* NEWS, configure.ac: update version number to 2.1a.
-
-2005-09-16  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Version 2.1.
-
-	* NEWS: Remove notice of yytname change, since it was never in an
-	official release.
-	* data/glr.c (yydestroyGLRState): Rename local var to avoid shadowing
-	diagnostic.
-	* src/output.c (prepare): Likewise.
-	* data/lalr1.cc (YYERROR_VERBOSE_IF): New macro.
-	(yysyntax_error_): Use it to avoid GCC warning when YYERROR_VERBOSE
-	is not defined.  This is an awful hack, but it's enough for now.
-	All callers changed.
-	* tests/glr-regression-at (make_value): Args are const pointers now,
-	to avoid GCC warning.
-	(Duplicated user destructor for lookahead): New test.  Currently
-	skipped.  It fails on my host but I'm not sure it'll always fail.
-
-2005-09-16  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.h (struct symbol): Declare the printer and destructor
-	as const, to avoid accidental calls to free.
-	(symbol_destructor_set, symbol_printer_set): Adjust.
-	* src/symtab.c: Adjust.
-
-2005-09-16  Akim Demaille  <akim@epita.fr>
-
-	* data/c.m4 (b4_token_enums): New.
-	(b4_token_defines): Rename as...
-	(b4_token_enums_defines): this.
-	(b4_token_defines): New, output only the #defines.
-	* data/yacc.c, data/glr.c: Adjust.
-	* data/lalr1.cc: Use b4_token_enums instead of b4_token_enums_defines.
-	* data/c.m4 (b4_yydestruct_generate, b4_yysymprint_generate): Define
-	as default values.
-
-2005-09-16  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (yylex_): Remove, inline its code.
-	(yyreport_syntax_error_): Remove, replaced by...
-	(yysyntax_error_): this which returns a string and leaves to the
-	caller the call to the users' error function.
-	(yylooka_, yyilooka_, yylval, yylloc, yyerror_range_, yyval, yyloc):
-	Move from members of the parser object...
-	(yylooka, yyilooka, yylval, yylloc, yyerror_range, yyval, yyloc):
-	to local variables of the parse function.
-
-2005-09-16  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (Calc++ Parser): Don't promote defining YYEOF
-	since it's in Bison's name space.
-
-2005-09-15  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (yyresolveValue): Add default case to pacify
-	gcc -Wswitch-default.  Problem reported by twlevo@xs4all.nl.
-
-	* NEWS: Document when yyparse started to return 2.
-	* doc/bison.texinfo (Parser Function): Document when yyparse
-	returns 2.
-
-	* data/lalr1.cc: Revert part of previous change, as it's incompatible.
-	(b4_filename_type): Renamed back from b4_file_name_type.  All uses
-	changed.
-	(class position): file_name -> filename (reverting).  All uses changed.
-
-2005-09-14  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* examples/calc++/Makefile.am ($(calc_sources_generated)): Don't
-	do anything if $@ exists.  This reverts part of the 2005-07-07
-	patch.
-
-2005-09-11  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* Makefile.am (EXTRA_DIST): Do not distribute REFERENCES; it
-	contains obsolete information and isn't worth distributing as a
-	separate file anyway.
-	* data/glr.c [defined YYSETJMP]: Don't include <setjmp.h>.
-	(YYJMP_BUF, YYSETJMP, YYLONGJMP) [!defined YYSETJMP]: New macros.
-	All uses of jmp_buf, setjmp, longjmp changed to use these instead.
-	(yyparse): Abort if user code uses longjmp to throw an unexpected
-	value.
-
-2005-09-09  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/c.m4 (b4_identification): Define YYBISON_VERSION.
-	Suggested by twlevo@xs4all.nl.
-
-	* data/glr.c (YYCHK1): Do not assume YYE is in range.
-	This avoids a diagnostic from gcc -Wswitch-enum.
-	Problem reported by twlevo@xs4all.nl.
-
-	* doc/bison.texinfo: Don't use "filename", as per GNU coding
-	standards.  Use "file name" or "file" or "name", depending on
-	the context.
-	(Invocation): The output of "bison hack/foo.y" goes to foo.tab.c,
-	not to hack/foo.tab.c.
-	(Calc++ Top Level): 2nd arg of main is not const.
-	* data/glr.c: b4_filename -> b4_file_name.
-	* data/lalr1.cc: Likewise.  Also, b4_filename_type -> b4_file_name_type.
-	All uses changed.
-	(class position): filename -> file_name.  All uses changed.
-	* data/yacc.c: b4_filename -> b4_file_name.
-	* lib/bitset.h: filename -> file_name in local vars.
-	* lib/bitset_stats.c: Likewise.
-	* src/files.c: Likewise.
-	* src/scan-skel.l ("@output ".*\n): Likewise.
-	* src/files.c (file_name_split): Renamed from filename_split.
-	* src/muscle_tab.c (muscle_init): Output b4_file_name, not b4_filename.
-
-2005-09-08  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* lib/.cvsignore: Add pipe-safer.c, stdio--.h, unistd--.h,
-	to accommodate latest gnulib.
-
-	* tests/glr-regression.at (Duplicate representation of merged trees):
-	Add casts to pacify g++.  Problem reported by twlevo@xs4all.nl.
-
-	* bootstrap: Add comment as to why the AM_LANGINFO_CODESET hack is
-	needed.
-
-2005-08-26  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (yydestroyGLRState): Renamed from yydestroyStackItem.
-	All uses changed.  Invoke user destructor after an error during a
-	split parse (trivial change from Joel E. Denny).
-
-	* tests/glr-regression.at
-	(User destructor after an error during a split parse):  New test case.
-	Problem reported by Joel E. Denny in:
-	http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html
-
-2005-08-25  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* README-cvs: Give URLs for recommended tools.
-	Mention Gzip version problem, and bootstrapping issues.
-	Remove troubleshooting section, as it's somewhat obsolete.
-
-	* bootstrap (no_cache): New var, to accommodate different wget
-	variants.  Use it instead of '-C off'.  Problem reported by
-	twlevo@xs4all.nl.
-
-	* data/glr.c (yydestroyStackItem): New function.
-	(yyrecoverSyntaxError, yyreturn): Use it to improve quality of
-	debugging information.  Problem reported by Joel E. Denny.
-
-2005-08-25  Akim Demaille  <akim@epita.fr>
-
-	* tests/local.at (AT_COMPILE_CXX): Pass $LINKS too.
-
-2005-08-24  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (yyrecoverSyntaxError, yyreturn):
-	Don't invoke destructor on unresolved entries.
-	* tests/glr-regression.at
-	(User destructor for unresolved GLR semantic value): New test case.
-	Problem reported by Joel E. Denny in:
-	http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00016.html
-
-2005-08-21  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* lib/.cvsignore: Remove realloc.c, strncasecmp.c, xstrdup.c.
-	Add strnlen.c.
-	* m4/.cvsignore: Remove codeset.m4, gettext.m4, lib-ld.m4,
-	lib-prefix.m4, po.m4.
-
-	* data/glr.c (yyreturn): Use "Cleanup:" rather than "Error:"
-	in yydestruct diagnostic, since it might not be an error.
-	Problem reported by Joel Denny near end of
-	<http://lists.gnu.org/archive/html/help-bison/2005-07/msg00040.html>.
-	* data/lalr1.cc (yyerturn): Likewise.
-	* data/yacc.c (yyreturn): Likewise.
-	* tests/calc.at (_AT_CHECK_CALC_ERROR): Adjust to the above change.
-
-	* src/files.c: Remove obsolete FIXME comment.
-
-	* data/glr.c (YY_SYMBOL_PRINT): Append a newline, for consistency
-	with the other templates, and to fix bogus run-on messages such
-	as the one reported at the end of
-	<http://lists.gnu.org/archive/html/help-bison/2005-07/msg00040.html>.
-	All callers changed to avoid the newline.
-	(yyprocessOneStack): Output two lines rather than one, to accommodate
-	the above change.  This changes the debug output format slightly.
-
-	* data/glr.c (yyresolveValue): Fix redundant parse tree problem
-	reported by Joel E. Denny in
-	<http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00004.html>
-	(trivial change).
-	* tests/glr-regression.at (Duplicate representation of merged trees):
-	New test, from Joel E. Denny in:
-	<http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>.
-	* THANKS: Add Joel E. Denny.
-
-	* configure.ac (AC_INIT): Bump to 2.0c.
-
-2005-07-24  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Version 2.0b.
-
-	* Makefile.am (SUBDIRS): Put examples before tests, so that
-	"make check" doesn't finish with "All 1 tests passed".
-
-	* tests/regression.at (Token definitions): Don't rely on
-	AT_PARSER_CHECK for data that contains backslashes.  It currently
-	uses 'echo', and 'echo' isn't portable if its argument contains
-	backslashes.  Problem found on OpenBSD 3.4.  Also, do not assume
-	that the byte '\0xff' is not printable in the C locale; it is,
-	under OpenBSD 3.4 (!).  Luckily, '\0x80' through '\0x9e' are
-	not printable, so use '\0x81' to test.
-
-	* data/glr.c (YYOPTIONAL_LOC): Define even if it's not a recent
-	version of GCC, since the macro is used with non-GCC compilers.
-
-	Fix core dump reported by Pablo De Napoli in
-	<http://lists.gnu.org/archive/html/bug-bison/2005-07/msg00053.html>.
-	* tests/regression.at (Invalid inputs with {}): New test.
-	* src/parse-gram.y (token_name): Translate type before using
-	it as an index.
-
-	* data/glr.c (ATTRIBUTE_UNUSED): Remove, since it infringes on
-	the user's name space.  All uses changed to __attribute__
-	((__unused__)).
-	(yyFail, yyMemoryExhausted, yyreportAmbiguity):
-	Add __attribute__ ((__noreturn__)).
-
-	* etc/clcommit: Remove.  We weren't using it, and it failed
-	"make maintainer-distcheck".
-	* Makefile.maint: Merge from coreutils.
-	(CVS_LIST, CVS_LIST_EXCEPT): New macros.
-	(syntax-check-rules): Change list of rules as described below.
-	(sc_cast_of_alloca_return_value, sc_dd_max_sym_length):
-	(sc_file_system, sc_obsolete_symbols, sc_prohibit_atoi_atof):
-	(sc_prohibit_jm_in_m4, sc_root_tests, sc_tight_scope):
-	(sc_trailing_space): New rules.
-	(sc_xalloc_h_in_src): Remove.
-	(sc_cast_of_argument_to_free, sc_cast_of_x_alloc_return_value):
-	(sc_space_tab, sc_error_exit_success, sc_changelog):
-	(sc_system_h_headers, sc_sun_os_names, sc_unmarked_diagnostics):
-	(makefile-check, po-check, author_mark_check):
-	(makefile_path_separator_check, copyright-check):
-	Use grep -n, to make it easier to find violations.
-	Use CVS_LIST and CVS_LIST_EXCEPT.
-	(header_regexp, h_re): Remove.
-	(dd_c): New macro.
-	(sc_dd_max_sym_length, .re-list, news-date-check): New rules.
-	(my-distcheck): Use more-modern GCC flags.
-	(signatures, %.asc): Remove.
-	(rel-files, announcement): Remove signatures.
-	Restore old updating code, even though we don't use it, so
-	that we're the same as coreutils.
-	(alpha, beta, major): Depend on news-date-check.
-	Make the upload commands.
-
-	* data/c.m4, data/lalr1.cc, data/yacc.c: Normalize white space.
-	* lib/abitset.h, lib/bbitset.h, lib/bitset.h: Likewise.
-	* lib/bitset_stats.c, lib/ebitset.h, lib/lbitset.c: Likewise.
-	* lib/libitset.h, lib/timevar.c, lib/vbitset.h: Likewise.
-	* src/Makefile.am, src/gram.c, src/muscle_tab.h: Likewise.
-	* src/parse-gram.y, src/system.h, src/tables.c, src/vcg.c: Likewise.
-	* src/vcg_defaults.h, tests/cxx-type.at, tests/existing.at: Likewise.
-	* tests/sets.at: Likewise.
-
-	* data/m4sugar/m4sugar.m4: Sync from Autoconf, except that
-	we comment out the Autoconf version number.
-	* doc/bison.texinfo (Calc++ Scanner): Don't use atoi, as
-	it's error-prone and "make maintainer-distcheck" rejects it.
-
-	* lib/subpipe.c: Include <fcntl.h> without checking for HAVE_FCNTL_H.
-	Indent calls to "error" to pacify "make maintainer-distcheck",
-	when the calls are not intended to be translated.
-	* m4/subpipe.m4 (BISON_PREREQ_SUBPIPE): Don't check for fcntl.h.
-
-	* src/Makefile.am (DEFS): Use +=, to pacify
-	"make maintainer-distcheck".
-	(bison_SOURCES): Add scan-skel.h.
-	(sc_tight_scope): New rule, from coreutils.
-
-	* src/files.c (src_extension, header_extension):
-	Now static, not extern.
-	* src/getargs.c (short_options): Likewise.
-	* src/muscle_tab.c (muscle_table): Likewise.
-	* src/parse-gram.y (current_class, current_type, current_prec):
-	Likewise.
-	* src/reader.c (grammar_end, previous_rule_end): Likewise.
-	* src/getargs.h: Redo comments to pacify "make maintainer-distcheck".
-	* src/main.c (main): Cast bindtextdomain and textdomain calls to
-	void, to avoid warning when NLS is disabled.
-	* src/output.c: Include scan-skel.h.
-	(scan_skel): Remove decl, since scan-skel.h does this.
-	(output_skeleton):
-	Indent calls to "error" to pacify "make maintainer-distcheck".
-	* src/print_graph.c: Don't include <obstack.h>, as system.h does this.
-	* src/reader.h (gram_end, gram_lineno): New decls to pacify
-	"make maintainer-distcheck".
-	* src/scan-skel.l (skel_lex, skel_get_lineno, skel_get_in):
-	(skel_get_out, skel_get_leng, skel_get_text, skel_set_lineno):
-	(skel_set_in, skel_set_out, skel_get_debug, skel_set_debug):
-	(skel_lex_destroy, scan_skel): Move these decls to...
-	* src/scan-skel.h: New file.
-	* src/uniqstr.c (uniqstr_assert):
-	Indent calls to "error" to pacify "make maintainer-distcheck".
-
-	* tests/Makefile.am ($(srcdir)/package.m4): Use $(VAR),
-	not @VAR@.
-
-	* tests/torture.at: Revamp to avoid misuse of atoi that
-	"make maintainer-distcheck" complained about.
-
-	* examples/extexi (message): Don't print a message more than once,
-	and omit line-number decoration that makes Emacs compile think
-	that informative messages are worth worrying about.
-
-2005-07-22  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* configure.ac: Update version number.
-
-	* Makefile.am (SUBDIRS): Add examples; somehow this got removed
-	accidentally.
-	* examples/calc++/calc++-parser.yy: Remove from CVS, as it's
-	autogenerated by the maintainer.
-	* examples/calc++/.cvsignore: Add *.yy.
-
-	* lib/bitset.c (bitset_alloc): Don't cast xcalloc result.
-	* lib/bitset_stats.c (bitset_stats_init): Likewise.
-	* lib/bitsetv.c (bitsetv_alloc): Likewise.
-
-	* po/POTFILES.in: Add lib/xalloc-die.c; remove lib/xmalloc.c.
-
-	* src/relation.c (relation_transpose): Rewrite to avoid bogus complaint
-	from maintainer-distcheck about casting the argument of 'free'.
-
-	* NEWS: Mention recent yytname changes.
-	* THANKS: Add Anthony Heading, twlevo@xs4all.nl.
-
-	* bootstrap: For translations that have not yet been upgraded to
-	the new runtime-po domain, prime the pump by extracting the
-	relevant strings from the obsolete translations.  This code can be
-	removed once the bison-runtime domain has been translated by each
-	team.
-
-	* src/scan-gram.l (<SC_PRE_CODE>.): Don't double-quote token names,
-	now that token names are already quoted.
-
-	Fix problem reported by Anthony Heading.
-	* data/glr.c (YYTOKEN_TABLE): New macro.
-	(yytname): Define if YYTOKEN_TABLE.
-	* data/yacc.c (YYTOKEN_TABLE, yytname): Likewise.
-	* data/lalr1.cc (YYTOKEN_TABLE, yytname_): Likewise.
-	(YYERROR_VERBOSE): Define the same way the other skeletons do.
-	* src/output.c (prepare_symbols): Output token_table_flag.
-
-2005-07-21  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (yyinitGLRStack, yyreturn): Don't call malloc
-	again if the first call fails.
-
-	* data/glr.c (yytnamerr): New function.
-	(yyreportSyntaxError): Use it to dequote most string literals.
-	* data/lalr1.c (yytname_): Renamed from yyname_, for compatibility
-	with other skeletons.  All uses changed.
-	(yytnameerr_): New function.
-	(yyreport_syntax_error): Use it to dequote most string literals.
-	* data/yacc.c (yytnamerr): New function.
-	(yyerrlab): Use it to decode most string literals.
-	* doc/bison.texinfo (Decl Summary, Calling Convention):
-	Clarify quoting convention of yytname.
-	* src/output.c (prepare_symbols): Quote all names.  This undoes
-	the 2005-04-17 change, which is now accomplished (mostly) via
-	changes in the parsers as described above.
-	* tests/regression.at (Token definitions, Web2c Actions):
-	Undo most 2005-04-17 change here, too.
-
-2005-07-20  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Fix more problems reported by twlevo@xs4all.nl.
-	* tests/cxx-type.at: Don't pipe output of ./types through sed to
-	remove trailing spaces.  This loses the exit status of ./types,
-	and isn't needed since ./types shouldn't be emitting trailing
-	spaces.
-	* data/glr.c (yyreturn): Don't pop stack if yyinitStateSet failed,
-	as the stack isn't valid in that case.
-
-	* src/scan-gram.l (gram_get_lineno, gram_get_in, gram_get_out):
-	(gram_get_leng, gram_get_text, gram_set_lineno, gram_set_in):
-	(gram_set_out, gram_get_debug, gram_set_debug, gram_lex_destroy):
-	Add declarations to pacify "gcc -Wmissing-prototypes" when flex 2.5.31
-	is used.
-	* src/scan-skel.l (skel_get_lineno, skel_get_in, skel_get_out):
-	(skel_get_leng, skel_get_text, skel_set_lineno, skel_set_in):
-	(skel_set_out, skel_get_debug, skel_set_debug, skel_lex_destroy):
-	Likewise.
-
-	* tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Work even with
-	overly-picky compilers that reject 'char *foo = "bar";'.
-
-	* src/symtab.c (SYMBOL_ATTR_PRINT, symbol_print): Direct output
-	to FILE * parameter, not to stderr.  This fixes a typo introduced
-	in the 2005-07-12 change.
-
-	* lib/subpipe.c (create_subpipe): Rewrite slightly to avoid
-	warnings from GCC 4.
-
-	* data/glr.c (yyexpandGLRStack, yyaddDeferredAction, yyexpandGLRStack):
-	(yyglrShiftDefer, yysplitStack):
-	Remove unused parameters b4_pure_formals.  All uses changed.
-	(yyglrShift): Remove unused parameters b4_user_formals.
-	All uses changed.
-	(yyglrReduce): Removed unused parameter yylocp.  All uses changed.
-
-2005-07-18  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Destructor cleanups and regularization among the three skeletons.
-	* NEWS: Document the behavior changes.
-	* data/glr.c (yyrecoverSyntaxError): Don't bother to pop the
-	stack before failing, as the cleanup code will do it for us now.
-	* data/lalr1.cc (yyerrlab): Likewise.
-	* data/glr.c (yyparse): Pop everything off the stack before
-	freeing it, so that destructors get called properly.
-	* data/lalr1.cc (yyreturn): Likewise.
-	* data/yacc.c (yyreturn): Pop and destroy the start symbol, too.
-	This is more consistent.
-	* doc/bison.texinfo (Destructor Decl): Mention more reasons
-	why destructors might be called.  1.875 -> 2.1.
-	(Destructor Decl, Decl Summary, Table of Symbols):
-	Some English-language cleanups for %destructor.
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR):
-	Add output line for destructor of start symbol.
-	* tests/calc.at (AT_CHECK_CALC): Add one to line counts,
-	because of that same extra output line.
-
-	* NEWS: Document minor wording changes in diagnostics of
-	Bison-generated parsers.
-	* data/glr.c (yyMemoryExhausted): Renamed from yyStackOverflow.
-	Remove unused formals.  All uses changed.
-	(yyreportAmbiguity): "ambiguity detected" -> "syntax is ambiguous".
-	(yyparse): Rename yyoverflowlab to yyexhaustedlab.
-	* data/yacc.c (yyparse): "parser stack overflow" -> "memory exhausted".
-	Rename yyoverflowab to yyexhaustedlab.
-	When memory exhaustion occurs during syntax-error reporting,
-	report it separately rather than in a single diagnostic; this
-	eases translation.
-	* doc/bison.texinfo (Memory Management): Renamed from Stack Overflow.
-	(Memory Exhausted): Renamed from Parser Stack Overflow.
-	Revamp wording slightly to prefer "memory exhaustion".
-	* tests/actions.at: "parser stack overflow" -> "memory exhausted".
-
-	* data/c.m4 (b4_yysymprint_generate): Use YYFPRINTF, not fprintf.
-
-	Add i18n support to the GLR skeleton.  Partially fix the C++
-	skeleton; a C++ expert needs to finish this.  Remove debugging
-	msgids; there's little point to having them translated, since they
-	can be understood only by someone who can read the
-	(English-language) source code.
-
-	Generate runtime-po/bison-runtime.pot automatically, so that we
-	don't have to worry about garbage getting in that file.  We'll
-	make sure after the next official release that old msgids don't
-	get lost.  See
-	<http://lists.gnu.org/archive/html/bison-patches/2005-07/msg00119.html>.
-
-	* runtime-po/Makefile.in.in, runtime-po/bison-runtime.pot: Remove.
-	Now auto-generated.
-	* PACKAGING: Don't claim that Gawk, GCC, Perl use this method yet.
-	Fix typos in explanations of the runtime file.
-	* bootstrap: Change gettext keyword from YYI18N to YY_.
-	Use standard Makefile.in.in in runtime-po, since we'll arrange
-	for backward-compatible bison-runtime.po files in a different way.
-	* data/glr.c (YY_): New macro, from yacc.c.
-	(yyuserAction, yyreportAmbiguity, yyreportSyntaxError, yyparse):
-	Translate messages intended for users.
-	(yyreportSyntaxError): Change "virtual memory" to "memory" to match
-	the wording in the other skeletons.  We don't know that the memory
-	is virtual.
-	* data/lalr1.cc (YY_): Renamed from _.  All uses changed.
-	Use same method that yacc.c uses.
-	Don't translate debugging messages.
-	(yy::yyreport_syntax_error): Put in a FIXME for the i18n stuff;
-	it doesn't work (yet), and requires C++ expertise to fix.
-	* data/yacc.c (YY_): Renamed from YY18N.  All uses changed.
-	Move defn to a more logical place, to be consistent with other
-	skeletons.
-	Don't translate debugging messages.
-	Don't assume line numbers fit in unsigned int; use unsigned long fmts.
-	* doc/bison.texinfo: Mention <libintl.h>.  Change glibc cross reference
-	to gettext cross reference.  Add indexing terms.  Mention YYENABLE_NLS.
-	* runtime-po/POTFILES.in: Add data/glr.c, data/lalr1.cc.
-
-	Fix yyerror / yylex test glitches noted by twlevo@xs4all.nl.
-	* tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Have yyerror return
-	void, not int.
-	* tests/glr-regression.at (Badly Collapsed GLR States):
-	Likewise.
-	(Improper handling of embedded actions and dollar(-N) in GLR parsers):
-	yylex should return 0 at EOF rather than aborting.
-
-	Improve tests for stack overflow in GLR parser.
-	Problem reported by twlevo@xs4all.nl.
-	* data/glr.c (struct yyGLRStack): Remove yyerrflag member.
-	All uses removed.
-	(yyStackOverflow): Just longjmp, but with value 2 so that caller
-	can handle the problem.
-	(YYCHK1): Use goto (a la yacc.c) rather than setting a flag.
-	(yyparse): New local variable yyresult to record the result.
-	Use result of setjmp to set it, rather than storing itinto
-	struct.
-	(yyDone): Remove label.
-	(yyacceptlab, yyabortlab, yyoverflowlab, yyreturn): New labels,
-	to mimic yacc.c.  Do not discard lookahead if it's EOF (possible
-	if YYABORT is used).
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Exit with
-	yyparse status; put status > 1 into diagnostic.
-	Check that status==2 works.
-	* tests/calc.at, tests/cxx-type.at, tests/glr-regression.at:
-	Use exit status 3 for failure to open (which shouldn't happen).
-
-2005-07-17  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* tests/conflicts.at (%nonassoc and eof):  Don't exit with status
-	1 on syntax error; just let yyparse do its thing.
-	* tests/glr-regression.at (Badly Collapsed GLR States): Likewise.
-	* tests/torture.at (AT_DATA_STACK_TORTURE): Likewise.
-	(Exploding the Stack Size with Alloca):
-	(Exploding the Stack Size with Malloc):
-	Expect exit status 2, not 1, since the parser is supposed to blow
-	its stack.  Problem reported by twlevo@xs4all.nl.
-
-	* data/glr.c (yyparse): Don't assume that the initial calls
-	to YYMALLOC succeed; in that case, yyparse incorrectly returned 0.
-	Print a stack-overflow message and fail instead.
-	Initialize the line-number information before creating the stack,
-	so that the stack-overflow message can report line zero safely.
-
-2005-07-14  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Fix problems reported by twlevo@xs4all.nl.
-	* data/glr.c (YYSTACKEXPANDABLE): Don't define if already defined.
-	(yyuserMerge): Provide a default case if b4_mergers is empty.
-	* tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Define YYSTACKEXPANDABLE.
-	* tests/glr-regression.at
-	(Improper handling of embedded actions and dollar(-N) in GLR parsers):
-	Add casts to pacify C++ compilers.
-	* tests/glr-regression.at (Improper merging of GLR delayed action
-	sets): Declare yylex before using it.
-	* tests/Makefile.am (maintainer-check-g++): Fix a stray
-	$(GXX) that escaped the renaming of GXX to CXX.  Remove bogus
-	test for valgrind; valgrind is independent of g++.
-	(maintainer-check-posix): Add _POSIX2_VERSION=200112, to check
-	for compatibility with POSIX 1003.1-2001 (if running coreutils).
-	* tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Port to stricter C++.
-	Use a destructor, so that we can expand the stack.  Change
-	YYSTYPE to char * so that we can free it.  Cast result of malloc.
-
-2005-07-13  Paul Hilfinger  <hilfingr@CS.Berkeley.EDU>
-
-	* data/glr.c (yyuserAction): Fix uninitialized variable that caused
-	a valgrind failure.  Problem reported by twlevo@xs4all.nl.
-
-2005-07-13  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* PACKAGING: New file, suggested by Bruno Haible and taken from
-	similar wording in gettext's PACKAGING file.
-	* NEWS: Mention PACKAGING.
-	* Makefile.am (EXTRA_DIST): Add PACKAGING.
-
-2005-07-12  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Document recent i18n improvements.
-	* bootstrap: Get runtime translations into runtime-po.
-	Create runtime-po files automatically, if possible.
-	* configure.ac: Invoke BISON_I18N, so that we eat our own dog food.
-	* data/yacc.c: Rewrite inclusion of <libintl.h> so that ENABLE_NLS
-	does not infringe on the user's name space.
-	(YYENABLE_NLS): Renamed from ENABLE_BISON_NLS.
-	* doc/bison.texinfo (Internationalization): Revamp the English
-	and Texinfo syntax a bit, to try to make it clearer.
-	(Bison Options, Option Cross Key): Mention --print-localedir.
-	* m4/bison-i18n.m4 (BISON_I18N): Rename ENABLE_BISON_NLS to
-	YYENABLE_NLS.  Quote a bit more.
-	* runtime-po/.cvsignore: New file.
-	* runtime-po/Makefile.in.in (mostlyclean): Remove *.old.pot.
-	* runtime-po/Rules-quot: Remove; now created by bootstrap.
-	* runtime-po/quot.sed: Likewise.
-	* runtime-po/boldquot.sed: Likewise.
-	* runtime-po/en@quot.header: Likewise.
-	* runtime-po/en@boldquot.header: Likewise.
-	* runtime-po/insert-header.sin: Likewise.
-	* runtime-po/remove-potcdate.sin: Likewise.
-	* runtime-po/Makevars: Likewise.
-	* runtime-po/LINGUAS: Likewise.
-	* runtime-po/de.po: Likewise; we will rely on the translation project
-	to maintain this, so "bootstrap" should get it.
-	* src/getarg.c (PRINT_LOCALEDIR_OPTION): Let the C compiler determine
-	its value.
-	* src/main.c (main): Bind the bison-runtime domain, too.
-
-2005-07-12  Bruno Haible  <bruno@clisp.org>
-
-	* data/yacc.c: Include <libintl.h> when NLS is enabled.
-	(YYI18N): Renamed from _. Use dgettext when NLS is enabled.
-	* po/POTFILES.in: Remove autogenerated file src/parse-gram.c.
-	* runtime-po: New directory.
-	* runtime-po/Makefile.in.in: New file, copied from po/, with modified
-	$(DOMAIN).pot-update rule, so that old messages are never dropped.
-	* runtime-po/Rules-quot: New file, copied from po/.
-	* runtime-po/quot.sed: Likewise.
-	* runtime-po/boldquot.sed: Likewise.
-	* runtime-po/en@quot.header: Likewise.
-	* runtime-po/en@boldquot.header: Likewise.
-	* runtime-po/insert-header.sin: Likewise.
-	* runtime-po/remove-potcdate.sin: Likewise.
-	* runtime-po/Makevars: New file.
-	* runtime-po/POTFILES.in: New file.
-	* runtime-po/LINGUAS: New file.
-	* runtime-po/bison-runtime.pot: New file.
-	* runtime-po/de.po: New file.
-	* m4/bison.m4: New file.
-	* Makefile.am (SUBDIRS): Add runtime-po.
-	(aclocaldir, aclocal_DATA): New variables.
-	* configure.ac: Add AC_CONFIG_FILES of runtime-po/Makefile.in.
-	Define aclocaldir.
-	* src/getargs.c (usage): Document --print-localedir option.
-	(PRINT_LOCALEDIR_OPTION): New enum item.
-	(long_options): Add --print-localedir option.
-	(getargs): Handle --print-localedir option.
-	* doc/bison.texinfo (Bison Parser): Remove paragraph about _().
-	(Internationalization): New section.
-
-2005-07-12  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.h, src/symtab.c (symbol_print): Swap the arguments,
-	for consistency with the rest of the code.
-	* src/symlist.h, src/symlist.c (symbol_list_print): Ditto.
-	Add separators.
-
-2005-07-12  Akim Demaille  <akim@epita.fr>
-
-	* src/parse-gram.y: Use %printer instead of YYPRINT.
-
-2005-07-12  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.h, src/symtab.c (symbol_print): New.
-	* src/symlist.h, src/symlist.c (symbol_list_print): New.
-	* src/symlist.c (symbol_list_n_type_name_get): Report the culprit.
-
-2005-07-12  Akim Demaille  <akim@epita.fr>
-
-	* data/glr.c (b4_syncline): Fix (swap) the definitions of
-	b4_at_dollar and b4_dollar_dollar.
-
-2005-07-11  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* doc/bison.texinfo (Mystery Conflicts): Add reference to DeRemer
-	and Pennello's paper.
-
-2005-07-09  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/yacc.c (yyparse): Undo previous patch.  Instead,
-	set yylsp[0] and yyvsp[0] only if the initial action
-	sets yylloc and yylval, respectively.
-
-	* data/yacc.c (yyparse): In the initial action, set
-	yylsp[0] and yyvsp[0] rather than yylloc and yylval.
-	This avoids the use of undefined variables if the initial
-	action does not set yylloc and/or yylval.
-
-2005-07-07  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* examples/calc++/calc++-driver.cc, examples/calc++/calc++-driver.hh:
-	* examples/calc++/calc++-scanner.ll, examples/calc++/calc++.cc:
-	Remove from CVS.  These files are automatically generated.
-	* examples/extexi: Clarify that this file is now part of Bison,
-	not GNU M4, and that it works with any POSIX-compatible Awk.
-	* examples/calc++/Makefile.am (run_extexi): Remove; not used.
-	($(calc_extracted)): Renamed from $(calc_sources_extracted),
-	so that we also get calc++-parser.yy.  Geneate it.
-	Use $(AWK), not gawk, since any conforming Awk will do.
-	Put comment before action, since older 'make' can't handle comment
-	in action.
-	$(BUILT_SOURCES): List all built sources, not just some of them.
-	$(MAINTAINERCLEANFILES): Remove *.stamp, and all built sources.
-	$($(srcdir)/calc++-parser.stamp): Work even if POSIXLY_CORRECT.
-	$($(calc_sources_generated)): Remove unnecessary test for existence
-	of target.  (This had a shell syntax error anyway; a stray "x".)
-	(calc_extracted): List $(srcdir)/calc++-parser.yy, not
-	calc++-parser.yy.
-	* examples/.cvsignore, examples/calc++/.cvsignore: New files.
-
-	* bootstrap (gnulib_modules): Add gettext, now that it's no longer
-	implied by the other modules.
-
-2005-07-06  Akim Demaille  <akim@epita.fr>
-
-	Bind examples/calc++ to the package.
-	* examples/calc++/Makefile: Remove, replaced by...
-	* examples/calc++/Makefile.am: ... this new file.
-	* examples/calc++/test: Remove input.
-	* examples/calc++/compile: Remove.
-	* examples/Makefile.am: New.
-	* configure.ac, Makefile.am: Adjust.
-	* doc/Makefile.am (clean-local): New, for more recent texi2dvis.
-
-2005-07-05  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (yyFail): Drastically simplify; since the format argument
-	never had any % directives, we can simply pass it to yyerror.
-	(yyparse): Use "t a; a=b;" rather than "t a = b;" when a will
-	be modified later, as that is the usual style in glr.c.
-	Problems reported by Paul Hilfinger.
-
-	Rewrite GLR parser to catch more buffer overrun, storage exhaustion,
-	and size overflow errors.
-	* data/glr.c: Include <stdio.h> etc. after user prolog, not before,
-	in case the user prolog sets feature-test macros like _GNU_SOURCE.
-	(YYSIZEMAX): New macro.
-	(yystpcpy): New function, taken from yacc.c.
-	(struct yyGLRStack.yyspaceLeft): Now size_t, not int.
-	(yyinitGLRStack, yyfreeGLRstack): Remove unnecessary forward decls,
-	so that we don't have to maintain their signatures.
-	(yyFail): Check for buffer overflow, by using vsnprintf rather
-	than vsprintf.  Allocate a bigger buffer if possible.
-	Report an error if buffer allocation fails.
-	(yyStackOverflow): New function.
-	(yyinitStateSet, yyinitGLRStack): Return a boolean indicating whether
-	the initialization was successful.  It might fail if storage was
-	exhausted.
-	(yyexpandGLRStack): Add more checks for storage allocation failure.
-	Use yyStackOverflow to report failures.
-	(yymarkStackDeleted, yyglrShift, yyglrShiftDefer, yydoAction):
-	(yysplitStack, yyprocessOneStack, yyparse, yypstack):
-	Don't assume stack number fits in int.
-	(yysplitStack): Check for storage allocation failure.
-	(yysplitStack, yyprocessOneStack): Add pure_formals, so that we
-	can print diagnostics on storage allocation failure.  All callers
-	changed.
-	(yyresolveValue): Use yybool for boolean.
-	(yyreportSyntaxError): Check for size-calculation overflow.
-	This code is taken from yacc.c.
-	(yyparse): Check for storage allocation errors when allocating
-	the initial stack.
-
-2005-07-05  Akim Demaille  <akim@epita.fr>
-
-	Extract calc++ from the documentation.
-	* doc/bison.texinfo (Calc++): Add the extraction marks.
-	* examples/extexi: New, from the aborted GNU Programming 2E.
-	Separate the different paragraph of a file with empty lines.
-	* examples/Makefile: Use it to extract the whole calc++ example.
-
-2005-06-24  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (C++ Parser Interface): Use defcv to define
-	class typedefs.
-
-2005-06-22  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (C++ Language Interface): First stab.
-	(C++ Parsers): Remove.
-
-2005-06-22  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (yylex_): Honor %lex-param.
-
-2005-06-22  Akim Demaille  <akim@epita.fr>
-
-	Start a set of simple examples.
-	* examples/calc++/Makefile, examples/calc++/calc++-driver.cc,
-	* examples/calc++/calc++-driver.hh,
-	* examples/calc++/calc++-parser.yy,
-	* examples/calc++/calc++-scanner.ll, examples/calc++/calc++.cc,
-	* examples/calc++/compile, examples/calc++/test: New.
-
-2005-06-09  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/yacc.c (malloc, free) [defined __cplusplus]: Wrap inside
-	extern "C" {}.  This fixes a problem reported by Paul Hilfinger,
-	which stems from the 2005-05-27 patch.
-
-2005-06-06  Paul Hilfinger  <hilfingr@tully.CS.Berkeley.EDU>
-
-	* data/glr.c: Modify treatment of unused parameters to permit use
-	of g++ (which doesn't allow __attribute__ ((unused)) for parameters).
-
-2005-05-30  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Fix infringement on user name space reported by Janos Zoltan Szabo.
-	* data/yacc.c (yyparse): strlen -> yystrlen.
-
-2005-05-30  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (_): New.
-	Translate the various messages.
-
-2005-05-27  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Fix infringement on user name space reported by Bruno Haible.
-	* data/yacc.c (YYSIZE_T): Define first, so that later decls can use it.
-	Prefer GCC's __SIZE_TYPE__ if available, so that we don't infringe on
-	the user's name space.
-	(alloca): Include <stdlib.h> to get it, if it's not built in.
-	(YYMALLOC, YYFREE): Define only if needed.
-	(malloc, free): Declare, but only if needed, as this infringes on
-	the user name space.
-
-2005-05-25  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Fix BeOS, FreeBSD, MacOS porting problems reported by Bruno Haible.
-	* lib/bitset.c (bitset_print): Don't assume size_t can be printed
-	with %d format.
-	* lib/ebitset.c (min, max): Undef before defining.
-	* lib/vbitset.c (min, max): Likewise.
-	* lib/subpipe.c (create_subpipe): Save local variables in case
-	vfork clobbers them.
-
-2005-05-24  Bruno Haible  <bruno@clisp.org>
-
-	* tests/synclines.at (AT_SYNCLINES_COMPILE): Add support for the
-	error message syntax used by gcc-4.0.
-
-2005-05-23  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* README: Mention m4 1.4.3.  Remove obsolete advice about
-	Sun Forte Developer 6 update 2, VMS, and MS-DOS.
-
-	* bootstrap: Remove workaround for problem I encountered with
-	gettext 0.14.1; it seems to be fixed now.
-
-2005-05-22  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Version 2.0a.
-
-	* src/files.c: Include "stdio-safer.h"; this fixes a typo in
-	the previous change.
-
-	Various maintainer cleanups.
-	* .cvsignore: Add a.exe, a.out, b.out,, conf[0-9]*, confdefs*,
-	conftest*, for benefit of CVS commands run at the same time as
-	"configure".  Add build-aux, since "bootstrap" now creates it and
-	its subfiles.
-	* Makefile.cfg (move_if_change): Remove.
-	* Makefile.maint: Remove the update stuff; we now use "bootstrap".
-	(ftp-gnu, www-gnu, move_if_change, local_updates, update):
-	(po_repo, do-po-update, po-update, wget_files, get-targets):
-	(config.guess-url_prefix, config.sub-url_prefix):
-	(ansi2knr.c-url_prefix, texinfo.tex-url_prefix):
-	(standards.texi-url_prefix, make-stds.texi-url_prefix, taget, url):
-	($(get-targets), cvs-files, automake_repo, wget-update, cvs-update):
-	Remove.
-	* configure.ac (AC_CONFIG_AUX_DIR): Change from config to build-aux;
-	this is now the recommended name.
-	* config/.cvsignore: Remove config.guess, config.rpath, config.sub,
-	depcomp, install-sh, mdate-sh, missing, mkinstalldirs, texinfo.tex,
-	ylwrap.  These files now go into build-aux.
-	* config/move-if-change: Remove.
-	* config/prev-version.txt: Bump from 1.75 to 2.0.
-
-	* bootstrap: Add stdio-safer, unistd-safer modules.
-	Remove m4/glibc2.m4 (introduced by latest gnulib, but
-	we don't need it).
-	* lib/.cvsignore: Add dup-safer.c, fd-safer.c,
-	fopen-safer.c, stdio-safer.h, unistd-safer.h.
-	* lib/subpipe.c: Include "unistd-safer.h".
-	(create_subpipe): Make sure all the newly-created
-	file descriptors are > 2, so that diagnostics don't
-	get sent down them (which might cause Bison to hang, in theory).
-	* m4/.cvsignore: Add stdio-safer.m4, unistd-safer.m4.
-	* src/files.c (xfopen): Use fopen_safer, not fopen.
-
-	* data/lalr1.cc (yy::]b4_parser_class_name[::parse): Port
-	yesterday's yacc.c fix.
-
-2005-05-21  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c, data/lalr1.cc: Update copyright date.
-
-	Fix a destructor bug reported by Wolfgang Spraul in
-	<http://lists.gnu.org/archive/html/bug-bison/2005-05/msg00042.html>.
-	* data/yacc.c (yyabortlab): Don't call destructor, and
-	don't set yychar to EMPTY.
-	(yyoverflowlab): Don't call destructor.
-	(yyreturn): Call destructor, if yychar is neither YYEOF nor YYEMPTY.
-	* tests/calc.at (AT_CHECK_CALC): Expect one fewer output lines,
-	since we no longer output the message "discarding lookahead token
-	end of input ()".
-
-2005-05-20  Paul Hilfinger  <hilfingr@CS.Berkeley.EDU>
-
-	* data/glr.c (YY_SYMBOL_PRINT): Don't print newline at end to
-	fix a small glitch in debugging output.
-	(yyprocessOneStack, yyrecoverSyntaxError, yyparse): Print newline
-	after YY_SYMBOL_PRINT where needed.
-
-	(struct yyGLRState): Add some comments.
-	(struct yySemanticOption): Add some comments.
-	(union yyGLRStackItem): Add comment.
-
-	(yymergeOptionSets): Correct this to properly perform the union,
-	avoiding infinite reported by Michael Rosien.
-	Update comment.
-
-	* tests/glr-regression.at: Add test for GLR merging error reported
-	by M. Rosien.
-
-2005-05-13  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* COPYING, ChangeLog, GNUmakefile, HACKING, Makefile.am,
-	Makefile.cfg, Makefile.maint, NEWS, README, README-alpha,
-	README-cvs, TODO, bootstrap, configure.ac, data/Makefile.am,
-	data/README, data/c.m4, data/glr.c, data/lalr1.cc, data/yacc.c,
-	data/m4sugar/m4sugar.m4, doc/Makefile.am, doc/bison.texinfo,
-	doc/fdl.texi, doc/gpl.texi, doc/refcard.tex, lib/Makefile.am,
-	lib/abitset.c, lib/abitset.h, lib/bbitset.h, lib/bitset.c,
-	lib/bitset.h, lib/bitset_stats.c, lib/bitset_stats.h,
-	lib/bitsetv-print.c, lib/bitsetv-print.h, lib/bitsetv.c,
-	lib/bitsetv.h, lib/ebitset.c, lib/ebitset.h, lib/get-errno.c,
-	lib/get-errno.h, lib/lbitset.c, lib/lbitset.h, lib/libiberty.h,
-	lib/main.c, lib/subpipe.c, lib/subpipe.h, lib/timevar.c,
-	lib/timevar.def, lib/timevar.h, lib/vbitset.c, lib/vbitset.h,
-	lib/yyerror.c, m4/cxx.m4, m4/m4.m4, m4/subpipe.m4, m4/timevar.m4,
-	m4/warning.m4, src/LR0.c, src/LR0.h, src/Makefile.am, src/assoc.c,
-	src/assoc.h, src/closure.c, src/closure.h, src/complain.c,
-	src/complain.h, src/conflicts.c, src/conflicts.h, src/derives.c,
-	src/derives.h, src/files.c, src/files.h, src/getargs.c,
-	src/getargs.h, src/gram.c, src/gram.h, src/lalr.c, src/lalr.h,
-	src/location.c, src/location.h, src/main.c, src/muscle_tab.c,
-	src/muscle_tab.h, src/nullable.c, src/nullable.h, src/output.c,
-	src/output.h, src/parse-gram.c, src/parse-gram.h,
-	src/parse-gram.y, src/print.c, src/print.h, src/print_graph.c,
-	src/print_graph.h, src/reader.c, src/reader.h, src/reduce.c,
-	src/reduce.h, src/relation.c, src/relation.h, src/scan-gram.l,
-	src/scan-skel.l, src/state.c, src/state.h, src/symlist.c,
-	src/symlist.h, src/symtab.c, src/symtab.h, src/system.h,
-	src/tables.c, src/tables.h, src/uniqstr.c, src/uniqstr.h,
-	src/vcg.c, src/vcg.h, src/vcg_defaults.h, tests/Makefile.am,
-	tests/actions.at, tests/c++.at, tests/calc.at, tests/conflicts.at,
-	tests/cxx-type.at, tests/existing.at, tests/glr-regression.at,
-	tests/headers.at, tests/input.at, tests/local.at, tests/output.at,
-	tests/reduce.at, tests/regression.at, tests/sets.at,
-	tests/synclines.at, tests/testsuite.at, tests/torture.at:
-	Update FSF postal mail address.
-
-2005-05-11  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* tests/local.at (AT_COMPILE_CXX): Treat LDFLAGS like AT_COMPILE does.
-	Problem reported by Ralf Menzel.
-
-2005-05-01  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* tests/actions.at: Test that stack overflow invokes destructors.
-	From Marcus Holland-Moritz.
-	* data/yacc.c (yyerrlab): Move the code that destroys the stack
-	from here....
-	(yyreturn): to here.  That way, destructors are called properly
-	even if the stack overflows, or the user calls YYACCEPT or
-	YYABORT.  Stack-overflow problem reported by Marcus Holland-Moritz.
-	(yyoverflowlab): Destroy the lookahead.
-
-2005-04-24  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/yacc.c (YYSTACK_ALLOC_MAXIMUM): Add more-descriptive comment.
-
-2005-04-17  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Bison-generated C parsers no longer quote literal strings
-	associated with tokens.
-	* src/output.c (prepare_symbols): Don't escape strings,
-	since users don't want to see C escapes.
-	* tests/calc.at (AT_CHECK_CALC): Adjust to lack of quotes
-	in diagnostics.
-	* tests/input.at (Torturing the Scanner): Likewise.
-	* tests/regression.at (Token definitions, Web2c Actions): Likewise.
-
-2005-04-16  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* tests/torture.at (AT_INCREASE_DATA_SIZE): Skip the test if
-	the data size is known to be too small and we can't increase it.
-	This works around an HP-UX 11.00 glitch reported by Andrew Benham.
-
-2005-04-15  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/parse-gram.y: Include quotearg.h.
-	(string_as_id): Quote $1 before using it as a key, since the
-	lexer no longer quotes it for us.
-	(string_content): Don't strip quotes, since lexer no longer
-	quotes it for us.
-	* src/scan-gram.l: Include quotearg.h.
-	("\""): Omit quote.
-	("'"<SC_ESCAPED_CHARACTER>): Quote symbol before using it as
-	a key, since the rest of the lexer doesn't quote it.
-	* src/symtab.c (symbol_get): Don't quote symbol; caller does it now.
-	* tests/regression.at (Token definitions): Check for backslashes
-	in token strings.
-
-	* data/yacc.c (YYSTACK_ALLOC_MAXIMUM): New macro.
-	(YYSIZE_T): Define to unsigned long int when using an older compiler.
-	(yyparse): Revamp code to generate long syntax error message, to
-	make it easier to translate, and to avoid problems with arithmetic
-	overflow.  Change "virtual memory" to "memory" in diagnostic, since
-	we don't know whether the memory is virtual.
-
-2005-04-13  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Bison-generated C parsers now use the _ macro to
-	translate strings.
-	* data/yacc.c (_) [!defined _]: New macro.
-	All English strings wrapped inside this macro.
-	* doc/bison.texinfo (Bison Parser): Document _.
-	* po/POTFILES.in: Include src/parse-gram.c, since it now
-	includes translateable strings that parse-gram.y doesn't.
-
-2005-04-12  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/symtab.c (symbol_make_alias): Call symbol_type_set,
-	reverting the 2004-10-11 change to this function.
-	(symbol_check_alias_consistency): Don't call symbol_type_set
-	if the type name is already correct.
-	* tests/input.at (Typed symbol aliases): New test, from Tim Van Holder.
-
-2005-03-25  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* tests/regression.at (Token definitions): Don't use a token named
-	c, as that generates a "#define c ..." that runs afoul of buggy
-	stdlib.h that uses the identifier c as a member of struct
-	drand48_data.  Problem reported by Horst Wente.
-
-2005-03-21  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* bootstrap: Change translation URL from
-	http://www2.iro.umontreal.ca/~gnutra/po/maint/bison/ to
-	http://www.iro.umontreal.ca/translation/maint/bison/ to avoid
-	redirection glitches.  Problem reported by twlevo@xs4all.nl.
-
-2005-03-20  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* tests/local.at (AT_COMPILE, AT_COMPILE_CXX): Don't put options
-	after operands; POSIX says this isn't portable for the c99 command.
-
-2005-03-18  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* tests/glr-regression.at (glr-regr2a.y): Try to dump core
-	immediately if a data overrun has occurred; this may help us track
-	down what may be a spurious failure on MacOS.
-
-2005-03-17  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Respond to problems reported by twlevo@xs4all.nl.
-
-	* bootstrap: Use "trap - 0" rather than the unportable "trap 0".
-
-	* src/vcg.h: Comment fix.
-	* src/vcg_defaults.h: Parenthesize macro bodies to make them safe.
-	(G_CMAX): Change to -1 instead of INT_MAX.
-
-	* data/yacc.c (yyparse): Omit spaces before #line.
-
-2005-03-15  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/tables.c (state_number_to_vector_number): Put it inside an
-	"#if 0", since it's not currently used.  Problem reported by
-	Roland McGrath.
-
-2005-03-06  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/output.c (escaped_output): Renamed from
-	escaped_file_name_output, since we now use it for symbol tags as
-	well.  All uses changed.
-	(symbol_destructors_output, symbol_printers_output):
-	Escape symbol tags too.
-	Problem reported by Matyas Forstner in
-	<http://lists.gnu.org/archive/html/bug-bison/2005-03/msg00009.html>.
-
-	* src/muscle_tab.c (muscle_code_grow): Don't quote numbers; it's
-	not needed.
-	* src/output.c (user_actions_output, token_definitions_output,
-	symbol_destructors_output, symbol_printers_output): Likewise.
-	* src/reader.c (prologue_augment): Likewise.
-	* src/scan-gram.l (handle_action_dollar, handle_action_at): Likewise.
-
-	* src/vcg.c (output_edge): Don't quote linestyle arg.
-	Problem reported by twlevo@xs4all.nl.
-
-2005-02-28  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* doc/bison.texinfo (Semantic Tokens): Fix scoping problem in
-	example, reported by Derek M Jones.  Also, make the example even
-	more outrageous, to better illustrate how bad the problem is.
-
-2005-02-24  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* doc/bison.texinfo (Mfcalc Symtab): Correct the prototype for
-	putsym.  Typo reported by Sebastian Piping.
-
-2005-02-23  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* doc/bison.texinfo (Language and Grammar): some -> same
-	(Epilogue): int he -> in the
-	Typos reported by Sebastian Piping via Justin Pence.
-
-2005-02-07  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* tests/glr-regression.at (Improper handling of embedded actions
-	and dollar(-N) in GLR parsers): Renamed from "Improper handling of
-	embedded actions and $-N in GLR parsers", work around an Autoconf bug
-	with dollar signs in test names.
-	* tests/input.at (Invalid dollar-n): Renamed from "Invalid \$n",
-	for a similar reason.
-
-2005-01-28  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/vcg.c (output_graph): G_VIEW -> normal_view in case someone
-	wants to redefine G_VIEW.
-
-2005-01-27  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/vcg.c (get_view_str): Remove case for normal_view.
-	Problem reported by twlevo@xs4all.nl.
-
-2005-01-24  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* configure.ac (O0CFLAGS, O0CXXFLAGS): Fix quoting bug.
-	Problem reported by twlevo@xs4all.nl.
-
-	* doc/bison.texinfo: Change @dircategory from "GNU programming
-	tools" to "Software development".  Requested by Richard Stallman
-	via Karl Berry.
-
-2005-01-23  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* tests/c++.at (AT_CHECK_DOXYGEN): Don't use options after operands.
-	Problem reported by twlevo@xs4all.nl.
-
-2005-01-21  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/yacc.c (YYCOPY, yystpcpy, yyparse): Remove "register"
-	keyword; it's not needed with modern compilers, and it doesn't
-	affect correctness with older compilers.  Suggested by
-	twlevo@xs4all.nl.
-
-2005-01-17  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (yyuserAction): Add "default: break;" case to pacify
-	gcc -Wswitch-default.
-	* data/lalr1.cc (yy::]b4_parser_class_name[::parse): Likewise.
-	* data/yacc.c (yyparse): Likewise.
-
-2005-01-12  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/system.h (OUTPUT_EXT, TAB_EXT): Define only if not defined
-	already.  Let config.h define any nonstandard values.
-
-2005-01-10  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* tests/calc.at (_AT_DATA_CALC_Y): Use alarm (100), not alarm (10),
-	for the benefit of slower hosts.  Problem reported by
-	Nelson H. F. Beebe.
-
-2005-01-07  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/yacc.c (yyparse): Pacify non-GCC compilers about yyerrorlab
-	being defined and not used.
-	* data/lalr1.cc (yyparse): Likewise.
-	Use "if (false)" rather than "if (0)".
-
-2005-01-05  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* TODO: Mention that we should allow NUL bytes in tokens.
-
-2005-01-02  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/scan-skel.l (<<EOF>>): Don't close standard output.
-	Problem reported by Hans Aberg.
-
-2005-01-01  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/getargs.c (version): Happy new year; update overall
-	program copyright date from 2004 to 2005.
-
-	* src/scan-skel.l ("@output ".*\n): Don't close standard output.
-	Problem reported by Hans Aberg.
-	* tests/output.at (AT_CHECK_OUTPUT): New arg SHELLIO.
-	(Output file names.): Add a test for the case when standard output
-	is closed.
-
-2004-12-26  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* doc/bison.texinfo (@copying): Update FDL version number to 1.2,
-	to fix an oversight in the Bison 2.0 manual.
-
-2004-12-25  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Version 2.0.  Reformat the existing news items since
-	1.875, so that related items are grouped together.
-	* configure.ac (AC_INIT): Bump version to 2.0.
-	* src/parse-gram.c, src/parse-gram.h: Regenerate with 2.0.
-
-	* tests/torture.at (Exploding the Stack Size with Alloca): Set
-	YYSTACK_USE_ALLOCA to 1 if __GNUC__ or alloca are defined;
-	otherwise, we're not testing alloca.  Unfortunately there's no
-	simple way to consult HAVE_ALLOCA here.
-
-	* data/lalr1.cc (yydestruct_): Pacify unused variable warning
-	for yymsg, too.
-
-	* src/LR0.c (new_itemsets): Use memset rather than zeroing by
-	hand.  This avoids a warning about comparing int to size_t when
-	GCC warnings are enabled.
-
-2004-12-22  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Bison-generated parsers no longer default to using the
-	alloca function (when available) to extend the parser stack, due
-	to widespread problems in unchecked stack-overflow detection.
-	* data/glr.c (YYMAXDEPTH): Remove undef when zero.  It's the user's
-	responsibility to set it to a positive value.  This lets the user
-	specify a value that is not a preprocessor constant.
-	* data/yacc.c (YYMAXDEPTH): Likewise.
-	(YYSTACK_ALLOC): Define only if YYSTACK_USE_ALLOCA is nonzero.
-	* doc/bison.texinfo (Stack Overflow): YYMAXDEPTH no longer needs
-	to be a compile-time constant.  However, explain the constraints on it.
-	Also, explain the constraints on YYINITDEPTH.
-	(Table of Symbols): Explain that alloca is no longer the default.
-	Explain the user's responsibility if they define YYSTACK_USE_ALLOCA
-	to 1.
-
-	* doc/bison.texinfo (Location Default Action): Mention that n must
-	be zero when k is zero.  Suggested by Frank Heckenbach.
-
-2004-12-22  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (parser::token_number_type, parser::rhs_number_type)
-	(parser::state_type, parser::semantic_type, parser::location_type):
-	Private, not public.
-	(parser::parse): Return ints, not bool.
-	Returning a bool introduces a problem: 0 corresponds to false, and
-	it seems weird to return false on success.  Returning true changes
-	the conventions for yyparse.
-	Alternatively we could return void and send an exception.
-	There is no clear consensus (yet?).
-	(state_stack, semantic_stack, location_stack): Rename as...
-	(state_stack_type, semantic_stack_type, location_stack_type): these.
-	Private, not public.
-	* tests/c++.at: New.
-	* tests/testsuite.at, tests/Makefile.am: Adjust.
-
-2004-12-21  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (parser::parse): Return a bool instead of an int.
-
-2004-12-21  Akim Demaille  <akim@epita.fr>
-
-	Don't impose std::string for filenames.
-
-	* data/lalr1.cc (b4_filename_type): New.
-	(position::filename): Use it.
-	(parser.hh): Move the inclusion of stack.hh and location.hh below
-	the user code, so that needed headers for the filename type can be
-	included first.
-	Forward declare them before the user code.
-	* tests/Makefile.am (check-local, installcheck-local): Pass
-	TESTSUITEFLAGS to the TESTSUITE.
-
-2004-12-20  Akim Demaille  <akim@epita.fr>
-
-	Use more STL like names: my_class instead of MyClass.
-
-	* data/lalr1.cc (LocationStack, LocationType, RhsNumberType)
-	(SemanticStack, SemanticType, StateStack, StateType)
-	(TokenNumberType, Stack, Slice, Traits, Parser::location)
-	(Parser::value): Rename as...
-	(location_stack, location_type, rhs_number_type, semantic_stack)
-	(semantic_type, state_stack, state_type, token_number_type, stack)
-	(slice, traits, parser::yylloc, parser::yylval): these.
-
-	* tests/calc.at, tests/regression.at, tests/actions.at: Adjust.
-
-2004-12-19  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (YYLLOC_DEFAULT): Use GNU spacing conventions.
-	* data/yacc.c (YYLLOC_DEFAULT): Likewise.
-
-2004-12-17  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Remove uses of 'short int' and 'unsigned short int'.  This raises
-	some arbitrary limits.  It uses more memory but nowadays that's
-	not much of an issue.
-
-	This change does not affect the generated parsers; that's a different
-	task, as some users will want to conserve memory there.
-
-	Ideally we should use size_t to represent all object counts, and
-	something like ptrdiff_t to represent signed differences of object
-	counts; but that will require more code-cleanup than I have the
-	time to do right now.
-
-	* src/LR0.c (allocate_itemsets, new_itemsets, save_reductions):
-	Use size_t, not int or short int, to count objects.
-	* src/closure.c (nritemset, closure): Likewise.
-	* src/closure.h (nritemset, closure): Likewise.
-	* src/nullable.c (nullable_compute): Likewise.
-	* src/print.c (print_core): Likewise.
-	* src/print_graph.c (print_core): Likewise.
-	* src/state.c (state_compare, state_hash): Likewise.
-	* src/state.h (struct state): Likewise.
-	* src/tables.c (default_goto, goto_actions): Likewise.
-
-	* src/gram.h (rule_number, rule): Use int, not short int.
-	* src/output.c (prepare_rules): Likewise.
-	* src/state.h (state_number, STATE_NUMBER_MAXIMUM, transitions,
-	errs, reductions): Likewise.
-	* src/symtab.h (symbol_number, SYMBOL_NUMBER_MAXIMUM, struct symbol):
-	Likewise.
-	* src/tables.c (vector_number, tally, action_number,
-	ACTION_NUMBER_MINIMUM): Likewise.
-	* src/output.c (muscle_insert_short_int_table): Remove.
-
-2004-12-17  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc: Extensive Doxygenation.
-	(error_): Rename as...
-	(error): this, since it is visible to the user.
-	Adjust callers.
-	(Parser::message): Now an automatic variable from...
-	(Parser::yyreport_syntax_error_): here.
-	* tests/actions.at, tests/calc.at, tests/regression.at: Adjust to
-	Parser::error.
-	* tests/input.at: Escape $.
-
-2004-12-16  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (b4_lhs_value, b4_rhs_value, b4_rhs-location):
-	Parenthesize rhs to avoid obscure problems with mistakes like
-	"foo$$bar = foo$1bar;".  Problem reported by twlevo at xs4all.
-	* data/lalr1.cc (b4_lhs_value, b4_rhs_value, b4_lhs_location,
-	b4_rhs_location): Likewise.
-	* data/yacc.c (b4_lhs_value, b4_rhs_value, b4_lhs_location,
-	b4_rhs_location): Likewise.
-
-2004-12-16  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (yyreport_syntax_error_): Catch up with glr.c and
-	yacc.c: be sure to stay within yycheck_.
-	* tests/actions.at: Re-enable C++ tests.
-
-2004-12-16  Akim Demaille  <akim@epita.fr>
-
-	* src/print_graph.c (print_graph): Remove layoutalgorithm uses for
-	real.
-
-2004-12-16  Akim Demaille  <akim@epita.fr>
-
-	Use #define to handle the %name-prefix.
-
-	* data/glr.c, data/yacc.c: Comment changes.
-	* data/lalr1.cc (yylex): Use #define to select the name of yylex,
-	so that one can refer to yylex in the parser file, and have it
-	renamed, as is the case with other skeletons.
-
-2004-12-16  Akim Demaille  <akim@epita.fr>
-
-	Move lalr1.cc internals into yy*.
-
-	* data/lalr1.cc (semantic_stack_, location_stack_, state_stack_)
-	(semantic_stack_, location_stack_, pact_, pact_ninf_, defact_)
-	(pgoto_, defgoto_, table_, table_ninf_, check_, stos_, r1_, r2_)
-	(name_, rhs_, prhs_, rline_, token_number_, eof_, last_, nnts_)
-	(empty_, final_, terror_, errcode_, ntokens_)
-	(user_token_number_max_, undef_token_, n_, len_, state_, nerrs_)
-	(looka_, ilooka_, error_range_, nerrs_):
-	Rename as...
-	(yysemantic_stack_, yylocation_stack_, yystate_stack_)
-	(yysemantic_stack_, yylocation_stack_, yypact_, yypact_ninf_)
-	(yydefact_, yypgoto_, yydefgoto_, yytable_, yytable_ninf_)
-	(yycheck_, yystos_, yyr1_, yyr2_, yyname_, yyrhs_, yyprhs_)
-	(yyrline_, yytoken_number_, yyeof_, yylast_, yynnts_, yyempty_)
-	(yyfinal_, yyterror_, yyerrcode_, yyntokens_)
-	(yyuser_token_number_max_, yyundef_token_, yyn_, yylen_, yystate_)
-	(yynerrs_, yylooka_, yyilooka_, yyerror_range_, yynerrs_):
-	these.
-
-2004-12-15  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Fix some problems reported by twlevo at xs4all.
-	* src/symtab.c (symbol_new): Report an error if the input grammar
-	contains too many symbols.  This is better than calling abort() later.
-	* src/vcg.h (enum layoutalgorithm): Remove.  All uses removed.
-	(struct node, struct graph):
-	Rename member expand to stretch.  All uses changed.
-	(struct graph): Remove member layoutalgorithm.  All uses removed.
-	* src/vcg.c (get_layoutalgorithm_str): Remove.  All uses removed.
-	* src/vcg_defaults.h (G_STRETCH): Renamed from G_EXPAND.
-	All uses changed.
-	(N_STRETCH): Rename from N_EXPAND.  All uses changed.
-
-2004-12-15  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc: Normalize /** \brief ... */ to ///.
-	Add more Doxygen comments.
-	(symprint_, stack_print_, reduce_print_, destruct_, pop)
-	(report_syntax_error_, translate_): Rename as...
-	(yysymprint_, yystack_print_, yyreduce_print_, yydestruct_)
-	(yypop_, yyreport_syntax_error_, yytranslate_): this.
-
-2004-12-15  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (lex_): Rename as...
-	(yylex_): this.
-	Move the trace here.
-	Take the %name-prefix into account.
-	Reported by Alexandre Duret-Lutz.
-
-2004-12-15  Akim Demaille  <akim@epita.fr>
-
-	Simplify the C++ parser constructor.
-
-	* data/lalr1.cc (debug_): Rename as...
-	(yydebug_): so that the parser's internals are always in the yy*
-	pseudo namespace.
-	Adjust uses.
-	(b4_parse_param_decl): Remove the leading comma as it is now only
-	called as unique argument list.
-	(Parser::Parser): Remove the constructor accepting a location and
-	an initial debugging level.
-	Remove from the other ctor the argument for the debugging level.
-	(debug_level_type, debug_level, set_debug_level): New.
-
-	* tests/actions.at, tests/calc.at, tests/regression.at: Adjust
-	constructor calls.
-
-2004-12-15  Akim Demaille  <akim@epita.fr>
-
-	Remove b4_root related material: failure experiment
-	(which goal was to allow to derive from a class).
-
-	* data/lalr1.cc (b4_root, b4_param, b4_constructor): Remove
-	definitions and uses.
-
-2004-12-14  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (struct yyGLRStack): yyerror_range now has 3 items,
-	not 2, since it's not portable to subtract 1 from the start of an
-	array.  The new item 0 is never set or used.  All uses changed.
-
-	(yyrecoverSyntaxError): Use YYLLOC_DEFAULT instead of assuming
-	the default definition of YYLLOC_DEFAULT.  Problem reported
-	by Frank Heckenbach.
-
-2004-12-12  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (YYRHSLOC): Don't have two definitions, one for
-	the normal case and one for the error case.  Just use the
-	first one uniformly.  Problem reported by Frank Heckenbach.
-	(YYLLOC_DEFAULT): Use the conventions of yacc.c, so we can
-	use exactly the same macro in both places.
-	(yyerror_range): Now of type yyGLRStackItem, not YYLTYPE,
-	so that the normal-case YYRHSLOC works for the error case too.
-	All uses changed.
-	* data/yacc.c (YYRHSLOC): New macro, taken from glr.c.
-	(YYLLOC_DEFAULT): Use the same macro as glr.c.
-	* doc/bison.texinfo (Location Default Action): Don't claim that
-	we have an array of locations.  Use the same macro for both glr
-	and lalr parsers.  Mention YYRHSLOC.  Mention what happens when
-	the index is 0.
-
-2004-12-10  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* HACKING: Update email addresses to send announcements to.
-
-	* configure.ac (AC_INIT): Bump version to 1.875f.
-
-2004-12-10  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Version 1.875e.
-	* src/parse-gram.c, src/parse-gram.h: Regenerate with 1.875e.
-
-	* src/scan-skel.l: Include "complain.h", for "fatal".
-
-	* src/relation.h (relation_print, relation_digraph):
-	Relation sizes are of type relation_node, not size_t (this is
-	merely a doc fix, since the two types are equivalent).
-	(relation_transpose): Relation sizes are of type relation_node,
-	not int.
-	* src/relation.c: Likewise.
-	(top, infinity): Now of type relation_node, not int.
-	(traverse, relation_transpose): Use relation_node, not int.
-
-	* data/glr.c (yyuserAction, yyrecoverSyntaxError): Mark args
-	with ATTRIBUTE_UNUSED if they're not used, to avoid GCC warning.
-	(yyparse): Remove unused local introduced in 2004-10-25 patch.
-
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): New arg
-	specifying whether the test should be skipped.  Use it tp
-	specify that the [%defines %skeleton "lalr1.cc"] tests currently
-	fail on some hosts, and should be skipped.
-
-2004-12-08  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/system.h (CALLOC, MALLOC, REALLOC): Remove.  All callers
-	changed to use xcalloc, xnmalloc, xnrealloc, respectively,
-	unless otherwise specified below.
-
-	* src/LR0.c (allocate_itemsets): Use xnmalloc, not xcalloc,
-	to allocate kernel_base, kernel_items, kernel_size, since
-	they needn't be initialized to 0.
-	(allocate_storgae): Likewise, for shiftset, redset, shift_symbol.
-	* src/closure.c (new_closure): Likewise, for itemset.
-	* src/derives.c (derives_compute): Likewise, for delts, derives, q.
-	* src/lalr.c (set_goto_map): Likewise, for temp_map.
-	(initialize_F): Likewise, for reads, edge, reads[i], includes[i].
-	(build_relations): Likewise for edge, states1, includes.
-	* src/nullable.c (nullable_compute): Likewise, for squeue, relts.
-	* src/reader.c (packgram): Likewise, for ritem, rules.
-	* src/reduce.c (nonterminals_reduce): Likewise for nontermmap.
-	* src/relation.c (relation_digraph): Likewise for VERTICES.
-	(relation_transpose): Likewise for new_R, end_R.
-	* src/symtab.c (symbols_token_translations_init): Likewise for
-	token_translations.
-	* src/tables.c (save_row): Likewise for froms, tos, conflict_tos.
-	(token_actions): Likewise for yydefact, actrow, conflrow,
-	conflict_list.
-	(save_column): Likewise for froms[symno], tos[symno].
-	(goto_actions): Likewise for state_count.
-	(pack_table): Likewise for base, pos, check.
-	(tables_generate): Likewise for width.
-
-	* src/LR0.c (set_states): Don't reuse kernel_size and kernel_base
-	for initial core.  Just have a separate core, so we needn't worry
-	about whether kernel_size and kernel_base are initialized.
-
-	* src/LR0.c (shift_symbol, redset, shiftset, kernel_base,
-	kernel_size, kernel_items): Remove unnecessary initialization.
-	* src/conflicts.c (conflicts): Likewise.
-	* src/derives.c (derives): Likewise.
-	* src/muscle_tablc (muscle_insert): Likewise.
-	* src/relation.c (relation_digraph): Likewise.
-	* src/tables.c (froms, tos, conflict_tos, tally, width, actrow, order,
-	conflrow, conflict_table, conflict_list, table, check):
-	Likewise.
-
-	* src/closure.c (new_closure): Arg is of type unsigned int, not int.
-	This is because all callers pass unsigned int.
-	* src/closure.h (new_closure): Likewise.
-
-	* src/lalr.c (initialize_F): Initialize reads[i] in all cases.
-	(build_relations): Initialize includes[i] in all cases.
-	* src/reader.c (packgram): Always initialize rules[ruleno].prec
-	and rules[ruleno].precsym.  Initialize members in order.
-	* src/relation.c (relation_transpose): Always initialize new_R[i]
-	and end_R[i].
-	* src/table.c (conflict_row): Initialize 0 at end of conflict_list.
-
-	* src/output.c (prepare_actions): Pass 0 instead of conflict_list[0];
-	conflict_list[0] was always 0, but now it isn't initialized.
-
-	* src/table.c (table_grow): When conflict_table grew, the grown
-	area wasn't cleared.  Fix this.
-
-	* lib/.cvsignore: Add strdup.c, strdup.h.
-	* m4/.cvsignore: Add strdup.m4.
-
-2004-12-07  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/lalr.h (GOTO_NUMBER_MAXIMUM): New macro.
-	* src/lalr.c (set_goto_map): Don't allow ngotos to equal
-	GOTO_NUMBER_MAXIMUM, since we occasionally compute
-	ngotos + 1 without checking for overflow.
-	(build_relations): Use END_NODE, not -1, to denote end of edges.
-	* src/lalr.c (set_goto_map, map_goto, initialize_F, add_loopback_edge,
-	build_relations): Use goto_number, not int, for goto numbers.
-	* src/tables.c (save_column, default_goto): Likewise.
-
-2004-11-23  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (YYSTYPE): Define it as is done for C, instead
-	of #defining from yystype.
-	Don't typedef yystype, C++ does not need it.
-	This lets it possible to forward declare it as union.
-
-2004-11-23  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* bootstrap (gnulib_modules): Add extensions.
-	Problem reported by Jim Meyering.
-
-2004-11-22  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/LR0.c, src/closure.c, src/derives.c, src/gram.c,
-	src/lalr.c, src/nullable.c, src/relation.c, src/scan-skel.l,
-	src/system.h, src/tables.c: XFREE -> free, to accommodate
-	recent change to gnulib xalloc.h.
-	Problem reported by Jim Meyering.
-
-2004-11-17  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (symprint_): Use cdebug_ to avoid warnings.
-
-2004-10-28  Akim Demaille  <akim@epita.fr>,
-	    Alexandre Duret-Lutz <adl@gnu.org>
-
-	* data/lalr1.cc (Parser::yycdebug_): New, a pointer, to allow
-	changes.
-	(YYCDEBUG): Adjust.
-	Use it instead of cdebug_.
-	(Parser::debug_stream, Parser::set_debug_stream): New.
-	(Parser::symprint_): Define cdebug_ for temporary backward
-	compatibility.
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Use
-	debug_stream ().
-
-2004-11-17  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (Parser:print_): Remove, use %printer instead.
-	* tests/regression.at (_AT_DATA_DANCER_Y): Adjust.
-	* tests/calc.at (_AT_DATA_CALC_Y): Ditto.
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Likewise.
-
-2004-10-27  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (yyloc_default): Remove; not used.
-	Problem reported by Frank Heckenbach.
-
-2004-10-25  Akim Demaille  <akim@epita.fr>
-
-	* data/glr.c (YYRHSLOC): Move its definition next to its uses.
-	Introduce another definition to address simple location arrays.
-	(yyGLRStack): New member: yyerror_range.
-	(yyrecoverSyntaxError, yyparse): Update it.
-	(yyrecoverSyntaxError): Use it when shifting the error token to
-	have an accurate range, equivalent to the one computed by both
-	yacc.c and lalr1.cc.
-	* tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Change its yylex so
-	that column numbers start at column 0, as per GNU Coding
-	Standards, the others tests, and the doc.
-	(_AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_AMBIG_GLR_OUTPUT_WITH_LOC):
-	Adjust to the above change (first column is 0).
-	And adjust the location of the "<error>", now covering the whole
-	line.
-
-2004-10-22  Akim Demaille  <akim@epita.fr>
-	and Paul Eggert  <eggert@cs.ucla.edu>
-
-	Remove some arbitrary limits on goto numbers and relations.
-	* src/lalr.c (goto_map, ngotos, from_state, to_state): Omit
-	initial values, since they're never used.
-	(set_goto_map): ngotos is now unsigned, so test for overflow
-	by seeing whether it wraps around to zero.
-	* src/lalr.h (goto_number): Now size_t, not short int.
-	(GOTO_NUMBER_MAXIMUM): Remove.
-	* src/relation.c (relation_print, traverse, relation_transpose):
-	Check for END_NODE rather than looking at sign.
-	* src/relation.h (END_NODE): New macro.
-	(relation_node): Now size_t, not short int.
-
-2004-10-22  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* doc/bison.texinfo (Language and Grammar): In example, "int" is a
-	keyword, not an identifier.  Problem reported by Baron Schwartz in
-	<http://lists.gnu.org/archive/html/bug-bison/2004-10/msg00017.html>.
-
-2004-10-11  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.c (symbol_check_alias_consistency): Also check
-	type names, destructors, and printers.
-	Reported by Alexandre Duret-Lutz.
-	Recode the handling of associativity and precedence in terms
-	of symbol_precedence_set.
-	Accept no redeclaration at all, not even equal to the previous
-	value.
-	(redeclaration): New.
-	Use it to factor redeclaration complaints.
-	(symbol_make_alias): Don't set the type of the alias, let
-	symbol_check_alias_consistency do it as for other features.
-	* src/symtab.h (symbol): Add new member prec_location, and
-	type_location.
-	* src/symtab.c (symbol_precedence_set, symbol_type_set): Set them.
-	* tests/input.at (Incompatible Aliases): New.
-
-2004-10-09  Paul Eggert  <eggert@cs.ucla.edu>
-
-	.cvsignore fixes to accommodate gnulib changes,
-	and the practice of naming build directories "_build".
-	* .cvsignore: Add "_*".  Sort.
-	* lib/.cvsignore: Add getopt_.h, xalloc-die.c.
-	* m4/.cvsignore: Add "*_gl.m4".
-
-2004-10-06  Akim Demaille  <akim@epita.fr>
-
-	* src/parse-gram.y (add_param): Fix the truncation of trailing
-	spaces.
-
-2004-10-05  Akim Demaille  <akim@epita.fr>
-
-	In Bison 1.875's yacc.c, YYLLOC_DEFAULT was called regardless
-	whether the reducion was empty or not.  This leaves room to
-	improve the use of YYLLOC_DEFAULT in such a case.
-	lalr1.cc is still experimental, so changing this is acceptable.
-	And finally, there are probably not many users who changed the
-	handling of locations in GLR, so changing is admissible too.
-
-	* data/glr.c, data/lalr1.cc, data/yacc.c (YYLLOC_DEFAULT): On an
-	empty reduction, set @$ to an empty location ending the previously
-	stacked symbol.
-	Adjust uses to make sure the code is triggered on empty
-	reductions.
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Adjust the
-	expected output: empty reductions have empty locations.
-
-2004-09-29  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc: Move towards a more standard C++ coding style
-	for templates: Class < T > -> Class<T>.
-
-2004-09-29  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc: Reinstall the former ctor, for sake of
-	compatibility, but warn it will be removed.
-	Move towards a more standard C++ coding style (i.e., type *var ->
-	type* var).
-
-2004-09-27  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/parse-gram.y (add_param): Rewrite to avoid strchr,
-	since it's less likely to work if NULs are involved in the future.
-
-2004-09-27  Akim Demaille  <akim@epita.fr>
-
-	* data/yacc.c (YY_LOCATION_PRINT): Fix its default declaration.
-
-2004-09-27  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (b4_parse_param_decl_1): New.
-	(b4_parse_param_decl): Use it to have different names between attribute
-	and argument names.
-	(b4_cc_constructor_call): Likewise.
-
-2004-09-24  Akim Demaille  <akim@epita.fr>
-
-	* src/parse-gram.y (add_param): Strip the leading and trailing
-	blanks from a formal argument declaration.
-	(YY_LOCATION_PRINT): New.
-
-2004-09-24  Akim Demaille  <akim@epita.fr>
-
-	* data/c.m4 (b4_yysymprint_generate): Move the YYINPUT invocation
-	after the location.
-
-2004-09-24  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (Table of Symbols): Sort.
-
-2004-09-21  Akim Demaille  <akim@epita.fr>
-
-	* data/yacc.c, data/glr.c (b4_at_dollar, b4_dollar_dollar): Remove
-	the useless parentheses.
-	Suggested by Paul Eggert.
-
-2004-09-20  Akim Demaille  <akim@epita.fr>
-
-	Let the initial-action act on the look-ahead, and use it for the
-	"initial push" (corresponding to an hypothetical beginning-of-file).
-	And let lalr1.cc honor %initial-action.
-
-	* doc/bison.texinfo (Initial Action Decl): Clarify, and add an
-	example.
-	* data/lalr1.cc (Parser::initlocation_): Remove, bad experiment.
-	(Parser::Parser): Remove the ctor that used to initialize it.
-	(Parser::parse): Like in the other skeletons, issue the "starting
-	parse" message before any action.
-	Honor %initial-action.
-	Initialize the stacks with the lookahead.
-	* data/yacc.c: Let $$ and @$ in %initial-action designate the
-	look-ahead.
-	Push them in the stacks.
-	* tests/actions.at, tests/calc.at: Adjust the C++ ctor invocations.
-
-2004-09-20  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (Initial Action Decl): New.
-
-2004-09-20  Akim Demaille  <akim@epita.fr>
-
-	* data/yacc.c (YY_LOCATION_PRINT): Use YYLTYPE_IS_TRIVIAL as a
-	clearer criterion to define it.
-	(parse): Initialize the initial location when YYLTYPE_IS_TRIVIAL.
-	When reducing on an empty RHS, use the latest stacked location as
-	location.
-	yylloc is not always available.
-	* data/glr.c: Likewise.
-	Also, honor initial-actions.
-
-2004-09-20  Akim Demaille  <akim@epita.fr>
-
-	* data/yacc.c (YY_LOCATION_PRINT): New.
-	Define when we know YYLTYPE's structure, i.e., when the default
-	YYLLOC_DEFAULT is used.
-	* data/c.m4 (b4_yysymprint_generate): Use it.
-	* data/lalr1.cc (YYLLOC_DEFAULT): Stop relying on the initial
-	value of the result.
-	(error_start_): Replace with...
-	(error_range_): this location array.
-	This allows to replace code relying on the implementation of
-	locations by portable code.
-	* data/yacc.c (yylerrsp): Replace with...
-	(yyerror_range): this.
-	Every time a token is popped, update yyerror_range[0], to have an
-	accurate location for the error token.
-	* data/glr.c (YY_LOCATION_PRINT): New.
-	(yyprocessOneStack): Fix an invocation of YY_SYMBOL_PRINT:
-	deference a pointer.
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): No longer
-	report the location in %printers.
-
-	* src/scan-skel.l: Instead of abort, report error messages to ease
-	understanding skeleton scanning failures.
-
-2004-09-16  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (Stack::Iterator, Stack::ConstIterator): Rename as...
-	(iterator, const_iterator): these, to be more in the C++ spirit.
-	Also, return reverse iterators so that when displaying the stack
-	we display its bottom first.
-	(Parser::stack_print_, Parser::reduce_print_): Match the messages
-	from yacc.c.
-	We should probably use vector here though.
-
-2004-09-16  Akim Demaille  <akim@epita.fr>
-
-	Have more complete shift traces.
-
-	* data/yacc.c, data/lalr1.c, data/glr.c: Use YY_SYMBOL_PRINT
-	to report Shifts instead of ad hoc YYDPRINTF invocations,
-	including for the error token.
-	* data/lalr1.cc (symprint_): Output the location.
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): In C++, don't
-	output the location within the %printer.
-	Activate GLR tests, at least to make sure they compile properly.
-	They still don't pass though.
-	* tests/calc.at: Adjust expect verbose output, since now "Entering
-	state..." is on a different line than the "Shifting" message.
-
-2004-09-08  Akim Demaille  <akim@epita.fr>
-
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Move the
-	Bison directive from the Bison file to the invocation of this
-	macro, so that these directives are passed to
-	AT_BISON_OPTION_PUSHDEFS to get correct help macros.
-	Use these helping macros (e.g., AT_LOC, AT_VAL and so forth).
-	Move the AT_SETUP/AT_CLEANUP outside, to report as test title
-	the extra Bison directives instead of the whole series.
-	Change the grammar so that there are recoverable errors, and
-	unrecoverable errors.  Now we can have the parser give up before
-	consuming the whole input.  As a result we now can observe that
-	the lookahead is freed when needed.
-	Change the parser source to parse argv[1] instead of a hard coded
-	string.
-	Simplify yylex, and give a value and location to EOF.
-	Simplify some invocations of AT_CHECK_PRINTER_AND_DESTRUCTOR that
-	passed directives already coded in the file.
-	Add some tests to check the location of "error".
-	For some tests, the C++ parser is correct, and not yacc.c.
-	For other tests, they provide different, but unsatisfying, values,
-	so keep the C++ value so that at least one parser is "correct"
-	according to the test suite.
-	(Actions after errors): Remove, this is subsumed by the
-	AT_CHECK_PRINTER_AND_DESTRUCTOR series.
-
-2004-09-06  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc: Adjust the indentation of the labels.
-	(Parser::pop): New.
-	Use it.
-
-2004-09-06  Akim Demaille  <akim@epita.fr>
-
-	* data/yacc.cc, data/glr.cc (yydestruct): Accept an additional
-	argument, an informative message.
-	Call YY_SYMBOL_PRINT.
-	Adjust all callers: integrate the associated YY_SYMBOL_PRINT.
-	* data/lalr1.cc (destruct_): Likewise.
-	In addition, no longer depend on b4_yysymprint_generate and
-	b4_yydestruct_generate to generate these functions, do it "by
-	hand".
-
-2004-09-03  Akim Demaille  <akim@epita.fr>
-
-	* data/glr.c, data/lalr1.cc, data/yacc.c: When YYABORT was
-	invoked, yydestruct the lookahead.
-	* tests/calc.at (Calculator $1): Update the expected lengths of
-	traces: there is an added line for the discarded lookahead.
-	* doc/bison.texinfo (Destructor Decl): Some rewording.
-	Define "discarded" symbols.
-
-2004-09-02  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (translate_, destruct_): No reason to be static.
-
-2004-09-02  Akim Demaille  <akim@epita.fr>
-
-	* data/glr.c, yacc.c (YYDSYMPRINT): Remove, not used.
-	(YYDSYMPRINTF): Rename as...
-	(YY_SYMBOL_PRINT): this.
-	* data/lalr1.cc (YY_SYMBOL_PRINT): New, modeled after the previous
-	two.
-	Use it instead of direct symprint_ calls.
-	(yybackup): Tweak the "Now at end of input" case to match yacc.c's
-	one.
-
-2004-09-02  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (b4_yysymprint_generate): New.
-	(symprint_): New member function, defined when YYDEBUG.
-	Use it consistently instead of token/nterm debugging output by
-	hand.
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Adjust
-	%printer calls to use cdebug_ when using lalr1.cc.
-
-2004-08-30  Florian Krohm  <florian@edamail.fishkill.ibm.com>
-
-	* data/glr.c: Guard the declarations of yypstack and yypdumpstack
-	with #ifdef YYDEBUG.
-
-2004-08-26  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (Implementing Loops): Rename as...
-	(Implementing Gotos/Loops): this.
-
-2004-08-13  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Adjust to latest gnulib.
-	* bootstrap (gnulib_modules): Add xalloc-die.
-	Set LC_ALL=C so that file names sort consistently.
-	Prefer the gnulib copies of gettext.m4, glibc21.m4,
-	inttypes_h.m4, lib-ld.m4, lib-prefix.m4, po.m4, stdint_h.m4,
-	uintmax_t.m4, ulonglong.m4.
-	(intl_files_to_remove): Add gettext.m4, lib-ld.m4, lib-prefix.m4,
-	po.m4 since we are now using _gl.m4 instead.
-
-2004-08-10  Florian Krohm  <florian@edamail.fishkill.ibm.com>
-
-	* src/scan-action.l: Remove. Scanning of semantic actions is
-	handled in scan-gram.l.
-
-2004-08-07  Florian Krohm  <florian@edamail.fishkill.ibm.com>
-
-	* src/scan-gram.l (handle_syncline): Use uniqstr_new not xstrdup.
-
-	* src/location.h (struct): The file member is a uniqstr.
-	(equal_boundaries): Use UNIQSTR_EQ for comparison.
-
-2004-07-22  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Fix bug with non-%union parsers that have printers or destructors,
-	which led to a Bison core dump.  Reported by Peter Fales in
-	<http://lists.gnu.org/archive/html/bug-bison/2004-07/msg00014.html>.
-
-	* data/c.m4 (b4_symbol_actions): Don't assume %union was used.
-	* data/lalr1.cc (yystype) [defined YYSTYPE]: Define to YYSTYPE,
-	not to our own type.
-	* src/output.c (symbol_destructors_output, symbol_printers_output):
-	Don't assume %union.
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR,
-	AT_CHECK_PRINTER_AND_DESTRUCTOR): New argument
-	UNION-FLAG.  All callers changed.
-	(_AT_CHECK_PRINTER_AND_DESTRUCTOR): Don't assume %union.
-	Use type char, not unsigned int, when declaring an array of char;
-	this lets us remove a cast.
-	(Printers and Destructors): Add non-%union test cases.
-
-2004-06-21  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* doc/bison.texinfo: Minor editorial changes, mostly to the new
-	GLR writeups.  E.g., avoid frenchspacing and the future tense,
-	change "lookahead" to "look-ahead", and change "wrt" to "with
-	respect to".
-
-2004-06-21  Paul Hilfinger  <hilfingr@CS.Berkeley.EDU>
-
-	* doc/bison.texinfo (Merging GLR Parses, Compiler Requirements):
-	New sections, split off from the GLR Parsers section.  Put the new
-	Simple GLR Parser near the start of the GLR section, for clarity.
-	Rewrite connective text.
-
-2004-06-21  Frank Heckenbach  <frank@g-n-u.de>
-
-	* doc/bison.texinfo (Simple GLR Parsers): New section.
-
-2004-06-21  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS, TODO, doc/bison.texinfo:
-	Use "look-ahead" instead of "lookahead", to be consistent.
-	* REFERENCES: Fix incorrect reference to DeRemer and Pennello,
-	while we're fixing "look-ahead".
-	* src/conflicts.c (shift_set): Renamed from shiftset.
-	(look_ahead_set): Renamed from lookaheadset.
-	* src/print.c: Likewise.
-	* src/getargs.c (report_args): Add "look-ahead" as the new canonical
-	name for "lookahead".
-	(report_types, usage): Likewise.
-	* src/getargs.h (report_look_ahead_tokens): Renamed from
-	report_lookaheads.
-	* src/lalr.c (compute_look_ahead_tokens): Renamed from
-	compute_lookaheads.
-	(state_look_ahead_tokens_count): Renamed from state_lookaheads_count.
-	(look_ahead_tokens_print): Renamed from lookaheads_print.
-	* src/state.c (state_rule_look_ahead_tokens_print): Renamed from
-	state_rule_lookaheads_print.
-	* src/state.h: Likewise.
-	(reductions.look_ahead_tokens): Renamed from lookaheads.
-	* tests/torture.at (AT_DATA_LOOK_AHEAD_TOKENS_GRAMMAR): Renamed from
-	AT_DATA_LOOKAHEADS_GRAMMAR.
-
-2004-06-03  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* README: Update location of patched M4 distribution.
-
-2004-05-30  Albert Chin-A-Young  <china@thewrittenword.com>
-
-	Don't assume the C++ compiler takes the same arguments as the C compiler
-	(trivial change).
-	* configure.ac (O0CXXFLAGS): New var.
-	* tests/atlocal.in (CXXFLAGS): Use it.
-
-2004-05-29  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Fix some "make check" problems with C++ reported by
-	Albert Chin-A-Young for Tru64 C++ in this thread:
-	http://lists.gnu.org/archive/html/bug-bison/2004-05/msg00049.html
-
-	* m4/cxx.m4 (BISON_TEST_FOR_WORKING_CXX_COMPILER): Check for std::cerr.
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR):
-	Output to a .cc file for C++, not to a .c file.
-	* tests/calc.at (AT_CHECK_CALC): Likewise.
-	* tests/regression.at (AT_CHECK_DANCER): Likewise.
-	* tests/local.at (AT_COMPILE_CXX): Default to OUTPUT.cc, not OUTPUT.c.
-
-2004-05-28  Albert Chin-A-Young  <china@thewrittenword.com>
-
-	* tests/calc.at, tests/actions.at: Workaround for SGI
-	C++ compiler.  (trivial change)
-
-2004-05-27  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Spent a few hours checking out which prerequisite versions the
-	current sources actually require.  I went all the way back to
-	Gettext 0.10.40, Automake 1.4, and Autoconf 2.57 and investigated
-	a seemingly endless set of combinations of versions more recent
-	than that.  The bottom line is that the current sources require
-	fairly recent versions of the build tools, and it'll be some work
-	to change this.
-	* configure.ac (AC_PREREQ): Increase from 2.58 to 2.59.
-	(AM_INIT_AUTOMAKE): Increase from 1.7 to 1.8.
-	(AM_GNU_GETTEXT_VERSION): Increase from 0.11.5 to 0.12.
-	Add comments explaining why those particular versions are
-	currently needed.
-
-	* src/parse-gram.y (lloc_default): Rewrite to avoid compiler bug
-	in SGI MIPSpro 7.4.1m.  Problem reported by Albert Chin-A-Young in
-	<http://lists.gnu.org/archive/html/bug-bison/2004-05/msg00037.html>.
-
-	* configure.ac (AC_PREREQ): Bump to 2.58, since 2.57 doesn't work
-	(it fails with a Autoconf-without-aclocal-m4 diagnostic).
-
-2004-05-26  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* configure.ac (AM_GNU_GETTEXT_VERSION): Lower it from 0.14.1 to
-	0.11.5.  Suggested by Bruno Haible.
-	* bootstrap: Remove gettext version checking.
-
-	* doc/bison.texinfo (Decl Summary): Also mention that %union
-	can depend on prerequisite types.  Problem reported by Tim
-	Van Holder.
-
-2004-05-25  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* README: Mention GNU m4 1.4 bugs and Akim's patched version.
-	* README-alpha: Don't tell people not to package this.
-
-	* bootstrap: Don't assume $(...) works; use `...` instead.
-	Problem reported by Paul Hilfinger.  Also, diagnose non-GNU
-	gettext better.
-
-	* doc/bison.texinfo (Decl Summary, Bison Options): Clarify what's
-	put into the -d output file, and mention what to do if YYSTYPE is
-	defined as a macro.
-
-2004-05-24  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Undo change made earlier today: it caused autopoint to not bring
-	in ABOUT-NLS.  Ouch.  Instead, substitute our own diagnostic for
-	autopoint's.
-
-	* bootstrap: Check that gettext version matches what's in
-	configure.ac.  Warn users to ignore robots.txt ERROR 404.
-	* bootstrap: Undo today's earlier change (logged below).
-	* configure.ac (AM_GNU_GETTEXT_VERSION): Likewise.
-
-	The gettext version checking is causing more trouble than it's
-	curing; remove it.  Problem reported by Paul Hilfinger.
-
-	* bootstrap: Issue a warning that one can expect a message
-	'AM_GNU_GETTEXT is used, but not AM_GNU_GETTEXT_VERSION'.
-	* configure.ac (AM_GNU_GETTEXT_VERSION): Remove.
-
-2004-05-23  Paul Eggert  <eggert@cs.ucla.edu>
-
-	Ensure that the C++ compiler used for testing actually works on a
-	simple test program; if not, skip the C++-related tests.  Problem
-	reported by Vin Shelton in:
-	http://lists.gnu.org/archive/html/bug-bison/2004-05/msg00026.html
-
-	* m4/cxx.m4: New file.
-	* configure.ac (BISON_TEST_FOR_WORKING_CXX_COMPILER): Add.
-	* tests/atlocal.in (BISON_CXX_WORKS): Add.
-	* tests/local.at (AT_COMPILE_CXX): Use it.
-
-2004-05-21  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* data/glr.c (yylloc): Output this macro even if locations are not
-	being generated, as the GLR parser needs it even in that case.
-	Problem reported by Troy A. Johnson
-	<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=195946>.
-
-	* configure.ac (AC_INIT): Update to 1.875e.
-
-2004-05-21  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Version 1.875d.
-	* configure.ac (AC_INIT): Likewise.
-	* src/parse-gram.c, src/parse-gram.h: Regenerate with 1.875d.
-
-	* configure.ac (--enable-gcc-warnings): Do not enable -Wshadow,
-	-Wmissing-prototypes, or -Wstrict-prototypes for C++.  The current
-	lalr1.cc runs afoul of the first, and the last two are no longer
-	supported by GCC 3.4.0.
-	* README: Mention GNU m4 1.4 or later; mention m4 patches.
-	* HACKING: Use ./bootstrap, not "make update" to import foreign files.
-
-2004-05-06  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* src/muscle_tab.c (hash_muscle): Accept and return size_t, not
-	unsigned int, for compatibility with latest gnulib hash module.
-	* src/state.c (state_hash, state_hasher): Likewise.
-	* src/symtab.c (hash_symbol, hash_symbol_hasher): Likewise.
-	* src/uniqstr.c (hash_uniqstr): Likewise.
-
-2004-05-03  Paul Eggert  <eggert@cs.ucla.edu>
-
-	* NEWS: Unescaped newlines are no longer allowed in char & strings.
-
-	* src/scan-gram.l (<SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER,
-	SC_CHARACTER,SC_STRING>): Reject unescaped newlines in
-	character and string literals.
-	(unexpected_end): New function.
-	(unexpected_eof): Use it.
-	(unexpected_newline): New function.
-	(<INITIAL,SC_AFTER_IDENTIFIER,SC_PRE_CODE>): Coalesce duplicate
-	actions.
-
-	* NEWS: Document %expect-rr.
-
-	* bootstrap (--gnulib-srcdir=*, --cvs-user=*):
-	Fix typo by replacing $1 with $option.
-	Remove more 'intl'-related files.
-	Don't DEFUN AM_INTL_SUBDIR twice.
-
-	* lib/.cvsignore: Add strndup.h.  Remove memchr.c, memcmp.c,
-	memrchr.c, strcasecmp.c, strchr.c, strrchr.c, strspn.c, strtol.c,
-	strtoul.c.
-	* m4/.cvsignore: Add exitfail.m4, extensions.m4, gnulib.m4,
-	hard-locale.m4, mbstate_t.m4, strerror_r.m4, strndup.m4,
-	xstrndup.m4.  Remove glibc21.m4, intdiv0.m4, inttypes-pri.m4,
-	inttypes.m4, inttypes_h.m4, isc-posix.m4, lcmessage.m4,
-	stdint_h.m4, uintmax_t.m4, ulonglong.m4.
-	* src/.cvsignore: Add *.output.
-
-	* src/parse-gram.y: Put copyright notice inside %{ %} so it
-	gets copied to the output file.
-
-2004-04-28  Paul Eggert  <eggert@twinsun.com>
-
-	Get files from the gnulib and po repositories, instead of relying
-	on them being in our CVS.  Upgrade to latest versions of gnulib
-	and Automake.
-
-	* Makefile.am (SUBDIRS): Remove m4; Automake now does m4.
-	* bootstrap: Bootstrap from gnulib and po repositories.
-	Much of this code was stolen from GNU diff and GNU tar's bootstrap.
-	* README-cvs: Document these changes.  Remove version numbers from
-	mentions of build tools, since they change so often.  Mention Flex.
-
-	* configure.ac (AC_CONFIG_MACRO_DIR): Add, with m4 as arg.
-	(gl_USE_SYSTEM_EXTENSIONS): Add.
-	(AC_GNU_SOURCE, AC_AIX, AC_MINIX):
-	Remove; no longer needed, as gl_USE_SYSTEM_EXTENSIONS
-	does this for us.
-	(AC_ISC_POSIX): Remove; we no longer support this
-	ancient OS, as it gets in the way of latest Autoconf & gnulib.
-	(AC_HEADER_STDC): Remove: we now assume C89 or better.
-	(AC_CHECK_HEADERS_ONCE): Use instead of AC_CHECK_HEADERS.
-	Do not check for C89 headers, except for locale.h which is used
-	by the Yacc library and must port to K&R hosts.
-	(AC_CHECK_FUNCS_ONCE): Use instead of AC_CHECK_FUNCS.
-	Do not check for C89 functions, except for setlocale which is
-	used by the Yacc library.
-	(AC_CHECK_DECLS, AC_REPLACE_FUNCS): Remove; no longer needed.
-	(gl_DIRNAME, gl_ERROR, gl_FUNC_ALLOCA, gl_FUNC_MEMCHR,
-	gl_FUNC_MEMRCHR, gl_FUNC_STPCPY, gl_FUNC_STRNLEN, gl_FUNC_STRTOL,
-	gl_GETOPT, gl_HASH, gl_MBSWIDTH, gl_OBSTACK, gl_QUOTE,
-	gl_QUOTEARG, gl_XALLOC, jm_FUNC_GLIBC_UNLOCKED_IO, jm_FUNC_MALLOC,
-	AM_GNU_GETTEXT): Remove; now done by:
-	(GNULIB_AUTOCONF_SNIPPET): Add.  "bootstrap" builds this for us.
-	(AC_CONFIG_FILES): Remove m4/Makefile, as Automake now does this
-	for us.
-
-	* lib/Makefile.am: Include gnulib.mk, built for us by "bootstrap".
-	(BUILT_SOURCES, EXTRA_DIST, MOSTLYCLEANFILES):
-	Define to empty, as gnulib.mk will do the rest for us.
-	($(libbison_a_OBJECTS), stdbool.h): Remove, as gnulib.mk does this
-	for us.
-	(libbison_a_SOURCES): Define to $(lib_SOURCES) now.
-	(lib_SOURCES): New symbol, containing only the non-gnulib libs.
-
-	* src/files.c: Include gnulib's xstrndup.h.
-
-	* src/system.h (MALLOC): Use xnmalloc, for better overflow checking.
-	(REALLOC): Use xnrealloc, for likewise.
-	(xstrndup, stpcpy): Remove decls, as gnulib does this for us now.
-	(strnlen, memrchr): Remove decls; functions no longer used.
-	Include <stpcpy.h>.
-
-	* config/depcomp, config/install-sh, lib/alloca.c, lib/argmatch.c,
-	lib/argmatch.h, lib/basename.c, lib/dirname.c, lib/dirname.h,
-	lib/error.c, lib/error.h, lib/getopt.c, lib/getopt.h,
-	lib/getopt1.c, lib/gettext.h, lib/hash.c, lib/hash.h,
-	lib/malloc.c, lib/mbswidth.c, lib/mbswidth.h, lib/memchr.c,
-	lib/memcmp.c, lib/memrchr.c, lib/obstack.c, lib/obstack.h,
-	lib/quote.c, lib/quote.h, lib/quotearg.c, lib/quotearg.h,
-	lib/realloc.c, lib/stdbool_.h, lib/stpcpy.c, lib/strcasecmp.c,
-	lib/strchr.c, lib/strncasecmp.c, lib/strnlen.c, lib/strrchr.c,
-	lib/strspn.c, lib/strtol.c, lib/strtoul.c, lib/unlocked-io.h,
-	lib/xalloc.h, lib/xmalloc.c, lib/xstrdup.c, lib/xstrndup.c,
-	m4/Makefile.am, m4/alloca.m4, m4/dirname.m4, m4/dos.m4,
-	m4/error.m4, m4/getopt.m4, m4/hash.m4, m4/malloc.m4,
-	m4/mbrtowc.m4, m4/mbswidth.m4, m4/memchr.m4, m4/memcmp.m4,
-	m4/memrchr.m4, m4/obstack.m4, m4/onceonly.m4, m4/prereq.m4,
-	m4/quote.m4, m4/quotearg.m4, m4/realloc.m4, m4/stdbool.m4,
-	m4/stpcpy.m4, m4/strnlen.m4, m4/strtol.m4, m4/strtoul.m4,
-	m4/unlocked-io.m4, m4/xalloc.m4, po/LINGUAS, po/Makefile.in.in,
-	po/Makevars, po/da.po, po/de.po, po/es.po, po/et.po, po/fr.po,
-	po/hr.po, po/id.po, po/it.po, po/ja.po, po/ms.po, po/nl.po,
-	po/pt_BR.po, po/ro.po, po/ru.po, po/sv.po, po/tr.po:
-	Remove, as these files are now generated automatically
-	by bootstrap or automake.
-
-	* po/ChangeLog: Remove: all but one entry was a duplicate
-	of this file, and I moved that 2000-11-02 entry here.
-
-	* config/.cvsignore: Add Makefile, depcomp, install-sh.
-	* lib/.cvsignore: Add alloca.c, alloca.h, alloca_.h, argmatch.c,
-	argmatch.h, basename.c, dirname.c, dirname.h, error.c, error.h,
-	exit.h, exitfail.c, exitfail.h, getopt.c, getopt.h, getopt1.c,
-	getopt_int.h, gettext.h, gnulib.mk, hard-locale.c, hard-locale.h,
-	hash.c, hash.h, malloc.c, mbswidth.c, mbswidth.h, memchr.c,
-	memcmp.c, memrchr.c, obstack.c, obstack.h, quote.c, quote.h,
-	quotearg.c, quotearg.h, realloc.c, stdbool_.h, stpcpy.c, stpcpy.h,
-	strcasecmp.c, strchr.c, stripslash.c, strncasecmp.c, strndup.c,
-	strnlen.c, strrchr.c, strspn.c, strtol.c, strtoul.c,
-	unlocked-io.h, xalloc.h, xmalloc.c, xstrdup.c, xstrndup.c,
-	xstrndup.h.
-	* m4/.cvsignore: Remove Makefile, Makefile.in.  Add alloca.m4,
-	dirname.m4, dos.m4, error.m4, getopt.m4, hash.m4, mbrtowc.m4,
-	mbswidth.m4, obstack.m4, onceonly.m4, quote.m4, quotearg.m4,
-	stdbool.m4, stpcpy.m4, strnlen.m4, unlocked-io.m4, xalloc.m4.
-	* po/.cvsignore: Add *.po, LINGUAS, Makefile.in.in, Makevars.
-	* src/.cvsignore: Remove *_.c.
-
-
-	* Makefile.maint (GZIP_ENV): Don't use --rsyncable if gzip doesn't
-	support it.  (The latest stable gzip doesn't.)
-
-2004-04-27  Paul Eggert  <eggert@twinsun.com>
-
-	* data/lalr1.cc (Parser::stos_) [! YYDEBUG]: Define even in this
-	case, as stos_ is now used by destructors due to the 2004-02-09
-	change.
-
-	Remove more K&R C support.
-	* lib/libiberty.y (PARAMS): Remove.  All uses removed.
-	* lib/subpipe.c (errno): Remove decl.
-	Include <stdlib.h> unconditionally.
-	(EXIT_FAILURE): Remove macro.
-	* src/complain.c (vfprintf, strerror): Remove.
-	* src/system.h: Include limits.h, stdlib.h, string.h, locale.h
-	unconditionally.
-	(EXIT_FAILURE, EXIT_SUCCESS, setlocale): Remove defns.
-	Use latest Autoconf recommendations for including inttypes.h, stdint.h.
-	(strchr, strspn, memchr): Remove decls.
-	* tests/calc.at (_AT_DATA_CALC_Y): Include stdlib.h, string.h
-	unconditionally.  Do not declare perror.
-	* tests/conflicts.at (%nonassoc and eof): Include stdlib.h
-	unconditionally.
-
-	* src/complain.c (_): Remove useless defn, as system.h defines this.
-
-	* lib/bitset.h (__INT_TO_PTR): Remove; workaround no longer needed
-	with latest obstack.h.
-	* lib/ebitset.c (ebitset_elt_alloc): Don't bother to cast args
-	to procedure types, as obstack.h now does that for us.
-	* lib/lbitset.c (lbitset_elt_alloc): Likewise.
-
-	* lib/subpipe.h [HAVE_SYS_TYPES_H]: Include <sys/types.h>,
-	so that this include file can stand alone.
-	* lib/subpipe.c: Do not include <sys/types.h>, as subpipe.h
-	does this now.  Include subpipe.h first after config.h, to
-	test whether it can stand alone.
-
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Don't
-	declare yyerror when using lalr.cc, as GCC 3.4.0 warns about the
-	unused declaration.
-
-	* tests/synclines.at (%union synch line): Put a dummy member in
-	the union, because empty unions aren't allowed in C.  Caught
-	by GCC 3.4.0.
-
-2004-04-13  Jim Meyering  <jim@meyering.net>
-
-	* src/conflicts.c (conflicts_print): Correct format string typo:
-	use `%%' to produce literal `%'.  (trivial change)
-
-2004-03-30  Paul Eggert  <eggert@twinsun.com>
-
-	* src/getargs.c (version): Update copyright year to 2004.
-
-	* data/c.m4 (b4_int_type): Use 'short int' rather than
-	'short', and similarly for 'long', 'unsigned', etc.
-	* data/glr.c (YYTRANSLATE, yyconfl, yySymbol, yyItemNum,
-	yygetLRActions, yyprocessOneStack, yyrecoverSyntaxError,
-	yy_yypstack, yydumpstack): Likewise.
-	* data/lalr1.cc (user_token_number_max_, user_token_number_max_,
-	translate_, seq_, [], pop, Slice, range_, operator+, operator+=):
-	Likewise.
-	* data/yacc.c (b4_int_type, yyss, YYSTACK_BYTES, yysigned_char,
-	yy_stack_print, yyparse): Likewise.
-	* doc/bison.texinfo (Prologue, Multiple Types): Likewise.
-	* lib/bbitset.h (bitset_word, BITSET_WORD_BITS): Likewise.
-	* lib/bitset.c (bitset_print): Likewise.
-	* lib/bitset_stats.c (bitste_log_histogram_print): Likewise.
-	* lib/bitsetv-print.c (bitsetv_matrix_dump): Likewise.
-	* lib/bitsetv.c (bitsetv_dump): Likewise.
-	* lib/ebitset.c (EBITSET_ELT_BITS, ebitset_elt_alloc): Likewise.
-	* lib/lbitset.c (LBITSET_ELT_BITS, lbitset_elt_alloc, debug_lbitset):
-	Likewise.
-	* src/LR0.c (allocate_itemsets): Likewise.
-	* src/gram.h (rule_number, rule): Likewise.
-	* src/lalr.h (goto_number): Likewise.
-	* src/nullable.c (nullable_compute): Likewise.
-	* src/output.c (prepare_rules): Likewise.
-	* src/relation.c (relation_print, relation_digraph): Likewise.
-	* src/relation.h (relation_node): Likewise.
-	* src/state.h (state_number, transitions, errs, reductions,
-	struct state): Likewise.
-	* src/symtab.h (symbol_number, struct symbol): Likewise.
-	* src/tables.c (vector_number, tally, action_number,
-	default_goto, goto_actions): Likewise.
-	* tests/existing.at (GNU Cim Grammar): Likewise.
-	* tests/regression.at (Web2c Actions): Likewise.
-
-	* src/output.c (muscle_insert_short_int_table): Renamed from
-	muscle_insert_short_table.  All uses changed.
-
-2004-03-25  Paul Hilfinger  <hilfingr@tully.CS.Berkeley.EDU>
-
-	* src/parse-gram.y: Define PERCENT_EXPECT_RR.
-	(declaration): Replace expected_conflicts with expected_sr_conflicts.
-	Add %expect-rr rule.
-
-	* src/scan-gram.l: Recognize %expect-rr.
-
-	* src/conflicts.h (expected_sr_conflicts): Rename from
-	expected_conflicts.
-	(expected_rr_conflicts): Declare.
-
-	* src/conflicts.c (expected_sr_conflicts): Rename from
-	expected_conflicts.
-	(expected_rr_conflicts): Define.
-	(conflicts_print): Check r/r conflicts against expected_rr_conflicts
-	for GLR parsers.
-	Use expected_sr_conflicts in place of expected_conflicts.
-	Warn if expected_rr_conflicts used in non-GLR parser.
-
-	* doc/bison.texinfo: Add documentation for %expect-rr.
-
-2004-03-08  Paul Eggert  <eggert@gnu.org>
-
-	Add support for hex token numbers.  Suggested by Odd Arild Olsen in
-	<http://lists.gnu.org/archive/html/bison-patches/2004-03/msg00000.html>.
-
-	* NEWS: Document hexadecimal tokens, no NUL bytes, %destructor
-	in lalr1.cc.
-	* doc/bison.texinfo (Token Decl): Add hexadecimal token numbers.
-	* src/scan-gram.l (scan_integer): New function.
-	({int}): Use it.
-	(0[xX][0-9abcdefABCDEF]+): New pattern, to support hex numbers.
-	(<SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>, \\x[0-9abcdefABCDEF]+,
-	handle_action_dollar, handle_action_at, convert_ucn_to_byte):
-	Say "long int", not "long", for uniformity with GNU style.
-
-2004-02-25  Paul Eggert  <eggert@twinsun.com>
-
-	* tests/local.at (AT_COMPILE, AT_COMPILE_CXX): Ignore stdout from
-	compilers.  This fixes a problem with Intel's C++ compiler being
-	chatty, reported by Guido Trentalancia in
-	<http://lists.gnu.org/archive/html/bug-bison/2004-02/msg00030.html>.
-
-2004-02-09  Alexandre Duret-Lutz  <adl@gnu.org>
-
-	Support %destructor and merge error locations in lalr1.cc.
-
-	* data/lalr1.cc (b4_cxx_destruct_def): New macro.
-	(Parser::stos_): Define unconditionally.
-	(Parser::destruct_): New method.  Generate its body with
-	b4_yydestruct_generate.
-	(Parser::error_start_): New attribute.
-	(Parser::parse) <yyerrlab, yyerrlab1>: Call destruct_ on erroneous
-	token which are discarded.
-	(Parser::parse) <yyerrlab, yyerrorlab, yyerrlab1>: Update
-	error_start_ when erroneous token are discarded.
-	(Parser::parse) <yyerrlab1>: Compute the location of the error
-	token so that it covers all the discarded tokens.
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Adjust so
-	it can be called with `%skeleton "lalr1.cc"', and do that.
-
-2004-02-02  Paul Eggert  <eggert@twinsun.com>
-
-	* src/Makefile.am (AM_CPPFLAGS): New macro.  It mentions
-	$(top_srcdir)/lib and ../lib.  This fixes a bug reported
-	by Paul Hilfinger; the old INCLUDES value didn't mention ../lib.
-	There's no need to mention top_builddir since Automake does that
-	for us.
-	(INCLUDES): Remove, as Automake says it's obsolescent.
-	Contents migrated into AM_CPPFLAGS as described above.
-	* lib/Makefile.am (INCLUDES): Remove; obsolescent.
-
-2004-01-14  Paul Hilfinger  <hilfingr@CS.Berkeley.EDU>
-
-	* data/glr.c (yytokenName): Bullet-proof against YYEMPTY token.
-	(yyreportSyntaxError): Handle case where lookahead token is
-	YYEMPTY.
-
-2004-01-13  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* data/glr.c: Put casts on uses of YYREALLOC and YYMALLOC so that
-	resulting parsers are compilable with C++.
-
-2003-12-23  Paul Eggert  <eggert@twinsun.com>
-
-	* config/depcomp, config/install-sh: Sync with Automake 1.8.
-	* src/output.c (output_skeleton): Rename local var.
-	* tests/input.at (Torturing the Scanner): Don't use \x0 or \0 in
-	Bison tokens, as this runs afoul of the 2003-10-07 change that
-	disallowed NUL bytes in character constants or string literals.
-
-	* tests/local.at: Require Autoconf 2.59's Autotest.
-	* tests/testsuite.at: Don't include local.at, since we now assume
-	Autoconf 2.59 or later.  Autoconf 2.59 had some problems with
-	including it.
-	* tests/Makefile.am ($(TESTSUITE)): Remove warning about ignoring
-	multiple inclusion warnings.
-
-2003-12-02  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (How Can I Reset the Parser): More about start
-	conditions.
-	From Bruno Haible.
-
-2003-11-18  Alexandre Duret-Lutz  <adl@gnu.org>
-
-	* doc/bison.texinfo (Bison Options): Escape `@' in `$@'.
-
-2003-10-07  Paul Eggert  <eggert@twinsun.com>
-
-	* tests/Makefile.am (clean-local): Don't run 'testsuite --clean'
-	if testsuite doesn't exist.
-
-	* doc/bison.texinfo (Symbols): NUL bytes are not allowed in string
-	literals, unfortunately.
-	* src/scan-gram.l (<SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>):
-	Complain about NUL bytes in character constants or string literals.
-
-2003-10-05  Paul Eggert  <eggert@twinsun.com>
-
-	* NEWS: Don't document %no-default-prec, as it's still
-	too experimental.
-	* doc/bison.texinfo: Document %no-default-prec only if
-	the defaultprec flag is set.  Normally it's not.
-
-2003-10-04  Paul Eggert  <eggert@twinsun.com>
-
-	* data/glr.c (b4_rhs_value, b4_rhs_location): Yield a
-	non-modifiable lvalue, instead of a modifiable one.
-	* doc/bison.texinfo (Actions): Document that $$ can
-	be assigned to.  Do not claim that $$ and $N are
-	array element references: user code should not rely on this.
-
-2003-10-01  Paul Eggert  <eggert@twinsun.com>
-
-	* src/parse-gram.h (PERCENT_NO_DEFAULT_PREC): New token.
-	(grammar_declaration): Use it.
-	* src/scan-gram.l: New token %no-default-prec.
-	* tests/conflicts.at: Revamp tests to use %no-default-prec.
-	* NEWS, doc/bison.texinfo: Document the above.
-
-2003-10-01  Akim Demaille  <akim@epita.fr>
-
-	VCG no longer supports long_straight_phase.
-
-	* src/vcg.c, src/vcg.h: Remove the handling of long_straight_phase.
-	* src/print_graph.c (print_graph): Adjust.
-
-2003-09-30  Frank Heckenbach  <frank@g-n-u.de>
-	and Paul Eggert  <eggert@twinsun.com>
-
-	* doc/bison.texinfo (Decl Summary, Contextual Precedence,
-	Table of Symbols): Document %default-prec.
-	* src/parse-gram.y (PERCENT_DEFAULT_PREC): New token.
-	(grammar_declaration): Set default_prec on %default-prec.
-	* src/scan-gram.l (%default-prec): New token.
-	* src/reader.h (default_prec): New flag.
-	* src/reader.c: Likewise.
-	(packgram): Handle it.
-	* tests/conflicts.at (%default-prec without %prec,
-	%default-prec with %prec, %default-prec 1): New tests.
-
-2003-09-30  Paul Eggert  <eggert@twinsun.com>
-
-	* tests/testsuite.at: Include local.at, not input.at, fixing
-	a typo in the 2003-08-25 patch.
-
-2003-08-27  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (yyparse) [__GNUC__]: "Use" yyerrorlab to pacify
-	GCC warnings.
-
-2003-08-26  Akim Demaille  <akim@epita.fr>
-
-	* config/announce-gen (print_changelog_deltas): Neutralize "<#" as
-	"<\#" to avoid magic from Gnus when posting parts of this script.
-
-2003-08-26  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (Parser::report_syntax_error_): New, extracted from
-	(Parser::parse): here.
-	Adjust: nerrs and errstatus is now replaced by...
-	(Parser::nerrs_, Parser::errstatus_): New.
-
-2003-08-25  Akim Demaille  <akim@epita.fr>
-
-	* config/announce-gen, Makefile.cfg: New.
-	* Makefile.am: Adjust.
-	* GNUmakefile, Makefile.maint: Update from CVS Autoconf, but
-	keeping local WGET and WGETFLAGS modifications from Paul Eggert.
-
-2003-08-25  Akim Demaille  <akim@epita.fr>
-
-	When reducing initial empty rules, Bison parser read an initial
-	location that is not defined.  This results in garbage, and that
-	affects Bison's own parser.  Therefore we need (i) to extend Bison
-	to support a means to initialize this location, and (ii) to use
-	this CVS Bison to fix CVS Bison's parser.
-
-	* src/reader.h, reader.c (epilogue_augment): Remove, replace
-	with...
-	* src/muscle_tab.h, src/muscle_tab.c (muscle_code_grow): this.
-	* src/parse-gram.y: Adjust.
-	(%initial-action): New.
-	(%error-verbose): Since we require CVS Bison, there is no reason
-	not to use it.
-	* src/scan-gram.l: Adjust.
-	* src/Makefile.am (YACC): New, to make sure we use our own parser.
-	* data/yacc.c (yyparse): Use b4_initial_action.
-
-2003-08-25  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo: Don't promote stdout for error messages.
-
-2003-08-25  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (Parser::reduce_print_): Remove unused yyi.
-	From Alexandre Duret-Lutz.
-
-2003-08-25  Akim Demaille  <akim@epita.fr>
-
-	Version 1.875c.
-
-2003-08-25  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (Parser::stack_print_, YY_STACK_PRINT): New.
-	Use them.
-
-2003-08-25  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (Parser::reduce_print_): New.
-	Use it.
-
-2003-08-25  Akim Demaille  <akim@epita.fr>
-
-	Have lalr1.cc catch with Paul Eggert's patch to fix the infinite
-	error recovery loops.  This patch is based on
-	<http://lists.gnu.org/archive/html/bison-patches/2003-06/msg00000.html>.
-	Also, augment the similarity between lalr1.cc and yacc.c.
-	Note: the locations of error recovery rules are not correct yet.
-
-	* data/lalr1.cc: Comment changes to augment the similarity between
-	lalr1.cc and yacc.c.
-	(YYERROR): Goto to yyerrorlab, not yyerrlab1.
-	(yyerrlab1): Remove, but where it used to be (now the bottom part of
-	yyerrlab), when hitting EOF, pop the whole stack here instead of
-	merely falling thru the default error handling mechanism.
-	(yyerrorlab): New label, with the old contents of YYERROR,
-	plus the following change: pop the stack of rhs corresponding
-	to the production that invoked YYERROR.  That is how Yacc
-	behaves (required by POSIX).
-	* tests/calc.at (AT_CHECK_CALC_LALR1_CC): No longer expected to
-	fail.
-
-2003-08-25  Akim Demaille  <akim@epita.fr>
-
-	Tune local.at so that people can "autom4te -l autotest calc.at -o
-	calc" for instance, to extract a sub test suite.
-
-	* tests/testsuite.at: Move the initialization, Autotest version
-	requirement, and AT_TESTED invocation into...
-	* tests/local.at: here.
-	* tests/testsuite.at: Include it for compatibility with Autoconf
-	2.57.
-	* tests/Makefile.am ($(TESTSUITE)): Report that the warning should
-	be ignore.
-
-2003-08-04  Paul Eggert  <eggert@twinsun.com>
-
-	Rework code slightly to avoid gcc -Wtraditional warnings.
-	* data/glr.c (yyuserMerge): Return void, not YYSTYPE.
-	The returned value is now stored in *YY0.  All callers changed.
-	* src/output.c (merge_output): Adjust to the above change.
-
-2003-07-26  Paul Eggert  <eggert@twinsun.com>
-
-	* data/glr.c (YYASSERT): New macro.
-	(yyfillin, yydoAction, yyglrReduce, yysplitStack,
-	yyresolveStates, yyprocessOneStack):
-	Use `YYASSERT (FOO);' rather than `if (! (FOO)) abort ();'.
-	Derived from a suggestion by Frank Heckenbach.
-
-2003-07-25  Paul Eggert  <eggert@twinsun.com>
-
-	* data/glr.c (yyglrReduce): Don't use C89 string concatenation,
-	for portability to K&R C (after ansi2knr, presumably).  See
-	<http://lists.gnu.org/archive/html/bison-patches/2003-06/msg00041.html>
-	by Frank Heckenbach, though I have omitted the structure-initialization
-	part of his glr-knr.diff patch since I recall that the Portable
-	C Compiler didn't require that change.
-
-	Let the user specify how to allocate and free memory.
-	Derived from a suggestion by Frank Heckenbach in
-	<http://lists.gnu.org/archive/html/bison-patches/2003-06/msg00041.html>.
-	* data/glr.c (YYFREE, YYMALLOC, YYREALLOC): New macros.
-	All uses of free, malloc, realloc changed to use these macros,
-	and unnecessary casts removed.
-	* data/yacc.c (YYFREE, YYMALLOC): Likewise.
-
-2003-07-06  Matthias Mann  <MatthiasMann@gmx.de>
-
-	* data/lalr1.cc (operator<<(std::ostream&, const Position&)):
-	use s.empty() rather than s == "" to test for empty string; see
-	<http://lists.gnu.org/archive/html/bison-patches/2003-07/msg00003.html>
-	(trivial change)
-
-2003-06-25  Akim Demaille  <akim@epita.fr>
-
-	* config/depcomp, config/install-sh: Update from masters.
-
-2003-06-20  Paul Eggert  <eggert@twinsun.com>
-
-	* data/glr.c (YYLLOC_DEFAULT): Parenthesize arguments as needed,
-	and return properly parenthesized result.
-	* data/lalar1.cc (YYLLOC_DEFAULT): Likewise.
-	* data/yacc.c (YYLLOC_DEFAULT): Likewise.
-	Remove unnecessary parentheses from uses.
-	* doc/bison.texinfo (Location Default Action): Describe the
-	conventions for parentheses.
-
-2003-06-19  Paul Eggert  <eggert@twinsun.com>
-
-	* data/glr.c (yyremoveDeletes, yy_reduce_print, yyglrReduce,
-	yyreportTree): Do not assume that size_t is the same width as int,
-	when printing sizes.  Print sizes using an unsigned format.
-	Problem reported by Frank Heckenbach in
-	<http://lists.gnu.org/archive/html/bison-patches/2003-06/msg00035.html>.
-
-	Port to Forte Developer 7 C compiler.
-	* data/glr.c (struct YYLTYPE): If locations are not being used,
-	declare a single dummy member, as empty structs do not conform
-	to the C standard.
-	(YYERROR, YYBACKUP): Do not use "do { ...; return foo; } while (0)";
-	the Forte Developer 7 C compiler complains that end-of-loop
-	code is not reached.
-
-2003-06-17  Paul Eggert  <eggert@twinsun.com>
-
-	* lib/libiberty.h (PARAMS): Spell argument as Args, not as X, to
-	avoid warnings from picky compilers about redefinition of PARAMS.
-
-2003-06-17  Paul Eggert  <eggert@twinsun.com>
-
-	Version 1.875b.
-
-	* NEWS: Document 1.875b.
-
-	* lib/bbitset.h: Do not include config.h; that's the includer's job.
-	Do not include <sys/types.h>; shouldn't be needed on a C89 host.
-	* lib/bitset.h (bitset_compatible_p): Indent as per GNU standard.
-	Don't use 'index' in comments, as it's a builtin fn on some hosts.
-	* lib/bitset_stats.c: Include gettext.h unconditionally, as
-	per recent gettext manual's suggestion.
-	* lib/ebitset.c (ebitset_resize, ebitset_unused_clear):
-	Use prototypes, not old-style definitions.
-	* lib/lbitset.c (lbitset_unused_clear): Likewise.
-	* lib/vbitset.c (vbitset_resize, vbitset_ones, vbitset_zero,
-	vbitset_empty_p, vbitset_copy1, vbitset_not, vbitset_equal_p,
-	vbitset_subset_p, vbitset_disjoint_p, vbitset_and, vbitset_and_cmp,
-	vbitset_andn, vbitset_andn_cmp, vbitset_or, vbitset_or_cmp,
-	vbitset_xor, vbitset_xor_cmp, vbitset_and_or, vbitset_and_or_cmp,
-	vbitset_andn_or, vbitset_andn_or_cmp, vbitset_or_and,
-	vbitset_or_and_cmp, vbitset_copy): Likewise.
-
-	* lib/libiberty.h: Do not include config.h; that's the includer's job.
-	Do not include <stdlib.h>.
-	(PARAMS): Define unconditionally for C89.
-	(ATTRIBUTE_NORETURN): Remove.
-	(ATTRIBUTE_UNUSED): Define unconditionally.
-
-	Upgrade to 2003-06-08 libbitset, submitted by Michael Hayes in:
-	<http://lists.gnu.org/archive/html/bison-patches/2003-06/msg00005.html>
-	* lib/Makefile.am (bitsets_sources): Add vbitset.c, vbitset.h.
-	* lib/vbitset.c, lib/vbitset.h: New files.
-	* lib/abitset.c, lib/bbitset.h, lib/bitset.c, lib/bitset.h,
-	lib/bitset_stats.c, lib/ebitset.c, lib/lbitset.c: Import
-	from libbitset.
-
-	* doc/bison.texinfo (How Can I Reset the Parser): Renamed from
-	`How Can I Reset @code{yyparse}', since texinfo does not allow
-	arbitrary @ in node names.
-
-	* m4/Makefile.am (EXTRA_DIST): Add the following files, which
-	shouldn't be needed according to the gettext 0.12.1 documentation
-	but which seem to be needed anyway: codeset.m4 glibc21.m4
-	intdiv0.m4 inttypes-pri.m4 inttypes.m4 inttypes_h.m4 isc-posix.m4
-	lcmessage.m4 nls.m4 po.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4.
-	* po/Makefile.in.in: Upgrade to gettext 0.12.1 version.
-
-	* lib/.cvsignore: Add stdbool.h.
-	* m4/.cvsignore: Add nls.m4, po.m4.
-
-	Upgrade to CVS gnulib.
-	* stdbool_.h: File renamed from stdbool.h.in.
-	* configure.ac (AM_STDBOOL_H): Invoke this instead of
-	AC_HEADER_STDBOOL.
-	(AM_GNU_GETTEXT): Put brackets around args, as latest manual suggests.
-	(AM_GNU_GETTEXT_VERSION): Update to 0.12.1.
-	* lib/Makefile.am (EXTRA_DIST): Add stdbool_.h.
-	(MOSTLYCLEANFILES): New var.
-	($(libbison_a_OBJECTS)): Depend on $(STDBOOL_H).
-	(stdbool.h): New rule.
-	* lib/dirname.c, lib/dirname.h, lib/hash.c, lib/hash.h,
-	lib/malloc.c, lib/obstack.h, lib/quote.c, lib/realloc.c,
-	lib/strcasecmp.c, lib/xalloc.h, m4/alloca.m4, m4/onceonly.m4,
-	m4/quote.m4: Upgrade to today's gnulib.
-
-	* tests/calc.at (AT_CHECK_CALC): New option EXPECTED-TO-FAIL.
-	(AT_CHECK_CALC_LALR1_CC): Use it, since the C++ LALR parser fails
-	the tests right now.
-	* tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Ensure yylex and
-	yyerror are declared before use; C99 requires this.
-
-2003-06-09  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* data/glr.c (YYERROR): Update definition to reset yyerrState to 0
-	first.
-	(yyrecoverSyntaxError): Correct the logic for setting and testing
-	yyerrState.
-	Correct comment on handling EOF.
-	Allow states with only a default reduction, rather than failing
-	(I can't quite reconstruct why these were not allowed before).
-
-	Fixes to avoid problem that $-N rules in GLR parsers can cause
-	buffer overruns, corrupting state.
-
-	* src/output.c (prepare_rules): Output max_left_semantic_context
-	definition.
-	* src/reader.h (max_left_semantic_context): New variable declaration.
-	* src/scan-gram.l (max_left_semantic_context): Define.
-	(handle_action_dollar): Update max_left_semantic_context.
-	* data/glr.c (YYMAXLEFT): New definition.
-	(yydoAction): Increase size of yyrhsVals by YYMAXLEFT.
-	(yyresolveAction): Ditto.
-
-	Fixes to problems with location handling in GLR parsers reported by
-	Frank Heckenbach (2003/06/05).
-
-	* data/glr.c (YYLTYPE): Make trivial if locations not used.
-	(YYRHSLOC): Add parentheses, and define only if locations used.
-	(YYLLOC_DEFAULT): Add parentheses, and give trivial definition if
-	locations not used.
-	(yyuserAction): Use YYLLOC_DEFAULT to set *yylocp.
-	(yydoAction): Remove redundant initialization of *yyvalp and *yylocp.
-
-	* tests/cxx-type.at: Exercise location information; update tests
-	to differentiate output with and without locations.
-	Remove forward declarations of yylex and yyerror---caused errors
-	because default YYLTYPE not yet defined.
-	Change semantic actions to compute strings, rather than printing
-	them directly (to test proper passing of semantics values).  Change
-	output to prefix notation and update test data and expected results.
-	(yylex): Track locations.
-	(stmtMerge): Return value rather than printing, and include arguments
-	in value.
-
-2003-06-03  Paul Eggert  <eggert@twinsun.com>
-
-	Avoid warnings generated by GCC 2.95.4 when Bison is
-	configured with --enable-gcc-warnings.
-	* data/lalr1.cc (yy::]b4_parser_class_name[::parse,
-	yy::]b4_parser_class_name[::translate_,
-	yy::Stack::operator[] (unsigned),
-	yy::Stack::operator[] (unsigned) const,
-	yy::Slice::operator[] (unsigned),
-	yy::Slice::operator[] (unsigned) const):
-	Rename local vars to avoid warnings.
-	* tests/glr-regression.at (Improper handling of embedded actions
-	and $-N in GLR parsers): Remove unused local variable from yylex.
-	* tests/regression.at (_AT_DATA_DANCER_Y): Declare yylex to take
-	(void) as arg when not pure, since we now assume C89 when building
-	Bison.  Pacify GCC by using parameter.
-
-2003-06-02  Paul Eggert  <eggert@twinsun.com>
-
-	* data/lalr1.cc (yy::Position::lines, yy::Position::columns,
-	yy::Location::lines, yy::Location::columns): Rename arguments
-	to avoid shadowing; this removes a warning generated by GCC 3.3.
-
-2003-06-01  Paul Eggert  <eggert@twinsun.com>
-
-	Don't pass C-only warning optins (e.g., -Wmissing-declarations)
-	to g++, as GCC 3.3 complains if you do it.
-	* configure.ac (WARNING_CXXFLAGS): New subst.  Set it to
-	everything that WARNING_CFLAGS has, except omit warnings
-	not suitable for C++.
-	(AC_PROG_CXX): Use this instead of AC_CHECK_PROGS([CXX], [g++]).
-	* tests/atlocal.in (CXXFLAGS): New var.
-	* tests/local.at (AT_COMPILE_CXX): Use it instead of CFLAGS.
-
-	Fix a GLR parser bug I reported in February; see
-	<http://lists.gnu.org/archive/html/bison-patches/2003-02/msg00008.html>.
-	The problem was that GLR parsers did not conform to the C standard,
-	because actions like { $1 = $2 + $3; } expanded to expressions
-	that invoked YYFILL in separate subexpressions, and YYFILL assigned
-	to a local variable.  The C standard says that expressions
-	like (var = f ()) + (var = f ()) have undefined behavior.
-	Another problem was that GCC sometimes issues warnings that
-	yyfill and its parameters are unused.
-
-	* data/glr.c (yyfillin): Renamed from the old yyfill.  Mark
-	as possibly unused.
-	(yyfill): New function.
-	(YYFILL): Use it.
-	(yyuserAction): Change type of yynormal to bool, so that it matches
-	the new yyfill signature.  Mark it as possibly unused.
-
-
-	Follow up on a bug I reported in February, where a Bison-generated
-	parser can loop.  Provide a test case and a fix for yacc.c.  I
-	don't have a fix for lalr1.cc or for glr.c, unfortunately.
-	The original bug report is in:
-	<http://lists.gnu.org/archive/html/bison-patches/2003-02/msg00044.html>
-
-	* data/yacc.c (YYERROR): Now just 'goto yyerrorlab', since the
-	macro's size was becoming unwieldy.
-	(yyerrlab): Do not discard an empty lookahead symbol, as this
-	might destroy garbage.
-	(yyerrorlab): New label, with the old contents of YYERROR,
-	plus the following change: pop the stack of rhs corresponding
-	to the production that invoked YYERROR.  That is how Yacc
-	behaves, and POSIX requires this behavior.
-	(yyerrlab1): Use YYPOPSTACK instead of its definiens.
-	* tests/calc.at (_AT_DATA_CALC_Y): Include unistd.h if available.
-	Define 'alarm' to do nothing if unistd.h is not available.
-	Add a new rule "exp: '-' error;" to test the above change to
-	data/yacc.c.  Use 'alarm' to abort any test taking longer than
-	10 seconds, as it's probably looping.
-	(AT_CHECK_CALC): Test recovery from error in new grammar rule.
-	Also, the new yacc.c generates two fewer diagnostics for an
-	existing test.
-
-2003-05-24  Paul Eggert  <eggert@twinsun.com>
-
-	* data/glr.c (YYSTACKEXPANDABLE): Do not evaluate
-	YYSTYPE_IS_TRIVIAL or YYSTYPE_IS_TRIVIAL unless they are defined.
-	This fixes a problem reported by John Bowman when the Compaq/HP
-	Alpha cxx compiler happy (e.g. using cxx -D__USE_STD_IOSTREAM
-	-ansi -Wall -gall).
-	* data/yacc.c (union yyalloc): Likewise.
-	(YYCOPY): Do not evaluate __GNUC__ unless it is defined.
-
-	Switch from 'int' to 'bool' where that makes sense.
-
-	* lib/abitset.c (abitset_test, abitset_empty_p, abitset_equal_p,
-	abitset_subset_p, abitset_disjoint_p, abitset_and_cmp,
-	abitset_andn_cmp, abitset_or_cmp, abitset_xor_cmp, abitset_and_or,
-	abitset_and_or_cmp, abitset_andn_or_cmp, abitset_or_and_cmp):
-	Return or accept bool, not int.  All callers changed.
-	* lib/bbitset.h: (bitset_toggle_, bitset_copy_, bitset_and_or_cmp_,
-	bitset_andn_or_cmp_, bitset_or_and_cmp_): Likewise.
-	* lib/bitset.c (bitset_only_set_p, bitset_print, bitset_toggle_,
-	bitset_copy_, bitset_op4_cmp, bitset_and_or_cmp_, bitset_andn_or_cmp_,
-	bitset_or_and_cmp_): Likewise.
-	* lib/bitset.h (bitset_test, bitset_only_set_p): Likewise.
-	* lib/bitset_stats.c (bitset_stats_print, bitset_stats_toggle,
-	bitset_stats_test, bitset_stats_empty_p, bitset_stats_disjoint_p,
-	bitset_stats_equal_p, bitset_stats_subset_p, bitset_stats_and_cmp,
-	bitset_stats_andn_cmp, bitset_stats_or_cmp, bitset_stats_xor_cmp,
-	bitset_stats_and_or_cmp, bitset_stats_andn_or_cmp,
-	bitset_stats_or_and_cmp): Likewise.
-	* lib/ebitset.c (ebitset_elt_zero_p, ebitset_equal_p, ebitset_copy_cmp,
-	ebitset_test, ebitset_empty_p, ebitset_subset_p, ebitset_disjoint_p,
-	ebitset_op3_cmp, ebitset_and_cmp, ebitset_andn_cmp, ebitset_or_cmp,
-	ebitset_xor_cmp): Likewise.
-	* lib/lbitset.c (lbitset_elt_zero_p, lbitset_equal_p, lbitset_copy_cmp,
-	lbitset_test, lbitset_empty_p, lbitset_subset_p, lbitset_disjoint_p,
-	lbitset_op3_cmp, lbitset_and_cmp, lbitset_andn_cmp, lbitset_or_cmp,
-	lbitset_xor_cmp): Likewise.
-	* lib/bbitset.h: Include <stdbool.h>.
-	(struct bitset_vtable): The following members now return bool, not
-	int: toggle, test, empty_p, disjoint_p, equal_p, subset_p,
-	and_cmp, andn_cmp, or_cmp, xor_cmp, and_or_cmp, andn_or_cmp,
-	or_and_cmp).
-	* src/conflicts.c (count_rr_conflicts): Likewise.
-	* lib/bitset_stats.h (bitset_stats_enabled): Now bool, not int.
-	All uses changed.
-	* lib/ebitset.c (ebitset_obstack_init): Likewise.
-	* lib/lbitset.c (lbitset_obstack_init): Likewise.
-	* src/getargs.c (debug_flag, defines_flag, locations_flag,
-	no_lines_flag, no_parser_flag, token_table_flag, yacc_flag,
-	graph_flag): Likewise.
-	* src/getargs.h (debug_flag, defines_flag, locations_flag,
-	no_lines_flag, no_parser_flag, token_table_flag, yacc_flag,
-	graph_flag): Likewise.
-	* src/output.c (error_verbose): Likewise.
-	* src/output.h (error_verbose): Likewise.
-	* src/reader.c (start_flag, typed): Likewise.
-	* src/reader.h (typed): Likewise.
-	* src/getargs.c (LOCATIONS_OPTION): New constant.
-	(long_options, getargs): Use it.
-	* src/lalr.c (build_relations): Use bool, not int.
-	* src/nullable.c (nullable_compute): Likewise.
-	* src/print.c (print_reductions): Likewise.
-	* src/tables.c (action_row, pack_vector): Likewise.
-	* src/muscle_tab.h (MUSCLE_INSERT_BOOL): New macro.
-	* src/output.c (prepare): Use it.
-	* src/output.c (token_definitions_output,
-	symbol_destructors_output, symbol_destructors_output): Use string,
-	not boolean integer, to keep track of whether to output separator.
-	* src/print_graph.c (print_core): Likewise.
-	* src/state.c (state_rule_lookaheads_print): Likewise.
-
-	* config/install-sh: Sync from automake 1.7.5.
-
-2003-05-14  Paul Eggert  <eggert@twinsun.com>
-
-	* src/parse-gram.y (rules_or_grammar_declaration): Require a
-	semicolon after a grammar declaration, in the interest of possible
-	future changes to the Bison input language.
-	Do not allow a stray semicolon at the start of the grammar.
-	(rhses.1): Allow one or more semicolons after any rule, including
-	just before "|" as required by POSIX.
-	* tests/input.at (Torturing the Scanner): Add tests for ";|" in a
-	grammar.
-
-2003-05-14  Alexandre Duret-Lutz  <adl@gnu.org>
-
-	%parse-param support for lalr1.cc.
-
-	* data/lalr1.cc (b4_parse_param_decl, b4_parse_param_cons,
-	b4_cc_constructor_calls, b4_cc_constructor_call,
-	b4_parse_param_vars, b4_cc_var_decls, b4_cc_var_decl): New m4
-	definitions.
-	(yy::b4_parser_class_name::b4_parser_class_name): Take extra
-	parse-param arguments.
-	(yy::b4_parser_class_name): Declare instance variables to
-	hold parse-param arguments.
-	* tests/calc.at: s/value/semantic_value/ because value clashes
-	with a member of yy::b4_parser_class_name.  Adjust C++ code
-	to handle %parse-param.  Enable %parse-param test in C++.
-
-2003-05-12  Paul Eggert  <eggert@twinsun.com>
-
-	* doc/bison.texinfo (How Can I Reset @code{yyparse}): Reword the
-	English a bit.  Fix fclose typo.  Change "const char" to "char
-	const", and use ANSI C rather than K&R for "main".  Suggest
-	YY_FLUSH_BUFFER over yyrestart (as that is what Flex recommends)
-	and suggest yy_switch_to_buffer.
-
-2003-05-05  Paul Eggert  <eggert@twinsun.com>
-
-	* lib/bitset.h (__INT_TO_PTR): Define to a value that presumes
-	C89.  This avoids a diagnostic on compilers that define __STDC__
-	to 0, fixing a problem with Tru64 cc reported by Martin Mokrejs in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-04/msg00041.html>.
-
-2003-05-03  Paul Eggert  <eggert@twinsun.com>
-
-	* lib/bitset.h (BITSET_FOR_EACH, BITSET_FOR_EACH_REVERSE):
-	Do not overrun array bounds.
-	This should fix a bug reported today by Olatunji Oluwabukunmi in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-05/msg00004.html>.
-
-2003-04-29  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h, src/gram.c (pure_parser, glr_parser): Move to...
-	* src/getargs.c, src/getargs.h: here, as bool, not int.
-	(nondeterministic_parser): New.
-	* src/parse-gram.y, src/scan-gram.l: Support
-	%nondeterministic-parser.
-	* src/output.c (prepare): Use nondeterministic_parser instead
-	of glr_parser where appropriate.
-	* src/tables.c (conflict_row, action_row, save_row)
-	(token_actions, token_actions, pack_vector): Ditto.
-
-2003-04-29  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (C++ Parsers, Implementing Loops): New.
-
-2003-04-29  Akim Demaille  <akim@epita.fr>
-
-	* tests/calc.at: Also test yacc.c and glr.c (but not lalr1.cc yet)
-	with %pure-parser and %locations to exercise the patch from Yakov
-	Markovitch below.
-
-2003-04-28  Tim Van Holder <tim.van.holder@pandora.be>
-
-	* data/yacc.c: (b4_lex_param): Corrected for the case where
-	%lex-param is provided and %pure-parser isn't.
-
-2003-04-27  Paul Eggert  <eggert@twinsun.com>
-
-	Avoid gcc -Wundef warnings reported by Gerald Pfeifer in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-04/msg00044.html>.
-	* data/yacc.c (YYSTACK_ALLOC): Don't evaluate YYSTACK_USE_ALLOCA
-	if it is not defined.
-	(YYMAXDEPTH): Don't evaluate YYMAXDEPTH if it is not defined.
-
-2003-04-26  Paul Eggert  <eggert@twinsun.com>
-
-	* data/lalr1.cc (yy::Parser::pact_ninf_, yy::Parser::table_ninf_):
-	Declare to be of type suitable for the ninf value itself, not of
-	type suitable for the corresponding table, since the latter might
-	be unsigned but the ninf value might be negative.  This fixes a
-	bug reported by Alexandre Duret-Lutz in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-04/msg00017.html>.
-
-	* configure.ac (AC_FUNC_ERROR_AT_LINE): Remove, since gl_ERROR
-	invokes it.  We shouldn't invoke it twice because it will attempt
-	to put error.o in the archive twice.  This fixes a glitch reported
-	by Martin Mokrejs in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-04/msg00041.html>.
-
-2003-04-21  Paul Eggert  <eggert@twinsun.com>
-
-	* m4/error.m4: Update from Bruno Haible's 2003-04-14 patch
-	to gnulib.
-
-2003-04-21  Yakov Markovitch <Markovitch@iso.ru>
-
-	* data/glr.c (yyexpandGLRStack) [!YYSTACKEXPANDABLE]:
-	Fix obvious typo that results in uncompilable GLR parsers
-	when both %pure-parser and %locations are used.  (trivial change)
-
-2003-04-17  Paul Eggert  <eggert@twinsun.com>
-
-	* src/scan-gram.l: Add %option nounput, since we no longer use unput.
-	(unexpected_eof): Renamed from unexpected_end_of_file, for brevity.
-	Do not insert the expected token via unput, as this runs afoul
-	of a POSIX-compatibility bug in flex 2.5.31.
-	All uses changed to BEGIN the parent state,
-	since we no longer insert the expected token via unput.
-	* tests/regression.at (Invalid inputs): Remove cascaded diagnostic
-	that is no longer emitted after the above change.
-
-	* src/conflicts.c (set_conflicts): Resolve all conflicts, not just
-	the first one.  This change is from Paul Hilfinger, and it fixes
-	regression reported by Werner Lemberg in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-04/msg00026.html>.
-
-	(resolve_sr_conflict): Don't invoke state_errs_set
-	unless one or more tokens have been explicitly made errors.
-	Otherwise, the above change causes Bison to abort.
-
-	* tests/existing.at (GNU pic Grammar): New test case, taken from
-	Lemberg's email.
-
-2003-03-31  Akim Demaille  <akim@epita.fr>
-
-	* doc/Makefile.am (AM_MAKEINFOFLAGS): Don't split the info file.
-
-2003-03-31  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (prepare_symbols): Avoid trailing spaces in the
-	output.
-
-2003-03-31  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (Strings are Destroyed): s/losses/loses/.
-	From Paul Hilfinger.
-
-2003-03-29  Akim Demaille  <akim@epita.fr>
-
-	* m4/error.m4: Do not put under dynamic conditions some code which
-	expansion is under static control.
-
-2003-03-29  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (How Can I Reset @code{yyparse}): New.
-
-2003-03-29  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (Strings are Destroyed): New.
-
-2003-03-13  Paul Eggert  <eggert@twinsun.com>
-
-	* .cvsignore: Add configure.lineno.
-	* src/.cvsignore: Add yacc.
-	* tests/.cvsignore: Add testsuite.log.
-	* doc/fdl.texi: Sync with latest FSF version.
-
-2003-03-12  Paul Eggert  <eggert@twinsun.com>
-
-	* scan-gram.l (YY_USER_INIT): Initialize code_start, too.
-	(<INITIAL><<EOF>>, <SC_PRE_CODE><<EOF>>): Set *loc to the scanner
-	cursor, instead of leaving it undefined.  This fixes a bug
-	reported by Tim Van Holder in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-03/msg00023.html>.
-	* tests/input.at (Torturing the Scanner): Test the scanner on
-	an empty input file, which was Tim Van Holder's test case.
-
-	* m4/timevar.m4 (BISON_PREREQ_TIMEVAR): When checking whether
-	<sys/resource.h> can be included, include sys/time.h and
-	sys/times.h first, if available.  This works around the SunOS
-	4.1.4 porting bug reported by Bruce Becker in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-03/msg00018.html>.
-
-	* m4/subpipe.m4 (BISON_PREREQ_SUBPIPE): Don't
-	AC_CHECK_HEADERS([sys/wait.h]), as this interferes with
-	AC_HEADER_SYS_WAIT.
-
-	Merge changes from gnulib.  This was prompted because the CVS
-	snapshot didn't build on Solaris 7 due to strnlen problems.
-
-	These changes need to be merged back into gnulib:
-	* lib/hash.c: Include <stdbool.h> unconditionally.
-	* m4/onceonly.m4 (m4_quote): New macro.
-	(AC_CHECK_HEADERS_ONCE, AC_CHECK_FUNCS_ONCE, AC_CHECK_DECLS_ONCE):
-	Quote AC_FOREACH variable-expansions properly.
-	The 2003-01-03 obstack.h change also needs merging.
-	{end of changes requiring merging}
-
-	* lib/stdbool.h.in, m4/alloca.m4, m4/dirname.m4, m4/dos.m4,
-	m4/getopt.m4, m4/hash.m4, m4/malloc.m4, m4/memchr.m4,
-	m4/memrchr.m4, m4/obstack.m4, m4/onceonly.m4, m4/quote.m4,
-	m4/quotearg.m4, m4/realloc.m4, m4/stpcpy.m4, m4/strnlen.m4,
-	m4/strtol.m4, m4/strtoul.m4, m4/unlocked-io.m4, m4/xalloc.m4:
-	New files, imported from gnulib.
-	* m4/Makefile.am (EXTRA_DIST): Add the new m4/*.m4 files mentioned
-	above.
-
-	* lib/mbswidth.c, m4/error.m4, m4/mbrtowc.m4, m4/mbswidth.m4,
-	m4/memcmp.m4, m4/prereq.m4, m4/stdbool.m4: Update to current
-	gnulib sources.
-
-	* configure.ac (gl_DIRNAME, gl_GETOPT, gl_HASH, gl_QUOTE, gl_XALLOC):
-	Add.
-	(gl_ERROR): New, replacing jm_PREREQ_ERROR.
-	(gl_FUNC_ALLOCA): New, replacing AC_FUNC_ALLOCA.
-	(gl_FUNC_STPCPY): New, replacing AC_REPLACE_FUNCS(stpcpy).
-	(gl_FUNC_STRNLEN): New, replacing AC_FUNC_STRNLEN.
-	(gl_MBSWIDTH): New, replacing jm_PREREQ_MBSWIDTH.
-	(gl_OBSTACK): New, replacing AC_FUNC_OBSTACK.
-	(gl_QUOTEARG): New, replacing jm_PREREQ_QUOTEARG.
-	(jm_FUNC_GLIBC_UNLOCKED_IO, gl_FUNC_STPCPY, gl_FUNC_STRTOL): New.
-	(jm_FUNC_MALLOC): New, replacing AC_FUNC_MALLOC.
-	(jm_FUNC_REALLOC): New, replacing AC_FUNC_REALLOC.
-	(jm_PREREQ_ARGMATCH): Remove.
-	(AC_REPLACE_FUNCS): Remove memchr, memrchr, stpcpy, strtol, strtoul.
-	* lib/Makefile.am (libbison_a_SOURCES): Add argmatch.c, argmatch.h.
-
-	* src/system.h: Include <stdbool.h> unconditionally.
-
-	* lib/bbitset.h: Include <limits.h> unconditionally.  We have been
-	assuming at least C89 in the bitset code for some time now.
-
-2003-03-03  Akim Demaille  <akim@epita.fr>
-
-	* ro.po: New.
-
-2003-03-02  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (Table of Symbols): Reactivate the
-	documentation for %lex-param, and %parse-param.
-
-2003-03-02  Akim Demaille  <akim@epita.fr>
-
-	* data/yacc.c, data/glr.c, data/lal1.cc: Use similar code to
-	generate verbose error messages.
-	Use the number of tokens as an upper bound in yytname, as it
-	cannot be a non terminal.
-
-2003-03-02  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (_AT_DATA_DANCER_Y): Fix the expected error
-	message.
-
-2003-03-02  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (_AT_DATA_DANCER_Y, AT_CHECK_DANCER): New.
-	Use them to exercise yycheck overrun.
-	Based on Andrew Suffield's grammar.
-
-2003-03-02  Akim Demaille  <akim@epita.fr>
-
-	Create tests/local.at for Bison generic testing macros.
-
-	* tests/calc.at (AT_CHECK_PUSHDEFS, AT_CHECK_POPDEFS): Move to...
-	* tests/local.at (AT_BISON_OPTION_PUSHDEFS, AT_BISON_OPTION_POPDEFS):
-	This new file.
-	* tests/calc.at (AT_CHECK_CALC): Adjust.
-	* tests/testsuite.at (AT_DATA_GRAMMAR_PROLOGUE, AT_DATA_GRAMMAR)
-	(AT_COMPILE, AT_COMPILE_CXX, AT_PARSER_CHECK): Move to...
-	* tests/local.at: here.
-	(AT_COMPILE_CXX): Tags the tests using it as c++.
-	Ignore the test if CXX is not functional.
-
-2003-03-01  Paul Eggert  <eggert@twinsun.com>
-
-	* src/scan-gram.l (code_start): Initialize it to scanner_cursor,
-	not loc->end, since loc->end might contain garbage and this leads
-	to undefined behavior on some platforms.
-	(id_loc, token_start): Use (IF_LINTed) initial values that do not
-	depend on *loc, so that the reader doesn't give the the false
-	impression that *loc is initialized.
-	(<INITIAL>"%%"): Do not bother setting code_start, since its value
-	does not survive the return.
-
-2003-03-01  Akim Demaille  <akim@epita.fr>
-
-	* src/scan-gram.l (code_start): Always initialize it when entering
-	into yylex, as SC_EPILOGUE is activated *before* the corresponding
-	yylex invocation.  An alternative would be making it static, but
-	then it starts with the second %%'s beginning, instead of its end.
-
-2003-02-28  Paul Eggert  <eggert@twinsun.com>
-
-	* lib/mbswidth.c: Include <wchar.h> before "mbswidth.h", to work
-	around a UnixWare 7.1.1 porting bug reported by John Hughes in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-02/msg00030.html>.
-
-2003-02-26  Paul Eggert  <eggert@twinsun.com>
-
-	* README: Mention compiler bug in Sun Forte Developer 6 update 2.
-	Remove Sequent/Pyramid discussion (nobody uses them any more).
-	Merge VMS and MS-DOS discussion; these ports may well be dead
-	but let's keep mentioning them for now.  Put <> around email
-	addresses.  Add copyright notice.
-
-2003-02-24  Paul Eggert  <eggert@twinsun.com>
-
-	* data/glr.c (yy_reduce_print): yylineno -> yylno,
-	to avoid collision with flex use of yylineno.
-	Problem reported by Bruce Lilly in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-02/msg00016.html>.
-	* data/lalr1.cc (yy::]b4_parser_class_name[::parse): Likewise.
-	* data/yacc.c (yy_reduce_print): Likewise.
-
-	* config/depcomp: Sync with Automake 1.7.3.
-
-2003-02-21  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc: Use temporary variables instead of casts to
-	change integer types.
-	Suggested by Paul Eggert.
-
-2003-02-21  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo: Use "location" consistently to refer to @n,
-	to avoid confusions with lalr1.cc's notion of Position.
-	Suggested by Paul Eggert.
-
-2003-02-20  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (position.hh): Make sure "columns" never pushes
-	before initial_columns.
-	(location.hh): Use consistent variable names when defining the
-	operator<<.
-	Use "last" so that we subtract from Positions, not from unsigned.
-
-2003-02-20  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (position.hh): New subfile, including the extended
-	and Doxygen'ed documentation of class Position.
-	(location.hh): Use it.
-	Document a` la Doxygen.
-	With the help of Benoit Perrot.
-
-2003-02-20  Akim Demaille  <akim@epita.fr>
-
-	* tests/calc.at (AT_CHECK_PUSHDEFS, AT_CHECK_POPDEFS): Define
-	AT_YACC_IF.
-	Redefine AT_YYERROR_SEES_LOC_IF using it.
-	(_AT_DATA_CALC_Y): Don't declare yyerror when lalr1.cc, as it is
-	not defined.
-	Don't use the location in yy::Parser::error_ and
-	yy::Parser::print_ when not %locations.
-	Activate more lalr1.cc tests.
-
-2003-02-19  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc: When displaying a line number, be sure to make it
-	an int.
-
-2003-02-19  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (b4_stack_depth_init, yy::Parser::initdepth_):
-	Remove, useless.
-	(YYABORT, YYACCEPT, YYERROR): New.
-	* tests/calc.at: Renable the lalr1.cc test.
-
-2003-02-19  Akim Demaille  <akim@epita.fr>
-
-	* tests/calc.at (AT_CHECK_CALC): Check different scenarios of
-	error recovery, mixing with/without pops and discarding of the
-	lookahead.
-	Exercise YYERROR.
-	Disable the lalr1.cc tests as currently it doesn't support YYERROR.
-
-2003-02-17  Paul Eggert  <eggert@twinsun.com>
-
-	* tests/atlocal.in (LDFLAGS, LIBS): New vars.
-	* tests/testsuite.at (AT_COMPILE): Use them.
-	This fixes the testsuite problem reported by Robert Lentz in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-02/msg00011.html>.
-
-2003-02-12  Paul Eggert  <eggert@twinsun.com>
-
-	* data/yacc.c (yyerrlab) [YYERROR_VERBOSE]:
-	Avoid subscript error in yycheck.  Bug reported by Andrew Suffield in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-02/msg00003.html>.
-	* data/glr.c (yyreportSyntaxError) [YYERROR_VERBOSE]: Likewise.
-	Check for malloc failure, for consistency with yacc.c.
-	(yytname_size): Remove, for consistency with yacc.c.
-
-	The bug still remains in data/lalr1.cc, as I didn't have time
-	to fix it there.
-
-2003-02-06  Akim Demaille  <akim@epita.fr>
-
-	* configure.ac (GXX): Rename as...
-	(CXX): this, to keep the original Autoconf semantics.
-	Require 2.57.
-	* data/lalr1.cc: Fix b4_copyright invocations.
-	If YYDEBUG is not defined, don't depend upon name_ being defined.
-	(location.hh): Include string and iostream.
-	(Position::filename): New member.
-	(Position::Position ()): New.
-	(operator<< (Position)): New.
-	(operator- (Position, int)): New.
-	(Location::first, Location::last): Rename as...
-	(Location::begin, Location::end): these, to mock the conventional
-	iterator names.
-	(operator<< (Location)): New.
-	* tests/atlocal.in (CXX): New.
-	* tests/testsuite.at (AT_COMPILE_CXX): New.
-	* tests/calc.at (_AT_DATA_CALC_Y): Adjust yyerror to report the
-	locations in a more synthetic way.
-	(AT_CHECK_PUSHDEFS): AT_YYERROR_SEES_LOC_IF is positive if
-	lalr1.cc is used.
-	Adjust the C locations to match those from Emacs: first column is
-	column 0.
-	Change all the expected results.
-	Conform to the GCS: simplify the locations when applicable.
-	(LOC, VAL, YYLLOC_FORMAL, YYLLOC_ARG, USE_YYLLOC, LEX_FORMALS)
-	(LEX_ARGS, USE_LEX_ARGS, LEX_PRE_FORMALS, LEX_PRE_ARGS): Replace
-	these CPP macros with the m4 macros new defined by...
-	(AT_CHECK_PUSHDEFS): this, i.e.:
-	(AT_LALR1_CC_IF, AT_PURE_LEX_IF, AT_LOC, AT_VAL, AT_LEX_FORMALS)
-	(AT_LEX_ARGS, AT_USE_LEX_ARGS, AT_LEX_PRE_FORMALS, AT_LEX_PRE_ARGS)
-	New macros.
-	(AT_CHECK_POPDEFS): Undefine them.
-	(AT_CHECK_CALC_LALR1_CC): New.
-	Use it for the first lalr1.cc test.
-
-2003-02-04  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc (YYLLOC_DEFAULT): Fix its definition: be based on
-	Location as is defined.
-
-2003-02-04  Akim Demaille  <akim@epita.fr>
-
-	* data/lalr1.cc: If YYDEBUG is not defined, don't depend upon
-	name_ being defined.
-
-2003-02-03  Paul Eggert  <eggert@twinsun.com>
-
-	* src/gram.h (start_symbol): Remove unused decl.
-
-	Use more-consistent naming conventions for local vars.
-
-	* src/derives.c (derives_compute): Change type of local var from
-	int to rule_number.
-	* src/gram.c (grammar_rules_partial_print): Likewise.
-	* src/print.c (print_core): Likewise.
-	* src/reduce.c (reduce_grammar_tables): Likewise.
-
-	* src/gram.c (grammar_dump): Change name of item_number *
-	local var from r to rp.
-	* src/nullable.c (nullable_compute): Likewise.
-
-	* src/gram.h (ISTOKEN, ISVAR): Use i, not s, for int var.
-
-	* src/gram.h (symbol_number_as_item_number): Use sym, not s,
-	for symbol or symbol_number var.
-	* src/reader.c (grammar_start_symbol_set): Likewise.
-	* src/reader.h (grammar_start_symbol_set, grammar_symbol_append):
-	Likewise.
-	* src/state.c (transitions_to): Likewise.
-	* src/state.h: Likewise.
-	* src/tables.c (symbol_number_to_vector_number): Likewise.
-
-	* src/muscle_tab.h (MUSCLE_OBSTACK_SGROW): Use p, not s, for
-	char * var.
-
-	* src/parse-gram.y (lloc_default): Use loc, not r, for YYLTYPE
-	var.
-
-	* src/scan-gram.l (no_cr_read): Use bytes_read, not s, for size
-	var.
-
-	* src/system.h (xstrndup, strchr, strspn, strnlen, memchr, memrchr):
-	Use str, not s, for char * var.  Use ch, not c, for character var.
-	Use size for size var.
-
-	* src/uniqstr.c (uniqstr_new, uniqstr_assert): Use str, not s, for
-	char * var.
-	(uniqstr_print, uniqst_print_processor): Use ustr, not s, for
-	uniqstr var.
-	* src/uniqstr.h: Likewise.
-
-	* src/vcg.c (get_color_str, get_textmode_str, get_shape_str,
-	get_layoutalgorithm_str, get_decision_str, get_orientation_str,
-	get_node_alignment_str, get_arrow_mode_str, get_crossing_type_str,
-	get_view_str, get_linestyle_str, get_arrowstyle_str): Rename
-	param to have same name as that of enum, so that we don't use
-	"s" to stand for a non-state.
-
-2003-02-02  Akim Demaille  <akim@epita.fr>
-
-	* src/scan-skel.l: Scan more than one inert character per yylex
-	invocation.
-
-2003-02-01  Paul Eggert  <eggert@twinsun.com>
-
-	Version 1.875a.
-
-	* po/LINGUAS: Add ms.
-
-2003-01-30  Akim Demaille  <akim@epita.fr>
-
-	* doc/Makefile.am (CLEANFILES): Add bison.fns for distcheck.
-
-2003-01-29  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* tests/cxx-type.at: Correct apparent typo in Bison input: $$ instead
-	of $1.
-
-	Changes in response to error report by S. Eken: GLR mode does not
-	handle negative $ indices or $ indices in embedded rules correctly.
-	See <http://lists.gnu.org/archive/html/bug-bison/2003-01/msg00076.html>.
-
-	* data/glr.c (b4_rhs_value): Change to use YYFILL macro.
-	(b4_rhs_location): Ditto.
-	(yyfill): New function to copy from stack tree into array
-	incrementally.
-	(yyuserAction): Modify to allow incremental move of semantic values
-	to rhs array when in GLR mode.
-	Define YYFILL to use in user-defined actions to fill semantic array
-	as needed.
-	Remove dummy use of yystack, as there is now a guaranteed use.
-	(yydoAction): Modify to allow incremental move of semantic values
-	to rhs array when in GLR mode.
-	(yyresolveAction): Ditto.
-	(yyglrShiftDefer): Update comment.
-	(yyresolveStates): Use X == NULL for pointers, not !X.
-	(yyglrReduce): Ditto.
-	(yydoAction): Ditto
-
-	* tests/glr-regr1.at: Rename to ...
-	* tests/glr-regression.at: Add new regression test for the problems
-	described above (adapted from S. Eken).
-	Update copyright notice.
-	* tests/testsuite.at: Rename glr-regr1.at to glr-regression.at.
-	* tests/Makefile.am: Ditto.
-
-2003-01-28  Paul Eggert  <eggert@twinsun.com>
-
-	* data/lalr1.cc: Do not use @output_header_name@ unless
-	b4_defines_flag is set.  This fixes two bugs reported by
-	Tim Van Holder in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-01/msg00071.html>
-	and <http://lists.gnu.org/archive/html/bug-bison/2003-01/msg00073.html>.
-
-2003-01-21  Paul Eggert  <eggert@twinsun.com>
-
-	* data/yacc.c (YYERROR): Move code from yyerrlab1 to here, so that
-	we don't need to worry about yyerrlab1 being reported as an
-	"unused label" by non-GCC C compilers.  The downside is that if
-	locations are used then a couple of statements are duplicated each
-	time YYERROR is invoked, but the upside is that the warnings
-	should vanish.
-	(yyerrlab1): Move code to YERROR.
-	(yyerrlab2): Remove.  Change uses back to yyerrlab1.
-	This reverts some of the 2002-12-27 change.
-
-2003-01-17  Paul Eggert  <eggert@twinsun.com>
-
-	* src/output.c (symbol_printers_output): Fix typo that led
-	to core dump.  Problem reported by Antonio Rus in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-01/msg00058.html>.
-
-2003-01-13  Akim Demaille  <akim@epita.fr>,
-		Quoc Peyrot <chojin@lrde.epita.fr>,
-		Robert Anisko <anisko_r@lrde.epita.fr>
-
-	* data/lalr1.cc (parse::yyerrlab1): When popping the stack, stop
-	when the stacks contain one element, as the loop would otherwise
-	free the last state, and then use the top state (the one we just
-	popped).  This means that the initial elements will not be freed
-	explicitly, as is the case in yacc.c; it is not a problem, as
-	these elements have fake values.
-
-2003-01-11  Paul Eggert  <eggert@twinsun.com>
-
-	* NEWS: %expect-violations are now just warnings, reverting
-	to Bison 1.30 and 1.75 behavior.  This fixes the GCC 3.2
-	bootstrapping problem reported by Matthias Klose; see
-	<http://lists.gnu.org/archive/html/bug-bison/2003-01/msg00053.html>.
-	* src/conflicts.c (conflicts_print): Likewise.
-	* tests/conflicts.at (%expect not enough, %expect too much,
-	%expect with reduce conflicts): Likewise.
-	* doc/bison.texinfo (Expect Decl): Document this.  Also mention
-	that the warning is enabled if the number of conflicts changes
-	(not necessarily increases).
-
-	* src/getargs.c (version): Update copyright year.
-
-2003-01-09  Akim Demaille  <akim@epita.fr>
-
-	* src/Makefile.am, lib/Makefile.am: Use $(VAR) instead of @VAR@.
-
-2003-01-08  Paul Eggert  <eggert@twinsun.com>
-
-	* Makefile.maint (WGETFLAGS):
-	New macro, containing "-C off" to disable proxy caches.
-	All uses of $(WGET) changed to $(WGET) $(WGETFLAGS).
-	(rel-check): Use $(WGET) instead of wget.
-
-2003-01-06  Paul Eggert  <eggert@twinsun.com>
-
-	* doc/bison.texinfo (Generalized LR Parsing): Add a reference to
-	the GLR paper of Scott, Johnstone and Hussain.
-
-2003-01-04  Paul Eggert  <eggert@twinsun.com>
-
-	* configure.ac (AC_ARG_ENABLE): Add --disable-yacc.
-	(YACC_SCRIPT, YACC_LIBRARY): New vars to AC_SUBST.
-	* lib/Makefile.am (lib_LIBRARIES): liby.a -> @YACC_LIBRARY@.
-	(EXTRA_LIBRARIES): New var, for liby.a.
-	* src/Makefile.am (bin_SCRIPTS): yacc -> @YACC_SCRIPT@.
-	(EXTRA_SCRIPTS): New var, for yacc.
-
-	* data/yacc.c (yyerrlab1): Omit attribute if __cplusplus is defined,
-	since GNU C++ (as of 3.2.1) does not allow attributes on labels.
-	Problem reported by Nelson H. F. Beebe.
-
-2003-01-03  Paul Eggert  <eggert@twinsun.com>
-
-	* lib/obstack.h (__INT_TO_PTR) [__STDC__]: Cast result to
-	(void *) to avoid diagnostic with native c89 on SGI IRIX 6.5
-	when compiling Bison 1.875's `bitset bset = obstack_alloc
-	(bobstack, bytes);'.  Problem reported by Nelson H. F. Beebe.
-
-	* src/scan-skel.l (QPUTS): Omit redundant `;' from macro definition.
-	([^@\n]): Renamed from [^@\n]+ so that the token buffer does not
-	grow to a huge size with typical invocation.
-
-	* lib/hash.c (_Bool, bool, false, true, __bool_true_false_are_defined):
-	Use the pattern recommended by Autoconf 2.57, except also protect
-	against double-definition.
-	* src/system.h: Likewise.
-	Portability issues reported by Nelson H. F. Beebe.
-
-	* data/glr.c (yybool): Renamed from bool, to avoid collisions in C.
-	All uses changed.  Provide a definition in both C and C++.
-	(yytrue, yyfalse): Define even if defined (__cplusplus).
-
-	* lib/bitset_stats.c (bitset_stats_list): Remove unused var.
-	Reported by Nelson H. F. Beebe.
-
-	* src/scan-skel.l ("@oline@"): Output lineno+1, not lineno.
-
-2003-01-02  Paul Eggert  <eggert@twinsun.com>
-
-	* data/yacc.c (yyerrlab1): Append `;' after attribute, to
-	pacify the buggy "smart preprocessor" in MacOS 10.2.3.
-	Bug reported by Nelson H. F. Beebe.
-
-2003-01-01  Paul Eggert  <eggert@twinsun.com>
-
-	* Version 1.875.
-
-2002-12-30  Paul Eggert  <eggert@twinsun.com>
-
-	* src/scan-gram.l (<INITIAL,SC_AFTER_IDENTIFIER,SC_PRE_CODE>","):
-	Moved here from...
-	(<INITIAL>","): Here.  This causes stray "," to be treated
-	more uniformly.
-
-	* src/scan-gram.l (<SC_BRACED_CODE>"}"): Output ";" before the
-	last brace in braced code when not in Yacc mode, for compatibility
-	with Bison 1.35.  This resurrects the 2001-12-15 patch to
-	src/reader.c.
-
-	* src/reader.h (YYDECL): Use YYSTYPE, not its deprecated alias
-	yystype.  This follows up the 2002-12-24 YYSTYPE bug fix.
-
-2002-12-28  Paul Eggert  <eggert@twinsun.com>
-
-	* src/symtab.c (symbol_make_alias): Set type of SYMVAL to be
-	that of SYM's type.  This fixes Debian bug 168069, reported by
-	Thomas Olsson.
-
-2002-12-28  Paul Eggert  <eggert@twinsun.com>
-
-	Version 1.75f.
-
-	Switch back to the Yacc style of conflict reports, undoing some
-	of the 2002-07-30 change.
-	* doc/bison.texinfo (Understanding): Use Yacc style for
-	conflict reports.  Also, use new way of locating rules.
-	* src/conflicts.c (conflict_report):
-	Renamed from conflict_report_yacc, removing the old
-	'conflict_report'.  Translate the entire conflict report at once,
-	so that we don't assume that "," has the same interpretation in
-	all languages.
-	(conflicts_output): Use Yacc-style conflict report for each state,
-	instead of our more-complicated style.
-	(conflicts_print): Use Yacc-style conflict report, except print
-	the input file name when not emulating Yacc.
-	* tests/conflicts.at (Unresolved SR Conflicts, Defaulted
-	Conflicted Reduction, %expect not enough, %expect too much,
-	%expect with reduce conflicts): Switch to Yacc-style conflict reports.
-	* tests/existing.at (GNU Cim Grammar): Likewise.
-	* tests/glr-regr1.at (Badly Collapsed GLR States): Likewise.
-
-	* src/complain.c (warn_at, warn, complain_at, complain, fatal_at,
-	fatal): Don't invoke fflush; it's not needed and it might even be
-	harmful for stdout, as stdout might not be open.
-	* src/reduce.c (reduce_print): Likewise.
-
-2002-12-27  Paul Eggert  <eggert@twinsun.com>
-
-	Fix a bug where error locations were not being recorded correctly.
-	This problem was originally reported by Paul Hilfinger in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00086.html>.
-
-	* data/yacc.c (yyparse): New local var yylerrsp, to record the
-	top of the location stack's error locations.
-	(yyerrlab): Set it.  When discarding a token, push its location
-	onto yylerrsp so that we don't lose track of the error's end.
-	(yyerrlab1): Now is only the target of YYERROR, so that we can
-	properly record the location of the action that failed.  For GCC
-	2.93 and later, insert an __attribute__ ((__unused__)) to avoid
-	GCC warning about yyerrlab1 being unused if YYERROR is unused.
-	(yyerrlab2): New label, which yyerrlab now falls through to.
-	Compute the error's location by applying YYLLOC_DEFAULT to
-	the locations of all the symbols that went into the error.
-	* doc/bison.texinfo (Location Default Action): Mention that
-	YYLLOC_DEFAULT is also invoked for syntax errors.
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR):
-	Error locations include the locations of all the tokens that were
-	discarded, not just the last token.
-
-2002-12-26  Paul Eggert  <eggert@twinsun.com>
-
-	* src/files.c: Include quote.h.
-	(compute_output_file_names): Warn if we detect conflicting
-	outputs to the same file.  This should catch the misunderstanding
-	exemplified by Debian Bug 165349, reported by Bruce Stephens..
-
-	* src/conflicts.c (conflicts_print): If the user specifies
-	"%expect N", report an error if there are any reduce/reduce
-	conflicts.  This is what the manual says should happen.
-	This fixes Debian bug 130890, reported by Anthony DeRobertis.
-	* tests/conflicts.at (%expect with reduce conflicts): New test.
-
-	Don't use m4_include on relative file names, as it doesn't work as
-	desired if there happens to be a file with that name under ".".
-
-	* m4sugar/version.m4: Remove; it was included but it wasn't used.
-	* data/Makefile.am (dist_m4sugar_DATA): Remove m4sugar/version.m4.
-	* data/m4sugar/m4sugar.m4: Don't include m4sugar/version.m4.
-	* data/glr.c, data/lalr1.cc, data/yacc.c: Don't include c.m4.
-	* src/output.c (output_skeleton): Use full path names when
-	specifying a file to include; don't rely on include path, as
-	it's unreliable when the working file contains a file with
-	that name.
-
-2002-12-25  Paul Eggert  <eggert@twinsun.com>
-
-	Remove obsolete references to bison.simple and bison.hairy.
-	Problem mentioned by Aubin Mahe in
-	<http://lists.gnu.org/archive/html/help-bison/2002-12/msg00010.html>.
-	* data/glr.c: Comment fix.
-	* doc/bison.1: Remove references.  Also, mention "yacc".
-
-	* src/getargs.c (getargs) [MSDOS]: Don't assume optarg != NULL
-	with -g option.
-
-	* src/parse-gram.y (declaration): Use enum "report_states" rather
-	than its numeric value 1.
-
-	* src/scan-skel.l ("@output ".*\n): Close any old yyout before
-	opening a new one.  This fixes Debian bug 165349, reported by
-	Bruce Stephens.
-
-2002-12-24  Paul Eggert  <eggert@twinsun.com>
-
-	Version 1.75e.
-
-	* Makefile.maint (cvs-update): Don't assume that the shell
-	supports $(...), as Solaris sh doesn't.
-
-	* src/parse-gram.y (lloc_default): Remove test for empty
-	nonterminals at the end, since it didn't change the result.
-
-2002-12-24  Paul Eggert  <eggert@twinsun.com>
-
-	If the user does not define YYSTYPE as a macro, Bison now declares it
-	using typedef instead of defining it as a macro.  POSIX requires this.
-	For consistency, YYLTYPE is also declared instead of defined.
-
-	%union directives can now have a tag before the `{', e.g., the
-	directive `%union foo {...}' now generates the C code
-	`typedef union foo { ... } YYSTYPE;'; this is for Yacc compatibility.
-	The default union tag is `YYSTYPE', for compatibility with Solaris 9
-	Yacc.  For consistency, YYLTYPE's struct tag is now `YYLTYPE'
-	instead of `yyltype'.
-
-	`yystype' and `yyltype' are now obsolescent macros instead of being
-	typedefs or tags; they are no longer documented and will be
-	withdrawn in a future release.
-
-	* data/glr.c (b4_location_type): Remove.
-	(YYSTYPE): Renamed from yystype.
-	(YYSTYPE_IS_DECLARED): New macro, used to prevent double-typedef.
-	(struct YYLTYPE): Renamed from struct yyltype.
-	(YYLTYPE): Renamed from yyltype.
-	(yyltype, yystype): New (and obsolescent) macros,
-	for backward compatibility.
-	* data/yacc.c: Likewise.
-
-	* data/yacc.c (YYSTYPE): Declare as union YYSTYPE if the user
-	does not specify a union tag.  This is for compatibility with
-	Solaris 9 yacc.
-
-	* src/parse-gram.y (add_param): 2nd arg is now char * not char
-	const *, since it is now modified by stripping surrounding { }.
-	(current_braced_code): Remove.
-	(PERCENT_DESTRUCTOR, PERCENT_PRINTER, PERCENT_UNION,
-	PERCENT_LEX_PARAM, PERCENT_PARSE_PARAM): Change names to include
-	trailing " {...}".  Now of type <chars>.
-	(grammar_declaration): Adjust to bundled tokens.
-	(code_content): Remove; stripping is now done by add_param.
-	(print_token_value): Print contents of bundled tokens.
-	(token_name): New function.
-
-	* src/reader.h (braced_code, current_braced_code): Remove.
-	(token_name): New decl.
-
-	* src/scan-gram.l (handle_dollar, handle_at): Now takes int
-	token_type, not braced_code code_kind.  All uses changed.
-	(SC_PRE_CODE): New state, for scanning after a keyword that
-	has (or usually has) an immediately-following braced code.
-	(token_type): New local var, to keep track of which token type
-	to return when scanning braced code.
-	(<INITIAL>"%destructor", <INITIAL>"%lex-param",
-	<INITIAL>"%parse-param", <INITIAL>"%printer",
-	<INITIAL>"%union"): Set token type and BEGIN SC_PRE_CODE
-	instead of returning a token type immediately.
-	(<INITIAL>"{"): Set token type.
-	(<SC_BRACED_CODE>"}"): Use it.
-	(handle_action_dollar, handle_action_at): Now returns bool
-	indicating success.  Fail if ! current_rule; this prevents a core dump.
-	(handle_symbol_code_dollar, handle_symbol_code_at):
-	Remove; merge body into caller.
-	(handle_dollar, handle_at): Complain in invalid contexts.
-
-	* NEWS, doc/bison.texinfo: Document the above.
-	* NEWS: Fix years and program names in copyright notice.
-
-2002-12-17  Paul Eggert  <eggert@twinsun.com>
-
-	* NEWS, doc/bison.texinfo (Parser Function, Pure Calling, Error
-	Reporting, Table of Symbols): Omit mentions of %lex-param and
-	%parse-param from the documentation for now.
-
-2002-12-15  Paul Eggert  <eggert@twinsun.com>
-
-	Undo most of the 2002-11-12 yychar -> yytoken patch, as it broke
-	GCC 3.2.1 (which depends on yychar == YYEMPTY when there is no
-	lookahead symbol, and which sets yychar in parser actions) and it
-	disagreed with the Bison documentation.  Bug
-	reported by Andrew Walrond.
-
-	* data/yacc.c (YYTRANSLATE): Don't check for negative argument,
-	as the caller now does that.
-	(yyclearin, YYBACKUP, yyparse): Use yychar, not yytoken.
-	(YYEMPTY): Parenthesize right hand side, since others use it.
-	(yyparse): Don't assume that our generated code is the only code
-	that sets yychar.
-
-2002-12-13  Paul Eggert  <eggert@twinsun.com>
-
-	Version 1.75d.
-
-	POSIX requires a "yacc" command.
-	* src/Makefile.am (bin_SCRIPTS): New macro, for yacc.
-	(MOSTLYCLEANFILES): Add yacc.
-	(yacc): New rule.
-	* doc/bison.texinfo (Invocation, Bison Options): Mention yacc
-	as an alias for bison y.
-
-	* po/LINGUAS: Add da.
-
-	* src/getargs.c (__GNU_LIBRARY__) [lint]: Define to work around
-	problem with latest <getopt.h>.
-	(HACK_FOR___GNU_LIBRARY___PROTOTYPE): New macro.
-
-	* doc/fdl.texi: Upgrade to 1.2.
-	* lib/alloca.c, lib/error.c, lib/getopt.c, lib/getopt.h
-	lib/getopt1.c, lib/gettext.h, lib/memrchr.c, lib/obstack.c,
-	lib/obstack.h, lib/strnlen.c, lib/unlocked-io.h: Sync with
-	gnulib.
-	* config/install-sh: Sync with autotools.
-
-	Fix a bad interaction with flex 2.5.23 reported by Bruce Lilly in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00114.html>.
-	* data/yacc.c (YYLTYPE, struct yyltype): Do not define unless
-	locations are requested.
-	(union yyalloc): Do not depend on YYLTYPE_IS_TRIVIAL unless
-	locations are requested.
-
-2002-12-12  Paul Eggert  <eggert@twinsun.com>
-
-	Remove unportable casts and storage allocation tricks.
-	While we're at it, remove almost all casts, since they
-	usually aren't needed and are a sign of trouble.
-
-	* configure.ac (AC_CHECK_TYPES): Check for uintptr_t.
-
-	* src/derives.c (derives_compute): Do not subtract NTOKENS from
-	the pointer DSET returned by malloc; this isn't portable.
-	Instead, always use DSET[i - NTOKENS] rather than DSET[i].
-	Similarly for DERIVES.
-	* src/lalr.c (set_goto_map): Likewise, for GOTO_MAP and TEMP_MAP.
-	* src/nullable.c (nullable_compute): Likewise, for RSETS and NULLABLE.
-	* src/reduce.c (reduce_grammar_tables): Likewise, for nontermmap
-
-	* src/derives.c (derives_compute): Do not bother invoking
-	int_of_rule_number, since rule numbers are integers.
-
-	* src/files.c (concat2, tr, compute_base_name): Use xmalloc (N)
-	rather than XMALLOC (char, N).
-
-	* src/files.c (filename_split): Rewrite to avoid cast.
-
-	* src/gram.h (symbol_number_as_item_number,
-	item_number_as_symbol_number, rule_number_as_item_number,
-	item_number_as_rule_number):
-	Now inline functions rather than macros, to avoid casts.
-	* src/state.h (state_number_as_int): Likewise.
-	* src/tables.c (state_number_to_vector_number,
-	symbol_number_to_vector_number): Likewise.
-
-	* src/gram.h (int_of_rule_number): Remove; no longer used.
-
-	* src/lalr.c (add_lookback_edge): Use malloc rather than calloc,
-	since the resulting storage is always stored into.
-
-	* src/main.c (alloca) [C_ALLOCA]: Add decl here, the only place
-	where it's needed.
-
-	* src/muscle_tab.c (muscle_m4_output):
-	Now inline.  Return bool, not int.
-	* src/state.c (state_compare): Likewise.
-	* src/symtab.c (symbol_check_defined,
-	symbol_check_alias_consistency, symbol_pack, symbol_translation,
-	hash_compare_symbol, hash_symbol):
-	Likewise.
-	* src/uniqstr.c (uniqstr_print): Likewise.
-	* src/muscle_tab.c (muscle_m4_output_processor):
-	New function, to avoid casts.
-	* src/state.c (state_comparator, stage_hasher): Likewise.
-	* src/symtab.c (symbol_check_defined_processor,
-	symbol_check_alias_consistency_processor, symbol_pack_processor,
-	symbol_translation_processor, hash_symbol_comparator,
-	hash_symbol_hasher): Likewise.
-	* src/uniqstr.c (uniqstr_print_processor): Likewise.
-	* src/muscle_tab.c (muscles_m4_output):
-	Use new functions instead of casting old functions unportably.
-	* src/state.c (state_hash_new): Likewise.
-	* src/symtab.c (symbols_new, symbols_do, symbols_check_defined,
-	symbols_token_translations_init):
-	Likewise.
-	* src/uniqstr.c (uniqstrs_new, hash_initialize, uniqstrs_do): Likewise.
-
-	* src/output.c (GENERATE_MUSCLE_INSERT_TABLE): Use long local
-	var instead of casting to long, to avoid casts.
-	(prepare_states): Use MALLOC rather than alloca, so that we don't
-	have to worry about alloca.
-	* src/state.c (state_hash_lookup): Likewise.
-
-	* src/scan-gram.l (<SC_ESCAPED_CHARACTER>"'"): Use unsigned char
-	local var instead of casting to unsigned char, to avoid casts.
-
-	* src/state.c (TRANSITIONS_ALLOC, ERRS_ALLOC, REDUCTIONS_ALLOC,
-	STATE_ALLOC): Remove.
-	(transitions_new, errs_new, reductions_new, state_new): Use malloc
-	rather than calloc, and use offsetof to avoid allocating slightly
-	too much storage.
-	(state_new): Initialize all members.
-
-	* src/state.c (state_hash): Use unsigned accumulator, not signed.
-
-	* src/symtab.c (symbol_free): Remove; unused.
-	(symbol_get): Remove cast in lhs of assignment.
-	(symbols_do): Now static.  Accept generic arguments, not
-	hashing-related ones.
-
-	* src/symtab.h: (NUMBER_UNDEFINED): Remove unnecessary cast.
-	(symbol_processor): Remove.
-	(symbols_do): Remove decl; now static.
-
-	* src/system.h (alloca): Remove; decl no longer needed.
-	(<stddef.h>): Include, for offsetof.
-	(<inttypes.>, <stdint.h>): Include if available.
-	(uintptr_t): New type, if system lacks it.
-	(CALLOC, MALLOC, REALLOC): New macros.
-	All uses of XCALLOC, XMALLOC, and XREALLOC changed to use these
-	new macros.
-
-	* src/tables.c (table_size): Now int, to pacify GCC.
-	(table_grow, table_ninf_remap): Use signed table size.
-	(save_row): Don't bother initializing locals when not needed.
-	(default_goto, goto_actions, pack_vector): Remove unnecessary casts.
-	* src/uniqstr.c (hash_compare_uniqstr):  Likewise.
-
-	* src/vcg.h: Correct misspellings.
-
-	* src/vcg_defaults.h (G_CMAX): Now INT_MAX.
-
-
-	* src/getargs.c (getargs): Don't assume EOF == -1.
-
-2002-12-09  Paul Eggert  <eggert@twinsun.com>
-
-	Change identifier spellings to avoid collisions with names
-	that are reserved by POSIX.
-
-	Don't use names ending in _t, since POSIX reserves them.
-	For consistency, remove _e and _s endings -- they're weren't
-	needed to remove ambiguity.  All uses changed.
-	* src/uniqstr.h (uniqstr): Renamed from uniqstr_t, which in
-	turn was just renamed from struniq_t.
-	* src/uniqstr.c (uniqstr_processor): Renamed from struniq_processor,
-	which in turn was just renamed from struniq_processor_t.
-	(hash_compare_uniqstr): Renamed from hash_compare_struniq, which
-	in turn was renamed from hash_compare_struniq_t.
-	* src/LR0.c (struct state_list): Renamed from struct state_list_s.
-	(state_list): Renamed from state_list_t.
-	* src/assoc.h (assoc): Renamed from assoc_t.
-	* src/conflicts.c (enum conflict_resolution): Renamed from
-	enum conflict_resolution_e.
-	* src/derives.c (struct rule_list): Renamed from struct rule_list_s.
-	(rule_list): Renamed from rule_list_t.
-	* src/getargs.h (enum trace): Renamed from enum trace_e.
-	(enum report): Renamed from enum report_e.
-	* src/gram.h (item_number): Renamed from item_number_t.
-	(rule_number): Renamed from rule_number_t.
-	(struct rule_s): Remove the "rule_s" part; not used.
-	(rule): Renamed from rule_t.
-	(rule_filter): Renamed from rule_filter_t.
-	* src/lalr.c (struct goto_list): Renamed from struct goto_list_s.
-	(goto_list): Renamed from goto_list_t.
-	* src/lalr.h (goto_number): Renamed from goto_number_t.
-	* src/location.h (location): Renamed from location_t.
-	* src/muscle_tab.c (muscle_entry): Renamed from muscle_entry_t,
-	and moved here from:
-	* src/muscle_tab.h (muscle_entry_t): here.
-	* src/nullable.c (struct rule_list): Renamed from struct rule_list_s.
-	(rule_list): Renamed from rule_list_t.
-	* src/print_graph.c (static_graph): Renamed from graph.
-	* src/reader.h (braced_code): Renamed from braced_code_t.
-	Remove brace_code_e tag.
-	* src/relation.h (relation_node): Renamed from relation_node_t.
-	(relation_nodes): Renamed from relation_nodes_t.
-	(relation): Renamed from relation_t.
-	* src/state.h (state_number): Renamed from state_number_t.
-	(struct state): Renamed from struct state_s.
-	(state): Renamed from state_t.
-	(transitions): Renamed from transitions_t.  Unused (and
-	misspelled) transtion_s tag removed.
-	(errs): Renamed from errs_t.  Unused errs_s tag removed.
-	(reductions): Renamed from reductions_t.  Unused tag
-	reductions_s removed.
-	* src/symlist.h (symbol_list): Renamed from symbol_list_t.
-	(struct symbol_list): Renamed from struct symbol_list_s.
-	* src/symtab.h (symbol_number): Renamed from symbol_number_t.
-	(struct symbol): Renamed from struct symbol_s.
-	(symbol): Renamed from symbol_t.
-	* src/tables.c (vector_number): Renamed from vector_number_t.
-	(action_number): Renamed from action_t.
-	* src/tables.h (base_number): Renamed from base_t.
-	* src/vcg.h (enum color): Renamed from enum color_e.
-	(enum textmode): Renamed from enum textmode_e.
-	(enum shape): Renamed from enum shape_e.
-	(struct colorentry): Renamed from struct colorentry_s.
-	(struct classname): Renamed from struct classname_s.
-	(struct infoname): Renamed from struct infoname_s.
-	(enum layoutalgorithm): Renamed from enum layoutalgorithm_e.
-	(enum decision): Renamed from enum decision_e.
-	(enum orientation): Renamed from enum orientation_e.
-	(enum alignment): Renamed from enum alignment_e.
-	(enum arrow_mode): Renamed from enum arrow_mode_e.
-	(enum crossing_type): Renamed from enum crossing_type_e.
-	(enum view): Renamed from enum view_e.
-	(struct node): Renamed from struct node_s.
-	(node): Renamed from node_t.
-	(enum linestyle): Renamed from enum linestyle_e.
-	(enum arrowstyle): Renamed from enum arrowstyle_e.
-	(struct edge): Renamed from struct edge.
-	(edge): Renamed from edge_t.
-	(struct graph): Renamed from struct graph_s.
-	(graph): Renamed from graph_t.
-	* tests/calc.at (_AT_DATA_CALC_Y, Simple LALR Calculator):
-	Rename value_t -> value.
-	* tests/input.at (Torturing the Scanner): Rename value_t -> value,
-	value_t_as_yystype -> value_as_yystype.
-
-	Don't include <errno.h> in the mainstream code, since it
-	reserves E[A-Z0-9]* and we want to use symbols like 'EQUALS'.
-	* lib/get-errno.c, lib/get-errno.h: New files.
-	* lib/Makefile.am (libbison_a_SOURCES): Add get-errno.h,
-	get-errno.c.
-	* src/files.c (xfopen, xfclose): Use get_errno instead of errno.
-	* src/output.c (output_skeleton): Likewise.
-	* src/scan-gram.l (<INITIAL>{int}): Use set_errno and get_errno
-	instead of errno.
-	(<SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>\\x[0-9abcdefABCDEF]+):
-	Likewise.
-	(handle_action_dollar, handle_action_at): Likewise.
-	* src/system.h: Do not include <errno.h>.
-	(TAB_EXT): Renamed from EXT_TAB.
-	(OUTPUT_EXT): Renamed from EXT_OUTPUT.
-
-	Avoid str[a-z]*, since <string.h> reserves that name space.
-	Change all instances of "struniq" in names to "uniqstr", and
-	likewise for "STRUNIQ" and "UNIQSTR".
-	* src/uniqstr.c: Renamed from src/struniq.c.
-	* src/uniqstr.h: Renamed from src/struniq.h.
-	* src/Makefile.am (bison_SOURCES): Adjust to these renamings.
-	* src/files.c (strsuffix): Remove; unused.
-	(concat2): Renamed from stringappend.  Now static.
-	* src/files.h (strsuffix, stringappend): Remove; unused.
-	* src/parse-gram.y (<chars>): Renamed from <string>.
-	(<uniqstr>): Renamed from <struniq>.
-	* src/scan-gram.l (obstack_for_string): Renamed from string_obstack.
-	* src/vcg.h (struct node_s.expand): Renamed from struct node_s.stretch.
-	(struct graph_s.expand): Renamed from struct graph_s.stretch.
-	* src/vcg_defaults.h (G_EXPAND): Renamed from G_STRETCH.
-	(G_LONG_STRAIGHT_PHASE): Renamed from G_STRAIGHT_PHASE.
-	(N_EXPAND): Renamed from N_STRETCH.
-
-	Avoid *_MAX and *_MIN, since <limits.h> reserves that name space.
-	* data/yacc.c (YYSTACK_GAP_MAXIMUM): Renamed from YYSTACK_GAP_MAX.
-	* src/gram.h (ITEM_NUMBER_MAX, ITEM_NUMBER_MIN, RULE_NUMBER_MAX):
-	Remove; unused.
-	* src/lalr.h (GOTO_NUMBER_MAXIMUM): Renamed from GOTO_NUMBER_MAX.
-	* src/state.h (STATE_NUMBER_MAXIMUM): Renamed from STATE_NUMBER_MAX.
-	* src/symtab.h (SYMBOL_NUMBER_MAXIMUM): Renamed from SYMBOL_NUMBER_MAX.
-	* src/tables.c (VECTOR_NUMBER_MAX, VECTOR_NUMBER_MIN): Remove; unused.
-	(BASE_MAXIMUM): Renamed from BASE_MAX.
-	(BASE_MINIMUM): Renamed from BASE_MIN.
-	(ACTION_MAX): Remove; unused.
-	(ACTION_NUMBER_MINIMUM): Renamed from ACTION_MIN.
-	Unnecessary casts removed from above defines.
-
-
-	Fix misspelling in names.
-	* src/vcg.h (enum_alignment_e): Renamed from enum_alignement_e.
-	* src/vcg_defaults.h (G_NODE_ALIGNMENT): Renamed from
-	G_NODE_ALIGNEMENT.
-
-
-	* lib/timevar.c (timevar_report): Renamed from time_report,
-	for consistency with other names.
-	* lib/timevar.h (timevar_report): New decl.
-	* src/system.h (time_report): Remove; decl is now in lib/timevar.h.
-
-
-	Sort include-file uses.
-
-	Reorder all include files under src to be in the order "system.h".
-	then the ../lib include files in angle brackets (alphabetized),
-	then the . include files in double-quotes (alphabetized).  Fix
-	dependency breakages encountered in this process, as follows:
-	* src/closure.h, src/derives.h, src/state.h: Include "gram.h".
-	* src/complain.c: Don't include stdlib.h, string.h _LIBC stuff.
-	* src/state.h: Include "symtab.h".
-
-2002-12-08  Paul Eggert  <eggert@twinsun.com>
-
-	* data/glr.c, data/lalr1.cc, data/yacc.c: Do not use __file__,
-	since this causes problems when __file__ contains character
-	sequences like "@" that are treated specially by src/scan-skel.l.
-	Instead, just use the file's basename.  This fixes the bug
-	reported by Martin Mokrejs in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-12/msg00007.html>.
-
-2002-12-06  Paul Eggert  <eggert@twinsun.com>
-
-	Add support for rules that do not have trailing semicolons, as
-	POSIX requires.  Improve the quality of locations in Bison
-	diagnostics.
-
-	* src/location.c: Include <quotearg.h>.
-	(empty_location): Now const.
-	(location_print): New function.  Follow the recommendation of the
-	GNU Coding Standards for locations that span file boundaries.
-	* src/location.h: Do not include <quotearg.h>; no longer needed.
-	(boundary): New type.
-	(location_t): Use it.  This allows locations to span file boundaries.
-	All member uses changed: file -> start.file or end.file (as needed),
-	first_line -> start.line, first_column -> start.column,
-	last_line -> end.line, last_column -> end.column.
-	(equal_boundaries): New function.
-	(LOCATION_RESET, LOCATION_STEP): Remove.
-	(LOCATION_PRINT): Remove.  All callers changed to use location_print.
-	(empty_location): Now const.
-	(location_print): New decl.
-	* src/parse-gram.y (lloc_default): New function, which handles
-	empty locations more accurately.
-	(YYLLOC_DEFAULT): Use it.
-	(%token COLON): Remove.
-	(%token ID_COLON): New token.
-	(rules): Use it.
-	(declarations, rules): Remove trailing semicolon.
-	(declaration, rules_or_grammar_declaration):
-	Allow empty (";") declaration.
-	(symbol_def): Remove empty actions; no longer needed.
-	(rules_or_grammar_declaration): Remove trailing semicolon.
-	(semi_colon.opt): Remove.
-	* src/reader.h: Include location.h.
-	(scanner_cursor): New decl.
-	* src/reduce.c (nonterminals_reduce): Use warn_at rather than
-	rolling our own.
-	* src/scan-gram.l (YY_USER_INIT): Initialize scanner_cursor instead
-	of *loc.
-	(STEP): Remove.  No longer needed, now that adjust_location does
-	the work.  All uses removed.
-	(scanner_cursor): New var.
-	(adjust_location): Renamed from extend_location.  It now sets
-	*loc and adjusts the scanner cursor.  All uses changed.
-	Don't bother testing for CR.
-	(handle_syncline): Remove location arg; now updates scanner cursor.
-	All callers changed.
-	(unexpected_end_of_file): Now accepts start boundary of token or
-	comment, not location.  All callers changed.  Update scanner cursor,
-	not the location.
-	(SC_AFTER_IDENTIFIER): New state.
-	(context_state): Renamed from c_context.  All uses changed.
-	(id_loc, code_start, token_start): New local vars.
-	(<INITIAL,SC_AFTER_IDENTIFIER>): New initial context.  Move all
-	processing of Yacc white space and equivalents here.
-	(<INITIAL>{id}): Save id_loc.  Begin state SC_AFTER_IDENTIFIER
-	instead of returning ID immediately, since we need to search for
-	a subsequent colon.
-	(<INITIAL>"'", "\""): Save token_start.
-	(<INITIAL>"%{", "{", "%%"): Save code_start.
-	(<SC_AFTER_IDENTIFIER>): New state, looking for a colon.
-	(<SC_YACC_COMMENT>, <SC_COMMENT>, <SC_LINE_COMMENT>):
-	BEGIN context_state at end, not INITIAL.
-	(<SC_ESCAPED_STRING>"\"", <SC_ESCAPED_CHARACTER>"'",
-	<SC_BRACED_CODE>"}", <SC_PROLOGUE>"%}", <SC_EPILOGUE><<EOF>>):
-	Return correct token start.
-	(<SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE>): Save start boundary when
-	the start of a character, string or multiline comment is found.
-	* tests/conflicts.at (S/R in initial, Defaulted Conflicted
-	Reduction): Adjust reported locations to match the more-precise
-	results now expected.
-	* tests/input.at (Invalid $n, Invalid @n, Type Clashes): Likewise.
-	* tests/reduce.at (Useless Rules, Reduced Automaton,
-	Underivable Rules): Likewise.
-	* tests/regression.at (Invalid inputs): No longer `expecting ";"
-	or "|"' now that so many other tokens are allowed by the new grammar.
-
-	* src/complain.h (current_file): Remove duplicate decl;
-	current_file is now owned by files.h.
-	* src/complain.c, src/scan-gram.l: Include files.h.
-
-2002-12-06  Paul Eggert  <eggert@twinsun.com>
-
-	* data/glr.c (yy_reduce_print): Don't assume that yyrline[yyrule]
-	promotes to int; it might be unsigned int.
-	* data/yacc.c (yy_reduce_print): Likewise.
-
-	* doc/bison.texinfo (Table of Symbols): YYERROR_VERBOSE should
-	be #defined in the prologue, not in the Bison declarations.
-	This fixes Debian Bug 102878, reported by Shaul Karl.
-
-2002-12-02  Paul Eggert  <eggert@twinsun.com>
-
-	* configure.ac (AC_REPLACE_FUNCS): Add strtoul.
-	* lib/strtoul.c: New file, from gnulib.
-	This fixes a porting bug reported by Peter Klein in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-12/msg00000.html>.
-
-2002-11-30  Paul Eggert  <eggert@twinsun.com>
-
-	* src/scan-gram.l (no_cr_read, extend_location): Move to epilogue,
-	and put only a forward declaration in the prologue.  This is for
-	consistency with the other scanner helper functions.
-
-	Type clashes now generate warnings, not errors, since it
-	appears that POSIX may allow some grammars with type clashes.
-	* src/reader.c (grammar_current_rule_check): Warn about
-	type clashes instead of complaining.
-	* tests/input.at (Type Clashes): Expect warnings, not complaints.
-
-	Add Yacc library, since POSIX requires it.
-	* doc/bison.texinfo (Yacc Library): New node.  Regenerate top menu.
-	* lib/Makefile.am (lib_LIBRARIES, liby_a_SOURCES): New macros.
-	* lib/main.c, lib/yyerror.c: New files.
-
-	gram_error can be static; it need not be extern.
-	* src/reader.h (gram_error): Remove decl.
-	* src/parse-gram.y (gram_error): Now static.  Add static decl.
-	(print_token_value): Omit parameter names from forward decl,
-	for consistency.
-
-2002-11-29  Paul Eggert  <eggert@twinsun.com>
-
-	* doc/bison.texinfo: Emphasize that yylex and yyerror must
-	be declared before being used.  E.g., one should typically
-	declare them in the prologue.  Use GNU coding style in examples.
-	Put "const" consistently after the type it modifies.  Mention
-	that C99 supports "inline".  Mention that yyerror traditionally
-	returns "int".
-
-	%parse-param and %lex-param now take just one argument, the
-	declaration; the argument name is deduced from the declaration.
-
-	* doc/bison.texinfo (Parser Function, Pure Calling, Error
-	Reporting, Table of Symbols): Document this.
-	* src/parse-gram.y (add_param): New function.
-	(COMMA): Remove.
-	(declaration): Implement new rule for %parse-param and %lex-param.
-	* src/scan-gram.l: "," now elicits a warning, rather than being
-	a token; this is more compatible with byacc.
-	* tests/calc.at (Simple LALR Calculator): Adopt new convention.
-
-2002-11-27  Paul Eggert  <eggert@twinsun.com>
-
-	Rename identifiers to avoid real and potential collisions.
-
-	* data/c.m4 (b4_yysymprint_generate): yyout -> yyoutput,
-	to avoid collision with lex macro described by Bruce Lilly in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00114.html>.
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Likewise.
-	* doc/bison.texinfo (Prologue, Tracing): yyprint -> print_token_value.
-	* src/parse-gram.y (print_token_value): Renamed from yyprint.
-	All uses changed.
-	(YYPARSE_PARAM, YYLEX_PARAM, yycontrol): Remove.  All uses changed.
-	The name "yycontrol" violates the name space rules, and this stuff
-	wasn't being used anyway.
-	(input): Remove action; this stuff wasn't being used.
-	(gram_error): Rename local variable yylloc -> loc.
-	* src/reader.h (struct gram_control_s, gram_control_t): Remove.
-	(YY_DECL): Don't use "yy" at start of local variables.
-	All uses changed, e.g., yylloc -> loc.
-	* src/scan-gram.l (STEP): Renamed from YY_STEP.  All uses changed.
-	(STRING_GROW): Renamed from YY_OBS_GROW.  All uses changed.
-	(STRING_FINISH): Renamed from YY_OBS_FINISH.  All uses changed.
-	(STRING_FREE): Renamed from YY_OBS_FREE.  All uses changed.
-
-	* src/parse-gram.y (gram_error): loc is now const *.
-	* src/reader.h (gram_error): Likewise.
-
-2002-11-24  Paul Eggert  <eggert@twinsun.com>
-
-	Version 1.75c.
-
-	* tests/actions.at (Actions after errors): Use an output format
-	more similar to that of the Printers and Destructors test.
-	Test the position of the ';' token too.
-	(Printers and Destructors): Likewise.
-	(Printers and Destructors: %glr-parser): Remove for now, to avoid
-	unnecessarily alarming people when the test fails.
-
-	* data/yacc.c (yyerrlab1): Move this label down, so that the
-	parser does not discard the lookahead token if the user code
-	invokes YYERROR.  This change is required for POSIX conformance.
-
-	* lib/error.c: Sync with gnulib.
-
-2002-11-22  Paul Eggert  <eggert@twinsun.com>
-
-	* lib/quotearg.c, lib/quotearg.h: Sync with gnulib.
-	* lib/mbswidth.c, lib/mbswidth.h: Likewise.
-	* lib/xmalloc.c: Likewise.
-
-2002-11-20  Paul Eggert  <eggert@twinsun.com>
-
-	* lib/argmatch.c, lib/argmatch.h: Sync with gnulib.
-
-2002-11-20  Paul Eggert  <eggert@twinsun.com>
-
-	Avoid use of <assert.h>, as the GNU Coding Standards hint that one
-	should use `if (! x) abort ();' rather than `assert (x);', and
-	anyway it's one less thing to worry about configuring.
-
-	* data/glr.c, lib/hash.c, src/system.h: Do not include <assert.h>.
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Likewise,
-	and replace all instances of assert with abort.
-	* tests/calc.at (_AT_DATA_CALC_Y): Likewise.
-	* tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Likewise.
-
-	* data/glr.c (yydoAction, yyglrReduce, yysplitStack, yyresolveStates,
-	yyresolveAction, yyprocessOneStack): Use abort rather than assert.
-	* lib/hash.c (hash_lookup, hash_get_first, hash_get_next,
-	hash_find_entry, hash_rehash, hash_insert): Likewise.
-	* src/conflicts.c (resolve_sr_conflict): Likewise.
-	* src/lalr.c (set_goto_map, map_goto): Likewise.
-	* src/nullable.c (nullable_compute): Likewise.
-	* src/output.c (prepare_rules, token_definitions_output): Likewise.
-	* src/reader.c (packgram, reader): Likewise.
-	* src/state.c (state_new, state_free, state_transitions_set,
-	state_reduction_find): Likewise.
-	* src/symtab.c (symbol_user_token_number_set, symbol_make_alias,
-	symbol_pack): Likewise.
-	* src/tables.c (conflict_row, pack_vector): Likewise.
-	* src/vcg.c (get_color_str, get_textmode_str, get_shape_str,
-	get_layoutalgorithm_str, get_decision_str, get_orientation_str,
-	get_node_alignement_str, get_arrow_mode_str, get_crossing_type_str,
-	get_view_str, get_linestyle_str, get_arrowstyle_str): Likewise.
-
-	* lib/argmatch.h (ARRAY_CARDINALITY): Do not bother to #undef.
-	(ARGMATCH_CONSTRAINT): New macro.
-	(ARGMATCH_ASSERT): Use it.
-
-	* src/system.h (verify): New macro.
-	* src/getargs.c (trace_argmatch, report_argmatch): Use verify
-	rather than assert.
-	* src/tables.c (tables_generate): Likewise.
-
-	* src/struniq.c (struniq_assert): Now returns void, and aborts
-	if the assertion is false.
-	(struniq_assert_p): Remove.
-	* src/struniq.h: Likewise.
-
-2002-11-18  Paul Eggert  <eggert@twinsun.com>
-
-	* data/glr.c (yygetLRActions): Replace `yyindex' with
-	`yytable[yyindex]' to fix typo introduced in my 2002-11-09 patch.
-	This fixes the regression with Sun ONE Studio 7 cc that I reported in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00077.html>.
-
-2002-11-18  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (Tracing): `yyprint' shouldn't prepend a
-	space.
-	From Tim Van Holder.
-
-2002-11-17  Paul Eggert  <eggert@twinsun.com>
-
-	Pacify Sun ONE Studio 7 lint.  Also, rename "ParseError"
-	to "SyntaxError" for consistency with my 2002-11-15 change.
-
-	* data/glr.c (YYDPRINTF, YYDSYMPRINT, YYDSYMPRINTF) [!YYDEBUG]: Do
-	not define to {}, since this breaks the common use of `YYDPRINTF
-	((...));' if a single statement is desired (e.g. before `else').
-	Work around GCC warnings by surrounding corresponding calls with
-	{} if needed.
-	(yyhasResolvedValue): Remove unused function.
-	(yymergeOptionSets, yyresolvStack): Use `continue;' for empty
-	loop body.
-	(yyreportSyntaxError): Renamed from yyreportParseError.
-	(yyrecoverSyntaxError): Renamed from yyrecoverParseError.
-	All uses changed.
-	* tests/calc.at (_AT_DATA_CALC_Y): Make vars static instead of
-	extern when possible.  Remove unused initializations.
-
-2002-11-16  Akim Demaille  <akim@epita.fr>
-
-	Augment the similarity between GLR and LALR traces.
-
-	* data/yacc.c (yy_stack_print, YY_STACK_PRINT, yy_reduce_print)
-	(YY_REDUCE_PRINT): New.
-	(yyparse): Use them.
-	* data/glr.c (yy_reduce_print): Use YYFPRINTF, no need for
-	YYDPRINT here.
-	(yyglrReduce, yyrecoverParseError, yyparse): Don't report the
-	state reached after the reduction/recovery, since...
-	(yyparse, yyprocessOneStack): Report the state we are entering in.
-
-2002-11-16  Akim Demaille  <akim@epita.fr>
-
-	* src/getargs.h, src/getargs.c (trace_e, trace_args, trace_types):
-	Add support for --trace=skeleton.
-	* src/scan-skel.l: %option debug.
-	Scan strings of non-@ or \n instead of character by character.
-	(scan_skel): Handle trace_skeleton.
-	(QPUTS): New.
-	(@output_parser_name@, @output_header_name@): ``Restore'' their
-	support (used to be M4 macros).
-	* data/yacc.c: Quote larger chunks, a la glr.c.
-	* data/lalr1.cc: Likewise.
-	The header guards are no longer available, so use some other
-	string than `YYLSP_NEEDED'.
-
-2002-11-16  Akim Demaille  <akim@epita.fr>
-
-	Make the ``Printers and Destructors'' test more verbose, taking
-	`yacc.c''s behavior as (possibly wrong) reference.
-
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Use printf
-	instead of fprint on stdout.
-	Set and report the last_line of the symbols.
-	Consistently display values and locations.
-
-2002-11-16  Paul Eggert  <eggert@twinsun.com>
-
-	* data/yacc.c: Avoid over-quoting of __line__ and __file__.
-
-2002-11-15  Paul Eggert  <eggert@twinsun.com>
-
-	* tests/actions.at (Actions after errors): New test case.
-
-	* data/glr.c, data/lalr1.cc, data/yacc.cc, doc/bison.texinfo,
-	src/conflicts.c, src/parse-gram.y, src/tables.c, src/tables.h,
-	tests/action.at, tests/calc.at, tests/conflicts.at,
-	tests/cxx-type.at, tests/regression.at:
-	"parse error" -> "syntax error" for POSIX compatibility.
-	"parsing stack overflow..." -> "parser stack overflow" so
-	that code matches Bison documentation.
-
-2002-11-15  Akim Demaille  <akim@epita.fr>
-
-	* src/parse-gram.y (declaration): Have %parse-param and %lex-param
-	take two BRACED_CODE, not two string_content.
-	Free the scanner's obstack when we are done.
-	(code_content): New.
-	* tests/calc.at: Adjust.
-	* doc/bison.texinfo: Adjust.
-	Also, make sure to include the `,' for these declarations.
-
-2002-11-15  Tim Van Holder  <tim.van.holder@pandora.be>
-
-	* m4/prereq.m4: Removed the commented jm_PREREQ_HASH
-	definition; avoids potential autoreconf problems.
-
-2002-11-15  Akim Demaille  <akim@epita.fr>
-
-	Always check the value returned by yyparse.
-
-	* tests/calc.at (_AT_DATA_CALC_Y): Have `main' exit with the value
-	returned by yyparse.
-	(_AT_CHECK_CALC_ERROR): Take the expected exit value as argument.
-	Adjust calls.
-	* tests/glr-regr1.at (glr-regr1.y): Have `main' exit with the value
-	returned by yyparse.
-
-2002-11-14  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* data/glr.c (yyFail): Always set yyerrflag.  Corrects regression
-	on input.at test.
-
-2002-11-14  Paul Eggert  <eggert@twinsun.com>
-
-	* src/output.c (output_skeleton): Call xfopen instead of
-	duplicating xfopen's body.
-
-	Fix bugs reported by Nelson H. F. Beebe in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00078.html>.
-
-	* tests/headers.at (AT_TEST_CPP_GUARD_H): Don't assume that
-	"$CC -E foo.h" is allowed, as this doesn't work with the Portland
-	Group compiler.  Instead, use "$CC -E bar.c".  Include the .h
-	file twice in the grammar, as an extra check.
-
-	* tests/input.at (Torturing the Scanner): Surround the
-	backslash-newline tests with "#if 0", to make it less likely that
-	we'll run into compiler bugs.  Bring back solitary \ inside
-	comment, but add a closing comment to work around HP C bug.  Don't
-	test backslash-newline in C character constant.
-
-2002-11-14  Akim Demaille  <akim@epita.fr>
-
-	* tests/synclines.at (AT_SYNCLINES_COMPILE): Ignore the exit
-	status of the compiler.
-	Calling `exit 1' is no longer needed.
-	Reported by Nelson H. F. Beebe.
-
-2002-11-14  Akim Demaille  <akim@epita.fr>
-
-	* tests/atlocal.in (CPPFLAGS): We have config.h.
-	* tests/testsuite.at (AT_DATA_GRAMMAR_PROLOGUE, AT_DATA_GRAMMAR):
-	New.
-	* tests/actions.at, tests/calc.at, tests/conflicts.at,
-	* tests/cxx-type.at, tests/glr-regr1.at, tests/headers.at,
-	* tests/regression.at, tests/torture.at: Use them for all the
-	grammars that are to be compiled.
-	* tests/cxx-type.at (_AT_TEST_GLR_CALC): Rename as...
-	* tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): this.
-	* doc/bison.texinfo (GLR Parsers): Document `inline'.
-
-2002-11-14  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo: Various formatting changes (alignments in
-	samples, additional @group/@end group, GCS in samples.
-	Use @deffn instead of simple @table to define the directives,
-	macros, variables etc.
-
-2002-11-13  Paul Eggert  <eggert@twinsun.com>
-
-	Fix some bugs reported by Albert Chin-A-Young in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00066.html>.
-
-	* tests/input.at (Torturing the Scanner): Don't invoke "cc a.c b.c
-	-o c"; the HP C compiler chatters during compilation.
-	Instead, invoke "cc -c a.c -o a.o; cc -c b.c -o b.o; cc a.o b.o -o c".
-	* tests/headers.at (export YYLTYPE): Likewise.
-
-	* tests/input.at (Torturing the Scanner): Remove lines containing
-	solitary backslashes, as they tickle a bug in the HP C compiler.
-
-	* tests/glr-regr1.at (Badly Collapsed GLR States): Avoid //
-	comments, since they're not portable.  Use GNU coding style.
-
-2002-11-13  Akim Demaille  <akim@epita.fr>
-
-	* data/yacc.c: Leave bigger chunks of quoted text.
-	(YYDSYMPRINTF): New.
-	Use it to report symbol activities.
-	* data/glr.c (YYDSYMPRINTF): New.
-	Use it.
-
-2002-11-12  Paul Eggert  <eggert@twinsun.com>
-
-	Version 1.75b.
-
-	* data/glr.c (yydoAction): Return YYRESULTTAG, not int.
-	(yyglrReduce): Return yyok, not 0.
-	This should avoid the enumerated-type warnings reported
-	by Nelson H. F. Beebe in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00057.html>.
-
-	* lib/bbitset.h (BITSET_INLINE): Remove.
-	* lib/bitset.h [! BITSET_INLINE]: Remove.
-	(bitset_set, bitset_reset, bitset_test): Rename local vars
-	to avoid shadowing warnings by GCC.
-
-	* data/glr.c (inline): Remove #define.  It's the user's
-	responsibility to #define it away, just like 'const'.
-	This fixes one of the bugs reported by Nelson H. F. Beebe in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00058.html>.
-
-	* Makefile.maint (po-check): Scan .l and .y files instead of the
-	.c and the .h files that they generate.  This fixes the bug
-	reported by Tim Van Holder in:
-	<http://lists.gnu.org/archive/html/bison-patches/2002-11/msg00062.html>
-	Look for N_ as well as for _.  Try to avoid matching #define for
-	N_ and _.
-	* po/POTFILES.in: Remove src/parse-gram.c, src/scan-gram.c,
-	src/system.h.  Add src/parse-gram.y, src/scan-gram.l.
-	* src/scan-gram.l: Revamp regular expressions so that " and '
-	do not confuse xgettext.
-
-	* src/struniq.h (struniq_new): Do not declare the return type
-	to be 'const'; this violates the C standard.
-	* src/struniq.c (struniq_new): Likewise.
-
-2002-11-12  Albert Chin-A-Young <china@thewrittenword.com>
-
-	* src/Makefile.am (LDADD): Link $(LIBINTL) last to avoid the
-	duplicate definition of optind on Tru64 UNIX 4.0D with the Compaq
-	linker.
-
-2002-11-12  Akim Demaille  <akim@epita.fr>
-
-	* Makefile.maint: Sync with Autoconf:
-	(local_updates): New.
-
-2002-11-12  Akim Demaille  <akim@epita.fr>
-
-	* po/POTFILES.in (src/lalr.c, src/state.c): Remove
-
-2002-11-12  Akim Demaille  <akim@epita.fr>
-
-	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Display the
-	locations.
-
-2002-11-12  Akim Demaille  <akim@epita.fr>
-
-	* data/c.m4 (b4_yysymprint_generate): Pass *yyvaluep to YYPRINT,
-	not yyvalue.
-
-2002-11-12  Akim Demaille  <akim@epita.fr>
-
-	* tests/actions.at (AT_CHECK_PRINTER_AND_DESTRUCTOR): New.
-	Use it to test the GLR parser.
-
-2002-11-12  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (input.y): s/YYEOF/MYEOF/, as the skeleton
-	defines it.
-	* data/glr.c (yystos): New.
-	(b4_yysymprint_generate, b4_yydestruct_generate): Invoke.
-	(YYDSYMPRINT): New.
-	(yyval): Don't define it, it is handled via M4.
-	(yyrecoverParseError): Free verbosely the discarded symbols.
-	* data/yacc.c (yysymprint): Remove, rather...
-	(b4_yysymprint_generate): invoke.
-	* data/c.m4 (b4_yysymprint_generate): New.
-	Accept pointers as arguments, as opposed to the version from
-	yacc.c.
-	(b4_yydestruct_generate): Likewise.
-	* tests/cations.at (Printers and Destructors): Use Bison directives
-	instead of CPP macros.
-	Don't rely on internal details.
-
-2002-11-12  Akim Demaille  <akim@epita.fr>
-
-	* data/c.m4 (b4_yydestruct_generate, b4_symbol_actions): New.
-	* data/yacc.c: Rename yychar1 as yytoken, as in glr.c.
-	Don't work on yychar (i.e., do set it to YYEMPTY, don't match
-	it against YYEMPTY and so forth), work on yytoken (i.e., set
-	it to YYEMPTY etc.).
-	(yydestruct): Replace with a b4_yydestruct_generate invocation.
-	(b4_symbol_actions): Remove.
-	* data/glr.c (YYTRANSLATE): As for yacc.c, if negative, it stands
-	for 0, end-of-input.
-
-2002-11-12  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (Destructor Decl): New.
-
-2002-11-12  Akim Demaille  <akim@epita.fr>
-
-	* src/tables.c (tables_generate): Use free for pointers that
-	cannot be NULL, not XFREE.
-	(pack_vector): Use assert, not fatal, for bound violations.
-	* src/state.c (state_new): Likewise.
-	* src/reader.c (reader): Likewise.
-	* src/lalr.c (set_goto_map): Likewise.
-	* src/location.h (LOCATION_PRINT): If first_line is 0, just issue
-	the file name.
-
-2002-11-12  Akim Demaille  <akim@epita.fr>
-
-	* src/scan-gram.l, src/reader.h (scanner_last_string_free):
-	Restore.
-	* src/scan-gram.l (last_string): Is global to the file, not to
-	yylex.
-	* src/parse-gram.y (input): Don't append the epilogue here,
-	(epilogue.opt): do it here, and free the scanner's obstack.
-	* src/reader.c (epilogue_set): Rename as...
-	(epilogue_augment): this.
-	* data/c.m4 (b4_epilogue): Defaults to empty.
-
-2002-11-12  Akim Demaille  <akim@epita.fr>
-
-	* src/getargs.c (long_options): Remove duplicates.
-	* src/vmsgetargs.c, src/build.com, src/bison.cld, src/vmshlp.mar:
-	Remove.
-	* doc/bison.rnh: Remove.
-	* doc/bison.texinfo (VMS Invocation): Remove.
-
-2002-11-12  Akim Demaille  <akim@epita.fr>
-
-	* src/struniq.h, src/struniq.c (struniq_t): Is const.
-	(STRUNIQ_EQ, struniq_assert, struniq_assert_p): New.
-
-	Use struniq for symbols.
-
-	* src/symtab.h (symbol_t): The tag member is a struniq.
-	(symbol_type_set): Adjust.
-	* src/symtab.c (symbol_new): Takes a struniq.
-	(symbol_free): Don't free the tag member.
-	(hash_compare_symbol_t, hash_symbol_t): Rename as...
-	(hash_compare_symbol, hash_symbol): these.
-	Use the fact that tags as struniqs.
-	(symbol_get): Use struniq_new.
-	* src/symlist.h, src/symlist.c (symbol_list_n_type_name_get):
-	Returns a strniq.
-	* src/reader.h (merger_list, grammar_currentmerge_set): The name
-	and type members are struniqs.
-	* src/reader.c (get_merge_function)
-	(grammar_current_rule_merge_set): Adjust.
-	(TYPE, current_type): Are struniq.
-
-	Use struniq for file names.
-
-	* src/files.h, src/files.c (infile): Split into...
-	(grammar_file, current_file): these.
-	* src/scan-gram.c (YY_USER_INIT, handle_syncline): Adjust.
-	* src/reduce.c (reduce_print): Likewise.
-	* src/getargs.c (getargs): Likewise.
-	* src/complain.h, src/complain.c: Likewise.
-	* src/main.c (main): Call struniqs_new early enough to use it for
-	file names.
-	Don't free the input file name.
-
-2002-11-12  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.c (symbol_free): Remove dead deactivated code:
-	type_name are properly removed.
-	Don't use XFREE to free items that cannot be NULL.
-	* src/struniq.h, src/struniq.c: New.
-	* src/main.c (main): Initialize/free struniqs.
-	* src/parse-gram.y (%union): Add astruniq member.
-	(yyprint): Adjust.
-	* src/scan-gram.l (<{tag}>): Return a struniq.
-	Free the obstack bit that used to store it.
-	* src/symtab.h (symbol_t): The 'type_name' member is a struniq.
-
-2002-11-11  Paul Eggert  <eggert@twinsun.com>
-
-	Revamp to fix many (but not all) of the C- and M4-related quoting
-	problems.  Among other things, this fixes the Bison bug reported
-	by Jan Hubicka when processing the Bash grammar; see:
-	<http://lists.gnu.org/archive/html/bison-patches/2002-11/msg00039.html>
-
-	Use new @ escapes consistently.  Represent brackets with @{ and @}
-	rather than @<:@ and @:>@, since this works a bit better with dumb
-	editors like vi.  Represent @ with @@, since @ is now consistently
-	an escape.  Use @oline@ and @ofile@ rather than __oline__ and
-	__ofile__, to avoid unexpected expansions.  Similarly, use @output
-	rather than #output.
-
-	* data/c.m4 (b4_copyright): Omit file name from comment, since
-	the file name could contain "*/".
-	(b4_synclines_flag): Don't quote the 2nd argument; it should already
-	be quoted.  All uses changed.
-
-	* data/glr.c: Use new @ escapes consistently.
-	(b4_input_suffix, b4_output_parser_suffix, b4_output_parser_name,
-	b4_output_header_suffix, b4_output_header_name, b4_header_guard):
-	Remove, since they couldn't handle arbitrary characters in file
-	names.
-	* data/lalr1.cc: Likewise.
-	* data/yacc.c: Likewise.
-
-	* src/files.c (output_infix): Remove; all uses removed.
-	* src/files.h: Likewise.
-
-	* data/glr.c: Remove use of "#ifdef b4_header_guard", since it
-	mishandled funny characters in file names, and anyway it isn't
-	needed any more.
-	* data/yacc.c: Likewise.
-	* data/lalr1.cc: Use YYSLP_NEEDED instead of b4_header_guard.
-
-	* data/glr.c (YYSTYPE_IS_TRIVIAL): Define when the .h file would.
-	* data/yacc.c: Likewise.
-
-	* src/muscle_tab.c: Include quotearg.h, since we need to quote C
-	strings now.
-	(muscle_init): Quote filename as a C string.
-	* src/muscle_tab.h (MUSCLE_GROW_STRING_PAIR): Remove; unused.
-	(MUSCLE_OBSTACK_SGROW, MUSCLE_INSERT_C_STRING): New macros.
-	* src/output.c (escaped_file_name_output): New function.
-	(prepare_symbols): Quote tokens for M4.
-	(prepare): Don't insert output_infix, output_prefix,
-	output_parser_name, output_header_name; this is now down by scan-skel.
-	Insert skeleton as a C string.
-
-	* src/output.c (user_actions_output, symbol_destructors_output,
-	symbol_printers_output): Quote filenames for C and M4.
-	* src/reader.c (prologue_augment, epilogue_set): Likewise.
-
-	* src/scan-gram.l (<SC_CHARACTER>): Don't worry about any backslash
-	escapes other than \\ and \'; this simplifies the code.
-	(<SC_STRING>): Likewise, for \\ and \".
-	(<SC_COMMENT,SC_LINE_COMMENT,SC_STRING,SC_CHARACTER,SC_BRACED_CODE,
-	SC_PROLOGUE,SC_EPILOGUE>): Escape $ and @, too.
-	Use new escapes @{ and @} for [ and ].
-
-	* src/scan-skel.l (yylineno, yyoutname): Remove static vars, replacing
-	them with auto vars.
-	Switch to new escape scheme, where @ is the escape character uniformly.
-	Abort if a stray escape character is found.  Avoid unbounded input
-	buffer when parsing non-escaped text.
-
-	* tests/input.at (Torturing the Scanner): Add tests that @oline@,
-	__oline__, #output, $@, and @{ do not have unintended meanings.
-
-2002-11-09  Paul Eggert  <eggert@twinsun.com>
-
-	Fix the test failure due to GCC warnings described in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00000.html>.
-	* data/glr.c (yyis_pact_ninf, yyis_table_ninf): New macros, which
-	evaluate to 0 if it's impossible for NINF to be in the respective
-	table.
-	(yygetLRActions, yyrecoverParseError): Use them.
-
-	* src/scan-gram.l (unexpected_end_of_file): Fix bug: columns were
-	counted in the token inserted at end of file.  Now takes
-	location_t *, not location_t, so that the location can be
-	adjusted.  All uses changed.
-
-	* tests/regression.at (Invalid inputs): Adjust wording in
-	diagnostic to match the new behavior.
-
-	* tests/torture.at (AT_DATA_TRIANGULAR_GRAMMAR,
-	AT_DATA_HORIZONTAL_GRAMMAR, AT_DATA_LOOKAHEADS_GRAMMAR,
-	AT_DATA_STACK_TORTURE): Replace `assert (x);' with `if (! (x))
-	abort ();'.  This reduces the runtime of the "Many lookaheads"
-	test from 27.6 to 2.7 minutes on a 440 MHz Ultrasparc III running
-	GCC 3.2.
-
-2002-11-07  Paul Eggert  <eggert@twinsun.com>
-
-	* src/parse-gram.y (CHARACTER): Remove unused token.
-	All uses removed.
-
-	* src/scan-gram.l: Remove stack option.  We no longer use the
-	stack, since the stack was never deeper than 1; instead, use the
-	new auto var c_context to record the stacked value.
-
-	Remove nounput option.  At an unexpected end of file, we now unput
-	the minimal input necessary to end cleanly; this simplifies the
-	code.
-
-	Avoid unbounded token sizes where this is easy.
-
-	(unexpected_end_of_file): New function.
-	Use it to systematize the error message on unexpected EOF.
-	(last-string): Now auto, not static.
-	(YY_OBS_FREE): Remove unnecessary do while (0) wrapper.
-	(scanner_last_string_free): Remove; not used.
-	(percent_percent_count): Move decl to just before use.
-	(SC_ESCAPED_CHARACTER): Return ID at unexpected end of file,
-	not the (never otherwised-used) CHARACTER.
-
-2002-11-07  Akim Demaille  <akim@epita.fr>
-
-	Let yyerror always receive the msg as last argument, so that
-	yyerror can be variadic.
-
-	* data/yacc.c (b4_yyerror_args): New.
-	Use it when calling yyerror.
-	* data/glr.c (b4_yyerror_args, b4_lyyerror_args): New.
-	Use it when calling yyerror.
-	* doc/bison.texinfo (Error Reporting): Adjust.
-	* tests/calc.at (_AT_DATA_CALC_Y): Adjust.
-	* tests/cxx-type.at (_AT_TEST_GLR_CALC): Adjust.
-
-2002-11-06  Akim Demaille  <akim@epita.fr>
-
-	#line should have quoted strings.
-	Ideally, this should be done by m4_quotearg.
-
-	* src/scan-skel.l: Include quotearg.h.
-	Quote __ofile__.
-	* src/output.c (symbol_printers_output)
-	(symbol_destructors_output): Quote the file name.
-
-2002-11-06  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (Invalid inputs): Adjust to the recent
-	messages.
-
-2002-11-06  Akim Demaille  <akim@epita.fr>
-
-	Restore --no-lines.
-	Reported by Jim Kent.
-
-	* data/c.m4 (b4_syncline): New.
-	* data/glr.c, data/yacc.c, data/lalr1.cc: Use it.
-	* src/reader.c (prologue_augment, epilogue_set): Use b4_syncline.
-	* src/output.c (user_actions_output): Likewise.
-	(prepare): Define 'b4_synclines_flag'.
-	* src/muscle_tab.c (muscle_init): Don't define b4_linef.
-
-2002-11-06  Akim Demaille  <akim@epita.fr>
-
-	* src/main.c (main): Free `infile'.
-	* src/scan-gram.l (handle_syncline): New.
-	Recognize `#line'.
-	* src/output.c (user_actions_output, symbol_destructors_output)
-	(symbol_printers_output): Use the location's file name, not
-	infile.
-	* src/reader.c (prologue_augment, epilogue_set): Likewise.
-
-2002-11-05  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* src/tables.c (matching_state): Don't allow states to match if
-	either has GLR conflict entries.
-
-2002-11-05  Paul Eggert  <eggert@twinsun.com>
-
-	* src/scan-gram.l: Use more accurate diagnostics, e.g.
-	"integer out of range" rather than "invalid value".
-	* tests/input.at (Invalid $n, Invalid @n): Change expected wording
-	accordingly.
-
-	Scan <% and %> digraphs in C code as POSIX 1003.1-2001 requires.
-	Also, remove one static variable in the scanner.
-
-	* src/scan-gram.l (braces_level): Now auto, not static.
-	Initialize to zero if the compiler is being picky.
-	(INITIAL): Clear braces_level instead of incrementing it.
-	(SC_BRACED_CODE): Treat <% and %> as { and } when inside C code,
-	as POSIX 1003.1-2001 requires.
-	* src/system.h (IF_LINT): New macro, taken from coreutils.
-	* configure.ac: Define "lint" if --enable-gcc-warnings.
-
-2002-11-05  Akim Demaille  <akim@epita.fr>
-
-	* src/scan-gram.l: When it starts with `%', complain about the
-	whole directive, not just that `invalid character: %'.
-
-2002-11-04  Akim Demaille  <akim@epita.fr>
-
-	* Makefile.maint: Update from Autoconf.
-	(update, cvs-update, po-update, do-po-update): New.
-
-2002-11-04  Akim Demaille  <akim@epita.fr>
-
-	* tests/glr-regr1.at (Badly Collapsed GLR States): Prototype yylex
-	and yyerror.
-	Have yyerror `use' its arguments.
-	* tests/calc.at (AT_CHECK_PUSHDEFS): AT_YYERROR_SEES_LOC_IF
-	returns true when location & yacc & pure & parse-param.
-	(_AT_DATA_CALC_Y): Let yyerror ``use'' its arguments.
-
-2002-11-04  Akim Demaille  <akim@epita.fr>
-
-	* src/location.h (LOCATION_PRINT): Use quotearg slot 3 to avoid
-	clashes.
-	* src/scan-gram.l: Use [\'] instead of ['] to pacify
-	font-lock-mode.
-	Use complain_at.
-	Use quote, not quote_n since LOCATION_PRINT no longer uses the
-	slot 0.
-
-2002-11-03  Paul Eggert  <eggert@twinsun.com>
-
-	* src/reader.c (get_merge_function, grammar_current_rule_check):
-	Use consistent diagnostics for reporting type name clashes.
-	Quote the types with <>, for consistency with Yacc.
-	* tests/input.at (Type Clashes): Adjust to diagnostic changes.
-
-2002-11-03  Akim Demaille  <akim@epita.fr>
-
-	* data/c.m4 (b4_identification, b4_user_args, b4_parse_param):
-	New.
-	* data/yacc.m4 (b4_pure_args, b4_Pure_args): New.
-	(b4_parse_param): Remove.
-	Use b4_identification.
-	Propagate b4_pure_args where needed to pass them to yyerror.
-	* data/glr.m4 (b4_parse_param): Remove.
-	(b4_user_formals, b4_pure_args, b4_pure_formals, b4_lpure_args)
-	(b4_lpure_formals): New.
-	Use b4_identification.
-	(YY_USER_FORMALS, YY_USER_ARGS): Remove, replaced by
-	b4_user_formals and b4_user_args.
-	(yyexpandGLRStack, yyFail, yyaddDeferredAction, yyglrShiftDefer)
-	(yyreportAmbiguity): When using a pure parser, also need
-	the location, and the parse-params.
-	Adjust callers.
-	(yyuserAction, yyglrShift, yyreportParseError, yyrecoverParseError):
-	When using a pure parser, also need the parse-params.
-	Adjust callers.
-	* tests/calc.at: Test pure (%pure-parser) and absolutely pure
-	(%pure-parser + %parse-param) LALR and GLR parsers.
-	(AT_CHECK_PUSHDEFS, AT_CHECK_POPDEFS): New, define AT_PARAM_IF,
-	AT_LOCATION_IF, AT_PURE_IF, AT_GLR_IF, AAT_PURE_AND_LOC_IF,
-	AT_GLR_OR_PARAM_IF, AT_YYERROR_ARG_LOC_IF, AT_YYERROR_SEES_LOC_IF.
-	(_AT_DATA_CALC_Y): Equip for purity of yyerror.
-	(_AT_CHECK_CALC_ERROR): Use AT_YYERROR_SEES_LOC_IF.
-	* tests/cxx-type.at (_AT_TEST_GLR_CALC): Equip for yyerror purity.
-	* doc/bison.texinfo: Untabify the whole file.
-	(Parser Function): Document %parse-param, deprecate YYPARSE_PARAM.
-	(Pure Calling): Document %lex-param, deprecate YYLEX_PARAM.
-	(Error Reporting): Adjust to these new directives.
-	Document %error-verbose, deprecate YYERROR_VERBOSE.
-
-2002-11-03  Akim Demaille  <akim@epita.fr>
-
-	* tests/calc.at: Change all the AT_CHECK_CALC_LALR and
-	AT_CHECK_CALC_GLR invocations to use % directives, instead of
-	command line options.
-	* tests/cxx-type.at: Formatting changes.
-
-2002-11-03  Paul Eggert  <eggert@twinsun.com>
-
-	* src/scan-gram.l: Revamp to fix POSIX incompatibilities,
-	to count columns correctly, and to check for invalid inputs.
-
-	Use mbsnwidth to count columns correctly.  Account for tabs, too.
-	Include mbswidth.h.
-	(YY_USER_ACTION): Invoke extend_location rather than LOCATION_COLUMNS.
-	(extend_location): New function.
-	(YY_LINES): Remove.
-
-	Handle CRLF in C code rather than in Lex code.
-	(YY_INPUT): New macro.
-	(no_cr_read): New function.
-
-	Scan UCNs, even though we don't fully handle them yet.
-	(convert_ucn_to_byte): New function.
-
-	Handle backslash-newline correctly in C code.
-	(SC_LINE_COMMENT, SC_YACC_COMMENT): New states.
-	(eols, blanks): Remove.  YY_USER_ACTION now counts newlines etc.;
-	all uses changed.
-	(tag, splice): New EREs.  Do not allow NUL or newline in tags.
-	Use {splice} wherever C allows backslash-newline.
-	YY_STEP after space, newline, vertical-tab.
-	("/*"): BEGIN SC_YACC_COMMENT, not yy_push_state (SC_COMMENT).
-
-	(letter, id): Don't assume ASCII; e.g., spell out a-z.
-
-	({int}, handle_action_dollar, handle_action_at): Check for integer
-	overflow.
-
-	(YY_STEP): Omit trailing semicolon, so that it's more like C.
-
-	(<SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>): Allow \0 and \00
-	as well as \000.  Check for UCHAR_MAX, not 255.
-	Allow \x with an arbitrary positive number of digits, as in C.
-	Check for overflow here.
-	Allow \? and UCNs, for compatibility with C.
-
-	(handle_symbol_code_dollar): Use quote_n slot 1 to avoid collision
-	with quote slot used by complain_at.
-
-	* tests/input.at: Add tests for backslash-newline, m4 quotes
-	in symbols, long literals, and funny escapes in strings.
-
-	* configure.ac (jm_PREREQ_MBSWIDTH): Add.
-	* lib/Makefile.am (libbison_a_SOURCES): Add mbswidth.h, mbswidth.c.
-	* lib/mbswidth.h, lib/mbswidth.c: New files, from GNU gettext.
-	* m4/Makefile.am (EXTRA_DIST): Add mbswidth.m4.
-	* m4/mbswidth.m4: New file, from GNU coreutils.
-
-	* doc/bison.texinfo (Grammar Outline): Document // comments.
-	(Symbols): Document that trigraphs have no special meaning in Bison,
-	nor is backslash-newline allowed.
-	(Actions): Document that trigraphs have no special meaning.
-
-	* src/location.h (LOCATION_COLUMNS, LOCATION_LINES): Remove;
-	no longer used.
-
-2002-11-02  Paul Eggert  <eggert@twinsun.com>
-
-	* src/reader.c: Don't include quote.h; not needed.
-	(get_merge_function): Reword warning to be consistent with
-	type clash diagnostic in grammar_current_rule_check.
-
-	* lib/quotearg.c (quotearg_buffer_restyled): Fix off-by-two
-	bug in trigraph handling.
-
-	* src/output.c (prepare_symbols): When printing token names,
-	escape "[" as "@<:@" and likewise for "]".
-
-	* src/system.h (errno): Remove declaration, as we are now
-	assuming C89 or better, and C89 guarantees errno.
-
-2002-10-30  Paul Eggert  <eggert@twinsun.com>
-
-	* lib/bitset_stats.c (bitset_stats_read, bitset_stats_write):
-	Check for close failures.
-	* src/files.h (xfclose): Return void, not int, since it always
-	returned zero.
-	* src/files.c (xfclose): Likewise.  Report I/O error if ferror
-	indicates one.
-	* src/output.c (output_skeleton): Use xfclose rather than fclose
-	and ferror.  xfclose now checks ferror.
-
-	* data/glr.c (YYLEFTMOST_STATE): Remove.
-	(yyreportTree): Use a stack-based leftmost state.  This avoids
-	our continuing battles with bogus warnings about initializers.
-
-2002-10-30  Akim Demaille  <akim@epita.fr>
-
-	* src/system.h: Don't use #ifdef/#ifndef on HAVE_ values, only
-	#if.
-
-2002-10-29  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* tests/glr-regr1.at: New test for reported regressions.
-	* tests/testsuite.at: Add glr-regr1.at test.
-	* tests/Makefile.am: Add glr-regr1.at test.
-
-2002-10-24  Paul Eggert  <eggert@twinsun.com>
-
-	Version 1.75a.
-
-	* tests/calc.at (_AT_DATA_CALC_Y): Remove unused strcat declaration.
-	* tests/cxx-type.at (_AT_TEST_GLR_CALC): Include stdlib.h, since
-	we use malloc.  Don't assume 'A' through 'Z' are contiguous.
-	Don't assume strdup exists; POSIX says its an XSI extension.
-	Check for buffer overflow on input.
-
-2002-10-24  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output_skeleton): Don't disable M4sugar comments
-	too soon: it results in comments being expanded.
-	* data/yacc.c, data/glr.c, data/lalr1.cc: Do it right before the
-	first output.
-
-2002-10-24  Akim Demaille  <akim@epita.fr>
-
-	* data/yacc.c (m4_int_type): New.
-	* data/c.m4 (m4_int_type): Don't use yysigned_char, but `signed
-	char' as only yacc.c wants K&R portability.
-	* data/glr.c (yysigned_char): Remove.
-	* data/lalr1.cc: Rename the trailing b4_name as b4_parser_class_name.
-	Reported by Quoc Peyrot.
-
-2002-10-23  Paul Eggert  <eggert@twinsun.com>
-
-	* src/main.c (main): With --trace=time, report times even if a
-	non-fatal error occurs.  Formerly, the times were reported in some
-	such cases but not in others.
-	* src/reader.c (reader): Just return if a complaint has been issued,
-	instead of exiting, so that 'main' can report times.
-
-2002-10-22  Akim Demaille  <akim@epita.fr>
-
-	* src/system.h: Include sys/types.
-	Reported by Bert Deknuydt.
-
-2002-10-23  Paul Eggert  <eggert@twinsun.com>
-
-	* configure.ac (AC_PROG_LEX): Use instead of AM_PROG_LEX.
-	Suggested by Art Haas.
-
-2002-10-22  Paul Eggert  <eggert@twinsun.com>
-
-	* src/complain.c (exit) [! (STDC_HEADERS || _LIBC)]: Remove exit
-	decl; not needed any more.
-	* src/main.c (main): Use return to exit, undoing yesterday's change.
-	The last OS that we could find where this wouldn't work is
-	SunOS 3.5, and that's too old to worry about now.
-
-	* data/glr.c (struct yyltype): Define members even when not
-	doing locations.  This is more consistent with yacc.c, and it
-	works around the following bug reports:
-	http://lists.gnu.org/archive/html/bug-bison/2002-10/msg00106.html
-	http://lists.gnu.org/archive/html/bug-bison/2002-10/msg00111.html
-
-	* doc/bison.texinfo: Minor spelling and typographical fixes.  Use
-	@acronym consistently.  Standardize on "Yacc" instead of "YACC",
-	"Algol" instead of "ALGOL".  Give a bit more history about BNF.
-
-2002-10-22  Akim Demaille  <akim@epita.fr>
-
-	* data/README: New.
-
-2002-10-21  Paul Eggert  <eggert@twinsun.com>
-
-	Be consistent about 'bool'; the old code used an enum in one
-	module and an int in another, and this violates the C standard.
-	* m4/stdbool.m4: New file, from coreutils 4.5.3.
-	* configure.ac (AC_HEADER_STDBOOL): Add.
-	* m4/Makefile.am (EXTRA_DIST): Add stdbool.m4.
-	* src/muscle_tab.c (hash_compare_muscles): (a ? FALSE : TRUE) -> (! a)
-	* src/symtab.c (hash_compare_symbol_t): Likewise.
-	* src/system.h (bool, false, true): Use a definition consistent
-	with ../lib/hash.c.  All uses changed.
-
-	* src/complain.c (warning_issued): Renamed from warn_message_count,
-	so that we needn't worry about integer overflow (!).
-	Now of type bool.  All uses changed.
-	(complaint_issued): Renamed from complain_message_count; likewise.
-
-	* src/main.c (main): Use exit to exit with failure.
-
-	* src/complain.c (fatal_at, fatal): Use EXIT_FAILURE and EXIT_SUCCESS
-	rather than 1 and 0.
-	* src/main.c (main): Likewise.
-	* src/getargs.c (getargs): Likewise.
-	* src/reader.c (reader): Likewise.
-
-	* src/getarg.c (getargs): Remove duplicate code for
-	"Try `bison --help'".
-
-	* src/files.c (xfopen, xfclose): Use EXIT_FAILURE rather than 2.
-	What was that "2" for?
-
-	* src/complain.h (fatal, fatal_at): Add __attribute__((__noreturn__)).
-	* src/getargs.c (usage): Likewise.
-
-	* src/getargs.c (getargs): When there are too few operands, report
-	the last one.  When there are too many, report the first extra
-	one.  This is how diffutils does it.
-
-2002-10-20  Paul Eggert  <eggert@twinsun.com>
-
-	Remove K&R vestiges.
-	* configure.ac (AC_C_CONST, AM_C_PROTOTYPES): Remove.
-	* src/complain.c (VA_START): Remove.  Assume prototypes.
-	(vfprintf) [! (HAVE_VPRINTF || defined vfprintf)]: New macro.
-	(private_strerror, warn_at, warn, complain_at, complain, fatal_at,
-	fatal): Assume prototypes.
-	* src/complain.h: Assume prototypes.
-	* src/system.h (PARAMS): Remove.
-	Include <limits.h> unconditionally, since it's guaranteeed even
-	for a freestanding C89 compiler.
-	(SHRT_MIN, SHRT_MAX): Remove, since C89 guarantees them.
-	* src/vmsgetargs.c (getargs, cli_present, cli_get_value): Prototype.
-
-2002-10-20  Akim Demaille  <akim@epita.fr>
-
-	* src/muscle_tab.c (muscle_grow): Remove trailing debugging code.
-	* data/glr.c (YY_USER_FORMALS, YY_USER_ARGS): New.
-	(yyuserAction, yydoAction, yyglrReduce, yyresolveValue)
-	(yyresolveStates, yyresolveAction, yyresolveStack)
-	(yyprocessOneStack): Use them.
-	(yy_reduce_print): New.
-	* tests/calc.at (_AT_DATA_CALC_Y): Exercise %parse-param.
-
-2002-10-20  Akim Demaille  <akim@epita.fr>
-
-	* data/c.m4 (b4_c_ansi_args): Recognize functions with no
-	arguments and output `void'.
-	(b4_c_function): Rename as...
-	(b4_c_function_def): this.
-	(b4_c_function_decl, b4_c_ansi_function_def)
-	(b4_c_ansi_function_decl): New.
-	Change the interpretation of the arguments: before `int, foo', now
-	`int foo, foo'.
-	* data/yacc.c (yyparse): Prototype and define thanks to these.
-	Adjust b4_c_function_def uses.
-	* data/glr.c (yyparse): Likewise, but ANSI only.
-
-2002-10-20  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (prepare): Move the definition of `tokens_number',
-	`nterms_number', `undef_token_number', `user_token_number_max'
-	to...
-	(prepare_tokens): Here.
-	(prepare_tokens): Rename as...
-	(prepare_symbols): this.
-	(prepare): Move the definition of `rules_number' to...
-	(prepare_rules): here.
-	(prepare): Move the definition of `last', `final_state_number',
-	`states_number' to...
-	(prepare_states): here.
-	* data/yacc.c, data/lalr1.cc, data/glr.c: Normalize `>' into `<'.
-
-2002-10-20  Akim Demaille  <akim@epita.fr>
-
-	* src/tables.h, src/tables.c, src/output.c: Comment changes.
-
-2002-10-20  Akim Demaille  <akim@epita.fr>
-
-	* data/yacc.c, data/yacc.c (b4_location_if, b4_pure_if): Move to...
-	* data/c.m4: here.
-
-2002-10-20  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (prepare): Use MUSCLE_INSERT_STRING.
-	* src/muscle_tab.c (muscle_pair_list_grow): Rename `val as
-	`pair'.
-	(muscle_init): Move the `b4_ltype', `b4_maxdepth', `b4_initdepth',
-	`name' to...
-	* data/glr.c, data/lalr1.cc, data/yacc.c (b4_location_type)
-	(b4_stack_depth_init, b4_stack_depth_max, b4_parser_class_name):
-	These.
-
-2002-10-19  Paul Eggert  <eggert@twinsun.com>
-
-	Do not create a temporary file, as that involves security and
-	cleanup headaches.  Instead, use a pair of pipes.
-	Derived from a suggestion by Florian Krohm.
-	* lib/subpipe.c, lib/subpipe.h, m4/subpipe.m4: New files.
-	* lib/mkstemp.c, lib/readpipe.c, lib/tempname.c, m4/mkstemp.m4: Remove.
-	* configure.ac (UTILS_FUNC_MKSTEMP, jm_PREREQ_TEMPNAME): Remove.
-	(BISON_PREREQ_SUBPIPE): Add.
-	* lib/Makefile.am (libbison_a_SOURCES): Remove readpipe.c.
-	Add subpipe.h, subpipe.c.
-	* m4/Makefile.am (EXTRA_DIST): Remove mkstemp.m4.  Add subpipe.m4.
-	* po/POTFILES.in: Add lib/subpipe.c.
-	* src/output.c: Include "subpipe.h".
-	(m4_invoke): Remove decl.
-	(scan_skel): New decl.
-	(output_skeleton): Use pipe rather than temporary file for m4 input.
-	Check that m4sugar.m4 is readable, to avoid deadlock.
-	Check for pipe I/O error.
-	* src/scan-skel.l (readpipe): Remove decl.
-	(scan_skel): New function, to be used in place of m4_invoke.
-	Read from stream rather than file.
-
-	* lib/timevar.c (TICKS_TO_MSEC, CLOCKS_TO_MSEC): Do not cast to
-	float, as this generates a warning on Solaris 8 + GCC 3.2 with
-	--enable-gcc-warnings.  Instead, divide into 1.0 rather than 1;
-	this generates a more-accurate value anyway.
-
-	* lib/timevar.c (timervar_accumulate): Rename locals to
-	avoid confusion with similarly-named more-global.
-	* src/muscle_tab.c (muscle_pair_list_grow): Likewise.
-
-	* src/output.c (prepare): Use xstrdup to convert char const *
-	to char *, to avoid GCC warning.
-
-2002-10-19  Akim Demaille  <akim@epita.fr>
-
-	* tests/calc.at (_AT_DATA_CALC_Y): Define VAL, LOC, LEX_FORMALS,
-	LEX_PRE_FORMALS, LEX_ARGS, LEX_PRE_ARGS, USE_LEX_ARGS.
-	Use them to have `calc.y' ready for %pure-parser.
-	* data/yacc.c (YYLEX): Pass a yylex return type to
-	b4_c_function_call.
-
-2002-10-19  Akim Demaille  <akim@epita.fr>
-
-	Prototype support of %lex-param and %parse-param.
-
-	* src/parse-gram.y: Add the definition of the %lex-param and
-	%parse-param tokens, plus their rules.
-	Drop the `_' version of %glr-parser.
-	Add the "," token.
-	* src/scan-gram.l (INITIAL): Scan them.
-	* src/muscle_tab.c: Comment changes.
-	(muscle_insert, muscle_find): Rename `pair' as `probe'.
-	* src/muscle_tab.h (MUSCLE_INSERT_PREFIX): Remove unused.
-	(muscle_entry_s): The `value' member is no longer const.
-	Adjust all dependencies.
-	* src/muscle_tab.c (muscle_init): Adjust: use
-	MUSCLE_INSERT_STRING.
-	Initialize the obstack earlier.
-	* src/muscle_tab.h, src/muscle_tab.c (muscle_grow)
-	(muscle_pair_list_grow): New.
-	* data/c.m4 (b4_c_function_call, b4_c_args): New.
-	* data/yacc.c (YYLEX): Use b4_c_function_call to honor %lex-param.
-	* tests/calc.at: Use %locations, not --locations.
-	(AT_CHECK_CALC_GLR): Use %glr-parser, not %glr_parser.
-
-2002-10-19  Akim Demaille  <akim@epita.fr>
-
-	* src/getargs.c (usage): Take status as argument and exit
-	accordingly.
-	Report the traditional `Try ... --help' message when status != 0.
-	(usage, version): Don't take a FILE * as arg, it is pointless.
-	(getargs): When there is an incorrect number of arguments, make it
-	an error, and report it GNUlically thanks to `usage ()'.
-
-2002-10-18  Paul Eggert  <eggert@twinsun.com>
-
-	* data/glr.c (yyreportParseError): Don't assume that sprintf
-	yields the length of the printed string, as this is not true
-	on SunOS 4.1.4.  Reported by Peter Klein.
-
-	* tests/calc.at (_AT_DATA_CALC_Y): #undef memcmp and realloc.
-	* tests/conflicts.at (%nonassoc and eof): Likewise.
-	Fixes SunOS 4.1.4 test failure reported by Peter Klein.
-
-2002-10-17  Akim Demaille  <akim@epita.fr>
-
-	* src/getargs.h (trace_e): Add trace_scan, and trace_parse.
-	* src/getargs.c (trace_types, trace_args): Adjust.
-	* src/reader.c (grammar_current_rule_prec_set)
-	(grammar_current_rule_dprec_set, grammar_current_rule_merge_set):
-	Standardize error messages.
-	And s/@prec/%prec/!
-	(reader): Use trace_flag to enable scanner/parser debugging,
-	instead of an adhoc scheme.
-	* src/scan-gram.l: Remove trailing debugging code.
-
-2002-10-16  Paul Eggert  <eggert@twinsun.com>
-
-	* src/muscle_tab.h (MUSCLE_TAB_H_): Was misspelled as
-	MUSCLE_TAB_H.
-
-	* NEWS: Officially drop support for building Bison with K&R C,
-	since it didn't work anyway and it's not worth worrying about.
-	* Makefile.maint (wget_files): Remove ansi2knr.c.
-	(ansi2knr.c-url_prefix): Remove.
-	* lib/.cvsignore: Remove ansi2knr, ansi2knr.*.
-	* lib/Makefile.am (AUTOMAKE_OPTIONS): Remove.
-	* src/Makefile.am (AUTOMAKE_OPTIONS): Remove.
-
-2002-10-15  Paul Eggert  <eggert@twinsun.com>
-
-	Stop using the "enum_" trick for K&R-style function definitions;
-	it confused me, and I was the author!  Instead, assume that people
-	who want to use K&R C compilers (when using these modules in GCC,
-	perhaps?) will run ansi2knr.
-
-	* lib/bbitset.h: (enum_bitset_ops, enum_bitset_type): Remove.
-	All uses of "enum_" changed to "enum ".
-	* lib/ebitset.c (enum_ebitset_find_mode): Likewise.
-	* lib/lbitset.c (enum_lbitset_find_mode): Likewise.
-
-	* lib/abitset.c (abitset_and, abitset_and_cmp, abitset_and_or,
-	abitset_and_or_cmp, abitset_andn, abitset_andn_cmp,
-	abitset_andn_or, abitset_andn_or_cmp, abitset_bytes, abitset_copy,
-	abitset_copy1, abitset_disjoint_p, abitset_empty_p,
-	abitset_equal_p, abitset_init, abitset_list, abitset_list_reverse,
-	abitset_not, abitset_ones, abitset_or, abitset_or_and,
-	abitset_or_and_cmp, abitset_or_cmp, abitset_reset, abitset_set,
-	abitset_size, abitset_small_list, abitset_subset_p, abitset_test,
-	abitset_unused_clear, abitset_xor, abitset_xor_cmp, abitset_zero):
-	Use function prototypes; this removes the need for declaring
-	static functions simply to provide their prototypes.
-	* lib/bitset.c (bitset_alloc, bitset_and_or_, bitset_and_or_cmp_,
-	bitset_andn_or_, bitset_andn_or_cmp_, bitset_bytes, bitset_copy_,
-	bitset_count_, bitset_create, bitset_dump, bitset_first,
-	bitset_free, bitset_init, bitset_last, bitset_next,
-	bitset_obstack_alloc, bitset_obstack_free, bitset_only_set_p,
-	bitset_op4_cmp, bitset_or_and_, bitset_or_and_cmp_, bitset_prev,
-	bitset_print, bitset_release_memory, bitset_toggle_,
-	bitset_type_choose, bitset_type_get, bitset_type_name_get,
-	debug_bitset): Likewise.
-	* lib/bitset.h (bitset_set, bitset_reset, bitset_test): Likewise.
-	* lib/bitset_stats.c (bitset_log_histogram_print,
-	bitset_percent_histogram_print, bitset_stats_and,
-	bitset_stats_and_cmp, bitset_stats_and_or,
-	bitset_stats_and_or_cmp, bitset_stats_andn, bitset_stats_andn_cmp,
-	bitset_stats_andn_or, bitset_stats_andn_or_cmp, bitset_stats_copy,
-	bitset_stats_count, bitset_stats_disable, bitset_stats_disjoint_p,
-	bitset_stats_dump, bitset_stats_empty_p, bitset_stats_enable,
-	bitset_stats_equal_p, bitset_stats_free, bitset_stats_init,
-	bitset_stats_list, bitset_stats_list_reverse, bitset_stats_not,
-	bitset_stats_ones, bitset_stats_or, bitset_stats_or_and,
-	bitset_stats_or_and_cmp, bitset_stats_or_cmp, bitset_stats_print,
-	bitset_stats_print_1, bitset_stats_read, bitset_stats_reset,
-	bitset_stats_set, bitset_stats_size, bitset_stats_subset_p,
-	bitset_stats_test, bitset_stats_toggle, bitset_stats_type_get,
-	bitset_stats_write, bitset_stats_xor, bitset_stats_xor_cmp,
-	bitset_stats_zero): Likewise.
-	* lib/bitsetv.c (bitsetv_alloc, bitsetv_create, bitsetv_free,
-	bitsetv_zero, bitsetv_ones, bitsetv_transitive_closure,
-	bitsetv_dump, debug_bitsetv): Likewise.
-	* lib/ebitset.c (ebitset_and, ebitset_and_cmp, ebitset_andn,
-	ebitset_andn_cmp, ebitset_bytes, ebitset_copy, ebitset_copy_,
-	ebitset_copy_cmp, ebitset_disjoint_p, ebitset_elt_add,
-	ebitset_elt_alloc, ebitset_elt_calloc, ebitset_elt_find,
-	ebitset_elt_free, ebitset_elt_last, ebitset_elt_remove,
-	ebitset_elt_zero_p, ebitset_elts_grow, ebitset_empty_p,
-	ebitset_equal_p, ebitset_free, ebitset_init, ebitset_list,
-	ebitset_list_reverse, ebitset_not, ebitset_ones, ebitset_op3_cmp,
-	ebitset_or, ebitset_or_cmp, ebitset_release_memory, ebitset_reset,
-	ebitset_set, ebitset_size, ebitset_subset_p, ebitset_test,
-	ebitset_weed, ebitset_xor, ebitset_xor_cmp, ebitset_zero):
-	Likewise.
-	* lib/lbitset.c (debug_lbitset, lbitset_and, lbitset_and_cmp,
-	lbitset_andn, lbitset_andn_cmp, lbitset_bytes, lbitset_copy,
-	lbitset_copy_cmp, lbitset_disjoint_p, lbitset_elt_alloc,
-	lbitset_elt_calloc, lbitset_elt_find, lbitset_elt_free,
-	lbitset_elt_link, lbitset_elt_unlink, lbitset_elt_zero_p,
-	lbitset_empty_p, lbitset_equal_p, lbitset_free, lbitset_init,
-	lbitset_list, lbitset_list_reverse, lbitset_not, lbitset_ones,
-	lbitset_op3_cmp, lbitset_or, lbitset_or_cmp, lbitset_prune,
-	lbitset_release_memory, lbitset_reset, lbitset_set, lbitset_size,
-	lbitset_subset_p, lbitset_test, lbitset_weed, lbitset_xor,
-	lbitset_xor_cmp, lbitset_zero): Likewise.
-
-2002-10-14  Akim Demaille  <akim@epita.fr>
-
-	Version 1.75.
-
-2002-10-14  Akim Demaille  <akim@epita.fr>
-
-	* tests/Makefile.am (maintainer-check-posix): New.
-
-2002-10-14  Akim Demaille  <akim@epita.fr>
-
-	* data/glr.c [YYDEBUG] (YYLEFTMOST_STATE): Initialize the yyloc
-	member.
-
-2002-10-14  Akim Demaille  <akim@epita.fr>
-
-	* src/tables.c (table_ninf_remap): base -> tab.
-	Reported by Matt Rosing.
-
-2002-10-14  Paul Eggert  <eggert@twinsun.com>
-
-	* tests/action.at, tests/calc.at, tests/conflicts.at,
-	tests/cxx-type.at, tests/headers.at, tests/input.at,
-	tests/regression.at, tests/synclines.at, tests/torture.at:
-	Say "bison -o foo.c foo.y", not "bison foo.y -o foo.c",
-	so that the tests still work even if POSIXLY_CORRECT is set.
-	* doc/bison.texinfo (Rpcalc Compile, Invocation): Likewise.
-
-	* data/c.m4 (b4_int_type): Use yysigned_char instead of signed char,
-	for portability to K&R hosts.  Fix typo: signed char is guaranteed
-	only to 127, not to 128.
-	* data/glr.c (yysigned_char): New type.
-	* data/yacc.c (yysigned_char): Likewise.
-	* tests/regression.at (Web2c Actions): signed char -> yysigned_char.
-
-2002-10-13  Paul Eggert  <eggert@twinsun.com>
-
-	* data/yacc.c (yyparse): Rewrite to avoid "comparison is always
-	true due to limited range of data type" warning from GCC.
-
-	* data/c.m4 (b4_token_defines): Protect against double-inclusion
-	by wrapping enum yytokentype's definition inside #ifndef
-	YYTOKENTYPE.  This undoes a bug I introduced on 2002-10-12.
-
-2002-10-13  Akim Demaille  <akim@epita.fr>
-
-	* data/glr.c (yyglrShiftDefer, yyaddDeferredAction, yydoAction):
-	Un yy- yyrhs to avoid the name clash with the global YYRHS.
-
-2002-10-13  Akim Demaille  <akim@epita.fr>
-
-	* Makefile.maint: Update from Autoconf 2.54.
-	* m4/strerror_r.m4 (AC_FUNC_STRERROR_R): Remove, shipped with 2.54.
-
-2002-10-13  Akim Demaille  <akim@epita.fr>
-
-	* src/print.c (print_state): Separate the list of solved conflicts
-	from the other items.
-	* tests/conflicts.at (Resolved SR Conflicts): Adjust.
-
-2002-10-13  Akim Demaille  <akim@epita.fr>
-
-	Let nondeterministic skeletons be usable with deterministic
-	tables.
-
-	With the patch, GAWK compiled by GCC without -O2 passes its test
-	suite using a GLR parser driven by LALR tables.  It fails with -O2
-	because `struct stat' gives two different answers on my machine:
-	88 (definition of an auto var) and later 96 (memset on this var).
-	Hence the stack is badly corrumpted.  The headers inclusion is to
-	blame: if I move the awk.h inclusion before GLR's system header
-	inclusion, the two struct stat have the same size.
-
-	* src/tables.c (pack_table): Always create conflict_table.
-	(token_actions): Always create conflict_list.
-	* data/glr.c (YYFLAG): Remove, unused.
-
-2002-10-13  Akim Demaille  <akim@epita.fr>
-
-	* configure.ac (AC_GNU_SOURCE): Use it instead of hand written code.
-	(O0FLAGS): New.
-	(VALGRIND, GXX): New.
-	* tests/atlocal.in (CFLAGS): Use O0FLAGS.
-	* tests/bison.in: Run $PREBISON a pre-command.
-	* tests/Makefile.am (maintainer-check, maintainer-check-valgrind)
-	(maintainer-check-g++): New.
-	* Makefile.am (maintainer-check): New.
-
-2002-10-13  Akim Demaille  <akim@epita.fr>
-
-	* data/glr.c: Formatting changes.
-	Tweak some trace messages to match yacc.c's.
-
-2002-10-13  Akim Demaille  <akim@epita.fr>
-
-	GLR parsers sometimes raise parse errors instead of performing the
-	default reduction.
-	Reported by Charles-Henry de Boysson.
-
-	* tests/calc.at (_AT_CHECK_CALC, _AT_CHECK_CALC_ERROR): Don't
-	check the length of the traces when %glr.
-	(_AT_CHECK_CALC_ERROR): Also skip `^Stack' lines, coming from
-	GLR's traces.
-	(AT_CHECK_CALC_LALR, AT_CHECK_CALC_GLR): New.
-	Test GLR parsers.
-	* data/glr.c (YYLEFTMOST_STATE): Fix its value.
-	(yyltype): Remove the yy prefix from the member names.
-	(yytable): Complete its comment.
-	(yygetLRActions): Map error action number from YYTABLE from
-	YYTABLE_NINF to 0.
-	(yyisErrorAction): No longer compare YYACTION to YYPACT_NINF
-	(which was a bug: it should have been YYTABEL_NINF, and yet it was
-	not satisfying as we could compare an YYACTION computed from
-	YYDEFACT to YYTABLE_NINF although they are unrelated): 0 is the
-	only value for error actions.
-	(yyreportParseError): In verbose parse error messages, don't issue
-	`error' in the list of expected tokens.
-	* data/yacc.c (yyparse) <yybackup>: Rewrite the decoding of the
-	next action to perform to match glr.c's decoding.
-	(yytable): Complete its comment.
-
-2002-10-13  Paul Eggert  <eggert@twinsun.com>
-
-	Fix problem reported by Henrik Grubbstroem in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-10/msg00098.html>:
-	"nonterm: { $$ = 123; } { $$ = $1; };" was wrongly rejected,
-	because the Bison parser reads the second action before reducing
-	the first one.
-	* src/scan-gram.l (rule_length): New static var.
-	Use it to keep track of the rule length in the scanner, since
-	we can't expect the parser to be in lock-step sync with the scanner.
-	(handle_action_dollar, handle_action_at): Use this var.
-	* tests/actions.at (Exotic Dollars): Test for the problem.
-
-2002-10-12  Paul Eggert  <eggert@twinsun.com>
-
-	* lib/timevar.c [! IN_GCC && HAVE_SYS_TIME_H]: Include <sys/time.h>.
-	* m4/timevar.m4 (BISON_PREREQ_TIMEVAR): Check for <sys/time.h>.
-	Include <sys/time.h> when checking for clock_t and struct tms.
-	Use same include order as source.
-	This is for the SunOS 4.1.4 porting bug reported by Peter Klein in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-10/msg00016.html>.
-
-	* lib/timevar.c: Update copyright date and clarify comments.
-	(get_time) [IN_GCC]: Keep the GCC version for reference.
-
-	* lib/timevar.c, lib/timevar.h, lib/timevar.def: Import
-	GCC version as of today, then merge Bison's changes.
-	Change "GCC" to "Bison" in copyright notice.  timevar.def's
-	author is Akim, so change that too.
-
-	* src/reader.c (grammar_current_rule_check):
-	Don't worry about the default action if $$ is untyped.
-	Prevents bogus warnings reported by Jim Gifford in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-10/msg00015.html>.
-
-	* data/c.m4 (b4_token_enum): Do not define YYTOKENTYPE.
-	* data/glr.c, data/lalr1.cc, data/yacc.c:
-	Output token definitions before the first part of user declarations.
-	Fixes compatibility problem reported by Jim Gifford for kbd in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-10/msg00014.html>.
-
-2002-10-11  Paul Eggert  <eggert@twinsun.com>
-
-	* data/yacc.c (yyreport_parse_error): Remove, putting its body into...
-	(yyparse): here.  This undoes some of the 2002-07-25 change.
-	Compatibility problem reported by Ralf S. Engelschall with
-	OSSP cfg <http://www.ossp.org/pkg/lib/cfg/>.
-
-2002-10-11  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at Characters Escapes): New.
-	* src/scan-gram.l (SC_ESCAPED_CHARACTER): Accept \' in strings and
-	characters.
-	Reported by Jan Nieuwenhuizen.
-
-2002-10-11  Akim Demaille  <akim@epita.fr>
-
-	* po/id.po: New.
-
-2002-10-10  Paul Eggert  <eggert@twinsun.com>
-
-	Portability fixes for bitsets; this also avoids several GCC
-	warnings.
-
-	* lib/abitset.c: Include <stddef.h>, for offsetof.
-	* lib/lbitset.c: Likewise.
-
-	* lib/abitset.c (abitset_bytes): Return a size that is aligned
-	properly for vectors of objects.  Do not assume that adding a
-	header size to a multiple of a word size yields a value that is
-	properly aligned for the whole union.
-	* lib/bitsetv.c (bitsetv_alloc): Likewise.
-
-	* lib/bitset_stats.c (bitset_stats_bytes): Adjust to new,
-	unique names for structures.
-	* lib/ebitset.c (ebitset_bytes): Likewise.
-	* lib/lbitset.c (lbitset_bytes): Likewise.
-
-	* lib/abitset.c (abitset_ones, abitset_zero, abitset_empty_p,
-	abitset_copy1, abitset_not, abitset_equal_p, abitset_subset_p,
-	abitset_disjoint_p, abitset_and, abitset_and_cmp, abitset_andn,
-	abitset_andn_cmp, abitset_or, abitset_or_cmp, abitset_xor,
-	abitset_xor_cmp, abitset_and_or, abitset_and_or_cmp,
-	abitset_andn_or, abitset_andn_or_cmp, abitset_or_and,
-	abitset_or_and_cmp, abitset_copy): Supply prototype decls,
-	to improve the type-checking that GCC can do.
-	* lib/bitset.c (bitset_op4_cmp): Likewise.
-	* lib/bitset_stats.c (bitset_stats_count,
-	bitset_stats_empty_p, bitset_stats_ones, bitset_stats_zero,
-	bitset_stats_copy, bitset_stats_disjoint_p,
-	bitset_stats_equal_p, bitset_stats_not, bitset_stats_subset_p,
-	bitset_stats_and, bitset_stats_and_cmp, bitset_stats_andn,
-	bitset_stats_andn_cmp, bitset_stats_or, bitset_stats_or_cmp,
-	bitset_stats_xor, bitset_stats_xor_cmp, bitset_stats_and_or,
-	bitset_stats_and_or_cmp, bitset_stats_andn_or,
-	bitset_stats_andn_or_cmp, bitset_stats_or_and,
-	bitset_stats_or_and_cmp): Likewise.
-	* lib/lbitset.c (lbitset_and, lbitset_and_cmp, lbitset_andn,
-	lbitset_andn_cmp, lbitset_or, lbitset_or_cmp, lbitset_xor,
-	lbitset_xor_cmp, lbitset_empty_p, lbitset_ones, lbitset_not,
-	lbitset_subset_p, lbitset_disjoint_p, debug_lbitset): Likewise.
-
-	* lib/abitset.h: Include bitset.h, not bbitset.h.
-	* lib/ebitset.h: Likewise.
-	* lib/lbitset.h: Likewise.
-
-	* lib/bbitset.h: (enum_bitset_ops, enum_bitset_type): New types.
-	All instances of parameters of type enum bitset_opts are now of
-	type enum_bitset_opts, to conform to the C Standard, and similarly
-	for enum_bitset_type.
-	* lib/ebitset.c (enum_ebitset_find_mode): Likewise.
-	* lib/lbitset.c (enum_lbitset_find_mode): Likewise.
-
-	Do not use "struct bitset_struct" to mean different things in
-	different modules.  Not only is this confusing, it violates
-	the C Standard, which requires that structure types in different
-	modules must be compatible if one is to be passed to the other.
-	* lib/bbitset.h (bitset): Now points to a union, not to a struct.
-	All instances of "struct bitset_struct *" replaced with "bitset".
-	* lib/bitset.h (struct bitset_struct): Remove, replacing with....
-	(union bitset_union, struct abitset_struct, struct ebitset_struct,
-	struct lbitset_struct, struct bitset_stats_struct): New types.
-	All uses of struct bitset_struct changed to union bitset_union,
-	etc.
-	* lib/abitset.c (struct abitset_struct, abitset,
-	struct bitset_struct): Remove.
-	* lib/bitset_stats.c (struct bitset_stats_struct, bitset_stats,
-	struct bitset_struct): Remove.
-	* lib/ebitset.c (struct ebitset_struct, ebitset, struct
-	bitset_struct): Remove.
-	* lib/lbitset.c (struct lbitset_struct, lbitset, bitset_struct):
-	Likewise.
-
-	Do not call a function of type T using a call that assumes the
-	function is of a different type U.  Standard C requires that a
-	function must be called with a type that is compatible with its
-	definition.
-	* lib/bbitset.h (bitset_and_or_, bitset_andn_or_, bitset_or_and_):
-	New decls.
-	* lib/bitset.c (bitset_and_or_, bitset_andn_or_, bitset_or_and_):
-	New functions.
-	* lib/ebitset.c (PFV): Remove.
-	* lib/lbitset.c (PFV): Likewise.
-	* lib/ebitset.c (ebitset_and, ebitset_andn, ebitset_or,
-	ebitset_xor, ebitset_copy, ebitset_ones, ebitset_empty_p): New
-	decls.
-	(ebitset_and, ebitset_andn, ebitset_or, ebitset_xor): New functions.
-	(ebitset_vtable): Use them.
-	* lib/lbitset.c (lbitset_and, lbitset_andn, lbitset_or,
-	lbitset_xor): New functions.
-	(lbitset_vtable): Use them.
-
-	* lib/bitset.h (bitset_next, bitset_prev, bitset_only_set_p):
-	Declare.
-
-	* lib/bitsetv.c (bitsetv_alloc): Add a cast to (void *) to avoid a
-	GCC warning.
-	* lib/lbitset.c (LBITSET_CURRENT1): Likewise.
-	Use offsetof, for simplicity.
-
-2002-10-06  Paul Eggert  <eggert@twinsun.com>
-
-	* lib/bitset.h (bitset_reset): Do not assume that bitset_word is
-	the same width as int.  This reapplies a hunk of the 2002-08-12 patch
-	<http://lists.gnu.org/archive/html/bison-patches/2002-08/msg00007.html>,
-	which was inadvertently undone by the 2002-09-30 patch.
-	* lib/lbitset.c (debug_lbitset): Do not assume that bitset_word is
-	the same width as int.
-
-2002-10-04  Paul Eggert  <eggert@twinsun.com>
-
-	Version 1.50.
-
-	* configure.ac (AC_INIT), NEWS: Increment version number.
-
-	* doc/bison.texinfo: Minor spelling, grammar, and white space
-	fixes.
-	(Symbols): Mention that any negative value returned from yylex
-	signifies end-of-input.  Warn about negative chars.  Mention
-	the portable Standard C character set.
-
-	The GNU coding standard says CFLAGS and YFLAGS are reserved
-	for the installer to set.
-	* lib/Makefile.am (AM_CFLAGS): Renamed from CFLAGS.
-	* src/Makefile.am (AM_CFLAGS): Likewise.
-	(AM_YFLAGS): Renamed from YFLAGS.
-
-	Fix some MAX and MIN problems.
-	* src/gram.h (ITEM_NUMBER_MIN): MIN_MAX -> INT_MIN.
-	* src/lalr.h (GOTO_NUMBER_MAX): INT_MAX -> SHRT_MAX.
-	* src/symtab.h (SYMBOL_NUMBER_MAX): New macro.
-	* src/reader.c (reader): Use it.
-
-	* tests/regression.at (Braces parsing): Use grep, not fgrep, as
-	POSIX 1003.1-2001 has removed fgrep.
-
-2002-10-04  Michael Hayes  <m.hayes@elec.canterbury.ac.nz>
-
-	* lib/bbitset.h (BITSET_WINDEX_MAX): Redefine so that it cannot be
-	interpreted as signed.
-	* lib/ebitset.c (ebitset_list): Fix bug.
-
-2002-10-01  Paul Eggert  <eggert@twinsun.com>
-
-	More fixes for 64-bit hosts and large bitsets.
-
-	* lib/abitset.c (struct abitset_struct.n_bits, abitset_small_list,
-	abitset_size, abitset_list, abitset_list_reverse, abitset_list):
-	Use bitset_bindex, not int or unsigned int or size_t, to count bits.
-	* lib/bbitset.h (struct bitset_vtable.size, struct bitset_vtable.count,
-	struct bitset_vtable.list, struct bitset_vtable.list_reverse,
-	bitset_count_, bitset_next, bitset_prev, bitset_first, bitset_last,
-	bitset_count_): Likewise.
-	* lib/bitset.h (bitset_iterator.num, bitset_iterator.i,
-	bitset_first, bitset_last): Likewise.
-	* lib/bitset_stats.c (bitset_stats_size, bitset_stats_list,
-	bitset_stats_list_reverse, bitset_stats_size,
-	bitset_stats_count, bitset_stats_list, bitset_stat_list_reverse):
-	Likewise.
-	* lib/bitsetv-print.c (bitsetv_matrix_dump): Likewise.
-	* lib/bitsetv.c (bitsetv_alloc, bitsetv_create, bitsetv_free,
-	bitsetv_zero, bitsetv_ones, bitsetv_transitive_closure,
-	bitsetv_reflexive_transitive_closure): Likewise.
-	* lib/bitsetv.h (bitsetv_alloc, bitsetv_create): Likewise.
-	* lib/ebitset.c (ebitset_size, ebitset_list, ebitset_list_reverse):
-	Likewise.
-	* lib/lbitset.c (lbitset_size, lbitset_list, lbitset_list_merge):
-	Likewise.
-
-	* lib/abitset.c (abitset_ones, abitset_zero, abitset_bytes):
-	Use size_t, not unsigned int, to count bytes.
-	* lib/abitset.h (abitset_bytes): Likewise.
-	* lib/bitset.c (bitset_bytes, bitset_alloc, bitset_obstack_alloc):
-	Likewise.
-	* lib/bitset.h (bitset_bytes): Likewise.
-	* lib/bitset_stats.c (bitset_stats_bytes, bitset_stats_init): Likewise.
-	* lib/bitset_stats.h (bitset_stats_bytes): Likewise.
-	* lib/bitsetv.c (bitsetv_alloc): Likewise.
-	* lib/ebitset.c (ebitset_bytes): Likewise.
-	* lib/ebitset.h (ebitset_bytes): Likewise.
-	* lib/lbitset.c (lbitset_bytes): Likewise.
-	* lib/lbitset.h (lbitset_bytes): Likewise.
-
-	* lib/abitset.c (abitset_empty_p, abitset_not, abitset_equal_p,
-	abitset_subset_p, abitset_disjoint_p, abitset_and,
-	abitset_and_cmp, abitset_andn, abitset_andn_cmp, abitset_or,
-	abitset_or_cmp, abitset_xor, abitset_xor_cmp, abitset_and_or,
-	abitset_and_or_cmp, abitset_andn_or, abitset_andn_or_cmp,
-	abitset_or_and, abitset_or_and_cmp):
-	Use bitset_windex instead of unsigned int.
-	* lib/bitsetv.c (bitsetv_dump, debug_bitsetv): Likewise.
-	* lib/ebitset.c (struct ebitset_struct.size, ebitset_elts_grow,
-	ebitset_elt_add, ebitset_elt_remove, ebitset_weed,
-	ebitset_elt_find, ebitset_list_reverse, ebitset_list, ebitset_init):
-	Likewise.
-	* lib/lbitset.c (lbitset_ones, lbitset_not): Likewise.
-
-	* lib/bitset.c (bitset_print):
-	Use proper printf formats for widths of integer types.
-	* lib/bitset_stats.c (bitset_percent_histogram_print,
-	bitset_log_histogram_print, bitset_stats_print_1): Likewise.
-	* lib/bitsetv-print.c (bitsetv_matrix_dump): Likewise.
-	* lib/bitsetv.c (bitsetv_dump, debug_bitsetv): Likewise.
-	* lib/lbitset.c (lbitset_bytes): Likewise.
-
-	* lib/bbitset.h (BITSET_BINDEX_MAX, BITSET_WINDEX_MAX,
-	BITSET_SIZE_MAX): New macros.
-	(BITSET_INDEX_MAX): Remove.  It wasn't right, since it assumed that
-	sizeof (bitset_word) == sizeof (bitset_windex).  All uses changed
-	to BITSET_WINDEX_MAX.
-
-	* lib/bitset.c (bitset_next, bitset_prev, bitset_first,
-	bitset_last): Return BITSET_BINDEX_MAX (not -1) for no value,
-	since we now return the bitset_bindex type (not int).
-
-	* lib/bitsetv.c (bitsetv_alloc): Check for arithmetic overflow
-	when computing sizes.
-	* lib/ebitset.c (ebitset_elts_grow): Likewise.
-
-	* lib/lbitset.c (lbitset_elt_find): Simplify windex calculation
-	and avoid cast to unsigned.
-
-2002-09-30  Akim Demaille  <akim@epita.fr>
-
-	* lib/abitset.c, lib/bbitset.h, lib/bitset.c, lib/bitset.h,
-	* lib/bitset_stats.c, lib/bitsetv.c, lib/ebitset.c, lib/lbitset.c:
-	Updates from Michael Hayes.
-
-2002-09-30  Art Haas  <ahaas@neosoft.com>
-
-	* configure.ac: Update AC_OUTPUT and AM_CONFIG_HEADER
-	invocations.
-	* tests/cxx-type.at (declarator): Don't rely on NDEBUG being not
-	defined.
-
-2002-09-27  Akim Demaille  <akim@epita.fr>
-
-	Version 1.49c.
-
-2002-09-27  Akim Demaille  <akim@epita.fr>
-
-	* configure.ac (AM_INIT_AUTOMAKE): We _need_ 1.7.
-	(Because of AC_LIBSOURCE).
-
-2002-09-27  Akim Demaille  <akim@epita.fr>
-
-	Playing with Autoscan.
-
-	* configure.ac: Remove the old LIBOBJ tweaks.
-	(AC_REPLACE_FUNCS): Add strrchr and strtol.
-	* lib/strrchr.c: New.
-	* lib/strtol.c: New, from the Coreutils 4.5.1.
-
-2002-09-27  Akim Demaille  <akim@epita.fr>
-
-	Playing with Autoscan.
-
-	* m4/prereq.m4 (jm_PREREQ_ARGMATCH, jm_FUNC_ARGMATCH): New.
-	* lib/Makefile.am (libbison_a_SOURCES): No longer include
-	argmatch.c and argmatch.h, since they are AC_LIBSOURCE'd.
-	* lib/strcasecmp.c, lib/strncasecmp.c, lib/memcmp.c: New, from the
-	Coreutils 4.5.1.
-
-2002-09-24  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (Stack Overflow): xref to Recursion.
-	(Frequently Asked Questions, Parser Stack Overflow): New.
-
-2002-09-13  Akim Demaille  <akim@epita.fr>
-
-	Playing with autoscan.
-
-	* src/reader.c (get_merge_function): Use xstrdup, not strdup.
-	* src/files.c (skeleton_find): Remove, unused.
-	* m4/memcmp.m4: New, from the Coreutils 4.5.1.
-	* m4/prereq.m4 (jm_PREREQ_QUOTEARG): Run jm_FUNC_MEMCMP.
-
-2002-09-13  Akim Demaille  <akim@epita.fr>
-
-	* configure.ac (AM_INIT_AUTOMAKE): Require Automake 1.6.3.
-	* Makefile.am (AUTOMAKE_OPTIONS): Don't.
-
-2002-09-13  Akim Demaille  <akim@epita.fr>
-
-	* configure.ac: Require 2.54.
-	s/jm_FUNC_MALLOC/AC_FUNC_MALLOC/.
-	s/jm_FUNC_REALLOC/AC_FUNC_REALLOC/.
-	* m4/c-bs-a.m4, m4/malloc.m4, m4/mbstate_t.m4, m4/realloc.m4:
-	Remove, provided by Autoconf macros.
-
-2002-09-12  Akim Demaille  <akim@epita.fr>
-
-	* m4/prereq.m4: Update, from Coreutils 4.5.1.
-
-2002-09-12  Akim Demaille  <akim@epita.fr>
-
-	* m4/prereq.m4: Update, from Fileutils 4.1.5.
-	* configure.ac (jm_PREREQ_TEMPNAME): Invoke it.
-	Reported by Martin Mokrejs.
-
-2002-09-10  Akim Demaille  <akim@epita.fr>
-
-	* src/parse-gram.y: Associate a human readable string to each
-	token type.
-	* tests/regression.at (Invalid inputs): Adjust.
-
-2002-09-10  Gary V. Vaughan  <gary@gnu.org>
-
-	* tests/Makefile.am ($(srcdir)/package.m4): Bison now ships
-	with an Autoconf-2.5x style configure.ac.
-
-2002-09-06  Paul Eggert  <eggert@twinsun.com>
-
-	* doc/bison.texinfo (Conditions): Make explicit that the GPL
-	exception applies only to yacc.c.  This is a modification of a
-	patch originally suggested by Akim Demaille.
-
-2002-09-06  Akim Demaille  <akim@epita.fr>
-
-	* data/c.m4 (b4_copyright): Move the GPL exception comment from
-	here to...
-	* data/yacc.c: here.
-
-	* data/lalr1.cc (struct yyltype): Don't define it, since we use
-	LocationType.
-	(b4_ltype): Default to yy::Location from location.hh.
-
-2002-09-04  Jim Meyering  <jim@meyering.net>
-
-	* data/yacc.c: Guard the declaration of yytoknum also with
-	`#ifdef YYPRINT', so it is declared only when used.
-
-2002-09-04  Akim Demaille  <akim@epita.fr>
-
-	* configure.in: Rename as...
-	* configure.ac: this.
-	Bump to 1.49c.
-
-2002-09-04  Akim Demaille  <akim@epita.fr>
-
-	* src/assoc.c, src/closure.c, src/gram.c, src/injections.c,
-	* src/lalr.c, src/LR0.c, src/relation.c, src/tables.c: Don't
-	translate maintainer only messages.
-
-2002-08-12  Paul Eggert  <eggert@twinsun.com>
-
-	Version 1.49b.
-
-	* Makefile.am (SUBDIRS): Remove intl.
-	(DISTCLEANFILES): Remove.
-	* NEWS: Mention that GNU M4 is now required.  Clarify what is
-	meant by "larger grammars".  Mention the pt_BR translation.
-	* configure.in (AC_CHECK_DECLS): Add getenv, getopt.
-	(AM_GNU_GETTEXT_VERSION): New macro, replacing GETTEXT_VERSION var.
-	Bump version from 0.11.2 to 0.11.5.
-	(BISON_PREREQ_STAGE): Remove.
-	(AM_GNU_GETTEXT): Use external gettext.
-	(AC_OUTPUT): Remove intl/Makefile.
-
-	* config/depcomp, config/install-sh: Sync with Automake 1.6.3.
-
-	* data/glr.c: Include string.h, for strlen.
-	(yyreportParseError): Use size_t for yysize.
-	(yy_yypstack): No longer nested inside yypstates, as nested
-	functions are not portable.  Do not assume size_t is the
-	same width as int.
-	(yypstates): Do not assume that ptrdiff_t is the same width
-	as int, and similarly for yyposn and YYINDEX.
-
-	* data/yacc.c: Fix comment about `$$ = $1': it can copy garbage.
-
-	* lib/Makefile.am (INCLUDES): Do not include from the intl
-	directory, which has been removed.
-	* src/Makefile.am (INCLUDES): Likewise.
-
-	* lib/Makefile.am (libbison_a_SOURCES): Add unlocked-io.h.
-	(bitsets_sources, additional_bitsets_sources, timevars_sources):
-	New vars.
-
-	* lib/Makefile.am (libbison_a_SOURCES): Avoid +=, a GNU make extension.
-	* tests/Makefile.am (EXTRA_DIST): Likewise.
-
-	* lib/abitset.c (abitset_reverse_list, ebitset_reverse_list):
-	Do not assume that bitset_windex is the same width as unsigned.
-
-	* lib/abitset.c (abitset_unused_clear): Do not assume that
-	bitset_word is the same width as int.
-	* lib/bbitset.h (BITSET_INDEX_MAX, BITSET_MSB): Likewise.
-	* lib/bitset.h (bitset_set, bitset_reset): Likewise.
-	* lib/bitset_stats.c (bitset_stats_set, bitset_stats_reset): Likewise.
-	* lib/ebitset.c (ebitset_set, ebitset_reset): Likewise.
-	* lib/lbitset.c (lbitset_set, lbitset_reset): Likewise.
-
-	* lib/abitset.c (abitset_op1): Use -1, not ~0, as memset arg (for
-	portability to one's complement hosts!).
-	* lib/ebitset.c (ebitset_op1): Likewise.
-	* lib/lbitset.c (lbitset_op1): Likewise.
-
-	* lib/argmatch.c, lib/quotearg.c, quotearg.h: Sync with GNU tar.
-	* lib/argmatch.h, lib/basename.c, lib/dirname.c, lib/dirname.h,
-	lib/hash.c, lib/hash.h, lib/strnlen.c, lib/xmalloc.c:
-	Sync with fileutils.
-	* lib/error.c, lib/getopt.c, lib/getopt.h, lib/getopt1.c,
-	lib/gettext.h: Sync with diffutils.
-
-	* lib/memrchr.c, lib/mkstemp.c, lib/strchr.c, lib/strnlen.c,
-	lib/strspn.c, lib/tempname.c: Use GPL, not LGPL.
-
-	* lib/obstack.c, lib/obstack.h: Sync with fileutils, except use
-	PROTOTYPES to check for prototypes, and "defined __STDC__" to
-	check for void *.
-
-	* lib/bbitset.h (BITSET_WORD_BITS): Now of type unsigned, not
-	size_t; the old version tried to do this but casted improperly.
-	(bitset_bindex, bitset_windex): Now size_t, not unsigned long.
-	(bitset_test): Now returns int, not unsigned long.
-
-	* lib/bitset_stats.c: Include "gettext.h".
-	(_): New macro.
-	(bitset_stats_set, bitset_stats_reset, bitset_stats_test): Don't
-	name locals "index", as it generates unnecessary warnings on some
-	hosts that have an "index" function.
-
-	* lib/bitset_stats.c (bitset_stats_print_1, bitset_stats_print,
-	bitset_stats_read, bitset_stats_write): Wrap strings in _() if
-	they need translation.
-	* src/LR0.c (state_list_append, new_itemsets, get_state,
-	append_states, generate_states): Likewise.
-	* src/assoc.c (assoc_to_string): Likewise.
-	* src/closure.c (print_closure, set_firsts, closure): Likewise.
-	* src/gram.c (grammar_dump): Likewise.
-	* src/injections.c (injections_compute): Likewise.
-	* src/lalr.c (lookaheads_print): Likewise.
-	* src/relation.c (relation_transpose): Likewise.
-	* src/scan-gram.l: Likewise.
-	* src/tables.c (table_grow, pack_vector): Likewise.
-
-	* m4/Makefile.am (EXTRA_DIST): Remove codeset.m4,
-	glibc21.m4, isc-posix.m4 lcmessage.m4, stage.m4.
-	* m4/malloc.m4, m4/realloc.m4: Sync with diffutils.
-	* m4/mbstate_t.m4: Sync with fileutils.
-	* m4/prereq.m4 (jm_PREREQ_QUOTEARG): AC_MBSTATE_T -> AC_TYPE_MBSTATE_T.
-
-	* po/LINGUAS: Add pt_BR.
-	* po/POTFILES.in: Add src/assoc.c, src/closure.c, src/gram.c,
-	src/main.c, src/relation.c, src/state.c, lib/bitset_stats.c,
-	lib/timevar.c.
-	Use src/parse-gram.y instead of src/parse-gram.c, as the gettext
-	manual recommends.
-	Similarly, use src/scan-gram.l instead of src/scan-gram.c.
-
-	* src/complain.c (strerror_r): Remove decl; not needed.
-	(strerror): Use same pattern as ../lib/error.c.
-
-	* src/files.c, src/files.h (compute_header_macro): Remove; unused.
-
-	* src/gram.c (grammar_dump): Do not assume ptrdiff_t fits in int.
-
-	* src/main.c (main): Cast result of bindtextdomain and textdomain
-	to void, to avoid a GCC warning when --disable-nls is in effect.
-
-	* src/scan-gram.l: Use strings rather than escapes when possible,
-	to minimize the number of warnings from xgettext.
-	(handle_action_dollar, handle_action_at): Don't use isdigit,
-	as it mishandles negative chars and it may not work as expected
-	outside the C locale.
-
-	* src/symtab.c (symbol_get): Don't cast LHS of an assignment;
-	this is a GCC extension and is not portable to other compilers.
-
-	* src/system.h (alloca): Use same pattern as ../lib/error.c.
-	Do not include <ctype.h>; no longer needed.
-	Do not include <malloc.h>; no longer needed (and generates
-	warnings on OpenBSD 3.0).
-
-	* tests/cxx-type.at (yylex): Do not pass signed char to isupper;
-	it's not portable.
-
-	* tests/regression.at: Do not use 'cc -c input.c -o input';
-	Sun C rejects this.  Instead, use 'cc -c input.c -o input.o'.
-
-	* tests/synclines.at (AC_SYNCLINES_COMPILE): Accept any nonzero
-	exit status as failure, not just exit status 1.  Sun C exits
-	with status 2 sometimes.
-
-	* tests/torture.at (AT_INCREASE_DATA_SIZE): New macro.
-	Use it for the two large tests.
-
-2002-08-02  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (conflicts_output): Don't output rules never
-	reduced here, since anyway that computation doesn't work.
-	* src/gram.h, src/gram.h (rule_filter_t, rule_useful_p)
-	(rule_useless_p, rule_never_reduced_p): New.
-	(grammar_rules_partial_print): Use a filter instead of a range.
-	Display the title only if needed.
-	(grammar_rules_print): Adjust.
-	(grammar_rules_never_reduced_report): New.
-	* src/tables.c (action_row): Move the computation of rules never
-	reduced to...
-	(token_actions): here.
-	* src/main.c (main): Make the parser before making the report, so
-	that rules never reduced are computed.
-	Call grammar_rules_never_reduced_report.
-	* src/print.c (print_results): Report rules never reduced.
-	* tests/conflicts.at, tests/reduce.at: Adjust.
-
-2002-08-01  Akim Demaille  <akim@epita.fr>
-
-	Instead of attaching lookaheads and duplicating the rules being
-	reduced by a state, attach the lookaheads to the reductions.
-
-	* src/state.h (state_t): Remove the `lookaheads',
-	`lookaheads_rule' member.
-	(reductions_t): Add a `lookaheads' member.
-	Use a regular array for the `rules'.
-	* src/state.c (reductions_new): Initialize the lookaheads member
-	to 0.
-	(state_rule_lookaheads_print): Adjust.
-	* src/state.h, src/state.c (state_reductions_find): New.
-	* src/conflicts.c (resolve_sr_conflict, set_conflicts)
-	(count_rr_conflicts): Adjust.
-	* src/lalr.c (LArule): Remove.
-	(add_lookback_edge): Adjust.
-	(state_lookaheads_count): New.
-	(states_lookaheads_initialize): Merge into...
-	(initialize_LA): this.
-	(lalr_free): Adjust.
-	* src/main.c (main): Don't free nullable and derives too early: it
-	is used by --verbose.
-	* src/print.c, src/print_graph.c, src/tables.c: Adjust.
-
-2002-08-01  Akim Demaille  <akim@epita.fr>
-
-	* src/derives.h, src/derives.c (derives): A `rule_t***' instead of
-	`rule_number_t**'.
-	(set_derives, free_derives): Rename as...
-	(derives_compute, derives_free): this.
-	Adjust all dependencies.
-	* src/nullable.c (set_nullable, free_nullable): Rename as...
-	(nullable_compute, nullable_free): these.
-	(rule_list_t): Store rule_t *, not rule_number_t.
-	* src/state.c (state_rule_lookaheads_print): Directly compare rule
-	pointers, instead of their numbers.
-	* src/main.c (main): Call nullable_free, and derives_free earlier,
-	as they were lo longer used.
-
-2002-08-01  Akim Demaille  <akim@epita.fr>
-
-	* lib/timevar.c (get_time): Include children time.
-	* src/lalr.h (LA, LArule): Don't export them: used with the
-	state_t.
-	* src/lalr.c (LA, LArule): Static.
-	* src/lalr.h, src/lalr.c (lalr_free): New.
-	* src/main.c (main): Call it.
-	* src/tables.c (pack_vector): Check whether loc is >= to the
-	table_size, not >.
-	(pack_tables): Don't free froms, tos, conflict_tos, and pos...
-	(tables_generate): do it, since that's also it which allocates
-	them.
-	Don't free LA and LArule, main does.
-
-2002-07-31  Akim Demaille  <akim@epita.fr>
-
-	Separate parser tables computation and output.
-
-	* src/output.c (nvectors, base_t, base, base_ninf, conflict_table)
-	(conflict_list, conflict_list_cnt, table, check, table_ninf)
-	(yydefgoto, yydefact, high): Move to...
-	* src/tables.h, src/tables.c: here.
-	* src/output.c (vector_number_t, VECTOR_NUMBER_MAX)
-	(VECTOR_NUMBER_MIN, state_number_to_vector_number)
-	(symbol_number_to_vector_number, nvectors, BASE_MAX, BASE_MIN)
-	(froms, tos, conflict_tos, tally, width, action_t, ACTION_MAX)
-	(ACTION_MIN, actrow, order, nentries, pos, conflrow)
-	(conflict_list_free, table_size, lowzero, table_grow, conflict_row)
-	(action_row, save_row, token_actions, save_column, default_goto)
-	(goto_actions, sort_actions, matching_state, pack_vector)
-	(table_ninf_remap, pack_table, prepare_actions): Move to...
-	* src/tables.c: here.
-	* src/tables.h, src/tables.c(tables_generate, tables_free): New.
-	* src/output.c (token_actions, output_base, output_conflicts)
-	(output_check): Merge into...
-	(prepare_actions): this.
-	(actions_output): Rename as...
-	(user_actions_output): this.
-	* src/main.c (main): Call tables_generate and tables_free.
-
-2002-07-31  Akim Demaille  <akim@epita.fr>
-
-	Steal GCC's --time-report support.
-
-	* lib/timevar.c, lib/timevar.h, lib/timevar.def: New,
-	stolen/adjusted from GCC.
-	* m4/stage.m4: Remove time related checks.
-	* m4/timevar.m4: New.
-	* configure.in: Adjust.
-	* src/system.h: Adjust to using timevar.h.
-	* src/getargs.h, src/getargs.c: Support trace_time for
-	--trace=time.
-	* src/main.c (stage): Remove.
-	(main): Replace `stage' invocations with timevar calls.
-	* src/output.c: Insert pertinent timevar calls.
-
-2002-07-31  Akim Demaille  <akim@epita.fr>
-
-	Let --trace have arguments.
-
-	* src/getargs.h (enum trace_e): New.
-	* src/getargs.c (trace_args, trace_types, trace_argmatch): New.
-	(long_options, short_options): --trace/-T takes an optional
-	argument.
-	Change all the uses of trace_flag to reflect the new flags.
-	* tests/sets.at (Firsts, Nullable, Broken Closure): Use --trace=sets.
-
-	Strengthen `stage' portability.
-
-	* m4/stage.m4 (BISON_PREREQ_STAGE): New.
-	* configure.in: Use it.
-	Don't check for malloc.h and sys/times.h.
-	* src/system.h: Include them when appropriate.
-	* src/main.c (stage): Compile only when mallinfo, struct mallinfo,
-	times and struct tms are available.
-
-2002-07-30  Akim Demaille  <akim@epita.fr>
-
-	In verbose parse error message, don't report `error' as an
-	expected token.
-	* tests/actions.at (Printers and Destructors): Adjust.
-	* tests/calc.at (Calculator $1): Adjust.
-	* data/yacc.c, data/glr.c, data/lalr1.c: When making the verbose
-	error message, do not report the parser accepts the error token in
-	that state.
-
-2002-07-30  Akim Demaille  <akim@epita.fr>
-
-	Normalize conflict related messages.
-
-	* src/complain.h, src/complain.c (warn, complain): New.
-	* src/conflicts.c (conflicts_print): Use them.
-	(conflict_report_yacc): New, extracted from...
-	(conflicts_print): here.
-	* tests/conflicts.at, tests/existing.at: Adjust.
-
-2002-07-30  Akim Demaille  <akim@epita.fr>
-
-	Report rules which are never reduced by the parser: those hidden
-	by conflicts.
-
-	* src/LR0.c (save_reductions): Don't make the final state too
-	different: save its reduction (accept) instead of having a state
-	without any action (no shift or goto, no reduce).
-	Note: the final state is now a ``regular'' state, i.e., the
-	parsers now contain `reduce 0' as default reduction.
-	Nevertheless, since they decide to `accept' when yystate =
-	final_state, they still will not reduce rule 0.
-	* src/print.c (print_actions, print_reduction): Adjust.
-	* src/output.c (action_row): Track reduced rules.
-	(token_actions): Report rules never reduced.
-	* tests/conflicts.at, tests/regression.at: Adjust.
-
-2002-07-30  Akim Demaille  <akim@epita.fr>
-
-	`stage' was accidently included in a previous patch.
-	Initiate its autoconfiscation.
-
-	* configure.in: Look for malloc.h and sys/times.h.
-	* src/main.c (stage): Adjust.
-	Report only when trace_flag.
-
-2002-07-29  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h, src/state.c (transitions_t): Holds state_t*'s, not
-	state_number_t.
-	(errs_t): symbol_t*, not symbol_number_t.
-	(reductions_t): rule_t*, not rule_number_t.
-	(FOR_EACH_SHIFT): New.
-	* src/LR0.c, src/conflicts.c, src/lalr.c, src/output.c
-	* src/print.c, src/print_graph.c: Adjust.
-
-2002-07-29  Akim Demaille  <akim@epita.fr>
-
-	Use $accept and $end, as BYacc and BTYacc do, instead of $axiom and $.
-
-	* src/symtab.h, src/symtab.c (eoftoken, axiom): Rename as...
-	(endtoken, accept): these.
-	* src/reader.c (reader): Set endtoken's default tag to "$end".
-	Set undeftoken's tag to "$undefined" instead of "$undefined.".
-	* doc/bison.texinfo (Table of Symbols): Mention $accept and $end.
-	Adjust.
-
-2002-07-29  Akim Demaille  <akim@epita.fr>
-
-	* src/reduce.c (reduce_grammar): When the language is empty,
-	complain about the start symbol, not the axiom.
-	Use its location.
-	* tests/reduce.at (Empty Language): New.
-
-2002-07-26  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.h, src/reader.c (gram_error): ... can't get
-	yycontrol without making too strong assumptions on the parser
-	itself.
-	* src/output.c (prepare_tokens): Use the real 0th value of
-	token_translations instead of `0'.
-	* src/parse-gram.y (yyerror): Don't rely on yycontrol being
-	visible here.
-	* data/yacc.c (yyreport_parse_error): Rename yylocation as yylloc
-	for the time being: %locations ought to provide it to yyerror.
-
-2002-07-25  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (prepare_tokens): Go up to ntokens, not ntokens + 1.
-	* doc/bison.texinfo (Decl Summary): s/$illegal/$undefined./.
-	* tests/regression.at (Web2c Actions): Adjust.
-
-2002-07-25  Akim Demaille  <akim@epita.fr>
-
-	Stop storing rules from 1 to nrules + 1.
-
-	* src/LR0.c, src/closure.c, src/derives.c, src/gram.c, src/lalr.c
-	* src/nullable.c, src/output.c, src/print.c, src/reader.c
-	* src/reduce.c: Allocate and free from &rules[0], not &rules[1].
-	Iterate from 0 to nrules.
-	Use rule_number_as_item_number and item_number_as_rule_number.
-	Adjust to `derive' now containing possibly 0.
-	* src/gram.h (rule_number_as_item_number, item_number_as_rule_number):
-	Handle the `- 1' part in rule numbers from/to item numbers.
-	* src/conflicts.c (log_resolution): Fix the message which reversed
-	shift and reduce.
-	* src/output.c (action_row): Initialize default_rule to -1.
-	(token_actions): Adjust.
-	* tests/sets.at (Nullable, Firsts): Fix the previously bogus
-	expected output.
-	* tests/conflicts.at (Resolved SR Conflicts): Likewise.
-
-2002-07-25  Akim Demaille  <akim@epita.fr>
-
-	* data/c.m4 (b4_c_function, b4_c_ansi_args, b4_c_ansi_arg)
-	(b4_c_knr_arg_names, b4_c_knr_arg_name, b4_c_knr_arg_decls)
-	(b4_c_knr_arg_decl): New.
-	* data/yacc.c: Use it to define yysymprint, yydestruct, and
-	yyreport_parse_error.
-
-2002-07-25  Akim Demaille  <akim@epita.fr>
-
-	* data/yacc.c (yyreport_parse_error): New, extracted from...
-	(yyparse): here.
-	(yydestruct, yysymprint): Move above yyparse.
-	Be K&R compliant.
-
-2002-07-25  Akim Demaille  <akim@epita.fr>
-
-	* data/c.m4 (b4_ints_in, b4_int_type, b4_int_type_for): New,
-	replace...
-	(b4_sint_type, b4_uint_type): these.
-	* data/yacc.c, data/glr.c, data/lalr1.cc: Use b4_int_type_for.
-	* tests/regression.at (Web2c Actions): Adjust.
-
-2002-07-25  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h (TIEM_NUMBER_MAX): New.
-	(item_number_of_rule_number, rule_number_of_item_number): Rename
-	as...
-	(rule_number_as_item_number, item_number_as_rule_number): these.
-	Adjust dependencies.
-	* src/output.c (vector_number_t, VECTOR_NUMBER_MAX)
-	(VECTOR_NUMBER_MIN, state_number_to_vector_number)
-	(symbol_number_to_vector_number): New.
-	(order): Of vector_number_t* type.
-	(base_t, BASE_MAX, BASE_MIN): New.
-	(froms, tos, width, pos, check): Of base_t type.
-	(action_number_t, ACTION_MIN, ACTION_MAX): New.
-	(actrow): Of action_number_t type.
-	(conflrow): Of unsigned int type.
-	(table_ninf, base_ninf): New.
-	(GENERATE_MUSCLE_INSERT_TABLE): Also output the `*_min' value.
-	(muscle_insert_int_table, muscle_insert_base_table)
-	(muscle_insert_rule_number_table): New.
-	(prepare_tokens): Output `toknum' as int_table.
-	(action_row): Returns a rule_number_t.
-	Use ACTION_MIN, not SHRT_MIN.
-	(token_actions): yydefact is rule_number_t*.
-	(table_ninf_remap): New.
-	(pack_table): Use it for `base' and `table'.
-	* data/yacc.c, data/glr.c, data/lalr1.cc (YYFLAG): Remove,
-	replaced with...
-	(YYPACT_NINF, YYTABLE_NINF): these.
-	(yypact, yytable): Compute their types instead of hard-coded
-	`short'.
-	* tests/regression.at (Web2c Actions): Adjust.
-
-2002-07-19  Akim Demaille  <akim@epita.fr>
-
-	* src/scan-gram.l (id): Can start with an underscore.
-
-2002-07-16  Akim Demaille  <akim@epita.fr>
-
-	* src/assoc.c, src/asssoc.h (assoc_t, assoc_to_string): New.
-	Adjust all former `associativity' dependencies.
-	* src/symtab.c (symbol_new): Default associativity is `undef', not
-	`right'.
-	(symbol_check_alias_consistence): Adjust.
-
-2002-07-09  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo: Properly set the ``header'' part.
-	Use @dircategory ``GNU programming tools'' as per Texinfo's
-	documentation.
-	Use @copying.
-
-2002-07-09  Akim Demaille  <akim@epita.fr>
-
-	* lib/quotearg.h: Protect against multiple inclusions.
-	* src/location.h (location_t): Add a `file' member.
-	(LOCATION_RESET, LOCATION_PRINT): Adjust.
-	* src/complain.c (warn_at, complain_at, fatal_at): Drop
-	`error_one_per_line' support.
-
-2002-07-09  Akim Demaille  <akim@epita.fr>
-
-	* src/complain.h, src/complain.c (warn, complain): Remove, unused.
-	* src/reader.c (lineno): Remove.
-	Adjust all dependencies.
-	(get_merge_function): Take a location and use complain_at.
-	* src/symtab.h, src/symtab.c (symbol_make_alias): Likewise.
-	* tests/regression.at (Invalid inputs, Mixing %token styles):
-	Adjust.
-
-2002-07-09  Akim Demaille  <akim@epita.fr>
-
-	* src/parse-gram.y (rules_or_grammar_declaration): Add an error
-	recovery rule, and forbid extensions when --yacc.
-	(gram_error): Use complain_at.
-	* src/reader.c (reader): Exit if there were parse errors.
-
-2002-07-09  Akim Demaille  <akim@epita.fr>
-
-	* tests/synclines.at (AT_SYNCLINES_COMPILE): New.
-	(AT_TEST_SYNCLINE): Adjust to unusual GCC outputs.
-	Reported by R Blake <blakers@mac.com>.
-
-2002-07-09  Akim Demaille  <akim@epita.fr>
-
-	* data/yacc.c: Output the copyright notive in the header.
-
-2002-07-03  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (froms, tos): Are state_number_t.
-	(save_column): sp, sp1, and sp2 are state_number_t.
-	(prepare): Rename `final' as `final_state_number', `nnts' as
-	`nterms_number', `nrules' as `rules_number', `nstates' as
-	`states_number', and `ntokens' as `tokens_number'.  Remove `nsym',
-	unused.
-	* data/yacc.c, data/glr.c, data/lalr1.cc: Adjust.
-	* data/lalr1.cc (nsym_): Remove, unused.
-
-2002-07-03  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.h, src/lalr.c (goto_number_t): New.
-	* src/lalr.c (goto_list_t): New.
-	Propagate them.
-	* src/nullable.c (rule_list_t): New.
-	Propagate.
-	* src/types.h: Remove.
-
-2002-07-03  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (print_fderives): Use rule_rhs_print.
-	* src/derives.c (print_derives): Use rule_rhs_print.
-	(rule_list_t): New, replaces `shorts'.
-	(set_derives): Add comments.
-	* tests/sets.at (Nullable, Firsts): Adjust.
-
-2002-07-03  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (prepare_actions): Free `tally' and `width'.
-	(prepare_actions): Allocate and free `order'.
-	* src/symtab.c (symbols_free): Free `symbols'.
-	* src/scan-gram.l (scanner_free): Clear Flex's scanners memory.
-	* src/output.c (m4_invoke): Move to...
-	* src/scan-skel.l: here.
-	(<<EOF>>): Close yyout, and free its name.
-
-2002-07-03  Akim Demaille  <akim@epita.fr>
-
-	Fix some memory leaks, and fix a bug: state 0 was examined twice.
-
-	* src/LR0.c (new_state): Merge into...
-	(state_list_append): this.
-	(new_states): Merge into...
-	(generate_states): here.
-	(set_states): Don't ensure a proper `errs' state member here, do it...
-	* src/conflicts.c (conflicts_solve): here.
-	* src/state.h, src/state.c: Comment changes.
-	(state_t): Rename member `shifts' as `transitions'.
-	Adjust all dependencies.
-	(errs_new): For consistency, also take the values as argument.
-	(errs_dup): Remove.
-	(state_errs_set): New.
-	(state_reductions_set, state_transitions_set): Assert that no
-	previous value was assigned.
-	(state_free): New.
-	(states_free): Use it.
-	* src/conflicts.c (resolve_sr_conflict): Don't use an `errs_t' as
-	temporary storage: use `errs' and `nerrs' as elsewhere.
-	(set_conflicts): Allocate and free this `errs'.
-
-2002-07-02  Akim Demaille  <akim@epita.fr>
-
-	* lib/libiberty.h: New.
-	* lib: Update the bitset implementation from upstream.
-	* src/closure.c, src/lalr.c, src/output.c, src/print_graph.c,
-	* src/state.c: Use BITSET_FOR_EACH, not BITSET_EXECUTE.
-	* src/main.c: Adjust bitset stats calls.
-
-2002-07-01  Paul Eggert  <eggert@twinsun.com>
-
-	* src/scan-gram.l (<SC_ESCAPED_CHARACTER>): Convert to unsigned
-	char, so that negative chars don't collide with $.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	Have the GLR tests be `warning' checked, and fix the warnings.
-
-	* data/glr.c (YYFPRINTF): Always define it, not only when YYDEBUG
-	(yyuserAction, yyreportAmbiguity): `Use' all the arguments.
-	(yyremoveDeletes): `yyi' and `yyj' are size_t.
-	Use YYFPRINTF when under if (YYDEBUG) to avoid empty `if' bodies.
-	(yyaddDeferredAction): static.
-	(yyglrReduce): yyi, yyk, amd yyposn are size_t.
-	(yyreportParseError): yyprefix is const.
-	yytokenp is used only when verbose.
-	(yy__GNUC__): Replace with __GNUC__.
-	(yypdumpstack): yyi is size_t.
-	(yypreference): Un-yy local variables and arguments, to avoid
-	clashes with `yyr1'.  Anyway, we are not in the user name space.
-	(yytname_size): be an int, as is compared with ints.
-	* tests/testsuite.at (AT_COMPILE, AT_PARSER_CHECK): New.
-	Use them.
-	* tests/cxx-gram.at: Use quotation to protect $1.
-	Use AT_COMPILE to enable warnings hunts.
-	Prototype yylex and yyerror.
-	`Use' argc.
-	Include `string.h', not `strings.h'.
-	Produce and prototype stmtMerge only when used.
-	yylex takes a location.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	We spend a lot of time in quotearg, in particular when --verbose.
-
-	* src/symtab.c (symbol_get): Store a quoted version of the key.
-	(symbol_tag_get, symbol_tag_get_n, symbol_tag_print): Remove.
-	Adjust all callers.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h (reductions_t): Rename member `nreds' as num.
-	(errs_t): Rename members `nerrs' and `errs' as `num' and `symbols'.
-	* src/state.c (ERRS_ALLOC, REDUCTIONS_ALLOC): Use the correct types.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h, src/state.c (shift_t, SHIFT_SYMBOL, SHIFT_IS_SHIFT)
-	(SHIFT_IS_GOTO, SHIFT_IS_ERROR, SHIFT_DISABLE, SHIFT_IS_DISABLED)
-	(shifts_to): Rename as...
-	(transition_t, TRANSITION_SYMBOL, TRANSITION_IS_TRANSITION)
-	(TRANSITION_IS_GOTO, TRANSITION_IS_ERROR, TRANSITION_DISABLE)
-	(TRANSITION_IS_DISABLED, transitions_to): these.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/print.c (print_shifts, print_gotos): Merge into...
-	(print_transitions): this.
-	(print_transitions, print_errs, print_reductions): Align the
-	lookaheads columns.
-	(print_core, print_transitions, print_errs, print_state,
-	print_grammar): Output empty lines separator before, not after.
-	(state_default_rule_compute): Rename as...
-	(state_default_rule): this.
-	* tests/conflicts.at (Defaulted Conflicted Reduction),
-	(Unresolved SR Conflicts, Resolved SR Conflicts): Adjust.
-	* tests/regression.at (Rule Line Numbers, Web2c Report): Adjust.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	Display items as we display rules.
-
-	* src/gram.h, src/gram.c (rule_lhs_print): New.
-	* src/gram.c (grammar_rules_partial_print): Use it.
-	* src/print.c (print_core): Likewise.
-	* tests/conflicts.at (Defaulted Conflicted Reduction),
-	(Unresolved SR Conflicts): Adjust.
-	(Unresolved SR Conflicts): Adjust and rename as...
-	(Resolved SR Conflicts): this, as was meant.
-	* tests/regression.at (Web2c Report): Adjust.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/print.c (state_default_rule_compute): New, extracted from...
-	(print_reductions): here.
-	Pessimize, but clarify the code.
-	* tests/conflicts.at (Defaulted Conflicted Reduction): New.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (action_row): Let default_rule be always a rule
-	number.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (print_firsts, print_fderives, closure):
-	Use BITSET_EXECUTE.
-	* src/lalr.c (lookaheads_print): Likewise.
-	* src/state.c (state_rule_lookaheads_print): Likewise.
-	* src/print_graph.c (print_core): Likewise.
-	* src/print.c (print_reductions): Likewise.
-	* src/output.c (action_row): Likewise.
-	Use SHIFT_IS_DISABLED, SHIFT_IS_SHIFT and SHIFT_SYMBOL.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/print_graph.c: Use report_flag.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (traverse, digraph, matrix_print, transpose): Move
-	to...
-	* src/relation.h, src/relation.c (traverse, relation_digraph)
-	(relation_print, relation_transpose): New.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h, src/state.c (shifts_to): New.
-	* src/lalr.c (build_relations): Use it.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h (rule_number_t, RULE_NUMBER_MAX, int_of_rule_number)
-	(item_number_of_rule_number, rule_number_of_item_number): New.
-	* src/LR0.c, src/closure.c, src/derives.c, src/derives.h,
-	* src/gram.c, src/lalr.c, src/nullable.c, src/output.c, src/print.c,
-	* src/print_graph.c, src/reader.c, src/reduce.c, src/reduce.h:
-	Propagate their use.
-	Much remains to be done, in particular wrt `shorts' from types.h.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.c (symbol_new): Initialize the `printer' member.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (save_reductions): Remove, replaced by...
-	* src/state.h, src/state.c (state_reductions_set): New.
-	(reductions, errs): Rename as...
-	(reductions_t, errs_t): these.
-	Adjust all dependencies.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (state_list_t, state_list_append): New.
-	(first_state, last_state): Now symbol_list_t.
-	(this_state): Remove.
-	(new_itemsets, append_states, save_reductions): Take a state_t as
-	argument.
-	(set_states, generate_states): Adjust.
-	(save_shifts): Remove, replaced by...
-	* src/state.h, src/state.c (state_shifts_set): New.
-	(shifts): Rename as...
-	(shifts_t): this.
-	Adjust all dependencies.
-	* src/state.h (state_t): Remove the `next' member.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/vcg.c (quote): Use slot 2, since we often pass symbol tag
-	escaped in slot 0.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	Use hash.h for the state hash table.
-
-	* src/LR0.c (STATE_HASH_SIZE, state_hash): Remove.
-	(allocate_storage): Use state_hash_new.
-	(free_storage): Use state_hash_free.
-	(new_state, get_state): Adjust.
-	* src/lalr.h, src/lalr.c (states): Move to...
-	* src/states.h (state_t): Remove the `link' member, no longer
-	used.
-	* src/states.h, src/states.c: here.
-	(state_hash_new, state_hash_free, state_hash_lookup)
-	(state_hash_insert, states_free): New.
-	* src/states.c (state_table, state_compare, state_hash): New.
-	* src/output.c (output_actions): Do not free states now, since we
-	still need to know the final_state number in `prepare', called
-	afterwards.  Do it...
-	* src/main.c (main): here: call states_free after `output'.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h, src/state.c (state_new): New, extracted from...
-	* src/LR0.c (new_state): here.
-	* src/state.h (STATE_ALLOC): Move to...
-	* src/state.c: here.
-	* src/LR0.h, src/LR0.c (nstates, final_state): Move to...
-	* src/state.h, src/state.c: here.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (gensym): Rename as...
-	* src/symtab.h, src/symtab.c (dummy_symbol_get): this.
-	(getsym): Rename as...
-	(symbol_get): this.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h (state_number_t, STATE_NUMBER_MAX): New.
-	* src/LR0.c, src/LR0.h, src/conflicts.c, src/lalr.c, src/lalr.h,
-	* src/output.c, src/print.c, src/print_graph.c: Propagate.
-	* src/LR0.h, src/LR0.h (final_state): Is a state_t*.
-
-2002-06-30  Akim Demaille  <akim@epita.fr>
-
-	Make the test suite pass with warnings checked.
-
-	* tests/actions.at (Printers and Destructors): Improve.
-	Avoid unsigned vs. signed issues.
-	* tests/calc.at: Don't exercise the scanner here, do it...
-	* tests/input.at (Torturing the Scanner): here.
-
-2002-06-28  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* data/glr.c: Correct typo in Emacs-mode directive.  Slightly
-	reorganize first lines parallel to yacc.c.
-
-2002-06-28  Akim Demaille  <akim@epita.fr>
-
-	* data/c.m4 (b4_copyright, b4_sint_type, b4_uint_type, b4_token_define)
-	(b4_token_enum, b4_token_defines): New, factored from...
-	* data/lalr1.cc, data/yacc.c, glr.c: here.
-
-2002-06-28  Akim Demaille  <akim@epita.fr>
-
-	* data/yacc.c (yydestruct, yysymprint): Pacify GCC warnings for
-	unused variables.
-	* src/output.c (merger_output): static.
-
-2002-06-28  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.h: s/grammer_current_rule_merge_set/grammar_.../.
-	* src/conflicts.c (conflicts_total_count): `i' is unsigned, to
-	pacify GCC.
-	* src/output.c (save_row): Initialize all the variables to pacify GCC.
-
-2002-06-27  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	Accumulated changelog for new GLR parsing features.
-
-	* src/conflicts.c (count_total_conflicts): Change name to
-	conflicts_total_count.
-	* src/conflicts.h: Ditto.
-	* src/output.c (token_actions): Use the new name.
-	(output_conflicts): Change conflp => conflict_list_heads, and
-	confl => conflict_list for better readability.
-	* data/glr.c: Use the new names.
-	* NEWS: Add self to GLR announcement.
-
-	* src/reader.c (free_merger_functions): Cleanup: XFREE->free.
-
-	* doc/bison.texinfo (GLR Parsers): Make corrections suggested by
-	Akim Demaille.
-
-	* data/bison.glr: Change name to glr.c
-	* data/glr.c: Renamed from bison.glr.
-	* data/Makefile.am: Add glr.c
-
-	* src/getargs.c:
-
-	* src/symlist.h:  Add dprec and merger fields to symbol_list_s.
-	* src/symlist.c (symbol_list_new): Initialize dprec and merger fields.
-
-	Originally 2002-06-16  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* data/bison.glr: Be sure to restore the
-	current #line when returning to the skeleton contents after having
-	exposed the input file's #line.
-
-	Originally 2002-06-13  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* data/bison.glr: Bring up to date with changes to bison.simple.
-
-	Originally 2002-06-03  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* data/bison.glr: Correct definitions that use b4_prefix.
-	Various reformatting.
-	(GLRStack): Make yychar (in YYPURE case) and yytokenp as part of stack.
-	(yyreportParseError, yyrecoverParseError, yyprocessOneStack): remove
-	yytokenp argument; now part of stack.
-	(yychar): Define to behave as documented.
-	(yyclearin): Ditto.
-
-	Originally 2002-05-14  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* src/reader.h: Add declaration for free_merger_functions.
-
-	* src/reader.c (merge_functions): New variable.
-	(get_merge_function): New function.
-	(free_merger_functions): New function.
-	(readgram): Check for %prec that is not followed by a symbol.
-	Handle %dprec and %merge declarations.
-	(packgram): Initialize dprec and merger fields in rules array.
-
-	* src/output.c (conflict_tos, conflrow, conflict_table, conflict_list,
-	conflict_list_cnt, conflict_list_free): New variables.
-	(table_grow): Also grow conflict_table.
-	(prepare_rules): Output dprec and merger tables.
-	(conflict_row): New function.
-	(action_row): Output conflict lists for GLR parser.  Don't use
-	default reduction in conflicted states for GLR parser so that there
-	are spaces for the conflict lists.
-	(save_row): Also save conflict information.
-	(token_actions): Allocate conflict list.
-	(merger_output): New function.
-	(pack_vector): Pack conflict table, too.
-	(output_conflicts): New function to output yyconflp and yyconfl.
-	(output_check): Allocate conflict_tos.
-	(output_actions): Output conflict tables, also.
-	(output_skeleton): Output b4_mergers definition.
-	(prepare): Output b4_max_rhs_length definition.
-	Use 'bison.glr' as default skeleton for GLR parsers.
-
-	* src/gram.c (glr_parser): New flag.
-	(grammar_free): Call free_merger_functions.
-
-	* src/conflicts.c (count_rr_conflicts): Augment to optionally count
-	all pairs of conflicting reductions, rather than just all tokens
-	causing conflicts.  Needed to size conflict tables.
-	(conflicts_output): Modify call to count_rr_conflicts for new
-	interface.
-	(conflicts_print): Ditto.
-	(count_total_conflicts): New function.
-
-	* src/reader.h (merger_list): New type.
-	(merge_functions): New variable.
-
-	* src/lex.h (tok_dprec, tok_merge): New token types.
-
-	* src/gram.h (rule_s): Add dprec and merger fields.
-	(glr_parser): New flag.
-
-	* src/conflicts.h (count_total_conflicts): New function.
-
-	* src/options.c (option_table): Add %dprec, %merge, and %glr-parser.
-
-	* doc/bison.texinfo (Generalized LR Parsing): New section.
-	(GLR Parsers): New section.
-	(Language and Grammar): Mention GLR parsing.
-	(Table of Symbols): Add %dprec, %glr-parser, %merge, GLR
-	Correct typo ("tge" -> "the").
-
-	* data/bison.glr: New skeleton for GLR parsing.
-
-	* tests/cxx-gram.at: New tests for GLR parsing.
-
-	* tests/testsuite.at: Include cxx-gram.at.
-
-	* tests/Makefile.am: Add cxx-gram.at.
-
-	* src/parse-gram.y:
-
-	* src/scan-gram.l: Add %dprec, %glr-parser, %merge.
-
-	* src/parse-gram.y: Grammar for %dprec, %merge, %glr-parser.
-
-2002-06-27  Akim Demaille  <akim@epita.fr>
-
-	* src/options.h, src/options.c: Remove.
-	* src/getargs.c (short_options, long_options): New.
-
-2002-06-27  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple, data/bison.c++: Rename as...
-	* data/yacc.c, data/lalr1.cc: these.
-	* doc/bison.texinfo (Environment Variables): Remove.
-
-2002-06-25  Raja R Harinath  <harinath@cs.umn.edu>
-
-	* src/getargs.c (report_argmatch): Initialize strtok().
-
-2002-06-20  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple (b4_symbol_actions): New, replaces...
-	(b4_symbol_destructor, b4_symbol_printer): these.
-	(yysymprint): Be sure to call YYPRINT only for tokens, and using
-	user token numbers.
-
-2002-06-20  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple (yydestructor): Rename as...
-	(yydestruct): this.
-
-2002-06-20  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.h, src/symtab.c (symbol_type_set)
-	(symbol_destructor_set, symbol_precedence_set): The location is
-	the last argument.
-	Adjust all callers.
-
-2002-06-20  Akim Demaille  <akim@epita.fr>
-
-	* src/parse-gram.y (YYPRINT, yyprint): Don't mess with the parser
-	internals.
-	* src/reader.h, src/reader.c (grammar_current_rule_prec_set):
-	Takes a location.
-	* src/symtab.h, src/symtab.c (symbol_class_set)
-	(symbol_user_token_number_set): Likewise.
-	Adjust all callers.
-	Promote complain_at.
-	* tests/input.at (Type Clashes): Adjust.
-
-2002-06-20  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple (YYLEX): Fix the declaration when
-	%pure-parser.
-
-2002-06-20  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple (yysymprint): Don't print the token number,
-	just its name.
-	* tests/actions.at (Destructors): Rename as...
-	(Printers and Destructors): this.
-	Also exercise %printer.
-
-2002-06-20  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple (YYDSYMPRINT): New.
-	Use it to remove many of the #if YYDEBUG/if (yydebug).
-
-2002-06-20  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.h, src/symtab.c (symbol_t): printer and
-	printer_location are new members.
-	(symbol_printer_set): New.
-	* src/parse-gram.y (PERCENT_PRINTER): New token.
-	Handle its associated rule.
-	* src/scan-gram.l: Adjust.
-	(handle_destructor_at, handle_destructor_dollar): Rename as...
-	(handle_symbol_code_at, handle_symbol_code_dollar): these.
-	* src/output.c (symbol_printers_output): New.
-	(output_skeleton): Call it.
-	* data/bison.simple (yysymprint): New.  Cannot be named yyprint
-	since there are already many grammar files with a user `yyprint'.
-	Replace the calls to YYPRINT to calls to yysymprint.
-	* tests/calc.at: Adjust.
-	* tests/torture.at (AT_DATA_STACK_TORTURE): Remove YYPRINT: it was
-	taking advantage of parser very internal details (stack size!).
-
-2002-06-20  Akim Demaille  <akim@epita.fr>
-
-	* src/scan-gram.l: Complete the scanner with the missing patterns
-	to pacify Flex.
-	Use `quote' and `symbol_tag_get' where appropriate.
-
-2002-06-19  Akim Demaille  <akim@epita.fr>
-
-	* tests/actions.at (Destructors): Augment to test locations.
-	* data/bison.simple (yydestructor): Pass it the current location
-	if locations are enabled.
-	Prototype only when __STDC__ or C++.
-	Change the argument names to move into the yy name space: there is
-	user code here.
-
-2002-06-19  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple (b4_pure_if): New.
-	Use it instead of #ifdef YYPURE.
-
-2002-06-19  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple (b4_location_if): New.
-	Use it instead of #ifdef YYLSP_NEEDED.
-
-2002-06-19  Akim Demaille  <akim@epita.fr>
-
-	Prepare @$ in %destructor, but currently don't bind it in the
-	skeleton, as %location use is not cleaned up yet.
-
-	* src/scan-gram.l (handle_dollar, handle_destructor_at)
-	(handle_action_at): New.
-	(handle_at, handle_action_dollar, handle_destructor_dollar): Take
-	a braced_code_t and a location as additional arguments.
-	(handle_destructor_dollar): Instead of requiring `b4_eval', just
-	unquote one when outputting `b4_dollar_dollar'.
-	Adjust callers.
-	* data/bison.simple (b4_eval): Remove.
-	(b4_symbol_destructor): Adjust.
-	* tests/input.at (Invalid @n): Adjust.
-
-2002-06-19  Zack Weinberg  <zack@codesourcery.com>
-
-	* doc/bison.texinfo: Document ability to have multiple
-	prologue sections.
-
-2002-06-18  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c (compute_base_names): When computing the output file
-	names from the input file name, strip the directory part.
-
-2002-06-18  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple.new: Comment changes.
-	Reported by Andreas Schwab.
-
-2002-06-18  Matt Kraai  <kraai@alumni.cmu.edu>
-
-	* data/bison.simple (yyoverflowlab): #ifndef yyoverflow, so that
-	there are no `label `yyoverflowlab' defined but not used' warnings
-	when yyoverflow is defined.
-
-2002-06-18  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.h, src/symtab.c (symbol_t): destructor_location is a
-	new member.
-	(symbol_destructor_set): Adjust.
-	* src/output.c (symbol_destructors_output): Output the destructor
-	locations.
-	Output the symbol name.
-	* data/bison.simple (b4_symbol_destructor): Adjust.
-
-2002-06-18  Cris Bailiff  <c.bailiff@awayweb.com>
-	and Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple.new (yyerrlab1): Be sure to pop and destroy
-	what's left on the stack when the error recovery hits EOF.
-	* tests/actions.at (Destructors): Complete to exercise this case.
-
-2002-06-17  Akim Demaille  <akim@epita.fr>
-
-	* data/m4sugar/m4sugar.m4 (m4_map): Recognize when the list of
-	arguments is really empty, not only equal to `[]'.
-	* src/symtab.h, src/symtab.c (symbol_t): `destructor' is a new
-	member.
-	(symbol_destructor_set): New.
-	* src/output.c (symbol_destructors_output): New.
-	* src/reader.h (brace_code_t, current_braced_code): New.
-	* src/scan-gram.l (BRACED_CODE): Use it to branch on...
-	(handle_dollar): Rename as...
-	(handle_action_dollar): this.
-	(handle_destructor_dollar): New.
-	* src/parse-gram.y (PERCENT_DESTRUCTOR): New.
-	(grammar_declaration): Use it.
-	* data/bison.simple (yystos): Is always defined.
-	(yydestructor): New.
-	* tests/actions.at (Destructors): New.
-	* tests/calc.at (_AT_CHECK_CALC_ERROR): Don't rely on egrep.
-
-2002-06-17  Akim Demaille  <akim@epita.fr>
-
-	* src/symlist.h, src/symlist.c (symbol_list_length): New.
-	* src/scan-gram.l (handle_dollar, handle_at): Compute the
-	rule_length only when needed.
-	* src/output.c (actions_output, token_definitions_output): Output
-	the full M4 block.
-	* src/symtab.c: Don't access directly to the symbol tag, use
-	symbol_tag_get.
-	* src/parse-gram.y: Use symbol_list_free.
-
-2002-06-17  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.h, src/reader.c (symbol_list, symbol_list_new)
-	(symbol_list_prepend, get_type_name): Move to...
-	* src/symlist.h, src/symlist.c (symbol_list_t, symbol_list_new)
-	(symbol_list_prepend, symbol_list_n_type_name_get): here.
-	Adjust all callers.
-	(symbol_list_free): New.
-	* src/scan-gram.l (handle_dollar): Takes a location.
-	* tests/input.at (Invalid $n): Adjust.
-
-2002-06-17  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.h, src/reader.c (symbol_list_new): Export it.
-	(symbol_list_prepend): New.
-	* src/parse-gram.y (%union): `list' is a new member.
-	(symbols.1): New, replaces...
-	(terms_to_prec.1, nterms_to_type.1): these.
-	* src/symtab.h, src/symtab.c (symbol_type_set, symbol_precedence_set)
-	Take a location as additional argument.
-	Adjust all callers.
-
-2002-06-15  Akim Demaille  <akim@epita.fr>
-
-	* src/parse-gram.y: Move %token in the declaration section so that
-	we don't depend upon CVS Bison.
-
-2002-06-15  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h, src/state.c (state_rule_lookaheads_print): New.
-	* src/print.c (print_core): Use it.
-
-2002-06-15  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (log_resolution): Accept the rule involved in
-	the sr conflicts instead of the lookahead number that points to
-	that rule.
-	(flush_reduce): Accept the current lookahead vector as argument,
-	instead of the index in LA.
-	(resolve_sr_conflict): Accept the current number of lookahead
-	bitset to consider for the STATE, instead of the index in LA.
-	(set_conflicts): Adjust.
-	* src/lalr.c, src/lalr.h, src/state.h: Comment changes.
-
-2002-06-15  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h (state_t): Replace the `lookaheadsp' member, a
-	short, with `lookaheads' (bitsetv), `lookaheads_rule' (rule_t**).
-	Adjust all dependencies.
-	* src/lalr.c (initialize_lookaheads): Split into...
-	(states_lookaheads_count, states_lookaheads_initialize): these.
-	(lalr): Adjust.
-
-2002-06-15  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h, src/gram.c (grammar_rules_partial_print): New, eved
-	out of...
-	(grammar_rules_print): here.
-	* src/reduce.c (reduce_output): Use it.
-	* tests/reduce.at (Useless Rules, Reduced Automaton)
-	(Underivable Rules): Adjust.
-
-2002-06-15  Akim Demaille  <akim@epita.fr>
-
-	Copy BYacc's nice way to report the grammar.
-
-	* src/gram.h, src/gram.c (grammar_rhs_print, grammar_rules_print):
-	New.
-	Don't print the rules' location, it is confusing and useless.
-	(rule_print): Use grammar_rhs_print.
-	* src/print.c (print_grammar): Use grammar_rules_print.
-
-2002-06-15  Akim Demaille  <akim@epita.fr>
-
-	Complete and rationalize `useless thing' warnings.
-
-	* src/symtab.h, src/symtab.c (symbol_tag_get, symbol_tag_get_n)
-	(symbol_tag_print): New.
-	Use them everywhere in place of accessing directly the tag member.
-	* src/gram.h, src/gram.c (rule_print): New.
-	Use it where a rule used to be printed `by hand'.
-	* src/reduce.c (nonterminals_reduce): Report the use nonterminals.
-	(reduce_grammar_tables): Report the useless rules.
-	(reduce_print): Useless things are a warning, not an error.
-	Report it as such.
-	* tests/reduce.at (Useless Nonterminals, Useless Rules):
-	(Reduced Automaton, Underivable Rules): Adjust.
-	* tests/regression.at (Web2c Report, Web2c Report): Adjust.
-	* tests/conflicts.at (Unresolved SR Conflicts)
-	(Solved SR Conflicts): Adjust.
-
-2002-06-15  Akim Demaille  <akim@epita.fr>
-
-	Let symbols have a location.
-
-	* src/symtab.h, src/symtab.c (symbol_t): Location is a new member.
-	(getsym): Adjust.
-	Adjust all callers.
-	* src/complain.h, src/complain.c (complain_at, fatal_at, warn_at):
-	Use location_t, not int.
-	* src/symtab.c (symbol_check_defined): Take advantage of the
-	location.
-	* tests/regression.at (Invalid inputs): Adjust.
-
-2002-06-15  Akim Demaille  <akim@epita.fr>
-
-	* src/parse-gram.y (YYLLOC_DEFAULT, current_lhs_location): New.
-	(input): Don't try to initialize yylloc here, do it in the
-	scanner.
-	* src/scan-gram.l (YY_USER_INIT): Initialize yylloc.
-	* src/gram.h (rule_t): Change line and action_line into location
-	and action_location, of location_t type.
-	Adjust all dependencies.
-	* src/location.h, src/location.c (empty_location): New.
-	* src/reader.h, src/reader.c (grammar_start_symbol_set)
-	(grammar_symbol_append, grammar_rule_begin, grammar_rule_end)
-	(grammar_current_rule_symbol_append)
-	(grammar_current_rule_action_append): Expect a location as argument.
-	* src/reader.c (grammar_midrule_action): Adjust to attach an
-	action's location as dummy symbol location.
-	* src/symtab.h, src/symtab.c (startsymbol_location): New.
-	* tests/regression.at (Web2c Report, Rule Line Numbers): Adjust
-	the line numbers.
-
-2002-06-14  Akim Demaille  <akim@epita.fr>
-
-	Grammar declarations may be found in the grammar section.
-
-	* src/parse-gram.y (rules_or_grammar_declaration): New.
-	(declarations): Each declaration may end with a semicolon, not
-	just...
-	(grammar_declaration): `"%union"'.
-	(grammar): Branch to rules_or_grammar_declaration.
-
-2002-06-14  Akim Demaille  <akim@epita.fr>
-
-	* src/main.c (main): Invoke scanner_free.
-
-2002-06-14  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (m4_invoke): Extracted from...
-	(output_skeleton): here.
-	Free tempfile.
-
-2002-06-14  Akim Demaille  <akim@epita.fr>
-
-	* src/parse-gram.y (directives, directive, gram)
-	(grammar_directives, precedence_directives, precedence_directive):
-	Rename as...
-	(declarations, declaration, grammar, grammar_declaration)
-	(precedence_declaration, precedence_declarator): these.
-	(symbol_declaration): New.
-
-2002-06-14  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c (action_obstack): Remove, unused.
-	(output_obstack): Remove it, and all its dependencies, as it is no
-	longer needed.
-	* src/reader.c (epilogue_set): Build the epilogue in the
-	muscle_obstack.
-	* src/output.h, src/output.c (muscle_obstack): Move to...
-	* src/muscle_tab.h, src/muscle_tab.h: here.
-	(muscle_init): Initialize muscle_obstack.
-	(muscle_free): New.
-	* src/main.c (main): Call it.
-
-2002-06-14  Akim Demaille  <akim@epita.fr>
-
-	* src/location.h: New, extracted from...
-	* src/reader.h: here.
-	* src/Makefile.am (noinst_HEADERS): Merge into
-	(bison_SOURCES): this.
-	Add location.h.
-	* src/parse-gram.y: Use location_t instead of Bison's.
-	* src/reader.h, src/reader.c (prologue_augment, epilogue_set):
-	Use location_t instead of ints.
-
-2002-06-14  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple, data/bison.c++: Be sure to restore the
-	current #line when returning to the skeleton contents after having
-	exposed the input file's #line.
-
-2002-06-12  Akim Demaille  <akim@epita.fr>
-
-	* src/scan-gram.l (SC_BRACED_CODE): Don't use `<.*>', it is too
-	eager.
-	* tests/actions.at (Exotic Dollars): New.
-
-2002-06-12  Akim Demaille  <akim@epita.fr>
-
-	* src/scan-gram.l (SC_PROLOGUE): Don't eat characters amongst
-	['"/] too eagerly.
-	* tests/input.at (Torturing the Scanner): New.
-
-2002-06-11  Akim Demaille  <akim@epita.fr>
-
-	* src/scan-gram.l (YY_OBS_INIT): Remove, replace with...
-	[SC_COMMENT,SC_STRING,SC_CHARACTER,SC_BRACED_CODE,SC_PROLOGUE]
-	[SC_EPILOGUE]: Output the quadrigraphs only when not in a comment.
-	* src/reader.h, src/scan-gram.l (scanner_initialize): this.
-	* src/reader.c (reader): Use it.
-
-2002-06-11  Akim Demaille  <akim@epita.fr>
-
-	* src/scan-gram.l (YY_OBS_FINISH): Don't set yylval.
-	Adjust all callers.
-	(scanner_last_string_free): New.
-
-2002-06-11  Akim Demaille  <akim@epita.fr>
-
-	* src/scan-gram.l (YY_INIT, YY_GROW, YY_FINISH): Rename as...
-	(YY_OBS_INIT, YY_OBS_GROW, YY_OBS_FINISH): these.
-	(last_string, YY_OBS_FREE): New.
-	Use them when returning an ID.
-
-2002-06-11  Akim Demaille  <akim@epita.fr>
-
-	Have Bison grammars parsed by a Bison grammar.
-
-	* src/reader.c, src/reader.h (prologue_augment): New.
-	* src/reader.c (copy_definition): Remove.
-
-	* src/reader.h, src/reader.c (gram_start_symbol_set, prologue_augment)
-	(grammar_symbol_append, grammar_rule_begin, grammar_midrule_action)
-	(grammar_current_rule_prec_set, grammar_current_rule_check)
-	(grammar_current_rule_symbol_append)
-	(grammar_current_rule_action_append): Export.
-	* src/parse-gram.y (symbol_list_new, symbol_list_symbol_append_
-	(symbol_list_action_append): Remove.
-	Hook the routines from reader.
-	* src/scan-gram.l: In INITIAL, characters and strings are tokens.
-	* src/system.h (ATTRIBUTE_NORETURN, ATTRIBUTE_UNUSED): Now.
-
-	* src/reader.c (read_declarations): Remove, unused.
-
-	* src/parse-gram.y: Handle the epilogue.
-	* src/reader.h, src/reader.c (gram_start_symbol_set): Rename as...
-	(grammar_start_symbol_set): this.
-	* src/scan-gram.l: Be sure to ``use'' yycontrol to keep GCC quiet.
-	* src/reader.c (readgram): Remove, unused.
-	(reader): Adjust to insert eoftoken and axiom where appropriate.
-
-	* src/reader.c (copy_dollar): Replace with...
-	* src/scan-gram.h (handle_dollar): this.
-	* src/parse-gram.y: Remove `%thong'.
-
-	* src/reader.c (copy_at): Replace with...
-	* src/scan-gram.h (handle_at): this.
-
-	* src/complain.h, src/complain.c (warn_at, complain_at, fatal_at):
-	New.
-
-	* src/scan-gram.l (YY_LINES): Keep lineno synchronized for the
-	time being.
-
-	* src/reader.h, src/reader.c (grammar_rule_end): New.
-
-	* src/parse.y (current_type, current_class): New.
-	Implement `%nterm', `%token' support.
-	Merge `%term' into `%token'.
-	(string_as_id): New.
-	* src/symtab.h, src/symtab.c (symbol_make_alias): Don't pass the
-	type name.
-
-	* src/parse-gram.y: Be sure to handle properly the beginning of
-	rules.
-
-	* src/parse-gram.y: Handle %type.
-	* src/reader.c (grammar_rule_end): Call grammar_current_rule_check.
-
-	* src/parse-gram.y: More directives support.
-	* src/options.c: No longer handle source directives.
-
-	* src/parse-gram.y: Fix %output.
-
-	* src/parse-gram.y: Handle %union.
-	Use the prologue locations.
-	* src/reader.c (parse_union_decl): Remove.
-
-	* src/reader.h, src/reader.c (epilogue_set): New.
-	* src/parse-gram.y: Use it.
-
-	* data/bison.simple, data/bison.c++: b4_stype is now either not
-	defined, then default to int, or to the contents of %union,
-	without `union' itself.
-	Adjust.
-	* src/muscle_tab.c (muscle_init): Don't predefine `stype'.
-
-	* src/output.c (actions_output): Don't output braces, as they are
-	already handled by the scanner.
-
-	* src/scan-gram.l (SC_CHARACTER): Set the user_token_number of
-	characters to themselves.
-
-	* tests/reduce.at (Reduced Automaton): End the grammars with %% so
-	that the epilogue has a proper #line.
-
-	* src/parse-gram.y: Handle precedence/associativity.
-
-	* src/symtab.c (symbol_precedence_set): Requires the symbol to be
-	a terminal.
-	* src/scan-gram.l (SC_BRACED_CODE): Catch strings and characters.
-	* tests/calc.at: Do not use `%token "foo"' as it makes not sense
-	at all to define terminals that cannot be emitted.
-
-	* src/scan-gram.l: Escape M4 characters.
-
-	* src/scan-gram.l: Working properly with escapes in user
-	strings/characters.
-
-	* tests/torture.at (AT_DATA_TRIANGULAR_GRAMMAR)
-	(AT_DATA_HORIZONTAL_GRAMMAR): Respect the `%token ID NUM STRING'
-	grammar.
-	Use more modest sizes, as for the time being the parser does not
-	release memory, and therefore the process swallows a huge amount
-	of memory.
-
-	* tests/torture.at (AT_DATA_LOOKAHEADS_GRAMMAR): Adjust to the
-	stricter %token grammar.
-
-	* src/symtab.h (associativity): Add `undef_assoc'.
-	(symbol_precedence_set): Do nothing when passed an undef_assoc.
-	* src/symtab.c (symbol_check_alias_consistence): Adjust.
-
-	* tests/regression.at (Invalid %directive): Remove, as it is now
-	meaningless.
-	(Invalid inputs): Adjust to the new error messages.
-	(Token definitions): The new grammar doesn't allow too many
-	eccentricities.
-
-	* src/lex.h, src/lex.c: Remove.
-	* src/reader.c (lastprec, skip_to_char, read_signed_integer)
-	(copy_character, copy_string2, copy_string, copy_identifier)
-	(copy_comment, parse_token_decl, parse_type_decl, parse_assoc_decl)
-	(parse_muscle_decl, parse_dquoted_param, parse_skel_decl)
-	(parse_action): Remove.
-	* po/POTFILES.in: Adjust.
-
-2002-06-11  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (parse_action): Don't store directly into the
-	rule's action member: return the action as a string.
-	Don't require `rule_length' as an argument: compute it.
-	(grammar_current_rule_symbol_append)
-	(grammar_current_rule_action_append): New, eved out from
-	(readgram): here.
-	Remove `action_flag', `rulelength', unused now.
-
-2002-06-11  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (grammar_current_rule_prec_set).
-	(grammar_current_rule_check): New, eved out from...
-	(readgram): here.
-	Remove `xaction', `first_rhs': useless.
-	* tests/input.at (Type clashes): New.
-	* tests/existing.at (GNU Cim Grammar): Adjust.
-
-2002-06-11  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (grammar_midrule_action): New, Eved out from
-	(readgram): here.
-
-2002-06-11  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (grammar_rule_begin, previous_rule, current_rule):
-	New.
-	(readgram): Use them as replacement of inlined code, crule and
-	crule1.
-
-2002-06-11  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (grammar_end, grammar_symbol_append): New.
-	(readgram): Use them.
-	Make the use of `p' as local as possible.
-
-2002-06-10  Akim Demaille  <akim@epita.fr>
-
-	GCJ's parser requires the tokens to be defined before the prologue.
-
-	* data/bison.simple: Output the token definition before the user's
-	prologue.
-	* tests/regression.at (Braces parsing, Duplicate string)
-	(Mixing %token styles): Check the output from bison.
-	(Early token definitions): New.
-
-2002-06-10  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.c (symbol_user_token_number_set): Don't complain when
-	assigning twice the same user number to a token, so that we can
-	use it in...
-	* src/lex.c (lex): here.
-	Also use `symbol_class_set' instead of hand written code.
-	* src/reader.c (parse_assoc_decl): Likewise.
-
-2002-06-10  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.c, src/symtab.c (symbol_class_set)
-	(symbol_user_token_number_set): New.
-	* src/reader.c (parse_token_decl): Use them.
-	Use a switch instead of ifs.
-	Use a single argument.
-
-2002-06-10  Akim Demaille  <akim@epita.fr>
-
-	Remove `%thong' support as it is undocumented, unused, duplicates
-	`%token's job, and creates useless e-mail traffic with people who
-	want to know what it is, why it is undocumented, unused, and
-	duplicates `%token's job.
-
-	* src/reader.c (parse_thong_decl): Remove.
-	* src/options.c (option_table): Remove "thong".
-	* src/lex.h (tok_thong): Remove.
-
-2002-06-10  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.c, src/symtab.c (symbol_type_set)
-	(symbol_precedence_set): New.
-	* src/reader.c (parse_type_decl, parse_assoc_decl): Use them.
-	(value_components_used): Remove, unused.
-
-2002-06-09  Akim Demaille  <akim@epita.fr>
-
-	Move symbols handling code out of the reader.
-
-	* src/reader.h, src/reader.c (errtoken, undeftoken, eoftoken)
-	(axiom): Move to...
-	* src/symtab.h, src/symtab.c: here.
-
-	* src/gram.c (start_symbol): Remove: use startsymbol->number.
-	* src/reader.c (startval): Rename as...
-	* src/symtab.h, src/symtab.c (startsymbol): this.
-	* src/reader.c: Adjust.
-
-	* src/reader.c (symbol_check_defined, symbol_make_alias)
-	(symbol_check_alias_consistence, symbol_pack, symbol_translation)
-	(token_translations_init)
-	Move to...
-	* src/symtab.c: here.
-	* src/reader.c (packsymbols): Move to...
-	* src/symtab.h, src/symtab.c (symbols_pack): here.
-	* src/symtab.h, src/symtab.c (symbol_make_alias): Takes SYMVAL as
-	argument.
-
-2002-06-03  Akim Demaille  <akim@epita.fr>
-
-	* src/muscle_tab.c (muscle_insert, muscle_find): Declarations,
-	then statements.
-
-2002-06-03  Akim Demaille  <akim@epita.fr>
-
-	* src/muscle_tab.c (muscle_find, muscle_insert): Don't initialize
-	structs with non literals.
-	* src/scan-skel.l: never-interactive.
-	* src/conflicts.c (enum conflict_resolution_e): No trailing
-	comma.
-	* src/getargs.c (usage): Split long literal strings.
-	Reported by Hans Aberg.
-
-2002-05-28  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.c++: Use C++ ostreams.
-	(cdebug_): New member.
-
-2002-05-28  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output_skeleton): Be sure to allocate enough room
-	for `/' _and_ for `\0' in full_skeleton.
-
-2002-05-28  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.c++: Catch up with bison.simple:
-	2002-05-24  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-	and Paul Eggert  <eggert@twinsun.com>: `error' handing.
-	2002-05-26  Akim Demaille  <akim@epita.fr>: stos_, token_number_,
-	and popping traces.
-
-2002-05-27  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* src/output.c (output_skeleton): Put an explicit path in front of
-	the skeleton file name, rather than relying on the -I directory,
-	to partially alleviate effects of having a skeleton file lying around
-	in the current directory.
-
-2002-05-27  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* src/conflicts.c (log_resolution): Correct typo:
-	obstack_printf should be obstack_fgrow1.
-
-2002-05-26  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h (state_t): `solved_conflicts' is a new member.
-	* src/LR0.c (new_state): Set it to 0.
-	* src/conflicts.h, src/conflicts.c (print_conflicts)
-	(free_conflicts, solve_conflicts): Rename as...
-	(conflicts_print, conflicts_free, conflicts_solve): these.
-	Adjust callers.
-	* src/conflicts.c (enum conflict_resolution_e)
-	(solved_conflicts_obstack): New, used by...
-	(log_resolution): this.
-	Adjust to attach the conflict resolution to each state.
-	Complete the description with the precedence/associativity
-	information.
-	(resolve_sr_conflict): Adjust.
-	* src/print.c (print_state): Output its solved_conflicts.
-	* tests/conflicts.at (Unresolved SR Conflicts)
-	(Solved SR Conflicts): Exercise --report=all.
-
-2002-05-26  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c, src/derives.c, src/gram.c, src/gram.h, src/lalr.c,
-	* src/nullable.c, src/output.c, src/print.c, src/print_graph.c,
-	* src/reader.c, src/reduce.c, src/state.h, src/symtab.h
-	(token_number_t, item_number_as_token_number)
-	(token_number_as_item_number, muscle_insert_token_number_table):
-	Rename as...
-	(symbol_number_t, item_number_as_symbol_number)
-	(symbol_number_as_item_number, muscle_insert_symbol_number_table):
-	these, since it is more appropriate.
-
-2002-05-26  Akim Demaille  <akim@epita.fr>
-
-	* tests/calc.at (AT_CHECK_CALC): Adjust: there are now additional
-	`Error:' lines.
-	* data/bison.simple (yystos) [YYDEBUG]: New.
-	(yyparse) [YYDEBUG]: Display the symbols which are popped during
-	error recovery.
-	* tests/regression.at (Web2c Actions): Adjust: yystos is output now.
-
-2002-05-25  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (Debugging): Split into...
-	(Tracing): this new section, its former contents, and...
-	(Understanding): this new section.
-	* src/getargs.h, src/getargs.c (verbose_flag): Remove, replaced
-	by...
-	(report_flag): this.
-	Adjust all dependencies.
-	(report_args, report_types, report_argmatch): New.
-	(usage, getargs): Report/support -r, --report.
-	* src/options.h
-	(struct option_table_struct): Rename as..,
-	(struct option_table_s): this.
-	Rename the `set_flag' member to `flag' to match with getopt_long's
-	struct.
-	* src/options.c (option_table): Split verbose into an entry for
-	%verbose, and another for --verbose.
-	Support --report/-r, so remove -r from the obsolete --raw.
-	* src/print.c: Attach full item sets and lookaheads reports to
-	report_flag instead of trace_flag.
-	* lib/argmatch.h, lib/argmatch.c: New, from Fileutils 4.1.
-
-2002-05-24  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-	and Paul Eggert  <eggert@twinsun.com>
-
-	* data/bison.simple (yyparse): Correct error handling to conform to
-	POSIX and yacc.  Specifically, after syntax error is discovered,
-	do not reduce further before shifting the error token.
-	Clean up the code a bit by removing the labels yyerrdefault,
-	yyerrhandle, yyerrpop.
-	* NEWS: Document the above.
-
-2002-05-20  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* data/bison.simple (yyr1): Don't use yy_token_number_type as element
-	type; it isn't always big enough, since it doesn't necessarily
-	include non-terminals.
-	(yytranslate): Expand definition of yy_token_number_type, so that
-	the latter can be removed.
-	(yy_token_number_type): Remove, only one use.
-	* data/bison.c++ (r1_): Parallel change to yyr1 in bison.simple---
-	don't use TokenNumberType as element type.
-
-	* tests/regression.at: Modify expected output to agree with change
-	to yyr1 and yytranslate.
-
-2002-05-13  Florian Krohm  <florian@edamail.fishkill.ibm.com>
-
-	* src/reader.c (parse_action): Use copy_character instead of
-	obstack_1grow.
-
-2002-05-13  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (Token definitions): Prototype yylex and
-	yyerror.
-
-2002-05-12  Paul Hilfinger  <Hilfinger@CS.Berkeley.EDU>
-
-	* src/scan-skel.l: Correct off-by-one error in handling of __oline__.
-	* data/bison.simple (b4_sint_type, b4_uint_type): Correct to reflect
-	32-bit arithmetic.
-	* data/bison.c++ (b4_sint_type, b4_uint_type): Ditto.
-
-2002-05-07  Akim Demaille  <akim@epita.fr>
-
-	* tests/synclines.at: Be sure to prototype yylex and yyerror to
-	avoid GCC warnings.
-
-2002-05-07  Akim Demaille  <akim@epita.fr>
-
-	Kill GCC warnings.
-
-	* src/reduce.c (nonterminals_reduce): Don't loop over RITEM: loop
-	over the RHS of each rule.
-	* src/gram.h, src/gram.c (nritems): Is `unsigned int', not int.
-	* src/state.h (state_t): Member `nitems' is unsigned short.
-	* src/LR0.c (get_state): Adjust.
-	* src/reader.c (packgram): Likewise.
-	* src/output.c (GENERATE_MUSCLE_INSERT_TABLE): `max' is of type
-	`Type'.
-	(muscle_insert_int_table): Remove, unused.
-	(prepare_rules): Remove `max'.
-
-2002-05-06  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (print_firsts): Display of the symbol tags.
-	(bitmatrix_print): Move to...
-	* lib/bitsetv-print.h, lib/bitsetv-print.c (bitsetv_matrix_dump):
-	here.
-	* tests/sets.at (Nullable, Broken Closure, Firsts): Adjust.
-
-2002-05-06  Akim Demaille  <akim@epita.fr>
-
-	* src/muscle_tab.c (muscle_m4_output): Must return TRUE for
-	hash_do_for_each.
-
-2002-05-06  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (new_state, get_state): Instead of using the global
-	`kernel_size' and `kernel_base', have two new arguments:
-	`core_size' and `core'.
-	Adjust callers.
-
-2002-05-06  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (packgram): No longer end `ritem' with a 0
-	sentinel: it is not used.
-
-2002-05-05  Akim Demaille  <akim@epita.fr>
-
-	New experimental feature: display the lookaheads in the report and
-	graph.
-
-	* src/print (print_core): When --trace-flag, display the rules
-	lookaheads.
-	* src/print_graph.c (print_core): Likewise.
-	Swap the arguments.
-	Adjust caller.
-
-2002-05-05  Akim Demaille  <akim@epita.fr>
-
-	* tests/torture.at (Many lookaheads): New test.
-
-2002-05-05  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (GENERATE_OUTPUT_TABLE): Replace with...
-	(GENERATE_MUSCLE_INSERT_TABLE): this.
-	(output_int_table, output_unsigned_int_table, output_short_table)
-	(output_token_number_table, output_item_number_table): Replace with...
-	(muscle_insert_int_table, muscle_insert_unsigned_int_table)
-	(muscle_insert_short_table, muscle_insert_token_number_table)
-	(muscle_insert_item_number_table): these.
-	Adjust all callers.
-	(prepare_tokens): Don't free `translations', since...
-	* src/reader.h, src/reader.c (grammar_free): do it.
-	Move to...
-	* src/gram.h, src/gram.c (grammar_free): here.
-	* data/bison.simple, data/bison.c++: b4_token_number_max is now
-	b4_translate_max.
-
-2002-05-05  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output_unsigned_int_table): New.
-	(prepare_rules): `i' is unsigned.
-	`prhs', `rline', `r2' are unsigned int.
-	Rename muscle `rhs_number_max' as `rhs_max'.
-	Output muscles `prhs_max', `rline_max', and `r2_max'.
-	Free rline and r1.
-	* data/bison.simple, data/bison.c++: Adjust to use these muscles
-	to compute types instead of constant types.
-	* tests/regression.at (Web2c Actions): Adjust.
-
-2002-05-04  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.h (SALIAS, SUNDEF): Rename as...
-	(USER_NUMBER_ALIAS, USER_NUMBER_UNDEFINED): these.
-	Adjust dependencies.
-	* src/output.c (token_definitions_output): Be sure not to output a
-	`#define 'a'' when fed with `%token 'a' "a"'.
-	* tests/regression.at (Token definitions): New.
-
-2002-05-03  Paul Eggert  <eggert@twinsun.com>
-
-	* data/bison.simple (b4_token_defines): Also define YYTOKENTYPE
-	for K&R C.
-
-2002-05-03  gettextize  <bug-gnu-gettext@gnu.org>
-
-	* Makefile.am (SUBDIRS): Remove intl.
-	(EXTRA_DIST): Add config/config.rpath.
-
-2002-05-03  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple (m4_if): Don't output empty enums.
-	And actually, output valid enum definitions :(.
-
-2002-05-03  Akim Demaille  <akim@epita.fr>
-
-	* configure.bat: Remove, completely obsolete.
-	* Makefile.am (EXTRA_DIST): Adjust.
-	Don't distribute config.rpath...
-	* config/Makefile.am (EXTRA_DIST): Do it.
-
-2002-05-03  Akim Demaille  <akim@epita.fr>
-
-	* configure.in (GETTEXT_VERSION): New.
-	Suggested by Bruno Haible for the forthcoming Gettext 0.10.3.
-
-2002-05-03  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple (b4_token_enum): New.
-	(b4_token_defines): Use it to output tokens both as #define and
-	enums.
-	Suggested by Paul Eggert.
-	* src/output.c (token_definitions_output): Don't output spurious
-	white spaces.
-
-2002-05-03  Akim Demaille  <akim@epita.fr>
-
-	* data/m4sugar/m4sugar.m4: Update from CVS Autoconf.
-
-2002-05-02  Robert Anisko  <robert@lrde.epita.fr>
-
-	* data/bison.c++: Adapt expansion of $s and @s to the C++ parser.
-	Update the stack class, give a try to deque as the default container.
-
-2002-05-02  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple (yyparse): Do not implement @$ = @1.
-	(YYLLOC_DEFAULT): Adjust to do it.
-	* doc/bison.texinfo (Location Default Action): Fix.
-
-2002-05-02  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (parse_braces): Merge into...
-	(parse_action): this.
-
-2002-05-02  Akim Demaille  <akim@epita.fr>
-
-	* configure.in (ALL_LINGUAS): Remove.
-	* po/LINGUAS, hr.po: New.
-
-2002-05-02  Akim Demaille  <akim@epita.fr>
-
-	Remove the so called hairy (semantic) parsers.
-
-	* src/system.h (EXT_GUARD_C, EXT_STYPE_H): Remove.
-	* src/gram.h, src/gram.c (semantic_parser): Remove.
-	(rule_t): Remove the guard and guard_line members.
-	* src/lex.h (token_t): remove tok_guard.
-	* src/options.c (option_table): Remove %guard and %semantic_parser
-	support.
-	* src/output.c, src/output.h (guards_output): Remove.
-	(prepare): Adjust.
-	(token_definitions_output): Don't output the `T'
-	tokens (???).
-	(output_skeleton): Don't output the guards.
-	* src/files.c, src/files.c (attrsfile): Remove.
-	* src/reader.c (symbol_list): Remove the guard and guard_line
-	members.
-	Adjust dependencies.
-	(parse_guard): Remove.
-	* data/bison.hairy: Remove.
-	* doc/bison.texinfo (Environment Variables): Remove occurrences of
-	BISON_HAIRY.
-
-2002-05-02  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (copy_at, copy_dollarm parse_braces, parse_action)
-	(parse_guard): Rename the formal argument `stack_offset' as
-	`rule_length', which is more readable.
-	Adjust callers.
-	(copy_at, copy_dollar): Instead of outputting the hard coded
-	values of $$, $n and so forth, output invocation to b4_lhs_value,
-	b4_lhs_location, b4_rhs_value, and b4_rhs_location.
-	Note: this patch partially drops `semantic-parser' support: it
-	always does `rule_length - n', where semantic parsers ought to
-	always use `-n'.
-	* data/bison.simple, data/bison.c++ (b4_lhs_value)
-	(b4_lhs_location, b4_rhs_value, and b4_rhs_location: New.
-
-2002-05-02  Akim Demaille  <akim@epita.fr>
-
-	* configure.in (AC_INIT): Bump to 1.49b.
-	(AM_INIT_AUTOMAKE): Short invocation.
-
-2002-05-02  Akim Demaille  <akim@epita.fr>
-
-	Version 1.49a.
-
-2002-05-01  Akim Demaille  <akim@epita.fr>
-
-	* src/skeleton.h: Remove.
-
-2002-05-01  Akim Demaille  <akim@epita.fr>
-
-	* src/skeleton.h: Fix the #endif.
-	Reported by Magnus Fromreide.
-
-2002-04-26  Paul Eggert  <eggert@twinsun.com>
-
-	* data/bison.simple (YYSTYPE_IS_TRIVIAL, YYLTYPE_IS_TRIVIAL):
-	Define if we define YYSTYPE and YYLTYPE, respectively.
-	(YYCOPY): Fix [] quoting problem in the non-GCC case.
-
-2002-04-25  Robert Anisko  <robert@lrde.epita.fr>
-
-	* src/scan-skel.l: Postprocess quadrigraphs.
-
-	* src/reader.c (copy_character): New function, used to output
-	single characters while replacing `[' and `]' with quadrigraphs, to
-	avoid troubles with M4 quotes.
-	(copy_comment): Output characters with copy_character.
-	(read_additionnal_code): Likewise.
-	(copy_string2): Likewise.
-	(copy_definition): Likewise.
-
-	* tests/calc.at: Exercise M4 quoting.
-
-2002-04-25  Akim Demaille  <akim@epita.fr>
-
-	* tests/sets.at (AT_EXTRACT_SETS): Sed portability issue: no space
-	between `!' and the command.
-	Reported by Paul Eggert.
-
-2002-04-24  Robert Anisko  <robert@lrde.epita.fr>
-
-	* tests/calc.at: Exercise prologue splitting.
-
-	* data/bison.simple, data/bison.c++: Use `b4_pre_prologue' and
-	`b4_post_prologue' instead of `b4_prologue'.
-
-	* src/output.c (prepare): Add the `pre_prologue' and `post_prologue'
-	muscles.
-	(output): Free pre_prologue_obstack and post_prologue_obstack.
-	* src/files.h, src/files.c (attrs_obstack): Remove.
-	(pre_prologue_obstack, post_prologue_obstack): New.
-	* src/reader.c (copy_definition): Add a parameter to specify the
-	obstack to fill, instead of using attrs_obstack unconditionally.
-	(read_declarations): Pass pre_prologue_obstack to copy_definition if
-	`%union' has not yet been seen, pass post_prologue_obstack otherwise.
-
-2002-04-23  Paul Eggert  <eggert@twinsun.com>
-
-	* data/bison.simple: Remove unnecessary commentary and white
-	space differences from 1_29-branch.
-	Depend on YYERROR_VERBOSE, not defined (YYERROR_VERBOSE).
-
-	(union yyalloc, YYSTACK_GAP_MAX, YYSTACK_BYTES, YYCOPY,
-	YYSTACK_RELOCATE): Do not define if yyoverflow is defined, or
-	if this is a C++ parser and YYSTYPE or YYLTYPE has nontrivial
-	constructors or destructors.
-
-	(yyparse) [! defined YYSTACK_RELOCATE]: Do not relocate the stack.
-
-2002-04-23  Akim Demaille  <akim@epita.fr>
-
-	* tests/sets.at (AT_EXTRACT_SETS): Don't use 8 char long sed labels.
-	* tests/synclines.at (AT_TEST_SYNCLINE): Be robust to GCC's
-	location with columns.
-	* tests/conflicts.at (%nonassoc and eof): Don't use `error.h'.
-	All reported by Paul Eggert.
-
-2002-04-22  Akim Demaille  <akim@epita.fr>
-
-	* src/reduce.c (dump_grammar): Move to...
-	* src/gram.h, src/gram.c (grammar_dump): here.
-	Be sure to separate long item numbers.
-	Don't read the members of a rule's prec if its nil.
-
-2002-04-22  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (table_size, table_grow): New.
-	(MAXTABLE): Remove, replace uses with table_size.
-	(pack_vector): Instead of dying when the table is too big, grow it.
-
-2002-04-22  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.simple (yyr1): Its type is that of a token number.
-	* data/bison.c++ (r1_): Likewise.
-	* tests/regression.at (Web2c Actions): Adjust.
-
-2002-04-22  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (token_translations_init): 256 is now the default
-	value for the error token, i.e., it will be assigned another
-	number if the user assigned 256 to one of her tokens.
-	(reader): Don't force 256 to error.
-	* doc/bison.texinfo (Symbols): Adjust.
-	* tests/torture.at (AT_DATA_HORIZONTAL_GRAMMAR)
-	(AT_DATA_TRIANGULAR_GRAMMAR): Number the tokens as 1, 2, 3
-	etc. instead of 10, 20, 30 (which was used to `jump' over error
-	(256) and undefined (2)).
-
-2002-04-22  Akim Demaille  <akim@epita.fr>
-
-	Propagate more token_number_t.
-
-	* src/gram.h (token_number_as_item_number)
-	(item_number_as_token_number): New.
-	* src/output.c (GENERATE_OUTPUT_TABLE): New.
-	Use it to create output_item_number_table and
-	output_token_number_table.
-	* src/LR0.c, src/derives.c, src/gram.c, src/gram.h, src/lalr.c,
-	* src/lex.c, src/nullable.c, src/output.c, src/print.c,
-	* src/print_graph.c, src/reader.c, src/reduce.c, src/state.h,
-	* src/symtab.c, src/symtab.h: Use token_number_t instead of shorts.
-
-2002-04-22  Akim Demaille  <akim@epita.fr>
-
-	* src/output.h, src/output.c (get_lines_number): Remove.
-
-2002-04-19  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (Actions): Make clear that `|' is not the same
-	as Lex/Flex'.
-	(Debugging): More details about enabling the debugging features.
-	(Table of Symbols): Describe $$, $n, @$, and @n.
-	Suggested by Tim Josling.
-
-2002-04-19  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo: Remove the uses of the obsolete @refill.
-
-2002-04-10  Akim Demaille  <akim@epita.fr>
-
-	* src/system.h: Rely on HAVE_LIMITS_H.
-	Suggested by Paul Eggert.
-
-2002-04-09  Akim Demaille  <akim@epita.fr>
-
-	* tests/calc.at (_AT_CHECK_CALC_ERROR): Receive as argument the
-	full stderr, and strip it according to the bison options, instead
-	of composing the error message from different bits.
-	This makes it easier to check for several error messages.
-	Adjust all the invocations.
-	Add an invocation exercising the error token.
-	Add an invocation demonstrating a stupid error message.
-	(_AT_DATA_CALC_Y): Follow the GCS: initial column is 1, not 0.
-	Adjust the tests.
-	Error message are for stderr, not stdout.
-
-2002-04-09  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h, src/gram.c (error_token_number): Remove, use
-	errtoken->number.
-	* src/reader.c (reader): Don't specify the user token number (2)
-	for $undefined, as it uselessly prevents using it.
-	* src/gram.h (token_number_t): Move to...
-	* src/symtab.h: here.
-	(state_t.number): Is a token_number_t.
-	* src/print.c, src/reader.c: Use undeftoken->number instead of
-	hard coded 2.
-	(Even though this 2 is not the same as above: the number of the
-	undeftoken remains being 2, it is its user token number which
-	might not be 2).
-	* src/output.c (prepare_tokens): Rename the `maxtok' muscle with
-	`user_token_number_max'.
-	Output `undef_token_number'.
-	* data/bison.simple, data/bison.c++: Use them.
-	Be sure to map invalid yylex return values to
-	`undef_token_number'.  This saves us from gratuitous SEGV.
-
-	* tests/conflicts.at (Solved SR Conflicts)
-	(Unresolved SR Conflicts): Adjust.
-	* tests/regression.at (Web2c Actions): Adjust.
-
-2002-04-08  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.c++: s/b4_item_number_max/b4_rhs_number_max/.
-	Adding #line.
-	Remove the duplicate `typedefs'.
-	(RhsNumberType): Fix the declaration and various other typos.
-	Use __ofile__.
-	* data/bison.simple: Use __ofile__.
-	* src/scan-skel.l: Handle __ofile__.
-
-2002-04-08  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h (item_number_t): New, the type of item numbers in
-	RITEM.  Note that it must be able to code symbol numbers as
-	positive number, and the negation of rule numbers as negative
-	numbers.
-	Adjust all dependencies (pretty many).
-	* src/reduce.c (rule): Remove this `short *' pointer: use
-	item_number_t.
-	* src/system.h (MINSHORT, MAXSHORT): Remove.
-	Include `limits.h'.
-	Adjust dependencies to using SHRT_MAX and SHRT_MIN.
-	(shortcpy): Remove.
-	(MAXTABLE): Move to...
-	* src/output.c (MAXTABLE): here.
-	(prepare_rules): Use output_int_table to output rhs.
-	* data/bison.simple, data/bison.c++: Adjust.
-	* tests/torture.at (Big triangle): Move the limit from 254 to
-	500.
-	* tests/regression.at (Web2c Actions): Ajust.
-
-	Trying with bigger grammars shows various phenomena: at 3000 (28Mb
-	of grammar file) bison is killed by my system, at 2000 (12Mb) bison
-	passes, but produces negative #line number, once fixed, GCC is
-	killed while compiling 14Mb, at 1500 (6.7 Mb of grammar, 8.2Mb of
-	C), it passes.
-	* src/state.h (state_h): Code input lines on ints, not shorts.
-
-2002-04-08  Akim Demaille  <akim@epita.fr>
-
-	* src/reduce.c (reduce_grammar): First reduce the nonterminals,
-	and then the grammar.
-
-2002-04-08  Akim Demaille  <akim@epita.fr>
-
-	* src/system.h: No longer using strndup.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/muscle_tab.h (MUSCLE_INSERT_LONG_INT): New.
-	* src/output.c (output_table_data): Return the longest number.
-	(prepare_tokens): Output `token_number_max').
-	* data/bison.simple, data/bison.c++ (b4_sint_type, b4_uint_type):
-	New.
-	Use them to define yy_token_number_type/TokenNumberType.
-	Use this type for yytranslate.
-	* tests/torture.at (Big triangle): Push the limit from 124 to
-	253.
-	* tests/regression.at (Web2c Actions): Adjust.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* tests/torture.at (Big triangle): New.
-	(GNU AWK Grammar, GNU Cim Grammar): Move to...
-	* tests/existing.at: here.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h, src/gram.c (nitems): Remove, it is an alias of
-	nritems.
-	Adjust dependencies.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c: Normalize increments to prefix form.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c, symtab.c: Remove debugging code.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	Rename all the `bucket's as `symbol_t'.
-
-	* src/gram.c, src/gram.h, src/lex.c, src/lex.h, src/output.c,
-	* src/reader.c, src/reader.h, src/reduce.c, src/state.h,
-	* src/symtab.c, src/symtab.h (bucket): Rename as...
-	(symbol_t): this.
-	(symbol_list_new, bucket_check_defined, bucket_make_alias)
-	(bucket_check_alias_consistence, bucket_pack, bucket_translation)
-	(bucket_new, bucket_free, hash_compare_bucket, hash_bucket)
-	(buckets_new, buckets_free, buckets_do): Rename as...
-	(symbol_list_new, symbol_check_defined, symbol_make_alias)
-	(symbol_check_alias_consistence, symbol_pack, symbol_translation)
-	(symbol_new, symbol_free, hash_compare_symbol_t, hash_symbol_t)
-	(symbols_new, symbols_free, symbols_do): these.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	Use lib/hash for the symbol table.
-
-	* src/gram.c (ntokens): Initialize to 1, to reserve a slot for
-	EOF.
-	* src/lex.c (lex): Set the `number' member of new terminals.
-	* src/reader.c (bucket_check_defined, bucket_make_alias)
-	(bucket_check_alias_consistence, bucket_translation): New.
-	(reader, grammar_free, readgram, token_translations_init)
-	(packsymbols): Adjust.
-	(reader): Number the predefined tokens.
-	* src/reduce.c (inaccessable_symbols): Just use hard coded numbers
-	for predefined tokens.
-	* src/symtab.h (bucket): Remove all the hash table related
-	members.
-	* src/symtab.c (symtab): Replace by...
-	(bucket_table): this.
-	(bucket_new, bucket_free, hash_compare_bucket, hash_bucket)
-	(buckets_new, buckets_do): New.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.c (nitems, nrules, nsyms, ntokens, nvars, nritems)
-	(start_symbol, max_user_token_number, semantic_parser)
-	(error_token_number): Initialize.
-	* src/reader.c (grammar, start_flag, startval, typed, lastprec):
-	Initialize.
-	(reader): Don't.
-	(errtoken, eoftoken, undeftoken, axiom): Extern.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h (rule_s): prec and precsym are now pointers
-	to the bucket giving the priority/associativity.
-	Member `associativity' removed: useless.
-	* src/reduce.c, src/conflicts.c: Adjust.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c, src/LR0.c, src/closure.c, src/gram.c, src/reduce.c:
-	Properly escape the symbols' TAG when outputting them.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.h (LA): Is a bitsetv, not bitset*.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.h, src/lalr.c (LAruleno): Replace with...
-	(LArule): this, which is an array to rule_t*.
-	* src/print.c, src/conflicts.c: Adjust.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h (rule_t): Rename `number' as `user_number'.
-	`number' is a new member.
-	Adjust dependencies.
-	* src/reduce.c (reduce_grammar_tables): Renumber rule_t.number.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	As a result of the previous patch, it is no longer needed
-	to reorder ritem itself.
-
-	* src/reduce.c (reduce_grammar_tables): Don't sort RITEM.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	Be sure never to walk through RITEMS, but use only data related to
-	the rules themselves. RITEMS should be banished.
-
-	* src/output.c (output_token_translations): Rename as...
-	(prepare_tokens): this.
-	In addition to `translate', prepare the muscles `tname' and
-	`toknum', which were handled by...
-	(output_rule_data): this.
-	Remove, and move the remainder of its outputs into...
-	(prepare_rules): this new routines, which also merges content from
-	(output_gram): this.
-	(prepare_rules): Be sure never to walk through RITEMS.
-	(output_stos): Rename as...
-	(prepare_stos): this.
-	(output): Always invoke prepare_states, after all, just don't use it
-	in the output if you don't need it.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (new_state): Display `nstates' as the name of the
-	newly created state.
-	Adjust to initialize first_state and last_state if needed.
-	Be sure to distinguish the initial from the final state.
-	(new_states): Create the itemset of the initial state, and use
-	new_state.
-	* src/closure.c (closure): Now that the initial state has its
-	items properly set, there is no need for a special case when
-	creating `ruleset'.
-
-	As a result, now the rule 0, reducing to $axiom, is visible in the
-	outputs.  Adjust the test suite.
-
-	* tests/conflicts.at (Solved SR Conflicts)
-	(Unresolved SR Conflicts): Adjust.
-	* tests/regression.at (Web2c Report, Rule Line Numbers): Idem.
-	* tests/conflicts.at (S/R in initial): New.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (allocate_itemsets): Don't loop over ritem: loop over
-	the RHS of the rules.
-	* src/output.c (output_gram): Likewise.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h (rule_t): `lhs' is now a pointer to the symbol's
-	bucket.
-	Adjust all dependencies.
-	* src/reduce.c (nonterminals_reduce): Don't forget to renumber the
-	`number' of the buckets too.
-	* src/gram.h: Include `symtab.h'.
-	(associativity): Move to...
-	* src/symtab.h: here.
-	No longer include `gram.h'.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h, src/gram.c (rules_rhs_length): New.
-	(ritem_longest_rhs): Use it.
-	* src/gram.h (rule_t): `number' is a new member.
-	* src/reader.c (packgram): Set it.
-	* src/reduce.c (reduce_grammar_tables): Move the useless rules at
-	the end of `rules', and count them out of `nrules'.
-	(reduce_output, dump_grammar): Adjust.
-	* src/print.c (print_grammar): It is no longer needed to check for
-	the usefulness of a rule, as useless rules are beyond `nrules + 1'.
-	* tests/reduce.at (Reduced Automaton): New test.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/reduce.c (inaccessable_symbols): Fix a buglet: because of a
-	lacking `+ 1' to nrules, Bison reported as useless a token if it
-	was used solely to set the precedence of the last rule...
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.c++, data/bison.simple: Don't output the current file
-	name in #line, to avoid useless diffs between two identical
-	outputs under different names.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c, src/print.c, src/reader.c, src/reduce.c:
-	Normalize loops to using `< nrules + 1', not `<= nrules'.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* TODO: Update.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c, src/reader.c, src/symtab.c, src/symtab.h: Rename
-	bucket.value as bucket.number.
-
-2002-04-07  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c, src/derives.c, src/gram.h, src/lalr.c,
-	* src/nullable.c, src/output.c, src/print.c, src/print_graph.c,
-	* src/reader.c, src/reduce.c: Let rule_t.rhs point directly to the
-	RHS, instead of being an index in RITEMS.
-
-2002-04-04  Paul Eggert  <eggert@twinsun.com>
-
-	* doc/bison.texinfo: Update copyright date.
-	(Rpcalc Lexer, Symbols, Token Decl): Don't assume ASCII.
-	(Symbols): Warn about running Bison in one character set,
-	but compiling and/or running in an incompatible one.
-	Warn about character code 256, too.
-
-2002-04-03  Paul Eggert  <eggert@twinsun.com>
-
-	* src/bison.data (YYSTACK_ALLOC): Depend on whether
-	YYERROR_VERBOSE is nonzero, not whether it is defined.
-
-	Merge changes from bison-1_29-branch.
-
-2002-03-20  Paul Eggert  <eggert@twinsun.com>
-
-	Merge fixes from Debian bison_1.34-1.diff.
-
-	* configure.in (AC_PREREQ): 2.53.
-
-2002-03-20  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (log_resolution): Argument `resolution' is const.
-
-2002-03-19  Paul Eggert  <eggert@twinsun.com>
-
-	* src/bison.simple (YYCOPY): New macro.
-	(YYSTACK_RELOCATE): Use it.
-	Remove Type arg; no longer needed.  All callers changed.
-	(yymemcpy): Remove; no longer needed.
-
-	* Makefile.am (AUTOMAKE_OPTIONS): 1.6.
-	* doc/Makefile.am (AUTOMAKE_OPTIONS): Remove.
-
-2002-03-19  Akim Demaille  <akim@epita.fr>
-
-	Test and fix the #line outputs.
-
-	* tests/atlocal.at (GCC): New.
-	* tests/synclines.at (AT_TEST_SYNCLINE): New macro.
-	(Prologue synch line, %union synch line, Postprologue synch line)
-	(Action synch line, Epilogue synch line): New tests.
-	* src/reader.c (parse_union_decl): Define the muscle stype_line.
-	* data/bison.simple, data/bison.c++: Use it.
-
-2002-03-19  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (%nonassoc and eof, Unresolved SR Conflicts)
-	(Solved SR Conflicts, %expect not enough, %expect right)
-	(%expect too much): Move to...
-	* tests/conflicts.at: this new file.
-
-2002-03-19  Akim Demaille  <akim@epita.fr>
-
-	* data/m4sugar/m4sugar.m4: Update from CVS Autoconf.
-	* data/bison.simple, data/bison.c++: Handle the `#define' part, so
-	that we can move to enums for instance.
-	* src/output.c (token_definitions_output): Output a list of
-	`token-name, token-number' instead of the #define.
-	(output_skeleton): Name this list `b4_tokens', not `b4_tokendefs'.
-
-2002-03-14  Akim Demaille  <akim@epita.fr>
-
-	Use Gettext 0.11.1.
-
-2002-03-09  Robert Anisko  <robert@lrde.epita.fr>
-
-	* data/bison.c++: Make the user able to add members to the generated
-	parser by subclassing.
-
-2002-03-05  Robert Anisko  <robert@lrde.epita.fr>
-
-	* src/reader.c (read_additionnal_code): `c' should be an integer, not
-	a character.
-	Reported by Nicolas Tisserand and Nicolas Burrus.
-
-2002-03-04  Robert Anisko  <robert@lrde.epita.fr>
-
-	* src/reader.c: Warn about lacking semi-colons, do not complain.
-
-2002-03-04  Robert Anisko  <robert@lrde.epita.fr>
-
-	* data/bison.c++: Remove a debug line.
-
-2002-03-04  Robert Anisko  <robert@lrde.epita.fr>
-
-	* data/bison.c++: Unmerge value as yylval and value as yyval.  Unmerge
-	location as yylloc and location as yyloc.  Use YYLLOC_DEFAULT, and
-	provide a default implementation.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* tests/input.at (Invalid $n, Invalid @n): Add the ending `;'.
-	* tests/output.at (AT_CHECK_OUTPUT): Likewise.
-	* tests/headers.at (AT_TEST_CPP_GUARD_H): Ditto.
-	* tests/semantic.at (Parsing Guards): Similarly.
-	* src/reader.at (readgram): Complain if the last rule is not ended
-	with a semi-colon.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/warshall.h, src/warshall.c (bitmatrix_print): Move to...
-	* src/closure.c: here.
-	(set_firsts): Use bitsetv_reflexive_transitive_closure instead of
-	RTC.
-	* src/warshall.h, src/warshall.c: Remove.
-	* tests/sets.at (Broken Closure): Adjust.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output_skeleton): tempdir is const.
-	bytes_read is unused.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* lib/bbitset.h, lib/bitset.c, lib/bitset.h, lib/bitsetv.c,
-	* lib/bitsetv.h, lib/ebitset.c, lib/lbitset.c, lib/sbitset.c:
-	Update.
-	From Michael Hayes.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (closure): `r' is unused.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* tests/sets.at (Broken Closure): Add the ending `;'.
-	* src/reader.at (readgram): Complain if a rule is not ended with a
-	semi-colon.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (set_conflicts): Use bitset_disjoint_p.
-	(count_sr_conflicts): Use bitset_count.
-	* src/reduce.c (inaccessable_symbols): Ditto.
-	(bits_size): Remove.
-	* src/warshall.h, src/warshall.c: Convert to bitsetv.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c, src/conflicts.c, src/lalr.c, src/print.c,
-	* src/reduce.c: Remove the `bitset_zero's following the
-	`bitset_create's, as now it is performed by the latter.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* lib/bitset.c, lib/bitset.h, lib/bitsetv.c, lib/bitsetv.h,
-	* lib/ebitset.c, lib/ebitset.h, lib/lbitset.c, lib/lbitset.h,
-	* lib/sbitset.c, lib/sbitset.h, lib/bbitset.h: Update from the
-	latest sources from Michael.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output): Don't free the grammar.
-	* src/reader.c (grammar_free): New.
-	* src/main.c (main): Call it and don't free symtab here.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/lex.c (parse_percent_token): Be sure to 0-end token_buffer
-	before returning.
-	Reported by Benoit Perrot.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	Use bitset operations when possible, not loops over bits.
-
-	* src/conflicts.c (set_conflicts, count_sr_conflicts): Use
-	bitset_or.
-	* src/print.c (print_reductions): Use bitset_and, bitset_andn.
-	* src/reduce.c (useless_nonterminals): Formatting changes.
-	* src/warshall.c (TC): Use bitset_or.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.h, src/lalr.c (tokensetsize): Remove, unused.
-	* src/system.h (BITS_PER_WORD, WORDSIZE, SETBIT, RESETBIT, BITISSET):
-	Ditto.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (F): Now a bitset*.
-	Adjust all dependencies.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (shiftset, lookaheadset): Now bitset.
-	Adjust all dependencies.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/L0.c, src/LR0.h (nstates): Be size_t.
-	Adjust comparisons (signed vs unsigned).
-	* src/conflics.c, src/lalr.c, src/lalr.h, src/output.c (LA): Now a
-	bitset*.
-	Adjust all dependencies.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (firsts): Now, also a bitset.
-	Adjust all dependencies.
-	(varsetsize): Remove, now unused.
-	* src/warshall.h, src/warshall.c: Now work on arrays of bitsets.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/print.c: Convert to use bitset.h, not hand coded iterations
-	over ints.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/reduce.c: Convert to use bitset.h, not hand coded BSet.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (ruleset): Be a bitset.
-	(rulesetsize): Remove.
-
-2002-03-04  Akim Demaille  <akim@epita.fr>
-
-	* lib/bitset-int.h, lib/bitset.c, lib/bitset.h, lib/bitsetv.c,
-	* lib/bitsetv.h, lib/ebitset.c, lib/ebitset.h, lib/lbitset.c,
-	* lib/lbitset.h, lib/sbitset.c, lib/sbitset.h: New.
-	* src/closure.c (fderives): Be an array of bitsets.
-
-2002-02-28  Robert Anisko  <robert@lrde.epita.fr>
-
-	* data/bison.c++: Merge the two generated headers.  Insert a copyright
-	notice in each output file.
-
-2002-02-28  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.c++: Copy the prologue of bison.simple to fetch
-	useful M4 definitions, such as b4_header_guard.
-
-2002-02-25  Akim Demaille  <akim@epita.fr>
-
-	* src/getargs.c (version): Give the name of the authors, and use a
-	translator friendly scheme for the bgr
-	copyright notice.
-
-2002-02-25  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (header_output): Remove, now handled completely via
-	M4.
-
-2002-02-25  Akim Demaille  <akim@epita.fr>
-
-	* m4/m4.m4: New, from CVS Autoconf.
-	* configure.in: Invoke it.
-	* src/output.c (output_skeleton): Use its result instead of the
-	hard coded name.
-
-2002-02-25  Akim Demaille  <akim@epita.fr>
-
-	* lib/tempname.c, lib/mkstemp.c, m4/mkstemp.m4: New, stolen from
-	Fileutils 4.1.5.
-	* configure.in: Invoke UTILS_FUNC_MKSTEMP.
-	* src/output.c (output_skeleton): Use mkstemp to create a real
-	temporary file.
-	Move the filling of `skeleton' and its muscle to...
-	(prepare): here.
-	(output): Move the definition of the prologue muscle to...
-	(prepare): here.
-	* src/system.h (DEFAULT_TMPDIR): New.
-
-2002-02-14  Paul Eggert  <eggert@twinsun.com>
-
-	Remove the support for C++ namespace cleanliness; it was
-	causing more problems than it was curing, since it didn't work
-	properly on some nonstandard C++ compilers.  This can wait
-	for a proper C++ parser.
-
-	* NEWS: Document this.
-	* doc/bison.texinfo (Bison Parser, Debugging): Remove special mention
-	of C++, as it's treated like C now.
-	* src/bison.simple (YYSTD): Remove.
-	(YYSIZE_T, YYFPRINTF, YYPARSE_PARAM_ARG, YYPARSE_PARAM_DECL):
-	Treat C++ just like Standard C instead of trying to support
-	namespace cleanliness.
-
-2002-02-14  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (else): Adjust to Andreas' change.
-
-2002-02-14  Akim Demaille  <akim@epita.fr>
-
-	* lib/Makefile.am (EXTRA_DIST): Ship strnlen.c.
-
-2002-02-13  Andreas Schwab  <schwab@suse.de>
-
-	* src/output.c (output_rule_data): Don't output NULL, it might
-	not be defined yet.
-
-2002-02-11  Robert Anisko  <robert@lrde.epita.fr>
-
-	* data/bison.c++ (YYDEBUG, YYERROR_VERBOSE): After the prologue.
-	(Copyright notice): Update.
-
-2002-02-11  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (%nonassoc and eof): Don't include
-	nonportable headers.
-
-2002-02-08  Robert Anisko  <robert@lrde.epita.fr>
-
-	* data/bison.c++: Correct error recovery.  Make the user able to
-	initialize the starting location.
-
-2002-02-07  Akim Demaille  <akim@epita.fr>
-
-	* tests/input.at: New.
-
-2002-02-07  Robert Anisko  <robert@lrde.epita.fr>
-
-	* data/bison.c++: Replace some direct m4 expansions by constants.  Be
-	more consistent when naming methods and variables.  Put preprocessor
-	directives around tables only needed for debugging.
-
-2002-02-07  Robert Anisko  <robert@lrde.epita.fr>
-
-	* data/bison.c++ (yy::b4_name::print_): New method, replaces yyprint in
-	C++ parsers.
-	(yy::b4_name::parse): Use print_.
-
-2002-02-07  Robert Anisko  <robert@lrde.epita.fr>
-
-	* data/bison.c++ (yy::b4_name::parse): Error recovery is back.
-
-2002-02-07  Robert Anisko  <robert@lrde.epita.fr>
-
-	* data/bison.c++ (yy::b4_name::error_): New method, replaces yyerror in
-	C++ parsers.
-	(yy::b4_name::parse): Build verbose error messages, and use error_.
-
-2002-02-06  Robert Anisko  <robert@lrde.epita.fr>
-
-	* data/bison.c++: Fix m4 quoting in comments.
-
-2002-02-06  Robert Anisko  <robert@lrde.epita.fr>
-
-	* data/bison.c++: Adjust the parser code.  Fix some muscles that were
-	not expanded by m4.
-
-2002-02-05  Akim Demaille  <akim@epita.fr>
-
-	* data/bison.c++: Adjust to the M4 back end.
-	More is certainly needed.
-
-2002-02-05  Akim Demaille  <akim@epita.fr>
-
-	Give a try to M4 as a back end.
-
-	* lib/readpipe.c: New, from wdiff.
-	* src/Makefile.am (DEFS): Define PKGDATADIR, not BISON_SIMPLE and
-	BISON_HAIRY.
-	* src/system.h (BISON_HAIRY, BISON_SIMPLE): Remove the DOS and VMS
-	specific values.  Now it is m4 that performs the lookup.
-	* src/parse-skel.y: Remove.
-	* src/muscle_tab.c, src/muscle_tab.h (muscles_m4_output): New.
-	* src/output.c (actions_output, guards_output)
-	(token_definitions_output): No longer keeps track of the output
-	line number, hence remove the second argument.
-	(guards_output): Check against the guard member of a rule, not the
-	action member.
-	Adjust callers.
-	(output_skeleton): Don't look for the skeleton location, let m4 do
-	that.
-	Create `/tmp/muscles.m4'.  This is temporary, a proper temporary
-	file will be used.
-	Invoke `m4' on m4sugar.m4, muscles.m4, and the skeleton.
-	(prepare): Given that for the time being changesyntax is not
-	usable in M4, rename the muscles using `-' to `_'.
-	Define `defines_flag', `output_parser_name' and `output_header_name'.
-	* src/output.h (actions_output, guards_output)
-	(token_definitions_output): Adjust prototypes.
-	* src/scan-skel.l: Instead of scanning the skeletons, it now
-	processes the output of m4: `__oline__' and `#output'.
-	* data/bison.simple: Adjust to be used by M4(sugar).
-	* tests/Makefile.am: Use check_SCRIPTS to make sure `bison' is up
-	to date.
-	* tests/bison.in: Use the secrete envvar `BISON_PKGDATADIR'
-	instead of the dead `BISON_SIMPLE' and `BISON_HAIRY'.
-	* data/m4sugar/m4sugar.m4, data/m4sugar/version.m4: New,
-	shamelessly stolen from CVS Autoconf.
-
-2002-02-05  Akim Demaille  <akim@epita.fr>
-
-	* lib/hash.c, lib/hash.h: Replace with Fileutils 4.1's version.
-	* configure.in: Check for the declarations of free and malloc.
-	* src/muscle_tab.c: Adjust.
-
-2002-02-05  Akim Demaille  <akim@epita.fr>
-
-	* src/muscle_tab.c (muscle_init): Don't default to NULL muscle
-	which have no values.
-
-2002-02-05  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.simple, src/bison.hairy, src/bison.c++: Move to...
-	* data/: here.
-
-2002-01-29  Paul Eggert  <eggert@twinsun.com>
-
-	* src/bison.simple (YYSIZE_T): Do not define merely because
-	YYSTACK_USE_ALLOCA is nonzero or alloca or _ALLOCA_H are defined.
-	On some platforms, <alloca.h> does not declare YYSTD (size_t).
-
-2002-01-27  Akim Demaille  <akim@epita.fr>
-
-	Fix `%nonassoc and eof'.
-
-	* src/state.c (errs_dup): Aaaah!  The failure was due to bytes
-	which were not properly copied!  Replace
-	memcpy (res->errs, src->errs, src->nerrs);
-	with
-	memcpy (res->errs, src->errs, src->nerrs * sizeof (src->errs[0]));
-	!!!
-	* tests/regression.at (%nonassoc and eof): Adjust to newest
-	Autotest: `.' is not in the PATH.
-
-2002-01-27  Akim Demaille  <akim@epita.fr>
-
-	* tests/sets.at (AT_EXTRACT_SETS): New.
-	(Nullable): Use it.
-	(Firsts): New.
-
-2002-01-26  Akim Demaille  <akim@epita.fr>
-
-	* tests/actions.at, tests/calc.at, tests/headers.at,
-	* tests/torture.at: Adjust to the newest Autotest which no longer
-	forces `.' in the PATH.
-
-2002-01-25  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (%nonassoc and eof): New.
-	Suggested by Robert Anisko.
-
-2002-01-24  Akim Demaille  <akim@epita.fr>
-
-	Bison dumps core when trying to complain about broken input files.
-	Reported by Cris van Pelt.
-
-	* src/lex.c (parse_percent_token): Be sure to set token_buffer.
-	* tests/regression.at (Invalid input: 1, Invalid input: 2): Merge
-	into...
-	(Invalid inputs): Strengthen: exercise parse_percent_token.
-
-2002-01-24  Robert Anisko  <robert.anisko@epita.fr>
-
-	* src/Makefile.am: Add bison.c++.
-	* src/bison.c++: New skeleton.
-
-2002-01-21  Paolo Bonzini <bonzini@gnu.org>
-
-	* po/it.po: New.
-
-2002-01-21  Kees Zeelenberg  <kzlg@users.sourceforge.net>
-
-	* src/files.c (skeleton_find) [MSDOS]: Fix cp definition.
-
-2002-01-20  Marc Autret  <marc@gnu.org>
-
-	* src/files.c (compute_output_file_names): Fix
-
-2002-01-20  Marc Autret  <marc@gnu.org>
-
-	* tests/output.at: New test.
-	* src/files.c (compute_base_names): Don't map extensions when
-	the YACC flag is set, use defaults.
-	Reported by Evgeny Stambulchik.
-
-2002-01-20  Marc Autret  <marc@gnu.org>
-
-	* src/system.h: Need to define __attribute__ away for non-GCC
-	compilers as well (i.e., the vendor C compiler).
-	Suggested by Albert Chin-A-Young.
-
-2002-01-11  Tim Van Holder  <tim.van.holder@pandora.be>
-
-	* lib/hash.h, lib/hash.c: Renamed __P to PARAMS and used the
-	canonical definition.
-	* src/system.h: Use the canonical definition for PARAMS (avoids
-	a conflict with the macro from lib/hash.h).
-
-2002-01-11  Akim Demaille  <akim@epita.fr>
-
-	* configure.in: Use AC_FUNC_STRNLEN.
-	Fixes the failures observed on AIX 4.3 by H.Merijn Brand.
-
-2002-01-09  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c, src/files.h (output_infix): New.
-	(tab_extension): Remove.
-	(compute_base_names): Compute the former, drop the latter.
-	* src/output.c (prepare): Insert the muscles `output-infix', and
-	`output-suffix'.
-	* src/parse-skel.y (string, string.1): New.
-	(section.header): Use it.
-	(section.yacc): Remove.
-	(prefix): Remove too.
-	* src/scan-skel.l: Adjust.
-	* src/bison.simple, src/bison.hairy: Adjust.
-
-2002-01-09  Akim Demaille  <akim@epita.fr>
-
-	* configure.in (WERROR_CFLAGS): Compute it.
-	* src/Makefile.am (CFLAGS): Pass it.
-	* tests/atlocal.in (CFLAGS): Idem.
-	* src/files.c: Fix a few warnings.
-	(get_extension_index): Remove, unused.
-
-2002-01-08  Akim Demaille  <akim@epita.fr>
-
-	* src/getargs.c (AS_FILE_NAME): New.
-	(getargs): Use it to convert DOSish file names.
-	* src/files.c (base_name): Rename as full_base_name to avoid
-	clashes with `base_name ()'.
-	(filename_split): New.
-	(compute_base_names): N-th rewrite, using filename_split.
-
-2002-01-08  Akim Demaille  <akim@epita.fr>
-
-	* lib/basename.c, lib/dirname.h, lib/dirname.c, lib/memrchr.c:
-	New, stolen from the Fileutils 4.1.
-	* lib/Makefile.am (libbison_a_SOURCES): Adjust.
-	* configure.in: Check for the presence of memrchr, and of its
-	prototype.
-
-2002-01-07  Tim Van Holder  <tim.van.holder@pandora.be>
-
-	* lib/hash.h (__P): Added definition for this macro.
-	* src/Makefile.am: Add parse-skel.c and scan-skel.c to
-	BUILT_SOURCES, to ensure they are generated first.
-	* src/parse-skel.y: Use YYERROR_VERBOSE instead of
-	%error-verbose to allow bootstrapping with bison 1.30x.
-
-2002-01-06  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (parse_braces): Don't fetch the next char, the
-	convention is to fetch on entry.
-	* tests/torture.at (GNU Cim Grammar): Reintroduce their weird
-	'switch' without a following semicolon.
-	* tests/regression.at (braces parsing): New.
-
-2002-01-06  Akim Demaille  <akim@epita.fr>
-
-	Bison is dead wrong in its RR conflict reports.
-
-	* tests/torture.at (GNU Cim Grammar): New.
-	* src/conflicts.c (count_rr_conflicts): Fix.
-
-2002-01-06  Akim Demaille  <akim@epita.fr>
-
-	Creating package.m4 from configure.ac causes too many problems.
-
-	* tests/Makefile.am (package.m4): Create it by hand,
-	AC_CONFIG_TESTDIR no longer does in the most recent CVS Autoconf.
-
-2002-01-06  Akim Demaille  <akim@epita.fr>
-
-	* src/Makefile.am (bison_SOURCES): Add parse-skel.h and
-	skeleton.h.
-
-2002-01-04  Paul Eggert  <eggert@twinsun.com>
-
-	* doc/bison.texinfo (Debugging):
-	Remove YYSTDERR; it's no longer defined or used.
-	Also, s/cstdio.h/cstdio/.
-
-2002-01-03  Akim Demaille  <akim@epita.fr>
-
-	* tests/bison.in, tests/atlocal.in: Adjust to CVS Autoconf.
-
-2002-01-03  Akim Demaille  <akim@epita.fr>
-
-	* src/parse-skel.y (process_skeleton): Don't bind the parser's
-	tracing code to --trace, wait for a better --trace option, with
-	args.
-
-2002-01-03  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.simple (YYSTDERR): Remove, replace `stderr'.
-	The ISO C++ standard is extremely clear about it: stderr is
-	considered a macro, not a regular symbol (see table 94 `Header
-	<cstdio> synopsis', [lib.c.files] 27.8.2 C Library files).
-	Therefore std:: does not apply to it.  It still does with fprintf.
-	Also, s/cstdio.h/cstdio/.
-
-2002-01-03  Akim Demaille  <akim@epita.fr>
-
-	* lib/quotearg.c: Use `#include "..."' instead of `#include <...>'
-	for non system headers.
-
-2002-01-02  Akim Demaille  <akim@epita.fr>
-
-	Equip the skeleton chain with location tracking, runtime trace,
-	pure parser and scanner.
-
-	* src/parse-skel.y: Request a pure parser, locations, and prefix
-	renaming.
-	(%union): Having several members with the same type does not help
-	type mismatches, simplify.
-	(YYPRINT, yyprint): New.
-	(yyerror): ``Rename'' (there is a #define yyerror skel_error) as...
-	(skel_error): this.
-	Handle locations.
-	* src/scan-skel.l: Adjust to these changes.
-	* src/skeleton.h (LOCATION_RESET, LOCATION_LINES, LOCATION_STEP)
-	(LOCATION_PRINT, skel_control_t): New.
-
-2001-12-30  Akim Demaille  <akim@epita.fr>
-
-	* src/parse-skel.y: Get rid of the shift/reduce conflict:
-	replace `gb' with BLANKS.
-	* src/scan-skel.l: Adjust.
-
-2001-12-30  Akim Demaille  <akim@epita.fr>
-
-	* src/system.h: We don't need nor want bcopy.
-	Throw away MS-DOS crap: we don't need getpid.
-	* configure.in: We don't need strndup.  It was even causing
-	problems: because Flex includes the headers *before* us,
-	_GNU_SOURCE is not defined by config.h, and therefore strndup was
-	not visible.
-	* lib/xstrndup.c: New.
-	* src/scan-skel.l: Use it.
-	Be sure to initialize yylval.muscle member when scanning a MUSCLE.
-	* src/parse-skel.y: Use %directives instead of #defines.
-
-2001-12-30  Akim Demaille  <akim@epita.fr>
-
-	* src/skeleton.h: New.
-	* src/output.c (output_parser, output_master_parser): Remove, dead
-	code.
-	* src/output.h (get_lines_number, actions_output, guards_output)
-	(token_definitions_output): Prototype them.
-	* src/parse-skel.y: Add the license notice.
-	Include output.h and skeleton.h.
-	(process_skeleton): Returns void, and takes a single parameter.
-	* src/scan-skel.l: Add the license notice.
-	Include skeleton.h.
-	Don't use %option yylineno: it seems that then Flex imagines
-	REJECT has been used, and therefore it won't reallocate its
-	buffers (which makes no other sense to me than a bug).  It results
-	in warnings for `unused: yy_flex_realloc'.
-
-2001-12-30  Robert Anisko  <robert.anisko@epita.fr>
-
-	* src/muscle_tab.h (MUSCLE_INSERT_INT, MUSCLE_INSERT_STRING)
-	(MUSCLE_INSERT_PREFIX): ...to there.
-	* src/output.c (MUSCLE_INSERT_INT, MUSCLE_INSERT_STRING)
-	(MUSCLE_INSERT_PREFIX): Move from here...
-
-	* src/bison.hairy: Add a section directive.  Put braces around muscle
-	names.  This parser skeleton is still broken, but Bison should not
-	choke on a bad muscle 'syntax'.
-	* src/bison.simple: Add a section directive.  Put braces around muscle
-	names.
-
-	* src/files.h (strsuffix, stringappend): Add declarations.
-	(tab_extension): Add declaration.
-	(short_base_name): Add declaration.
-
-	* src/files.c (strsuffix, stringappend): No longer static.  These
-	functions are used in the skeleton parser.
-	(tab_extension): New.
-	(compute_base_names): Use the computations done in this function
-	to guess if the generated parsers should have '.tab' in their
-	names.
-	(short_base_name): No longer static.
-
-	* src/output.c (output_skeleton): New.
-	(output): Disable call to output_master_parser, and give a try to
-	a new skeleton handling system.
-	(guards_output, actions_output): No longer static.
-	(token_definitions_output, get_lines_number): No longer static.
-
-	* configure.in: Use AM_PROG_LEX and AC_PROG_YACC.
-
-	* src/Makefile.am (bison_SOURCES): Add scan-skel.l and
-	parse-skel.y.
-
-	* src/parse-skel.y: New file.
-	* src/scan-skel.l: New file.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	%name-prefix is broken.
-
-	* src/files.c (spec_name_prefix): Initialize to NULL, not to "yy".
-	Adjust all dependencies.
-	* tests/headers.at (export YYLTYPE): Strengthen this test: use
-	%name-prefix.
-
-	Renaming yylval but not yylloc is not consistent.  Now we do.
-
-	* src/bison.simple: Prefix yylloc if used.
-	* doc/bison.texinfo (Decl Summary): Document that.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo: Promote `%long-directive' over
-	`%long_directive'.
-	Remove all references to fixed-output-files, yacc is enough.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.simple: Define YYDEBUG and YYERROR_VERBOSE *after* the
-	user prologue.  These are defaults.
-	* tests/actions.at (Mid-rule actions): Make sure the user can
-	define YYDEBUG and YYERROR_VERBOSE.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (header_output): Don't forget to export YYLTYPE and
-	yylloc.
-	* tests/headers.at (export YYLTYPE): New, make sure it does.
-	* tests/regression.at (%union and --defines, Invalid CPP headers):
-	Move to...
-	* tests/headers.at: here.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h (rule_s): Member `assoc' is of type `associativity'.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* tests/actions.at (Mid-rule actions): Output on a single line
-	instead of several.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo: Formatting changes.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	Don't store the token defs in a muscle, just be ready to output it
-	on command.  Now possible via `symbols'.  Fixes a memory leak.
-
-	* src/output.c (token_definitions_output): New.
-	(output_parser, header_output): Use it.
-	* src/reader.c (symbols_save): Remove.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.simple: Do not provide a default for YYSTYPE and
-	YYLTYPE before the user's prologue.  Otherwise it's hardly... a
-	default.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	Mid-rule actions are simply... ignored!
-
-	* src/reader.c (readgram): Be sure to attach mid-rule actions to
-	the empty-rule associated to the dummy symbol, not to the host
-	rule.
-	* tests/actions.at (Mid-rule actions): New.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	Memory leak.
-
-	* src/reader.c (reader): Free grammar.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	Memory leak.
-
-	* src/LR0.c (new_itemsets): Don't allocate `shift_symbol' here,
-	since it allocates it for each state, although only one is needed.
-	(allocate_storage): Do it here.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/options.h, src/options.c (create_long_option_table): Rename
-	as...
-	(long_option_table_new): this, with a clearer prototype.
-	(percent_table): Remove, unused,
-	* src/getargs.c (getargs): Adjust.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c, src/conflicts.c, src/lalr.c, src/lalr.h, src/output.c
-	* src/print.c, src/print_graph.c, src/state.h: Rename state_table
-	as states.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (build_relations): Rename `states' as `states1'.
-	Sorry, I don't understand exactly what it is, no better name...
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c, src/conflicts.c, src/derives.c, src/gram.c
-	* src/gram.h, src/lalr.c, src/nullable.c, src/output.c, src/print.c
-	* src/print_graph.c, src/reader.c, src/reduce.c: Rename rule_table
-	as rules.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.c (rprec, rprecsym, rassoc): Remove, unused since long
-	ago.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c, src/reader.h (user_toknums): Remove.
-	Adjust all users to use symbols[i]->user_token_number.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.c, src/gram.h (sprec, sassoc): Remove.
-	Adjust all users to use symbols[i]->prec or ->assoc.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c, src/reader.h (tags): Remove.
-	Adjust all users to use symbols[i]->tag.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h, src/gram.c (symbols): New, similar to state_table
-	and rule_table.
-	* src/reader.c (packsymbols): Fill this table.
-	Drop sprec.
-	* src/conflicts.c (resolve_sr_conflict): Adjust.
-	* src/reduce.c (reduce_grammar): Adjust: just sort symbols, a
-	single table.
-	Use symbols[i]->tag instead of tags[i].
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* tests/calc.at (_AT_DATA_CALC_Y): Also use %union.
-	In addition, put a comment in there, to replace...
-	* tests/regression.at (%union and C comments): Remove.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (Web2c Actions): Blindly move the actual
-	output as expected output.  The contents *seem* right to me, but I
-	can't pretend reading perfectly parser tables...  Nonetheless, all
-	the other tests pass correctly, the table look OK, even though the
-	presence of `$axiom' is to be noted: AFAICS it is useless (but
-	harmless).
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (readgram): Don't add the rule 0 if there were no
-	rules read.  In other words, add it _after_ having performed
-	grammar sanity checks.
-	Fixes the `tests/regression.at (Invalid input: 1)' Failure.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (Web2c Report): Catch up: the rule 0 is now
-	visible, and some states have now a different number.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (readgram): Bind the initial rule's lineno to that
-	of the first rule.
-	* tests/regression.at (Rule Line Numbers, Unresolved SR Conflicts):
-	(Solved SR Conflicts): Adjust rule 0's line number.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	Fix the `GAWK Grammar' failure.
-
-	* src/LR0.c (final_state): Initialize to -1 so that we do compute
-	the reductions of the first state which was mistakenly confused
-	with the final state because precisely final_state was initialized
-	to 0.
-	* tests/sets.at (Nullable): Adjust: state 0 does have lookaheads,
-	now noticed by Bison.
-	* tests/regression.at (Rule Line Numbers): Adjust: state 0 does
-	have a reduction on $default.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.c (ritem_print): Be sure to subtract 1 when displaying
-	rule line numbers.
-	* src/closure.c (print_closure): Likewise.
-	* src/derives.c (print_derives): Likewise.
-	* tests/sets.at (Nullable): Adjust: the rule numbers are correct
-	now.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (lookaheads_print): New.
-	(lalr): Call it when --trace-flag.
-	* tests/sets.at (Nullable): Adjust: when tracing, the lookaheads
-	are dumped.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/derives.c (print_derives): Be sure to use `>= 0', not `> 0',
-	when walking through ritem, even via rule->rhs.
-	* src/reduce.c (dump_grammar, useful_production, reduce_output)
-	(useful_production, useless_nonterminals): Likewise.
-	(reduce_grammar_tables): Likewise, plus update nritems.
-	* src/nullable.c (set_nullable): Likewise.
-	* src/lalr.c (build_relations): Likewise.
-	* tests/sets.at (Nullable): Adjust.
-	Fortunately, now, the $axiom is no longer nullable.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (generate_states): Use nritems, not nitems, nor using
-	the 0-sentinel.
-	* src/gram.c (ritem_longest_rhs): Likewise.
-	* src/reduce.c (nonterminals_reduce): Likewise.
-	* src/print_graph.c (print_graph): Likewise.
-	* src/output.c (output_rule_data): Likewise.
-	* src/nullable.c (set_nullable):  Likewise.
-
-2001-12-29  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c: Comment changes.
-
-2001-12-27  Paul Eggert  <eggert@twinsun.com>
-
-	* src/bison.simple (YYSTACK_ALLOC, YYSIZE_T): Remove special
-	cases for non-GNU systems like AIX, HP-UX, SGI, Sun, and
-	Sparc, as they were causing more porting problems than the
-	(minor) performance improvement was worth.
-
-	Also, catch up with 1.31's YYSTD.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output_gram): Rely on nritems, not the
-	0-sentinel.  See below.
-	Use -1 as separator, not 0.
-	* src/bison.simple (yyparse): Subtract 1 to the rule numbers.
-	Rely on -1 as separator in yyrhs, instead of 0.
-	* tests/calc.at (AT_CHECK_CALC): Now, the parsers no longer issue
-	twice `Now at end of input', therefore there are two lines less to
-	expect.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (Unresolved SR Conflicts):
-	(Solved SR Conflicts, Rule Line Numbers): Adjust to the changes
-	below.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (new_state): Recognize the final state by the fact it
-	is reached by eoftoken.
-	(insert_start_shifting_state, insert_eof_shifting_state)
-	(insert_accepting_state, augment_automaton): Remove, since now
-	these states are automatically computed from the initial state.
-	(generate_states): Adjust.
-	* src/print.c: When reporting a rule number to the user, substract
-	1, so that the axiom rule is rule 0, and the first user rule is 1.
-	* src/reduce.c: Likewise.
-	* src/print_graph.c (print_core): For the time being, just as for
-	the report, depend upon --trace-flags to dump the full set of
-	items.
-	* src/reader.c (readgram): Once the grammar read, insert the rule
-	0: `$axiom: START-SYMBOL $'.
-	* tests/set.at: Adjust: rule 0 is now displayed, and since the
-	number of the states has changed (the final state is no longer
-	necessarily the last), catch up.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	Try to make the use of the eoftoken valid.  Given that its value
-	is 0 which was also used as a sentinel in ritem, (i) make sure >= 0
-	is used instead of > 0 where appropriate, (ii), depend upon nritems
-	instead of the 0-sentinel.
-
-	* src/gram.h, src/gram.c (nritems): New.
-	Expected to be duplication of nitems, but for the time being...
-	* src/reader.c (packgram): Assert nritems and nitems are equal.
-	* src/LR0.c (allocate_itemsets, new_itemsets): Adjust.
-	* src/closure.c (print_closure, print_fderives): Likewise.
-	* src/gram.c (ritem_print): Likewise.
-	* src/print.c (print_core, print_grammar): Likewise.
-	* src/print_graph.c: Likewise.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/main.c (main): If there are complains after grammar
-	reductions, then output the report anyway if requested, then die.
-	* src/symtab.c (bucket_new): Initialize `value' to -1, not 0.
-	* src/reader.c (eoftoken): New.
-	(parse_token_decl): If the token being defined has value `0', it
-	is the eoftoken.
-	(packsymbols): No longer hack `tags' to insert `$' by hand.
-	Be sure to preserve the value of the eoftoken.
-	(reader): Make sure eoftoken is defined.
-	Initialize nsyms to 0: now eoftoken is created just like the others.
-	* src/print.c (print_grammar): Don't special case the eof token.
-	* src/regression.at: Adjust: `$' has value 0, not -1, which was a
-	lie anyway, albeit pleasant.
-	* tests/calc.at: Exercise error messages with eoftoken.
-	Change the grammar so that empty input is invalid.
-	Adjust expectations.
-	When yyungeting, be sure to use a valid yylloc: use last_yylloc.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* configure.in: Check the protos of strchr ans strspn.
-	Replace strchr if needed.
-	* src/system.h: Provide the protos of strchr, strspn and memchr if
-	missing.
-	* lib/strchr.c: New.
-	* src/reader.c (symbols_save): Use strchr.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/print.c, src/print_graph.c (escape): New.
-	Use it to quote the TAGS outputs.
-	* src/print_graph.c (print_state): Now errors are in red, and
-	reductions in green.
-	Prefer high to wide: output the state number on a line of its own.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h, src/state.c (reductions_new): New.
-	* src/LR0.c (set_state_table): Let all the states have a
-	`reductions', even if reduced to 0.
-	(save_reductions): Adjust.
-	* src/lalr.c (initialize_LA, initialize_lookaheads): Adjust.
-	* src/print.c (print_reductions, print_actions): Adjust.
-	* src/output.c (action_row): Adjust.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h, src/state.c (errs_new, errs_dup): New.
-	* src/LR0.c (set_state_table): Let all the states have an errs,
-	even if reduced to 0.
-	* src/print.c (print_errs, print_reductions): Adjust.
-	* src/output.c (output_actions, action_row): Adjust.
-	* src/conflicts.c (resolve_sr_conflict): Adjust.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (set_goto_map, initialize_F): Use SHIFT_SYMBOL.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c, src/conflicts.h (print_reductions): Move to...
-	* src/print.c: here.
-	(lookaheadset, shiftset): New, used as additional storage by
-	print_reductions.
-	(print_results): Adjust.
-	(print_shifts, print_gotos, print_errs): New, extracted from...
-	(print_actions): here.
-	* src/print_graph.c (print_actions): Remove dead code.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (copy_dollar, copy_at): Better checking of `n' in
-	`$n' and `@n'.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (add_lookback_edge): Use state_t instead of ints.
-	(build_relations): Adjust.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (set_goto_map): Remove a wrong but benign loop
-	duplication.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (packgram): Catch nitems overflows.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c, src/files.h (guard_obstack): Remove.
-	* src/output.c (output): Adjust.
-	* src/reader.c (parse_braces): New, factoring...
-	(copy_action, copy_guard): these two which are renamed as...
-	(parse_action, parse_guard): these.
-	As a voluntary consequence, using braces around guards is now
-	mandatory.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h (rule_t): `guard' and `guard_line' are new members.
-	* src/reader.c (symbol_list): `guard' and `guard_line' are new
-	members.
-	(symbol_list_new): Adjust.
-	(copy_action): action_line is the first line, not the last.
-	(copy_guard): Just as for actions, store the `action' only, not
-	the switch/case/break flesh.
-	Don't parse the user action that might follow the guard, let...
-	(readgram): do it, i.e., now, there can be an action after a
-	guard.
-	In other words the guard is just explicitly optional.
-	(packgram): Adjust.
-	* src/output.c (guards_output): New.
-	(output_parser): Call it when needed.
-	(output): Also free the guard and attrs obstacks.
-	* src/files.c, src/files.h (obstack_save): Remove.
-	(output_files): Remove.
-	As a result, if one needs the former `.act' file, using an
-	appropriate skeleton which requires actions and guards is now
-	required.
-	* src/main.c (main): Adjust.
-	* tests/semantic.at: New.
-	* tests/regression.at: Use `input.y' as input file name.
-	Avoid 8+3 problems by requiring input.c when the test needs the
-	parser.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (symbol_list_new): Be sure to initialize all the
-	fields.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	All the hacks using a final pseudo state are now useless.
-
-	* src/LR0.c (set_state_table): state_table holds exactly nstates.
-	* src/lalr.c (nLA): New.
-	(initialize_LA, compute_lookaheads, initialize_lookaheads): Use it
-	instead of lookaheadsp from the pseudo state (nstate + 1).
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (action_row, token_actions): Use a state_t instead
-	of a integer, and nlookaheads instead of the following state's
-	lookaheadsp.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (log_resolution, flush_shift)
-	(resolve_sr_conflict, set_conflicts, solve_conflicts)
-	(count_sr_conflicts, count_rr_conflicts, conflicts_output)
-	(conflicts_print, print_reductions): Use a state_t instead of an
-	integer when referring to a state.
-	As much as possible, depend upon nlookaheads, instead of the
-	`lookaheadsp' member of the following state (since lookaheads of
-	successive states are successive, the difference between state n + 1
-	and n served as the number of lookaheads for state n).
-	* src/lalr.c (add_lookback_edge): Likewise.
-	* src/print.c (print_core, print_actions, print_state)
-	(print_results): Likewise.
-	* src/print_graph.c (print_core, print_actions, print_state)
-	(print_graph): Likewise.
-	* src/conflicts.h: Adjust.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.hairy: Formatting/comment changes.
-	ANSIfy.
-	Remove `register' indications.
-	Add plenty of `static'.
-
-2001-12-27  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (prepare): Drop the muscle `ntbase' which
-	duplicates ntokens.
-	* src/bison.simple: Formatting/comment changes.
-	Use YYNTOKENS only, which is documented, but not YYNTBASE, which
-	is an undocumented synonym.
-
-2001-12-22  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output_table_data): Change the prototype to use
-	`int' for array ranges: some invocations do pass an int, not a
-	short.
-	Reported by Wayne Green.
-
-2001-12-22  Akim Demaille  <akim@epita.fr>
-
-	Some actions of web2c.y are improperly triggered.
-	Reported by Mike Castle.
-
-	* src/lalr.c (traverse): s/F (i)[k] = F (j)[k]/F (j)[k] = F (i)[k]/.
-	* tests/regression.at (Web2c): Rename as...
-	(Web2c Report): this.
-	(Web2c Actions): New.
-
-2001-12-22  Akim Demaille  <akim@epita.fr>
-
-	Reductions in web2c.y are improperly reported.
-	Reported by Mike Castle.
-
-	* src/conflicts.c (print_reductions): Fix.
-	* tests/regression.at (Web2c): New.
-
-2001-12-18  Akim Demaille  <akim@epita.fr>
-
-	Some host fail on `assert (!"foo")', which expands to
-	((!"foo") ? (void)0 : __assert("!"foo."", __FILE__, __LINE__))
-	Reported by Nelson Beebee.
-
-	* src/output.c, src/vcg.c: Replace `assert (!"it succeeded")' with
-	`#define it_succeeded 0' and `assert (it_succeeded)'.
-
-2001-12-17  Marc Autret  <autret_m@epita.fr>
-
-	* src/bison.simple: Don't hard code the skeleton line and filename.
-	* src/output.c (output_parser): Rename 'line' as 'output_line'.
-	New line counter 'skeleton_line' (skeleton-line muscle).
-
-2001-12-17  Paul Eggert  <eggert@twinsun.com>
-
-	* NEWS, doc/bison.texinfo, doc/bison.1, doc/bison.rnh: Document that
-	YYDEBUG must be defined to a nonzero value.
-
-	* src/bison.simple (yytname): Do not assume that the user defines
-	YYDEBUG to a properly parenthesized expression.
-
-2001-12-17  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h (state_t): Rename lookaheads as lookaheadsp.
-	nlookaheads is a new member.
-	Adjust all users.
-	* src/lalr.h (nlookaheads): Remove this orphan declaration.
-	* src/lalr.c (initialize_lookaheads): Set nlookaheads for each
-	state.
-
-2001-12-17  Akim Demaille  <akim@epita.fr>
-
-	* src/files.h, src/files.c (open_files, close_files): Remove.
-	* src/main.c (main): Don't open/close files, nor invoke lex_free,
-	let...
-	* src/reader.c (reader): Do it.
-
-2001-12-17  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (print_reductions): Formatting changes.
-
-2001-12-17  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (flush_shift): Also adjust lookaheadset.
-	(flush_reduce): New.
-	(resolve_sr_conflict): Adjust.
-
-2001-12-17  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output_obstack): Be static and rename as...
-	(format_obstack): this, to avoid any confusion with files.c's
-	output_obstack.
-	* src/reader.h (muscle_obstack): Move to...
-	* src/output.h: here, since it's defined in output.c.
-
-2001-12-17  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (action_row, save_column, default_goto)
-	(sort_actions, matching_state, pack_vector): Better variable
-	locality.
-
-2001-12-17  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c: Various formatting changes.
-
-2001-12-17  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c (output_files): Free the output_obstack.
-	* src/main.c (main): Call print and print_graph conditionally.
-	* src/print.c (print): Work unconditionally.
-	* src/print_graph.c (print_graph): Work unconditionally.
-	* src/conflicts.c (log_resolution): Output only if verbose_flag.
-
-2001-12-16  Marc Autret  <autret_m@epita.fr>
-
-	* src/output.c (actions_output): Fix. When we use %no-lines,
-	there is one less line per action.
-
-2001-12-16  Marc Autret  <autret_m@epita.fr>
-
-	* src/bison.simple: Remove a useless #line directive.
-	s/#line %%line %%skeleton/#line %%line "%%parser-file-name"/'.
-	* src/output.c (get_lines_number): New.
-	(output_parser): Adjust, now takes care about the lines of a
-	output muscles.
-	Fix line numbering.
-	(actions_output): Computes the number of lines taken by actions.
-	(output_master_parser): Insert new skeleton which is the name of
-	the output parser file name.
-
-2001-12-15  Marc Autret  <autret_m@epita.fr>
-
-	* src/bison.simple [YYERROR_VERBOSE]: Restore backward compatibility.
-
-2001-12-15  Marc Autret  <autret_m@epita.fr>
-
-	* src/output.c (output_gram): Keep track of the hairy one.
-
-2001-12-15  Akim Demaille  <akim@epita.fr>
-
-	Make `make distcheck' work.
-
-	* lib/Makefile.am (INCLUDES): Add top_srcdir/intl, since hash uses
-	system.h which uses libgettext.h.
-
-2001-12-15  Akim Demaille  <akim@epita.fr>
-
-	* src/nullable.c (set_nullable): Useless rules must be skipped,
-	otherwise, since we range over their symbols, we might look at a
-	nonterminal which no longer ``exists'', i.e., it is not counted in
-	`nvars', hence we overflow our arrays.
-
-2001-12-15  Akim Demaille  <akim@epita.fr>
-
-	The header can also be produced directly, without any obstack!
-	Yahoo!
-
-	* src/files.c, src/files.h (defines_obstack): Remove.
-	(compute_header_macro): Global.
-	(defines_obstack_save): Remove.
-	* src/reader.c (parse_union_decl): No longer output to
-	defines_obstack: its content can be found in the `stype' muscle
-	anyway.
-	(output_token_translations): Merge into...
-	(symbols_output): this.
-	Rename as...
-	(symbols_save): this.
-	(reader): Adjust.
-	* src/output.c (header_output): New.
-	(output): Call it.
-
-2001-12-15  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (parse_union_decl): Instead of handling two obstack
-	simultaneously, use one to define the `stype' muscle, and use the
-	value of the latter to fill defines_obstack.
-	(copy_comment): Remove.
-	(copy_comment2): Work for a single obstack.
-	Rename as...
-	(copy_comment): this.
-
-2001-12-15  Akim Demaille  <akim@epita.fr>
-
-	* src/lex.c, src/lex.h (xgetc): No longer static.
-	* src/reader.c (parse_union_decl): Revamp.
-
-2001-12-15  Akim Demaille  <akim@epita.fr>
-
-	Still making progress in separating Bison into (i) input, (ii)
-	process, (iii) output: now we can directly output the parser file
-	without using table_obstack at all.
-
-	* src/files.c, src/files.h (table_obstack): Bye bye.
-	(parser_file_name): New.
-	* src/files.c (compute_output_file_names): Compute it.
-	* src/output.c (actions_output, output_parser)
-	(output_master_parser): To a file instead of an obstack.
-
-2001-12-15  Akim Demaille  <akim@epita.fr>
-
-	Attach actions to rules, instead of pre-outputting them to
-	actions_obstack.
-
-	* src/gram.h (rule_t): action and action_line are new members.
-	* src/reader.c (symbol_list): Likewise.
-	(copy_action): Save the actions within the rule.
-	(packgram): Save them in rule_table.
-	* src/output.c (actions_output): New.
-	(output_parser): Use it on `%%actions'.
-	(output_rule_data): Don't free rule_table.
-	(output): Do it.
-	(prepare): Don't save the `action' muscle.
-	* src/bison.simple: s/%%action/%%actions/.
-
-2001-12-15  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (copy_action): When --yacc, don't append a `;'
-	to the user action: let it fail if lacking.
-	Suggested by Arnold Robbins and Tom Tromey.
-
-2001-12-14  Akim Demaille  <akim@epita.fr>
-
-	* src/lex.c (literalchar): Simply return the char you decoded, non
-	longer mess around with obstacks and int pointers.
-	Adjust all callers.
-
-2001-12-14  Akim Demaille  <akim@epita.fr>
-
-	* src/lex.c (literalchar): Don't escape the special characters,
-	just decode them, and keep them as char (before, eol was output as
-	the 2 char string `\n' etc.).
-	* src/output.c (output_rule_data): Use quotearg to output the
-	token strings.
-
-2001-12-13  Paul Eggert  <eggert@twinsun.com>
-
-	* src/bison.simple (YYSIZE_T, YYSTACK_ALLOC, YYSTACK_FREE):
-	Do not infringe on the global user namespace when using C++.
-	(YYFPRINTF, YYSTDERR): New macros, needed for the above.
-	All uses of `fprintf' and `stderr' changed.
-
-	* doc/bison.texinfo: Document YYFPRINTF, YYSTDERR.
-
-2001-12-13  Akim Demaille  <akim@epita.fr>
-
-	The computation of nullable is broken: it doesn't handle empty
-	RHS's properly.
-
-	* tests/torture.at (GNU AWK Grammar): New.
-	* tests/sets.at (Nullable): New.
-	* src/nullable.c (set_nullable): Instead of blindly looping over
-	`ritems', loop over the rules, and then over their rhs's.
-
-	Work around Autotest bugs.
-
-	* src/warshall.c (bitmatrix_print): Don't use `+--+' as table
-	frame, because Autotest understand lines starting with a `+' as
-	traces from the shell.  Then, they are not processed properly.
-	Admittedly an Autotest bug, but we don't have time to wait for
-	Autotest to catch up.
-	* tests/regression.at (Broken Closure): Adjust to the new table
-	frames.
-	Move to...
-	* tests/sets.at: here.
-
-2001-12-13  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (closure): Use nrules instead of playing tricks
-	with BITS_PER_WORD.
-
-2001-12-13  Akim Demaille  <akim@epita.fr>
-
-	* src/print.c (print_actions): Output the handling of `$' as the
-	traces do: shifting the token EOF.  Before EOF was treated as a
-	nonterminal.
-	* tests/regression.at: Adjust some tests.
-	* src/print_graph.c (print_core): Complete the set of items via
-	closure.  The next-to-final and final states are still unsatisfying,
-	but that's to be addressed elsewhere.
-	No longer output the rule numbers, but do output the state number.
-	A single loop for the shifts + gotos is enough, but picked a
-	distinct color for each.
-	(print_graph): Initialize and finalize closure.
-
-2001-12-13  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (readgram): Remove dead code, an strip useless
-	braces.
-	(get_type): Remove, unused.
-
-2001-12-12  Akim Demaille  <akim@epita.fr>
-
-	* src/complain.h, src/complain.c: Remove error_one_per_line, rely
-	on that of lib/error.c.
-
-2001-12-12  Akim Demaille  <akim@epita.fr>
-
-	Some hosts don't like `/' in includes.
-
-	* src/system.h: Include libgettext.h without qualifying the path.
-	* src/Makefile.am (INCLUDES): Add $(top_srcdir)/intl, remove
-	$(top_srcdir).
-
-2001-12-11  Marc Autret  <autret_m@epita.fr>
-
-	* src/output.c (output_parser): Remove useless muscle.
-
-2001-12-11  Marc Autret  <autret_m@epita.fr>
-
-	* src/bison.simple: Remove #line just before %%epilogue. It
-	is now handled in ...
-	* src/reader.c (read_additionnal_code): Add the output of a
-	#line for the epilogue.
-
-2001-12-10  Marc Autret  <autret_m@epita.fr>
-
-	* src/reader.c (copy_definition): Re-use CPP-outed code which
-	replace precedent remove.
-	* src/bison.simple: Remove #line before %%prologue because
-	%%input-line is wrong at this time.
-
-2001-12-10  Marc Autret  <autret_m@epita.fr>
-
-	* src/reader.c (symbols_output): Clean up.
-	* src/output.c (output_gram, output): Clean up.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (initialize_lookaheads): New.  Extracted from...
-	* src/LR0.c (set_state_table): here.
-	* src/lalr.c (lalr): Call it.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h (shifts): Remove the `number' member: shifts are
-	attached to state, hence no longer need to be labelled with a
-	state number.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	Now that states have a complete set of members, the linked list of
-	shifts is useless: just fill directly the state's shifts member.
-
-	* src/state.h (shifts): Remove the `next' member.
-	* src/LR0.c (first_state, last_state): Remove.
-	Adjust the callers.
-	(augment_automaton): Don't look for the shifts that must be added
-	a shift on EOF: it is those of the state we looked for!  But now,
-	since shifts are attached, it is no longer needed to looking
-	merely by its id: its number.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (augment_automaton): Better variable locality.
-	Remove an impossible branch: if there is a state corresponding to
-	the start symbol being shifted, then there is shift for the start
-	symbol from the initial state.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (augment_automaton): Call `insert_eof_shifting_state'
-	only when appropriate: when insert_start_shifting_state' is not
-	invoked.
-	* tests/regression.at (Rule Line Numbers): Adjust.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (augment_automaton): Now that all states have shifts,
-	merge the two cases addition shifts to the initial state.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (set_state_table): Move to...
-	* src/LR0.c: here.
-	* src/lalr.c (lalr): Don't call it...
-	* src/LR0.c (generate_states): do it.
-	* src/LR0.h (first_state): Remove, only the table is used.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.h (first_shift, first_reduction): Remove.
-	* src/lalr.c: Don't use first_shift: find shifts through the
-	states.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c: Attach shifts to states as soon as they are
-	computed.
-	* src/lalr.c (set_state_table): Instead of assigning shifts to
-	state, just assert that the mapping was properly done.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (insert_start_shift): Rename as...
-	(insert_start_shifting_state): this.
-	(insert_eof_shifting_state, insert_accepting_state): New.
-	(augment_automaton): Adjust.
-	Better locality of the variables.
-	When looking if the start_symbol is shifted from the initial
-	state, using `while (... symbol != start_symbol ...)' sounds
-	better than `while (... symbol < start_symbol ...)': If fail
-	to see how the order between symbols could be relevant!
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* src/getargs.h: Don't declare `spec_name_prefix' and
-	`spec_file_prefix', declared by src/files.h.
-	* src/files.c, src/files.h: Default for spec_name_prefix is "yy".
-	* src/muscle_tab.c (muscle_init): Default prefix to NULL.
-	* src/output.c (prepare): Adjust.
-	* src/reader.c (symbols_output): Likewise.
-	* src/vmsgetargs.c: Vaguely adjust, but who cares?
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* src/muscle_tab.c (muscle_init): NULL is a better default than
-	`"0"'.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (reader): Calling symbols_output once is enough.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	Now that states have a complete set of members, the linked list of
-	reductions is useless: just fill directly the state's reductions
-	member.
-
-	* src/state.h (struct reductions): Remove member `number' and
-	`next'.
-	* src/LR0.c (first_reduction, last_reduction): Remove.
-	(save_reductions): Don't link the new reductions, store them in
-	this_state.
-	* src/lalr.c (set_state_table): No need to attach reductions to
-	states, it's already done.
-	* src/output.c (output_actions): No longer free the shifts, then
-	the reductions, then the states: free all the states and their
-	members.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* src/options.c (OPTN, DRTV, BOTH): New.
-	(option_table): Use them.
-
-	* src/muscle_tab.c: Don't include xalloc.h and string.h: that's
-	the job of system.h.
-	* src/options.c: Don't include stdio.h and xalloc.h for the same
-	reasons.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output, prepare): Make sure the values of the
-	muscles `action' and `prologue' are 0-terminated.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	Clean up GCC warnings.
-
-	* src/reader.c (copy_action): `buf' is not used.
-	(parse_skel_decl): Be static.
-	* src/muscle_tab.c (mhash1, mhash2, muscle_insert): Preserve `const'.
-	* src/options.h (create_long_option_table): Have a real prototype.
-	* lib/hash.c, lib/hash.h (hash_insert, hash_insert_at, hash_delete)
-	(hash_delete_at): Return const void *.
-	Adjust casts to preserve the const.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	* configure.in: Require 2.52g.
-	M4 is not needed, but AUTOM4TE is.
-	* m4/m4.m4: Remove.
-	* tests/Makefile.am: Adjust.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	One structure for states is enough, even though theoretically
-	there are LR(0) states and LALR(1) states.
-
-	* src/lalr.h (state_t): Remove.
-	(state_table): Be state_t **, not state_t *.
-	* src/state.h (core, CORE_ALLOC): Rename as...
-	(state_t, STATE_ALLOC): this.
-	Add the LALR(1) members: shifts, reductions, errs.
-	* src/LR0.c (state_table): Rename as...
-	(state_hash): this, to avoid name clashes with the global
-	`state_table'.
-	* src/print_graph.c, src/LR0.c, src/LR0.h, src/conflicts.c
-	* src/lalr.c, src/lalr.h, src/output.c, src/print.c: Adjust.
-
-2001-12-10  Akim Demaille  <akim@epita.fr>
-
-	Bison dumps core on bash.y.
-	Reported by Pascal Bart.
-
-	* src/warshall.c (bitmatrix_print): New.
-	(TC): Use it.
-	When performing a transitive closure R(i, j) && R(j, k) => R(i, k),
-	j must be the outer loop.
-	* tests/regression.at (Broken Closure): New.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* tests/atlocal.in (CPPFLAGS): Do not leave a space between -I and
-	its argument.
-	Reported by Peter Hamorsky.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (err_table): Remove.
-	(resolve_sr_conflict): Adjust.
-	* src/lalr.h (state_t.reduction_table, state_t.shift_table):
-	Rename as...
-	(state_t.reductions, state_t.shifts): this.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/reduce.c (reduce_grammar_tables): No longer disable the
-	removal of useless rules via CPP but via `if (0)', so that the
-	compiler still check the code is valid.
-	For instance, it should have noticed `rline' no longer exists: use
-	the `line' member of rule_t.
-	* src/gram.c (dummy, rline): Remove, unused.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (pack_vector): Use assert, not berror.
-	* src/main.c (berror): Remove, unused.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	New experimental feature: if --verbose --trace output all the
-	items of a state, not only its kernel.
-
-	* src/print.c (print_core): If `trace_flag', then invoke closure
-	before outputting the items of the state (print_core is no longer
-	a correct name them).
-	(print_results): Invoke new_closure/free_closure if needed.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (new_itemsets): Use nshifts only, not shiftcount.
-	* src/closure.c, src/closure.h (itemsetsize): Rename as...
-	(nitemset): for consistency with the rest of the project.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (print_closure): Improve.
-	(closure): Use it for printing input and output.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (FIRSTS, FDERIVES): Adjust to reality: they are
-	indexed by nonterminals.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/warshall.c (TC, RTC): De-obsfucate (source reduced to 22% of
-	what it was!).
-	* src/warshall.h: Remove accidental duplication of the content.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (set_fderives): De-obfuscate.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (print_firsts, print_fderives): De-obfuscate.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (set_firsts): De-obfuscate.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (action_row): De-obfuscate
-	using the good o' techniques: arrays not pointers, variable
-	locality, BITISSET, RESETBIT etc.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	Pessimize the code to simplify it: from now on, all the states
-	have a valid SHIFTS, which NSHIFTS is possibly 0.
-
-	* src/LR0.c (shifts_new): Be global and move to..
-	* src/state.c, src/state.h: here.
-	* src/conflicts, src/lalr.c, src/output.c, src/print.c,
-	* src/print_graph: Adjust.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h (SHIFT_DISABLE, SHIFT_IS_DISABLED): New.
-	* src/conflicts.c: Use it.
-	Restore a few missing `if (!SHIFT_IS_DISABLED)' which were
-	incorrectly ``simplified''.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (flush_shift, resolve_sr_conflict): De-obfuscate
-	using the good o' techniques: arrays not pointers, variable
-	locality, BITISSET, RESETBIT etc.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h (SHIFT_SYMBOL): New.
-	* src/conflicts.c: Use it to deobfuscate.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (count_sr_conflicts, count_rr_conflicts)
-	(print_reductions): De-obfuscate using the good o' techniques:
-	arrays not pointers, variable locality, BITISSET.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (print_reductions): Arrays, not pointers.
-	Use BITISSET.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (print_reductions): Pessimize, but clarify.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (print_reductions): Improve variable locality.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (print_reductions): Pessimize, but clarify.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (print_reductions): Improve variable locality.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h (SHIFT_IS_ERROR, SHIFT_IS_GOTO, SHIFT_IS_SHIFT): New.
-	* src/lalr.c: Use them.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (augment_automaton): Formatting changes.
-	Better variable locality.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (matrix_print): New.
-	(transpose): Use it.
-	Use arrays instead of pointers.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (maxrhs): Move to...
-	* src/gram.c, src/gram.h (ritem_longest_rhs): here.
-	* src/lalr.c (build_relations): Adjust.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (transpose): Free the memory allocated to the
-	argument, as it is replaced by the results by the unique caller.
-	(build_relations): Merely invoke transpose: it handles the memory
-	deallocation.
-	Improve variable locality.
-	Avoid variables used as mere abbreviations.
-	(compute_lookaheads): Use arrays instead of pointers.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (initialize_F): Improve variable locality.
-	Avoid variables used as mere abbreviations.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/derives.c (print_derives): Display the ruleno.
-	* src/lalr.c (initialize_F, transpose): Better variable locality
-	to improve readability.
-	Avoid variables used as mere abbreviations.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (traverse): Use arrays instead of pointers.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/nullable.c (set_nullable): Use a for loop to de-obfuscate
-	the handling of squeue.
-	`symbol >= 0' is wrong now, use `rule_table[ruleno].useful'.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	Because useless nonterminals are now kept alive (instead of being
-	`destroyed'), we now sometimes examine them, and store information
-	related to them.  Hence we need to know their number, and adjust
-	memory allocations.
-
-	* src/reduce.c, src/reduce.h (nuseless_nonterminals): No longer
-	static.
-	* src/LR0.c (allocate_itemsets): The memory allocated to
-	`symbol_count' was used for two different purpose: once to count
-	the number of occurrences of each symbol, and later reassigned to
-	`shift_symbol', containing the symbol that can be shifted from a
-	given state.
-	Deobfuscate, i.e., allocate, use and free `symbol_count' here
-	only, and...
-	(new_itemsets): Allocate `shift_symbol' here.
-	(allocate_itemsets): symbol_count includes useless nonterminals.
-	Make room for them.
-	(free_storage): Use `free', not `XFREE', for pointers that cannot
-	be null.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/nullable.c (set_nullable): Deobfuscate the handling of
-	ritem.
-	`symbol >= 0' is wrong now, use `rule_table[ruleno].useful'.
-
-2001-12-05  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.c, src/gram.h (ritem_print): New.
-	* src/gram.c (dummy): Remove, now there is actual code in gram.c.
-	(This useless function was defined only to work around VMS linkers
-	that can't handle compilation units with variables only).
-	* src/reduce.c (dump_grammar): Use it to trace the construction of
-	ritem.
-
-2001-12-04  Paul Eggert  <eggert@twinsun.com>
-
-	* src/bison.simple (union yyalloc): Change member names
-	to be the same as the stack names.
-	(yyparse): yyptr is now union yyalloc *, not char *.
-	(YYSTACK_RELOCATE): Likewise.  This avoids a GCC warning,
-	and may generate better code on some machines.
-	(yystpcpy): Use prototype if __STDC__ is defined, not just
-	if __cplusplus is defined.
-
-2001-11-30  Akim Demaille  <akim@epita.fr>
-
-	* configure.in (WARNING_CFLAGS): Add -Werror when possible.
-	(CFLAGS): Do not include the WARNING_CFLAGS here, since GNU
-	Gettext doesn't compile cleanly, and dies with -Werror.
-	* src/Makefile.am, lib/Makefile.am, tests/atlocal.in (CFLAGS):
-	Include WARNING_CFLAGS here.
-	* lib/xstrdup.c: Include xalloc.h, so that xstrdup be declared
-	before being defined.
-
-2001-11-27  Paul Eggert  <eggert@twinsun.com>
-
-	* lib/quotearg.h (quotearg_n, quotearg_n_style):
-	First arg is int, not unsigned.
-	* lib/quotearg.c (quotearg_n, quotearg_n_style): Likewise.
-	(SIZE_MAX, UINT_MAX): New macros.
-	(quotearg_n_options): Abort if N is negative.
-	Avoid overflow check on hosts where size_t is 64 bits and int
-	is 32 bits, as overflow is impossible there.
-	Fix off-by-one typo that caused unnecessary reallocation.
-
-2001-11-29  Paul Eggert  <eggert@twinsun.com>
-
-	Name space cleanup in generated parser.
-
-	* doc/bison.texinfo (Bison Parser): Discuss system headers
-	and their effect on the user name space.
-
-	* src/bison.simple:
-	(YYSTACK_ALLOC, YYSTACK_FREE, union yyalloc, YYSTACK_GAP_MAX,
-	YYSTACK_BYTES, YYSTACK_RELOCATE): Do not define unless necessary,
-	i.e. unless ! defined (yyoverflow) || defined (YYERROR_VERBOSE).
-
-	(YYSIZE_T): New macro.  Use it instead of size_t, to avoid infringing
-	on user names when possible.
-
-	(YYSTACK_USE_ALLOCA): Do not define; just use any existing defn.
-	Simplify test for whather <alloca.h> exists.
-
-	(<stdlib.h>): Include if we will use malloc, and if standard C or C++.
-
-	(<stdio.h>): Include if YYDEBUG.
-
-	(yymemcpy): Renamed from __yy_memcpy.  Do not define unless
-	! defined (yyoverflow) && ! defined (yymemcpy).
-
-	(yymemcpy, yyparse): Rename local variables as needed so that
-	they all begin with 'yy'.
-
-	(yystrlen, yystpcpy): New functions.
-
-	(YY_DECL_NON_LSP_VARIABLES): Renamed from _YY_DECL_VARIABLES.
-	All uses changed.
-
-	(yyparse): size_t -> YYSIZE_T.  Use yystrlen and yystpcpy
-	instead of relying on string.h functions.  Use YYSTACK_ALLOC
-	and YYSTACK_FREE instead of malloc and free.
-
-2001-11-30  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.simple (YYSTYPE, YYLTYPE): Move their definitions
-	before their first uses.
-	(YYBISON, YYPURE): Move to the top of the output.
-
-2001-11-30  Akim Demaille  <akim@epita.fr>
-
-	* tests/reduce.at (Useless Nonterminals): Fix.
-
-2001-11-30  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.simple (YYSTACK_FREE): Use `do {;} while (0)' as empty
-	if body instead of `;' to pacify GCC's warnings.
-
-2001-11-30  Akim Demaille  <akim@epita.fr>
-
-	Instead of mapping the LHS of unused rules to -1, keep the LHS
-	valid, but flag the rules as invalid.
-
-	* src/gram.h (rule_t): `useful' is a new member.
-	* src/print.c (print_grammar): Adjust.
-	* src/derives.c (set_derives): Likewise.
-	* src/reader.c (packgram, reduce_output): Likewise.
-	* src/reduce.c (reduce_grammar_tables): Likewise.
-	* tests/reduce.at (Underivable Rules, Useless Rules): New.
-
-2001-11-30  Akim Demaille  <akim@epita.fr>
-
-	* src/reduce.c (reduce_output): Formatting changes.
-	* src/print.c (print_results, print_grammar): Likewise.
-	* tests/regression.at (Rule Line Numbers)
-	(Solved SR Conflicts, Unresolved SR Conflicts): Adjust.
-
-2001-11-30  Akim Demaille  <akim@epita.fr>
-
-	* src/reduce.c (nonterminals_reduce): Instead of throwing away
-	useless nonterminals, move them at the end of the symbol arrays.
-	(reduce_output): Adjust.
-	* tests/reduce.at (Useless Nonterminals): Adjust.
-
-2001-11-30  Akim Demaille  <akim@epita.fr>
-
-	* src/reduce.c: Various comment/formatting changes.
-	(nonterminals_reduce): New, extracted from...
-	(reduce_grammar_tables): here.
-	(reduce_grammar): Call nonterminals_reduce.
-
-2001-11-29  Paul Eggert  <eggert@twinsun.com>
-
-	* src/bison.simple (YYSTACK_REALLOC): Remove.
-	(YYSTACK_ALLOC): Resurrect this macro, with its old meaning.
-	(YYSTACK_FREE, YYSTACK_GAP_MAX, YYSTACK_BYTES, YYSTACK_RELOCATE):
-	New macros.
-	(union yyalloc): New type.
-	(__yy_memcpy): Last arg is size_t, not unsigned int, to remove
-	an arbitrary restriction on hosts where size_t is wider than int.
-
-	(yyparse): Don't dump core if alloca or malloc fails; instead, report
-	a parser stack overflow.  Allocate just one block of memory for all
-	three stacks, instead of allocating three blocks; this typically is
-	faster and reduces fragmentation.
-
-	Do not limit the number of items in the stack to a value that fits
-	in 'int', as this is an arbitrary limit on hosts with 64-bit
-	size_t and 32-bit int.
-
-2001-11-29  Marc Autret  <autret_m@epita.fr>
-
-	* tests/calc.at [AT_DATA_CALC_Y]: Use %error-verbose instead
-	of defining YYERROR_VERBOSE.
-	[AT_DATA]: $4 is now out of C declarations in the prologue.
-
-2001-11-28  Marc Autret  <autret_m@epita.fr>
-
-	* src/reader.c (parse_dquoted_param): New.
-	(parse_skel_decl): Use it.
-	* src/lex.h: Add its prototype.
-	* src/lex.c (literalchar): Become not static.
-
-2001-11-28  Marc Autret  <autret_m@epita.fr>
-
-	* src/output.h: And put its extern declaration here.
-	* src/output.c (error_verbose): Define here.
-	(prepare): Echo name modification.
-	* src/getargs.h: Clean its extern declaration.
-	* src/getargs.c (error_verbose_flag): Remove.
-	(getargs): Remove case 'e'.
-	* src/options.c (option_table): 'error-verbose' is now seen as simple
-	percent option.
-	Include output.h.
-
-	* src/reader.c (read_declarations): Remove case tok_include.
-	(parse_include_decl): Remove.
-	* src/lex.h (token_t): Remove tok_include.
-	* src/options.c (option_table): 'include' is now a simple command line
-	option.
-
-2001-11-28  Marc Autret  <autret_m@epita.fr>
-
-	* src/bison.simple: Adjust muscle names.
-	* src/muscle_tab.c (muscle_init): Also rename the muscles.
-	* src/output.c (prepare): s/_/-/ for the muscles names.
-	(output_parser): When scanning for a muscle, allow '-' instead of '_'.
-
-2001-11-28  Marc Autret  <autret_m@epita.fr>
-
-	* src/bison.simple: Fix debug.
-	[YYERROR_VERBOSE]: Re-integrate as an internal macro.
-
-2001-11-28  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (shifts_new): New.
-	(save_shifts, insert_start_shift, augment_automaton): Use it.
-
-2001-11-28  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (closure): `b' and `ruleno' denote the same value:
-	keep ruleno only.
-
-2001-11-28  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (closure): Instead of looping over word in array
-	then bits in words, loop over bits in array.
-
-2001-11-28  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (closure): No longer optimize the special case
-	where all the bits of `ruleset[r]' are set to 0, to make the code
-	clearer.
-
-2001-11-28  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (closure): `r' and `c' are new variables, used to
-	de-obfuscate accesses to RULESET and CORE.
-
-2001-11-28  Akim Demaille  <akim@epita.fr>
-
-	* src/reduce.c (reduce_print): Use ngettext.
-	(dump_grammar): Improve the trace accuracy.
-
-2001-11-28  Akim Demaille  <akim@epita.fr>
-
-	* src/reduce.c (dump_grammar): Don't translate trace messages.
-
-2001-11-28  Akim Demaille  <akim@epita.fr>
-
-	* tests/reduce.at (Useless Terminals, Useless Nonterminals): New.
-	* src/reduce.c (reduce_grammar_tables): Do not free useless tags,
-	as all tags are free'ed afterwards.
-	From Enrico Scholz.
-
-2001-11-27  Paul Eggert  <eggert@twinsun.com>
-
-	* src/bison.simple (YYSTACK_REALLOC): Fix typo that caused us to
-	use alloca when we didn't want to, and vice versa.
-
-2001-11-27  Marc Autret  <autret_m@epita.fr>
-
-	* src/muscle_tab.c (muscle_init): Remove 'verbose' muscle
-	initialization.
-	* src/output.c (prepare): Remove its update.
-
-2001-11-27  Marc Autret  <autret_m@epita.fr>
-
-	* tests/torture.at [AT_DATA]: Remove YYERROR_VERBOSE definition.
-	Use %error-verbose.
-
-2001-11-27  Marc Autret  <autret_m@epita.fr>
-
-	* src/bison.simple: Remove YYERROR_VERBOSE using.
-	Use %%error_verbose.
-	(yyparse): Likewise.
-	* src/output.c (prepare): Give its final value.
-	* src/muscle_tab.c (muscle_init): Init new muscle 'error_verbose'.
-	* src/getargs.h: Add its extern declaration.
-	* src/getargs.c (error_verbose_flag): New int.
-	(getargs): Update to catch new case.
-	* src/options.c (option_table): 'error-verbose' is a new option.
-	(shortopts): Update.
-
-2001-11-27  Akim Demaille  <akim@epita.fr>
-
-	* src/system.h: Use intl/libgettext.h.
-	* src/Makefile.am (INCLUDES): Add -I $(top_srcdir).
-
-2001-11-27  Akim Demaille  <akim@epita.fr>
-
-	* tests/torture.at (Exploding the Stack Size with Malloc):
-	s/YYSTACK_USE_ALLOCA_ALLOCA/YYSTACK_USE_ALLOCA/.
-
-2001-11-27  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c: Include error.h.
-	Reported by Hans Aberg.
-
-2001-11-26  Marc Autret  <autret_m@epita.fr>
-
-	* src/reader.c (parse_include_decl): New, not yet implemented.
-	(read_declarations): Add case tok_include.
-	* src/getargs.h (include): Add its extern definition.
-	* src/getargs.c (include): New const char *.
-	(getargs): Add case '-I'.
-	* src/options.c (option_table): Add include as command line and
-	percent option.
-	* src/lex.h (token_t): Add tok_include.
-
-2001-11-26  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (readgram): Make sure rules for mid-rule actions
-	have a lineno equal to that of their host rule.
-	Reported by Hans Aberg.
-	* tests/regression.at (Rule Line Numbers): New.
-
-2001-11-26  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (allocate_itemsets): kernel_size contains ints, not
-	size_ts.
-
-2001-11-26  Akim Demaille  <akim@epita.fr>
-
-	* src/complain.c, src/complain.h (error): Remove, provided by
-	lib/error.[ch].
-
-2001-11-26  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (read_declarations): Don't abort on tok_illegal,
-	issue an error message.
-	* tests/regression.at (Invalid %directive): New.
-	Reported by Hans Aberg.
-
-2001-11-26  Akim Demaille  <akim@epita.fr>
-
-	* configure.in: Invoke AC_FUNC_OBSTACK and AC_FUNC_ERROR_AT_LINE.
-	* lib/Makefile.am (libbison_a_SOURCES): Adjust.
-
-2001-11-26  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (conflicts_print): Don't complain at all when
-	there are no reduce/reduce conflicts, and as many shift/reduce
-	conflicts as expected.
-	* tests/regression.at (%expect right): Adjust.
-
-2001-11-23  Akim Demaille  <akim@epita.fr>
-
-	* lib/alloca.c: Update, from fileutils.
-
-2001-11-23  Akim Demaille  <akim@epita.fr>
-
-	* lib/Makefile.am (libbison_a_LIBADD): Add @ALLOCA@.
-
-2001-11-23  Akim Demaille  <akim@epita.fr>
-
-	* src/system.h: Include alloca.h.
-	* src/main.c (main) [C_ALLOCA]: Call alloca (0).
-
-2001-11-23  Akim Demaille  <akim@epita.fr>
-
-	* src/print_graph.c (print_actions): Remove `rule', unused.
-	* src/LR0.c (kernel_size): Contain `int' instead of `size_t' to
-	pacify GCC's signed < unsigned warnings.
-	* src/closure.c (itemsetsize): Likewise.
-	* src/reader.c (symbol_list_new): Static.
-
-2001-11-23  Akim Demaille  <akim@epita.fr>
-
-	Attaching lineno to buckets is stupid, since only one copy of each
-	symbol is kept, only the line of the first occurrence is kept too.
-
-	* src/symtab.h, src/symtab.c (bucket): Remove the line member.
-	* src/reader.c (rline_allocated): Remove, unused.
-	(symbol_list): Have a `line' member.
-	(symbol_list_new): New.
-	(readgram): Use it.
-	* src/print.c (print_grammar): Output the rule line numbers.
-	* tests/regression.at (Solved SR Conflicts)
-	(Unresolved SR Conflicts): Adjust.
-	Reported by Hans Aberg.
-
-2001-11-22  Marc Autret  <autret_m@epita.fr>
-
-	* src/bison.simple [YYERROR_VERBOSE]: Force its value to be 1 or 0.
-
-2001-11-22  Marc Autret  <autret_m@epita.fr>
-
-	* src/muscle_tab.c (muscle_init): Remove initialization of
-	skeleton muscle.
-	* src/output.c (output_master_parser): Do it here.
-
-2001-11-20  Akim Demaille  <akim@epita.fr>
-
-	* po/sv.po: New.
-	* configure.in (ALL_LINGUAS): Adjust.
-	* po/POTFILE.in: Remove `nullable.c' and `derives.c' which no
-	longer contains strings to translate.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (conflicts_print): Add a missing \n.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/nullable.c (nullable_print): New.
-	(set_nullable): Call it when tracing.
-	Better locality of variables.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/print.c (print_actions): Better locality of variables.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/derives.c (print_derives): Fix and enrich.
-	* src/closure.c (print_fderives): Likewise.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (itemsetend): Remove, replaced with...
-	(itemsetsize): new.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (kernel_end): Remove, replaced with...
-	(kernel_size): new.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (set_conflicts): Use arrays instead of pointers
-	to clarify.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c (closure): Use arrays instead of pointers to clarify.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c, src/derives.c, src/nullable.c: Adjust various
-	trace messages.
-	* src/LR0.c: Likewise.
-	(allocate_itemsets): Use arrays instead of pointers to clarify.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/getargs.c (statistics_flag): Replace with...
-	(trace_flag): New.
-	(longopts): Accept --trace instead of --statistics.
-	* src/getargs.h, src/options.c: Adjust.
-	* src/LR0.c, src/closure.c, src/derives.c, src/nullable.c,
-	* src/reduce.c: Use trace_flags instead of the CPP conditional TRACE.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (new_itemsets, get_state): Use more arrays and fewer
-	pointers to clarify the code.
-	(save_reductions, save_shifts): Factor common parts of alternatives.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (new_state, get_state): Complete TRACE code.
-	* src/closure.c: Include `reader.h' to get `tags', needed by the
-	trace code.
-	Rename the conditional DEBUG as TRACE.
-	Output consistently TRACEs to stderr, not stdout.
-	* src/derives.c: Likewise.
-	* src/reduce.c: (inaccessable_symbols): Using if is better style
-	than goto.
-	Use `#if TRACE' instead of `#if 0' for tracing code.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/system.h (LIST_FREE, shortcpy): New.
-	* src/LR0.c: Use them.
-	* src/output.c (free_itemsets, free_reductions, free_shifts):
-	Remove, replaced by LIST_FREE.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h (CORE_ALLOC, SHIFTS_ALLOC, ERRS_ALLOC)
-	(REDUCTIONS_ALLOC):  New.
-	* src/LR0.c, src/conflicts.c: Use them to de-obfuscate memory
-	allocation.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.c (new_state): Complete trace code.
-	* src/nullable.c (set_nullable): Don't translate traces.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/print_graph.c (print_core): Better locality of variables.
-	* src/print.c (print_core): Likewise.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/vcg.c: You do the output, so you are responsible of the
-	handling of VCG syntax, in particular: use quotearg.
-	* src/print_graph.c: Don't.
-	(print_actions): Don't output the actions as part of the nodes,
-	since that's the job of the edges.
-	(print_state): Don't output by hand: fill the node description,
-	and ask for its output.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.simple (yyparse): When verbosely reporting an error,
-	no longer put additional quotes around token names.
-	* tests/calc.at: Adjust.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.h, src/symtab.c: `line' is a new member of `bucket'.
-	* src/reader.c (record_rule_lines, rline, rline_allocated): Remove.
-	* src/output.c: Adjust.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h (rprec, rprecsym, rassoc): Remove, now part of...
-	(rule_t): this.
-	* src/conflicts.c, src/reader.c, src/reduce.c: Adjust.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h (rule_t): New.
-	(rule_table): New.
-	(rrhs, rlhs): Remove, part of state_t.
-	* src/print_graph.c, src/closure.c, src/conflicts.c, src/derives.c,
-	* src/lalr.c, src/nullable.c, src/output.c, src/print.c,
-	* src/reader.c, src/reduce.c: Adjust.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (symbols_output): New, extracted from...
-	(packsymbols): Here.
-	(reader): Call it.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (set_maxrhs, maxrhs): Remove, replaced with...
-	(maxrhs): this new function.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (F): New macro to access the variable F.
-	Adjust.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.h (LA): New macro to access the variable LA.
-	* src/output.c, src/lalr.c, src/print_graph.c, src/conflicts.c:
-	* src/lalr.c: Adjust.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.c (initialize_LA): Only initialize LA.  Let...
-	(set_state_table): handle the `lookaheads' members.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.h (lookaheads): Removed array, whose contents is now
-	a member of...
-	(state_t): this structure.
-	* src/output.c, src/lalr.c, src/print_graph.c, src/conflicts.c:
-	Adjust.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.h (consistent): Removed array, whose contents is now
-	a member of...
-	(state_t): this structure.
-	* src/output.c, src/lalr.c, src/print_graph.c, src/conflicts.c:
-	Adjust.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.h (reduction_table, shift_table): Removed arrays, whose
-	contents are now members of...
-	(state_t): this structure.
-	* src/output.c, src/lalr.c, src/print_graph.c, src/conflicts.c:
-	Adjust.
-
-2001-11-19  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.h (state_t): New.
-	(state_table): Be a state_t * instead of a core **.
-	(accessing_symbol): Remove, part of state_t.
-	* src/lalr.c: Adjust.
-	(set_accessing_symbol): Merge into...
-	(set_state_table): this.
-	* src/print_graph.c, src/conflicts.c: Adjust.
-
-2001-11-14  Akim Demaille  <akim@epita.fr>
-
-	* tests/calc.at, tests/output.at, tests/regression.at,
-	* tests/testsuite.at, tests/torture.at: Rely on Autotest 2.52g:
-	now the tests are run in private dirs, therefore AC_CLEANUP and
-	family can be simplified to 0-ary.
-	* tests/atlocal.in: Now that we run `elsewhere' than in tests/,
-	use abs. path to find config.h.
-	* tests/calc.at (AT_CHECK_CALC): Don't try to check the compiler's
-	stderr, there can be way too much random noise.
-	Instead pass -Werror to GCC and rely on the exit status.
-	Reported by Wolfram Wagner.
-
-2001-11-14  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.simple (yyparse): Let yyls1, yyss1 and yyvs1 be
-	defined only if yyoverflow is defined, to avoid `warning: unused
-	variable `yyvs1''.
-	Reported by The Test Suite.
-
-2001-11-14  Akim Demaille  <akim@epita.fr>
-
-	* src/print.c: Include reduce.h.
-	Reported by Hans Aberg.
-
-2001-11-14  Akim Demaille  <akim@epita.fr>
-
-	* src/lex.c, src/lex.h (token_buffer, unlexed_token_buffer):
-	Revert a previous patch:  these are really const.
-	* src/conflicts.c (conflict_report): Additional useless pair of
-	braces to pacify GCC's warnings for `if () if () {} else {}'.
-	* src/lex.c (parse_percent_token): Replace equal_offset with
-	arg_offset.
-	arg is const.
-	Be sure to strdup `arg' when used, since there is no reason for
-	token_buffer not to change.
-
-2001-11-14  Akim Demaille  <akim@epita.fr>
-
-	* src/system.h (EXIT_SUCCESS, EXIT_FAILURE): Ensure a proper
-	definition.
-	* src/main.c (main): Use them.
-	Suggested by Hans Aberg.
-
-2001-11-12  Akim Demaille  <akim@epita.fr>
-
-	* src/system.h (ngettext): Now that we use ngettext, be sure to
-	provide a default definition when NLS are not used.
-
-2001-11-12  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo: Use `$' as shell prompt, not `%'.
-	Use @kbd to denote user input.
-	(Language and Grammar): ANSIfy the example.
-	Adjust its layout for info/notinfo.
-	(Location Tracking Calc): Output error messages to stderr.
-	Output locations in a more GNUtically correct way.
-	Fix a couple of Englishos.
-	Adjust @group/@end group pairs.
-
-2001-11-12  Akim Demaille  <akim@epita.fr>
-
-	%expect was not functioning at all.
-
-	* src/conflicts.c (expected_conflicts): Set to -1.
-	(conflict_report): Use ngettext.
-	(conflicts_print): Check %expect and make its violation an error.
-	* doc/bison.texinfo (Expect Decl): Adjust.
-	* configure.in (AM_GNU_GETTEXT): Ask for ngettext.
-	* tests/regression.at (%expect not enough, %expect right)
-	(%expect too much): New.
-
-2001-11-12  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (Conflicts): Rename as...
-	(Unresolved SR Conflicts): this.
-	(Solved SR Conflicts): New.
-
-2001-11-12  Akim Demaille  <akim@epita.fr>
-
-	* src/reduce.c (print_results): Rename as...
-	(reduce_output): This.
-	Output to OUT, passed as argument, instead of output_obstack.
-	(dump_grammar): Likewise.
-	(reduce_free): New.
-	Also free V1.
-	(reduce_grammar): No longer call reduce_output, since...
-	* src/print.c (print_results): do it.
-	* src/main.c (main): Call reduce_free;
-
-2001-11-12  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (print_reductions): Accept OUT as argument.
-	Output to it, not to output_obstack.
-	* src/print.c (print_actions): Adjust.
-
-2001-11-12  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (count_sr_conflicts, count_rr_conflicts): Return
-	the result instead of using...
-	(src_total, rrc_total, src_count, rrc_count): Remove.
-	(any_conflicts): Remove.
-	(print_conflicts): Split into...
-	(conflicts_print, conflicts_output): New.
-	* src/conflicts.h: Adjust.
-	* src/main.c (main): Invoke both conflicts_output and conflicts_print.
-	* src/print.c (print_grammar): Issue `\n' between two rules.
-	* tests/regression.at (Conflicts): New.
-	Reported by Tom Lane.
-
-2001-11-12  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (Invalid input): Remove, duplicate with
-	``Invalid input: 1''.
-
-2001-11-12  Akim Demaille  <akim@epita.fr>
-
-	* tests/torture.at (AT_DATA_STACK_TORTURE)
-	(Exploding the Stack Size with Alloca)
-	(Exploding the Stack Size with Malloc): New.
-
-2001-11-12  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.simple (YYSTACK_REALLOC): New.
-	(yyparse) [!yyoverflow]: Use it and free the old stack.
-	Reported by Per Allansson.
-
-2001-11-12  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/bison.simple: Define type yystype instead of YYSTYPE, and
-	define CPP macro, which substitute YYSTYPE by yystype.
-	* src/reader.c (parse_union_decl): Output yystype/YYSTYPE as we do
-	with yyltype/YYLTYPE.  This allows inclusion of the generated
-	header within the parser if the compiler, such as GGC, accepts
-	multiple equivalent #defines.
-	From Akim.
-
-2001-11-05  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (symbols_output): New, extracted from...
-	(packsymbols): here.
-	(reader): Adjust.
-
-2001-11-05  Akim Demaille  <akim@epita.fr>
-
-	* src/lex.c (parse_percent_token): s/quotearg/quote/.
-
-2001-11-05  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (AT_TEST_CPP_GUARD_H): Adjust the clean up
-	pattern.
-
-2001-11-05  Akim Demaille  <akim@epita.fr>
-
-	* src/options.h (struct option_table_struct): set_flags is void*.
-	* src/options.c (longopts): Support `--output' and `%output'.
-	(usage): Adjust.
-	* src/lex.h (tok_setopt): Remove, replaced with...
-	(tok_intopt, tok_stropt): these new guys.
-	* src/lex.c (getopt.h): Not needed.
-	(token_buffer, unlexed_token_buffer): Not const.
-	(percent_table): Promote `-' over `_' in directive names.
-	Active `%name-prefix', `file-prefix', and `output'.
-	(parse_percent_token): Accept possible arguments to directives.
-	Promote `-' over `_' in directive names.
-
-2001-11-04  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (Decl Summary): Split the list into
-	`directives for grammars' and `directives for bison'.
-	Sort'em.
-	Add description of `%name-prefix', `file-prefix', and `output'.
-	Promote `-' over `_' in directive names.
-	(Bison Options): s/%locactions/%locations/.  Nice Freudian slip.
-	Simplify the description of `--name-prefix'.
-	Promote `-' over `_' in directive names.
-	Promote `--output' over `--output-file'.
-	Fix the description of `--defines'.
-	* tests/output.at: Exercise %file-prefix and %output.
-
-2001-11-02  Akim Demaille  <akim@epita.fr>
-
-	* doc/refcard.tex: Update.
-
-2001-11-02  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.h (SUNDEF): New.
-	* src/symtab.c (bucket_new): Init user_token_number to SUNDEF to
-	stand for `uninitialized', instead of 0.
-	* src/reader.c (packsymbols, parse_thong_decl): Adjust.
-	* src/lex.c (lex): Adjust.
-
-	* tests/calc.at (_AT_DATA_CALC_Y): Declare a token for EOF.
-	Number it 0.
-	Let yylex return it instead of a plain 0.
-	Reported by Dick Streefland.
-
-2001-11-02  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (Mixing %token styles): New test.
-
-2001-11-02  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (parse_thong_decl): Formatting changes.
-	(token_translations_init): New, extracted from...
-	(packsymbols): Here.
-	Adjust.
-
-2001-11-01  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (AT_TEST_CPP_GUARD_H): New.
-	Check that `9foo.y' produces correct cpp guards.
-	* src/files.c (compute_header_macro): Prepend `BISON_' to CPP
-	guards.
-	Reported by Wwp.
-
-2001-11-01  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (Invalid input: 2): New.
-	* src/lex.c (unlexed_token_buffer): New.
-	(lex, unlex): Adjust: when unlexing, be sure to save token_buffer
-	too.
-	Reported by Wwp.
-
-2001-11-01  Akim Demaille  <akim@epita.fr>
-
-	* tests/calc.at: Catch up with 1.30.
-	* configure.in: Bump to 1.49a.
-	Adjust to newer Autotest.
-
-2001-10-19  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/conflicts.c: Move global variables rrc_total and src_total ...
-	(print_conflicts): here.
-	* src/output.c (output): Free global variable user_toknums.
-	* src/lex.c (token_obstack): Become static.
-
-2001-10-18  Akim Demaille  <akim@epita.fr>
-
-	* tests/atlocal.in (GCC): Add.
-	* tests/calc.at: s/m4_match/m4_bmatch/.
-	s/m4_patsubst/m4_bpatsubst/.
-	(AT_CHECK_CALC): Check the compiler's stderr only if it's GCC.
-	* configure.in: AC_SUBST(GCC).
-
-2001-10-14  Marc Autret  <autret_m@epita.fr>
-
-	* src/options.c (create_long_option_table): Fix.
-
-2001-10-10  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.simple: Be sure to set YYSTACK_USE_ALLOCA.
-
-2001-10-04  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (parse_union_decl): Push the caracters in
-	union_obstack, not attrs_obstack.
-
-2001-10-04  Akim Demaille  <akim@epita.fr>
-
-	Merge in the branch 1.29.
-
-	* src/reader.c (packsymbols): Use a temporary obstack for
-	`%%tokendef', since output_stack is already used elsewhere.
-
-	2001-10-02  Akim Demaille  <akim@epita.fr>
-
-	Bump 1.29d.
-
-	2001-10-02  Akim Demaille  <akim@epita.fr>
-
-	Version 1.29c.
-
-	2001-10-02  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (Invalid CPP headers): New.
-	From Alexander Belopolsky.
-	* src/files.c (compute_header_macro): Map non alnum chars to `_'.
-
-	2001-10-02  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.at (Invalid input): New.
-	* src/lex.c (lex): Be sure to set `token_buffer' in any case.
-	Reported by Shura.
-
-	2001-10-02  Akim Demaille  <akim@epita.fr>
-
-	* tests/calc.at: Now that --debug works, the tests must be adjusted.
-
-	2001-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output_parser): Assert `skeleton'.
-	* src/files.c (skeleton_find): Look harder for skeletons on DOSish
-	systems.
-	From Shura.
-
-	2001-10-01  Marc Autret  <autret_m@epita.fr>
-
-	* src/lex.h: Echo modifications.
-	* src/lex.c (unlex): Parameter is now token_t.
-	From Hans Aberg.
-
-	2001-10-01  Marc Autret  <autret_m@epita.fr>
-
-	* src/main.c: Include lex.h.
-	From Hans Aberg.
-
-	2001-09-29  Akim Demaille  <akim@epita.fr>
-
-	* src/getargs.c (longopts): `--debug' is `-t', not `-d'.
-
-	2001-09-28  Akim Demaille  <akim@epita.fr>
-
-	* tests/testsuite.at: Update to newer Autotest.
-	* tests/Makefile.am (EXTRA_DIST): bison is not to be shipped.
-
-	2001-09-27  Akim Demaille  <akim@epita.fr>
-
-	Position independent wrapper.
-
-	* tests/bison: Remove.
-	* tests/bison.in: New.
-	* configure.in: Adjust.
-
-	2001-09-27  Paul Eggert  <eggert@twinsun.com>
-
-	Port quotearg fixes from tar 1.13.24.
-
-	* lib/quotearg.c: BSD/OS 4.1 wchar.h requires FILE and struct
-	tm to be declared.
-	(HAVE_MBSINIT): Undef if !HAVE_MBRTOWC.
-	(mbsinit): Define to 1 if !defined mbsinit && !HAVE_MBSINIT.
-
-	* m4/Makefile.am (EXTRA_DIST): Add mbrtowc.m4.
-	* m4/mbrtowc.m4: New file.
-	* m4/prereq.m4 (jm_PREREQ_QUOTEARG): Check for mbsinit and stddef.h.
-	Use jm_FUNC_MBRTOWC instead of AC_CHECK_FUNCS(mbrtowc).
-
-	2001-09-27  Akim Demaille  <akim@epita.fr>
-
-	Bump to 1.29c.
-
-	2001-09-27  Akim Demaille  <akim@epita.fr>
-
-	Version 1.29b.
-
-	2001-09-25  Akim Demaille  <akim@epita.fr>
-
-	* src/system.h: Include `xalloc.h'.
-	Remove it from the C files.
-	* src/files.c (output_files): Free the obstacks.
-	* src/lex.c (init_lex): Rename as...
-	(lex_init): this.
-	(lex_free): New.
-	* src/main.c (main): Use it.
-
-	2001-09-24  Marc Autret  <autret_m@epita.fr>
-
-	* src/vcg.c (open_edge, close_edge, open_node, close_node): Change
-	to output informations in fout (FILE*).
-	(open_graph, close_graph): Likewise.
-	(output_graph, output_edge, output_node): Likewise.
-	* src/vcg.h: Update function prototypes.
-	* src/print_graph.c (print_graph): Open output graph file.
-	(print_actions): Adjust.
-	* src/files.h: Remove extern declaration.
-	* src/files.c: Remove graph_obstack declaration.
-	(open_files): Remove graph_obstack initialization.
-	(output_files): Remove graph_obstack saving.
-
-	2001-09-24  Marc Autret  <autret_m@epita.fr>
-
-	* src/files.c (compute_output_file_names): Fix.
-
-	2001-09-24  Marc Autret  <autret_m@epita.fr>,
-		    Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (reader): Remove call to free_symtab ().
-	* src/main.c (main): Call it here.
-	Include symtab.h.
-	* src/conflicts.c (initialize_conflicts): Rename as...
-	(solve_conflicts): this.
-	* src/print.c (print_core, print_actions, print_state)
-	(print_grammar): Dump to a file instead a `output_obstack'.
-	(print_results): Dump `output_obstack', and then proceed with the
-	FILE *.
-	* src/files.c (compute_output_file_names, close_files): New.
-	(output_files): Adjust.
-	* src/main.c (main): Adjust.
-
-	2001-09-23  Marc Autret  <autret_m@epita.fr>
-
-	* src/files.c (compute_header_macro): Computes header macro name
-	from spec_defines_file when given.
-
-	2001-09-23  Marc Autret  <autret_m@epita.fr>
-
-	* src/files.c (output_files): Add default extensions.
-
-	2001-09-22  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (finalize_conflicts): Rename as...
-	(free_conflicts): this.
-
-	2001-09-22  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.c (gram_free): Rename back as...
-	(dummy): this.
-	(output_token_translations): Free `token_translations'.
-	* src/symtab.c (free_symtab): Free the tag field.
-
-	2001-09-22  Akim Demaille  <akim@epita.fr>
-
-	Remove `translations' as it is always set to true.
-
-	* src/gram.h: Adjust.
-	* src/reader.c (packsymbols, parse_token_decl): Adjust
-	* src/print.c (print_grammar): Adjust.
-	* src/output.c (output_token_translations): Adjust.
-	* src/lex.c (lex): Adjust.
-	* src/gram.c: Be sure the set pointers to NULL.
-	(dummy): Rename as...
-	(gram_free): this.
-
-	2001-09-22  Akim Demaille  <akim@epita.fr>
-
-	* configure.in: Invoke AM_LIB_DMALLOC.
-	* src/system.h: Use dmalloc.
-	* src/LR0.c: Be sure to have pointers initialized to NULL.
-	(allocate_itemsets): Allocate kernel_items only if needed.
-
-	2001-09-22  Akim Demaille  <akim@epita.fr>
-
-	* configure.in: Bump to 1.29b.
-	* tests/Makefile.am (DISTCLEANFILES): Add package.m4.
-	* tests/calc.at (_AT_DATA_CALC_Y): #undef malloc so that we don't
-	need xmalloc.c in calc.y.
-	From Pascal Bart.
-
-	2001-09-21  Akim Demaille  <akim@epita.fr>
-
-	Version 1.29a.
-	* Makefile.maint, config/config.guess, config/config.sub,
-	* config/missing: Update from masters.
-	* tests/Makefile.am ($(srcdir)/$(TESTSUITE)): No longer depend
-	upon package.m4.
-	* configure.in (ALL_LINGUAS): Add `tr'.
-
-	2001-09-21  Akim Demaille  <akim@epita.fr>
-
-	* tests/Makefile.am (package.m4): Move to...
-	($(srcdir)/$(TESTSUITE)): here.
-
-	2001-09-20  Akim Demaille  <akim@epita.fr>
-
-	* src/complain.c: No longer try to be standalone: use system.h.
-	Don't assume __STDC__ is defined to 1. Just test if it is defined.
-	* src/complain.h: Likewise.
-	* src/reduce.c (useless_nonterminals, inaccessable_symbols):
-	Remove the unused variable `n'.
-	From Albert Chin-A-Young.
-
-	2001-09-18  Marc Autret  <autret_m@epita.fr>
-
-	* doc/bison.1: Update.
-	* doc/bison.texinfo (Bison Options): Update --defines and --graph
-	descriptions.
-	(Option Cross Key): Update.
-	Add --graph.
-
-	2001-09-18  Marc Autret  <autret_m@epita.fr>
-
-	* tests/regression.at: New test (comment in %union).
-
-	2001-09-18  Marc Autret  <autret_m@epita.fr>
-
-	* src/reader.c (parse_union_decl): Do not output '/'. Let copy_comment
-	do that.
-	Reported by Keith Browne.
-
-	2001-09-18  Marc Autret  <autret_m@epita.fr>
-
-	* tests/output.at: Add tests for --defines and --graph.
-
-	2001-09-18  Marc Autret  <autret_m@epita.fr>
-
-	* tests/output.at: Removes tests of %{header,src}_extension features.
-
-	2001-09-18  Akim Demaille  <akim@epita.fr>
-
-	* tests/Makefile.am (package.m4): New.
-	* tests/calc.at (_AT_CHECK_CALC): Just run `calc input'.
-	(_AT_CHECK_CALC_ERROR): Likewise.
-	Factor the `, ' part of verbose error messages.
-
-	2001-09-18  Marc Autret  <autret_m@epita.fr>
-
-	* src/getargs.c (longopts): Declare --defines and --graph as options
-	with optional arguments.
-	* src/files.h: Add extern declarations.
-	* src/files.c (spec_graph_file, spec_defines_file): New.
-	(output_files): Update.
-	Remove CPP-outed code.
-
-	2001-09-18  Marc Autret  <autret_m@epita.fr>
-
-	Turn off %{source,header}_extension feature.
-
-	* src/files.c (compute_exts_from_gf): Update.
-	(compute_exts_from_src): Update.
-	(output_files): CPP-out useless code.
-	* src/files.h: Remove {header,source}_extension extern declarations.
-	* src/reader.c (parse_dquoted_param): CPP-out.
-	(parse_header_extension_decl): Remove.
-	(parse_source_extension_decl): Remove.
-	(read_declarations): Remove cases tok_{hdrext,srcext}.
-	* src/lex.c (percent_table): Remove {header,source}_extension entries.
-	* src/lex.h (token_t): Remove tok_hdrext and tok_srcext.
-
-	2001-09-10  Akim Demaille  <akim@epita.fr>
-
-	* tests/output.at (AT_CHECK_BISON_FLAGS, AT_CHECK_BISON_PERCENT):
-	(AT_CHECK_BISON_PERCENT_FLAGS): Merge into...
-	(AT_CHECK_OUTPUT): this.
-	Merely check ls' exit status, its output is useless.
-
-	2001-09-10  Akim Demaille  <akim@epita.fr>
-
-	* tests/calc.at: Use m4_match.
-	(_AT_DATA_CALC_Y): Check `yyin != NULL', not `stdin != NULL'.
-
-	2001-09-10  Marc Autret  <autret_m@epita.fr>,
-		    Akim Demaille  <akim@epita.fr>
-
-	* src/vcg.h (graph_s): color, textcolor, bordercolor are now
-	enum color_e.
-	* src/print_graph.c (print_graph): Initalize graph.layoutalgorithm
-	to `normal'.
-	* src/reader.c (parse_token_decl): Initialize token with tok_eof.
-	* src/lex.h: Adjust prototype.
-	(token_t): Add `tok_undef'.
-	* src/lex.c (struct percent_table_struct): Retval is now a token_t.
-	(parse_percent_token): Now returns token_t.
-	Add default statement in switch.
-	(lex): Separate `c' as an input variable, from the token_t result
-	part.
-	(unlexed): Is a token_t.
-
-	2001-09-10  Akim Demaille  <akim@epita.fr>
-
-	* configure.in: Bump to 1.29a.
-
-	2001-09-07  Akim Demaille  <akim@epita.fr>
-
-	Version 1.29.
-
-	2001-08-30  Akim Demaille  <akim@epita.fr>
-
-	* tests/atgeneral.m4, tests/atconfig.in, tests/suite.at: Remove.
-	* m4/atconfig.m4: Remove.
-	* tests/testsuite.at, tests/atlocal.in, tests/output.at,
-	* tests/bison: New.
-	* tests/regression.at, tests/calc.at: Use m4_define, AT_BANNER,
-	m4_if, m4_patsubst, and m4_regexp.
-	* tests/calc.at (_AT_CHECK_CALC, _AT_CHECK_CALC_ERROR): Use an
-	`input' file instead of echo.
-
-	2001-08-29  Akim Demaille  <akim@epita.fr>
-
-	Bump to 1.28e.
-
-	2001-08-29  Akim Demaille  <akim@epita.fr>
-
-	Version 1.28d.
-
-	2001-08-29  Paul Eggert  <eggert@twinsun.com>
-
-	* src/bison.simple (yyparse): Don't take the address of an
-	item before the start of an array, as that doesn't conform to
-	the C Standard.
-
-	2001-08-29  Robert Anisko  <anisko_r@epita.fr>
-
-	* doc/bison.texinfo (Location Tracking Calc): New node.
-
-	2001-08-29  Paul Eggert  <eggert@twinsun.com>
-
-	* src/output.c (output): Do not define const, as this now
-	causes more problems than it cures.
-
-	2001-08-29  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo: Modernize `@node' and `@top' use: just name
-	the nodes.
-	Be sure to tag the `detailmenu'.
-
-	2001-08-29  Akim Demaille  <akim@epita.fr>
-
-	* Makefile.maint (do-po-update): Wget refuses to overwrite files:
-	download in a tmp dir.
-
-	2001-08-28  Marc Autret  <autret_m@epita.fr>
-
-	* config/depcomp: New file.
-
-	2001-08-28  Marc Autret  <autret_m@epita.fr>
-
-	* doc/bison.1 (mandoc): Adjust.
-	From Juan Manuel Guerrero.
-
-	2001-08-28  Marc Autret  <autret_m@epita.fr>
-
-	* src/print_graph.c (print_state): Fix.
-
-	2001-08-27  Marc Autret  <autret_m@epita.fr>
-
-	* src/vcg.h (classname_s, infoname_s, node_s): Constify the
-	char * members.
-	Echo modifications to the functions prototypes.
-	* src/vcg.c (add_classname, add_infoname): Adjust arguments.
-
-	2001-08-27  Marc Autret  <autret_m@epita.fr>
-
-	* src/vcg.c: Include `xalloc.h'.
-	(add_colorentry): New.
-	(add_classname): New.
-	(add_infoname): New.
-	* src/vcg.h: Add new prototypes.
-
-	2001-08-27  Akim Demaille  <akim@epita.fr>
-
-	* Makefile.maint: Sync. again with CVS Autoconf.
-
-	2001-08-27  Akim Demaille  <akim@epita.fr>
-
-	* Makefile.maint: Formatting changes.
-	(po-update, cvs-update, update): New targets.
-	(AMTAR): Remove.
-
-	2001-08-27  Akim Demaille  <akim@epita.fr>
-
-	* Makefile.am (AUTOMAKE_OPTIONS): 1.5.
-	* Makefile.maint: Sync. with CVS Autoconf.
-
-	2001-08-27  Marc Autret  <autret_m@epita.fr>
-
-	* src/vcg.h (struct infoname_s): New.
-	(struct colorentry_s): New.
-	(graph_s): New fields {vertical,horizontal}_order in structure.
-	Add `infoname' field.
-	Add `colorentry' field;
-	* src/vcg_defaults.h (G_VERTICAL_ORDER): New.
-	(G_HORIZONTAL_ORDER): New.
-	(G_INFONAME): New.
-	(G_COLORENTRY): New.
-	* src/vcg.c (output_graph): Add output of {vertical,horizontal}_order.
-	Add output of `infoname'.
-	Add output of `colorentry'.
-
-	2001-08-27  Marc Autret  <autret_m@epita.fr>
-
-	* src/reader.c (parse_dquoted_param): Rename variable `index' to `i'.
-	This one shadowed a global parameter.
-
-	2001-08-24  Marc Autret  <autret_m@epita.fr>
-
-	* src/print_graph.c (node_output_size): Declared POSIX `size_t' type,
-	instead of `unsigned'.
-	(print_state): Do not call obstack_object_size () in obstack_grow ()
-	to avoid macro variables shadowing.
-
-	2001-08-23  Marc Autret  <autret_m@epita.fr>
-
-	* src/lex.c (percent_table): Typo: s/naem/name/.
-	Add graph option.
-	Normalize new options declarations.
-
-	2001-08-20  Pascal Bart  <pascal.bart@epita.fr>
-
-	* tests/suite.at: Exercise %header_extension and %source_extension.
-
-	2001-08-16  Marc Autret  <autret_m@epita.fr>
-
-	* src/reader.c (parse_dquoted_param): New.
-	(parse_header_extension_decl): Use it.
-	(parse_source_extension_decl): Likewise.
-
-	2001-08-16  Marc Autret  <autret_m@epita.fr>
-
-	* src/vcg.c: Remove includes of `complain.h' and `xalloc.h'.
-	(get_xxxx_str): Use assert () instead of complain ().
-	Remove return invokations in default cases.
-	(get_decision_str): Modify default behaviour. Remove second argument.
-	Echo modifications on calls.
-	(output_graph): Fix.
-
-	2001-08-16  Marc Autret  <autret_m@epita.fr>
-
-	* src/getargs.c (usage): Update with ``-g, --graph''.
-
-	2001-08-16  Marc Autret  <autret_m@epita.fr>
-
-	* doc/bison.texinfo (Bison Options): Add items `-g', `--graph'.
-	(Option Cross Key): Likewise.
-	* doc/bison.1: Update.
-
-2001-09-25  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/output.c (output_master_parser): Don't finish action_obstack.
-	(output_parser): Don't care about the muscle action, here.
-	(prepare): Copy the action_obstack in the action muscle.
-	(output): Free action_obstack.
-
-2001-09-23  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/reader.c (parse_union_decl): Add new obstack union_obstack.  Which
-	will contain `%union' declaration.
-	(parse_union_decl): Delete #line directive output.
-	(parse_union_decl): Substitute /attrs_obstack/union_obstack for all
-	informations about %union.
-	(parse_union_decl): Copy the union_obstack in the muscle stype.
-	* src/bison.simple: Add new #line directive.
-	Add typdef %%stype YYSTYPE.
-
-2001-09-23  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/bison.simple: Add new `#line' directive.
-
-2001-09-22  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/bison.simple: New `#line' directive.
-	* src/output.c (output_parser): Support new dynamic muscle input_line.
-
-2001-09-22  Marc Autret  <autret_m@epita.fr>
-
-	* src/output.c (output_master_parser): New.
-	(output_parser): Be more re-entrant.
-
-2001-09-21  Marc Autret  <autret_m@epita.fr>
-
-	* src/reader.c (copy_definition, parse_union_decl): Update and use
-	`linef' muscle.
-	(copy_action): Likewise.
-	Use obstack_1grow ().
-	* src/muscle_tab.c (muscle_init): Add muscle `linef'.
-
-2001-09-21  Marc Autret  <autret_m@epita.fr>
-
-	* src/options.c (option_table): Adjust.
-	* src/lex.c (parse_percent_token): Fix.
-
-2001-09-20  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/options.c (symtab.h): Include it, need by lex.h.
-
-2001-09-20  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/lex.c (parse_percent_token): Change type of variable `tx', which
-	is now an option_table_struct*.
-	(option_strcmp): New function option_strcmp.
-	(parse_percent_token): Call option_strcmp.
-	* src/getargs.c (xalloc.h, options.h): Include it.
-	(getargs): Call create_long_option_table.
-	(getargs): Free longopts at the end of the function.
-	(shortopts): Move in options.c.
-	* src/options.c (create_long_option_table): New function.  Convert
-	information from option_table to option structure.
-	* src/reader.c (options.h): Include it.
-
-	* src/Makefile.am: Adjust.
-	* src/options.c (option_table): Create from longopts and percent_table.
-	* src/getargs.c (longopts): Delete.
-	* src/lex.c (struct percent_table_struct): Delete.
-	(percent_table): Delete.
-	(options.h): Include it.
-	* src/options.c: Create.
-	* src/options.h: Create.
-	Declare enum opt_access_e.
-	Define struct option_table_struct.
-
-2001-09-20  Marc Autret  <autret_m@epita.fr>
-
-	* doc/bison.texinfo: Adjust terminologies about prologue and epilogue
-	sections of Bison.
-
-2001-09-19  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/bison.simple: s/%%filename/%%skeleton.
-	* src/muscle_tab.c (getargs.h): Include it.
-	(muscle_init): Insert new muscle skeleton.
-
-2001-09-18  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/output.c (output_parser): Delete unused variable actions_dumped.
-
-2001-09-07  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/output.c (output): Delete call to reader_output_yylsp.
-	* src/reader.c (reader): Likewise.
-	* src/reader.h: Delete declaration of reader_output_yylsp.
-
-2001-09-02  Marc Autret  <autret_m@epita.fr>
-
-	* src/reader.c: Include muscle_tab.h.
-	(parse_union_decl): Update.
-	(parse_macro_decl): Rename parse_muscle_decl.
-	Update to use renamed functions and variable.
-	(read_declarations, copy_action, read_additionnal_code, : Updated
-	with correct variables and functions names.
-	(packsymbols, reader): Likewise.
-
-	* src/reader.h (muscle_obstack): Extern declaration update.
-
-	* src/output.c: Include muscle_tab.h
-	In all functions using macro_insert, change by using muscle_insert ().
-	(macro_obstack): Rename muscle_obstack.
-	Echo modifications in the whole file.
-	(MACRO_INSERT_INT): Rename MUSCLE_INSERT_INT.
-	(MACRO_INSERT_STRING): Rename MUSCLE_INSERT_STRING.
-	(MACRO_INSERT_PREFIX): Rename MUSCLE_INSERT_PREFIX.
-
-	* src/muscle_tab.h: Update double inclusion macros.
-	(macro_entry_s): Rename muscle_entry_s.
-	Update prototypes.
-
-	* src/muscle_tab.c: Include muscle_tab.h.
-	Rename macro_tabble to muscle_table.
-	(mhash1, mhash2, mcmp): Use muscle_entry.
-	(macro_init): Rename muscle_init. Update.
-	(macro_insert): Rename muscle_insert. Update.
-	(macro_find): Rename muscle_find. Update.
-
-	* src/main.c: Include muscle_tab.h.
-	(main): Call muscle_init ().
-	* src/Makefile.am (bison_SOURCES): Echo modifications.
-
-2001-09-02  Marc Autret  <autret_m@epita.fr>
-
-	Now the files macro_tab.[ch] are named muscle_tab.[ch].
-
-	* src/muscle_tab.c, src/muscle_tab.h: Add files.
-
-2001-09-02  Marc Autret  <autret_m@epita.fr>
-
-	* src/macrotab.c, src/macrotab.h: Remove.
-
-2001-09-01  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/reader.c (copy_guard): Use muscle to specify the `#line'
-	filename.
-
-2001-09-01  Marc Autret  <autret_m@epita.fr>
-
-	* tests/calc.at (exp): Now, YYERROR_VERBOSE need to be set
-	to an explicit value to activate the feature. We do it here.
-
-2001-08-31  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/output.c (prepare): Delete the `filename' muscule insertion.
-	* src/reader.c (copy_action): Use `filename' muscule with `#line'.
-	(parse_union_decl): Likewise.
-	* src/macrotab.c (macro_init): Initialize filename by infile.
-
-2001-08-31  Marc Autret  <autret_m@epita.fr>
-
-	* src/bison.simple (YYLSP_NEEDED): New definition.
-	* src/output.c (prepare): Add macro insertion of `locations_flag'
-
-2001-08-31  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/output.c (prepare): Delete insertion of previous muscles,
-	and insert the `prefix' muscles.
-	* src/macrotab.c (macro_init): Likewise.
-	(macro_init): Initialization prefix directive by `yy'.
-	* src/bison.simple: Substitute all %%yylex, %%yychar, %%yylval,
-	%%yydebug, %%yyerror, %%yynerrs and %%yyparse by yylex, yychar,
-	yylval, yydebug, yyerror, yynerrs and yyparse.
-	New directive `#define' to substitute yydebug, ... with option
-	name_prefix.
-
-2001-08-31  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/main.c (main): Standardize.
-	* src/output.c (output_table_data, output_parser): Likewise.
-	* src/macrotab.h, src/macrotab.c, src/bison.simple: Likewise.
-
-2001-08-31  Pascal Bart  <pascal.bart@epita.fr>, Marc Autret  <autret_m@epita.fr>
-
-	* src/reader.c (read_additionnal_code): Rename %%user_code to
-	%%epilogue.
-	* src/output.c (output): Rename %%declarations to %%prologue.
-	* src/bison.simple: Echo modifications.
-
-2001-08-31  Marc Autret  <autret_m@epita.fr>
-
-	* src/reader.c (readgram): CleanUp.
-	(output_token_defines): Likewise.
-	(packsymbols): Likewise.
-	(reader): Likewise.
-	* src/output.c (output): CPP-out useless code.
-
-2001-08-31  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/reader.c (reader): Delete obsolete call to function
-	output_trailers and output_headers.
-	* src/output.h: Remove obsolete functions prototypes of output_headers
-	and output_trailers.
-
-2001-08-30  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/main.c: Include macrotab.h.
-	* src/macrotab.h (macro_entry_s): Constify fields.
-	Adjust functions prototypes.
-	* src/macrotab.c (macro_insert): Constify key and value.
-	(macro_find): Constify key.
-	(macro_insert): Include 'xalloc.h'
-	(macro_insert): Use XMALLOC.
-	(macro_find): Constify return value.
-	* src/output.c (output_table_data): Rename table to table_data.
-	(output_parser): Constify macro_key, macro_value.
-
-2001-08-30  Marc Autret  <autret_m@epita.fr>
-
-	* src/reader.c (parse_skel_decl): New.
-	(read_declarations): Add case `tok_skel', call parse_skel_decl ().
-	* src/lex.h (token_t): New token `tok_skel'.
-	* src/lex.c (percent_table): Add skeleton option entry.
-	Standardize.
-
-2001-08-29  Marc Autret  <autret_m@epita.fr>
-
-	* src/bison.simple: Add %%user_code directive at the end.
-	* src/reader.c (read_additionnal_code): New.
-	(reader): Use it.
-	* src/output.c (output_program): Remove.
-	(output): Update.
-
-2001-08-28  Marc Autret  <autret_m@epita.fr>
-
-	* src/output.c (output_actions): Clean up.
-	(output_gram): CPP-out useless code.
-	* src/reader.c (reader): Clean up, CPP-out useless code.
-
-2001-08-28  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/output.c (output): Copy attrs_obstack in the '%%definitions'
-	directive.
-	* src/bison.simple: Add `%%definitions'.
-
-2001-08-28  Marc Autret  <autret_m@epita.fr>
-
-	* config/depcomp: New file.
-
-2001-08-27  Paul Eggert  <eggert@twinsun.com>
-
-	* src/bison.simple (yyparse): Don't take the address of an
-	item before the start of an array, as that doesn't conform to
-	the C Standard.
-
-2001-08-27  Robert Anisko  <robert.anisko@epita.fr>
-
-	* src/output.c (output): Remove the initialization of the macro
-	obstack.  It was done too late here.
-
-	* src/reader.c (parse_macro_decl): Fix.  Use of the macro obstack was
-	completely wrong.
-	(reader): Initialize the macro obstack here, since we need it to grow
-	'%define' directives.
-
-	* src/reader.h: Declare the macro obstack as extern.
-
-2001-08-27  Robert Anisko  <robert.anisko@epita.fr>
-
-	* src/output.c (output_parser): Fix.  Store single '%' characters in
-	the output obstack instead of throwing them away.
-
-2001-08-27  Akim Demaille  <akim@epita.fr>
-
-	* Makefile.am (AUTOMAKE_OPTIONS): 1.5.
-
-2001-08-25  Robert Anisko  <robert.anisko@epita.fr>
-
-	* lib/Makefile.am: Adjust.
-
-2001-08-25  Robert Anisko  <robert.anisko@epita.fr>
-
-	* src/bison.simple: Update and add '%%' directives.
-
-2001-08-25  Robert Anisko  <robert.anisko@epita.fr>
-
-	* src/reader.c (reader): Remove calls to 'output_headers' and
-	'output_trailers'. Remove some C output.
-	(readgram): Disable a piece of code that was writing a default
-	definition for 'YYSTYPE'.
-	(reader_output_yylsp): Remove.
-	(packsymbols): Output token defintions to a macro.
-	(copy_definition): Disable C output.
-
-	* src/reader.c (parse_macro_decl): New function used to parse macro
-	declarations.
-	(copy_string2): Put the body of copy_string into this new function.
-	Add a parameter to let the caller choose whether he wants to copy the
-	string delimiters or not.
-	(copy_string): Be a simple call to copy_string2 with the last argument
-	bound to true.
-	(read_declarations): Add case for macro definition.
-	(copy_identifier): New.
-	(parse_macro_decl): Read macro identifiers using copy_identifier
-	rather than lex.
-
-2001-08-25  Robert Anisko  <robert.anisko@epita.fr>
-
-	* src/output.c (prepare): Add prefixed names.
-	(output_parser): Output semantic actions.
-	(output_parser): Fix bug on '%%line' directives.
-
-	* src/output.c (output_headers): Remove. The C code printed by this
-	function should now be in the skeletons.
-	(output_trailers): Remove.
-	(output): Disable call to 'reader_output_yylsp'.
-	(output_rule_data): Do not output tables to the table obstack.
-
-	* src/output.c: Remove some C dedicated output.
-	Improve the use of macro and output obstacks.
-	(output_defines): Remove.
-
-	* src/output.c (output_token_translations): Associate 'translate'
-	table with a macro. No output to the table obstack.
-	(output_gram): Same for 'rhs' and 'prhs'.
-	(output_stos): Same for 'stos'.
-	(output_rule_data): Same for 'r1' and 'r2'.
-	(token_actions): Same for 'defact'.
-	(goto_actions): Same for 'defgoto'.
-	(output_base): Same for 'pact' and 'pgoto'.
-	(output_table): Same for 'table'.
-	(output_check): Same for 'check'.
-
-	* src/output.c (output_table_data): New function.
-	(output_short_table): Remove.
-	(output_short_or_char_table): Remove.
-
-	* src/output.c (output_parser): Replace most of the skeleton copy code
-	with something new. Skeletons are now processed character by character
-	rather than line by line, and Bison looks for '%%' macros. This is the
-	first step in making Bison's output process (a lot) more flexible.
-	(output_parser): Use the macro table.
-
-2001-08-25  Robert Anisko  <robert.anisko@epita.fr>
-
-	* src/main.c (main): Initialize the macro table.
-
-2001-08-25  Robert Anisko  <robert.anisko@epita.fr>
-
-	* src/lex.c (percent_table): Add tok_define.
-	* src/lex.h: Add tok_define.
-
-2001-08-25  Robert Anisko  <robert.anisko@epita.fr>
-
-	* src/macrotab.c: New file.
-	* src/macrotab.h: New file.
-	* src/Makefile.am: Update.
-
-2001-08-25  Robert Anisko  <robert.anisko@epita.fr>
-
-	* lib/hash.c: New file.
-	* lib/hash.h: New file.
-	* lib/Makefile.am: Update.
-
-2001-08-15  Akim Demaille  <akim@epita.fr>
-
-	Version 1.28c.
-
-2001-08-15  Marc Autret  <autret_m@epita.fr>
-
-	* src/reader.c (readgram): Indent output macro YYSTYPE.
-	(packsymbols): Likewise.
-	(output_token_defines): Likewise.
-	* src/files.c: Standardize.
-	(compute_header_macro): New.
-	(defines_obstack_save): New. Use compute_header_macro.
-	(output_files): Update. Use defines_obstack_save.
-
-2001-08-15  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo (Table of Symbols): Document
-	YYSTACK_USE_ALLOCA.
-
-2001-08-15  Akim Demaille  <akim@epita.fr>
-
-	* missing: Update from CVS Automake.
-	* config/config.guess, config/config.sub, config/texinfo.tex:
-	Update from gnu.org.
-
-2001-08-15  Akim Demaille  <akim@epita.fr>
-
-	* Makefile.maint: Sync with CVS Autoconf.
-
-2001-08-14  Pascal Bart  <pascal.bart@epita.fr>
-
-	* doc/bison.texinfo: Include GNU Free Documentation License from
-	`fdl.texi'.
-	* doc/fdl.texi: Add to package.
-
-2001-08-14  Marc Autret  <autret_m@epita.fr>
-
-	Turn on %{source,header}_extension features.
-
-	* src/lex.c (percent_table): Un-CPP out header_extension and
-	source_extension.
-	* src/files.c (compute_exts_from_gf): Compare pointers with NULL.
-	(compute_exts_from_src): Remove conditions. It restores priorities
-	between options.
-
-2001-08-14  Marc Autret  <autret_m@epita.fr>
-
-	* src/files.c (compute_base_names): Add extensions computing when
-	`--file-prefix' used.
-	Standardize function calls.
-
-2001-08-13  Marc Autret  <autret_m@epita.fr>
-
-	* src/bison.simple (YYSTACK_USE_ALLOCA): Changed to allow users
-	defining it (defined but null disables alloca).
-
-2001-08-13  Marc Autret  <autret_m@epita.fr>
-
-	* src/bison.simple (_yy_memcpy): CPP reformat.
-
-2001-08-13  Pascal Bart  <pascal.bart@epita.fr>
-
-	* tests/atconfig.in (CPPFLAGS): Fix.
-
-2001-08-10  Pascal Bart  <pascal.bart@epita.fr>
-
-	* doc/bison.texinfo: Include GNU General Public License from
-	`gpl.texi'.
-	* doc/gpl.texi: Add to package.
-
-2001-08-10  Marc Autret  <autret_m@epita.fr>
-
-	* src/print_graph.h: Fix.
-	* src/reader.c (read_declarations): Use parse_header_extension_decl ().
-
-2001-08-10  Akim Demaille  <akim@epita.fr>
-
-	* src/system.h: Provide default declarations for stpcpy, strndup,
-	and strnlen.
-
-2001-08-10  Robert Anisko  <anisko_r@epita.fr>
-
-	* doc/bison.texinfo (Locations): Update @$ stuff.
-
-2001-08-09  Robert Anisko  <anisko_r@epita.fr>
-
-	* src/bison.simple (YYLLOC_DEFAULT): Update.
-	(yyparse): Adjust.
-
-2001-08-08  Marc Autret  <autret_m@epita.fr>
-
-	* doc/bison.texinfo: Change @samp{$<@dots{}>} to
-	@samp{$<@dots{}>@var{n}} in Section Actions in Mid-Rule.
-	Reported by Fabrice Bauzac.
-
-2001-08-08  Marc Autret  <autret_m@epita.fr>
-
-	* src/vcg_default.h: Use NULL instead of 0 to initialize pointers.
-	* src/vcg.c (output_node): Fix.
-	* src/vcg.h: Cleanup.
-	* src/print_graph.c: Add comments.
-	(node_output_size): New global variable. Simplify the formatting of
-	the VCG graph output.
-	(print_actions): Unused code is now used. It notifies the final state
-	and no action states in the VCG graph. It also give the reduce actions.
-	The `shift and goto' edges are red and the `go to state' edges are
-	blue.
-	Get the current node name and node_obstack by argument.
-	(node_obstack): New variable.
-	(print_state): Manage node_obstack.
-	(print_core): Use node_obstack given by argument.
-	A node is not only computed here but in print_actions also.
-	(print_graph): CPP out useless code instead of commenting it.
-
-2001-08-07  Pascal Bart  <pascal.bart@epita.fr>
-
-	* tests/atconfig.in (CPPFLAGS): Fix.
-
-2001-08-07  Akim Demaille  <akim@epita.fr>
-
-	* src/print_graph.c (quote): New.
-	(print_core): Use it.
-
-2001-08-06  Akim Demaille  <akim@epita.fr>, Marc Autret  <autret_m@epita.fr>
-
-	* src/vcg.c (complain.h): Include it.
-	Unepitaize `return' invocations.
-	[NDEBUG] (main): Remove.
-	* src/vcg.h (node_t, edge_t, graph_t): Constify the char * members.
-	* src/files.c (open_files): Initialize graph_obstack.
-	* src/print_graph.c (print_actions): CPP out useless code.
-	(print_core): Don't output the last `\n' in labels.
-	Use `quote'.
-	* src/files.c (output_files): Output the VCG file.
-	* src/main.c (main): Invoke print_graph ();
-
-2001-08-06  Marc Autret  <autret_m@epita.fr>
-
-	Automaton VCG graph output.
-	Using option ``-g'' or long option ``--graph'', you can generate
-	a gram_filename.vcg file containing a VCG description of the LALR (1)
-	automaton of your grammar.
-
-	* src/main.c: Call to print_graph() function.
-	* src/getargs.h: Update.
-	* src/getargs.c (options): Update to catch `-g' and `--graph' options.
-	(graph_flag): New flag.
-	(longopts): Update.
-	(getargs): Add case `g'.
-	* src/files.c (graph_obstack): New obstack struct.
-	(open_files): Initialize new obstack.
-	(output_files): Saves graph_obstack if required.
-	* src/files.h (graph_obstack): New extern declaration.
-	* src/Makefile.am: Add new source files.
-
-2001-08-06  Marc Autret  <autret_m@epita.fr>
-
-	* src/print_graph.c, src/print_graph.h (graph): New.
-	* src/vcg.h: New file.
-	* src/vcg.c: New file, VCG graph handling.
-
-2001-08-06  Marc Autret  <autret_m@epita.fr>
-
-	Add of %source_extension and %header_extension which specify
-	the source or/and the header output file extension.
-
-	* src/files.c (compute_base_names): Remove initialisation of
-	src_extension and header_extension.
-	(compute_exts_from_gf): Update.
-	(compute_exts_from_src): Update.
-	(output_files): Update.
-	* src/reader.c (parse_header_extension_decl): New.
-	(parse_source_extension_decl): New.
-	(read_declarations): New case statements for the new tokens.
-	* src/lex.c (percent_table): Add entries for %source_extension
-	and %header_extension.
-	* src/lex.h (token_e): New tokens tok_hdrext and tok_srcext.
-
-2001-08-06  Marc Autret  <autret_m@epita.fr>
-
-	* configure.in: Bump to 1.28c.
-	* doc/bison.texinfo: Texinfo thingies.
-
-2001-08-04  Pascal Bart  <pascal.bart@epita.fr>
-
-	* tests/atconfig.in (CPPFLAGS): Add.
-	* tests/calc.at (AT_CHECK): Use CPPFLAGS.
-
-2001-08-03  Akim Demaille  <akim@epita.fr>
-
-	Version 1.28b.
-
-2001-08-03  Akim Demaille  <akim@epita.fr>
-
-	* tests/Makefile.am (check-local): Ship testsuite.
-	* tests/calc.at (_AT_DATA_CALC_Y): Prototype all the functions.
-	Include `string.h'.
-
-2001-08-03  Akim Demaille  <akim@epita.fr>
-
-	* configure.in: Try using -Wformat when compiling.
-
-2001-08-03  Akim Demaille  <akim@epita.fr>
-
-	* configure.in: Bump to 1.28b.
-
-2001-08-03  Akim Demaille  <akim@epita.fr>
-
-	* src/complain.c: Adjust strerror_r portability issues.
-
-2001-08-03  Akim Demaille  <akim@epita.fr>
-
-	Version 1.28a.
-
-2001-08-03  Akim Demaille  <akim@epita.fr>
-
-	* src/getargs.c, src/getarg.h (skeleton)): Constify.
-	* src/lex.c (literalchar): Avoid name clashes on `buf'.
-	* src/getargs.c: Include complain.h.
-	* src/files.c, src/files.h (skeleton_find): Avoid name clashes.
-	* lib/quotearg.c, lib/quotearg.h: Update from fileutils 4.1.
-
-2001-08-03  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (readgram): Display hidden chars in error messages.
-
-2001-08-03  Akim Demaille  <akim@epita.fr>
-
-	Update to gettext 0.10.39.
-
-2001-08-03  Akim Demaille  <akim@epita.fr>
-
-	* lib/strspn.c: New.
-
-2001-08-01  Marc Autret  <autret_m@epita.fr>
-
-	* doc/bison.texinfo: Update.
-	* doc/bison.1 (mandoc): Update.
-	* src/system.h (EXT_GUARD_C, EXT_STYPE_H): Remove .c and .h.
-	* src/files.c: Support output files extensions computing.
-	(src_extension): New static variable.
-	(header_extension): New static variable.
-	(tr): New function.
-	(get_extension_index): New function, gets the index of an extension
-	filename in a string.
-	(compute_exts_from_gf): New function, computes extensions from the
-	grammar file extension.
-	(compute_exts_from_src): New functions, computes extensions from the
-	C source file extension, file given by ``-o'' option.
-	(compute_base_names): Update.
-	(output_files): Update.
-
-2001-08-01  Robert Anisko  <anisko_r@epita.fr>
-
-	* doc/bison.texi: Document @$.
-	(Locations): New section.
-
-2001-07-18  Akim Demaille  <akim@epita.fr>
-
-	* Makefile.maint, GNUmakefile: New, from Autoconf 2.52.
-	* config/prev-version.txt, config/move-if-change: New.
-	* Makefile.am: Adjust.
-
-2001-07-08  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/bison.simple (yyparse): Suppress warning `comparaison
-	between signed and unsigned'.
-
-2001-07-05  Pascal Bart  <pascal.bart@epita.fr>
-
-	* src/getargs.h (raw_flag): Remove.
-	* src/getargs.c: Die on `-r'/`--raw'.
-	* src/lex.c (parse_percent_token): Die on `%raw'.
-	* src/reader.c (output_token_defines): Suppress call to `raw_flag'.
-	* tests/calc.at: Suppress test with option `--raw'.
-
-2001-07-14  Akim Demaille  <akim@epita.fr>
-
-	* config/: New.
-	* configure.in: Require Autoconf 2.50.
-	Update to gettext 0.10.38.
-
-2001-03-16  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo: ANSIfy the examples.
-
-2001-03-16  Akim Demaille  <akim@epita.fr>
-
-	* getargs.c (skeleton): New variable.
-	(longopts): --skeleton is a new option.
-	(shortopts, getargs): -S is a new option.
-	* getargs.h: Declare skeleton.
-	* output.c (output_parser): Use it.
-
-2001-03-16  Akim Demaille  <akim@epita.fr>
-
-	* m4/strerror_r.m4: New.
-	* m4/error.m4: Run AC_FUNC_STRERROR_R.
-	* lib/error.h, lib/error.c: Update.
-
-2001-03-16  Akim Demaille  <akim@epita.fr>
-
-	* src/getargs.c (longopts): Clean up.
-
-2001-02-21  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (gensym): `gensym_count' is your own.
-	Use a static buf to create the symbol name, as token_buffer is no
-	longer a buffer.
-
-2001-02-08  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (conflict_report): Be sure not to append to res
-	between two calls, which could happen if both first sprintf were
-	skipped, but not the first cp += strlen.
-
-2001-02-08  Akim Demaille  <akim@epita.fr>
-
-	* lib/memchr.c, lib/stpcpy.c, lib/strndup.c, lib/strnlen.c:
-	New, from fileutils 4.0.37.
-	* configure.in: Require Autoconf 2.49c.  I took some time before
-	making this decision.  This is the only way out for portability
-	issues in Bison, it would mean way too much duplicate effort to
-	import in Bison features implemented in 2.49c since 2.13.
-	AC_REPLACE_FUNCS and AC_CHECK_DECLS the functions above.
-
-2001-02-02  Akim Demaille  <akim@epita.fr>
-
-	* lib/malloc.c, lib/realloc.c: New, from the fileutils 4.0.37.
-	* lib/xalloc.h, lib/xmalloc.c: Update.
-
-2001-01-19  Akim Demaille  <akim@epita.fr>
-
-	Get rid of the ad hoc handling of token_buffer in the scanner: use
-	the obstacks.
-
-	* src/lex.c (token_obstack): New.
-	(init_lex): Initialize it.  No longer call...
-	(grow_token_buffer): this.  Remove it.
-	Adjust all the places which used it to use the obstack.
-
-2001-01-19  Akim Demaille  <akim@epita.fr>
-
-	* src/lex.h: Rename all the tokens:
-	s/\bENDFILE\b/tok_eof/g;
-	s/\bIDENTIFIER\b/tok_identifier/g;
-	etc.
-	Let them be enums, not #define, to ease debugging.
-	Adjust all the code.
-
-2001-01-18  Akim Demaille  <akim@epita.fr>
-
-	* src/lex.h (MAXTOKEN, maxtoken, grow_token_buffer): Remove, private.
-	* src/lex.c (maxtoken, grow_token_buffer): Static.
-
-2001-01-18  Akim Demaille  <akim@epita.fr>
-
-	Since we now use obstacks, more % directives can be enabled.
-
-	* src/lex.c (percent_table): Also accept `%yacc',
-	`%fixed_output_files', `%defines', `%no_parser', `%verbose', and
-	`%debug'.
-	Handle the actions for `%semantic_parser' and `%pure_parser' here,
-	instead of returning a token.
-	* src/lex.h (SEMANTIC_PARSER, PURE_PARSER): Remove, unused.
-	* src/reader.c (read_declarations): Adjust.
-	* src/files.c (open_files): Don't call `compute_base_names', don't
-	compute `attrsfile' since they depend upon data which might be
-	*in* the input file now.
-	(output_files): Do it here.
-	* src/output.c (output_headers): Document the fact that this patch
-	introduces a guaranteed SEGV for semantic parsers.
-	* doc/bison.texinfo: Document them.
-	* tests/suite.at: Exercise these %options.
-
-2000-12-20  Akim Demaille  <akim@epita.fr>
-
-	Also handle the output file (--verbose) with obstacks.
-
-	* files.c (foutput): Remove.
-	(output_obstack): New.
-	Adjust all dependencies.
-	* src/conflicts.c: Return a string.
-	* src/system.h (obstack_grow_string): Rename as...
-	(obstack_sgrow): this.  Be ready to work with non literals.
-	(obstack_fgrow4): New.
-
-2000-12-20  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c (open_files): Fix the computation of short_base_name
-	in the case of `-o foo.tab.c'.
-
-2000-12-20  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (copy_string, copy_comment, copy_comment2, copy_at)
-	(copy_dollar): Now that everything uses obstacks, get rid of the
-	FILE * parameters.
-
-2000-12-20  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c (open_files): Actually the `.output' file is based
-	on the short_base_name, not base_name.
-	* tests/suite.at (Checking output file names): Adjust.
-
-2000-12-20  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.s1: Remove, we now use directly...
-	* src/bison.simple: this.
-	* src/Makefile.am: Use pkgdata instead of data.
-
-2000-12-20  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c (guard_obstack): New.
-	(open_files): Initialize it.
-	(output_files): Dump it...
-	* src/files.h: Export it.
-	* src/reader.c (copy_guard): Use it.
-
-2000-12-19  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c (outfile, defsfile, actfile): Removed as global
-	vars.
-	(open_files): Don't compute them.
-	(output_files): Adjust.
-	(base_name, short_base_name): Be global.
-	Adjust dependencies.
-
-2000-12-19  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c (strsuffix): New.
-	(stringappend): Be just like strcat but allocate.
-	(base_names): Eve out from open_files.
-	Try to simplify the rather hairy computation of base_name and
-	short_base_name.
-	(open_files): Use it.
-	* tests/suite.at (Checking output file names): New test.
-
-2000-12-19  Akim Demaille  <akim@epita.fr>
-
-	* src/system.h (obstack_grow_literal_string): Rename as...
-	(obstack_grow_string): this.
-	* src/output.c (output_parser): Recognize `%% actions' instead of
-	`$'.
-	* src/bison.s1: s/$/%% actions/.
-	* src/bison.hairy: Likewise.
-
-2000-12-19  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output_parser): Compute the `#line' lines when
-	there are.
-	* src/Makefile.am (bison.simple): Be a simple copy of bison.s1.
-	Suggested by Hans Aberg.
-
-2000-12-19  Akim Demaille  <akim@epita.fr>
-
-	Let the handling of the skeleton files be local to the procedures
-	that use it.
-
-	* src/files.c (xfopen, xfclose, skeleton_find, guardfile): No
-	longer static.
-	(fparser, open_extra_files): Remove.
-	(open_files, output_files): Don't take care of fparser.
-	* src/files.h: Adjust.
-	* src/output.c (output_parser): Open and close the file to the
-	skeleton.
-	* src/reader.c (read_declarations): When %semantic_parser, open
-	fguard.
-
-2000-12-19  Akim Demaille  <akim@epita.fr>
-
-	* src/file.h (BISON_SIMPLE, BISON_HAIRY): Move from here...
-	* src/system.h (BISON_SIMPLE, BISON_HAIRY): ... to here.
-
-2000-12-19  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c (open_files): Yipee!  We no longer need all the code
-	looking for `/tmp' since we have no tmp file.
-
-2000-12-19  Akim Demaille  <akim@epita.fr>
-
-	* src/system.h (EXT_TAB, EXT_OUTPUT, EXT_STYPE_H, EXT_GUARD_C):
-	New macros.
-	* src/files.c (open_files): Less dependency on MSDOS etc.
-
-2000-12-14  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.s1 (YYLLOC_DEFAULT): New macro.
-	Provide a default definition.
-	Use it when executing the default @ action.
-	* src/reader.c (reader_output_yylsp): No longer include
-	`timestamp' and `text' in the default YYLTYPE.
-
-2000-12-12  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (copy_definition, parse_union_decl, copy_action)
-	(copy_guard): Quote the file names.
-	Reported by Laurent Mascherpa.
-
-2000-12-12  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output_headers, output_program, output): Be sure
-	to escape special characters when outputting filenames.
-	(ACTSTR_PROLOGUE, ACTSTR_EPILOGUE): Remove.
-	(output_headers): Don't depend on them, Use ACTSTR.
-
-2000-11-17  Akim Demaille  <akim@epita.fr>
-
-	* lib/obstack.h: Formatting changes.
-	(obstack_grow, obstack_grow0): Don't cast WHERE at all: it
-	prevents type checking.
-	(obstack_ptr_grow, obstack_ptr_grow_fast): When assigning, don't
-	cast the value to (void *): assigning a `foo *' to a `void *'
-	variable is valid.
-	(obstack_int_grow, obstack_int_grow_fast): Don't cast AINT to int.
-	* src/reader.c (parse_union_decl): Typo: use obstack_1grow to
-	append characters.
-
-2000-11-17  Akim Demaille  <akim@epita.fr>
-
-	* tests/Makefile.am (suite.m4, regression.m4, calc.m4): Rename
-	as...
-	(suite.m4, regression.m4, calc.m4): these.
-	* tests/atgeneral.m4: Update from CVS Autoconf.
-
-2000-11-17  Akim Demaille  <akim@epita.fr>
-
-	* tests/regression.m4 (%union and --defines): New test,
-	demonstrating a current bug in the obstack implementation.
-
-2000-11-17  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.s1 (_YY_DECL_VARIABLES, YY_DECL_VARIABLES): New
-	macros.
-	Use them to declare the variables which are global or local to
-	`yyparse'.
-
-2000-11-17  Akim Demaille  <akim@epita.fr>
-
-	* acconfig.h: Remove, no longer used.
-
-2000-11-07  Akim Demaille  <akim@epita.fr>
-
-	* src: s/Copyright (C)/Copyright/g.
-
-2000-11-07  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (reader): #define YYLSP_NEEDED to 1 instead of just
-	defining.
-	* src/bison.s1: s/#ifdef YYLSP_NEEDED/#if YYLSP_NEEDED/.
-
-2000-11-07  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.s1 (YYLEX): Use #if instead of #ifdef.
-	Merge in a single CPP if/else.
-
-2000-11-07  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output): Remove useless variables.
-	* lib/obstack.c (obstack_grow, obstack_grow0): Rename the second
-	argument `data' for consistency with the prototypes.
-	Qualify it `const'.
-	(obstack_copy, obstack_copy0): Rename the second argument as
-	`address' for consistency.  Qualify it `const'.
-	* lib/obstack.h (obstack_copy, obstack_copy0, obstack_grow)
-	(obstack_grow0, obstack_ptr_grow, obstack_ptr_grow_fast): Qualify
-	`const' their input argument (`data' or `address').
-	Adjust the corresponding macros to include `const' in casts.
-
-2000-11-03  Akim Demaille  <akim@epita.fr>
-
-	* src/Makefile.am (INCLUDES): s/PFILE/BISON_SIMPLE/.
-	s/PFILE1/BISON_HAIRY/.
-	Adjust dependencies.
-
-2000-11-03  Akim Demaille  <akim@epita.fr>
-
-	For some reason, this was not applied.
-
-	* src/files.c [VMS]: No longer include `ssdef.h', no longer define
-	`unlink': it's no longer used.
-
-2000-11-03  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c (skeleton_find): New function, eved out of...
-	(open_files, open_extra_files): here.
-
-2000-11-03  Akim Demaille  <akim@epita.fr>
-
-	Don't use `atexit'.
-
-	* src/files.c (obstack_save): New function.
-	(done): Rename as...
-	(output_files): this.
-	Use `obstack_save'.
-	* src/main.c (main): Don't use `atexit' to register `done', since
-	it no longer has to remove tmp files, just call `output_files'
-	when there are no errors.
-
-2000-11-02  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c [VMS]: No longer include `ssdef.h', no longer define
-	`unlink': it's no longer used.
-	* src/files.h: Formatting changes.
-
-2000-11-02  Akim Demaille  <akim@epita.fr>
-
-	Remove the last uses of mktemp and unlink/delete.
-
-	* src/files.c (fdefines, ftable): Removed.
-	(defines_ostack, table_obstack): New.
-	Adjust dependencies of the former into uses of the latter.
-	* src/output.c (output_short_or_char_table, output_short_table):
-	Convert to using obstacks.
-	* src/reader.c (copy_comment2): Accept one FILE * and two
-	obstacks.
-	(output_token_defines, reader_output_yylsp): Use obstacks.
-	* src/system.h (obstack_fgrow3): New.
-	* po/POTFILES.in: Adjust.
-
-2000-11-01  Akim Demaille  <akim@epita.fr>
-
-	Change each use of `fattrs' into a use of `attrs_obstack'.
-
-	* src/reader.c (copy_at): Typo: s/yylloc/yyloc/.
-	* src/files.c (fattrs): Remove.
-	(attrs_obstack): New.
-	Adjust all dependencies.
-	(done): If SEMANTIC_PARSER, dump attrs_obstack into attrsfile.
-
-2000-11-01  Akim Demaille  <akim@epita.fr>
-
-	Introduce obstacks.
-	Change each use of `faction' into a use of `action_obstack'.
-
-	* lib/obstack.h, lib/obstack.c: New files.
-	* src/files.c (faction): Remove.
-	(action_obstack): New.
-	Adjust all dependencies.
-
-2000-10-20  Akim Demaille  <akim@epita.fr>
-
-	* lib/quote.h (PARAMS): New macro.  Use it.
-
-2000-10-16  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output_short_or_char_table): New function.
-	(output_short_table, output_token_translations): Use it.
-	(goto_actions): Use output_short_table.
-
-2000-10-16  Akim Demaille  <akim@epita.fr>
-
-	* src/symtab.c (bucket_new): New function.
-	(getsym): Use it.
-
-	* src/output.c (output_short_table): New argument to display the
-	comment associated with the table.
-	Adjust dependencies.
-	(output_gram): Use it.
-	(output_rule_data): Nicer output layout for YYTNAME.
-
-2000-10-16  Akim Demaille  <akim@epita.fr>
-
-	* src/lex.c (read_typename): New function.
-	(lex): Use it.
-	* src/reader.c (copy_dollar): Likewise.
-
-2000-10-16  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (copy_comment2): Expect the input stream to be on
-	the `/' which is suspected to open a comment, instead of being
-	called after `//' or `/*' was read.
-	(copy_comment, copy_definition, parse_union_decl, copy_action)
-	(copy_guard): Adjust.
-
-2000-10-16  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (parse_expect_decl): Use `skip_white_space' and
-	`read_signed_integer'.
-
-2000-10-16  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (copy_dollar): New function.
-	(copy_guard, copy_action): Use it.
-
-2000-10-16  Akim Demaille  <akim@epita.fr>
-
-	* lib/quote.h, lib/quote.c, lib/quotearg.h, lib/quotearg.c:
-	* m4/prereq.m4, m4/c-bs-a.m4, m4/mbstate.m4:
-	New files, from Fileutils 4.0.27.
-	* src/main.c (printable_version): Remove.
-	* src/lex.c, src/reader.c: Use `quote'.
-
-2000-10-04  Akim Demaille  <akim@epita.fr>
-
-	* lib/error.c, lib/error.h: New files, needed by xmalloc.c.
-
-2000-10-04  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo: Various typos spotted by Neil Booth.
-
-2000-10-04  Akim Demaille  <akim@epita.fr>
-
-	When a literal string is used to define two different tokens,
-	`bison -v' segfaults.
-	Reported by Piotr Gackiewicz, and fixed by Neil Booth.
-
-	* tests/regression.m4: New file.
-	Include the core of the sample provided by Piotr Gackiewicz.
-	* src/reader.c (parse_token_decl): Diagnose bad cases, and proceed
-	properly.
-
-2000-10-04  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (parse_expect_decl): Keep `count' within the size
-	of `buffer'.
-	From Neil Booth.
-
-2000-10-02  Paul Eggert  <eggert@twinsun.com>
-
-	* bison.s1 (yyparse): Assign the default value
-	unconditionally, to avoid a GCC warning and make the parser a
-	tad smaller.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/getargs.c (getargs): Don't dump `--help' on unrecognized
-	options.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/derives.c, src/print.c, src/reduce.c: To ease the
-	translation, move some `\n' out of the translated strings.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	The location tracking mechanism is precious for parse error
-	messages.  Nevertheless, it is enabled only when `@n' is used in
-	the grammar, which is a different issue (you can use it in error
-	message, but not in the grammar per se).  Therefore, there should
-	be another means to enable it.
-
-	* src/getargs.c (getargs): Support `--locations'.
-	(usage): Report it.
-	* src/getargs.h (locationsflag): Export it.
-	* src/lex.c (percent_table): Support `%locations'.
-	* src/reader.c (yylsp_needed): Remove this variable, now replaced
-	with `locationsflag'.
-	* doc/bison.texinfo: Document `--locations' and `%locations'.
-	Sort the options.
-	* tests/calc.m4: Test it.
-
-	For regularity of the names, replace each
-	(nolineflag, toknumflag, rawtokenumflag, noparserflag): with...
-	(no_lineflag, token_tableflag, rawflag, no_parserflag): this.
-	In addition replace each `flag' with `_flag'.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	Also test parse error messages, including with YYERROR_VERBOSE.
-
-	* tests/calc.m4 (calc.y): Add support for `exp = exp' (non
-	associative).
-	Use it to check the computations.
-	Use it to check `nonassoc' is honored.
-	(AT_DATA_CALC_Y): Equip `calc.y' with YYERROR_VERBOSE when passed
-	`--yyerror-verbose'.
-	(_AT_CHECK_CALC): Adjust to this option.
-	(_AT_CHECK_CALC_ERROR): New macro to check parse error messages.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	Test also `--verbose', `--defines' and `--name-prefix'.  Testing
-	the latter demonstrates a flaw in the handling of non debugging
-	parsers introduced by myself on 2000-03-16: `#define yydebug 0'
-	was used in order to simplify:
-
-	#if YYDEBUG
-	if (yydebug)
-	{
-	...
-	}
-	#endif
-
-	into
-
-	if (yydebug)
-	{
-	...
-	}
-
-	unfortunately this leads to a CPP conflict when
-	`--name-prefix=foo' is used since it produces `#define yydebug
-	foodebug'.
-
-	* src/bison.s1 [!YYDEBUG]: Do not define yydebug.
-	(YYDPRINTF): New macro.
-	Spread its use.
-	* tests/calc.m4 (AT_CHECK_CALC): Do require a title, build it from
-	the bison options.
-	Also test `--verbose', `--defines' and `--name-prefix'.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	Improve the readability of the produced parsers.
-
-	* src/bison.s1: Formatting changes.
-	Improve the comment related to the `$' mark.
-	(yydefault): Don't fall through to `yyresume': `goto' there.
-	* src/output.c (output_parser): When the `$' is met, skip the end
-	of its line.
-	New variable, `number_of_dollar_signs', to check there's exactly
-	one `$' in the parser skeleton.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* lib/xstrdup.c: New file, from the fileutils.
-	* src/reader.c (parse_token_decl, get_type_name, parse_type_decl)
-	(parse_assoc_decl, parse_thong_decl, get_type): Use `xstrdup'
-	instead of strlen + xmalloc + strcpy.
-	* src/symtab.c (copys): Remove, use xstrdup instead.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/gram.h (associativity): New enum type which replaces the
-	former CPP macros `RIGHT_ASSOC', `LEFT_ASSOC' and `NON_ASSOC' with
-	`right_assoc', `left_assoc' and `non_assoc'.
-	Adjust all dependencies.
-	* src/reader.c: Formatting changes.
-	(LTYPESTR): Don't define it, use it as a literal in
-	`reader_output_yylsp'.
-	* src/symtab.h (symbol_class): New enum type which replaces the
-	former CPP macros `SUNKNOWN', `STOKEN and `SNTERM' with
-	`sunknown', `stoken and `snterm'.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/getargs.c (fixed_outfiles): Rename as...
-	(yaccflag): for consistency and accuracy.
-	Adjust dependencies.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	Use the more standard files `xalloc.h' and `xmalloc.c' instead of
-	Bison's `allocate.c' and `alloc.h'.  This patch was surprisingly
-	difficult and introduced a lot of core dump.  It turns out that
-	Bison used an implementation of `xmalloc' based on `calloc', and
-	at various places it does depend upon the initialization to 0.  I
-	have not tried to isolate the pertinent places, and all the former
-	calls to Bison's `xmalloc' are now using `XCALLOC'.  Someday,
-	someone should address this issue.
-
-	* src/allocate.c, src/alloc.h, m4/bison-decl.m4: Remove.
-	* lib/xmalloc.c, lib/xalloc.h, m4/malloc.m4, m4/realloc.m4: New
-	files.
-	Adjust dependencies.
-	* src/warshall.h: New file.
-	Propagate.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	Various anti-`extern in *.c' changes.
-
-	* src/system.h: Include `assert.h'.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/state.h (nstates, final_state, first_state, first_shift)
-	(first_reduction): Move their exportation from here...
-	* src/LR0.h: to here.
-	Adjust dependencies.
-	* src/getargs.c (statisticsflag): New variable.
-	Add support for `--statistics'.
-	Adjust dependencies.
-
-	Remove a lot of now useless `extern' statements in most files.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/LR0.h: New file.
-	Propagate its use.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/print.h: New file.
-	Propagate its use.
-	* src/print.c: Formatting and ordering changes.
-	(verbose, terse): Replace with...
-	(print_results): this new function.
-	Adjust dependencies.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/conflicts.c (conflict_report): New function.
-	(conflict_log, verbose_conflict_log): Replace with...
-	(print_conflicts): this function.
-	Adjust dependencies.
-	* src/conflicts.h: New file.
-	Propagate its inclusion.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/nullable.h: New file.
-	Propagate its inclusion.
-	* src/nullable.c: Formatting changes.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/reduce.h: New file.
-	Propagate its inclusion.
-	* src/reduce.c: Topological sort and other formatting changes.
-	(bool, TRUE, FALSE): Move their definition to...
-	* src/system.h: here.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c: Formatting changes.
-	(tryopen, tryclose, openfiles): Rename as...
-	(xfopen, xfclose, open_files): this.
-	(stringappend): static.
-	* src/files.h: Complete the list of exported symbols.
-	Propagate its use.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.h: New file.
-	Propagate its use instead of tedious list of `extern' and
-	prototypes.
-	* src/reader.c: Formatting changes, topological sort,
-	s/register//.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/lex.h: Prototype `lex.c' exported functions.
-	* src/reader.c: Adjust.
-	* src/lex.c: Formatting changes.
-	(safegetc): Rename as...
-	(xgetc): this.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/lalr.h: New file.
-	Propagate its inclusion instead of prototypes and `extern'.
-	* src/lalr.c: Formatting changes, topological sorting etc.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (token_actions): Introduce a temporary array,
-	YYDEFACT, that makes it possible for this function to use
-	output_short_table.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	`user_toknums' is output as a `short[]' in `output.c', while it is
-	defined as a `int[]' in `reader.c'.  For consistency with the
-	other output tables, `user_toknums' is now defined as a table of
-	shorts.
-
-	* src/reader.c (user_toknums): Be a short table instead of an int
-	table.
-	Adjust dependencies.
-
-	Factor the short table outputs.
-
-	* src/output.c (output_short_table): New function.
-	* src/output.c (output_gram, output_stos, output_rule_data)
-	(output_base, output_table, output_check):  Use it.
-
-2000-10-02  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output): Topological sort of the functions, in
-	order to get rid of the `static' prototypes.
-	No longer use `register'.
-	* src/output.h: New file.
-	Propagate its inclusion in files explicitly prototyping functions
-	from output.c.
-
-2000-09-21  Akim Demaille  <akim@epita.fr>
-
-	* src/atgeneral.m4: Update from Autoconf.
-
-2000-09-21  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.h: New file.
-	* src/closure.c: Formatting changes, topological sort over the
-	functions, use of closure.h.
-	(initialize_closure, finalize_closure):  Rename as...
-	(new_closure, free_closure): these.  Adjust dependencies.
-	* src/LR0.c: Formatting changes, topological sort, use of
-	cloture.h.
-	(initialize_states): Rename as...
-	(new_states): this.
-	* src/Makefile.am (noinst_HEADERS): Adjust.
-
-2000-09-20  Akim Demaille  <akim@epita.fr>
-
-	* src/acconfig.h: Don't protect config.h against multiple
-	inclusion.
-	Don't define PARAMS.
-	* src/system.h: Define PARAMS.
-	Remove some of the ad-hoc CPP magic for DOS, VMS etc.: this is the
-	purpose of config.h.  system.h must not try to fix wrong
-	definitions in config.h.
-
-2000-09-20  Akim Demaille  <akim@epita.fr>
-
-	* src/derives.h: New file.
-	* src/main.c, src/derives.h: Use it.
-	Formatting changes.
-	* src/Makefile.am (noinst_HEADERS): Adjust.
-
-2000-09-20  Akim Demaille  <akim@epita.fr>
-
-	* tests/atgeneral.m4: Update from Autoconf.
-	* tests/calc.m4 (_AT_DATA_CALC_Y, AT_DATA_CALC_Y, _AT_CHECK_CALC)
-	(AT_CHECK_CALC): New macros.
-	Use these macros to test bison with options `', `--raw',
-	`--debug', `--yacc', `--yacc --debug'.
-
-2000-09-19  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c: Formatting changes.
-	* src/machine.h: Remove, leaving its contents in...
-	* src/system.h: here.
-	Include stdio.h.
-	Adjust all dependencies on stdio.h and machine.h.
-	* src/getargs.h: New file.
-	Let all `extern' declarations about getargs.c be replaced with
-	inclusion of `getargs.h'.
-	* src/Makefile.am (noinst_HEADERS): Adjust.
-
-	* tests/calc.m4 (yyin): Be initialized in main, not on the global
-	scope.
-	(yyerror): Returns void, not int.
-	* doc/bison.texinfo: Formatting changes.
-
-2000-09-19  Akim Demaille  <akim@epita.fr>
-
-	* tests/calc.m4 (calc.y): Do not assign to stdin, as it's not
-	portable.
-
-2000-09-18  Akim Demaille  <akim@epita.fr>
-
-	* configure.in: Append WARNING_CFLAGS to CFLAGS.
-	* src/Makefile.am (INCLUDES): Don't.
-	Be ready to fetch headers in lib/.
-
-2000-09-18  Akim Demaille  <akim@epita.fr>
-
-	* doc/bison.texinfo: Update the copyright.
-	ANSIfy and GNUify the examples.
-	Remove the old menu.
-
-2000-09-18  Akim Demaille  <akim@epita.fr>
-
-	First set of tests: use the `calc' example from the documentation.
-
-	* src/bison.s1 (yyparse): Condition the code using `yytname' which
-	is defined only when YYDEBUG is.
-	* m4/atconfig.m4 (AT_CONFIG): Adjust to Autoconf 2.13.
-	* src/files.c (tryopen, tryclose): Formatting changes.
-	Move to the top and be static.
-	* src/reader.c (read_signed_integer): Likewise.
-	* tests/calc.m4: New file.
-	* Makefile.am, suite.m4: Adjust.
-	* m4/atconfig.m4: Set BISON_SIMPLE and BISON_HAIRY.
-
-2000-09-18  Akim Demaille  <akim@epita.fr>
-
-	Add support for an Autotest test suite for Bison.
-
-	* m4/m4.m4, m4/atconfig.m4: New files.
-	* m4/Makefile.am (EXTRA_DIST): Adjust.
-	* tests/suite.m4, tests/Makefile.am, tests/atgeneral.m4: New
-	files.
-	* src/getargs.c: Display a more standard --version message.
-	* src/reader.c (reader): Formatting changes.
-	No longer depend upon VERSION_STRING.
-	* configure.in: No longer use `dnl'.
-	Set up the test suite and the new directory `tests/.
-	(VERSION_STRING): Remove.
-
-2000-04-14  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (copy_comment2): New function, same as former
-	`copy_comment', but outputs into two FILE *.
-	(copy_comment): Use it.
-	(parse_union_decl): Use it.
-	(get_type, parse_start_decl): Use the same `invalid' message.
-	(parse_start_decl, parse_union_decl): Use the same `multiple'
-	message.
-	(parse_union_decl, copy_guard, copy_action): Use the same
-	`unmatched' message.
-	* m4/Makefile.am (EXTRA_DIST): Add `warning.m4'.
-
-2000-03-31  Akim Demaille  <akim@epita.fr>
-
-	* src/files.c (tryopen, tryclose): Move to the top.
-	Be static.
-
-2000-03-31  Akim Demaille  <akim@epita.fr>
-
-	* src/main.c (main): Don't call `done', exit does it.
-
-2000-03-31  Akim Demaille  <akim@epita.fr>
-
-	* allocate.c: s/return (foo)/return foo/.
-	* lalr.c: Likewise.
-	* LR0.c: Likewise.
-	* output.c: Likewise.
-	* reader.c: Likewise.
-	* symtab.c: Likewise.
-	* vmsgetargs.c: Likewise.
-
-2000-03-31  Akim Demaille  <akim@epita.fr>
-
-	Clean up the error reporting functions.
-
-	* src/report.c: New file.
-	* src/report.h: Likewise.
-	* src/Makefile.am: Adjust.
-	* m4/error.m4: New file.
-	* m4/Makefile.am: Adjust.
-	* configure.in (jm_PREREQ_ERROR): Call it.
-	* src/main.c (int_to_string, banner, fatal_banner, warn_banner):
-	Remove.
-	(fatal, fatals): Remove.  All callers use complain.c::fatal.
-	(warn, warni, warns, warnss, warnss): Remove.  All callers use
-	complain.c::complain.
-	(toomany): Remove, use fatal instead.
-	* src/files.c (done): No argument, use complain_message_count.
-	* src/main.c (main): Register `done' to `atexit'.
-
-	* src/getargs.c (usage): More `fputs', less `fprintf'.
-
-2000-03-28  Akim Demaille  <akim@epita.fr>
-
-	* lib/: New directory.
-	* Makefile.am (SUBDIRS): Adjust.
-	* configure.in: Adjust.
-	(LIBOBJS): Although not used yet, AC_SUBST it, otherwise it's
-	useless.
-	* src/alloca.c: Moved to lib/.
-	* src/getopt.c: Likewise.
-	* src/getopt1.c: Likewise.
-	* src/getopt.h: Likewise.
-	* src/ansi2knr.c: Likewise.
-	* src/ansi2knr.1: Likewise.
-	* src/Makefile.am: Adjust.
-	* lib/Makefile.am: New file.
-
-2000-03-28  Akim Demaille  <akim@epita.fr>
-
-	* src/getargs.c (usage): Refresh the help message.
-
-2000-03-17  Akim Demaille  <akim@epita.fr>
-
-	* src/getopt1.c: Updated from textutils 2.0e
-	* src/getopt.c: Likewise.
-	* src/getopt.h: Likewise.
-
-2000-03-17  Akim Demaille  <akim@epita.fr>
-
-	* src/Makefile.am (bison.simple): Fix the awk program: quote only
-	the file name, not the whole `#line LINE FILE'.
-
-2000-03-17  Akim Demaille  <akim@epita.fr>
-
-	On syntax errors, report the token on which we choked.
-
-	* src/bison.s1 (yyparse): In the label yyerrlab, when
-	YYERROR_VERBOSE, add yychar in msg.
-
-2000-03-17  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (copy_at): New function.
-	(copy_guard): Use it.
-	(copy_action): Use it.
-
-2000-03-17  Akim Demaille  <akim@epita.fr>
-
-	Be kind to translators, save some useless translations.
-
-	* src/main.c (banner): New function.
-	(fatal_banner): Use it.
-	(warn_banner): Use it.
-
-2000-03-17  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (copy_definition): Use copy_string and
-	copy_comment.  Removed now unused `match', `ended',
-	`cplus_comment'.
-	(copy_comment, copy_string): Moved, to be visible from
-	copy_definition.
-
-2000-03-17  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (copy_string): Declare `static inline'.  No
-	problems with inline, since it is checked by configure.
-	(copy_comment): Likewise.
-
-2000-03-17  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (packsymbols): Formatting changes.
-
-2000-03-17  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (copy_comment): New function, factored out from:
-	(copy_action): Use it.  Removed now unused `match', `ended',
-	`cplus_comment'.
-	(copy_guard): Likewise.
-
-2000-03-17  Akim Demaille  <akim@epita.fr>
-
-	* src/reader.c (copy_string): New function, factored out from:
-	(copy_action): Use it.
-	(copy_guard): Likewise.
-
-2000-03-17  Akim Demaille  <akim@epita.fr>
-
-	Change the handling of @s so that they behave exactly like $s.
-	There is now a pseudo variable @$ (readble and writable), location
-	of the lhs of the rule (by default ranging from the location of
-	the first symbol of the rhs, to the location of the last symbol,
-	or, if the rhs is empty, YYLLOC).
-
-	* src/bison.s1 [YYLSP_NEEDED] (yyloc): New variable, twin of
-	yyval.
-	(yyparse): When providing a default semantic action, provide a
-	default location action.
-	(after the $): No longer change `*YYLSP', just stack YYLOC the
-	same way you stack YYVAL.
-	* src/reader.c (read_declarations): Use warns.
-	(copy_guard, case '@'): Also recognize `@$', expanded as `YYLOC'.
-	(copy_action, case '@'): Likewise.
-	Use a standard error message, to save useless work from
-	translators.
-
-2000-03-17  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.s1: Formatting and cosmetics changes.
-	* src/reader.c: Likewise.
-	Update the Copyright notice.
-
-2000-03-17  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.s1 (#line): All set to `#line' only, since the
-	Makefile now handles them.
-
-2000-03-16  Akim Demaille  <akim@epita.fr>
-
-	* src/output.c (output_rule_data): Output the documentation of
-	some of the tables.
-	(Copyright notice): Update.
-	Formatting changes.
-
-2000-03-16  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.s1 [!YYDEBUG]: Define yydebug to 0.  This allows to
-	remove most `#if YYDEBUG != 0', since `if (yydebug)' is enough.
-	One `#if YYDEBUG' remains, since it uses variables which are
-	defined only if `YYDEBUG != 0'.
-
-2000-03-16  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.s1 (yyparse): Reorganize the definitions of the stacks
-	and related variables so that the similarities are highlighted.
-
-2000-03-16  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.s1: Properly indent CPP directives.
-
-2000-03-16  Akim Demaille  <akim@epita.fr>
-
-	* src/bison.s1: Properly indent the `alloca' CPP section.
-
-2000-03-16  Akim Demaille  <akim@epita.fr>
-
-	Do not hard code values of directories in `configure.in'.
-	Update the `configure' tool chain.
-
-	* configure.in (XPFILE, XPFILE1, LOCALEDIR): Remove, handled by
-	src/makefile.am.
-	(VERSION_STRING): Use the third arg of AC_DEFINE_UNQUOTED.
-	(AC_OUTPUT): Add m4/Makefile.
-	Bump to bison 1.28a, 1.29 has never been released.
-	* acconfig.h (XPFILE, XPFILE1, LOCALEDIR): Remove, since they are
-	handled via src/Makefile.am.
-	(VERSION_STRING, PROTOTYPES, ENABLE_NLS, HAVE_CATGETS,
-	HAVE_GETTEXT, HAVE_LC_MESSAGES, HAVE_STPCPY): Remove, handled by
-	autoheader.
-	* Makefile.am (SUBDIRS): Add m4.
-	(ACLOCAL_AM_FLAGS): New variable.
-	(AUTOMAKE_OPTIONS): Add check-news.
-	* src/Makefile.am (bison.simple): Use awk to replace #line lines with
-	the proper line number and file name.
-	(DEFS): Propagate the location of bison library files and of the
-	locale files.
-	(INCLUDES): Added `-I ..' so that one can compile with srcdir !=
-	builddir.
-	* acinclude.m4: Remove, replaced by the directory m4.
-	* m4/Makefile.am (EXTRA_DIST): New variable.
-	* m4/gettext.m4: New file, from the fileutils.
-	* m4/lcmessage.m4: Likewise
-	* m4/progtest.m4: Likewise.
-	* m4/bison-decl.m4: New file, extracted from former acinclude.m4.
-
-2000-03-10  Akim Demaille  <akim@epita.fr>
-
-	* src/closure.c:
-	Formatting changes of various comments.
-	Respect the GNU coding standards at various places.
-	Don't use `_()' when no translation is needed.
-
-1999-12-13  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/files.c:
-	OS/2 honors TMPDIR environment variable.
-
-1999-12-13  Jesse Thilo  <jthilo@gnu.org>
-
-	* doc/bison.texinfo: Tweaked spelling and grammar.
-	Updated ISBN.
-	Removed reference to price of printed copy.
-	Mention BISON_SIMPLE and BISON_HAIRY.
-
-1999-12-13  Jesse Thilo  <jthilo@gnu.org>
-
-	* configure.in, NEWS:
-	Bison 1.29 released.
-
-1999-10-27  Jesse Thilo  <jthilo@gnu.org>
-
-	* doc/.cvsignore, doc/Makefile.am, doc/refcard.tex:
-	Added reference card.
-
-1999-07-26  Jesse Thilo  <jthilo@gnu.org>
-
-	* po/ru.po: Added Russian translation.
-
-1999-07-26  Jesse Thilo  <jthilo@gnu.org>
-
-	* configure.in: Added Russian translation.
-
-1999-07-06  Jesse Thilo  <jthilo@gnu.org>
-
-	* configure.in, NEWS, README:
-	Released version 1.28.
-
-1999-06-14  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/system.h:
-	Squashed redefinition warning on some systems.
-
-	* src/getargs.c, src/Makefile.am, src/reader.c, src/version.c:
-	Have configure build version string instead of relying on ANSI string
-	concatentation.
-
-1999-06-14  Jesse Thilo  <jthilo@gnu.org>
-
-	* po/POTFILES.in: Got rid of version.c.
-
-1999-06-14  Jesse Thilo  <jthilo@gnu.org>
-
-	* acconfig.h, configure.in:
-	Have configure build version string instead of relying on ANSI string
-	concatentation.
-
-1999-06-08  Jesse Thilo  <jthilo@gnu.org>
-
-	* doc/bison.1:
-	Dropped mention of `+' for long-named options.
-
-1999-05-30  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/files.c: Added <unistd.h> for unlink().
-
-	* src/Makefile.am, src/system.h:
-	I18n fixes.
-
-1999-05-30  Jesse Thilo  <jthilo@gnu.org>
-
-	* README: Added a FAQ list.
-
-	* configure.in, acconfig.h:
-	I18n fixes.
-
-1999-05-30  Jesse Thilo  <jthilo@gnu.org>
-
-	* doc/FAQ, doc/Makefile.am:
-	Added a FAQ list.
-
-1999-05-19  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/alloc.h, src/symtab.h, src/version.c:
-	Protected inclusion of "config.h" with HAVE_CONFIG_H.
-
-1999-04-18  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/.cvsignore, src/Makefile.am:
-	Reorganized: sources in `src', documentation in `doc'.
-
-	* src/lex.c (literalchar):
-	fixed the code for escaping double quotes (thanks
-	Jonathan Czisny.)
-
-1999-04-18  Jesse Thilo  <jthilo@gnu.org>
-
-	* po/de.po, po/es.po, po/fr.po, po/nl.po, po/POTFILES.in:
-	Adjusted paths to reflect directory reorganization.
-
-1999-04-18  Jesse Thilo  <jthilo@gnu.org>
-
-	* doc/.cvsignore, doc/Makefile.am:
-	Reorganized: sources in `src', documentation in `doc'.
-
-1999-04-18  Jesse Thilo  <jthilo@gnu.org>
-
-	* configure.in:
-	Updated AC_INIT file to reflect directory reorganization.
-
-	* configure.in, .cvsignore, Makefile.am, POTFILES.in:
-	Reorganized: sources in `src', documentation in `doc'.
-
-1999-04-13  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/allocate.c:
-	Don't declare calloc() and realloc() if not necessary.
-
-1999-04-13  Jesse Thilo  <jthilo@gnu.org>
-
-	* configure.in, acconfig.h, acinclude.m4:
-	Don't declare calloc() and realloc() if not necessary.
-
-1999-03-23  Jesse Thilo  <jthilo@gnu.org>
-
-	* po/.cvsignore: Added i18n support.
-
-1999-03-23  Jesse Thilo  <jthilo@gnu.org>
-
-	* acconfig.h, configure.in, Makefile.am:
-	Added i18n support.
-
-1999-03-22  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/bison.s1: Fixed #line numbers.
-
-1999-03-15  Jesse Thilo  <jthilo@gnu.org>
-
-	* po/es.po, po/fr.po, po/nl.po, po/de.po:
-	Added PO files from Translation Project.
-
-1999-03-03  Jesse Thilo  <jthilo@gnu.org>
-
-	* Makefile.am:
-	Added support for non-ANSI compilers (ansi2knr).
-
-1999-02-16  Jesse Thilo  <jthilo@gnu.org>
-
-	* configure.in: Bumped version number to 1.27.
-
-	* Makefile.am:
-	Added `bison.simple' to list of files removed by `make distclean'.
-
-1999-02-12  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/files.c, src/files.h:
-	Defined locations of parser files in config.h instead of Makefile.
-
-1999-02-12  Jesse Thilo  <jthilo@gnu.org>
-
-	* acconfig.h, acinclude.m4, configure.in, Makefile.am:
-	Defined locations of parser files in config.h instead of Makefile.
-
-1999-02-09  Jesse Thilo  <jthilo@gnu.org>
-
-	* Makefile.am:
-	Removed inappropriate use of $< macro.
-
-1999-02-05  Jesse Thilo  <jthilo@gnu.org>
-
-	* po/Makefile.in.in, po/POTFILES.in:
-	Add `po' directory skeleton.
-
-1999-01-27  Jesse Thilo  <jthilo@gnu.org>
-
-	* README: Document help-bison list.
-
-	* configure.in: Add check for mkstemp().
-
-1999-01-20  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/conflicts.c, src/LR0.c, src/output.c, src/reader.c:
-	Hush a few compiler warnings.
-
-	* src/files.c:
-	Add tryclose(), which verifies that fclose was successful.
-	Hush a couple of compiler warnings.
-
-1999-01-20  Jesse Thilo  <jthilo@gnu.org>
-
-	* Makefile.am, OChangeLog:
-	ChangeLog is now automatically generated.  Include the old version as
-	OChangeLog.
-
-1999-01-14  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/gram.h, src/lalr.c, src/lex.c, src/lex.h, src/machine.h, src/main.c, src/nullable.c, src/output.c, src/print.c, src/reader.c, src/reduce.c, src/state.h, src/symtab.c, src/symtab.h, src/types.h, src/vmsgetargs.c, src/warshall.c, src/allocate.c, src/alloc.h, src/bison.s1, src/closure.c, src/conflicts.c, src/derives.c, src/files.c, src/files.h, src/getargs.c, src/gram.c, src/LR0.c:
-	Update FSF address.
-
-1999-01-14  Jesse Thilo  <jthilo@gnu.org>
-
-	* doc/bison.texinfo: Fix formatting glitch.
-
-	* doc/bison.texinfo: Update FSF address.
-
-1999-01-14  Jesse Thilo  <jthilo@gnu.org>
-
-	* acconfig.h: Update FSF address.
-
-1999-01-08  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/system.h:
-	Don't define PACKAGE here, since config.h defines it.
-
-1998-12-30  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/reader.c: Update copyright date.
-
-	* src/main.c:
-	Ditch sprintf to statically-sized buffers in fatal/warn functions in
-	favor of output directly to stderr (avoids buffer overruns).
-
-	* src/reader.c: Some checks for premature EOF.
-
-	* src/allocate.c, src/alloc.h, src/closure.c, src/conflicts.c, src/derives.c, src/getargs.c, src/gram.c, src/lalr.c, src/lex.c, src/LR0.c, src/main.c, src/nullable.c, src/output.c, src/print.c, src/reduce.c, src/symtab.c, src/symtab.h, src/warshall.c:
-	Use prototypes if the compiler understands them.
-
-	* src/files.c: Honor TMPDIR on Unix hosts.
-	Use prototypes if the compiler understands them.
-
-	* src/reader.c:
-	Fix a couple of buffer overrun bugs.
-	Use prototypes if the compiler understands them.
-
-	* src/system.h: Include unistd.h and ctype.h.
-	Use #ifdef instead of #if for NLS symbols.
-
-1998-12-30  Jesse Thilo  <jthilo@gnu.org>
-
-	* doc/bison.texinfo:
-	Delete comment "consider using @set for edition number, etc..." since
-	we now are doing so.
-
-1998-12-30  Jesse Thilo  <jthilo@gnu.org>
-
-	* configure.in:
-	Use prototypes if the compiler understands them.
-
-	* NEWS: Document 1.26 highlights.
-
-	* Makefile.am: Require Automake 1.3 or later.
-
-	* acconfig.h:
-	Use prototypes if the compiler understands them.
-
-1998-12-29  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/version.c:
-	Use VERSION symbol from automake for version number.
-
-1998-12-29  Jesse Thilo  <jthilo@gnu.org>
-
-	* acconfig.h, configure.in, version.cin:
-	Use VERSION symbol from automake for version number.
-
-1998-11-28  Jesse Thilo  <jthilo@gnu.org>
-
-	* Makefile.am:
-	Distribute original version of simple parser (bison.s1), not built
-	version (bison.simple).
-
-1998-11-28  Jesse Thilo  <jthilo@gnu.org>
-
-	* doc/bison.texinfo: Add info dir entry.
-
-	* doc/bison.texinfo:
-	Let automake put version number into documentation.
-
-1998-11-26  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/bison.cld, src/build.com, src/vmshlp.mar:
-	Add non-RCS files from /gd/gnu/bison.
-
-1998-11-26  Jesse Thilo  <jthilo@gnu.org>
-
-	* doc/bison.1:
-	Document the BISON_HAIRY and BISON_SIMPLE variables.
-
-1998-11-25  Jesse Thilo  <jthilo@gnu.org>
-
-	* src/version.c: Build version.c automatically.
-
-	* src/reader.c:
-	Fix token numbering (used to start at 258, not 257).
-
-	* src/system.h: Include config.h.
-
-	* src/getargs.c: Update bug report address.
-
-	* src/alloca.c, src/getopt1.c, src/getopt.c, src/getopt.h:
-	Get latest copies of alloca.c, getopt.c, getopt.h, getopt1.c from gnu.org.
-
-1998-11-25  Jesse Thilo  <jthilo@gnu.org>
-
-	* Makefile.am:
-	Rename bison.simple to bison.s1 (bison.simple is then built from bison.s1).
-
-	* configure.in, version.cin:
-	Build version.c automatically.
-
-	* AUTHORS: Add AUTHORS file.
-
-	* README: Update bug report address.
-
-	* bison.simple:
-	Rename bison.simple to bison.s1 (bison.simple is then built from bison.s1).
-
-	* configure.in, Makefile.am, Makefile.in, stamp-h.in:
-	Add automake stuff.
-
-1998-11-25  Jesse Thilo  <jthilo@gnu.org>
-
-	* doc/bison.texinfo: Clean up some formatting.
-
-1998-05-05  Richard Stallman  <rms@gnu.org>
-
-	* doc/bison.texinfo:
-	Explain better why to make a pure parser.
-
-1998-01-05  Richard Stallman  <rms@gnu.org>
-
-	* src/files.c (openfiles):
-	[_WIN32 && !__CYGWIN32__] Use TEMP or Temp to
-	find a temporary directory, if possible.  Do not unlink files while
-	they are open.
-
-1997-08-25  Richard Stallman  <rms@gnu.org>
-
-	* src/reader.c (stack_offset;):
-	Change some warni to warns.
-
-	* src/lex.c (literalchar): Use warns, not warni.
-
-1997-06-28  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1: Add a Bison version comment.
-
-	* src/main.c (fatal, warn, berror):
-	Use program_name.
-
-1997-06-28  Richard Stallman  <rms@gnu.org>
-
-	* Makefile.in (bison_version): New variable.
-	(dist): Use that variable.
-	(bison.s1): Substitute the Bison version into bison.simple.
-
-	* bison.simple: Add a Bison version comment.
-
-1997-06-18  Richard Stallman  <rms@gnu.org>
-
-	* src/main.c (fatal, warn, berror):
-	Make error messages standard.
-	(toomany): Improve error message text.
-
-	* src/LR0.c, src/closure.c, src/conflicts.c, src/derives.c, src/files.c, src/lalr.c, src/lex.c, src/nullable.c, src/output.c, src/print.c, src/reader.c, src/reduce.c, src/symtab.c:
-	new.h renamed to alloc.h.
-
-1997-06-18  Richard Stallman  <rms@gnu.org>
-
-	* Makefile.in: new.h renamed to alloc.h.
-
-1997-05-24  Richard Stallman  <rms@gnu.org>
-
-	* src/lex.c (literalchar):
-	Fix the code for escaping \, " and '.
-
-	(lex): Avoid trouble when there are many chars
-	to discard in a char literal with just several chars in it.
-
-1997-05-17  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1:
-	Use malloc, if using alloca is troublesome.
-	(YYSTACK_USE_ALLOCA): New flag macro.
-	Define it for some systems and compilers.
-	(YYSTACK_ALLOC): New macro.
-	(yyparse): Use YYSTACK_ALLOC to allocate stack.
-	If it was malloc'd, free it.
-
-1997-05-17  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple:
-	Use malloc, if using alloca is troublesome.
-	(YYSTACK_USE_ALLOCA): New flag macro.
-	Define it for some systems and compilers.
-	(YYSTACK_ALLOC): New macro.
-	(yyparse): Use YYSTACK_ALLOC to allocate stack.
-	If it was malloc'd, free it.
-
-1997-04-23  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1:
-	(alloca) [__hpux]: Always define as __builtin_alloca.
-
-1997-04-23  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple:
-	(alloca) [__hpux]: Always define as __builtin_alloca.
-
-1997-04-22  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1:
-	[__hpux]: Include alloca.h (right for HPUX 10)
-	instead of declaring alloca (right for HPUX 9).
-
-	* src/bison.s1 (__yy_memcpy):
-	Declare arg `count' as unsigned int.
-	(yyparse): Cast third arg to __yy_memcpy to unsigned int.
-
-1997-04-22  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple:
-	[__hpux]: Include alloca.h (right for HPUX 10)
-	instead of declaring alloca (right for HPUX 9).
-
-	* bison.simple (__yy_memcpy):
-	Declare arg `count' as unsigned int.
-	(yyparse): Cast third arg to __yy_memcpy to unsigned int.
-
-1997-01-03  Richard Stallman  <rms@gnu.org>
-
-	* src/allocate.c: [__STDC__ or _MSC_VER]:
-	Declare calloc and realloc to return void *.
-
-1997-01-02  Richard Stallman  <rms@gnu.org>
-
-	* src/system.h:
-	[_MSC_VER]: Include stdlib.h and process.h.
-	[_MSC_VER] (getpid): Define as macro--translate it to _getpid.
-
-	* src/main.c (main): Return FAILURE as a value.
-	(printable_version): Declare arg as int, not char.
-
-1997-01-02  Richard Stallman  <rms@gnu.org>
-
-	* Makefile.in (dist):
-	Explicitly check for symlinks, and copy them.
-
-1996-12-19  Richard Stallman  <rms@gnu.org>
-
-	* src/files.c:
-	[_MSC_VER] (XPFILE, XPFILE1): Define, if not already defined.
-
-1996-12-18  Paul Eggert  <eggert@gnu.org>
-
-	* src/bison.s1 (yyparse):
-	If __GNUC__ and YYPARSE_PARAM are both defined,
-	declare yyparse to have a void * argument.
-
-1996-12-18  Paul Eggert  <eggert@gnu.org>
-
-	* bison.simple (yyparse):
-	If __GNUC__ and YYPARSE_PARAM are both defined,
-	declare yyparse to have a void * argument.
-
-1996-12-17  Richard Stallman  <rms@gnu.org>
-
-	* src/reduce.c (nbits): Add some casts.
-
-1996-08-12  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1: Test _MSDOS as well as _MSDOS_.
-
-1996-08-12  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple: Test _MSDOS as well as _MSDOS_.
-
-1996-07-31  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1:
-	[__sun && __i386]: Include alloca.h.
-
-1996-07-31  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple:
-	[__sun && __i386]: Include alloca.h.
-
-1996-07-30  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1: Comment change.
-
-	* src/bison.s1: Test _MSDOS_, not MSDOS.
-
-1996-07-30  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple: Comment change.
-
-	* bison.simple: Test _MSDOS_, not MSDOS.
-
-1996-06-01  Richard Stallman  <rms@gnu.org>
-
-	* src/reduce.c, src/reader.c, src/print.c, src/output.c, src/nullable.c, src/lex.c, src/lalr.c, src/getargs.c, src/derives.c, src/conflicts.c, src/closure.c, src/allocate.c:
-	Insert `_' macro around many string constants.
-
-	* src/main.c:
-	Insert `_' macro around many string constants.
-
-	(main): Call setlocale, bindtextdomain and textdomain.
-
-	* src/system.h: [HAVE_LOCALE_H]: Include locale.h.
-	[! HAVE_LOCALE_H] (setlocale): Define as no-op.
-	[ENABLE_NLS]: Include libintl.h.
-	[ENABLE_NLS] (gettext): Define.
-	[! ENABLE_NLS] (bintextdomain, textdomain, _): Consolation definitions.
-	(N_, PACKAGE, LOCALEDIR): New macros.
-
-1996-06-01  Richard Stallman  <rms@gnu.org>
-
-	* POTFILES.in: New file.
-
-	* Makefile.in (allocate.o):
-	Define target explicitly.
-
-	* Makefile.in (CFLAGS): Set to @CFLAGS@.
-	(LDFLAGS): Set to @LDFLAGS@.
-	(configure): Run autoconf only if preceding `cd' succeeds.
-	(bison.s1): Redirect output to temporary file then move the
-	temporary to the target, rather than redirecting directly to bison.s1.
-	(clean): Remove config.status and config.log.
-	(distclean): Don't remove config.status here.
-
-1996-05-12  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1:
-	(__yy_memcpy) [__cplusplus]: Reorder declarations of variables f and t.
-
-1996-05-12  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple:
-	(__yy_memcpy) [__cplusplus]: Reorder declarations of variables f and t.
-
-1996-05-11  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1 (__yy_memcpy):
-	Really reorder the args, as was supposedly done on Feb 14 1995.
-	(yyparse): Calls changed accordingly.
-
-1996-05-11  Richard Stallman  <rms@gnu.org>
-
-	* Makefile.in (dist): Don't use $(srcdir).
-
-	* bison.simple (__yy_memcpy):
-	Really reorder the args, as was supposedly done on Feb 14 1995.
-	(yyparse): Calls changed accordingly.
-
-1996-01-27  Richard Stallman  <rms@gnu.org>
-
-	* src/output.c (output_rule_data):
-	Test YYERROR_VERBOSE in the conditional
-	around the definition of ttyname.
-
-1995-12-29  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1:
-	Fix line numbers in #line commands.
-
-1995-12-29  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple:
-	Fix line numbers in #line commands.
-
-1995-12-27  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1 (YYPARSE_PARAM_DECL):
-	In C++, make it always null.
-	(YYPARSE_PARAM_ARG): New macro.
-	(yyparse): Use YYPARSE_PARAM_ARG.
-
-1995-12-27  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple (YYPARSE_PARAM_DECL):
-	In C++, make it always null.
-	(YYPARSE_PARAM_ARG): New macro.
-	(yyparse): Use YYPARSE_PARAM_ARG.
-
-1995-11-29  Richard Stallman  <rms@gnu.org>
-
-	* doc/bison.texinfo:
-	Describe literal string tokens, %raw, %no_lines, %token_table.
-
-1995-11-29  Daniel Hagerty  <hag@gnu.org>
-
-	* doc/bison.texinfo: Fixed update date
-
-1995-10-16  Richard Stallman  <rms@gnu.org>
-
-	* src/version.c: Version 1.25.
-
-1995-10-16  Richard Stallman  <rms@gnu.org>
-
-	* NEWS: *** empty log message ***
-
-1995-10-16  Richard Stallman  <rms@gnu.org>
-
-	* doc/bison.1, doc/bison.rnh:
-	Add new options.
-
-1995-10-15  Richard Stallman  <rms@gnu.org>
-
-	* src/vmsgetargs.c, src/getargs.c:
-	Added -n, -k, and -raw switches.
-	(noparserflag, toknumflag, rawtoknumflag): New variables.
-
-	* src/symtab.h (SALIAS):
-	New #define for adding aliases to %token.
-	(struct bucket): Added `alias' field.
-
-	* src/reduce.c (reduce_grammar):
-	Revise error message.
-	(print_notices): Remove final `.' from error message.
-
-	* src/reader.c (reader_output_yylsp):
-	New function.
-	(readgram): Use `#if 0' around code that accepted %command
-	inside grammar rules:  The documentation doesn't allow it,
-	and it will fail since the %command processors scan for the next %.
-	(parse_token_decl):  Extended the %token
-	declaration to allow a multi-character symbol as an alias.
-	(parse_thong_decl): New function.
-	(read_declarations): Added %thong declarations.
-	(read_declarations): Handle NOOP to deal with allowing
-	% declarations as another means to specify the flags.
-	(readgram): Allow %prec prior to semantics embedded in a rule.
-	(skip_to_char, read_declarations, copy_definition)
-	(parse_token_decl, parse_start_decl, parse_type_decl)
-	(parse_assoc_decl, parse_union_decl, parse_expect_decl)
-	(get_type_name, copy_guard, copy_action, readgram)
-	(get_type, packsymbols):  Revised most error messages.
-	Changed `fatal' to `warnxxx' to avoid aborting for error.
-	Revised and use multiple warnxxx functions to avoid using VARARGS1.
-	(read_declarations): Improve the error message for
-	an invalid character.  Do not abort.
-	(read_declarations, copy_guard, copy_action): Use
-	printable_version to avoid unprintable characters in printed output.
-	(parse_expect_decl): Error if argument to %expect exceeds 10 digits.
-	(parse_token_decl, parse_assoc_decl, parse_type_decl, get_type):
-	Allow the type of a non-terminal can be given
-	more than once, as long as all specifications give the same type.
-
-	* src/output.c:
-	(output_headers, output_trailers, output, output_gram)
-	(output_rule_data): Implement noparserflag variable.
-	Implement toknumflag variable.
-	(output): Call reader_output_yylsp to output LTYPESTR.
-
-	* src/main.c (main):
-	 If reader sees an error, don't process the grammar.
-	(fatals): Updated to not use VARARGS1.
-	(printable_version, int_to_string, warn, warni, warns, warnss)
-	(warnsss): New error reporting functions.  Avoid abort for error.
-
-	* src/lex.h:
-	Added THONG and NOOP for alias processing.
-	Added SETOPT for the new code that allows setting options with %flags.
-
-	* src/lex.c:
-	Include getopt.h.  Add some extern decls.
-	(safegetc): New function to deal with EOF gracefully.
-	(literalchar); new function to deal with reading \ escapes.
-	(lex): Use literalchar.
-	(lex): Implemented "..." tokens.
-	(literalchar, lex, parse_percent_token): Made tokenbuffer
-	always contain the token.  This includes growing the token
-	buffer while reading an integer.
-	(parse_percent_token): Replaced if-else statement with percent_table.
-	(parse_percent_token): Added % declarations as another
-	way to specify the flags -n, -l, and -r.  Also added hooks for
-	-d, -k, -y, -v, -t, -p, -b, -o, but implementation requires
-	major changes to files.c.
-	(lex) Retain in the incoming stream a character following
-	an incorrect '/'.
-	(skip_white_space, lex):  Revised most error messages
-	and changed fatal to warn to avoid aborting.
-	(percent_table):  Added %thong declarations.
-
-	* src/gram.h: Comment changes.
-
-	* src/files.c (openfiles, open_extra_files, done):
-	 Add faction flag
-	and actfile file.  Handle noparserflag.  Both for -n switch.
-
-	* src/conflicts.c (resolve_sr_conflict):
-	Remove use of alloca.
-
-1995-06-01  Jim Meyering  <meyering@gnu.org>
-
-	* doc/bison.texinfo: *** empty log message ***
-
-1995-05-06  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1: Comment change.
-
-1995-05-06  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple: Comment change.
-
-1995-05-03  Richard Stallman  <rms@gnu.org>
-
-	* src/version.c: Version now 1.24.
-
-	* src/bison.s1: Change distribution terms.
-
-	* src/version.c: Version now 1.23.
-
-1995-05-03  Richard Stallman  <rms@gnu.org>
-
-	* doc/bison.texinfo:
-	Rewrite "Conditions for Using Bison".
-	Update version to 1.24.
-
-1995-05-03  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple: Change distribution terms.
-
-1995-02-23  Richard Stallman  <rms@gnu.org>
-
-	* src/files.c: Test __VMS_POSIX as well as VMS.
-
-1995-02-14  Jim Meyering  <meyering@gnu.org>
-
-	* src/bison.s1 (__yy_memcpy):
-	Renamed from __yy_bcopy to avoid
-	confusion.  Reverse FROM and TO arguments to be consistent with
-	those of memcpy.
-
-1995-02-14  Jim Meyering  <meyering@gnu.org>
-
-	* bison.simple (__yy_memcpy):
-	Renamed from __yy_bcopy to avoid
-	confusion.  Reverse FROM and TO arguments to be consistent with
-	those of memcpy.
-
-1994-11-10  David J. MacKenzie  <djm@gnu.org>
-
-	* NEWS: reformat
-
-	* NEWS: New file.
-
-	* Makefile.in (DISTFILES): Include NEWS.
-
-	* Makefile.in (DISTFILES):
-	Include install-sh, not install.sh.
-
-	* configure.in: Update to Autoconf v2 macro names.
-
-1994-10-05  David J. MacKenzie  <djm@gnu.org>
-
-	* Makefile.in: fix typo
-
-	* Makefile.in (prefix, exec_prefix):
-	Let configure set them.
-
-1994-09-28  David J. MacKenzie  <djm@gnu.org>
-
-	* Makefile.in: Set datadir to $(prefix)/share.
-
-1994-09-15  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1:
-	Update copyright notice and GPL version.
-
-1994-09-15  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple:
-	Update copyright notice and GPL version.
-
-1994-07-12  Richard Stallman  <rms@gnu.org>
-
-	* src/reduce.c, src/reader.c:
-	entered into RCS
-
-1994-05-05  David J. MacKenzie  <djm@gnu.org>
-
-	* Makefile.in: entered into RCS
-
-1994-03-26  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1: entered into RCS
-
-1994-03-26  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple: entered into RCS
-
-1994-03-25  Richard Stallman  <rms@gnu.org>
-
-	* src/main.c: entered into RCS
-
-1994-03-24  Richard Stallman  <rms@gnu.org>
-
-	* src/conflicts.c: entered into RCS
-
-1994-01-02  Richard Stallman  <rms@gnu.org>
-
-	* Makefile.in: *** empty log message ***
-
-1993-11-21  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1: *** empty log message ***
-
-1993-11-21  Richard Stallman  <rms@gnu.org>
-
-	* doc/bison.texinfo: entered into RCS
-
-	* doc/bison.texinfo: *** empty log message ***
-
-1993-11-21  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple: *** empty log message ***
-
-1993-10-25  David J. MacKenzie  <djm@gnu.org>
-
-	* doc/bison.texinfo: *** empty log message ***
-
-1993-10-19  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1: *** empty log message ***
-
-1993-10-19  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple: *** empty log message ***
-
-1993-10-14  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1: *** empty log message ***
-
-1993-10-14  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple: *** empty log message ***
-
-1993-09-14  David J. MacKenzie  <djm@gnu.org>
-
-	* doc/bison.texinfo: *** empty log message ***
-
-1993-09-13  Noah Friedman  <friedman@gnu.org>
-
-	* Makefile.in: *** empty log message ***
-
-1993-09-10  Richard Stallman  <rms@gnu.org>
-
-	* src/conflicts.c: *** empty log message ***
-
-	* src/system.h: entered into RCS
-
-1993-09-10  Richard Stallman  <rms@gnu.org>
-
-	* doc/bison.1: entered into RCS
-
-1993-09-06  Noah Friedman  <friedman@gnu.org>
-
-	* src/version.c: entered into RCS
-
-1993-09-06  Noah Friedman  <friedman@gnu.org>
-
-	* Makefile.in: *** empty log message ***
-
-1993-07-30  David J. MacKenzie  <djm@gnu.org>
-
-	* Makefile.in: *** empty log message ***
-
-1993-07-24  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1: *** empty log message ***
-
-1993-07-24  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple: *** empty log message ***
-
-1993-07-08  David J. MacKenzie  <djm@gnu.org>
-
-	* Makefile.in: *** empty log message ***
-
-1993-07-04  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1: *** empty log message ***
-
-1993-07-04  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple: *** empty log message ***
-
-1993-06-26  David J. MacKenzie  <djm@gnu.org>
-
-	* src/getargs.c: entered into RCS
-
-1993-06-26  David J. MacKenzie  <djm@gnu.org>
-
-	* doc/bison.texinfo: *** empty log message ***
-
-	* doc/bison.1: New file.
-
-1993-06-25  Richard Stallman  <rms@gnu.org>
-
-	* src/getargs.c: New file.
-
-1993-06-16  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1: *** empty log message ***
-
-1993-06-16  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple: *** empty log message ***
-
-1993-06-03  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.s1: New file.
-
-1993-06-03  Richard Stallman  <rms@gnu.org>
-
-	* doc/bison.texinfo: *** empty log message ***
-
-1993-06-03  Richard Stallman  <rms@gnu.org>
-
-	* bison.simple: New file.
-
-1993-05-19  Richard Stallman  <rms@gnu.org>
-
-	* doc/bison.texinfo: New file.
-
-1993-05-07  Noah Friedman  <friedman@gnu.org>
-
-	* Makefile.in: *** empty log message ***
-
-1993-04-28  Noah Friedman  <friedman@gnu.org>
-
-	* src/reader.c: *** empty log message ***
-
-1993-04-23  Noah Friedman  <friedman@gnu.org>
-
-	* src/alloc.h: entered into RCS
-
-1993-04-20  David J. MacKenzie  <djm@gnu.org>
-
-	* src/version.c: *** empty log message ***
-
-	* src/files.c, src/allocate.c:
-	entered into RCS
-
-	* src/reader.c: *** empty log message ***
-
-	* src/lex.c: entered into RCS
-
-	* src/conflicts.c: New file.
-
-	* src/symtab.c: entered into RCS
-
-	* src/alloc.h: New file.
-
-	* src/LR0.c: entered into RCS
-
-1993-04-18  Noah Friedman  <friedman@gnu.org>
-
-	* src/reader.c: New file.
-
-	* src/version.c: *** empty log message ***
-
-1993-04-18  Noah Friedman  <friedman@gnu.org>
-
-	* Makefile.in: *** empty log message ***
-
-1993-04-17  Noah Friedman  <friedman@gnu.org>
-
-	* Makefile.in: *** empty log message ***
-
-1993-04-15  Richard Stallman  <rms@gnu.org>
-
-	* src/main.c, src/files.c:
-	New file.
-
-1993-04-15  Noah Friedman  <friedman@gnu.org>
-
-	* configure.in: entered into RCS
-
-	* configure.in: *** empty log message ***
-
-	* configure.in: New file.
-
-1993-04-14  Richard Stallman  <rms@gnu.org>
-
-	* Makefile.in: New file.
-
-1993-04-13  Richard Stallman  <rms@gnu.org>
-
-	* src/version.c: New file.
-
-1993-03-25  Richard Stallman  <rms@gnu.org>
-
-	* src/output.c: entered into RCS
-
-1992-09-25  Richard Stallman  <rms@gnu.org>
-
-	* configure.bat: entered into RCS
-
-1992-06-22  Richard Stallman  <rms@gnu.org>
-
-	* src/vmsgetargs.c: entered into RCS
-
-1992-06-22  Richard Stallman  <rms@gnu.org>
-
-	* doc/bison.rnh: entered into RCS
-
-1992-04-20  David J. MacKenzie  <djm@gnu.org>
-
-	* README: entered into RCS
-
-1992-01-22  Richard Stallman  <rms@gnu.org>
-
-	* src/machine.h: entered into RCS
-
-1991-12-21  Richard Stallman  <rms@gnu.org>
-
-	* src/lalr.c, src/closure.c:
-	entered into RCS
-
-1991-12-20  Richard Stallman  <rms@gnu.org>
-
-	* src/state.h: entered into RCS
-
-1991-12-18  Richard Stallman  <rms@gnu.org>
-
-	* src/print.c, src/nullable.c, src/derives.c:
-	entered into RCS
-
-1991-11-03  David J. MacKenzie  <djm@gnu.org>
-
-	* src/warshall.c, src/types.h, src/symtab.h, src/lex.h, src/gram.c, src/gram.h, src/files.h:
-	entered into RCS
-
-1988-09-09  Richard Stallman  <rms@gnu.org>
-
-	* src/bison.hairy: entered into RCS
-
-1987-12-16  Richard Stallman  <rms@gnu.org>
-
-	* REFERENCES: entered into RCS
-
-
-	-----
-
-	Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996,
-	1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free
-	Software Foundation, Inc.
-
-	Copying and distribution of this file, with or without
-	modification, are permitted provided the copyright notice and this
-	notice are preserved.
diff --git a/GNUmakefile b/GNUmakefile
deleted file mode 100644
index 675af82..0000000
--- a/GNUmakefile
+++ /dev/null
@@ -1,58 +0,0 @@
-# Having a separate GNUmakefile lets me `include' the dynamically
-# generated rules created via Makefile.maint as well as Makefile.maint itself.
-# This makefile is used only if you run GNU Make.
-# It is necessary if you want to build targets usually of interest
-# only to the maintainer.
-
-# Copyright (C) 2001, 2003 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 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, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# Systems where /bin/sh is not the default shell need this.  The $(shell)
-# command below won't work with e.g. stock DOS/Windows shells.
-ifeq ($(wildcard /bin/s[h]),/bin/sh)
-SHELL = /bin/sh
-else
-# will be used only with the next shell-test line, then overwritten
-# by a configured-in value
-SHELL = sh
-endif
-
-have-Makefile := $(shell test -f Makefile && echo yes)
-
-# If the user runs GNU make but has not yet run ./configure,
-# give them a diagnostic.
-ifeq ($(have-Makefile),yes)
-
-# Make tar archive easier to reproduce.
-export TAR_OPTIONS = --owner=0 --group=0 --numeric-owner
-
-include Makefile
-include $(srcdir)/Makefile.cfg
-include $(srcdir)/Makefile.maint
-
-else
-
-all:
-	@echo There seems to be no Makefile in this directory.
-	@echo "You must run ./configure before running \`make'."
-	@exit 1
-
-endif
-
-# Tell version 3.79 and up of GNU make to not build goals in this
-# directory in parallel.  This is necessary in case someone tries to
-# build multiple targets on one command line.
-.NOTPARALLEL:
diff --git a/INSTALL b/INSTALL
deleted file mode 100644
index 23e5f25..0000000
--- a/INSTALL
+++ /dev/null
@@ -1,236 +0,0 @@
-Installation Instructions
-*************************
-
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
-Software Foundation, Inc.
-
-This file is free documentation; the Free Software Foundation gives
-unlimited permission to copy, distribute and modify it.
-
-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, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
-   It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  (Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.)
-
-   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 you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
-   The file `configure.ac' (or `configure.in') 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 awhile.  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.  Run `./configure --help' for
-details on some of the pertinent environment variables.
-
-   You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment.  Here
-is an example:
-
-     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
-
-   *Note Defining Variables::, for more details.
-
-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 support 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.
-
-Installation Names
-==================
-
-By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc.  You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX'.
-
-   You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files.  If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
-PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files still use the regular prefix.
-
-   In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' 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.
-
-Specifying the System Type
-==========================
-
-There may be some features `configure' cannot figure out automatically,
-but needs to determine by the type of machine the package will run on.
-Usually, assuming the package is built to be run on the _same_
-architectures, `configure' can figure that out, but if it prints a
-message saying it cannot guess the machine type, give it the
-`--build=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
-     CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
-     OS KERNEL-OS
-
-   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 machine type.
-
-   If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
-produce code for.
-
-   If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-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.
-
-Defining Variables
-==================
-
-Variables not defined in a site shell script can be set in the
-environment passed to `configure'.  However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost.  In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'.  For example:
-
-     ./configure CC=/usr/local2/bin/gcc
-
-causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).  Here is a another example:
-
-     /bin/bash ./configure CONFIG_SHELL=/bin/bash
-
-Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
-configuration-related scripts to be executed by `/bin/bash'.
-
-`configure' Invocation
-======================
-
-`configure' recognizes the following options to control how it operates.
-
-`--help'
-`-h'
-     Print a summary of the options to `configure', and exit.
-
-`--version'
-`-V'
-     Print the version of Autoconf used to generate the `configure'
-     script, and exit.
-
-`--cache-file=FILE'
-     Enable the cache: use and save the results of the tests in FILE,
-     traditionally `config.cache'.  FILE defaults to `/dev/null' to
-     disable caching.
-
-`--config-cache'
-`-C'
-     Alias for `--cache-file=config.cache'.
-
-`--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.
-
-`configure' also accepts some other, not widely useful, options.  Run
-`configure --help' for more details.
-
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 41b2ee4..0000000
--- a/Makefile
+++ /dev/null
@@ -1,704 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-
-srcdir = .
-top_srcdir = .
-
-pkgdatadir = $(datadir)/bison
-pkglibdir = $(libdir)/bison
-pkgincludedir = $(includedir)/bison
-top_builddir = .
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = /usr/bin/install -c
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-unknown-linux-gnu
-host_triplet = x86_64-unknown-linux-gnu
-subdir = .
-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(srcdir)/config.hin \
-	$(top_srcdir)/configure ABOUT-NLS AUTHORS COPYING ChangeLog \
-	INSTALL NEWS THANKS TODO
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno configure.status.lineno
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES =
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-exec-recursive install-info-recursive \
-	install-recursive installcheck-recursive installdirs-recursive \
-	pdf-recursive ps-recursive uninstall-info-recursive \
-	uninstall-recursive
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-am__installdirs = "$(DESTDIR)$(aclocaldir)"
-aclocalDATA_INSTALL = $(INSTALL_DATA)
-DATA = $(aclocal_DATA)
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
-  { test ! -d $(distdir) \
-    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr $(distdir); }; }
-DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-distcleancheck_listfiles = find . -type f -print
-ACLOCAL = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run aclocal-1.9
-AMDEP_FALSE = #
-AMDEP_TRUE = 
-AMTAR = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run tar
-AUTOCONF = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoconf
-AUTOHEADER = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoheader
-AUTOM4TE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autom4te
-AUTOMAKE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run automake-1.9
-AWK = gawk
-BISON_CXX_WORKS = :
-BISON_CXX_WORKS_FALSE = #
-BISON_CXX_WORKS_TRUE = 
-BISON_LOCALEDIR = /usr/share/locale
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPP = gcc -E
-CPPFLAGS = 
-CXX = g++
-CXXDEPMODE = depmode=gcc3
-CXXFLAGS = -g -O2
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = grep -E
-EXEEXT = 
-GCC = yes
-GETOPT_H = 
-GMSGFMT = /usr/bin/msgfmt
-HAVE__BOOL = 1
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
-INTLLIBS = 
-INTL_MACOSX_LIBS = 
-LDFLAGS = 
-LEX = flex
-LEXLIB = -lfl
-LEX_OUTPUT_ROOT = lex.yy
-LIBICONV = -liconv
-LIBINTL = 
-LIBOBJS =  dirname$U.o exitfail$U.o hard-locale$U.o hash$U.o quote$U.o quotearg$U.o fopen-safer$U.o dup-safer$U.o fd-safer$U.o pipe-safer$U.o xmalloc$U.o
-LIBS = 
-LTLIBICONV = -liconv
-LTLIBINTL = 
-LTLIBOBJS =  dirname$U.lo exitfail$U.lo hard-locale$U.lo hash$U.lo quote$U.lo quotearg$U.lo fopen-safer$U.lo dup-safer$U.lo fd-safer$U.lo pipe-safer$U.lo xmalloc$U.lo
-M4 = /usr/bin/m4
-MAKEINFO = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run makeinfo
-MKINSTALLDIRS = $(top_builddir)/build-aux/mkinstalldirs
-MSGFMT = /usr/bin/msgfmt
-MSGMERGE = /usr/bin/msgmerge
-O0CFLAGS = -g 
-O0CXXFLAGS = -g 
-OBJEXT = o
-PACKAGE = bison
-PACKAGE_BUGREPORT = bug-bison@gnu.org
-PACKAGE_NAME = GNU Bison
-PACKAGE_STRING = GNU Bison 2.3
-PACKAGE_TARNAME = bison
-PACKAGE_VERSION = 2.3
-PATH_SEPARATOR = :
-POSUB = po
-RANLIB = ranlib
-SET_MAKE = 
-SHELL = /bin/sh
-STDBOOL_H = 
-STRIP = 
-UNISTD_H = 
-USE_NLS = yes
-VALGRIND = 
-VERSION = 2.3
-WARNING_CFLAGS = 
-WARNING_CXXFLAGS = 
-WERROR_CFLAGS = 
-XGETTEXT = /usr/bin/xgettext
-YACC = bison -y
-YACC_LIBRARY = liby.a
-YACC_SCRIPT = yacc
-ac_ct_CC = gcc
-ac_ct_CXX = g++
-ac_ct_RANLIB = ranlib
-ac_ct_STRIP = 
-
-# Files installed for use by Automake.
-aclocaldir = ${datadir}/aclocal
-am__fastdepCC_FALSE = #
-am__fastdepCC_TRUE = 
-am__fastdepCXX_FALSE = #
-am__fastdepCXX_TRUE = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = ${AMTAR} chof - "$$tardir"
-am__untar = ${AMTAR} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-unknown-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = unknown
-datadir = ${prefix}/share
-exec_prefix = ${prefix}
-host = x86_64-unknown-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = unknown
-includedir = ${prefix}/include
-infodir = ${prefix}/info
-install_sh = /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localstatedir = ${prefix}/var
-mandir = ${prefix}/man
-mkdir_p = mkdir -p --
-oldincludedir = /usr/include
-prefix = /home/phanna/src/bison
-program_transform_name = s,x,x,
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-sysconfdir = ${prefix}/etc
-target_alias = 
-ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = build-aux po runtime-po lib data src doc examples tests
-aclocal_DATA = m4/bison-i18n.m4
-EXTRA_DIST = GNUmakefile Makefile.cfg Makefile.maint \
-  OChangeLog PACKAGING \
-  djgpp/Makefile.maint djgpp/README.in djgpp/config.bat \
-  djgpp/config.sed djgpp/config.site djgpp/config_h.sed \
-  djgpp/subpipe.c djgpp/subpipe.h djgpp/djunpack.bat \
-  djgpp/fnchange.lst
-
-all: config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-recursive
-
-.SUFFIXES:
-am--refresh:
-	@:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
-	      cd $(srcdir) && $(AUTOMAKE) --gnu  \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-
-config.h: stamp-h1
-	@if test ! -f $@; then \
-	  rm -f stamp-h1; \
-	  $(MAKE) stamp-h1; \
-	else :; fi
-
-stamp-h1: $(srcdir)/config.hin $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.hin:  $(am__configure_deps) 
-	cd $(top_srcdir) && $(AUTOHEADER)
-	rm -f stamp-h1
-	touch $@
-
-distclean-hdr:
-	-rm -f config.h stamp-h1
-uninstall-info-am:
-install-aclocalDATA: $(aclocal_DATA)
-	@$(NORMAL_INSTALL)
-	test -z "$(aclocaldir)" || $(mkdir_p) "$(DESTDIR)$(aclocaldir)"
-	@list='$(aclocal_DATA)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(aclocalDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(aclocaldir)/$$f'"; \
-	  $(aclocalDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(aclocaldir)/$$f"; \
-	done
-
-uninstall-aclocalDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(aclocal_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(aclocaldir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(aclocaldir)/$$f"; \
-	done
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
-	@failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) config.hin $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS) config.hin $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.hin $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS) config.hin $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@case `sed 15q $(srcdir)/NEWS` in \
-	*"$(VERSION)"*) : ;; \
-	*) \
-	  echo "NEWS not updated; not releasing" 1>&2; \
-	  exit 1;; \
-	esac
-	$(am__remove_distdir)
-	mkdir $(distdir)
-	$(mkdir_p) $(distdir)/djgpp $(distdir)/m4 $(distdir)/po $(distdir)/runtime-po $(distdir)/tests
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(mkdir_p) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
-	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r $(distdir)
-dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-dist-bzip2: distdir
-	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-dist-tarZ: distdir
-	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__remove_distdir)
-
-dist-shar: distdir
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__remove_distdir)
-
-dist-zip: distdir
-	-rm -f $(distdir).zip
-	zip -rq $(distdir).zip $(distdir)
-	$(am__remove_distdir)
-
-dist dist-all: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-	case '$(DIST_ARCHIVES)' in \
-	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
-	*.tar.bz2*) \
-	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
-	*.tar.Z*) \
-	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
-	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
-	*.zip*) \
-	  unzip $(distdir).zip ;;\
-	esac
-	chmod -R a-w $(distdir); chmod a+w $(distdir)
-	mkdir $(distdir)/_build
-	mkdir $(distdir)/_inst
-	chmod a-w $(distdir)
-	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
-	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && cd $(distdir)/_build \
-	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
-	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-	  && $(MAKE) $(AM_MAKEFLAGS) check \
-	  && $(MAKE) $(AM_MAKEFLAGS) install \
-	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
-	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
-	        distuninstallcheck \
-	  && chmod -R a-w "$$dc_install_base" \
-	  && ({ \
-	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
-	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
-	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
-	  && rm -rf "$$dc_destdir" \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist \
-	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
-	$(am__remove_distdir)
-	@(echo "$(distdir) archives ready for distribution: "; \
-	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
-distuninstallcheck:
-	@cd $(distuninstallcheck_dir) \
-	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
-	   || { echo "ERROR: files left after uninstall:" ; \
-	        if test -n "$(DESTDIR)"; then \
-	          echo "  (check DESTDIR support)"; \
-	        fi ; \
-	        $(distuninstallcheck_listfiles) ; \
-	        exit 1; } >&2
-distcleancheck: distclean
-	@if test '$(srcdir)' = . ; then \
-	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
-	  exit 1 ; \
-	fi
-	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
-	  || { echo "ERROR: files left in build directory after distclean:" ; \
-	       $(distcleancheck_listfiles) ; \
-	       exit 1; } >&2
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(DATA) config.h
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(aclocaldir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-aclocalDATA
-
-install-exec-am:
-
-install-info: install-info-recursive
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-aclocalDATA uninstall-info-am
-
-uninstall-info: uninstall-info-recursive
-
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
-	check-am clean clean-generic clean-recursive ctags \
-	ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \
-	dist-tarZ dist-zip distcheck distclean distclean-generic \
-	distclean-hdr distclean-recursive distclean-tags \
-	distcleancheck distdir distuninstallcheck dvi dvi-am html \
-	html-am info info-am install install-aclocalDATA install-am \
-	install-data install-data-am install-exec install-exec-am \
-	install-info install-info-am install-man install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	maintainer-clean maintainer-clean-generic \
-	maintainer-clean-recursive mostlyclean mostlyclean-generic \
-	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-aclocalDATA uninstall-am uninstall-info-am
-
-
-.PHONY: maintainer-check
-maintainer-check:
-	cd tests && $(MAKE) $(AM_MAKEFLAGS) $@
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/Makefile.am b/Makefile.am
deleted file mode 100644
index f247e24..0000000
--- a/Makefile.am
+++ /dev/null
@@ -1,37 +0,0 @@
-## Process this file with automake to produce Makefile.in -*-Makefile-*-
-## Copyright (C) 2001, 2002, 2003, 2004, 2005 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 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, write to the Free Software
-## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-## 02110-1301  USA
-
-ACLOCAL_AMFLAGS = -I m4
-
-SUBDIRS = build-aux po runtime-po lib data src doc examples tests
-
-# Files installed for use by Automake.
-aclocaldir = @aclocaldir@
-aclocal_DATA = m4/bison-i18n.m4
-
-EXTRA_DIST = GNUmakefile Makefile.cfg Makefile.maint \
-  OChangeLog PACKAGING \
-  djgpp/Makefile.maint djgpp/README.in djgpp/config.bat \
-  djgpp/config.sed djgpp/config.site djgpp/config_h.sed \
-  djgpp/subpipe.c djgpp/subpipe.h djgpp/djunpack.bat \
-  djgpp/fnchange.lst
-
-
-.PHONY: maintainer-check
-maintainer-check:
-	cd tests && $(MAKE) $(AM_MAKEFLAGS) $@
diff --git a/Makefile.cfg b/Makefile.cfg
deleted file mode 100644
index fb15523..0000000
--- a/Makefile.cfg
+++ /dev/null
@@ -1,48 +0,0 @@
-# Customize Makefile.maint for Bison.            -*- makefile -*-
-# Copyright (C) 2003, 2005, 2006 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.
-
-build_aux_dir = $(srcdir)/build-aux
-prev_version_file = $(build_aux_dir)/prev-version.txt
-announce_gen   = $(build_aux_dir)/announce-gen
-release_archive_dir = releases
-
-# Use alpha.gnu.org for alpha and beta releases.
-# Use ftp.gnu.org for major releases.
-gnu_ftp_host-alpha = alpha
-gnu_ftp_host-beta = alpha
-gnu_ftp_host-major = ftp
-gnu_rel_host = $(gnu_ftp_host-$(RELEASE_TYPE))
-
-url_dir_list = \
-  ftp://$(gnu_rel_host).gnu.org/gnu/bison
-
-# Files to update automatically.
-wget_files = \
-  $(build_aux_dir)/config.guess \
-  $(build_aux_dir)/config.sub \
-  $(build_aux_dir)/texinfo.tex \
-
-cvs_files = \
-  $(build_aux_dir)/install-sh \
-  $(build_aux_dir)/mdate-sh \
-  $(build_aux_dir)/missing \
-  $(build_aux_dir)/mkinstalldirs
-
-# Tests not to run.
-local-checks-to-skip = \
-  changelog-check
diff --git a/Makefile.in b/Makefile.in
deleted file mode 100644
index 9c62f02..0000000
--- a/Makefile.in
+++ /dev/null
@@ -1,704 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = .
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = .
-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(srcdir)/config.hin \
-	$(top_srcdir)/configure ABOUT-NLS AUTHORS COPYING ChangeLog \
-	INSTALL NEWS THANKS TODO
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno configure.status.lineno
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES =
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-exec-recursive install-info-recursive \
-	install-recursive installcheck-recursive installdirs-recursive \
-	pdf-recursive ps-recursive uninstall-info-recursive \
-	uninstall-recursive
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-am__installdirs = "$(DESTDIR)$(aclocaldir)"
-aclocalDATA_INSTALL = $(INSTALL_DATA)
-DATA = $(aclocal_DATA)
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
-  { test ! -d $(distdir) \
-    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr $(distdir); }; }
-DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-distcleancheck_listfiles = find . -type f -print
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOM4TE = @AUTOM4TE@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BISON_CXX_WORKS = @BISON_CXX_WORKS@
-BISON_CXX_WORKS_FALSE = @BISON_CXX_WORKS_FALSE@
-BISON_CXX_WORKS_TRUE = @BISON_CXX_WORKS_TRUE@
-BISON_LOCALEDIR = @BISON_LOCALEDIR@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-GCC = @GCC@
-GETOPT_H = @GETOPT_H@
-GMSGFMT = @GMSGFMT@
-HAVE__BOOL = @HAVE__BOOL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTLLIBS = @INTLLIBS@
-INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
-LDFLAGS = @LDFLAGS@
-LEX = @LEX@
-LEXLIB = @LEXLIB@
-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
-LIBICONV = @LIBICONV@
-LIBINTL = @LIBINTL@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LTLIBICONV = @LTLIBICONV@
-LTLIBINTL = @LTLIBINTL@
-LTLIBOBJS = @LTLIBOBJS@
-M4 = @M4@
-MAKEINFO = @MAKEINFO@
-MKINSTALLDIRS = @MKINSTALLDIRS@
-MSGFMT = @MSGFMT@
-MSGMERGE = @MSGMERGE@
-O0CFLAGS = @O0CFLAGS@
-O0CXXFLAGS = @O0CXXFLAGS@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-POSUB = @POSUB@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STDBOOL_H = @STDBOOL_H@
-STRIP = @STRIP@
-UNISTD_H = @UNISTD_H@
-USE_NLS = @USE_NLS@
-VALGRIND = @VALGRIND@
-VERSION = @VERSION@
-WARNING_CFLAGS = @WARNING_CFLAGS@
-WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
-WERROR_CFLAGS = @WERROR_CFLAGS@
-XGETTEXT = @XGETTEXT@
-YACC = @YACC@
-YACC_LIBRARY = @YACC_LIBRARY@
-YACC_SCRIPT = @YACC_SCRIPT@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-
-# Files installed for use by Automake.
-aclocaldir = @aclocaldir@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = build-aux po runtime-po lib data src doc examples tests
-aclocal_DATA = m4/bison-i18n.m4
-EXTRA_DIST = GNUmakefile Makefile.cfg Makefile.maint \
-  OChangeLog PACKAGING \
-  djgpp/Makefile.maint djgpp/README.in djgpp/config.bat \
-  djgpp/config.sed djgpp/config.site djgpp/config_h.sed \
-  djgpp/subpipe.c djgpp/subpipe.h djgpp/djunpack.bat \
-  djgpp/fnchange.lst
-
-all: config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-recursive
-
-.SUFFIXES:
-am--refresh:
-	@:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
-	      cd $(srcdir) && $(AUTOMAKE) --gnu  \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-
-config.h: stamp-h1
-	@if test ! -f $@; then \
-	  rm -f stamp-h1; \
-	  $(MAKE) stamp-h1; \
-	else :; fi
-
-stamp-h1: $(srcdir)/config.hin $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.hin:  $(am__configure_deps) 
-	cd $(top_srcdir) && $(AUTOHEADER)
-	rm -f stamp-h1
-	touch $@
-
-distclean-hdr:
-	-rm -f config.h stamp-h1
-uninstall-info-am:
-install-aclocalDATA: $(aclocal_DATA)
-	@$(NORMAL_INSTALL)
-	test -z "$(aclocaldir)" || $(mkdir_p) "$(DESTDIR)$(aclocaldir)"
-	@list='$(aclocal_DATA)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(aclocalDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(aclocaldir)/$$f'"; \
-	  $(aclocalDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(aclocaldir)/$$f"; \
-	done
-
-uninstall-aclocalDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(aclocal_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(aclocaldir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(aclocaldir)/$$f"; \
-	done
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
-	@failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) config.hin $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS) config.hin $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.hin $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS) config.hin $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@case `sed 15q $(srcdir)/NEWS` in \
-	*"$(VERSION)"*) : ;; \
-	*) \
-	  echo "NEWS not updated; not releasing" 1>&2; \
-	  exit 1;; \
-	esac
-	$(am__remove_distdir)
-	mkdir $(distdir)
-	$(mkdir_p) $(distdir)/djgpp $(distdir)/m4 $(distdir)/po $(distdir)/runtime-po $(distdir)/tests
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(mkdir_p) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
-	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r $(distdir)
-dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-dist-bzip2: distdir
-	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-dist-tarZ: distdir
-	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__remove_distdir)
-
-dist-shar: distdir
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__remove_distdir)
-
-dist-zip: distdir
-	-rm -f $(distdir).zip
-	zip -rq $(distdir).zip $(distdir)
-	$(am__remove_distdir)
-
-dist dist-all: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-	case '$(DIST_ARCHIVES)' in \
-	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
-	*.tar.bz2*) \
-	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
-	*.tar.Z*) \
-	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
-	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
-	*.zip*) \
-	  unzip $(distdir).zip ;;\
-	esac
-	chmod -R a-w $(distdir); chmod a+w $(distdir)
-	mkdir $(distdir)/_build
-	mkdir $(distdir)/_inst
-	chmod a-w $(distdir)
-	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
-	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && cd $(distdir)/_build \
-	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
-	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-	  && $(MAKE) $(AM_MAKEFLAGS) check \
-	  && $(MAKE) $(AM_MAKEFLAGS) install \
-	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
-	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
-	        distuninstallcheck \
-	  && chmod -R a-w "$$dc_install_base" \
-	  && ({ \
-	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
-	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
-	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
-	  && rm -rf "$$dc_destdir" \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist \
-	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
-	$(am__remove_distdir)
-	@(echo "$(distdir) archives ready for distribution: "; \
-	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
-distuninstallcheck:
-	@cd $(distuninstallcheck_dir) \
-	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
-	   || { echo "ERROR: files left after uninstall:" ; \
-	        if test -n "$(DESTDIR)"; then \
-	          echo "  (check DESTDIR support)"; \
-	        fi ; \
-	        $(distuninstallcheck_listfiles) ; \
-	        exit 1; } >&2
-distcleancheck: distclean
-	@if test '$(srcdir)' = . ; then \
-	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
-	  exit 1 ; \
-	fi
-	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
-	  || { echo "ERROR: files left in build directory after distclean:" ; \
-	       $(distcleancheck_listfiles) ; \
-	       exit 1; } >&2
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(DATA) config.h
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(aclocaldir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-aclocalDATA
-
-install-exec-am:
-
-install-info: install-info-recursive
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-aclocalDATA uninstall-info-am
-
-uninstall-info: uninstall-info-recursive
-
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
-	check-am clean clean-generic clean-recursive ctags \
-	ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \
-	dist-tarZ dist-zip distcheck distclean distclean-generic \
-	distclean-hdr distclean-recursive distclean-tags \
-	distcleancheck distdir distuninstallcheck dvi dvi-am html \
-	html-am info info-am install install-aclocalDATA install-am \
-	install-data install-data-am install-exec install-exec-am \
-	install-info install-info-am install-man install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	maintainer-clean maintainer-clean-generic \
-	maintainer-clean-recursive mostlyclean mostlyclean-generic \
-	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-aclocalDATA uninstall-am uninstall-info-am
-
-
-.PHONY: maintainer-check
-maintainer-check:
-	cd tests && $(MAKE) $(AM_MAKEFLAGS) $@
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/Makefile.maint b/Makefile.maint
deleted file mode 100644
index 9bae6be..0000000
--- a/Makefile.maint
+++ /dev/null
@@ -1,639 +0,0 @@
-# -*-Makefile-*-
-# This Makefile fragment is shared between the coreutils,
-# CPPI, Bison, and Autoconf.
-
-## Copyright (C) 2001-2006 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.
-
-# This is reported not to work with make-3.79.1
-# ME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
-ME := Makefile.maint
-
-# Do not save the original name or timestamp in the .tar.gz file.
-# Use --rsyncable if available.
-gzip_rsyncable = \
-  (gzip --help|grep rsyncable) >/dev/null 2>&1 && echo --rsyncable
-GZIP_ENV = "--no-name --best `$(gzip_rsyncable)`"
-
-CVS = cvs
-
-# cvsu is part of the cvsutils package: http://www.red-bean.com/cvsutils/
-CVS_LIST = sh -c ' \
-    if test -x $(srcdir)/build-aux/cvsu; then \
-      $(srcdir)/build-aux/cvsu --find --types=AFGM $$*; \
-    else \
-      awk -F/ '\''{ \
-	  if (!$$1 && $$3 !~ /^-/) { \
-	    f=FILENAME; \
-	    sub(/CVS\/Entries/, "", f); \
-	    print f $$2; \
-	  }}'\'' \
-	$$(find $${*-*} -name Entries -print) /dev/null; \
-    fi \
-  ' dummy
-
-CVS_LIST_EXCEPT = \
-  $(CVS_LIST) | if test -f .x-$@; then grep -vEf .x-$@; else grep -v ChangeLog; fi
-
-ifeq ($(origin prev_version_file), undefined)
-  prev_version_file = .prev-version
-endif
-
-PREV_VERSION := $(shell cat $(prev_version_file))
-VERSION_REGEXP = $(subst .,\.,$(VERSION))
-
-tag-package = $(shell echo "$(PACKAGE)" | tr '[:lower:]' '[:upper:]')
-tag-this-version = $(subst .,_,$(VERSION))
-this-cvs-tag = $(tag-package)-$(tag-this-version)
-my_distdir = $(PACKAGE)-$(VERSION)
-
-# Old releases are stored here.
-# Used for diffs and xdeltas.
-release_archive_dir ?= ../release
-
-# Prevent programs like 'sort' from considering distinct strings to be equal.
-# Doing it here saves us from having to set LC_ALL elsewhere in this file.
-export LC_ALL = C
-
-
-
-## --------------- ##
-## Sanity checks.  ##
-## --------------- ##
-
-# FIXME: add a check to prohibit definition in src/*.c of symbols defined
-# in system.h.  E.g. today I removed from tail.c a useless definition of
-# ENOSYS.  It was useless because system.h ensures it's defined.
-
-# Checks that don't require cvs.
-# Run `changelog-check' last, as previous test may reveal problems requiring
-# new ChangeLog entries.
-local-checks-available = \
-  po-check copyright-check writable-files m4-check author_mark_check \
-  changelog-check strftime-check $(syntax-check-rules) \
-  makefile_path_separator_check \
-  makefile-check
-.PHONY: $(local-checks-available)
-
-local-check = $(filter-out $(local-checks-to-skip), $(local-checks-available))
-
-.PHONY: $(syntax-check-rules)
-syntax-check-rules = \
-  sc_cast_of_argument_to_free \
-  sc_cast_of_x_alloc_return_value \
-  sc_cast_of_alloca_return_value \
-  sc_changelog \
-  sc_dd_max_sym_length \
-  sc_error_exit_success \
-  sc_file_system \
-  sc_no_if_have_config_h \
-  sc_obsolete_symbols \
-  sc_prohibit_atoi_atof \
-  sc_prohibit_jm_in_m4 \
-  sc_prohibit_assert_without_use \
-  sc_require_config_h \
-  sc_root_tests \
-  sc_space_tab \
-  sc_sun_os_names \
-  sc_system_h_headers \
-  sc_tight_scope \
-  sc_trailing_blank \
-  sc_two_space_separator_in_usage \
-  sc_unmarked_diagnostics \
-  sc_useless_cpp_parens
-
-syntax-check: $(syntax-check-rules)
-#	@grep -nE '#  *include <(limits|std(def|arg|bool))\.h>'		\
-#	    $$(find -type f -name '*.[chly]') &&			\
-#	  { echo '$(ME): found conditional include' 1>&2;		\
-#	    exit 1; } || :
-
-#	grep -nE '^#  *include <(string|stdlib)\.h>'			\
-#	    $(srcdir)/{lib,src}/*.[chy] &&				\
-#	  { echo '$(ME): FIXME' 1>&2;					\
-#	    exit 1; } || :
-# FIXME: don't allow `#include .strings\.h' anywhere
-
-sc_cast_of_argument_to_free:
-	@grep -nE '\<free \(\(' $(srcdir)/{lib,src}/*.[chly] &&		\
-	  { echo '$(ME): don'\''t cast free argument' 1>&2;		\
-	    exit 1; } || :
-
-sc_cast_of_x_alloc_return_value:
-	@grep -nE --exclude=$(srcdir)/lib/regex.c			\
-	    '\*\) *x(m|c|re)alloc\>'					\
-	    $(srcdir)/{lib,src}/*.[chy] &&				\
-	  { echo '$(ME): don'\''t cast x*alloc return value' 1>&2;	\
-	    exit 1; } || :
-
-sc_cast_of_alloca_return_value:
-	@grep -nE '\*\) *alloca\>'					\
-	    $(srcdir)/src/*.[chy] &&					\
-	  { echo '$(ME): don'\''t cast alloca return value' 1>&2;	\
-	    exit 1; } || :
-
-sc_space_tab:
-	@grep -n '[ ]	' $$($(CVS_LIST_EXCEPT)) &&			\
-	  { echo '$(ME): found SPACE-TAB sequence; remove the SPACE'	\
-		1>&2; exit 1; } || :
-
-# Don't use the old ato* functions in `real' code.
-# They provide no error checking mechanism.
-# Instead, use strto* functions.
-sc_prohibit_atoi_atof:
-	@grep -nE '\<ato([filq]|ll)\>' $$($(CVS_LIST_EXCEPT)) &&	\
-	  { echo '$(ME): do not use ato''f, ato''i, ato''l, ato''ll, or ato''q'	\
-		1>&2; exit 1; } || :
-
-# Using EXIT_SUCCESS as the first argument to error is misleading,
-# since when that parameter is 0, error does not exit.  Use `0' instead.
-sc_error_exit_success:
-	@grep -nF 'error (EXIT_SUCCESS,'					\
-	    $$(find -type f -name '*.[chly]') &&			\
-	  { echo '$(ME): found error (EXIT_SUCCESS' 1>&2;		\
-	    exit 1; } || :
-
-sc_file_system:
-	@grep -ni 'file''system' $$($(CVS_LIST_EXCEPT)) &&		\
-	  { echo '$(ME): found use of "file''system";'			\
-	    'rewrite to use "file system"' 1>&2;			\
-	    exit 1; } || :
-
-sc_no_if_have_config_h:
-	@grep -n '^# *if HAVE_CONFIG_H' $$($(CVS_LIST_EXCEPT)) &&	\
-	  { echo '$(ME): found use of #if HAVE_CONFIG_H; use #ifdef'	\
-		1>&2; exit 1; } || :
-
-# Nearly all .c files must include <config.h>.
-sc_require_config_h:
-	@grep -L '^# *include <config\.h>'				\
-		$$($(CVS_LIST_EXCEPT) | grep '\.c$$')			\
-	    | grep . &&							\
-	  { echo '$(ME): the above files do not include <config.h>'	\
-		1>&2; exit 1; } || :
-
-# Prohibit the inclusion of assert.h without an actual use of assert.
-sc_prohibit_assert_without_use:
-	@files=$$(grep -l '# *include <assert\.h>'			\
-		    $$($(CVS_LIST_EXCEPT) | grep '\.c$$')) &&		\
-	grep -L '\<assert (' $$files					\
-	    | grep . &&							\
-	  { echo "$(ME): the above files include <assert.h> but don't use it" \
-		1>&2; exit 1; } || :
-
-sc_obsolete_symbols:
-	@grep -nE '\<(HAVE''_FCNTL_H|O''_NDELAY)\>'			\
-	     $$($(CVS_LIST_EXCEPT)) &&					\
-	  { echo '$(ME): do not use HAVE''_FCNTL_H or O''_NDELAY'	\
-		1>&2; exit 1; } || :
-
-# FIXME: warn about definitions of EXIT_FAILURE, EXIT_SUCCESS, STREQ
-
-# Each nonempty line must start with a year number, or a TAB.
-sc_changelog:
-	@grep -n '^[^12	]' $$(find . -maxdepth 2 -name ChangeLog) &&	\
-	  { echo '$(ME): found unexpected prefix in a ChangeLog' 1>&2;	\
-	    exit 1; } || :
-
-# Ensure that dd's definition of LONGEST_SYMBOL stays in sync
-# with the strings from the two affected variables.
-dd_c = $(srcdir)/src/dd.c
-sc_dd_max_sym_length:
-ifneq ($(wildcard $(dd_c)),)
-	@len=$$( (sed -n '/conversions\[\] =$$/,/^};/p' $(dd_c);\
-		 sed -n '/flags\[\] =$$/,/^};/p' $(dd_c) )	\
-		|sed -n '/"/s/^[^"]*"\([^"]*\)".*/\1/p'		\
-	      | wc --max-line-length);				\
-	max=$$(sed -n '/^#define LONGEST_SYMBOL /s///p' $(dd_c)	\
-	      |tr -d '"' | wc --max-line-length);		\
-	if test "$$len" = "$$max"; then :; else			\
-	  echo 'dd.c: LONGEST_SYMBOL is not longest' 1>&2;	\
-	  exit 1;						\
-	fi
-endif
-
-# Many m4 macros names once began with `jm_'.
-# On 2004-04-13, they were all changed to start with gl_ instead.
-# Make sure that none are inadvertently reintroduced.
-sc_prohibit_jm_in_m4:
-	@grep -nE 'jm_[A-Z]'						\
-		$$($(CVS_LIST) $(srcdir)/m4 |grep '\.m4$$') &&		\
-	    { echo '$(ME): do not use jm_ in m4 macro names'		\
-	      1>&2; exit 1; } || :
-
-sc_root_tests:
-	@t1=sc-root.expected; t2=sc-root.actual;			\
-	grep -nl '^PRIV_CHECK_ARG=require-root'				\
-	  $$($(CVS_LIST) tests) |sed s,tests,., |sort > $$t1;		\
-	sed -n 's,	cd \([^ ]*\) .*MAKE..check TESTS=\(.*\),./\1/\2,p' \
-	  $(srcdir)/tests/Makefile.am |sort > $$t2;			\
-	diff -u $$t1 $$t2 || diff=1;					\
-	rm -f $$t1 $$t2;						\
-	test "$$diff"							\
-	  && { echo 'tests/Makefile.am: missing check-root action'>&2;	\
-	       exit 1; } || :
-
-# Create a list of regular expressions matching the names
-# of files included from system.h.  Exclude a couple.
-.re-list:
-	@sed -n '/^# *include /s///p' $(srcdir)/src/system.h \
-	  | grep -Ev 'sys/(param|file)\.h' \
-	  | sed 's/ .*//;;s/^["<]/^# *include [<"]/;s/\.h[">]$$/\\.h[">]/' \
-	  > $@-t
-	@mv $@-t $@
-
-# Files in src/ should not include directly any of
-# the headers already included via system.h.
-sc_system_h_headers: .re-list
-	@if test -f $(srcdir)/src/system.h; then			\
-	  trap 'rc=$$?; rm -f .re-list; exit $$rc' 0 1 2 3 15;		\
-	  grep -nE -f .re-list						\
-	      $$($(CVS_LIST) src |					\
-		 grep -Ev '((copy|system)\.h|parse-gram\.c)$$')		\
-	    && { echo '$(ME): the above are already included via system.h'\
-		  1>&2;  exit 1; } || :;				\
-	fi
-
-sc_sun_os_names:
-	@grep -nEi \
-	    'solaris[^[:alnum:]]*2\.(7|8|9|[1-9][0-9])|sunos[^[:alnum:]][6-9]' \
-	    $$($(CVS_LIST_EXCEPT)) &&					\
-	  { echo '$(ME): found misuse of Sun OS version numbers' 1>&2;	\
-	    exit 1; } || :
-
-sc_tight_scope:
-	$(MAKE) -C src $@
-
-sc_trailing_blank:
-	@grep -n '[	 ]$$' $$($(CVS_LIST_EXCEPT)) &&			\
-	  { echo '$(ME): found trailing blank(s)'			\
-		1>&2; exit 1; } || :
-
-sc_two_space_separator_in_usage:
-	@grep -n '^   *--[a-z][0-9A-Za-z-]* [^ ].*\\$$'			\
-	    $$($(CVS_LIST_EXCEPT)) &&					\
-	  { echo "$(ME): help2man requires at least two spaces between"; \
-	    echo "$(ME): an option and its description"; \
-		1>&2; exit 1; } || :
-
-# Look for diagnostics that aren't marked for translation.
-# This won't find any for which error's format string is on a separate line.
-sc_unmarked_diagnostics:
-	@grep -nE							\
-	    '\<error \([^"]*"[^"]*[a-z]{3}' $$($(CVS_LIST_EXCEPT))	\
-	  | grep -v '_''(' &&						\
-	  { echo '$(ME): found unmarked diagnostic(s)' 1>&2;		\
-	    exit 1; } || :
-
-# Avoid useless parentheses like those in this example:
-# #if defined (SYMBOL) || defined (SYM2)
-sc_useless_cpp_parens:
-	@grep -n '^# *if .*defined *(' $$($(CVS_LIST_EXCEPT)) &&	\
-	  { echo '$(ME): found useless parentheses in cpp directive'	\
-		1>&2; exit 1; } || :
-
-# Ensure that date's --help output stays in sync with the info
-# documentation for GNU strftime.  The only exception is %N,
-# which date accepts but GNU strftime does not.
-extract_char = sed 's/^[^%][^%]*%\(.\).*/\1/'
-strftime-check:
-	if test -f $(srcdir)/src/date.c; then				\
-	  grep '^  %.  ' $(srcdir)/src/date.c | sort			\
-	    | $(extract_char) > $@-src;					\
-	  { echo N;							\
-	    info libc date calendar format | grep '^    `%.'\'		\
-	      | $(extract_char); } | sort > $@-info;			\
-	  diff -u $@-src $@-info || exit 1;				\
-	  rm -f $@-src $@-info;						\
-	fi
-
-# Ensure that we use only the standard $(VAR) notation,
-# not @...@ in Makefile.am, now that we can rely on automake
-# to emit a definition for each substituted variable.
-makefile-check:
-	grep -nE '@[A-Z_0-9]+@' `find . -name Makefile.am` \
-	  && { echo 'Makefile.maint: use $$(...), not @...@' 1>&2; exit 1; } || :
-
-news-date-check: NEWS
-	today=`date +%Y-%m-%d`;	\
-	if head NEWS | grep '^\*.* $(VERSION_REGEXP) ('$$today')' \
-	    >/dev/null; then \
-	  :; \
-	else \
-	  echo "version or today's date is not in NEWS" 1>&2; \
-	  exit 1; \
-	fi
-
-changelog-check:
-	if head ChangeLog | grep 'Version $(VERSION_REGEXP)\.$$' \
-	    >/dev/null; then \
-	  :; \
-	else \
-	  echo "$(VERSION) not in ChangeLog" 1>&2; \
-	  exit 1; \
-	fi
-
-m4-check:
-	@grep -n 'AC_DEFUN([^[]' m4/*.m4 \
-	  && { echo 'Makefile.maint: quote the first arg to AC_DEFUN' 1>&2; \
-	       exit 1; } || :
-
-# Verify that all source files using _() are listed in po/POTFILES.in.
-# FIXME: don't hard-code file names below; use a more general mechanism.
-po-check:
-	if test -f po/POTFILES.in; then					\
-	  grep -E -v '^(#|$$)' po/POTFILES.in				\
-	    | grep -v '^src/false\.c$$' | sort > $@-1;			\
-	  files=;							\
-	  for file in $$($(CVS_LIST_EXCEPT)) lib/*.[ch]; do		\
-	    case $$file in						\
-	    djgpp/* | man/*) continue;;					\
-	    esac;							\
-	    case $$file in						\
-	    *.[ch])							\
-	      base=`expr " $$file" : ' \(.*\)\..'`;			\
-	      { test -f $$base.l || test -f $$base.y; } && continue;;	\
-	    esac;							\
-	    files="$$files $$file";					\
-	  done;								\
-	  grep -E -l '\bN?_\([^)"]*("|$$)' $$files | sort -u > $@-2;	\
-	  diff -u $@-1 $@-2 || exit 1;					\
-	  rm -f $@-1 $@-2;						\
-	fi
-
-# In a definition of #define AUTHORS "... and ..." where the RHS contains
-# the English word `and', the string must be marked with `N_ (...)' so that
-# gettext recognizes it as a string requiring translation.
-author_mark_check:
-	@grep -n '^# *define AUTHORS "[^"]* and ' src/*.c |grep -v ' N_ (' && \
-	  { echo 'Makefile.maint: enclose the above strings in N_ (...)' 1>&2; \
-	    exit 1; } || :
-
-# Sometimes it is useful to change the PATH environment variable
-# in Makefiles.  When doing so, it's better not to use the Unix-centric
-# path separator of `:', but rather the automake-provided `@PATH_SEPARATOR@'.
-# It'd be better to use `find -print0 ...|xargs -0 ...', but less portable,
-# and there probably aren't many projects with so many Makefile.am files
-# that we'd have to worry about limits on command line length.
-msg = 'Makefile.maint: Do not use `:'\'' above; use @PATH_SEPARATOR@ instead'
-makefile_path_separator_check:
-	@grep -n 'PATH=.*:' `find $(srcdir) -name Makefile.am` \
-	  && { echo $(msg) 1>&2; exit 1; } || :
-
-# Check that `make alpha' will not fail at the end of the process.
-writable-files:
-	if test -d $(release_archive_dir); then :; else			\
-	  mkdir $(release_archive_dir);					\
-	fi
-	for file in $(distdir).tar.gz $(xd-delta)			\
-	            $(release_archive_dir)/$(distdir).tar.gz		\
-	            $(release_archive_dir)/$(xd-delta); do		\
-	  test -e $$file || continue;					\
-	  test -w $$file						\
-	    || { echo ERROR: $$file is not writable; fail=1; };		\
-	done;								\
-	test "$$fail" && exit 1 || :
-
-v_etc_file = lib/version-etc.c
-# Make sure that the copyright date in $(v_etc_file) is up to date.
-copyright-check:
-	@if test -f $(v_etc_file); then \
-	  grep 'enum { COPYRIGHT_YEAR = '$$(date +%Y)' };' $(v_etc_file) \
-	    >/dev/null \
-	  || { echo 'out of date copyright in $(v_etc_file); update it' 1>&2; \
-	       exit 1; }; \
-	fi
-
-
-# Sanity checks with the CVS repository.
-cvs-tag-check:
-	echo $(this-cvs-tag); \
-	if $(CVS) -n log -h README | grep -e $(this-cvs-tag): >/dev/null; then \
-	  echo "$(this-cvs-tag) as already been used; not tagging" 1>&2; \
-	  exit 1; \
-	else :; fi
-
-cvs-diff-check:
-	if $(CVS) diff >cvs-diffs; then				\
-	  rm cvs-diffs;						\
-	else							\
-	  echo "Some files are locally modified:" 1>&2;		\
-	  cat cvs-diffs;					\
-	  exit 1;						\
-	fi
-
-cvs-check: cvs-diff-check cvs-tag-check
-
-maintainer-distcheck: changelog-check
-	$(MAKE) distcheck
-	$(MAKE) my-distcheck
-
-
-# Tag before making distribution.  Also, don't make a distribution if
-# checks fail.  Also, make sure the NEWS file is up-to-date.
-# FIXME: use dist-hook/my-dist like distcheck-hook/my-distcheck.
-cvs-dist: $(local-check) cvs-check maintainer-distcheck
-	$(CVS) update po
-	$(CVS) tag -c $(this-cvs-tag)
-	$(MAKE) dist
-
-# Use this to make sure we don't run these programs when building
-# from a virgin tgz file, below.
-null_AM_MAKEFLAGS = \
-  ACLOCAL=false \
-  AUTOCONF=false \
-  AUTOMAKE=false \
-  AUTOHEADER=false \
-  MAKEINFO=false
-
-# Detect format-string/arg-list mismatches that would normally be obscured
-# by the use of _().  The --disable-nls effectively defines away that macro,
-# and building with CFLAGS='-Wformat -Werror' causes any format warning to be
-# treated as a failure.  Also, check for shadowing problems with -Wshadow.
-# These CFLAGS are pretty strict.  If you build this target, you probably
-# have to have a recent version of gcc and glibc headers.
-TMPDIR ?= /tmp
-t=$(TMPDIR)/$(PACKAGE)/test
-my-distcheck: $(local-check) $(release_archive_dir)/$(prev-tgz)
-	-rm -rf $(t)
-	mkdir -p $(t)
-	GZIP=$(GZIP_ENV) $(AMTAR) -C $(t) -zxf $(distdir).tar.gz
-	cd $(t)/$(distdir)				\
-	  && ./configure --disable-nls			\
-	  && $(MAKE) CFLAGS='-Werror -Wall -Wformat -Wshadow' \
-	      AM_MAKEFLAGS='$(null_AM_MAKEFLAGS)'	\
-	  && $(MAKE) dvi				\
-	  && $(MAKE) check				\
-	  && $(MAKE) distclean
-	(cd $(t) && mv $(distdir) $(distdir).old	\
-	  && $(AMTAR) -zxf - ) < $(distdir).tar.gz
-	diff -ur $(t)/$(distdir).old $(t)/$(distdir)
-	-rm -rf $(t)
-	@echo "========================"; \
-	echo "$(distdir).tar.gz is ready for distribution"; \
-	echo "========================"
-
-WGET = wget
-WGETFLAGS = -C off
-
-rel-check:
-	tarz=/tmp/rel-check-tarz-$$$$; \
-	md5_tmp=/tmp/rel-check-md5-$$$$; \
-	set -e; \
-	trap 'status=$$?; rm -f $$tarz $$md5_tmp; exit $$status' 0 1 2 3 15; \
-	$(WGET) $(WGETFLAGS) -q --output-document=$$tarz $(url); \
-	echo "$(md5)  -" > $$md5_tmp; \
-	md5sum -c $$md5_tmp < $$tarz
-
-prev-tgz = $(PACKAGE)-$(PREV_VERSION).tar.gz
-xd-delta = $(PACKAGE)-$(PREV_VERSION)-$(VERSION).xdelta
-
-rel-files = $(xd-delta) $(DIST_ARCHIVES)
-announcement: NEWS ChangeLog $(rel-files)
-	@./announce-gen							\
-	    --release-type=$(RELEASE_TYPE)				\
-	    --package=$(PACKAGE)					\
-	    --prev=$(PREV_VERSION)					\
-	    --curr=$(VERSION)						\
-	    --release-archive-directory=$(release_archive_dir)		\
-	    --gpg-key-id=$(gpg_key_ID)					\
-	    --news=NEWS							\
-	    $(addprefix --url-dir=, $(url_dir_list))			\
-
-
-## ---------------- ##
-## Updating files.  ##
-## ---------------- ##
-
-ftp-gnu = ftp://ftp.gnu.org/gnu
-www-gnu = http://www.gnu.org
-
-# Use mv, if you don't have/want move-if-change.
-move_if_change ?= move-if-change
-
-
-# --------------------- #
-# Updating everything.  #
-# --------------------- #
-
-.PHONY: update
-local_updates ?= wget-update cvs-update po-update
-update: $(local_updates)
-
-
-# ------------------- #
-# Updating PO files.  #
-# ------------------- #
-
-po_repo = http://www.iro.umontreal.ca/contrib/po/maint/$(PACKAGE)
-.PHONY: do-po-update po-update
-do-po-update:
-	tmppo=/tmp/$(PACKAGE)-$(VERSION)-po &&\
-	rm -rf $$tmppo && \
-	mkdir $$tmppo && \
-	(cd $$tmppo && \
-	  $(WGET) $(WGETFLAGS) -r -l1 -nd --no-parent -A '*.po' $(po_repo)) &&\
-	cp $$tmppo/*.po po
-	cd po && $(MAKE) update-po
-	$(MAKE) po-check
-
-po-update:
-	if test -d "po"; then \
-	  $(MAKE) do-po-update; \
-	fi
-
-# -------------------------- #
-# Updating GNU build tools.  #
-# -------------------------- #
-
-# The following pseudo table associates a local directory and a URL
-# with each of the files that belongs to some other package and is
-# regularly updated from the specified URL.
-wget_files ?= \
-  $(srcdir)/build-aux/config.guess \
-  $(srcdir)/build-aux/config.sub \
-  $(srcdir)/build-aux/texinfo.tex \
-  $(srcdir)/src/ansi2knr.c
-
-get-targets = $(patsubst %, get-%, $(wget_files))
-
-config.guess-url_prefix = $(ftp-gnu)/build-aux/
-config.sub-url_prefix = $(ftp-gnu)/build-aux/
-
-ansi2knr.c-url_prefix = ftp://ftp.cs.wisc.edu/ghost/
-
-texinfo.tex-url_prefix = $(ftp-gnu)/texinfo/
-
-standards.texi-url_prefix = $(www-gnu)/prep/
-make-stds.texi-url_prefix = $(standards.texi-url_prefix)
-
-target = $(patsubst get-%, %, $@)
-url = $($(notdir $(target))-url_prefix)$(notdir $(target))
-
-.PHONY: $(get-targets)
-$(get-targets):
-	$(WGET) $(WGETFLAGS) $(url) -O $(target).t \
-	  && $(move_if_change) $(target).t $(target)
-
-cvs_files ?= \
-  $(srcdir)/build-aux/depcomp \
-  $(srcdir)/build-aux/install-sh \
-  $(srcdir)/build-aux/missing \
-  $(srcdir)/build-aux/mkinstalldirs \
-  $(srcdir)/src/ansi2knr.c
-automake_repo=:pserver:anoncvs:anoncvs@sources.redhat.com:/cvs/automake
-.PHONY: wget-update
-wget-update: $(get-targets)
-
-.PHONY: cvs-update
-cvs-update:
-	fail=;								\
-	for f in $(cvs_files); do					\
-	  test -f $$f || { echo "*** skipping $$f" 1>&2; continue; };	\
-	  cvs diff $$f > /dev/null					\
-	    || { echo "*** $$f is locally modified; skipping it" 1>&2;	\
-		 fail=yes; continue; };					\
-	  file=$$(basename $$f);					\
-	  echo checking out $$file...;					\
-	  $(CVS) -d $(automake_repo) co -p automake/lib/$$file> $$f.t	\
-	    && $(move_if_change) $$f.t $$f;				\
-	done;								\
-	test "$$fail" && exit 1
-
-emit_upload_commands:
-	@echo =====================================
-	@echo =====================================
-	@echo "$(srcdir)/gnupload $(GNUPLOADFLAGS) \\"
-	@echo "    --to $(gnu_rel_host):coreutils \\"
-	@echo "  $(rel-files)"
-	@echo '# send the /tmp/announcement e-mail'
-	@echo =====================================
-	@echo =====================================
-
-$(xd-delta): $(release_archive_dir)/$(prev-tgz) $(distdir).tar.gz
-	xdelta delta -9 $^ $@ || :
-
-.PHONY: alpha beta major
-alpha beta major: news-date-check $(local-check)
-	$(MAKE) cvs-dist
-	$(MAKE) $(xd-delta)
-	$(MAKE) -s announcement RELEASE_TYPE=$@ > /tmp/announce-$(my_distdir)
-	ln $(rel-files) $(release_archive_dir)
-	chmod a-w $(rel-files)
-	$(MAKE) -s emit_upload_commands RELEASE_TYPE=$@
-	echo $(VERSION) > $(prev_version_file)
-	$(CVS) ci -m. $(prev_version_file)
diff --git a/NEWS b/NEWS
deleted file mode 100644
index 3dca4fe..0000000
--- a/NEWS
+++ /dev/null
@@ -1,732 +0,0 @@
-Bison News
-----------
-
-Changes in version 2.3, 2006-06-05:
-
-* GLR grammars should now use `YYRECOVERING ()' instead of `YYRECOVERING',
-  for compatibility with LALR(1) grammars.
-
-* It is now documented that any definition of YYSTYPE or YYLTYPE should
-  be to a type name that does not contain parentheses or brackets.
-
-Changes in version 2.2, 2006-05-19:
-
-* The distribution terms for all Bison-generated parsers now permit
-  using the parsers in nonfree programs.  Previously, this permission
-  was granted only for Bison-generated LALR(1) parsers in C.
-
-* %name-prefix changes the namespace name in C++ outputs.
-
-* The C++ parsers export their token_type.
-
-* Bison now allows multiple %union declarations, and concatenates
-  their contents together.
-
-* New warning: unused values
-  Right-hand side symbols whose values are not used are reported,
-  if the symbols have destructors.  For instance:
-
-     exp: exp "?" exp ":" exp { $1 ? $1 : $3; }
-	| exp "+" exp
-	;
-
-  will trigger a warning about $$ and $5 in the first rule, and $3 in
-  the second ($1 is copied to $$ by the default rule).  This example
-  most likely contains three errors, and could be rewritten as:
-
-     exp: exp "?" exp ":" exp
-	    { $$ = $1 ? $3 : $5; free ($1 ? $5 : $3); free ($1); }
-	| exp "+" exp
-	    { $$ = $1 ? $1 : $3; if ($1) free ($3); }
-	;
-
-  However, if the original actions were really intended, memory leaks
-  and all, the warnings can be suppressed by letting Bison believe the
-  values are used, e.g.:
-
-     exp: exp "?" exp ":" exp { $1 ? $1 : $3; (void) ($$, $5); }
-	| exp "+" exp         { $$ = $1; (void) $3; }
-	;
-
-  If there are mid-rule actions, the warning is issued if no action
-  uses it.  The following triggers no warning: $1 and $3 are used.
-
-     exp: exp { push ($1); } '+' exp { push ($3); sum (); };
-
-  The warning is intended to help catching lost values and memory leaks.
-  If a value is ignored, its associated memory typically is not reclaimed.
-
-* %destructor vs. YYABORT, YYACCEPT, and YYERROR.
-  Destructors are now called when user code invokes YYABORT, YYACCEPT,
-  and YYERROR, for all objects on the stack, other than objects
-  corresponding to the right-hand side of the current rule.
-
-* %expect, %expect-rr
-  Incorrect numbers of expected conflicts are now actual errors,
-  instead of warnings.
-
-* GLR, YACC parsers.
-  The %parse-params are available in the destructors (and the
-  experimental printers) as per the documentation.
-
-* Bison now warns if it finds a stray `$' or `@' in an action.
-
-* %require "VERSION"
-  This specifies that the grammar file depends on features implemented
-  in Bison version VERSION or higher.
-
-* lalr1.cc: The token and value types are now class members.
-  The tokens were defined as free form enums and cpp macros.  YYSTYPE
-  was defined as a free form union.  They are now class members:
-  tokens are enumerations of the `yy::parser::token' struct, and the
-  semantic values have the `yy::parser::semantic_type' type.
-
-  If you do not want or can update to this scheme, the directive
-  `%define "global_tokens_and_yystype" "1"' triggers the global
-  definition of tokens and YYSTYPE.  This change is suitable both
-  for previous releases of Bison, and this one.
-
-  If you wish to update, then make sure older version of Bison will
-  fail using `%require "2.2"'.
-
-* DJGPP support added.
-
-Changes in version 2.1, 2005-09-16:
-
-* The C++ lalr1.cc skeleton supports %lex-param.
-
-* Bison-generated parsers now support the translation of diagnostics like
-  "syntax error" into languages other than English.  The default
-  language is still English.  For details, please see the new
-  Internationalization section of the Bison manual.  Software
-  distributors should also see the new PACKAGING file.  Thanks to
-  Bruno Haible for this new feature.
-
-* Wording in the Bison-generated parsers has been changed slightly to
-  simplify translation.  In particular, the message "memory exhausted"
-  has replaced "parser stack overflow", as the old message was not
-  always accurate for modern Bison-generated parsers.
-
-* Destructors are now called when the parser aborts, for all symbols left
-  behind on the stack.  Also, the start symbol is now destroyed after a
-  successful parse.  In both cases, the behavior was formerly inconsistent.
-
-* When generating verbose diagnostics, Bison-generated parsers no longer
-  quote the literal strings associated with tokens.  For example, for
-  a syntax error associated with '%token NUM "number"' they might
-  print 'syntax error, unexpected number' instead of 'syntax error,
-  unexpected "number"'.
-
-Changes in version 2.0, 2004-12-25:
-
-* Possibly-incompatible changes
-
-  - Bison-generated parsers no longer default to using the alloca function
-    (when available) to extend the parser stack, due to widespread
-    problems in unchecked stack-overflow detection.  You can "#define
-    YYSTACK_USE_ALLOCA 1" to require the use of alloca, but please read
-    the manual to determine safe values for YYMAXDEPTH in that case.
-
-  - Error token location.
-    During error recovery, the location of the syntax error is updated
-    to cover the whole sequence covered by the error token: it includes
-    the shifted symbols thrown away during the first part of the error
-    recovery, and the lookahead rejected during the second part.
-
-  - Semicolon changes:
-    . Stray semicolons are no longer allowed at the start of a grammar.
-    . Semicolons are now required after in-grammar declarations.
-
-  - Unescaped newlines are no longer allowed in character constants or
-    string literals.  They were never portable, and GCC 3.4.0 has
-    dropped support for them.  Better diagnostics are now generated if
-    forget a closing quote.
-
-  - NUL bytes are no longer allowed in Bison string literals, unfortunately.
-
-* New features
-
-  - GLR grammars now support locations.
-
-  - New directive: %initial-action.
-    This directive allows the user to run arbitrary code (including
-    initializing @$) from yyparse before parsing starts.
-
-  - A new directive "%expect-rr N" specifies the expected number of
-    reduce/reduce conflicts in GLR parsers.
-
-  - %token numbers can now be hexadecimal integers, e.g., `%token FOO 0x12d'.
-    This is a GNU extension.
-
-  - The option `--report=lookahead' was changed to `--report=look-ahead'.
-    The old spelling still works, but is not documented and will be
-    removed.
-
-  - Experimental %destructor support has been added to lalr1.cc.
-
-  - New configure option --disable-yacc, to disable installation of the
-    yacc command and -ly library introduced in 1.875 for POSIX conformance.
-
-* Bug fixes
-
-  - For now, %expect-count violations are now just warnings, not errors.
-    This is for compatibility with Bison 1.75 and earlier (when there are
-    reduce/reduce conflicts) and with Bison 1.30 and earlier (when there
-    are too many or too few shift/reduce conflicts).  However, in future
-    versions of Bison we plan to improve the %expect machinery so that
-    these violations will become errors again.
-
-  - Within Bison itself, numbers (e.g., goto numbers) are no longer
-    arbitrarily limited to 16-bit counts.
-
-  - Semicolons are now allowed before "|" in grammar rules, as POSIX requires.
-
-Changes in version 1.875, 2003-01-01:
-
-* The documentation license has been upgraded to version 1.2
-  of the GNU Free Documentation License.
-
-* syntax error processing
-
-  - In Yacc-style parsers YYLLOC_DEFAULT is now used to compute error
-    locations too.  This fixes bugs in error-location computation.
-
-  - %destructor
-    It is now possible to reclaim the memory associated to symbols
-    discarded during error recovery.  This feature is still experimental.
-
-  - %error-verbose
-    This new directive is preferred over YYERROR_VERBOSE.
-
-  - #defining yyerror to steal internal variables is discouraged.
-    It is not guaranteed to work forever.
-
-* POSIX conformance
-
-  - Semicolons are once again optional at the end of grammar rules.
-    This reverts to the behavior of Bison 1.33 and earlier, and improves
-    compatibility with Yacc.
-
-  - `parse error' -> `syntax error'
-    Bison now uniformly uses the term `syntax error'; formerly, the code
-    and manual sometimes used the term `parse error' instead.  POSIX
-    requires `syntax error' in diagnostics, and it was thought better to
-    be consistent.
-
-  - The documentation now emphasizes that yylex and yyerror must be
-    declared before use.  C99 requires this.
-
-  - Bison now parses C99 lexical constructs like UCNs and
-    backslash-newline within C escape sequences, as POSIX 1003.1-2001 requires.
-
-  - File names are properly escaped in C output.  E.g., foo\bar.y is
-    output as "foo\\bar.y".
-
-  - Yacc command and library now available
-    The Bison distribution now installs a `yacc' command, as POSIX requires.
-    Also, Bison now installs a small library liby.a containing
-    implementations of Yacc-compatible yyerror and main functions.
-    This library is normally not useful, but POSIX requires it.
-
-  - Type clashes now generate warnings, not errors.
-
-  - If the user does not define YYSTYPE as a macro, Bison now declares it
-    using typedef instead of defining it as a macro.
-    For consistency, YYLTYPE is also declared instead of defined.
-
-* Other compatibility issues
-
-  - %union directives can now have a tag before the `{', e.g., the
-    directive `%union foo {...}' now generates the C code
-    `typedef union foo { ... } YYSTYPE;'; this is for Yacc compatibility.
-    The default union tag is `YYSTYPE', for compatibility with Solaris 9 Yacc.
-    For consistency, YYLTYPE's struct tag is now `YYLTYPE' not `yyltype'.
-    This is for compatibility with both Yacc and Bison 1.35.
-
-  - `;' is output before the terminating `}' of an action, for
-    compatibility with Bison 1.35.
-
-  - Bison now uses a Yacc-style format for conflict reports, e.g.,
-    `conflicts: 2 shift/reduce, 1 reduce/reduce'.
-
-  - `yystype' and `yyltype' are now obsolescent macros instead of being
-    typedefs or tags; they are no longer documented and are planned to be
-    withdrawn in a future release.
-
-* GLR parser notes
-
-  - GLR and inline
-    Users of Bison have to decide how they handle the portability of the
-    C keyword `inline'.
-
-  - `parsing stack overflow...' -> `parser stack overflow'
-    GLR parsers now report `parser stack overflow' as per the Bison manual.
-
-* Bison now warns if it detects conflicting outputs to the same file,
-  e.g., it generates a warning for `bison -d -o foo.h foo.y' since
-  that command outputs both code and header to foo.h.
-
-* #line in output files
-  - --no-line works properly.
-
-* Bison can no longer be built by a K&R C compiler; it requires C89 or
-  later to be built.  This change originally took place a few versions
-  ago, but nobody noticed until we recently asked someone to try
-  building Bison with a K&R C compiler.
-
-Changes in version 1.75, 2002-10-14:
-
-* Bison should now work on 64-bit hosts.
-
-* Indonesian translation thanks to Tedi Heriyanto.
-
-* GLR parsers
-  Fix spurious parse errors.
-
-* Pure parsers
-  Some people redefine yyerror to steal yyparse' private variables.
-  Reenable this trick until an official feature replaces it.
-
-* Type Clashes
-  In agreement with POSIX and with other Yaccs, leaving a default
-  action is valid when $$ is untyped, and $1 typed:
-
-	untyped: ... typed;
-
-  but the converse remains an error:
-
-	typed: ... untyped;
-
-* Values of mid-rule actions
-  The following code:
-
-	foo: { ... } { $$ = $1; } ...
-
-  was incorrectly rejected: $1 is defined in the second mid-rule
-  action, and is equal to the $$ of the first mid-rule action.
-
-Changes in version 1.50, 2002-10-04:
-
-* GLR parsing
-  The declaration
-     %glr-parser
-  causes Bison to produce a Generalized LR (GLR) parser, capable of handling
-  almost any context-free grammar, ambiguous or not.  The new declarations
-  %dprec and %merge on grammar rules allow parse-time resolution of
-  ambiguities.  Contributed by Paul Hilfinger.
-
-  Unfortunately Bison 1.50 does not work properly on 64-bit hosts
-  like the Alpha, so please stick to 32-bit hosts for now.
-
-* Output Directory
-  When not in Yacc compatibility mode, when the output file was not
-  specified, running `bison foo/bar.y' created `foo/bar.c'.  It
-  now creates `bar.c'.
-
-* Undefined token
-  The undefined token was systematically mapped to 2 which prevented
-  the use of 2 by the user.  This is no longer the case.
-
-* Unknown token numbers
-  If yylex returned an out of range value, yyparse could die.  This is
-  no longer the case.
-
-* Error token
-  According to POSIX, the error token must be 256.
-  Bison extends this requirement by making it a preference: *if* the
-  user specified that one of her tokens is numbered 256, then error
-  will be mapped onto another number.
-
-* Verbose error messages
-  They no longer report `..., expecting error or...' for states where
-  error recovery is possible.
-
-* End token
-  Defaults to `$end' instead of `$'.
-
-* Error recovery now conforms to documentation and to POSIX
-  When a Bison-generated parser encounters a syntax error, it now pops
-  the stack until it finds a state that allows shifting the error
-  token.  Formerly, it popped the stack until it found a state that
-  allowed some non-error action other than a default reduction on the
-  error token.  The new behavior has long been the documented behavior,
-  and has long been required by POSIX.  For more details, please see
-  Paul Eggert, "Reductions during Bison error handling" (2002-05-20)
-  <http://lists.gnu.org/archive/html/bug-bison/2002-05/msg00038.html>.
-
-* Traces
-  Popped tokens and nonterminals are now reported.
-
-* Larger grammars
-  Larger grammars are now supported (larger token numbers, larger grammar
-  size (= sum of the LHS and RHS lengths), larger LALR tables).
-  Formerly, many of these numbers ran afoul of 16-bit limits;
-  now these limits are 32 bits on most hosts.
-
-* Explicit initial rule
-  Bison used to play hacks with the initial rule, which the user does
-  not write.  It is now explicit, and visible in the reports and
-  graphs as rule 0.
-
-* Useless rules
-  Before, Bison reported the useless rules, but, although not used,
-  included them in the parsers.  They are now actually removed.
-
-* Useless rules, useless nonterminals
-  They are now reported, as a warning, with their locations.
-
-* Rules never reduced
-  Rules that can never be reduced because of conflicts are now
-  reported.
-
-* Incorrect `Token not used'
-  On a grammar such as
-
-           %token useless useful
-           %%
-           exp: '0' %prec useful;
-
-  where a token was used to set the precedence of the last rule,
-  bison reported both `useful' and `useless' as useless tokens.
-
-* Revert the C++ namespace changes introduced in 1.31
-  as they caused too many portability hassles.
-
-* Default locations
-  By an accident of design, the default computation of @$ was
-  performed after another default computation was performed: @$ = @1.
-  The latter is now removed: YYLLOC_DEFAULT is fully responsible of
-  the computation of @$.
-
-* Token end-of-file
-  The token end of file may be specified by the user, in which case,
-  the user symbol is used in the reports, the graphs, and the verbose
-  error messages instead of `$end', which remains being the default.
-  For instance
-     %token MYEOF 0
-  or
-     %token MYEOF 0 "end of file"
-
-* Semantic parser
-  This old option, which has been broken for ages, is removed.
-
-* New translations
-  Brazilian Portuguese, thanks to Alexandre Folle de Menezes.
-  Croatian, thanks to Denis Lackovic.
-
-* Incorrect token definitions
-  When given `%token 'a' "A"', Bison used to output `#define 'a' 65'.
-
-* Token definitions as enums
-  Tokens are output both as the traditional #define's, and, provided
-  the compiler supports ANSI C or is a C++ compiler, as enums.
-  This lets debuggers display names instead of integers.
-
-* Reports
-  In addition to --verbose, bison supports --report=THINGS, which
-  produces additional information:
-  - itemset
-    complete the core item sets with their closure
-  - lookahead [changed to `look-ahead' in 1.875e and later]
-    explicitly associate look-ahead tokens to items
-  - solved
-    describe shift/reduce conflicts solving.
-    Bison used to systematically output this information on top of
-    the report.  Solved conflicts are now attached to their states.
-
-* Type clashes
-  Previous versions don't complain when there is a type clash on
-  the default action if the rule has a mid-rule action, such as in:
-
-      %type <foo> bar
-      %%
-      bar: '0' {} '0';
-
-  This is fixed.
-
-* GNU M4 is now required when using Bison.
-
-Changes in version 1.35, 2002-03-25:
-
-* C Skeleton
-  Some projects use Bison's C parser with C++ compilers, and define
-  YYSTYPE as a class.  The recent adjustment of C parsers for data
-  alignment and 64 bit architectures made this impossible.
-
-  Because for the time being no real solution for C++ parser
-  generation exists, kludges were implemented in the parser to
-  maintain this use.  In the future, when Bison has C++ parsers, this
-  kludge will be disabled.
-
-  This kludge also addresses some C++ problems when the stack was
-  extended.
-
-Changes in version 1.34, 2002-03-12:
-
-* File name clashes are detected
-  $ bison foo.y -d -o foo.x
-  fatal error: header and parser would both be named `foo.x'
-
-* A missing `;' at the end of a rule triggers a warning
-  In accordance with POSIX, and in agreement with other
-  Yacc implementations, Bison will mandate this semicolon in the near
-  future.  This eases the implementation of a Bison parser of Bison
-  grammars by making this grammar LALR(1) instead of LR(2).  To
-  facilitate the transition, this release introduces a warning.
-
-* Revert the C++ namespace changes introduced in 1.31, as they caused too
-  many portability hassles.
-
-* DJGPP support added.
-
-* Fix test suite portability problems.
-
-Changes in version 1.33, 2002-02-07:
-
-* Fix C++ issues
-  Groff could not be compiled for the definition of size_t was lacking
-  under some conditions.
-
-* Catch invalid @n
-  As is done with $n.
-
-Changes in version 1.32, 2002-01-23:
-
-* Fix Yacc output file names
-
-* Portability fixes
-
-* Italian, Dutch translations
-
-Changes in version 1.31, 2002-01-14:
-
-* Many Bug Fixes
-
-* GNU Gettext and %expect
-  GNU Gettext asserts 10 s/r conflicts, but there are 7.  Now that
-  Bison dies on incorrect %expectations, we fear there will be
-  too many bug reports for Gettext, so _for the time being_, %expect
-  does not trigger an error when the input file is named `plural.y'.
-
-* Use of alloca in parsers
-  If YYSTACK_USE_ALLOCA is defined to 0, then the parsers will use
-  malloc exclusively.  Since 1.29, but was not NEWS'ed.
-
-  alloca is used only when compiled with GCC, to avoid portability
-  problems as on AIX.
-
-* yyparse now returns 2 if memory is exhausted; formerly it dumped core.
-
-* When the generated parser lacks debugging code, YYDEBUG is now 0
-  (as POSIX requires) instead of being undefined.
-
-* User Actions
-  Bison has always permitted actions such as { $$ = $1 }: it adds the
-  ending semicolon.  Now if in Yacc compatibility mode, the semicolon
-  is no longer output: one has to write { $$ = $1; }.
-
-* Better C++ compliance
-  The output parsers try to respect C++ namespaces.
-  [This turned out to be a failed experiment, and it was reverted later.]
-
-* Reduced Grammars
-  Fixed bugs when reporting useless nonterminals.
-
-* 64 bit hosts
-  The parsers work properly on 64 bit hosts.
-
-* Error messages
-  Some calls to strerror resulted in scrambled or missing error messages.
-
-* %expect
-  When the number of shift/reduce conflicts is correct, don't issue
-  any warning.
-
-* The verbose report includes the rule line numbers.
-
-* Rule line numbers are fixed in traces.
-
-* Swedish translation
-
-* Parse errors
-  Verbose parse error messages from the parsers are better looking.
-  Before: parse error: unexpected `'/'', expecting `"number"' or `'-'' or `'(''
-     Now: parse error: unexpected '/', expecting "number" or '-' or '('
-
-* Fixed parser memory leaks.
-  When the generated parser was using malloc to extend its stacks, the
-  previous allocations were not freed.
-
-* Fixed verbose output file.
-  Some newlines were missing.
-  Some conflicts in state descriptions were missing.
-
-* Fixed conflict report.
-  Option -v was needed to get the result.
-
-* %expect
-  Was not used.
-  Mismatches are errors, not warnings.
-
-* Fixed incorrect processing of some invalid input.
-
-* Fixed CPP guards: 9foo.h uses BISON_9FOO_H instead of 9FOO_H.
-
-* Fixed some typos in the documentation.
-
-* %token MY_EOF 0 is supported.
-  Before, MY_EOF was silently renumbered as 257.
-
-* doc/refcard.tex is updated.
-
-* %output, %file-prefix, %name-prefix.
-  New.
-
-* --output
-  New, aliasing `--output-file'.
-
-Changes in version 1.30, 2001-10-26:
-
-* `--defines' and `--graph' have now an optional argument which is the
-  output file name. `-d' and `-g' do not change; they do not take any
-  argument.
-
-* `%source_extension' and `%header_extension' are removed, failed
-  experiment.
-
-* Portability fixes.
-
-Changes in version 1.29, 2001-09-07:
-
-* The output file does not define const, as this caused problems when used
-  with common autoconfiguration schemes.  If you still use ancient compilers
-  that lack const, compile with the equivalent of the C compiler option
-  `-Dconst='.  autoconf's AC_C_CONST macro provides one way to do this.
-
-* Added `-g' and `--graph'.
-
-* The Bison manual is now distributed under the terms of the GNU FDL.
-
-* The input and the output files has automatically a similar extension.
-
-* Russian translation added.
-
-* NLS support updated; should hopefully be less troublesome.
-
-* Added the old Bison reference card.
-
-* Added `--locations' and `%locations'.
-
-* Added `-S' and `--skeleton'.
-
-* `%raw', `-r', `--raw' is disabled.
-
-* Special characters are escaped when output.  This solves the problems
-  of the #line lines with path names including backslashes.
-
-* New directives.
-  `%yacc', `%fixed_output_files', `%defines', `%no_parser', `%verbose',
-  `%debug', `%source_extension' and `%header_extension'.
-
-* @$
-  Automatic location tracking.
-
-Changes in version 1.28, 1999-07-06:
-
-* Should compile better now with K&R compilers.
-
-* Added NLS.
-
-* Fixed a problem with escaping the double quote character.
-
-* There is now a FAQ.
-
-Changes in version 1.27:
-
-* The make rule which prevented bison.simple from being created on
-  some systems has been fixed.
-
-Changes in version 1.26:
-
-* Bison now uses automake.
-
-* New mailing lists: <bug-bison@gnu.org> and <help-bison@gnu.org>.
-
-* Token numbers now start at 257 as previously documented, not 258.
-
-* Bison honors the TMPDIR environment variable.
-
-* A couple of buffer overruns have been fixed.
-
-* Problems when closing files should now be reported.
-
-* Generated parsers should now work even on operating systems which do
-  not provide alloca().
-
-Changes in version 1.25, 1995-10-16:
-
-* Errors in the input grammar are not fatal; Bison keeps reading
-the grammar file, and reports all the errors found in it.
-
-* Tokens can now be specified as multiple-character strings: for
-example, you could use "<=" for a token which looks like <=, instead
-of chosing a name like LESSEQ.
-
-* The %token_table declaration says to write a table of tokens (names
-and numbers) into the parser file.  The yylex function can use this
-table to recognize multiple-character string tokens, or for other
-purposes.
-
-* The %no_lines declaration says not to generate any #line preprocessor
-directives in the parser file.
-
-* The %raw declaration says to use internal Bison token numbers, not
-Yacc-compatible token numbers, when token names are defined as macros.
-
-* The --no-parser option produces the parser tables without including
-the parser engine; a project can now use its own parser engine.
-The actions go into a separate file called NAME.act, in the form of
-a switch statement body.
-
-Changes in version 1.23:
-
-The user can define YYPARSE_PARAM as the name of an argument to be
-passed into yyparse.  The argument should have type void *.  It should
-actually point to an object.  Grammar actions can access the variable
-by casting it to the proper pointer type.
-
-Line numbers in output file corrected.
-
-Changes in version 1.22:
-
---help option added.
-
-Changes in version 1.20:
-
-Output file does not redefine const for C++.
-
-Local Variables:
-mode: outline
-End:
-
------
-
-Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-2004, 2005, 2006 Free Software Foundation, Inc.
-
-This file is part of Bison, the GNU Compiler Compiler.
-
-Bison 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.
-
-Bison 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 autoconf; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA.
diff --git a/OChangeLog b/OChangeLog
deleted file mode 100644
index 5ae60b9..0000000
--- a/OChangeLog
+++ /dev/null
@@ -1,1500 +0,0 @@
-1998-01-04  J.J. van der Heijden  <J.J.vanderHeijden@student.utwente.nl>
-
-	* src/files.c (openfiles) [_WIN32 && !__CYGWIN32__]: Use TEMP or
-	Temp to find a temporary directory, if possible.  Do not unlink
-	files while they are open.
-
-1997-08-25  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* src/reader.c (stack_offset;): Change some warni to warns.
-
-	* src/lex.c (literalchar): Use warns, not warni.
-
-1997-06-28  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* src/bison.simple: Add a Bison version comment.
-
-	* Makefile.in (bison_version): New variable.
-	(dist): Use that variable.
-	(bison.s1): Substitute the Bison version into bison.simple.
-
-	* src/main.c (fatal, warn, berror): Use program_name.
-
-1997-06-18  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* Makefile.in: new.h renamed to alloc.h.
-	* src/*.c: src/new.h renamed to src/alloc.h.
-
-	* src/alloc.h: Renamed from src/new.h.
-
-1997-06-15  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* src/main.c (fatal, warn, berror): Make error messages standard.
-	(toomany): Improve error message text.
-
-1997-05-24  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* src/lex.c (literalchar): Fix the code for escaping \, " and '.
-
-1997-05-23  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* src/lex.c (lex): Avoid trouble when there are many chars
-	to discard in a char literal with just several chars in it.
-
-1997-05-17  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* src/bison.simple: Use malloc, if using alloca is troublesome.
-	(YYSTACK_USE_ALLOCA): New flag macro.
-	Define it for some systems and compilers.
-	(YYSTACK_ALLOC): New macro.
-	(yyparse): Use YYSTACK_ALLOC to allocate stack.
-	If it was malloc'd, free it.
-
-1997-05-02  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* src/bison.simple [_AIX]: Don't include malloc.h.
-
-1997-04-23  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* src/bison.simple (alloca) [__hpux]: Always define as
-	__builtin_alloca.
-
-1997-04-22  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* src/bison.simple (__yy_memcpy): Declare arg `count' as unsigned
-	int.
-	(yyparse): Cast third arg to __yy_memcpy to unsigned int.
-
-	* src/bison.simple (alloca) [__hpux]: Include alloca.h (right for
-	HPUX 10) instead of declaring alloca (right for HPUX 9).
-
-1997-01-02  Richard Stallman  <rms@ethanol.gnu.ai.mit.edu>
-
-	* src/allocate.c [__STDC__ or _MSC_VER]:
-	Declare calloc and realloc to return void *.
-
-	* Makefile.in (dist): Explicitly check for symlinks, and copy them.
-
-1996-12-17  Paul Eggert  <eggert@twinsun.com>
-
-	* src/bison.simple (yyparse): If __GNUC__ and YYPARSE_PARAM are
-	both defined, declare yyparse to have a void * argument.
-
-1996-12-17  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* src/system.h [_MSC_VER]: Include stdlib.h and process.h.
-	[_MSC_VER] (getpid): Define as macro--translate it to _getpid.
-
-	* src/reduce.c (nbits): Add some casts.
-
-	* src/main.c (main): Return FAILURE as a value.
-	(printable_version): Declare arg as int, not char.
-
-	* src/files.c [_MSC_VER] (XPFILE, XPFILE1): Define, if not already
-	defined.
-
-1996-12-16  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* src/main.c (printable_version): Use type `int' for the arg.
-
-1996-08-12  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* src/bison.simple: Test _MSDOS as well as _MSDOS_.
-
-1996-07-31  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* src/bison.simple [__sun && __i386]: Include alloca.h.
-
-1996-07-30  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* src/bison.simple: Test _MSDOS_, not MSDOS.
-
-1996-06-01  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-	* All files: Insert `_' macro around many string constants.
-
-	* src/system.h [HAVE_LOCALE_H]: Include locale.h.
-	[! HAVE_LOCALE_H] (setlocale): Define as no-op.
-	[ENABLE_NLS]: Include libintl.h.
-	[ENABLE_NLS] (gettext): Define.
-	[! ENABLE_NLS] (bintextdomain, textdomain, _): Consolation definitions.
-	(N_, PACKAGE, LOCALEDIR): New macros.
-
-	* src/main.c (main): Call setlocale, bindtextdomain and textdomain.
-
-	* POTFILES.in: New file.
-
-	* Makefile.in (allocate.o): Define target explicitly.
-
-1996-06-01  Jim Meyering  <meyering@na-net.ornl.gov>
-
-	* Makefile.in (CFLAGS): Set to @CFLAGS@.
-	(LDFLAGS): Set to @LDFLAGS@.
-	(configure): Run autoconf only if preceding `cd' succeeds.
-	(src/bison.s1): Redirect output to temporary file then move the
-	temporary to the target, rather than redirecting directly to
-	src/bison.s1.
-	(clean): Remove config.status and config.log.
-	(distclean): Don't remove config.status here.
-
-1996-05-12  Jim Meyering  <meyering@na-net.ornl.gov>
-
-	* src/bison.simple (__yy_memcpy) [__cplusplus]: Reorder declarations
- 	of variables f and t.
-
-1996-05-11  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
-
-	* Version 1.25 released.
-
-	* Makefile.in (dist): Don't use $(srcdir).
-
-	* src/bison.simple (__yy_memcpy): Really reorder the args, as was
-	supposedly done on Feb 14 1995.
-	(yyparse): Calls changed accordingly.
-
-1996-01-24  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/output.c (output_rule_data): Test YYERROR_VERBOSE in the
-	conditional around the definition of ttyname.
-
-1995-12-28  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple: Fix line numbers in #line commands.
-
-1995-12-24  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple (YYPARSE_PARAM_DECL): In C++, make it always
-	null.
-	(YYPARSE_PARAM_ARG): New macro.
-	(yyparse): Use YYPARSE_PARAM_ARG.
-
-1995-10-15  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/version.c: Version now 1.25.
-
-	* src/main.c (warn): Set `failure'.
-
-1995-08-01   Wilfred J. Hansen  <wjh+@cmu.edu>
-
-	* src/bison.cld, src/getargs.c, src/vmsgetargs.c: Added -n, -k,
-	and -raw switches.
-	(noparserflag, toknumflag, rawtoknumflag): New variables.
-
-	* src/conflicts.c (resolve_sr_conflict): Remove use of alloca.
-
-	* src/files.c (openfiles, open_extra_files, done):  Add faction flag
-	and actfile file.  Handle noparserflag.  Both for -n switch.
-
-	* src/lex.c: Include getopt.h.  Add some extern decls.
-	(safegetc): New function to deal with EOF gracefully.
-	(literalchar); new function to deal with reading \ escapes.
-	(lex): Use literalchar.
-	(lex): Implemented "..." tokens.
-	(literalchar, lex, parse_percent_token): Made tokenbuffer
-	always contain the token.  This includes growing the token
-	buffer while reading an integer.
-	(parse_percent_token): Replaced if-else statement with percent_table.
-	(parse_percent_token): Added % declarations as another
-	way to specify the flags -n, -l, and -r.  Also added hooks for
-	-d, -k, -y, -v, -t, -p, -b, -o, but implementation requires
-	major changes to src/files.c.
-	(lex) Retain in the incoming stream a character following
-	an incorrect '/'.
-	(skip_white_space, lex):  Revised most error messages
-	and changed fatal to warn to avoid aborting.
-	(percent_table):  Added %thong declarations.
-
-	* src/lex.h: Added THONG and NOOP for alias processing.
-	Added SETOPT for the new code that allows setting options with %flags.
-
-	* src/main.c (main): If reader sees an error, don't process the
-	grammar.
-	(fatals): Updated to not use VARARGS1.
-	(printable_version, int_to_string, warn, warni, warns, warnss)
-	(warnsss): New error reporting functions.  Avoid abort for error.
-
-	* src/output.c (output_headers, output_trailers, output, output_gram)
-	(output_rule_data): Implement noparserflag variable.
-	Implement toknumflag variable.
-	(output): Call reader_output_yylsp to output LTYPESTR.
-
-	* src/reader.c (reader_output_yylsp): New function.
-	(readgram): Use `#if 0' around code that accepted %command inside
-	grammar rules: The documentation doesn't allow it, and it will
-	fail since the %command processors scan for the next %.
-	(parse_token_decl): Extended the %token declaration to allow a
-	multi-character symbol as an alias.
-	(parse_thong_decl): New function.
-	(read_declarations): Added %thong declarations.
-	(read_declarations): Handle NOOP to deal with allowing %
-	declarations as another means to specify the flags.
-	(readgram): Allow %prec prior to semantics embedded in a rule.
-	(skip_to_char, read_declarations, copy_definition)
-	(parse_token_decl, parse_start_decl, parse_type_decl)
-	(parse_assoc_decl, parse_union_decl, parse_expect_decl)
-	(get_type_name, copy_guard, copy_action, readgram)
-	(get_type, packsymbols): Revised most error messages.  Changed
-	`fatal' to `warnxxx' to avoid aborting for error.  Revised and use
-	multiple warnxxx functions to avoid using VARARGS1.
-	(read_declarations): Improve the error message for an invalid
-	character.  Do not abort.
-	(read_declarations, copy_guard, copy_action): Use
-	printable_version to avoid unprintable characters in printed
-	output.
-	(parse_expect_decl): Error if argument to %expect exceeds 10
-	digits.
-	(parse_token_decl, parse_assoc_decl, parse_type_decl, get_type):
-	Allow the type of a non-terminal can be given more than once, as
-	long as all specifications give the same type.
-
-	* src/reduce.c (reduce_grammar): Revise an error message.
-	(print_notices): Remove final `.' from error message.
-
-	* src/symtab.h (SALIAS): New #define for adding aliases to %token.
-	(struct bucket): Added `alias' field.
-
-1995-05-03  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple: Change distribution terms.
-
-	* src/version.c: Version now 1.23.  No, 1.24.
-
-1995-02-23  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/files.c: Test __VMS_POSIX as well as VMS.
-
-1995-02-14  Jim Meyering <meyering@comco.com>
-
-	* src/bison.simple (__yy_memcpy): Renamed from __yy_bcopy to avoid
-	confusion.  Reverse FROM and TO arguments to be consistent with
-	those of memcpy.
-
-1994-11-10  David J. MacKenzie  <djm@duality.gnu.ai.mit.edu>
-
-	* Makefile.in (DISTFILES): Include install-sh, not install.sh.
-	Include NEWS.
-
-	* configure.in: Update to Autoconf v2 macro names.
-
-1994-10-04  David J. MacKenzie  <djm@duality.gnu.ai.mit.edu>
-
-	* Makefile.in (prefix, exec_prefix): Let configure set them.
-
-1994-09-28  David J. MacKenzie  <djm@duality.gnu.ai.mit.edu>
-
-	* Makefile.in: Set datadir to $(prefix)/share.
-
-1994-07-12  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/reader.c (reader): Rename undefined-token token to
-	`$undefined.'.
-
-1994-05-05  David J. MacKenzie  <djm@nutrimat.gnu.ai.mit.edu>
-
-	* Makefile.in (DISTFILES): Add install.sh.
-	(install): Remove chmod commands.
-
-1994-03-26  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple: Fix #line commands.
-
-1994-03-24  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/conflicts.c (print_reductions): Increment both fp1 and fp2
-	while printing reductions in multi-rule case.
-
-1994-01-02  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in (LDFLAGS): Make it empty by default.
-	(bison): Use CFLAGS.
-
-1993-11-21  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple (YYLEX): Take notice of YYLEX_PARAM.
-
-1993-10-18  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple (YYPARSE_PARAM_DECL): Always define this.
-
-1993-10-14  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple (yyparse): Support YYPARSE_PARAM.
-
-1993-09-13  Noah Friedman  <friedman@nutrimat.gnu.ai.mit.edu>
-
-	* Makefile.in (check): New target.
-
-1993-09-10  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/conflicts.c (alloca): #undef before defining.
-
-	* src/system.h (bcopy): Don't define if already defined.
-
-1993-09-06  Noah Friedman  <friedman@nutrimat.gnu.ai.mit.edu>
-
-	* Version 1.22 released.
-
-	* mkinstalldirs: New file.
-
-	* Makefile.in (dist): Use .gz for extension, not .z.
-	(DISTFILES): New variable.
-	(dist): Use it instead of explicit file list.
-	Try to link each file separately, then copy file if ln fails.
-	(installdirs): Use mkinstalldirs script.
-
-1993-07-29  David J. MacKenzie  <djm@wookumz.gnu.ai.mit.edu>
-
-	* Makefile.in (config.status): Run config.status --recheck, not
-	configure, to get the right args passed.
-
-1993-07-24  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple (yyparse): Init yychar1 to avoid warning.
-
-1993-07-04  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple (yyparse): Don't set yyval when yylen is 0.
-
-1993-06-26  David J. MacKenzie  <djm@wookumz.gnu.ai.mit.edu>
-
-	* src/getargs.c (getargs): Exit after printing the version number.
-	Add --help and -h options.
-	(usage): New function.
-
-1993-06-25  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/getargs.c (longopts): Allow `output' as an alternative.
-
-1993-06-16  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple (yyparse): Conditionalize the entire call to
-	yyoverflow, not just two arguments in it.
-
-1993-06-03  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple [__hpux] (alloca): Don't specify arg types.
-
-1993-05-07  Noah Friedman  <friedman@nutrimat.gnu.ai.mit.edu>
-
-	* Makefile.in (install): Depend on `uninstall' and `installdirs'.
-	(installdirs): New target.
-
-1993-04-28  Noah Friedman  <friedman@nutrimat.gnu.ai.mit.edu>
-
-	* src/reader.c:  Remove declaration of atoi.
-
-1993-04-23  Noah Friedman  <friedman@nutrimat.gnu.ai.mit.edu>
-
-	* src/new.h [!__STDC__] (FREE): Check x != 0.
-	Make expr to call `free' evaluate to 0.
-
-1993-04-20  David J. MacKenzie  <djm@kropotkin.gnu.ai.mit.edu>
-
-	* src/files.c [MSDOS]: Use xmalloc, not malloc.
-	* src/allocate.c (xmalloc): Renamed from mallocate.  Remove old
-	wrapper.
-	* src/conflicts.c, src/symtab.c, src/files.c, src/LR0.c,
-	src/new.h: Change callers.
-	* src/allocate.c (xrealloc): New function.
-	* src/new.h: Declare it.
-	* src/lex.c, src/reader.c: Use it.
-
-1993-04-18  Noah Friedman  <friedman@nutrimat.gnu.ai.mit.edu>
-
-	* Version 1.21 released.
-
-	* src/reader.c : Don't declare `realloc'.
-
-	* Makefile.in (bison.s1): use `rm -f' since it's quieter.
-	(dist): make gzipped tar file.
-
-1993-04-16  Noah Friedman  <friedman@nutrimat.gnu.ai.mit.edu>
-
-	* Makefile.in (Makefile, config.status, configure): New targets.
-
-1993-04-15  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/main.c: Don't declare `abort'.
-
-	* src/files.c: Don't declare `exit'.
-
-1993-04-15  Noah Friedman  <friedman@nutrimat.gnu.ai.mit.edu>
-
-	* configure.in: Add AC_CONST.
-
-1993-04-14  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in (all): Depend on bison.s1.
-
-1993-04-13  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Version 1.20 released.
-
-1993-03-24  Richard Stallman  <rms@wookumz.gnu.ai.mit.edu>
-
-	* src/output.c (output_headers): Rename yynerrs if -p.
-
-1993-03-18  Noah Friedman  <friedman@nutrimat.gnu.ai.mit.edu>
-
-	* src/system.h: Don't try to include stdlib.h unless HAVE_STDLIB_H
-	is defined.
-
-	* configure.in: Check for stdlib.h.
-
-1993-03-17  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple [__hpux, not __GNUC__]: Declare alloca.
-	(yyparse): When printing the expected token types for an error,
-	Avoid negative indexes in yycheck and yytname.
-
-1993-03-13  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in (files.o, .c.o): Put CPPFLAGS and CFLAGS last.
-
-1993-03-01  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple: Test __sgi like __sparc.
-
-1993-02-17  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/conflicts.c (resolve_sr_conflict): Add extra parens in
-	alloca call.
-
-	* src/bison.simple [__GNUC__] (yyparse): Declare with prototype.
-
-1993-01-15  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/conflicts.c (print_reduction): Near end, increment fp2 when
-	mask recycles.
-
-1993-01-13  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in (bison.s1): New target.  Modifies bison.simple.
-	(install): Install bison.s1, without changing it.
-	(clean): Delete bison.s1.
-
-1993-01-04  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/reader.c (reader): Put Bison version in comment in output
-	file.
-
-1992-12-22  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/files.c (openfiles): Use .output, not .out, for outfile,
-	regardless of spec_name_prefix.
-
-1992-12-15  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/output.c (output_gram): Include yyrhs in the same #if as
-	yyprhs.
-
-1992-12-15  Noah Friedman  <friedman@nutrimat.gnu.ai.mit.edu>
-
-	* src/output.c (output): output directives checking for
-	__cplusplus as well as __STDC__ to determine when to define
-	"const" as an empty token.  (Patch from Wolfgang Glunz
-	<wogl@sun11a.zfe.siemens.de>)
-
-1992-12-08  David J. MacKenzie  <djm@kropotkin.gnu.ai.mit.edu>
-
-	* src/system.h, src/conflicts.c: Replace USG with HAVE_STRING_H
-	and HAVE_MEMORY_H.
-
-1992-11-21  David J. MacKenzie  <djm@goldman.gnu.ai.mit.edu>
-
-	* Makefile.in: Set and use $(MAKEINFO).
-
-1992-11-20  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/files.c (done) [MSDOS]: Delete the tmpdefsfile with the
-	rest.
-
-1992-10-08  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in (dist): Put configure.bat in the distribution.
-
-1992-10-01  David J. MacKenzie  <djm@goldman.gnu.ai.mit.edu>
-
-	* Makefile.in (install): cd to $(srcdir) before installing info
-	files.
-
-1992-09-30  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in (files.o): Supply $(DEFS), and $(CPPFLAGS).
-
-1992-09-25  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Version 1.19 released.
-
-	* src/reader.c (parse_union_decl): Fix ending of C++ comment;
-	don't lose the char after the newline.
-
-	* configure.bat: New file.
-
-1992-09-24  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/conflicts.c: Check for using alloca.h as getopt.c does.
-
-1992-09-06  Karl Berry  <karl@hayley>
-
-	* src/files.c (openfiles): open `fdefines' after we have assigned
-	a name to `tmpdefsfile', and only if `definesflag' is set.
-	(done): only create the real .tab.h file if `definesflag' is set.
-	* src/reader.c (packsymbols): don't close `fdefines' here.
-
-1992-09-05  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/files.c (openfiles): Open fdefines as temp file, like
-	ftable.
-	(done): Copy temp defines file to real one, like main output file.
-
-1992-08-21  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in (dist): Don't release mergedir.awk
-	(install): Use sed, not awk.  Don't depend on mergedir.awk.
-	* mergedir.awk: File effectively deleted.
-
-1992-07-29  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple: Test __sparc along with __sparc__.
-
-1992-07-11  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/lex.c (skip_white_space): Count \n just once at end of c++
-	comment.
-
-1992-06-26  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple: Comment fix; #line command updated.
-
-1992-06-24  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in (install): Specify full new file name for the
-	executable.
-
-1992-06-22  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in (dist): Include bison.rnh in distribution.
-
-Sun Jun 21 22:42:13 1992 Eric Youngdale <youngdale@v6550c.nrl.navy.mil>
-
-	Clean up rough edges in VMS port of bison, add support for
-	remaining command line options.
-
-	* src/bison.cld: Add /version, /yacc, /file_prefix, and
-	/name_prefix switches.
-
-	* src/build.com: General cleanup: add logic to automatically sense
-	which C compiler is present; add code to cwd to the directory that
-	contains bison sources; do not define XPFILE, XPFILE1
-	(correct defaults are applied in src/file.c).
-
-	* src/files.c: Append _tab, not .tab when using /file_prefix under
-	VMS.
-
-	* src/system.h: Include string.h instead of strings.h (a la USG).
-
-	* src/vmsgetargs.c: Add support for all switches added to
-	src/bison.cld.
-
-1992-06-21  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in (install): Always specify new file name for install.
-	Redirect awk output to temp file and install that.
-
-1992-05-27  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple (yyparse): Make yybackup and yyerrlab1 always
-	be used.
-
-1992-05-22  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in (dist): Depend on bison.info
-	(bison.info): Delete spurious <.
-
-1992-05-17  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in (.c.o): New rule.  Use $(DEFS) directly.
-	(CFLAGS): Use just -g by default.
-	(CDEBUG): Variable deleted.
-
-1992-05-07  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/reader.c (copy_guard): Fix typo skipping comment.
-
-1992-05-04  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Version 1.18.
-
-	* src/getargs.c (getargs): Change '0' to 0 in case for long
-	options.
-
-1992-04-19  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/reader.c (packsymbols): Handle -p when declaring yylval.
-
-1992-04-18  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/output.c (output_gram): Output #endif properly at end of
-	decl.
-
-1992-03-30  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Version 1.17.
-
-	* Makefile.in (clean): Don't delete configuration files or TAGS.
-	(distclean): New target; do delete those.
-
-1992-03-28  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/output.c (output_gram): Conditionalize yyprhs on YYDEBUG.
-
-	* src/LR0.c (augment_automaton): If copying sp->shifts to insert
-	new shift, handle case of inserting at end.
-
-1992-03-21  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/lex.c (skip_white_space): Handle C++ comments.
-	* src/reader.c (copy_definition, parse_union_decl, copy_guard):
-	(copy_action): Likewise.
-
-1992-03-08  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple (YYPOPSTACK): Fix typo.
-
-1992-02-29  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in (install): Install bison.info* files one by one.
-
-1992-02-28  David J. MacKenzie  <djm@wookumz.gnu.ai.mit.edu>
-
-	* src/bison.1: Document long options as starting with `--', not
-	`+'.
-
-1992-02-01  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/getargs.c (getargs): Accept value 0 from getopt_long.
-
-1992-01-30  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in (mostlyclean): Renamed from `clean'.
-	(clean): Renamed from 'distclean'.  Dep on mostlyclean, not
-	realclean.
-	(realclean): Dep on clean.
-
-1992-01-27  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple: Use malloc, not xmalloc, and handle failure
-	explicitly.
-
-1992-01-26  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/conflicts.c (total_conflicts): Delete unused arg to fprintf.
-
-1992-01-21  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Version 1.16.
-
-1992-01-06  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile (distclean): Depend on clean, not realclean.  Don't rm
-	TAGS.
-	(realclean): rm TAGS here.
-
-	* src/symtab.c (free_symtab): Don't free the type names.
-
-1991-12-29  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/machine.h: MSDOS has 32-bit ints if __GO32__.
-
-1991-12-25  David J. MacKenzie  <djm@wookumz.gnu.ai.mit.edu>
-
-	* src/bison.simple [_AIX]: Indent `#pragma alloca', so old C
-	compilers don't choke on it.
-
-1991-12-23  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/getopt.c, src/getopt1.c, src/getopt.h: Link them to standard
-	source location.
-	* src/alloca.c: Likewise.
-	* Makefile.in (dist): Copy those files from current dir.
-
-	* src/getargs.c: Update usage message.
-
-	* src/LR0.c (augment_automaton): Put new shift in proper order.
-
-1991-12-20  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/conflicts.c: Use memcpy if ANSI C library.
-
-	* src/closure.c (set_fderives): Delete redundant assignment to
-	vrow.
-
-	* src/closure.c (print_firsts): Fix bounds and offset checking
-	tags.
-
-	* src/closure.c (tags): Declare just once at start of file.
-
-	* src/LR0.c (allocate_itemsets): Eliminate unused var max.
-	(augment_automaton): Test sp is non-null.
-
-	* src/lalr.c (initialize_LA): Make the vectors at least 1 element
-	long.
-
-	* src/reader.c (readgram): Remove separate YYSTYPE default for
-	MSDOS.
-
-1991-12-18  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/print.c (print_grammar): Don't print disabled rules.
-
-1991-12-17  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/lex.c (lex): Parse hex escapes properly.
-	Handle \v when filling token_buffer.
-
-	* src/lex.c: Include new.h.
-	(token_buffer): Change to a pointer.
-	(init_lex): Allocate initial buffer.
-	(grow_token_buffer): New function.
-	(lex, parse_percent_token): Use that.
-
-	* src/reader.c (read_declarations): Call open_extra_files just
-	once.
-	(parse_token_decl): Don't free previous typename value.  Don't
-	increment nvars if symbol is already a nonterminal.
-	(parse_union_decl): Catch unmatched close-brace.
-	(parse_expect_decl): Null-terminate buffer.
-	(copy_guard): Set brace_flag for {, not for }.
-
-	* src/reader.c: Fix %% in calls to fatal.
-
-	* src/reader.c (token_buffer): Just one extern decl, at top level.
-	Declare as pointer.
-
-	* src/symtab.c (free_symtab): Free type_name fields.  Free symtab
-	itself.
-
-1991-11-25  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple: Handle alloca for AIX.
-
-	* Makefile.in (mandir): Compute default using manext.
-
-1991-11-02  David J. MacKenzie  <djm@wookumz.gnu.ai.mit.edu>
-
-	* Update all files to GPL version 2.
-
-1991-09-06  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple (__yy_bcopy): Use builtin if GCC version 2.
-
-1991-08-26  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/reader.c (parse_assoc_decl): Error if same symbol gets two
-	precs.
-
-1991-08-26  David J. MacKenzie  <djm@pogo.gnu.ai.mit.edu>
-
-	* Makefile.in, configure: Only put $< in Makefile if using VPATH,
-	because older makes don't understand it.
-
-1991-08-23  David J. MacKenzie  <djm@apple-gunkies>
-
-	* src/conflicts.c [_AIX]: #pragma alloca.
-	* src/reduce.c: Don't define TRUE and FALSE if already defined.
-
-1991-08-12  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile.in: Add deps on system.h.
-	(install): Add some deps.
-
-1991-08-02  David J. MacKenzie  <djm@apple-gunkies>
-
-	* Makefile.in (dist): Include texinfo.tex.
-
-	* configure: Create config.status.  Remove it and Makefile if
-	interrupted while creating them.
-
-1991-08-01  David J. MacKenzie  <djm@apple-gunkies>
-
-	* configure: Check for +srcdir etc. arg and look for
-	Makefile.in in that directory.  Set VPATH if srcdir is not `.'.
-	* Makefile.in (prefix): Renamed from DESTDIR.
-
-1991-07-31  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/print.c (print_grammar): Make output prettier.  Break lines.
-
-1991-07-30  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/print.c (print_grammar): New function.
-	(verbose): Call it instead of printing token names here.
-
-1991-07-22  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/vmsgetargs.c (spec_name_prefix, spec_file_prefix): Define
-	variables.
-
-1991-07-10  David J. MacKenzie  <djm@wookumz.gnu.ai.mit.edu>
-
-	* configure, Makefile.in: $(INSTALLPROG) -> $(INSTALL),
-	$(INSTALLTEXT) -> $(INSTALLDATA).
-
-1991-07-09  David J. MacKenzie  <djm@wookumz.gnu.ai.mit.edu>
-
-	* src/bison.simple: Don't include malloc.h if __TURBOC__.
-
-1991-07-06  David J. MacKenzie  <djm@geech.gnu.ai.mit.edu>
-
-	* Replace Makefile with configure and Makefile.in.  Update README
-	with current compilation instructions.
-
-1991-07-01  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/reader.c (reader): Make the output define YYBISON.
-
-1991-06-20  David J. MacKenzie  <djm@geech.gnu.ai.mit.edu>
-
-	* Makefile (MANDIR, MANEXT): Install man page in
-	/usr/local/man/man1/bison.1 by default, instead of
-	/usr/man/manl/bison.l, for consistency with other GNU programs.
-	* Makefile: Rename BINDIR et al. to lowercase to conform to
-	GNU coding standards.
-	(install): Make man page non-executable.
-
-1991-05-31  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile (bison.info): New target.
-	(realclean): New target.
-
-1991-05-02  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/bison.simple: Use YYPRINT to print a token, if it's defined.
-
-1991-04-29  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/lalr.c (transpose): Rename R to R_arg.
-	(initialize_LA): Avoid shadowing variable j.
-
-	* src/reader.c (packsymbols): Avoid shadowing variable i.
-
-	* src/files.c: Declare exit and perror.
-
-	* src/machine.h: Define MAXSHORT and MINSHORT for the eta-10.
-
-1991-04-02  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* src/allocate.c (mallocate): Always allocate at least one byte.
-
-1991-03-19  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-	* Makefile (dist): Put alloca.c into distribution.
-
-1991-03-06  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* src/print.c (print_actions): Nicer output for final states.
-
-1991-02-21  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* src/output.c (output_rule_data): Break lines in yytline based on
-	hpos.
-
-1991-02-07  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* src/bison.simple (yyparse): Move decl of yylsa before use.
-
-1991-01-15  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* Version 1.14.
-
-	* src/output.c (output_rule_data): Handle NULL in tags[i].
-
-1991-01-11  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* src/bison.simple: On MSDOS, include malloc.h.
-
-1990-12-29  David J. MacKenzie  <djm@wookumz.ai.mit.edu>
-
-	* src/files.c: Use `mallocate' instead of `xmalloc' so no extra
-	decl is needed.
-
-1990-12-19  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* src/reader.c (readgram): Alternate YYSTYPE defn for MSDOS.
-	* src/files.c [MSDOS]: Declare xmalloc.
-
-1990-12-13  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* src/output.c (output_rule_data): Put all symbols in yytname.
-
-	* src/bison.simple (yyparse): Delete extra fprintf arg
-	when printing a result of reduction.
-
-1990-12-10  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* src/reader.c (packsymbols): Don't declare yylval if pure_parser.
-
-1990-10-30  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* Version 1.12.
-
-	* src/LR0.c (augment_automaton): Fix bugs adding sp2 to chain of
-	shifts.
-
-1990-10-23  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* src/bison.simple: Don't define alloca if already defined.
-
-1990-10-21  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* src/getopt.c: On VMS, use string.h.
-
-	* src/main.c (main): Return type int.
-
-1990-09-10  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* src/output.c (output_headers): Output macro defs for -p.
-
-	* src/reader.c (readgram): Handle consecutive actions.
-
-	* src/getargs.c (getargs): Rename -a to -p.
-	* src/files.c (openfiles): Change names used for -b.
-
-1990-08-27  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* src/reduce.c (reduce_grammar_tables): Don't map rlhs of disabled
-	rule.
-
-1990-08-26  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* src/closure.c (print_firsts, print_fderives): Use BITISSET to
-	test bits.
-
-1990-08-23  Richard Stallman  <rms@mole.ai.mit.edu>
-
-	* src/closure.c (print_firsts): vrowsize => varsetsize.
-	(print_fderives): rrowsize => rulesetsize.
-
-1990-08-10  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/bison.simple (alloca): Don't define if already defined.
-	(__yy_bcopy): Alternate definition for C++.
-
-1990-07-11  David J. MacKenzie  <djm@albert.ai.mit.edu>
-
-	* src/getargs.c (getargs): Mention +yacc in usage message.
-
-1990-07-10  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reader.c (parse_token_decl, copy_action): Set
-	value_components_used if appropriate.
-	(readgram): Inhibit output of YYSTYPE definition in that case.
-
-1990-06-30  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/output.c (output_parser): Define YYPURE if pure, and not
-	otherwise.  Don't define YYIMPURE.
-	* src/bison.simple: Adjust conditionals accordingly.
-	* src/bison.simple (YYLEX): If locations not in use, don't pass
-	&yylloc.
-
-1990-06-28  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/getargs.c (longopts): Add `yacc'.
-
-1990-06-28  David J. MacKenzie  <djm@apple-gunkies>
-
-	* src/getargs.c (getargs): Add long options.
-	* Makefile: Link with getopt1.o and add getopt1.c and getopt.h to
-	dist.
-
-	* Move version number and description back into version.c from
-	Makefile and getargs.c.
-	* Makefile (dist): Extract version number from version.c.
-
-1990-06-26  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/output.c (output): Always call output_gram.
-	* src/bison.simple (yyparse): Print rhs and lhs symbols of
-	reduction rule.
-
-1990-06-21  David J. MacKenzie  <djm@albert.ai.mit.edu>
-
-	* src/main.c: New global var `program_name' to hold argv[0] for
-	error messages.
-	* src/allocate.c, src/files.c, src/getargs.c, src/reader.c: Use
-	`program_name' in messages instead of hardcoded "bison".
-
-1990-06-20  David J. MacKenzie  <djm@albert.ai.mit.edu>
-
-	* Makefile: Specify Bison version here.  Add rule to pass it to
-	version.c.  Encode it in distribution directory and tar file names.
-	* src/version.c: Use version number from Makefile.
-	* src/getargs.c (getargs): Print additional text that used to be
-	part of version_string in version.c.  Use -V instead of -version
-	to print Bison version info.  Print a usage message and exit if
-	given an invalid option.
-
-1990-06-19  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/bison.simple: Fix a #line.
-
-	* Makefile (INSTALL): New parameter.
-	(install): Use that.
-	(CFLAGS): Move definition to top.
-
-1990-06-17  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reader.c (parse_type_decl): Ignore semicolon.
-	Remove excess % from error messages.
-
-1990-06-16  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* Version 1.11.
-
-	* Makefile (install): Ensure installed files readable.
-
-Tue Jun 12 12:50:56 EDT 1990 Jay Fenlason <hack@ai.mit.edu>
-
-	* src/getargs.c: Declare spec_file_prefix
-
-	* src/lex.c (lex): \a is '\007' instead of '007'
-
-	* src/reader.c: include machine.h
-
-	* src/files.h: Declare extern spec_name_prefix.
-
-	Trivial patch from Thorsten Ohl <td12@ddagsi3.bitnet>
-
-1990-05-31  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* Version 1.10.
-
-	* src/bison.simple (YYBACKUP, YYRECOVERING): New macros.
-	(YYINITDEPTH): This is what used to be YYMAXDEPTH.
-	(YYMAXDEPTH): This is what used to be YYMAXLIMIT.
-	If the value is 0, use the default instead.
-	(yyparse): Return 2 on stack overflow.
-
-1990-05-30  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/bison.simple (YYERROR): Jump to new label; don't print error
-	message.
-	(yyparse): Define label yyerrlab1.
-
-1990-05-16  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/files.c (openfiles): Support -b.
-	* src/getargs.c (getargs): Likewise.
-
-	* src/reader.c (readgram): Error if too many symbols.
-
-	* src/lex.c (lex): Handle \a.  Make error msgs more reliable.
-	* src/reader.c (read_declarations): Make error msgs more reliable.
-
-1990-05-13  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* Version 1.09.
-
-	* src/reduce.c (reduce_grammar_tables): Fix backward test.
-
-1990-05-12  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* Makefile (bison-dist.*): Rename targets and files to bison.*.
-	(bison.tar): Make tar file to unpack into subdirectory named `bison'.
-
-1990-04-30  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reduce.c (reduce_grammar_tables): Set rlhs to -1 for useless
-	rules.
-	* src/nullable.c (set_nullable): Ignore those rules.
-	* src/derives.c (set_derives): Likewise.
-
-1990-04-23  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/bison.simple (yyparse): Mention rule number as well as line
-	number.
-
-1990-03-29  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/bison.simple (__yy_bcopy): New function.
-	(yyparse): Use that, not bcopy.
-
-1990-03-28  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/print.c (print_actions): Don't alter i and j spuriously when
-	errp==0.
-
-1990-03-12  Jim Kingdon  <kingdon@pogo.ai.mit.edu>
-
-	* src/bison.simple [__GNUC__]: Use builtin_alloca.
-
-1990-03-07  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* Makefile (install): Use mergedir.awk to process bison.simple
-	for installation.
-
-	* src/bison.simple (yyparse): New feature to include possible valid
-	tokens in parse error message.
-
-1990-03-03  Richard Stallman  <rms@geech>
-
-	* Version 1.08.
-
-1990-02-26  Jim Kingdon  <kingdon@pogo.ai.mit.edu>
-
-	* src/print.c (print_actions)
-	* src/conflicts.c (print_reductions): Change "shift %d" to
-	"shift, and go to state %d" and "reduce %d" to "reduce using rule %d"
-	and "goto %d" to "go to state %d".
-	* src/print.c (print_core): Change "(%d)" to "(rule %d)".
-
-1990-02-20  Jay Fenlason  <hack@wookumz.ai.mit.edu>
-
-	* src/bison.simple:  Comment out unused yyresume: label.
-
-1990-02-09  Jay Fenlason <hack@wookumz.ai.mit.edu>
-
-	* src/bison.simple : surround all declarations and (remaining)
-	uses of yyls* and yylloc with #ifdef YYLSP_NEEDED This will
-	significantly cut down on stack usage, and gets rid of
-	unused-variable msgs from GCC.
-
-1990-01-31  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/files.c (done) [VMS]: Don't delete files that weren't used.
-	[VMS]: Let user override XPFILE and XPFILE1.
-
-1990-01-03  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* Version 1.07.
-
-1989-12-16  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/gram.c (dummy): New function.
-
-	* src/reader.c (readgram): Detect error if two consec actions.
-
-1989-11-15  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reduce.c (reduce_grammar_tables): Update rline like other
-	tables.
-
-	* Makefile (install): Install the man page.
-
-1989-11-11  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/output.c (output_rule_data): Write #if YYDEBUG around yyrline.
-
-1989-10-18  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* Version 1.06.
-
-	* src/vmsgetargs.c (getargs): Downcase specified output file name.
-
-1989-10-13  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reader.c (readgram): Warn if there is no default to use for
-	$$ and one is needed.
-
-1989-09-29  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* Version 1.05.
-
-	* src/vmsgetargs.h (getargs): Process outfile option.
-
-1989-09-08  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* Version 1.04.
-
-	* src/reader.c (parse_union_decl): Count newlines even in
-	comments.
-
-1989-09-06  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/files.c (openfiles): short_base_length was always ==
-	base_length.
-
-1989-08-24  Richard Stallman  <rms@apple-gunkies.ai.mit.edu>
-
-	* Version 1.03.
-
-	* src/files.c (openfiles): Write output into same dir as input, by
-	default.
-
-1989-08-23  Jay Fenlason  <hack@gnu>
-
-	* Makefile: Include system.h in bison-dist.tar
-
-1989-08-15  Richard Stallman  <rms@hobbes.ai.mit.edu>
-
-	* version 1.03.
-
-	* src/reader.c (reader): Output LTYPESTR to fdefines
-	only after reading the grammar.
-
-1989-08-06  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reader.c (read_declarations): Put space before comment
-	to avoid bug in Green Hills C compiler.
-
-1989-06-19  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/allocate.c (xmalloc): New function.
-
-1989-06-16  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/build.com: Compile and link reduce.c.
-
-1989-06-09  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reduce.c (reduce_grammar_tables): Adjust start_symbol when
-	#s change.
-
-1989-05-27  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reader.c (copy_definition, copy_guard): Don't object to
-	\-newline inside strings.
-
-1989-05-22  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/files.c (openfiles): Alternate file names for MSDOS.
-	(open_extra_files): Likewise.
-	(done): On MSDOS, unlink temp files here, not in openfiles.
-
-	* src/machine.h (BITS_PER_WORD): 16 on MSDOS.
-	(MAXTABLE): Now defined in this file.
-
-	* src/system.h: New file includes system-dependent headers.
-	All relevant .c files include it.
-
-1989-04-27  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/version.c: Version 1.01.
-
-1989-04-18  Randall Smith  <randy@apple-gunkies.ai.mit.edu>
-
-	* src/conflicts.c (total_conflicts): Fixed typo in yacc style
-	output; mention conflicts if > 0.
-
-1989-04-15  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reader.c (packsymbols): Start new symbols after 256.
-
-1989-04-12  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reader.c (reader): Always assign code 256 to `error' token.
-	Always set `translations' to 1 so this code gets handled.
-	* src/bison.simple (YYERRCODE): Define it.
-
-1989-04-11  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/conflicts.c: If GNU C, use builtin alloca.
-
-	* Makefile (install): Delete parser files before copying them.
-
-1989-03-30  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/getargs.c (getargs): Turn off checking of name Bison was
-	invoked by.
-
-	* Makefile (dist): Include ChangeLog in distrib.
-
-1989-03-23  Jay Fenlason  <hack@apple-gunkies.ai.mit.edu>
-
-	* src/LR0.c src/closure.c src/conflicts.c src/derives.c
-	src/files.c src/getargs.c src/lalr.c src/lex.c src/main.c
-	src/nullable.c src/output.c src/print.c src/reader.c src/reduce.c
-	src/symtab.c src/warshall.c: A first pass at getting gcc -Wall to
-	shut up.  Mostly declared functions as void, etc.
-
-	* src/reduce.c moved 'extern int fixed_outfiles;' into print_notices
-	where it belongs.
-
-1989-03-01  Randall Smith  <randy@apple-gunkies.ai.mit.edu>
-
-	* src/types.h, src/symtab.h, src/state.h, src/new.h,
-	src/machine.h, src/lex.h, src/gram.h, src/files.h, src/closure.c,
-	src/vmsgetargs.c, src/warshall.c, src/symtab.c, src/reduce.c,
-	src/reader.c, src/print.c, src/output.c, src/nullable.c,
-	src/main.c, src/lex.c, src/lalr.c, src/gram.c, src/getargs.c,
-	src/files.c, src/derives.c, src/conflicts.c, src/allocate.c,
-	src/LR0.c, Makefile, src/bison.simple: Changed copyright notices
-	to be in accord with the new General Public License.
-	* COPYING: Made a link to the new copying file.
-
-1989-02-22  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/new.h (FREE): Alternate definition for __STDC__ avoids error
-	if `free' returns void.
-
-1989-02-21  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reader.c (read_declarations): Double a `%' in a format string.
-	(copy_definition, parse_start_decl, parse_token_decl): Likewise.
-	(parse_type_decl, parse_union_decl, copy_guard, readgram, get_type).
-	(copy_action): change a `fatal' to `fatals'.
-
-	* src/lalr.c (map_goto): Initial high-end of binary search was off
-	by 1.
-
-1989-02-18  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/bison.simple [sparc]: Include alloca.h.
-
-1989-02-15  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reader.c (packsymbols): Write decl of yylval into .tab.h file.
-
-1989-01-28  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/bison.simple: Avoid comments on `#line' lines.
-
-	* src/reader.c (LTYPESTR): Rearrange to avoid whitespace after
-	\-newline.
-
-1989-01-09  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/conflicts.c (total_conflicts): if -y, use output syntax
-	POSIX wants.
-	* src/reduce.c (print_notices): likewise.
-
-	* src/lex.c (lex): Handle \v, and \x hex escapes.
-
-	* src/reader.c (reader): Merge output_ltype into here.  Don't
-	output YYLTYPE definition to .tab.h file unless the @ construct is
-	used.
-
-	* src/bison.simple: Define YYERROR, YYABORT, YYACCEPT here.
-	* src/reader.c (output_ltype): Don't output them here.
-
-	* src/bison.simple: YYDEBUG now should be 0 or 1.
-	* src/output.c (output): For YYDEBUG, output conditional to define it
-	only if not previously defined.
-
-1989-01-02  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/bison.simple (yyparse) [YYPURE]: Add local yynerrs.
-	(yydebug): Declare global, but don't initialize, regardless of
-	YYPURE.
-	(yyparse): Don't declare yydebug here.
-
-1988-12-22  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reduce.c (print_notices): Typo in message.
-
-1988-12-11  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/output.c (pack_table): Free only nonzero the elts of froms &
-	tos.
-
-1988-12-08  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/gram.c (rprecsym): New vector indicates the %prec symbol for
-	a rule.
-	* src/reader.c (packgram): Allocate it and fill it in.
-	* src/reduce.c (inaccessable_symbols): Use it to set V1.
-	* src/reduce.c (print_results): Don't complain about useless token
-	if it's in V1.
-
-1988-12-05  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/machine.h (RESETBIT, BITISSET): New macros.
-	(SETBIT, WORDSIZE): Change to use BITS_PER_WORD.
-
-	* src/reduce.c: New file, by David Bakin.  Reduces the grammar.
-	* Makefile: Compile it, link it, put it in dist.
-
-	* src/main.c (main): Call reduce_grammar (in reduce.c).
-
-1988-11-17  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/conflicts.c: Don't declare alloca if including alloca.h.
-
-	* src/bison.cld: Define qualifiers `nolines', `debug'.
-	* src/vmsgetargs.c (getargs): Handle them.
-
-	* src/output.c (output_program): Notice `nolinesflag'.
-
-	* src/output.c (output_parser): Simplify logic for -l and #line.
-	Avoid writing EOF char into output.
-
-1988-10-12  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* Implement `-l' option.
-	* src/getopt.c: Set flag `nolinesflag'.
-	* src/reader.c (copy_definition, parse_union_decl, copy_guard,
-	copy_action) Obey that flag; don't generate #line.
-	* src/output.c (output_parser): Discard #line's when copying the
-	parser.
-
-1988-09-12  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reader.c (copy_guard): Fix brace-counting for
-	brace-surrounded guard.
-
-1988-09-08  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/bison.simple: Correct number in #line command.
-	(yyparse): Call YYABORT instead of YYERROR, due to last change in
-	output_ltype.
-
-1988-09-05  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* Makefile: New variable LIBS.  Alternatives for USG.
-	* src/conflicts.c [USG]: Define bcopy.
-	* src/symtab.c [USG]: Include string.h instead of strings.h.
-
-	* src/conflicts.c [sparc]: Include alloca.h.
-
-1988-08-02  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reader.c (parse_token_decl): Ignore commas.
-
-1988-06-25  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/reader.c (output_ltype): Make YYERROR yacc-compatible (like
-	YYFAIL).
-
-1988-06-24  Richard Stallman  <rms@sugar-bombs.ai.mit.edu>
-
-	* src/getargs.c (getargs): -t sets debugflag.
-	Eliminate upper case duplicate options.
-	* src/output.c (output): If debugflag, output `#define YYDEBUG'.
-
-1988-05-26  Richard Stallman  <rms@frosted-flakes.ai.mit.edu>
-
-	* src/allocate.c (mallocate): New name for `allocate' (which loses
-	in VMS).  Calls changed in LR0.c, conflicts.c, symtab.c, new.h.
-
-	* src/getargs.c (getargs): If argv[0] is "yacc", set fixed_outfiles.
-
-1988-05-17  Richard Stallman  <rms@frosted-flakes.ai.mit.edu>
-
-	* src/conflicts.c: Declare alloca.
-	* src/reader.c: Declare realloc.
-	* src/warshall.c (TC): Fix one arithmetic op that was omitted last
-	time.
-
-1988-05-05  Richard Stallman  <rms@frosted-flakes.ai.mit.edu>
-
-	* src/bison.simple: Conditionalize most refs to yylsp on
-	YYLSP_NEEDED.
-	* src/reader.c (copy_guard, copy_action): Notice if `@' is used.
-	(reader): If it was, output `#define YYLSP_NEEDED'.
-
-1988-04-18  Richard Stallman  <rms@rice-krispies.ai.mit.edu>
-
-	* src/bison.simple: New variable yynerr counts calls to yyerror.
-
-	* src/lex.c (lex, case '='): Update lineno when skipping a newline.
-
-	* src/reader.c (parse_expect_decl): ungetc the char that ends the
-	number; don't read any further.  This handles multi-line comments
-	right and avoids incorrect lineno.
-
-	* src/reader.c: Delete duplicate decl of symval.
-
-	* src/warshall.c (RTC, TC): Cast ptrs to char *, not unsigned, for
-	arith.
diff --git a/PACKAGING b/PACKAGING
deleted file mode 100644
index dd285c9..0000000
--- a/PACKAGING
+++ /dev/null
@@ -1,56 +0,0 @@
-Packaging hints for binary package distributors
-===============================================
-
-Although the source of the bison package comes as a single package,
-in distributions of binary packages the installed files should
-be split into two packages:
-
-   bison-runtime
-        Contents: Runtime libraries and programs.
-        Audience: Anyone who wants to run internationalized programs
-                  that contain Bison-generated parsers.
-
-   bison
-        Contents: Tools and documentation for developers that use Bison.
-        Audience: Anyone who wants to develop programs that use parsers.
-        Dependencies: requires bison-runtime.
-
-The 'bison-runtime' binary package is much smaller than the 'bison'
-binary package.  It should be included in any distribution that
-contains localized programs that use the diagnostics contained in
-Bison-generated parsers.
-
-If you want to install both packages at the same time, you simply do
-at the toplevel directory:
-
-      ./configure
-      make
-      make install
-
-After installation, the file
-
-      $prefix/share/locale/*/LC_MESSAGES/bison-runtime.mo
-
-belongs to the bison-runtime package; all other installed files belong
-to the bison package.
-
------
-
-Copyright (C) 2002, 2005 Free Software Foundation, Inc.
-
-This file is part of Bison, the GNU Compiler Compiler.
-
-Bison 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.
-
-Bison 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 autoconf; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA.
diff --git a/README b/README
deleted file mode 100644
index a053f4b..0000000
--- a/README
+++ /dev/null
@@ -1,41 +0,0 @@
-This directory contains the Bison parser generator.
-
-See the file INSTALL for generic compilation and installation instructions.
-See the file doc/FAQ for frequently asked questions.
-
-Bison requires GNU m4 1.4.3 or later.  See:
-
-ftp://ftp.gnu.org/gnu/m4/m4-1.4.3.tar.gz
-
-Bison can work with pre-1.4.3 distributions of GNU m4 if they are
-sufficiently patched, but if you encounter a bug with an older
-distribution and report a bug we will probably suggest that you
-upgrade to 1.4.3 as the first step in trying to fix it.
-
-Please send bug reports to <bug-bison@gnu.org>.  Please include the
-version number from `bison --version', and a complete, self-contained
-test case in each bug report.
-
-If you have questions about using Bison and the documentation does
-not answer them, please send mail to <help-bison@gnu.org>.
-
------
-
-Copyright (C) 1992, 1998, 1999, 2003, 2004, 2005 Free Software Foundation, Inc.
-
-This file is part of Bison, the GNU Compiler Compiler.
-
-Bison 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.
-
-Bison 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 autoconf; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA.
diff --git a/THANKS b/THANKS
deleted file mode 100644
index c00580e..0000000
--- a/THANKS
+++ /dev/null
@@ -1,90 +0,0 @@
-Bison was originally written by Robert Corbett.  It would not be what
-it is today without the invaluable help of these people:
-
-Airy Andre                Airy.Andre@edf.fr
-Akim Demaille             akim@freefriends.org
-Albert Chin-A-Young       china@thewrittenword.com
-Alexander Belopolsky      alexb@rentec.com
-Alexandre Duret-Lutz      adl@src.lip6.fr
-Andreas Schwab            schwab@suse.de
-Andrew Suffield           asuffield@users.sourceforge.net
-Anthony Heading           ajrh@ajrh.net
-Arnold Robbins            arnold@skeeve.com
-Art Haas                  ahaas@neosoft.com
-Baron Schwartz            baron@sequent.org
-Benoit Perrot             benoit.perrot@epita.fr
-Bert Deknuydt             Bert.Deknuydt@esat.kuleuven.ac.be
-Bruce Lilly               blilly@erols.com
-Bruno Haible              bruno@clisp.org
-Charles-Henri de Boysson  de-boy_c@epita.fr
-Cris Bailiff              c.bailiff+bison@awayweb.com
-Cris van Pelt             cris@amf03054.office.wxs.nl
-Daniel Hagerty            hag@gnu.org
-David J. MacKenzie        djm@gnu.org
-Derek M. Jones	          derek@knosof.co.uk
-Dick Streefland           dick.streefland@altium.nl
-Enrico Scholz             enrico.scholz@informatik.tu-chemnitz.de
-Evgeny Stambulchik        fnevgeny@plasma-gate.weizmann.ac.il
-Fabrice Bauzac            noon@cote-dazur.com
-Florian Krohm             florian@edamail.fishkill.ibm.com
-Frank Heckenbach          frank@g-n-u.de
-Guido Trentalancia        trentalg@aston.ac.uk
-H. Merijn Brand           h.m.brand@hccnet.nl
-Hans Aberg                haberg@matematik.su.se
-Jan Nieuwenhuizen         janneke@gnu.org
-Jesse Thilo               jthilo@gnu.org
-Jim Kent                  jkent@arch.sel.sony.com
-Jim Meyering              jim@meyering.net
-Joel E. Denny             jdenny@ces.clemson.edu
-Juan Manuel Guerrero      ST001906@HRZ1.HRZ.TU-Darmstadt.De
-Kees Zeelenberg           kzlg@users.sourceforge.net
-Keith Browne              kbrowne@legato.com
-Laurent Mascherpa         laurent.mascherpa@epita.fr
-Magnus Fromreide          magfr@lysator.liu.se
-Marc Autret               autret_m@epita.fr
-Martin Mokrejs            mmokrejs@natur.cuni.cz
-Martin Nylin		  martin.nylin@linuxmail.org
-Matt Kraai                kraai@alumni.cmu.edu
-Matt Rosing               rosing@peakfive.com
-Michael Hayes             m.hayes@elec.canterbury.ac.nz
-Mickael Labau             labau_m@epita.fr
-Mike Castle               dalgoda@ix.netcom.com
-Neil Booth                NeilB@earthling.net
-Nelson H. F. Beebe        beebe@math.utah.edu
-Nicolas Burrus            nicolas.burrus@epita.fr
-Nicolas Tisserand         nicolas.tisserand@epita.fr
-Noah Friedman             friedman@gnu.org
-Oleg Smolsky              oleg.smolsky@pacific-simulators.co.nz
-Pascal Bart               pascal.bart@epita.fr
-Paul Eggert               eggert@cs.ucla.edu
-Paul Hilfinger            Hilfinger@CS.Berkeley.EDU
-Per Allansson             per@appgate.com
-Peter Fales               psfales@lucent.com
-Peter Hamorsky            hamo@upjs.sk
-Piotr Gackiewicz          gacek@intertel.com.pl
-Quoc Peyrot               chojin@lrde.epita.fr
-R Blake                   blakers@mac.com
-Raja R Harinath           harinath@cs.umn.edu
-Richard Stallman          rms@gnu.org
-Robert Anisko             anisko_r@epita.fr
-Shura                     debil_urod@ngs.ru
-Steve Murphy		  murf@parsetree.com
-Tim Josling               tej@melbpc.org.au
-Tim Van Holder            tim.van.holder@pandora.be
-Tom Lane                  tgl@sss.pgh.pa.us
-Tom Tromey                tromey@cygnus.com
-Tommy Nordgren		  tommy.nordgren@chello.se
-Troy A. Johnson           troyj@ecn.purdue.edu
-Vin Shelton               acs@alumni.princeton.edu
-Wayne Green               wayne@infosavvy.com
-Wolfram Wagner            ww@mpi-sb.mpg.de
-Wwp                       subscript@free.fr
-Zack Weinberg             zack@codesourcery.com
-                          twlevo@xs4all.nl
-
-Many people are not named here because we lost track of them.  We
-thank them!  Please, help us keeping this list up to date.
-
-Local Variables:
-mode: text
-End:
diff --git a/TODO b/TODO
deleted file mode 100644
index 76ca736..0000000
--- a/TODO
+++ /dev/null
@@ -1,328 +0,0 @@
--*- outline -*-
-
-* Header guards
-
-From Franc,ois: should we keep the directory part in the CPP guard?
-
-
-* Yacc.c: CPP Macros
-
-Do some people use YYPURE, YYLSP_NEEDED like we do in the test suite?
-They should not: it is not documented.  But if they need to, let's
-find something clean (not like YYLSP_NEEDED...).
-
-
-* Documentation
-Before releasing, make sure the documentation ("Understanding your
-parser") refers to the current `output' format.
-
-* lalr1.cc
-** vector
-Move to using vector, drop stack.hh.
-
-** I18n
-Catch up with yacc.c.
-
-* Report
-
-**  GLR
-How would Paul like to display the conflicted actions?  In particular,
-what when two reductions are possible on a given look-ahead token, but one is
-part of $default.  Should we make the two reductions explicit, or just
-keep $default?  See the following point.
-
-** Disabled Reductions
-See `tests/conflicts.at (Defaulted Conflicted Reduction)', and decide
-what we want to do.
-
-** Documentation
-Extend with error productions.  The hard part will probably be finding
-the right rule so that a single state does not exhibit too many yet
-undocumented ``features''.  Maybe an empty action ought to be
-presented too.  Shall we try to make a single grammar with all these
-features, or should we have several very small grammars?
-
-** --report=conflict-path
-Provide better assistance for understanding the conflicts by providing
-a sample text exhibiting the (LALR) ambiguity.  See the paper from
-DeRemer and Penello: they already provide the algorithm.
-
-
-* Extensions
-
-** Labeling the symbols
-Have a look at the Lemon parser generator: instead of $1, $2 etc. they
-can name the values.  This is much more pleasant.  For instance:
-
-       exp (res): exp (a) '+' exp (b) { $res = $a + $b; };
-
-I love this.  I have been bitten too often by the removal of the
-symbol, and forgetting to shift all the $n to $n-1.  If you are
-unlucky, it compiles...
-
-But instead of using $a etc., we can use regular variables.  And
-instead of using (), I propose to use `:' (again).  Paul suggests
-supporting `->' in addition to `:' to separate LHS and RHS. In other
-words:
-
-       r:exp -> a:exp '+' b:exp { r = a + b; };
-
-That requires an significant improvement of the grammar parser.  Using
-GLR would be nice.  It also requires that Bison know the type of the
-symbols (which will be useful for %include anyway).  So we have some
-time before...
-
-Note that there remains the problem of locations: `@r'?
-
-
-** $-1
-We should find a means to provide an access to values deep in the
-stack.  For instance, instead of
-
-	baz: qux { $$ = $<foo>-1 + $<bar>0 + $1; }
-
-we should be able to have:
-
-  foo($foo) bar($bar) baz($bar): qux($qux) { $baz = $foo + $bar + $qux; }
-
-Or something like this.
-
-** %if and the like
-It should be possible to have %if/%else/%endif.  The implementation is
-not clear: should it be lexical or syntactic.  Vadim Maslow thinks it
-must be in the scanner: we must not parse what is in a switched off
-part of %if.  Akim Demaille thinks it should be in the parser, so as
-to avoid falling into another CPP mistake.
-
-** -D, --define-muscle NAME=VALUE
-To define muscles via cli.  Or maybe support directly NAME=VALUE?
-
-** XML Output
-There are couple of available extensions of Bison targeting some XML
-output.  Some day we should consider including them.  One issue is
-that they seem to be quite orthogonal to the parsing technique, and
-seem to depend mostly on the possibility to have some code triggered
-for each reduction.  As a matter of fact, such hooks could also be
-used to generate the yydebug traces.  Some generic scheme probably
-exists in there.
-
-XML output for GNU Bison and gcc
-   http://www.cs.may.ie/~jpower/Research/bisonXML/
-
-XML output for GNU Bison
-   http://yaxx.sourceforge.net/
-
-* Unit rules
-Maybe we could expand unit rules, i.e., transform
-
-	exp: arith | bool;
-	arith: exp '+' exp;
-	bool: exp '&' exp;
-
-into
-
-	exp: exp '+' exp | exp '&' exp;
-
-when there are no actions.  This can significantly speed up some
-grammars.  I can't find the papers.  In particular the book `LR
-parsing: Theory and Practice' is impossible to find, but according to
-`Parsing Techniques: a Practical Guide', it includes information about
-this issue.  Does anybody have it?
-
-
-
-* Documentation
-
-** History/Bibliography
-Some history of Bison and some bibliography would be most welcome.
-Are there any Texinfo standards for bibliography?
-
-
-
-* Java, Fortran, etc.
-
-
-** Java
-
-There are a couple of proposed outputs:
-
-- BYACC/J
-  which is based on Byacc.
-  <http://troi.lincom-asg.com/~rjamison/byacc/>
-
-- Bison Java
-  which is based on Bison.
-  <http://www.goice.co.jp/member/mo/hack-progs/bison-java.html>
-
-Sebastien Serrurier (serrur_s@epita.fr) is working on this: he is
-expected to contact the authors, design the output, and implement it
-into Bison.
-
-
-* Coding system independence
-Paul notes:
-
-	Currently Bison assumes 8-bit bytes (i.e. that UCHAR_MAX is
-	255).  It also assumes that the 8-bit character encoding is
-	the same for the invocation of 'bison' as it is for the
-	invocation of 'cc', but this is not necessarily true when
-	people run bison on an ASCII host and then use cc on an EBCDIC
-	host.  I don't think these topics are worth our time
-	addressing (unless we find a gung-ho volunteer for EBCDIC or
-	PDP-10 ports :-) but they should probably be documented
-	somewhere.
-
-	More importantly, Bison does not currently allow NUL bytes in
-	tokens, either via escapes (e.g., "x\0y") or via a NUL byte in
-	the source code.  This should get fixed.
-
-* --graph
-Show reductions.
-
-* Broken options ?
-** %no-parser
-** %token-table
-** Skeleton strategy
-Must we keep %no-parser?  %token-table?
-
-* src/print_graph.c
-Find the best graph parameters.
-
-* BTYacc
-See if we can integrate backtracking in Bison.  Charles-Henri de
-Boysson <de-boy_c@epita.fr> is working on this, and already has some
-results.  Vadim Maslow, the maintainer of BTYacc was contacted, and we
-stay in touch with him.  Adjusting the Bison grammar parser will be
-needed to support some extra BTYacc features.  This is less urgent.
-
-** Keeping the conflicted actions
-First, analyze the differences between byacc and btyacc (I'm referring
-to the executables).  Find where the conflicts are preserved.
-
-** Compare with the GLR tables
-See how isomorphic the way BTYacc and the way the GLR adjustments in
-Bison are compatible.  *As much as possible* one should try to use the
-same implementation in the Bison executables.  I insist: it should be
-very feasible to use the very same conflict tables.
-
-** Adjust the skeletons
-Import the skeletons for C and C++.
-
-** Improve the skeletons
-Have them support yysymprint, yydestruct and so forth.
-
-
-* Precedence
-
-** Partial order
-It is unfortunate that there is a total order for precedence.  It
-makes it impossible to have modular precedence information.  We should
-move to partial orders (sounds like series/parallel orders to me).
-
-This will be possible with a Bison parser for the grammar, as it will
-make it much easier to extend the grammar.
-
-** Correlation b/w precedence and associativity
-Also, I fail to understand why we have to assign the same
-associativity to operators with the same precedence.  For instance,
-why can't I decide that the precedence of * and / is the same, but the
-latter is nonassoc?
-
-If there is really no profound motivation, we should find a new syntax
-to allow specifying this.
-
-** RR conflicts
-See if we can use precedence between rules to solve RR conflicts.  See
-what POSIX says.
-
-
-* $undefined
-From Hans:
-- If the Bison generated parser experiences an undefined number in the
-character range, that character is written out in diagnostic messages, an
-addition to the $undefined value.
-
-Suggest: Change the name $undefined to undefined; looks better in outputs.
-
-
-* Default Action
-From Hans:
-- For use with my C++ parser, I transported the "switch (yyn)" statement
-that Bison writes to the bison.simple skeleton file. This way, I can remove
-the current default rule $$ = $1 implementation, which causes a double
-assignment to $$ which may not be OK under C++, replacing it with a
-"default:" part within the switch statement.
-
-Note that the default rule $$ = $1, when typed, is perfectly OK under C,
-but in the C++ implementation I made, this rule is different from
-$<type_name>$ = $<type_name>1. I therefore think that one should implement
-a Bison option where every typed default rule is explicitly written out
-(same typed ruled can of course be grouped together).
-
-Note: Robert Anisko handles this.  He knows how to do it.
-
-
-* Warnings
-It would be nice to have warning support.  See how Autoconf handles
-them, it is fairly well described there.  It would be very nice to
-implement this in such a way that other programs could use
-lib/warnings.[ch].
-
-Don't work on this without first announcing you do, as I already have
-thought about it, and know many of the components that can be used to
-implement it.
-
-
-* Pre and post actions.
-From: Florian Krohm <florian@edamail.fishkill.ibm.com>
-Subject: YYACT_EPILOGUE
-To: bug-bison@gnu.org
-X-Sent: 1 week, 4 days, 14 hours, 38 minutes, 11 seconds ago
-
-The other day I had the need for explicitly building the parse tree. I
-used %locations for that and defined YYLLOC_DEFAULT to call a function
-that returns the tree node for the production. Easy. But I also needed
-to assign the S-attribute to the tree node. That cannot be done in
-YYLLOC_DEFAULT, because it is invoked before the action is executed.
-The way I solved this was to define a macro YYACT_EPILOGUE that would
-be invoked after the action. For reasons of symmetry I also added
-YYACT_PROLOGUE. Although I had no use for that I can envision how it
-might come in handy for debugging purposes.
-All is needed is to add
-
-#if YYLSP_NEEDED
-    YYACT_EPILOGUE (yyval, (yyvsp - yylen), yylen, yyloc, (yylsp - yylen));
-#else
-    YYACT_EPILOGUE (yyval, (yyvsp - yylen), yylen);
-#endif
-
-at the proper place to bison.simple. Ditto for YYACT_PROLOGUE.
-
-I was wondering what you think about adding YYACT_PROLOGUE/EPILOGUE
-to bison. If you're interested, I'll work on a patch.
-
-* Move to Graphviz
-Well, VCG seems really dead.  Move to Graphviz instead.  Also, equip
-the parser with a means to create the (visual) parse tree.
-
------
-
-Copyright (C) 2001, 2002, 2003, 2004, 2006 Free Software Foundation,
-Inc.
-
-This file is part of Bison, the GNU Compiler Compiler.
-
-Bison 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.
-
-Bison 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 Bison; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA.
diff --git a/aclocal.m4 b/aclocal.m4
deleted file mode 100644
index 3c5426a..0000000
--- a/aclocal.m4
+++ /dev/null
@@ -1,924 +0,0 @@
-# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005  Free Software Foundation, Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION so it can be traced.
-# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-	 [AM_AUTOMAKE_VERSION([1.9.6])])
-
-# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory.  The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run.  This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-#    fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-#    fails if $ac_aux_dir is absolute,
-#    fails when called from a subdirectory in a VPATH build with
-#          a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
-#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-#   MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH.  The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# This was merged into AC_PROG_CC in Autoconf.
-
-AU_DEFUN([AM_PROG_CC_STDC],
-[AC_PROG_CC
-AC_DIAGNOSE([obsolete], [$0:
-	your code should no longer depend upon `am_cv_prog_cc_stdc', but upon
-	`ac_cv_prog_cc_stdc'.  Remove this warning and the assignment when
-	you adjust the code.  You can also remove the above call to
-	AC_PROG_CC if you already called it elsewhere.])
-am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc
-])
-AU_DEFUN([fp_PROG_CC_STDC])
-
-# AM_CONDITIONAL                                            -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 7
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])
-AC_SUBST([$1_FALSE])
-if $2; then
-  $1_TRUE=
-  $1_FALSE='#'
-else
-  $1_TRUE='#'
-  $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
-  AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 8
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery.  Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
-               [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_$1_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
-  fi
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    case $depmode in
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    none) break ;;
-    esac
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.
-    if depmode=$depmode \
-       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_$1_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-AM_CONDITIONAL([am__fastdep$1], [
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])
-])
-
-# Generate code to set up dependency tracking.              -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-#serial 3
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[for mf in $CONFIG_FILES; do
-  # Strip MF so we end up with the name of the file.
-  mf=`echo "$mf" | sed -e 's/:.*$//'`
-  # Check whether this is an Automake generated Makefile or not.
-  # We used to match only the files named `Makefile.in', but
-  # some people rename them; so instead we look at the file content.
-  # Grep'ing the first line is not enough: some people post-process
-  # each Makefile.in and add a new line on top of each file to say so.
-  # So let's grep whole file.
-  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
-    dirpart=`AS_DIRNAME("$mf")`
-  else
-    continue
-  fi
-  # Extract the definition of DEPDIR, am__include, and am__quote
-  # from the Makefile without running `make'.
-  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-  test -z "$DEPDIR" && continue
-  am__include=`sed -n 's/^am__include = //p' < "$mf"`
-  test -z "am__include" && continue
-  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-  # When using ansi2knr, U may be empty or an underscore; expand it
-  U=`sed -n 's/^U = //p' < "$mf"`
-  # Find all dependency output files, they are included files with
-  # $(DEPDIR) in their names.  We invoke sed twice because it is the
-  # simplest approach to changing $(DEPDIR) to its actual value in the
-  # expansion.
-  for file in `sed -n "
-    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-    # Make sure the directory exists.
-    test -f "$dirpart/$file" && continue
-    fdir=`AS_DIRNAME(["$file"])`
-    AS_MKDIR_P([$dirpart/$fdir])
-    # echo "creating $dirpart/$file"
-    echo '# dummy' > "$dirpart/$file"
-  done
-done
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
-     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
-     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Do all the work for Automake.                             -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 12
-
-# This macro actually does too much.  Some checks are only needed if
-# your package does certain things.  But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out.  PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition.  After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.58])dnl
-dnl Autoconf wants to disallow AM_ names.  We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-# test to see if srcdir already configured
-if test "`cd $srcdir && pwd`" != "`pwd`" &&
-   test -f $srcdir/config.status; then
-  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AM_PROG_INSTALL_SH
-AM_PROG_INSTALL_STRIP
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
-              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
-	      		     [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
-                  [_AM_DEPENDENCIES(CC)],
-                  [define([AC_PROG_CC],
-                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
-                  [_AM_DEPENDENCIES(CXX)],
-                  [define([AC_PROG_CXX],
-                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-])
-])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated.  The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $1 | $1:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-install_sh=${install_sh-"$am_aux_dir/install-sh"}
-AC_SUBST(install_sh)])
-
-# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot.  For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
-# Check to see how 'make' treats includes.	            -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 3
-
-# AM_MAKE_INCLUDE()
-# -----------------
-# Check to see how make treats includes.
-AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo done
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# We grep out `Entering directory' and `Leaving directory'
-# messages which can occur if `w' ends up in MAKEFLAGS.
-# In particular we don't look at `^make:' because GNU make might
-# be invoked under some other name (usually "gmake"), in which
-# case it prints its new name instead of `make'.
-if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
-   am__include=include
-   am__quote=
-   _am_result=GNU
-fi
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
-      am__include=.include
-      am__quote="\""
-      _am_result=BSD
-   fi
-fi
-AC_SUBST([am__include])
-AC_SUBST([am__quote])
-AC_MSG_RESULT([$_am_result])
-rm -f confinc confmf
-])
-
-# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
-#
-# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
-# created by `make install' are always world readable, even if the
-# installer happens to have an overly restrictive umask (e.g. 077).
-# This was a mistake.  There are at least two reasons why we must not
-# use `-m 0755':
-#   - it causes special bits like SGID to be ignored,
-#   - it may be too restrictive (some setups expect 775 directories).
-#
-# Do not use -m 0755 and let people choose whatever they expect by
-# setting umask.
-#
-# We cannot accept any implementation of `mkdir' that recognizes `-p'.
-# Some implementations (such as Solaris 8's) are not thread-safe: if a
-# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
-# concurrently, both version can detect that a/ is missing, but only
-# one can create it and the other will error out.  Consequently we
-# restrict ourselves to GNU make (using the --version option ensures
-# this.)
-AC_DEFUN([AM_PROG_MKDIR_P],
-[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
-  # We used to keeping the `.' as first argument, in order to
-  # allow $(mkdir_p) to be used without argument.  As in
-  #   $(mkdir_p) $(somedir)
-  # where $(somedir) is conditionally defined.  However this is wrong
-  # for two reasons:
-  #  1. if the package is installed by a user who cannot write `.'
-  #     make install will fail,
-  #  2. the above comment should most certainly read
-  #     $(mkdir_p) $(DESTDIR)$(somedir)
-  #     so it does not work when $(somedir) is undefined and
-  #     $(DESTDIR) is not.
-  #  To support the latter case, we have to write
-  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
-  #  so the `.' trick is pointless.
-  mkdir_p='mkdir -p --'
-else
-  # On NextStep and OpenStep, the `mkdir' command does not
-  # recognize any option.  It will interpret all options as
-  # directories to create, and then abort because `.' already
-  # exists.
-  for d in ./-p ./--version;
-  do
-    test -d $d && rmdir $d
-  done
-  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
-  if test -f "$ac_aux_dir/mkinstalldirs"; then
-    mkdir_p='$(mkinstalldirs)'
-  else
-    mkdir_p='$(install_sh) -d'
-  fi
-fi
-AC_SUBST([mkdir_p])])
-
-# Helper functions for option handling.                     -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 3
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# ------------------------------
-# Set option NAME.  Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t $srcdir/configure conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "$[2]" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries.  This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
-  AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Check how to create a tarball.                            -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-#     tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-#     $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
-m4_if([$1], [v7],
-     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
-
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
-
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
-  rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
-m4_include([m4/bison-i18n.m4])
-m4_include([m4/c-working.m4])
-m4_include([m4/cxx.m4])
-m4_include([m4/dirname.m4])
-m4_include([m4/dmalloc.m4])
-m4_include([m4/dos.m4])
-m4_include([m4/error.m4])
-m4_include([m4/exitfail.m4])
-m4_include([m4/extensions.m4])
-m4_include([m4/getopt.m4])
-m4_include([m4/gettext_gl.m4])
-m4_include([m4/gnulib.m4])
-m4_include([m4/hard-locale.m4])
-m4_include([m4/hash.m4])
-m4_include([m4/iconv.m4])
-m4_include([m4/inttypes_h_gl.m4])
-m4_include([m4/lib-ld_gl.m4])
-m4_include([m4/lib-link.m4])
-m4_include([m4/lib-prefix_gl.m4])
-m4_include([m4/m4.m4])
-m4_include([m4/mbrtowc.m4])
-m4_include([m4/mbstate_t.m4])
-m4_include([m4/mbswidth.m4])
-m4_include([m4/nls.m4])
-m4_include([m4/obstack.m4])
-m4_include([m4/onceonly.m4])
-m4_include([m4/po_gl.m4])
-m4_include([m4/progtest.m4])
-m4_include([m4/quote.m4])
-m4_include([m4/quotearg.m4])
-m4_include([m4/stdbool.m4])
-m4_include([m4/stdint_h_gl.m4])
-m4_include([m4/stdio-safer.m4])
-m4_include([m4/stpcpy.m4])
-m4_include([m4/strdup.m4])
-m4_include([m4/strerror.m4])
-m4_include([m4/strndup.m4])
-m4_include([m4/strnlen.m4])
-m4_include([m4/strtol.m4])
-m4_include([m4/strtoul.m4])
-m4_include([m4/strverscmp.m4])
-m4_include([m4/subpipe.m4])
-m4_include([m4/timevar.m4])
-m4_include([m4/uintmax_t_gl.m4])
-m4_include([m4/ulonglong_gl.m4])
-m4_include([m4/unistd-safer.m4])
-m4_include([m4/unistd_h.m4])
-m4_include([m4/unlocked-io.m4])
-m4_include([m4/warning.m4])
-m4_include([m4/xalloc.m4])
-m4_include([m4/xstrndup.m4])
diff --git a/build-aux/Makefile b/build-aux/Makefile
deleted file mode 100644
index 54f34ca..0000000
--- a/build-aux/Makefile
+++ /dev/null
@@ -1,356 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# build-aux/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-srcdir = .
-top_srcdir = ..
-
-pkgdatadir = $(datadir)/bison
-pkglibdir = $(libdir)/bison
-pkgincludedir = $(includedir)/bison
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = /usr/bin/install -c
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-unknown-linux-gnu
-host_triplet = x86_64-unknown-linux-gnu
-subdir = build-aux
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in config.guess \
-	config.rpath config.sub depcomp install-sh mdate-sh missing \
-	mkinstalldirs texinfo.tex ylwrap
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-SOURCES =
-DIST_SOURCES =
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run aclocal-1.9
-AMDEP_FALSE = #
-AMDEP_TRUE = 
-AMTAR = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run tar
-AUTOCONF = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoconf
-AUTOHEADER = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoheader
-AUTOM4TE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autom4te
-AUTOMAKE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run automake-1.9
-AWK = gawk
-BISON_CXX_WORKS = :
-BISON_CXX_WORKS_FALSE = #
-BISON_CXX_WORKS_TRUE = 
-BISON_LOCALEDIR = /usr/share/locale
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPP = gcc -E
-CPPFLAGS = 
-CXX = g++
-CXXDEPMODE = depmode=gcc3
-CXXFLAGS = -g -O2
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = grep -E
-EXEEXT = 
-GCC = yes
-GETOPT_H = 
-GMSGFMT = /usr/bin/msgfmt
-HAVE__BOOL = 1
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
-INTLLIBS = 
-INTL_MACOSX_LIBS = 
-LDFLAGS = 
-LEX = flex
-LEXLIB = -lfl
-LEX_OUTPUT_ROOT = lex.yy
-LIBICONV = -liconv
-LIBINTL = 
-LIBOBJS =  dirname$U.o exitfail$U.o hard-locale$U.o hash$U.o quote$U.o quotearg$U.o fopen-safer$U.o dup-safer$U.o fd-safer$U.o pipe-safer$U.o xmalloc$U.o
-LIBS = 
-LTLIBICONV = -liconv
-LTLIBINTL = 
-LTLIBOBJS =  dirname$U.lo exitfail$U.lo hard-locale$U.lo hash$U.lo quote$U.lo quotearg$U.lo fopen-safer$U.lo dup-safer$U.lo fd-safer$U.lo pipe-safer$U.lo xmalloc$U.lo
-M4 = /usr/bin/m4
-MAKEINFO = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run makeinfo
-MKINSTALLDIRS = $(top_builddir)/build-aux/mkinstalldirs
-MSGFMT = /usr/bin/msgfmt
-MSGMERGE = /usr/bin/msgmerge
-O0CFLAGS = -g 
-O0CXXFLAGS = -g 
-OBJEXT = o
-PACKAGE = bison
-PACKAGE_BUGREPORT = bug-bison@gnu.org
-PACKAGE_NAME = GNU Bison
-PACKAGE_STRING = GNU Bison 2.3
-PACKAGE_TARNAME = bison
-PACKAGE_VERSION = 2.3
-PATH_SEPARATOR = :
-POSUB = po
-RANLIB = ranlib
-SET_MAKE = 
-SHELL = /bin/sh
-STDBOOL_H = 
-STRIP = 
-UNISTD_H = 
-USE_NLS = yes
-VALGRIND = 
-VERSION = 2.3
-WARNING_CFLAGS = 
-WARNING_CXXFLAGS = 
-WERROR_CFLAGS = 
-XGETTEXT = /usr/bin/xgettext
-YACC = bison -y
-YACC_LIBRARY = liby.a
-YACC_SCRIPT = yacc
-ac_ct_CC = gcc
-ac_ct_CXX = g++
-ac_ct_RANLIB = ranlib
-ac_ct_STRIP = 
-aclocaldir = ${datadir}/aclocal
-am__fastdepCC_FALSE = #
-am__fastdepCC_TRUE = 
-am__fastdepCXX_FALSE = #
-am__fastdepCXX_TRUE = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = ${AMTAR} chof - "$$tardir"
-am__untar = ${AMTAR} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-unknown-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = unknown
-datadir = ${prefix}/share
-exec_prefix = ${prefix}
-host = x86_64-unknown-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = unknown
-includedir = ${prefix}/include
-infodir = ${prefix}/info
-install_sh = /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localstatedir = ${prefix}/var
-mandir = ${prefix}/man
-mkdir_p = mkdir -p --
-oldincludedir = /usr/include
-prefix = /home/phanna/src/bison
-program_transform_name = s,x,x,
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-sysconfdir = ${prefix}/etc
-target_alias = 
-EXTRA_DIST = prev-version.txt
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  build-aux/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  build-aux/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-uninstall-info-am:
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am
-
-.PHONY: all all-am check check-am clean clean-generic distclean \
-	distclean-generic distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-exec \
-	install-exec-am install-info install-info-am install-man \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
-	uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/build-aux/Makefile.am b/build-aux/Makefile.am
deleted file mode 100644
index 0e2ef7a..0000000
--- a/build-aux/Makefile.am
+++ /dev/null
@@ -1,2 +0,0 @@
-## Process this file with automake to produce Makefile.in -*-Makefile-*-
-EXTRA_DIST = prev-version.txt
diff --git a/build-aux/Makefile.in b/build-aux/Makefile.in
deleted file mode 100644
index 8a90fc8..0000000
--- a/build-aux/Makefile.in
+++ /dev/null
@@ -1,356 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = build-aux
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in config.guess \
-	config.rpath config.sub depcomp install-sh mdate-sh missing \
-	mkinstalldirs texinfo.tex ylwrap
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-SOURCES =
-DIST_SOURCES =
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOM4TE = @AUTOM4TE@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BISON_CXX_WORKS = @BISON_CXX_WORKS@
-BISON_CXX_WORKS_FALSE = @BISON_CXX_WORKS_FALSE@
-BISON_CXX_WORKS_TRUE = @BISON_CXX_WORKS_TRUE@
-BISON_LOCALEDIR = @BISON_LOCALEDIR@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-GCC = @GCC@
-GETOPT_H = @GETOPT_H@
-GMSGFMT = @GMSGFMT@
-HAVE__BOOL = @HAVE__BOOL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTLLIBS = @INTLLIBS@
-INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
-LDFLAGS = @LDFLAGS@
-LEX = @LEX@
-LEXLIB = @LEXLIB@
-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
-LIBICONV = @LIBICONV@
-LIBINTL = @LIBINTL@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LTLIBICONV = @LTLIBICONV@
-LTLIBINTL = @LTLIBINTL@
-LTLIBOBJS = @LTLIBOBJS@
-M4 = @M4@
-MAKEINFO = @MAKEINFO@
-MKINSTALLDIRS = @MKINSTALLDIRS@
-MSGFMT = @MSGFMT@
-MSGMERGE = @MSGMERGE@
-O0CFLAGS = @O0CFLAGS@
-O0CXXFLAGS = @O0CXXFLAGS@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-POSUB = @POSUB@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STDBOOL_H = @STDBOOL_H@
-STRIP = @STRIP@
-UNISTD_H = @UNISTD_H@
-USE_NLS = @USE_NLS@
-VALGRIND = @VALGRIND@
-VERSION = @VERSION@
-WARNING_CFLAGS = @WARNING_CFLAGS@
-WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
-WERROR_CFLAGS = @WERROR_CFLAGS@
-XGETTEXT = @XGETTEXT@
-YACC = @YACC@
-YACC_LIBRARY = @YACC_LIBRARY@
-YACC_SCRIPT = @YACC_SCRIPT@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-aclocaldir = @aclocaldir@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-EXTRA_DIST = prev-version.txt
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  build-aux/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  build-aux/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-uninstall-info-am:
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am
-
-.PHONY: all all-am check check-am clean clean-generic distclean \
-	distclean-generic distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-exec \
-	install-exec-am install-info install-info-am install-man \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
-	uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/build-aux/config.guess b/build-aux/config.guess
deleted file mode 100755
index 917bbc5..0000000
--- a/build-aux/config.guess
+++ /dev/null
@@ -1,1463 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-
-timestamp='2005-07-08'
-
-# This 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 2 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner <per@bothner.com>.
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# The plan is that this can be called by configure scripts if you
-# don't specify an explicit build system type.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-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."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-	for c in cc gcc c89 c99 ; do
-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-	     CC_FOR_BUILD="$c"; break ;
-	  fi ;
-	done ;
-	if test x"$CC_FOR_BUILD" = x ; then
-	  CC_FOR_BUILD=no_compiler_found ;
-	fi
-	;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-	PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-	# switched to ELF, *-*-netbsd* would select the old
-	# object file format.  This provides both forward
-	# compatibility and a consistent mechanism for selecting the
-	# object file format.
-	#
-	# Note: NetBSD doesn't particularly care about the vendor
-	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
-	case "${UNAME_MACHINE_ARCH}" in
-	    armeb) machine=armeb-unknown ;;
-	    arm*) machine=arm-unknown ;;
-	    sh3el) machine=shl-unknown ;;
-	    sh3eb) machine=sh-unknown ;;
-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
-	esac
-	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
-	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		eval $set_cc_for_build
-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep __ELF__ >/dev/null
-		then
-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-		    # Return netbsd for either.  FIX?
-		    os=netbsd
-		else
-		    os=netbsdelf
-		fi
-		;;
-	    *)
-	        os=netbsd
-		;;
-	esac
-	# The OS release
-	# Debian GNU/NetBSD machines have a different userland, and
-	# thus, need a distinct triplet. However, they do not need
-	# kernel version information, so it can be replaced with a
-	# suitable tag, in the style of linux-gnu.
-	case "${UNAME_VERSION}" in
-	    Debian*)
-		release='-gnu'
-		;;
-	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-		;;
-	esac
-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-	# contains redundant information, the shorter form:
-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
-	exit ;;
-    *:OpenBSD:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-	exit ;;
-    *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-	exit ;;
-    macppc:MirBSD:*:*)
-	echo powerppc-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    alpha:OSF1:*:*)
-	case $UNAME_RELEASE in
-	*4.0)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-		;;
-	*5.*)
-	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
-		;;
-	esac
-	# According to Compaq, /usr/sbin/psrinfo has been available on
-	# OSF/1 and Tru64 systems produced since 1995.  I hope that
-	# covers most systems running today.  This code pipes the CPU
-	# types through head -n 1, so we only detect the type of CPU 0.
-	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
-	case "$ALPHA_CPU_TYPE" in
-	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
-	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
-	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
-	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
-	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
-	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
-	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
-	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
-	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
-	esac
-	# A Pn.n version is a patched version.
-	# A Vn.n version is a released version.
-	# A Tn.n version is a released field test version.
-	# A Xn.n version is an unreleased experimental baselevel.
-	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	exit ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
-    Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit ;;
-    *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-morphos
-	exit ;;
-    *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
-    *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
-    *:OS400:*:*)
-        echo powerpc-ibm-os400
-	exit ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
-    NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
-    DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
-	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
-    sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    i86pc:SunOS:5.*:*)
-	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:6*:*)
-	# According to config.sub, this is the proper way to canonicalize
-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
-	    Series*|S4*)
-		UNAME_RELEASE=`uname -v`
-		;;
-	esac
-	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit ;;
-    sun3*:SunOS:*:*)
-	echo m68k-sun-sunos${UNAME_RELEASE}
-	exit ;;
-    sun*:*:4.2BSD:*)
-	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
-	case "`/bin/arch`" in
-	    sun3)
-		echo m68k-sun-sunos${UNAME_RELEASE}
-		;;
-	    sun4)
-		echo sparc-sun-sunos${UNAME_RELEASE}
-		;;
-	esac
-	exit ;;
-    aushp:SunOS:*:*)
-	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
-    m68k:machten:*:*)
-	echo m68k-apple-machten${UNAME_RELEASE}
-	exit ;;
-    powerpc:machten:*:*)
-	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit ;;
-    RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
-    RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-	int main (int argc, char *argv[]) {
-#else
-	int main (argc, argv) int argc; char *argv[]; {
-#endif
-	#if defined (host_mips) && defined (MIPSEB)
-	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-	#endif
-	#endif
-	  exit (-1);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c &&
-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-	  SYSTEM_NAME=`$dummy $dummyarg` &&
-	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos${UNAME_RELEASE}
-	exit ;;
-    Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
-    Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
-    m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
-    m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
-    m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
-    AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-	then
-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-	       [ ${TARGET_BINARY_INTERFACE}x = x ]
-	    then
-		echo m88k-dg-dgux${UNAME_RELEASE}
-	    else
-		echo m88k-dg-dguxbcs${UNAME_RELEASE}
-	    fi
-	else
-	    echo i586-dg-dgux${UNAME_RELEASE}
-	fi
- 	exit ;;
-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
-    M88*:*:R3*:*)
-	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
-    *:IRIX*:*:*)
-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
-    ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:2:3)
-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		eval $set_cc_for_build
-		sed 's/^		//' << EOF >$dummy.c
-		#include <sys/systemcfg.h>
-
-		main()
-			{
-			if (!__power_pc())
-				exit(1);
-			puts("powerpc-ibm-aix3.2.5");
-			exit(0);
-			}
-EOF
-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
-		then
-			echo "$SYSTEM_NAME"
-		else
-			echo rs6000-ibm-aix3.2.5
-		fi
-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
-	else
-		echo rs6000-ibm-aix3.2
-	fi
-	exit ;;
-    *:AIX:*:[45])
-	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-		IBM_ARCH=rs6000
-	else
-		IBM_ARCH=powerpc
-	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
-    DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
-    9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
-    9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
-	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
-		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-                    case "${sc_cpu_version}" in
-                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-                      532)                      # CPU_PA_RISC2_0
-                        case "${sc_kernel_bits}" in
-                          32) HP_ARCH="hppa2.0n" ;;
-                          64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
-                        esac ;;
-                    esac
-		fi
-		if [ "${HP_ARCH}" = "" ]; then
-		    eval $set_cc_for_build
-		    sed 's/^              //' << EOF >$dummy.c
-
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-              	{
-              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-              	case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-              	    switch (bits)
-              		{
-              		case 64: puts ("hppa2.0w"); break;
-              		case 32: puts ("hppa2.0n"); break;
-              		default: puts ("hppa2.0"); break;
-              		} break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-              	    puts ("hppa2.0"); break;
-              #endif
-              	default: puts ("hppa1.0"); break;
-              	}
-                  exit (0);
-              }
-EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
-		    test -z "$HP_ARCH" && HP_ARCH=hppa
-		fi ;;
-	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
-	then
-	    eval $set_cc_for_build
-
-	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
-	    # generating 64-bit code.  GNU and HP use different nomenclature:
-	    #
-	    # $ CC_FOR_BUILD=cc ./config.guess
-	    # => hppa2.0w-hp-hpux11.23
-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
-	    # => hppa64-hp-hpux11.23
-
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-		grep __LP64__ >/dev/null
-	    then
-		HP_ARCH="hppa2.0w"
-	    else
-		HP_ARCH="hppa64"
-	    fi
-	fi
-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit ;;
-    ia64:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux${HPUX_REV}
-	exit ;;
-    3050*:HI-UX:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <unistd.h>
-	int
-	main ()
-	{
-	  long cpu = sysconf (_SC_CPU_VERSION);
-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-	     results, however.  */
-	  if (CPU_IS_PA_RISC (cpu))
-	    {
-	      switch (cpu)
-		{
-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-		  default: puts ("hppa-hitachi-hiuxwe2"); break;
-		}
-	    }
-	  else if (CPU_IS_HP_MC68K (cpu))
-	    puts ("m68k-hitachi-hiuxwe2");
-	  else puts ("unknown-hitachi-hiuxwe2");
-	  exit (0);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
-		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-	echo hppa1.1-hp-bsd
-	exit ;;
-    9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-	echo hppa1.1-hp-osf
-	exit ;;
-    hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
-    i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-unknown-osf1mk
-	else
-	    echo ${UNAME_MACHINE}-unknown-osf1
-	fi
-	exit ;;
-    parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-        exit ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-        exit ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-        exit ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-        exit ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-        exit ;;
-    CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*[A-Z]90:*:*:*)
-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-	      -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*TS:*:*:*)
-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    *:UNICOS/mp:*:*)
-	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit ;;
-    5000:UNIX_System_V:4.*:*)
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit ;;
-    sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:FreeBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
-    i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
-    i*:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:windows32*:*)
-    	# uname -m includes "-pc" on this system.
-    	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
-    i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
-    x86:Interix*:[34]*)
-	echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
-	exit ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
-    i*:UWIN*:*)
-	echo ${UNAME_MACHINE}-pc-uwin
-	exit ;;
-    amd64:CYGWIN*:*:*)
-	echo x86_64-unknown-cygwin
-	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
-    prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    *:GNU:*:*)
-	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	exit ;;
-    *:GNU/*:*:*)
-	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    arm*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    cris:Linux:*:*)
-	echo cris-axis-linux-gnu
-	exit ;;
-    crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
-	exit ;;
-    frv:Linux:*:*)
-    	echo frv-unknown-linux-gnu
-	exit ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    mips:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef mips
-	#undef mipsel
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=mipsel
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=mips
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef mips64
-	#undef mips64el
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=mips64el
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=mips64
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
-	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
-	exit ;;
-    alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-	  EV5)   UNAME_MACHINE=alphaev5 ;;
-	  EV56)  UNAME_MACHINE=alphaev56 ;;
-	  PCA56) UNAME_MACHINE=alphapca56 ;;
-	  PCA57) UNAME_MACHINE=alphapca56 ;;
-	  EV6)   UNAME_MACHINE=alphaev6 ;;
-	  EV67)  UNAME_MACHINE=alphaev67 ;;
-	  EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
-	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-	exit ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-	# Look for CPU level
-	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
-	esac
-	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
-	exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
-	exit ;;
-    sh64*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
-	exit ;;
-    i*86:Linux:*:*)
-	# The BFD linker knows what the default object file format is, so
-	# first see if it will tell us. cd to the root directory to prevent
-	# problems with other programs or directories called `ld' in the path.
-	# Set LC_ALL=C to ensure ld outputs messages in English.
-	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
-			 | sed -ne '/supported targets:/!d
-				    s/[ 	][ 	]*/ /g
-				    s/.*supported targets: *//
-				    s/ .*//
-				    p'`
-        case "$ld_supported_targets" in
-	  elf32-i386)
-		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
-		;;
-	  a.out-i386-linux)
-		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
-		exit ;;
-	  coff-i386)
-		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
-		exit ;;
-	  "")
-		# Either a pre-BFD a.out linker (linux-gnuoldld) or
-		# one that does not give us useful --help.
-		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
-		exit ;;
-	esac
-	# Determine whether the default compiler is a.out or elf
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <features.h>
-	#ifdef __ELF__
-	# ifdef __GLIBC__
-	#  if __GLIBC__ >= 2
-	LIBC=gnu
-	#  else
-	LIBC=gnulibc1
-	#  endif
-	# else
-	LIBC=gnulibc1
-	# endif
-	#else
-	#ifdef __INTEL_COMPILER
-	LIBC=gnu
-	#else
-	LIBC=gnuaout
-	#endif
-	#endif
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
-	test x"${LIBC}" != x && {
-		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
-		exit
-	}
-	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
-	;;
-    i*86:DYNIX/ptx:4*:*)
-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-	# earlier versions are messed up and put the nodename in both
-	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
-	# I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit ;;
-    i*86:OS/2:*:*)
-	# If we were able to find `uname', then EMX Unix compatibility
-	# is probably installed.
-	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit ;;
-    i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
-	exit ;;
-    i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
-	exit ;;
-    i*86:syllable:*:*)
-	echo ${UNAME_MACHINE}-pc-syllable
-	exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    i*86:*DOS:*:*)
-	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-	else
-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-	fi
-	exit ;;
-    i*86:*:5:[678]*)
-    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
-	case `/bin/uname -X | grep "^Machine"` in
-	    *486*)	     UNAME_MACHINE=i486 ;;
-	    *Pentium)	     UNAME_MACHINE=i586 ;;
-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit ;;
-    i*86:*:3.2:*)
-	if test -f /usr/options/cb.name; then
-		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-	elif /bin/uname -X 2>/dev/null >/dev/null ; then
-		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
-			&& UNAME_MACHINE=i586
-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-	else
-		echo ${UNAME_MACHINE}-pc-sysv32
-	fi
-	exit ;;
-    pc:*:*:*)
-	# Left here for compatibility:
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i386.
-	echo i386-pc-msdosdjgpp
-        exit ;;
-    Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
-    paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
-    i860:*:4.*:*) # i860-SVR4
-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-	fi
-	exit ;;
-    mini*:CTIX:SYS*5:*)
-	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
-    mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
-    M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
-    M68*:*:R3V[5678]*:*)
-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
-	OS_REL=''
-	test -r /etc/.relid \
-	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
-    TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv${UNAME_RELEASE}
-	exit ;;
-    RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    *:SINIX-*:*:*)
-	if uname -p 2>/dev/null >/dev/null ; then
-		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo ${UNAME_MACHINE}-sni-sysv4
-	else
-		echo ns32k-sni-sysv
-	fi
-	exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
-    *:UNIX_System_V:4*:FTX*)
-	# From Gerald Hewes <hewes@openmarket.com>.
-	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
-    *:*:*:FTX*)
-	# From seanf@swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
-    i*86:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo ${UNAME_MACHINE}-stratus-vos
-	exit ;;
-    *:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
-    mc68*:A/UX:*:*)
-	echo m68k-apple-aux${UNAME_RELEASE}
-	exit ;;
-    news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-	        echo mips-nec-sysv${UNAME_RELEASE}
-	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
-	fi
-        exit ;;
-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
-    SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux${UNAME_RELEASE}
-	exit ;;
-    Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Rhapsody:*:*)
-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    *86) UNAME_PROCESSOR=i686 ;;
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
-		UNAME_PROCESSOR=i386
-		UNAME_MACHINE=pc
-	fi
-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit ;;
-    *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
-    BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
-    DS/*:UNIX_System_V:*:*)
-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit ;;
-    *:Plan9:*:*)
-	# "uname -m" is not consistent, so use $cputype instead. 386
-	# is converted to i386 for consistency with other x86
-	# operating systems.
-	if test "$cputype" = "386"; then
-	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
-	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
-	exit ;;
-    *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
-    *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
-    *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
-    *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
-    SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
-	exit ;;
-    *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
-    *:*VMS:*:*)
-    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "${UNAME_MACHINE}" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
-	esac ;;
-    *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
-    i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
-	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-	  ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
-and
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-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`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/build-aux/config.rpath b/build-aux/config.rpath
deleted file mode 100755
index c492a93..0000000
--- a/build-aux/config.rpath
+++ /dev/null
@@ -1,614 +0,0 @@
-#! /bin/sh
-# Output a system dependent set of variables, describing how to set the
-# run time search path of shared libraries in an executable.
-#
-#   Copyright 1996-2006 Free Software Foundation, Inc.
-#   Taken from GNU libtool, 2001
-#   Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-#   This file is free software; the Free Software Foundation gives
-#   unlimited permission to copy and/or distribute it, with or without
-#   modifications, as long as this notice is preserved.
-#
-# The first argument passed to this file is the canonical host specification,
-#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or
-#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
-# should be set by the caller.
-#
-# The set of defined variables is at the end of this script.
-
-# Known limitations:
-# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
-#   than 256 bytes, otherwise the compiler driver will dump core. The only
-#   known workaround is to choose shorter directory names for the build
-#   directory and/or the installation directory.
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-shrext=.so
-
-host="$1"
-host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-# Code taken from libtool.m4's _LT_CC_BASENAME.
-
-for cc_temp in $CC""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
-
-# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.
-
-wl=
-if test "$GCC" = yes; then
-  wl='-Wl,'
-else
-  case "$host_os" in
-    aix*)
-      wl='-Wl,'
-      ;;
-    darwin*)
-      case $cc_basename in
-        xlc*)
-          wl='-Wl,'
-          ;;
-      esac
-      ;;
-    mingw* | pw32* | os2*)
-      ;;
-    hpux9* | hpux10* | hpux11*)
-      wl='-Wl,'
-      ;;
-    irix5* | irix6* | nonstopux*)
-      wl='-Wl,'
-      ;;
-    newsos6)
-      ;;
-    linux*)
-      case $cc_basename in
-        icc* | ecc*)
-          wl='-Wl,'
-          ;;
-        pgcc | pgf77 | pgf90)
-          wl='-Wl,'
-          ;;
-        ccc*)
-          wl='-Wl,'
-          ;;
-        como)
-          wl='-lopt='
-          ;;
-        *)
-          case `$CC -V 2>&1 | sed 5q` in
-            *Sun\ C*)
-              wl='-Wl,'
-              ;;
-          esac
-          ;;
-      esac
-      ;;
-    osf3* | osf4* | osf5*)
-      wl='-Wl,'
-      ;;
-    sco3.2v5*)
-      ;;
-    solaris*)
-      wl='-Wl,'
-      ;;
-    sunos4*)
-      wl='-Qoption ld '
-      ;;
-    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-      wl='-Wl,'
-      ;;
-    sysv4*MP*)
-      ;;
-    unicos*)
-      wl='-Wl,'
-      ;;
-    uts4*)
-      ;;
-  esac
-fi
-
-# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.
-
-hardcode_libdir_flag_spec=
-hardcode_libdir_separator=
-hardcode_direct=no
-hardcode_minus_L=no
-
-case "$host_os" in
-  cygwin* | mingw* | pw32*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-esac
-
-ld_shlibs=yes
-if test "$with_gnu_ld" = yes; then
-  # Set some defaults for GNU ld with shared library support. These
-  # are reset later if shared libraries are not supported. Putting them
-  # here allows them to be overridden if necessary.
-  # Unlike libtool, we use -rpath here, not --rpath, since the documented
-  # option of GNU ld is called -rpath, not --rpath.
-  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-  case "$host_os" in
-    aix3* | aix4* | aix5*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-        ld_shlibs=no
-      fi
-      ;;
-    amigaos*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
-      # that the semantics of dynamic libraries on AmigaOS, at least up
-      # to version 4, is to share data among multiple programs linked
-      # with the same dynamic library.  Since this doesn't match the
-      # behavior of shared libraries on other platforms, we cannot use
-      # them.
-      ld_shlibs=no
-      ;;
-    beos*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-        :
-      else
-        ld_shlibs=no
-      fi
-      ;;
-    cygwin* | mingw* | pw32*)
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-        :
-      else
-        ld_shlibs=no
-      fi
-      ;;
-    interix3*)
-      hardcode_direct=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      ;;
-    linux*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-        :
-      else
-        ld_shlibs=no
-      fi
-      ;;
-    netbsd*)
-      ;;
-    solaris*)
-      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
-        ld_shlibs=no
-      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-        :
-      else
-        ld_shlibs=no
-      fi
-      ;;
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-          ld_shlibs=no
-          ;;
-        *)
-          if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-            hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
-          else
-            ld_shlibs=no
-          fi
-          ;;
-      esac
-      ;;
-    sunos4*)
-      hardcode_direct=yes
-      ;;
-    *)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-        :
-      else
-        ld_shlibs=no
-      fi
-      ;;
-  esac
-  if test "$ld_shlibs" = no; then
-    hardcode_libdir_flag_spec=
-  fi
-else
-  case "$host_os" in
-    aix3*)
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes; then
-        # Neither direct hardcoding nor static linking is supported with a
-        # broken collect2.
-        hardcode_direct=unsupported
-      fi
-      ;;
-    aix4* | aix5*)
-      if test "$host_cpu" = ia64; then
-        # On IA64, the linker does run time linking by default, so we don't
-        # have to do anything special.
-        aix_use_runtimelinking=no
-      else
-        aix_use_runtimelinking=no
-        # Test if we are trying to use run time linking or normal
-        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-        # need to do runtime linking.
-        case $host_os in aix4.[23]|aix4.[23].*|aix5*)
-          for ld_flag in $LDFLAGS; do
-            if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-              aix_use_runtimelinking=yes
-              break
-            fi
-          done
-          ;;
-        esac
-      fi
-      hardcode_direct=yes
-      hardcode_libdir_separator=':'
-      if test "$GCC" = yes; then
-        case $host_os in aix4.[012]|aix4.[012].*)
-          collect2name=`${CC} -print-prog-name=collect2`
-          if test -f "$collect2name" && \
-            strings "$collect2name" | grep resolve_lib_name >/dev/null
-          then
-            # We have reworked collect2
-            hardcode_direct=yes
-          else
-            # We have old collect2
-            hardcode_direct=unsupported
-            hardcode_minus_L=yes
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_libdir_separator=
-          fi
-          ;;
-        esac
-      fi
-      # Begin _LT_AC_SYS_LIBPATH_AIX.
-      echo 'int main () { return 0; }' > conftest.c
-      ${CC} ${LDFLAGS} conftest.c -o conftest
-      aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-      if test -z "$aix_libpath"; then
-        aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-      fi
-      if test -z "$aix_libpath"; then
-        aix_libpath="/usr/lib:/lib"
-      fi
-      rm -f conftest.c conftest
-      # End _LT_AC_SYS_LIBPATH_AIX.
-      if test "$aix_use_runtimelinking" = yes; then
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-      else
-        if test "$host_cpu" = ia64; then
-          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-        else
-          hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        fi
-      fi
-      ;;
-    amigaos*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      # see comment about different semantics on the GNU ld section
-      ld_shlibs=no
-      ;;
-    bsdi[45]*)
-      ;;
-    cygwin* | mingw* | pw32*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec=' '
-      libext=lib
-      ;;
-    darwin* | rhapsody*)
-      hardcode_direct=no
-      if test "$GCC" = yes ; then
-        :
-      else
-        case $cc_basename in
-          xlc*)
-            ;;
-          *)
-            ld_shlibs=no
-            ;;
-        esac
-      fi
-      ;;
-    dgux*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      ;;
-    freebsd1*)
-      ld_shlibs=no
-      ;;
-    freebsd2.2*)
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      ;;
-    freebsd2*)
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      ;;
-    freebsd* | kfreebsd*-gnu | dragonfly*)
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      ;;
-    hpux9*)
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      ;;
-    hpux10*)
-      if test "$with_gnu_ld" = no; then
-        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-        hardcode_libdir_separator=:
-        hardcode_direct=yes
-        # hardcode_minus_L: Not really in the search PATH,
-        # but as the default location of the library.
-        hardcode_minus_L=yes
-      fi
-      ;;
-    hpux11*)
-      if test "$with_gnu_ld" = no; then
-        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-        hardcode_libdir_separator=:
-        case $host_cpu in
-          hppa*64*|ia64*)
-            hardcode_direct=no
-            ;;
-          *)
-            hardcode_direct=yes
-            # hardcode_minus_L: Not really in the search PATH,
-            # but as the default location of the library.
-            hardcode_minus_L=yes
-            ;;
-        esac
-      fi
-      ;;
-    irix5* | irix6* | nonstopux*)
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-    netbsd*)
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      ;;
-    newsos6)
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-    openbsd*)
-      hardcode_direct=yes
-      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-        hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      else
-        case "$host_os" in
-          openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-            hardcode_libdir_flag_spec='-R$libdir'
-            ;;
-          *)
-            hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-            ;;
-        esac
-      fi
-      ;;
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      ;;
-    osf3*)
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-    osf4* | osf5*)
-      if test "$GCC" = yes; then
-        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-        # Both cc and cxx compiler support -rpath directly
-        hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      hardcode_libdir_separator=:
-      ;;
-    solaris*)
-      hardcode_libdir_flag_spec='-R$libdir'
-      ;;
-    sunos4*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      ;;
-    sysv4)
-      case $host_vendor in
-        sni)
-          hardcode_direct=yes # is this really true???
-          ;;
-        siemens)
-          hardcode_direct=no
-          ;;
-        motorola)
-          hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-          ;;
-      esac
-      ;;
-    sysv4.3*)
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-        ld_shlibs=yes
-      fi
-      ;;
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
-      ;;
-    sysv5* | sco3.2v5* | sco5v6*)
-      hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-      hardcode_libdir_separator=':'
-      ;;
-    uts4*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      ;;
-    *)
-      ld_shlibs=no
-      ;;
-  esac
-fi
-
-# Check dynamic linker characteristics
-# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
-libname_spec='lib$name'
-case "$host_os" in
-  aix3*)
-    ;;
-  aix4* | aix5*)
-    ;;
-  amigaos*)
-    ;;
-  beos*)
-    ;;
-  bsdi[45]*)
-    ;;
-  cygwin* | mingw* | pw32*)
-    shrext=.dll
-    ;;
-  darwin* | rhapsody*)
-    shrext=.dylib
-    ;;
-  dgux*)
-    ;;
-  freebsd1*)
-    ;;
-  kfreebsd*-gnu)
-    ;;
-  freebsd* | dragonfly*)
-    ;;
-  gnu*)
-    ;;
-  hpux9* | hpux10* | hpux11*)
-    case $host_cpu in
-      ia64*)
-        shrext=.so
-        ;;
-      hppa*64*)
-        shrext=.sl
-        ;;
-      *)
-        shrext=.sl
-        ;;
-    esac
-    ;;
-  interix3*)
-    ;;
-  irix5* | irix6* | nonstopux*)
-    case "$host_os" in
-      irix5* | nonstopux*)
-        libsuff= shlibsuff=
-        ;;
-      *)
-        case $LD in
-          *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
-          *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
-          *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
-          *) libsuff= shlibsuff= ;;
-        esac
-        ;;
-    esac
-    ;;
-  linux*oldld* | linux*aout* | linux*coff*)
-    ;;
-  linux*)
-    ;;
-  knetbsd*-gnu)
-    ;;
-  netbsd*)
-    ;;
-  newsos6)
-    ;;
-  nto-qnx*)
-    ;;
-  openbsd*)
-    ;;
-  os2*)
-    libname_spec='$name'
-    shrext=.dll
-    ;;
-  osf3* | osf4* | osf5*)
-    ;;
-  solaris*)
-    ;;
-  sunos4*)
-    ;;
-  sysv4 | sysv4.3*)
-    ;;
-  sysv4*MP*)
-    ;;
-  sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-    ;;
-  uts4*)
-    ;;
-esac
-
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
-shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
-escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
-
-LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
-
-# How to pass a linker flag through the compiler.
-wl="$escaped_wl"
-
-# Static library suffix (normally "a").
-libext="$libext"
-
-# Shared library suffix (normally "so").
-shlibext="$shlibext"
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
-
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator="$hardcode_libdir_separator"
-
-# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct="$hardcode_direct"
-
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L="$hardcode_minus_L"
-
-EOF
diff --git a/build-aux/config.sub b/build-aux/config.sub
deleted file mode 100755
index 1c366df..0000000
--- a/build-aux/config.sub
+++ /dev/null
@@ -1,1579 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-
-timestamp='2005-07-08'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This 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 2 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-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."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
-  kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray)
-		os=
-		basic_machine=$1
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
- 	-chorusrdb)
- 		os=-chorusrdb
-		basic_machine=$1
- 		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*)
-		os=-lynxos
-		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
-	-psos*)
-		os=-psos
-		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| fr30 | frv \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64vr | mips64vrel \
-	| mips64orion | mips64orionel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| ms1 \
-	| msp430 \
-	| ns16k | ns32k \
-	| or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
-	| pyramid \
-	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b \
-	| strongarm \
-	| tahoe | thumb | tic4x | tic80 | tron \
-	| v850 | v850e \
-	| we32k \
-	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
-	| z8k)
-		basic_machine=$basic_machine-unknown
-		;;
-	m32c)
-		basic_machine=$basic_machine-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12)
-		# Motorola 68HC11/12.
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-	| clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
-	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| ms1-* \
-	| msp430-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
-	| pyramid-* \
-	| romp-* | rs6000-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
-	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tron-* \
-	| v850-* | v850e-* | vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
-	| xstormy16-* | xtensa-* \
-	| ymp-* \
-	| z8k-*)
-		;;
-	m32c-*)
-		;;
-	# Recognize the various machine names and aliases which stand
-	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
-		;;
-	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-    	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16c)
-		basic_machine=cr16c-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
-		;;
-	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
-		;;
-	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
-		;;
-	delta | 3300 | motorola-3300 | motorola-delta \
-	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
-		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
-		;;
-	encore | umax | mmax)
-		basic_machine=ns32k-encore
-		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
-		;;
-	fx2800)
-		basic_machine=i860-alliant
-		;;
-	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
-		;;
-	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
-		;;
-	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
-		;;
-	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
-		;;
-	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k78[0-9] | hp78[0-9])
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
-		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
-		;;
-	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
-		;;
-	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
-		;;
-	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
-		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
-		;;
-	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
-			;;
-		    *)
-			os=-irix4
-			;;
-		esac
-		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-	mingw32)
-		basic_machine=i386-pc
-		os=-mingw32
-		;;
-	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
-		;;
-	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
-			;;
-		    -ns2*)
-		      os=-nextstep2
-			;;
-		    *)
-		      os=-nextstep3
-			;;
-		esac
-		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
-	np1)
-		basic_machine=np1-gould
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
-		;;
-	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
-		;;
-	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	pbd)
-		basic_machine=sparc-tti
-		;;
-	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc)	basic_machine=powerpc-unknown
-		;;
-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	rm[46]00)
-		basic_machine=mips-siemens
-		;;
-	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
-		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
-		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
-		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
-		;;
-	sequent)
-		basic_machine=i386-sequent
-		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
-		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
-		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
-		;;
-	spur)
-		basic_machine=spur-unknown
-		;;
-	st2000)
-		basic_machine=m68k-tandem
-		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
-		;;
-	sun2)
-		basic_machine=m68000-sun
-		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
-		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
-		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
-		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
-		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
-		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
-		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
-		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
-		;;
-	sun4)
-		basic_machine=sparc-sun
-		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
-		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
-		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
-		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
-		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
-		;;
-	tic54x | c54x*)
-		basic_machine=tic54x-unknown
-		os=-coff
-		;;
-	tic55x | c55x*)
-		basic_machine=tic55x-unknown
-		os=-coff
-		;;
-	tic6x | c6x*)
-		basic_machine=tic6x-unknown
-		os=-coff
-		;;
-	tx39)
-		basic_machine=mipstx39-unknown
-		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
-		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
-		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
-		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
-		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
-		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
-		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
-		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
-		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
-		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
-		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
-		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
-		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
-		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
-		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
-		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
-		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
-		;;
-	none)
-		basic_machine=none-none
-		os=-none
-		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
-		;;
-	op50n)
-		basic_machine=hppa1.1-oki
-		;;
-	op60c)
-		basic_machine=hppa1.1-oki
-		;;
-	romp)
-		basic_machine=romp-ibm
-		;;
-	mmix)
-		basic_machine=mmix-knuth
-		;;
-	rs6000)
-		basic_machine=rs6000-ibm
-		;;
-	vax)
-		basic_machine=vax-dec
-		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
-		;;
-	pdp11)
-		basic_machine=pdp11-dec
-		;;
-	we32k)
-		basic_machine=we32k-att
-		;;
-	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
-		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b)
-		basic_machine=sparc-sun
-		;;
-	cydra)
-		basic_machine=cydra-cydrome
-		;;
-	orion)
-		basic_machine=orion-highlevel
-		;;
-	orion105)
-		basic_machine=clipper-highlevel
-		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
-		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
-		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
-		;;
-	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-		;;
-	*)
-		;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
-		;;
-	-solaris)
-		os=-solaris2
-		;;
-	-svr4*)
-		os=-sysv4
-		;;
-	-unixware*)
-		os=-sysv4.2uw
-		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
-		;;
-	-nto-qnx*)
-		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
-		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
-		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
-		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
-		;;
-	-opened*)
-		os=-openedition
-		;;
-        -os400*)
-		os=-os400
-		;;
-	-wince*)
-		os=-wince
-		;;
-	-osfrose*)
-		os=-osfrose
-		;;
-	-osf*)
-		os=-osf
-		;;
-	-utek*)
-		os=-bsd
-		;;
-	-dynix*)
-		os=-bsd
-		;;
-	-acis*)
-		os=-aos
-		;;
-	-atheos*)
-		os=-atheos
-		;;
-	-syllable*)
-		os=-syllable
-		;;
-	-386bsd)
-		os=-bsd
-		;;
-	-ctix* | -uts*)
-		os=-sysv
-		;;
-	-nova*)
-		os=-rtmk-nova
-		;;
-	-ns2 )
-		os=-nextstep2
-		;;
-	-nsk*)
-		os=-nsk
-		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
-		;;
-	-sinix*)
-		os=-sysv4
-		;;
-        -tpf*)
-		os=-tpf
-		;;
-	-triton*)
-		os=-sysv3
-		;;
-	-oss*)
-		os=-sysv3
-		;;
-	-svr4)
-		os=-sysv4
-		;;
-	-svr3)
-		os=-sysv3
-		;;
-	-sysvr4)
-		os=-sysv4
-		;;
-	# This must come after -sysvr4.
-	-sysv*)
-		;;
-	-ose*)
-		os=-ose
-		;;
-	-es1800*)
-		os=-ose
-		;;
-	-xenix)
-		os=-xenix
-		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
-		;;
-	-aros*)
-		os=-aros
-		;;
-	-kaos*)
-		os=-kaos
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-none)
-		;;
-	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
-		;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-	*-acorn)
-		os=-riscix1.2
-		;;
-	arm*-rebel)
-		os=-linux
-		;;
-	arm*-semi)
-		os=-aout
-		;;
-    c4x-* | tic4x-*)
-        os=-coff
-        ;;
-	# This must come before the *-dec entry.
-	pdp10-*)
-		os=-tops20
-		;;
-	pdp11-*)
-		os=-none
-		;;
-	*-dec | vax-*)
-		os=-ultrix4.2
-		;;
-	m68*-apollo)
-		os=-domain
-		;;
-	i386-sun)
-		os=-sunos4.0.2
-		;;
-	m68000-sun)
-		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or32-*)
-		os=-coff
-		;;
-	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
-		;;
-	sparc-* | *-sun)
-		os=-sunos4.1.1
-		;;
-	*-be)
-		os=-beos
-		;;
-	*-haiku)
-		os=-haiku
-		;;
-	*-ibm)
-		os=-aix
-		;;
-    	*-knuth)
-		os=-mmixware
-		;;
-	*-wec)
-		os=-proelf
-		;;
-	*-winbond)
-		os=-proelf
-		;;
-	*-oki)
-		os=-proelf
-		;;
-	*-hp)
-		os=-hpux
-		;;
-	*-hitachi)
-		os=-hiux
-		;;
-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
-		;;
-	*-cbm)
-		os=-amigaos
-		;;
-	*-dg)
-		os=-dgux
-		;;
-	*-dolphin)
-		os=-sysv3
-		;;
-	m68k-ccur)
-		os=-rtu
-		;;
-	m88k-omron*)
-		os=-luna
-		;;
-	*-next )
-		os=-nextstep
-		;;
-	*-sequent)
-		os=-ptx
-		;;
-	*-crds)
-		os=-unos
-		;;
-	*-ns)
-		os=-genix
-		;;
-	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
-		;;
-	*-gould)
-		os=-sysv
-		;;
-	*-highlevel)
-		os=-bsd
-		;;
-	*-encore)
-		os=-bsd
-		;;
-	*-sgi)
-		os=-irix
-		;;
-	*-siemens)
-		os=-sysv4
-		;;
-	*-masscomp)
-		os=-rtu
-		;;
-	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
-		;;
-	*-rom68k)
-		os=-coff
-		;;
-	*-*bug)
-		os=-coff
-		;;
-	*-apple)
-		os=-macos
-		;;
-	*-atari*)
-		os=-mint
-		;;
-	*)
-		os=-none
-		;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
-				vendor=acorn
-				;;
-			-sunos*)
-				vendor=sun
-				;;
-			-aix*)
-				vendor=ibm
-				;;
-			-beos*)
-				vendor=be
-				;;
-			-hpux*)
-				vendor=hp
-				;;
-			-mpeix*)
-				vendor=hp
-				;;
-			-hiux*)
-				vendor=hitachi
-				;;
-			-unos*)
-				vendor=crds
-				;;
-			-dgux*)
-				vendor=dg
-				;;
-			-luna*)
-				vendor=omron
-				;;
-			-genix*)
-				vendor=ns
-				;;
-			-mvs* | -opened*)
-				vendor=ibm
-				;;
-			-os400*)
-				vendor=ibm
-				;;
-			-ptx*)
-				vendor=sequent
-				;;
-			-tpf*)
-				vendor=ibm
-				;;
-			-vxsim* | -vxworks* | -windiss*)
-				vendor=wrs
-				;;
-			-aux*)
-				vendor=apple
-				;;
-			-hms*)
-				vendor=hitachi
-				;;
-			-mpw* | -macos*)
-				vendor=apple
-				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-				vendor=atari
-				;;
-			-vos*)
-				vendor=stratus
-				;;
-		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-		;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/build-aux/depcomp b/build-aux/depcomp
deleted file mode 100755
index 04701da..0000000
--- a/build-aux/depcomp
+++ /dev/null
@@ -1,530 +0,0 @@
-#! /bin/sh
-# depcomp - compile a program generating dependencies as side-effects
-
-scriptversion=2005-07-09.11
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005 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.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
-
-case $1 in
-  '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: depcomp [--help] [--version] PROGRAM [ARGS]
-
-Run PROGRAMS ARGS to compile a file, generating dependencies
-as side-effects.
-
-Environment variables:
-  depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
-  DEPDIR      directory where to store dependencies.
-  depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputing dependencies.
-  libtool     Whether libtool is used (yes/no).
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "depcomp $scriptversion"
-    exit $?
-    ;;
-esac
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
-  echo "depcomp: Variables source, object and depmode must be set" 1>&2
-  exit 1
-fi
-
-# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
-depfile=${depfile-`echo "$object" |
-  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Some modes work just like other modes, but use different flags.  We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write.  Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
-  # HP compiler uses -M and no extra arg.
-  gccflag=-M
-  depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
-   # This is just like dashmstdout with a different argument.
-   dashmflag=-xM
-   depmode=dashmstdout
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff.  Hmm.
-  "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  mv "$tmpdepfile" "$depfile"
-  ;;
-
-gcc)
-## There are various ways to get dependency output from gcc.  Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-##   up in a subdir.  Having to rename by hand is ugly.
-##   (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).
-## - Using -M directly means running the compiler twice (even worse
-##   than renaming).
-  if test -z "$gccflag"; then
-    gccflag=-MD,
-  fi
-  "$@" -Wp,"$gccflag$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
-  sed -e 's/^[^:]*: / /' \
-      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header).  We avoid this by adding
-## dummy dependencies for each header file.  Too bad gcc doesn't do
-## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
-## that the space means something, we add a space to the output as
-## well.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-sgi)
-  if test "$libtool" = yes; then
-    "$@" "-Wp,-MDupdate,$tmpdepfile"
-  else
-    "$@" -MDupdate "$tmpdepfile"
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-
-  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
-    echo "$object : \\" > "$depfile"
-
-    # Clip off the initial element (the dependent).  Don't try to be
-    # clever and replace this with sed code, as IRIX sed won't handle
-    # lines with more than a fixed number of characters (4096 in
-    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
-    # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
-    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> $depfile
-    echo >> $depfile
-
-    # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
-   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> $depfile
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-aix)
-  # The C for AIX Compiler uses -M and outputs the dependencies
-  # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
-  # start of each line; $object doesn't have directory information.
-  # Version 6 uses the directory in both cases.
-  stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
-  tmpdepfile="$stripped.u"
-  if test "$libtool" = yes; then
-    "$@" -Wc,-M
-  else
-    "$@" -M
-  fi
-  stat=$?
-
-  if test -f "$tmpdepfile"; then :
-  else
-    stripped=`echo "$stripped" | sed 's,^.*/,,'`
-    tmpdepfile="$stripped.u"
-  fi
-
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-
-  if test -f "$tmpdepfile"; then
-    outname="$stripped.o"
-    # Each line is of the form `foo.o: dependent.h'.
-    # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
-    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
-  # ICC 7.0 will fill foo.d with something like
-  #    foo.o: sub/foo.c
-  #    foo.o: sub/foo.h
-  # which is wrong.  We want:
-  #    sub/foo.o: sub/foo.c
-  #    sub/foo.o: sub/foo.h
-  #    sub/foo.c:
-  #    sub/foo.h:
-  # ICC 7.1 will output
-  #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using \ :
-  #    foo.o: sub/foo.c ... \
-  #     sub/foo.h ... \
-  #     ...
-
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  # Each line is of the form `foo.o: dependent.h',
-  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
-  # Do two passes, one to just change these to
-  # `$object: dependent.h' and one to simply `dependent.h:'.
-  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-tru64)
-   # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
-   # Subdirectories are respected.
-   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-   test "x$dir" = "x$object" && dir=
-   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
-   if test "$libtool" = yes; then
-      # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mecanism is used in libtool 1.4 series to
-      # handle both shared and static libraries in a single compilation.
-      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
-      #
-      # With libtool 1.5 this exception was removed, and libtool now
-      # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in in $dir.libs/$base.o.d and
-      # in $dir$base.o.d.  We have to check for both files, because
-      # one of the two compilations can be disabled.  We should prefer
-      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-      # automatically cleaned when .libs/ is deleted, while ignoring
-      # the former would cause a distcleancheck panic.
-      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
-      tmpdepfile2=$dir$base.o.d          # libtool 1.5
-      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
-      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
-      "$@" -Wc,-MD
-   else
-      tmpdepfile1=$dir$base.o.d
-      tmpdepfile2=$dir$base.d
-      tmpdepfile3=$dir$base.d
-      tmpdepfile4=$dir$base.d
-      "$@" -MD
-   fi
-
-   stat=$?
-   if test $stat -eq 0; then :
-   else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-      exit $stat
-   fi
-
-   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-   do
-     test -f "$tmpdepfile" && break
-   done
-   if test -f "$tmpdepfile"; then
-      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-   else
-      echo "#dummy" > "$depfile"
-   fi
-   rm -f "$tmpdepfile"
-   ;;
-
-#nosideeffect)
-  # This comment above is used by automake to tell side-effect
-  # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
-  # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
-  "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-dashXmstdout)
-  # This case only exists to satisfy depend.m4.  It is never actually
-  # run, as this mode is specially recognized in the preamble.
-  exit 1
-  ;;
-
-makedepend)
-  "$@" || exit $?
-  # Remove any Libtool call
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-  # X makedepend
-  shift
-  cleared=no
-  for arg in "$@"; do
-    case $cleared in
-    no)
-      set ""; shift
-      cleared=yes ;;
-    esac
-    case "$arg" in
-    -D*|-I*)
-      set fnord "$@" "$arg"; shift ;;
-    # Strip any option that makedepend may not understand.  Remove
-    # the object too, otherwise makedepend will parse it as a source file.
-    -*|$object)
-      ;;
-    *)
-      set fnord "$@" "$arg"; shift ;;
-    esac
-  done
-  obj_suffix="`echo $object | sed 's/^.*\././'`"
-  touch "$tmpdepfile"
-  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile" "$tmpdepfile".bak
-  ;;
-
-cpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  "$@" -E |
-    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
-    sed '$ s: \\$::' > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  cat < "$tmpdepfile" >> "$depfile"
-  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvisualcpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o,
-  # because we must use -o when running libtool.
-  "$@" || exit $?
-  IFS=" "
-  for arg
-  do
-    case "$arg" in
-    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-	set fnord "$@"
-	shift
-	shift
-	;;
-    *)
-	set fnord "$@" "$arg"
-	shift
-	shift
-	;;
-    esac
-  done
-  "$@" -E |
-  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
-  echo "	" >> "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-none)
-  exec "$@"
-  ;;
-
-*)
-  echo "Unknown depmode $depmode" 1>&2
-  exit 1
-  ;;
-esac
-
-exit 0
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/build-aux/install-sh b/build-aux/install-sh
deleted file mode 100755
index 4d4a951..0000000
--- a/build-aux/install-sh
+++ /dev/null
@@ -1,323 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2005-05-14.22
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.  It can only install one file at a time, a restriction
-# shared with many OS's install programs.
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-chmodcmd="$chmodprog 0755"
-chowncmd=
-chgrpcmd=
-stripcmd=
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=
-dst=
-dir_arg=
-dstarg=
-no_target_directory=
-
-usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
-   or: $0 [OPTION]... SRCFILES... DIRECTORY
-   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
-   or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
--c         (ignored)
--d         create directories instead of installing files.
--g GROUP   $chgrpprog installed files to GROUP.
--m MODE    $chmodprog installed files to MODE.
--o USER    $chownprog installed files to USER.
--s         $stripprog installed files.
--t DIRECTORY  install into DIRECTORY.
--T         report an error if DSTFILE is a directory.
---help     display this help and exit.
---version  display version info and exit.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
-"
-
-while test -n "$1"; do
-  case $1 in
-    -c) shift
-        continue;;
-
-    -d) dir_arg=true
-        shift
-        continue;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-        shift
-        shift
-        continue;;
-
-    --help) echo "$usage"; exit $?;;
-
-    -m) chmodcmd="$chmodprog $2"
-        shift
-        shift
-        continue;;
-
-    -o) chowncmd="$chownprog $2"
-        shift
-        shift
-        continue;;
-
-    -s) stripcmd=$stripprog
-        shift
-        continue;;
-
-    -t) dstarg=$2
-	shift
-	shift
-	continue;;
-
-    -T) no_target_directory=true
-	shift
-	continue;;
-
-    --version) echo "$0 $scriptversion"; exit $?;;
-
-    *)  # When -d is used, all remaining arguments are directories to create.
-	# When -t is used, the destination is already specified.
-	test -n "$dir_arg$dstarg" && break
-        # Otherwise, the last argument is the destination.  Remove it from $@.
-	for arg
-	do
-          if test -n "$dstarg"; then
-	    # $@ is not empty: it contains at least $arg.
-	    set fnord "$@" "$dstarg"
-	    shift # fnord
-	  fi
-	  shift # arg
-	  dstarg=$arg
-	done
-	break;;
-  esac
-done
-
-if test -z "$1"; then
-  if test -z "$dir_arg"; then
-    echo "$0: no input file specified." >&2
-    exit 1
-  fi
-  # It's OK to call `install-sh -d' without argument.
-  # This can happen when creating conditional directories.
-  exit 0
-fi
-
-for src
-do
-  # Protect names starting with `-'.
-  case $src in
-    -*) src=./$src ;;
-  esac
-
-  if test -n "$dir_arg"; then
-    dst=$src
-    src=
-
-    if test -d "$dst"; then
-      mkdircmd=:
-      chmodcmd=
-    else
-      mkdircmd=$mkdirprog
-    fi
-  else
-    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
-    # might cause directories to be created, which would be especially bad
-    # if $src (and thus $dsttmp) contains '*'.
-    if test ! -f "$src" && test ! -d "$src"; then
-      echo "$0: $src does not exist." >&2
-      exit 1
-    fi
-
-    if test -z "$dstarg"; then
-      echo "$0: no destination specified." >&2
-      exit 1
-    fi
-
-    dst=$dstarg
-    # Protect names starting with `-'.
-    case $dst in
-      -*) dst=./$dst ;;
-    esac
-
-    # If destination is a directory, append the input filename; won't work
-    # if double slashes aren't ignored.
-    if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dstarg: Is a directory" >&2
-	exit 1
-      fi
-      dst=$dst/`basename "$src"`
-    fi
-  fi
-
-  # This sed command emulates the dirname command.
-  dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
-
-  # Make sure that the destination directory exists.
-
-  # Skip lots of stat calls in the usual case.
-  if test ! -d "$dstdir"; then
-    defaultIFS='
-	 '
-    IFS="${IFS-$defaultIFS}"
-
-    oIFS=$IFS
-    # Some sh's can't handle IFS=/ for some reason.
-    IFS='%'
-    set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
-    shift
-    IFS=$oIFS
-
-    pathcomp=
-
-    while test $# -ne 0 ; do
-      pathcomp=$pathcomp$1
-      shift
-      if test ! -d "$pathcomp"; then
-        $mkdirprog "$pathcomp"
-	# mkdir can fail with a `File exist' error in case several
-	# install-sh are creating the directory concurrently.  This
-	# is OK.
-	test -d "$pathcomp" || exit
-      fi
-      pathcomp=$pathcomp/
-    done
-  fi
-
-  if test -n "$dir_arg"; then
-    $doit $mkdircmd "$dst" \
-      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
-      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
-      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
-      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
-
-  else
-    dstfile=`basename "$dst"`
-
-    # Make a couple of temp file names in the proper directory.
-    dsttmp=$dstdir/_inst.$$_
-    rmtmp=$dstdir/_rm.$$_
-
-    # Trap to clean up those temp files at exit.
-    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-    trap '(exit $?); exit' 1 2 13 15
-
-    # Copy the file name to the temp name.
-    $doit $cpprog "$src" "$dsttmp" &&
-
-    # and set any options; do chmod last to preserve setuid bits.
-    #
-    # If any of these fail, we abort the whole thing.  If we want to
-    # ignore errors from any of these, just make sure not to ignore
-    # errors from the above "$doit $cpprog $src $dsttmp" command.
-    #
-    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
-      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
-      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
-      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
-
-    # Now rename the file to the real destination.
-    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
-      || {
-	   # The rename failed, perhaps because mv can't rename something else
-	   # to itself, or perhaps because mv is so ancient that it does not
-	   # support -f.
-
-	   # Now remove or move aside any old file at destination location.
-	   # We try this two ways since rm can't unlink itself on some
-	   # systems and the destination file might be busy for other
-	   # reasons.  In this case, the final cleanup might fail but the new
-	   # file should still install successfully.
-	   {
-	     if test -f "$dstdir/$dstfile"; then
-	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
-	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
-	       || {
-		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
-		 (exit 1); exit 1
-	       }
-	     else
-	       :
-	     fi
-	   } &&
-
-	   # Now rename the file to the real destination.
-	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
-	 }
-    }
-  fi || { (exit 1); exit 1; }
-done
-
-# The final little trick to "correctly" pass the exit status to the exit trap.
-{
-  (exit 0); exit 0
-}
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/build-aux/mdate-sh b/build-aux/mdate-sh
deleted file mode 100755
index cd916c0..0000000
--- a/build-aux/mdate-sh
+++ /dev/null
@@ -1,201 +0,0 @@
-#!/bin/sh
-# Get modification time of a file or directory and pretty-print it.
-
-scriptversion=2005-06-29.22
-
-# Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005 Free Software
-# Foundation, Inc.
-# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
-#
-# 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.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-case $1 in
-  '')
-     echo "$0: No file.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: mdate-sh [--help] [--version] FILE
-
-Pretty-print the modification time of FILE.
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "mdate-sh $scriptversion"
-    exit $?
-    ;;
-esac
-
-# Prevent date giving response in another language.
-LANG=C
-export LANG
-LC_ALL=C
-export LC_ALL
-LC_TIME=C
-export LC_TIME
-
-# GNU ls changes its time format in response to the TIME_STYLE
-# variable.  Since we cannot assume `unset' works, revert this
-# variable to its documented default.
-if test "${TIME_STYLE+set}" = set; then
-  TIME_STYLE=posix-long-iso
-  export TIME_STYLE
-fi
-
-save_arg1=$1
-
-# Find out how to get the extended ls output of a file or directory.
-if ls -L /dev/null 1>/dev/null 2>&1; then
-  ls_command='ls -L -l -d'
-else
-  ls_command='ls -l -d'
-fi
-
-# A `ls -l' line looks as follows on OS/2.
-#  drwxrwx---        0 Aug 11  2001 foo
-# This differs from Unix, which adds ownership information.
-#  drwxrwx---   2 root  root      4096 Aug 11  2001 foo
-#
-# To find the date, we split the line on spaces and iterate on words
-# until we find a month.  This cannot work with files whose owner is a
-# user named `Jan', or `Feb', etc.  However, it's unlikely that `/'
-# will be owned by a user whose name is a month.  So we first look at
-# the extended ls output of the root directory to decide how many
-# words should be skipped to get the date.
-
-# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
-set x`ls -l -d /`
-
-# Find which argument is the month.
-month=
-command=
-until test $month
-do
-  shift
-  # Add another shift to the command.
-  command="$command shift;"
-  case $1 in
-    Jan) month=January; nummonth=1;;
-    Feb) month=February; nummonth=2;;
-    Mar) month=March; nummonth=3;;
-    Apr) month=April; nummonth=4;;
-    May) month=May; nummonth=5;;
-    Jun) month=June; nummonth=6;;
-    Jul) month=July; nummonth=7;;
-    Aug) month=August; nummonth=8;;
-    Sep) month=September; nummonth=9;;
-    Oct) month=October; nummonth=10;;
-    Nov) month=November; nummonth=11;;
-    Dec) month=December; nummonth=12;;
-  esac
-done
-
-# Get the extended ls output of the file or directory.
-set dummy x`eval "$ls_command \"\$save_arg1\""`
-
-# Remove all preceding arguments
-eval $command
-
-# Because of the dummy argument above, month is in $2.
-#
-# On a POSIX system, we should have
-#
-# $# = 5
-# $1 = file size
-# $2 = month
-# $3 = day
-# $4 = year or time
-# $5 = filename
-#
-# On Darwin 7.7.0 and 7.6.0, we have
-#
-# $# = 4
-# $1 = day
-# $2 = month
-# $3 = year or time
-# $4 = filename
-
-# Get the month.
-case $2 in
-  Jan) month=January; nummonth=1;;
-  Feb) month=February; nummonth=2;;
-  Mar) month=March; nummonth=3;;
-  Apr) month=April; nummonth=4;;
-  May) month=May; nummonth=5;;
-  Jun) month=June; nummonth=6;;
-  Jul) month=July; nummonth=7;;
-  Aug) month=August; nummonth=8;;
-  Sep) month=September; nummonth=9;;
-  Oct) month=October; nummonth=10;;
-  Nov) month=November; nummonth=11;;
-  Dec) month=December; nummonth=12;;
-esac
-
-case $3 in
-  ???*) day=$1;;
-  *) day=$3; shift;;
-esac
-
-# Here we have to deal with the problem that the ls output gives either
-# the time of day or the year.
-case $3 in
-  *:*) set `date`; eval year=\$$#
-       case $2 in
-	 Jan) nummonthtod=1;;
-	 Feb) nummonthtod=2;;
-	 Mar) nummonthtod=3;;
-	 Apr) nummonthtod=4;;
-	 May) nummonthtod=5;;
-	 Jun) nummonthtod=6;;
-	 Jul) nummonthtod=7;;
-	 Aug) nummonthtod=8;;
-	 Sep) nummonthtod=9;;
-	 Oct) nummonthtod=10;;
-	 Nov) nummonthtod=11;;
-	 Dec) nummonthtod=12;;
-       esac
-       # For the first six month of the year the time notation can also
-       # be used for files modified in the last year.
-       if (expr $nummonth \> $nummonthtod) > /dev/null;
-       then
-	 year=`expr $year - 1`
-       fi;;
-  *) year=$3;;
-esac
-
-# The result.
-echo $day $month $year
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/build-aux/missing b/build-aux/missing
deleted file mode 100755
index 894e786..0000000
--- a/build-aux/missing
+++ /dev/null
@@ -1,360 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-
-scriptversion=2005-06-08.21
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
-#   Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# 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.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
-  exit 1
-fi
-
-run=:
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
-  configure_ac=configure.ac
-else
-  configure_ac=configure.in
-fi
-
-msg="missing on your system"
-
-case "$1" in
---run)
-  # Try to run requested program, and just exit if it succeeds.
-  run=
-  shift
-  "$@" && exit 0
-  # Exit code 63 means version mismatch.  This often happens
-  # when the user try to use an ancient version of a tool on
-  # a file that requires a minimum version.  In this case we
-  # we should proceed has if the program had been absent, or
-  # if --run hadn't been passed.
-  if test $? = 63; then
-    run=:
-    msg="probably too old"
-  fi
-  ;;
-
-  -h|--h|--he|--hel|--help)
-    echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
-  -h, --help      display this help and exit
-  -v, --version   output version information and exit
-  --run           try to run the given command, and emulate it if it fails
-
-Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  automake     touch all \`Makefile.in' files
-  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
-  flex         create \`lex.yy.c', if possible, from existing .c
-  help2man     touch the output file
-  lex          create \`lex.yy.c', if possible, from existing .c
-  makeinfo     touch the output file
-  tar          try tar, gnutar, gtar, then tar without non-portable flags
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
-
-Send bug reports to <bug-automake@gnu.org>."
-    exit $?
-    ;;
-
-  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing $scriptversion (GNU Automake)"
-    exit $?
-    ;;
-
-  -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
-    exit 1
-    ;;
-
-esac
-
-# Now exit if we have it, but it failed.  Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program).
-case "$1" in
-  lex|yacc)
-    # Not GNU programs, they don't have --version.
-    ;;
-
-  tar)
-    if test -n "$run"; then
-       echo 1>&2 "ERROR: \`tar' requires --run"
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       exit 1
-    fi
-    ;;
-
-  *)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       # Could not run --version or --help.  This is probably someone
-       # running `$TOOL --version' or `$TOOL --help' to check whether
-       # $TOOL exists and not knowing $TOOL uses missing.
-       exit 1
-    fi
-    ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case "$1" in
-  aclocal*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`${configure_ac}'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
-    test -z "$files" && files="config.h"
-    touch_files=
-    for f in $files; do
-      case "$f" in
-      *:*) touch_files="$touch_files "`echo "$f" |
-				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
-      *) touch_files="$touch_files $f.in";;
-      esac
-    done
-    touch $touch_files
-    ;;
-
-  automake*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print |
-	   sed 's/\.am$/.in/' |
-	   while read f; do touch "$f"; done
-    ;;
-
-  autom4te)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.
-         You can get \`$1' as part of \`Autoconf' from any GNU
-         archive site."
-
-    file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
-    test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo "#! /bin/sh"
-	echo "# Created by GNU Automake missing as a replacement of"
-	echo "#  $ $@"
-	echo "exit 0"
-	chmod +x $file
-	exit 1
-    fi
-    ;;
-
-  bison|yacc)
-    echo 1>&2 "\
-WARNING: \`$1' $msg.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    rm -f y.tab.c y.tab.h
-    if [ $# -ne 1 ]; then
-        eval LASTARG="\${$#}"
-	case "$LASTARG" in
-	*.y)
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if [ -f "$SRCFILE" ]; then
-	         cp "$SRCFILE" y.tab.c
-	    fi
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if [ -f "$SRCFILE" ]; then
-	         cp "$SRCFILE" y.tab.h
-	    fi
-	  ;;
-	esac
-    fi
-    if [ ! -f y.tab.h ]; then
-	echo >y.tab.h
-    fi
-    if [ ! -f y.tab.c ]; then
-	echo 'main() { return 0; }' >y.tab.c
-    fi
-    ;;
-
-  lex|flex)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.l' file.  You may need the \`Flex' package
-         in order for those modifications to take effect.  You can get
-         \`Flex' from any GNU archive site."
-    rm -f lex.yy.c
-    if [ $# -ne 1 ]; then
-        eval LASTARG="\${$#}"
-	case "$LASTARG" in
-	*.l)
-	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if [ -f "$SRCFILE" ]; then
-	         cp "$SRCFILE" lex.yy.c
-	    fi
-	  ;;
-	esac
-    fi
-    if [ ! -f lex.yy.c ]; then
-	echo 'main() { return 0; }' >lex.yy.c
-    fi
-    ;;
-
-  help2man)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-	 you modified a dependency of a manual page.  You may need the
-	 \`Help2man' package in order for those modifications to take
-	 effect.  You can get \`Help2man' from any GNU archive site."
-
-    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
-    if test -z "$file"; then
-	file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
-    fi
-    if [ -f "$file" ]; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo ".ab help2man is required to generate this page"
-	exit 1
-    fi
-    ;;
-
-  makeinfo)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
-    if test -z "$file"; then
-      # ... or it is the one specified with @setfilename ...
-      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
-      # ... or it is derived from the source name (dir/f.texi becomes f.info)
-      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
-    fi
-    # If the file does not exist, the user really needs makeinfo;
-    # let's fail without touching anything.
-    test -f $file || exit 1
-    touch $file
-    ;;
-
-  tar)
-    shift
-
-    # We have already tried tar in the generic part.
-    # Look for gnutar/gtar before invocation to avoid ugly error
-    # messages.
-    if (gnutar --version > /dev/null 2>&1); then
-       gnutar "$@" && exit 0
-    fi
-    if (gtar --version > /dev/null 2>&1); then
-       gtar "$@" && exit 0
-    fi
-    firstarg="$1"
-    if shift; then
-	case "$firstarg" in
-	*o*)
-	    firstarg=`echo "$firstarg" | sed s/o//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-	case "$firstarg" in
-	*h*)
-	    firstarg=`echo "$firstarg" | sed s/h//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-    fi
-
-    echo 1>&2 "\
-WARNING: I can't seem to be able to run \`tar' with the given arguments.
-         You may want to install GNU tar or Free paxutils, or check the
-         command line arguments."
-    exit 1
-    ;;
-
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequisites for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
-    ;;
-esac
-
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/build-aux/mkinstalldirs b/build-aux/mkinstalldirs
deleted file mode 100755
index 259dbfc..0000000
--- a/build-aux/mkinstalldirs
+++ /dev/null
@@ -1,158 +0,0 @@
-#! /bin/sh
-# mkinstalldirs --- make directory hierarchy
-
-scriptversion=2005-06-29.22
-
-# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
-# Created: 1993-05-16
-# Public domain.
-#
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-errstatus=0
-dirmode=
-
-usage="\
-Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
-
-Create each directory DIR (with mode MODE, if specified), including all
-leading file name components.
-
-Report bugs to <bug-automake@gnu.org>."
-
-# process command line arguments
-while test $# -gt 0 ; do
-  case $1 in
-    -h | --help | --h*)         # -h for help
-      echo "$usage"
-      exit $?
-      ;;
-    -m)                         # -m PERM arg
-      shift
-      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
-      dirmode=$1
-      shift
-      ;;
-    --version)
-      echo "$0 $scriptversion"
-      exit $?
-      ;;
-    --)                         # stop option processing
-      shift
-      break
-      ;;
-    -*)                         # unknown option
-      echo "$usage" 1>&2
-      exit 1
-      ;;
-    *)                          # first non-opt arg
-      break
-      ;;
-  esac
-done
-
-for file
-do
-  if test -d "$file"; then
-    shift
-  else
-    break
-  fi
-done
-
-case $# in
-  0) exit 0 ;;
-esac
-
-# Solaris 8's mkdir -p isn't thread-safe.  If you mkdir -p a/b and
-# mkdir -p a/c at the same time, both will detect that a is missing,
-# one will create a, then the other will try to create a and die with
-# a "File exists" error.  This is a problem when calling mkinstalldirs
-# from a parallel make.  We use --version in the probe to restrict
-# ourselves to GNU mkdir, which is thread-safe.
-case $dirmode in
-  '')
-    if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
-      echo "mkdir -p -- $*"
-      exec mkdir -p -- "$@"
-    else
-      # On NextStep and OpenStep, the `mkdir' command does not
-      # recognize any option.  It will interpret all options as
-      # directories to create, and then abort because `.' already
-      # exists.
-      test -d ./-p && rmdir ./-p
-      test -d ./--version && rmdir ./--version
-    fi
-    ;;
-  *)
-    if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
-       test ! -d ./--version; then
-      echo "mkdir -m $dirmode -p -- $*"
-      exec mkdir -m "$dirmode" -p -- "$@"
-    else
-      # Clean up after NextStep and OpenStep mkdir.
-      for d in ./-m ./-p ./--version "./$dirmode";
-      do
-        test -d $d && rmdir $d
-      done
-    fi
-    ;;
-esac
-
-for file
-do
-  case $file in
-    /*) pathcomp=/ ;;
-    *)  pathcomp= ;;
-  esac
-  oIFS=$IFS
-  IFS=/
-  set fnord $file
-  shift
-  IFS=$oIFS
-
-  for d
-  do
-    test "x$d" = x && continue
-
-    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
-      else
-	if test ! -z "$dirmode"; then
-	  echo "chmod $dirmode $pathcomp"
-	  lasterr=
-	  chmod "$dirmode" "$pathcomp" || lasterr=$?
-
-	  if test ! -z "$lasterr"; then
-	    errstatus=$lasterr
-	  fi
-	fi
-      fi
-    fi
-
-    pathcomp=$pathcomp/
-  done
-done
-
-exit $errstatus
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/build-aux/prev-version.txt b/build-aux/prev-version.txt
deleted file mode 100644
index cd5ac03..0000000
--- a/build-aux/prev-version.txt
+++ /dev/null
@@ -1 +0,0 @@
-2.0
diff --git a/build-aux/texinfo.tex b/build-aux/texinfo.tex
deleted file mode 100644
index ff2c406..0000000
--- a/build-aux/texinfo.tex
+++ /dev/null
@@ -1,7210 +0,0 @@
-% 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{2005-07-05.19}
-%
-% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
-% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 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 2, 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 texinfo.tex file; see the file COPYING.  If not, write
-% to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-% Boston, MA 02110-1301, USA.
-%
-% 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}
-
-\message{Basics,}
-\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
-
-% 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
-
-% In some macros, we cannot use the `\? notation---the left quote is
-% in some cases the escape char.
-\chardef\backChar  = `\\
-\chardef\colonChar = `\:
-\chardef\commaChar = `\,
-\chardef\dotChar   = `\.
-\chardef\exclamChar= `\!
-\chardef\plusChar  = `\+
-\chardef\questChar = `\?
-\chardef\semiChar  = `\;
-\chardef\underChar = `\_
-
-\chardef\spaceChar = `\ %
-\chardef\spacecat = 10
-\def\spaceisspace{\catcode\spaceChar=\spacecat}
-
-{% for help with debugging.
- % example usage: \expandafter\show\activebackslash
- \catcode`\! = 0 \catcode`\\ = \active
- !global!def!activebackslash{\}
-}
-
-% 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
-
-% 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).
-  \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
-  \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.
-    \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 \oddfootingxxx.)
-        % The \baselineskip=24pt in plain's \makefootline has no effect.
-        \vskip 2\baselineskip
-        \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 \unvbox#1
-\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\next{#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 occurence 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
-    % We cannot use \next here, as it holds the macro to run;
-    % thus we 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 \next.
-% (Similarily, 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\next\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 enviroments; they don't open a group.  (The
-% implementation of @end takes care not to call \endgroup in this
-% special case.)
-
-
-% At runtime, 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
-}
-
-% Evironment 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 \ptexi
-  \else\ifx\temp\jmacro \j
-  \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    insert text of that file as input.
-%
-\def\include{\parseargusing\filenamecatcodes\includezzz}
-\def\includezzz#1{%
-  \pushthisfilestack
-  \def\thisfile{#1}%
-  {%
-    \makevalueexpandable
-    \def\temp{\input #1 }%
-    \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\underChar = \active
-  \gdef\mathunderscore{%
-    \catcode\underChar=\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
-  $\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
-  }
-}
-
-% @bullet and @minus need the same treatment as @math, just above.
-\def\bullet{$\ptexbullet$}
-\def\minus{$-$}
-
-% @dots{} outputs an ellipsis using the current font.
-% We do .5em per period so that it has the same spacing in a typewriter
-% font as three actual period characters.
-%
-\def\dots{%
-  \leavevmode
-  \hbox to 1.5em{%
-    \hskip 0pt plus 0.25fil
-    .\hfil.\hfil.%
-    \hskip 0pt plus 0.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, to
-% 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 we do).
-
-% double active backslashes.
-% 
-{\catcode`\@=0 \catcode`\\=\active
- @gdef@activebackslash{@catcode`@\=@active @otherbackslash}
- @gdef@activebackslashdouble{%
-   @catcode@backChar=@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.  I've
-% tinkered with it a little for texinfo, but it's definitely from there.
-% 
-% #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{(}{\backslashlparen}{#1}%
-  \HyPsdSubst{)}{\backslashrparen}{#1}%
-}
-
-{\catcode\exclamChar = 0 \catcode\backChar = \other
- !gdef!backslashlparen{\(}%
- !gdef!backslashrparen{\)}%
-}
-
-\ifpdf
-  \input pdfcolor
-  \pdfcatalog{/PageMode /UseOutlines}%
-  \def\dopdfimage#1#2#3{%
-    \def\imagewidth{#2}%
-    \def\imageheight{#3}%
-    % without \immediate, 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
-      \ifx\empty\imagewidth\else width \imagewidth \fi
-      \ifx\empty\imageheight\else height \imageheight \fi
-      \ifnum\pdftexversion<13
-         #1.pdf%
-       \else
-         {#1.pdf}%
-       \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.
-    \atdummies
-    \activebackslashdouble
-    \def\pdfdestname{#1}%
-    \backslashparens\pdfdestname
-    \pdfdest name{\pdfdestname} xyz%
-  }}%
-  %
-  % used to mark target names; must be expandable.
-  \def\pdfmkpgn#1{#1}%
-  %
-  \let\linkcolor = \Blue  % was Cyan, but that seems light?
-  \def\endlink{\Black\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
-      \activebackslash
-      \input \jobname.toc
-    \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
-  \def\pdfurl#1{%
-    \begingroup
-      \normalturnoffactive\def\@{@}%
-      \makevalueexpandable
-      \leavevmode\Red
-      \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}}
-    \linkcolor #1\endlink}
-  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
-\else
-  \let\pdfmkdest = \gobble
-  \let\pdfurl = \gobble
-  \let\endlink = \relax
-  \let\linkcolor = \relax
-  \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}
-%
-\def\setleading#1{%
-  \normalbaselineskip = #1\relax
-  \normallineskip = \lineskipfactor\normalbaselineskip
-  \normalbaselines
-  \setbox\strutbox =\hbox{%
-    \vrule width0pt height\strutheightpercent\baselineskip
-                    depth \strutdepthpercent \baselineskip
-  }%
-}
-
-% 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
-\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
-
-% 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}
-
-% Text fonts (11.2pt, magstep1).
-\def\textnominalsize{11pt}
-\edef\mainmagstep{\magstephalf}
-\setfont\textrm\rmshape{10}{\mainmagstep}
-\setfont\texttt\ttshape{10}{\mainmagstep}
-\setfont\textbf\bfshape{10}{\mainmagstep}
-\setfont\textit\itshape{10}{\mainmagstep}
-\setfont\textsl\slshape{10}{\mainmagstep}
-\setfont\textsf\sfshape{10}{\mainmagstep}
-\setfont\textsc\scshape{10}{\mainmagstep}
-\setfont\textttsl\ttslshape{10}{\mainmagstep}
-\font\texti=cmmi10 scaled \mainmagstep
-\font\textsy=cmsy10 scaled \mainmagstep
-
-% A few fonts for @defun names and args.
-\setfont\defbf\bfshape{10}{\magstep1}
-\setfont\deftt\ttshape{10}{\magstep1}
-\setfont\defttsl\ttslshape{10}{\magstep1}
-\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}
-\setfont\smalltt\ttshape{9}{1000}
-\setfont\smallbf\bfshape{10}{900}
-\setfont\smallit\itshape{9}{1000}
-\setfont\smallsl\slshape{9}{1000}
-\setfont\smallsf\sfshape{9}{1000}
-\setfont\smallsc\scshape{10}{900}
-\setfont\smallttsl\ttslshape{10}{900}
-\font\smalli=cmmi9
-\font\smallsy=cmsy9
-
-% Fonts for small examples (8pt).
-\def\smallernominalsize{8pt}
-\setfont\smallerrm\rmshape{8}{1000}
-\setfont\smallertt\ttshape{8}{1000}
-\setfont\smallerbf\bfshape{10}{800}
-\setfont\smallerit\itshape{8}{1000}
-\setfont\smallersl\slshape{8}{1000}
-\setfont\smallersf\sfshape{8}{1000}
-\setfont\smallersc\scshape{10}{800}
-\setfont\smallerttsl\ttslshape{10}{800}
-\font\smalleri=cmmi8
-\font\smallersy=cmsy8
-
-% Fonts for title page (20.4pt):
-\def\titlenominalsize{20pt}
-\setfont\titlerm\rmbshape{12}{\magstep3}
-\setfont\titleit\itbshape{10}{\magstep4}
-\setfont\titlesl\slbshape{10}{\magstep4}
-\setfont\titlett\ttbshape{12}{\magstep3}
-\setfont\titlettsl\ttslshape{10}{\magstep4}
-\setfont\titlesf\sfbshape{17}{\magstep1}
-\let\titlebf=\titlerm
-\setfont\titlesc\scbshape{10}{\magstep4}
-\font\titlei=cmmi12 scaled \magstep3
-\font\titlesy=cmsy10 scaled \magstep4
-\def\authorrm{\secrm}
-\def\authortt{\sectt}
-
-% Chapter (and unnumbered) fonts (17.28pt).
-\def\chapnominalsize{17pt}
-\setfont\chaprm\rmbshape{12}{\magstep2}
-\setfont\chapit\itbshape{10}{\magstep3}
-\setfont\chapsl\slbshape{10}{\magstep3}
-\setfont\chaptt\ttbshape{12}{\magstep2}
-\setfont\chapttsl\ttslshape{10}{\magstep3}
-\setfont\chapsf\sfbshape{17}{1000}
-\let\chapbf=\chaprm
-\setfont\chapsc\scbshape{10}{\magstep3}
-\font\chapi=cmmi12 scaled \magstep2
-\font\chapsy=cmsy10 scaled \magstep3
-
-% Section fonts (14.4pt).
-\def\secnominalsize{14pt}
-\setfont\secrm\rmbshape{12}{\magstep1}
-\setfont\secit\itbshape{10}{\magstep2}
-\setfont\secsl\slbshape{10}{\magstep2}
-\setfont\sectt\ttbshape{12}{\magstep1}
-\setfont\secttsl\ttslshape{10}{\magstep2}
-\setfont\secsf\sfbshape{12}{\magstep1}
-\let\secbf\secrm
-\setfont\secsc\scbshape{10}{\magstep2}
-\font\seci=cmmi12 scaled \magstep1
-\font\secsy=cmsy10 scaled \magstep2
-
-% Subsection fonts (13.15pt).
-\def\ssecnominalsize{13pt}
-\setfont\ssecrm\rmbshape{12}{\magstephalf}
-\setfont\ssecit\itbshape{10}{1315}
-\setfont\ssecsl\slbshape{10}{1315}
-\setfont\ssectt\ttbshape{12}{\magstephalf}
-\setfont\ssecttsl\ttslshape{10}{1315}
-\setfont\ssecsf\sfbshape{12}{\magstephalf}
-\let\ssecbf\ssecrm
-\setfont\ssecsc\scbshape{10}{1315}
-\font\sseci=cmmi12 scaled \magstephalf
-\font\ssecsy=cmsy10 scaled 1315
-
-% Reduced fonts for @acro in text (10pt).
-\def\reducednominalsize{10pt}
-\setfont\reducedrm\rmshape{10}{1000}
-\setfont\reducedtt\ttshape{10}{1000}
-\setfont\reducedbf\bfshape{10}{1000}
-\setfont\reducedit\itshape{10}{1000}
-\setfont\reducedsl\slshape{10}{1000}
-\setfont\reducedsf\sfshape{10}{1000}
-\setfont\reducedsc\scshape{10}{1000}
-\setfont\reducedttsl\ttslshape{10}{1000}
-\font\reducedi=cmmi10
-\font\reducedsy=cmsy10
-
-% 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.
-%
-\textfonts \rm
-
-% 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}
-\setfont\shortcontbf\bfshape{10}{\magstep1}  % no cmb12
-\setfont\shortcontsl\slshape{12}{1000}
-\setfont\shortconttt\ttshape{12}{1000}
-
-%% 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}
-\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}}}}
-% 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
-  %
-  \global\def\code{\begingroup
-    \catcode`\-=\active  \catcode`\_=\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
-
-% @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
-}
-
-% @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}}%
-    }$%
-}
-
-% 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
-
-
-\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 -\baselineskip
-  \global\advance\vsize by -\baselineskip
-}
-
-\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
-
-
-% @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:
-  \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', which must be on a line
-    % by itself.
-    \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.
-    \obeylines %
-    \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.
-\def\enddoignore{\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
-  %
-  % 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
-}
-
-% 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\expansion
-  \definedummyword\minus
-  \definedummyword\pounds
-  \definedummyword\point
-  \definedummyword\print
-  \definedummyword\result
-  %
-  % 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.
-%
-% Better have this without active chars.
-{
-  \catcode`\~=\other
-  \gdef\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\samp
-    \definedummyword\strong
-    \definedummyword\tie
-    \definedummyword\uref
-    \definedummyword\url
-    \definedummyword\var
-    \definedummyword\verb
-    \definedummyword\w
-  }
-}
-
-% \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\expansion{==>}%
-  \def\minus{-}%
-  \def\pounds{pounds}%
-  \def\point{.}%
-  \def\print{-|}%
-  \def\result{=>}%
-  %
-  % 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}%
-    %
-    \ifvmode
-      \dosubindsanitize
-    \else
-      \dosubindwrite
-    \fi
-  }%
-  \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:
-%
-% 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 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}
-%
-% ..., ready, GO:
-%
-\def\dosubindsanitize{%
-  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
-  \skip0 = \lastskip
-  \edef\lastskipmacro{\the\lastskip}%
-  \count255 = \lastpenalty
-  %
-  % If \lastskip is nonzero, that means the last item was a
-  % skip.  And since a skip is discardable, that means this
-  % -\skip0 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-\skip0
-  \fi
-  %
-  \dosubindwrite
-  %
-  \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\count255>9999 \penalty\count255 \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\skip0
-  \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
-  \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 frozes 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.
-    \def\tempa{{\rm }}%
-    \def\tempb{#1}%
-    \edef\tempc{\tempa}%
-    \edef\tempd{\tempb}%
-    \ifx\tempc\tempd
-      \ %
-    \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 \dotfill except takes at least 1 em.
-\def\indexdotfill{\cleaders
-  \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \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{%
-  \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 this as the name of the chapter.
-% page headings and footings can use it.  @section does likewise.
-% However, they are not reliable, because we don't use marks.
-\def\thischapter{}
-\def\thissection{}
-
-\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}
-\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\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{%
-  \pchapsepmacro
-  {%
-    \chapfonts \rm
-    %
-    % Have to define \thissection 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\thissection{#1}%
-    \gdef\thischaptername{#1}%
-    %
-    % Only insert the separating space if we have a chapter/appendix
-    % number, and don't print the unnumbered ``number''.
-    \def\temptype{#2}%
-    \ifx\temptype\Ynothingkeyword
-      \setbox0 = \hbox{}%
-      \def\toctype{unnchap}%
-      \gdef\thischapter{#1}%
-    \else\ifx\temptype\Yomitfromtockeyword
-      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
-      \def\toctype{omit}%
-      \gdef\thischapter{}%
-    \else\ifx\temptype\Yappendixkeyword
-      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
-      \def\toctype{app}%
-      % We don't substitute the actual chapter name into \thischapter
-      % because we don't want its macros evaluated now.  And we don't
-      % use \thissection because that changes with each section.
-      %
-      \xdef\thischapter{\putwordAppendix{} \appendixletter:
-                        \noexpand\thischaptername}%
-    \else
-      \setbox0 = \hbox{#3\enspace}%
-      \def\toctype{numchap}%
-      \xdef\thischapter{\putwordChapter{} \the\chapno:
-                        \noexpand\thischaptername}%
-    \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.
-    \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\sectionheading#1#2#3#4{%
-  {%
-    % Switch to the right set of fonts.
-    \csname #2fonts\endcsname \rm
-    %
-    % Insert space above the heading.
-    \csname #2headingbreak\endcsname
-    %
-    % Only insert the space after the number if we have a section number.
-    \def\sectionlevel{#2}%
-    \def\temptype{#3}%
-    %
-    \ifx\temptype\Ynothingkeyword
-      \setbox0 = \hbox{}%
-      \def\toctype{unn}%
-      \gdef\thissection{#1}%
-    \else\ifx\temptype\Yomitfromtockeyword
-      % for @headings -- no section number, don't include in toc,
-      % and don't redefine \thissection.
-      \setbox0 = \hbox{}%
-      \def\toctype{omit}%
-      \let\sectionlevel=\empty
-    \else\ifx\temptype\Yappendixkeyword
-      \setbox0 = \hbox{#4\enspace}%
-      \def\toctype{app}%
-      \gdef\thissection{#1}%
-    \else
-      \setbox0 = \hbox{#4\enspace}%
-      \def\toctype{num}%
-      \gdef\thissection{#1}%
-    \fi\fi\fi
-    %
-    % Write the toc entry (before \donoderef).  See comments in \chfplain.
-    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
-    %
-    % Write the node reference (= pdf destination for pdftex).
-    % Again, see comments in \chfplain.
-    \donoderef{#3}%
-    %
-    % 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 \jobname.toc
-}
-
-\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.
-  \def\thischapter{}%
-  \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
-}
-
-
-% Normal (long) toc.
-\def\contents{%
-  \startcontents{\putwordTOC}%
-    \openin 1 \jobname.toc
-    \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 \jobname.toc
-    \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, it should be an even number of
-% \tt widths. Each \tt character is 1en, so two makes it 1em.
-%
-\def\point{$\star$}
-\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
-\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
-\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
-\def\equiv{\leavevmode\lower.1ex\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 \tensf 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
-  \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
-    \smallexamplefonts \rm
-  \fi
-}
-\def\setsmalldispenv{%
-  \ifx\SETdispenvsize\nosmallword
-  \else
-    \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
-  \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}
-\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
-    }%
-  }
-\endgroup
-\def\setupverbatim{%
-  \let\nonarrowing = t%
-  \nonfillstart
-  % Easiest (and conventionally used) font for verbatim
-  \tt
-  \def\par{\leavevmode\egroup\box0\endgraf}%
-  \catcode`\`=\active
-  \tabexpand
-  % 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
-
-% Start the processing of @deffn:
-\def\startdefun{%
-  \ifnum\lastpenalty<10000
-    \medbreak
-  \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 \defargscommonending, 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.
-    % 
-    \ifnum\lastpenalty=10002 \penalty2000 \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 \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 10002  % 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 remainnig 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
-}
-\def\badparencount{%
-  \errmessage{Unbalanced parentheses in @def}%
-  \global\parencount=0
-}
-\def\badbrackcount{%
-  \errmessage{Unbalanced square braces 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 \.
-
-% 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
-}
-
-\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\next=#1\futurelet\nchar\braceorlinexxx}
-\def\braceorlinexxx{%
-  \ifx\nchar\bgroup\else
-    \expandafter\parsearg
-  \fi \next}
-
-
-% @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 \thissection,
-%                 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{\thissection}%
-      \immediate \writexrdef{title}{\the\toks0 }%
-      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
-      \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
-    \leavevmode
-    \getfilename{#4}%
-    {\turnoffactive
-     % See comments at \activebackslashdouble.
-     {\activebackslashdouble \xdef\pdfxrefdest{#1}%
-      \backslashparens\pdfxrefdest}%
-     %
-     \ifnum\filenamelength>0
-       \startlink attr{/Border [0 0 0]}%
-         goto file{\the\filename.pdf} name{\pdfxrefdest}%
-     \else
-       \startlink attr{/Border [0 0 0]}%
-         goto name{\pdfmkpgn{\pdfxrefdest}}%
-     \fi
-    }%
-    \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{%
-  \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value.
-  %
-  % Was that xref control sequence that we just defined for a float?
-  \expandafter\iffloat\csname XR#1\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{#1}}%
-  \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.
-% Similarily, 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\bigskip
-    % 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
-    \line\bgroup\hss
-  \fi
-  %
-  % 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 \hss \egroup \bigbreak \fi  % space after the 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 \thissection 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\thissection{\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 float, 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
-% \thissection 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,}
-% and i18n.
-
-% @documentlanguage is usually given very early, just after
-% @setfilename.  If done too late, it may not override everything
-% properly.  Single argument is the language abbreviation.
-% It would be nice if we could set up a hyphenation file here.
-%
-\parseargdef\documentlanguage{%
-  \tex % read txi-??.tex file in plain TeX.
-    % Read the file if it exists.
-    \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
-  \endgroup
-}
-\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.}
-
-
-% @documentencoding should change something in TeX eventually, most
-% likely, but for now just recognize it.
-\let\documentencoding = \comment
-
-
-% Page size parameters.
-%
-\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, just 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
-  \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{46\baselineskip}{6in}%
-                    {\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}%
-                    {\voffset}{.25in}%
-                    {\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{51\baselineskip}{160mm}
-                    {\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
-  \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}
-
-\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
-
-% \rawbackslash defines an active \ to do \backslashcurfont.
-% \otherbackslash defines an active \ to be a literal `\' character with
-% catcode other.
-{\catcode`\\=\active
- @gdef@rawbackslash{@let\=@backslashcurfont}
- @gdef@otherbackslash{@let\=@realbackslash}
-}
-
-% \realbackslash is an actual character `\' with catcode other, and
-% \doublebackslash is two of them (for the pdf outlines).
-{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
-
-% \normalbackslash outputs one backslash in fixed width font.
-\def\normalbackslash{{\tt\backslashcurfont}}
-
-\catcode`\\=\active
-
-% Used sometimes to turn off (effectively) the active characters
-% even after parsing them.
-@def@turnoffactive{%
-  @let"=@normaldoublequote
-  @let\=@realbackslash
-  @let~=@normaltilde
-  @let^=@normalcaret
-  @let_=@normalunderscore
-  @let|=@normalverticalbar
-  @let<=@normalless
-  @let>=@normalgreater
-  @let+=@normalplus
-  @let$=@normaldollar %$ font-lock fix
-  @unsepspaces
-}
-
-% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
-% the literal character `\'.  (Thus, \ is not expandable when this is in
-% effect.)
-%
-@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
-
-% 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/build-aux/ylwrap b/build-aux/ylwrap
deleted file mode 100755
index 102bd89..0000000
--- a/build-aux/ylwrap
+++ /dev/null
@@ -1,223 +0,0 @@
-#! /bin/sh
-# ylwrap - wrapper for lex/yacc invocations.
-
-scriptversion=2005-05-14.22
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005
-#   Free Software Foundation, Inc.
-#
-# Written by Tom Tromey <tromey@cygnus.com>.
-#
-# 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.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-case "$1" in
-  '')
-    echo "$0: No files given.  Try \`$0 --help' for more information." 1>&2
-    exit 1
-    ;;
-  --basedir)
-    basedir=$2
-    shift 2
-    ;;
-  -h|--h*)
-    cat <<\EOF
-Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
-
-Wrapper for lex/yacc invocations, renaming files as desired.
-
-  INPUT is the input file
-  OUTPUT is one file PROG generates
-  DESIRED is the file we actually want instead of OUTPUT
-  PROGRAM is program to run
-  ARGS are passed to PROG
-
-Any number of OUTPUT,DESIRED pairs may be used.
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v|--v*)
-    echo "ylwrap $scriptversion"
-    exit $?
-    ;;
-esac
-
-
-# The input.
-input="$1"
-shift
-case "$input" in
-  [\\/]* | ?:[\\/]*)
-    # Absolute path; do nothing.
-    ;;
-  *)
-    # Relative path.  Make it absolute.
-    input="`pwd`/$input"
-    ;;
-esac
-
-pairlist=
-while test "$#" -ne 0; do
-  if test "$1" = "--"; then
-    shift
-    break
-  fi
-  pairlist="$pairlist $1"
-  shift
-done
-
-# The program to run.
-prog="$1"
-shift
-# Make any relative path in $prog absolute.
-case "$prog" in
-  [\\/]* | ?:[\\/]*) ;;
-  *[\\/]*) prog="`pwd`/$prog" ;;
-esac
-
-# FIXME: add hostname here for parallel makes that run commands on
-# other machines.  But that might take us over the 14-char limit.
-dirname=ylwrap$$
-trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15
-mkdir $dirname || exit 1
-
-cd $dirname
-
-case $# in
-  0) $prog "$input" ;;
-  *) $prog "$@" "$input" ;;
-esac
-ret=$?
-
-if test $ret -eq 0; then
-  set X $pairlist
-  shift
-  first=yes
-  # Since DOS filename conventions don't allow two dots,
-  # the DOS version of Bison writes out y_tab.c instead of y.tab.c
-  # and y_tab.h instead of y.tab.h. Test to see if this is the case.
-  y_tab_nodot="no"
-  if test -f y_tab.c || test -f y_tab.h; then
-    y_tab_nodot="yes"
-  fi
-
-  # The directory holding the input.
-  input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'`
-  # Quote $INPUT_DIR so we can use it in a regexp.
-  # FIXME: really we should care about more than `.' and `\'.
-  input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'`
-
-  while test "$#" -ne 0; do
-    from="$1"
-    # Handle y_tab.c and y_tab.h output by DOS
-    if test $y_tab_nodot = "yes"; then
-      if test $from = "y.tab.c"; then
-    	from="y_tab.c"
-      else
-    	if test $from = "y.tab.h"; then
-    	  from="y_tab.h"
-    	fi
-      fi
-    fi
-    if test -f "$from"; then
-      # If $2 is an absolute path name, then just use that,
-      # otherwise prepend `../'.
-      case "$2" in
-    	[\\/]* | ?:[\\/]*) target="$2";;
-    	*) target="../$2";;
-      esac
-
-      # We do not want to overwrite a header file if it hasn't
-      # changed.  This avoid useless recompilations.  However the
-      # parser itself (the first file) should always be updated,
-      # because it is the destination of the .y.c rule in the
-      # Makefile.  Divert the output of all other files to a temporary
-      # file so we can compare them to existing versions.
-      if test $first = no; then
-	realtarget="$target"
-	target="tmp-`echo $target | sed s/.*[\\/]//g`"
-      fi
-      # Edit out `#line' or `#' directives.
-      #
-      # We don't want the resulting debug information to point at
-      # an absolute srcdir; it is better for it to just mention the
-      # .y file with no path.
-      #
-      # We want to use the real output file name, not yy.lex.c for
-      # instance.
-      #
-      # We want the include guards to be adjusted too.
-      FROM=`echo "$from" | sed \
-            -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
-            -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
-      TARGET=`echo "$2" | sed \
-            -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
-            -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
-
-      sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \
-          -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$?
-
-      # Check whether header files must be updated.
-      if test $first = no; then
-	if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
-	  echo "$2" is unchanged
-	  rm -f "$target"
-	else
-          echo updating "$2"
-          mv -f "$target" "$realtarget"
-        fi
-      fi
-    else
-      # A missing file is only an error for the first file.  This
-      # is a blatant hack to let us support using "yacc -d".  If -d
-      # is not specified, we don't want an error when the header
-      # file is "missing".
-      if test $first = yes; then
-        ret=1
-      fi
-    fi
-    shift
-    shift
-    first=no
-  done
-else
-  ret=$?
-fi
-
-# Remove the directory.
-cd ..
-rm -rf $dirname
-
-exit $ret
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/config.h b/config.h
deleted file mode 100644
index ebd4aeb..0000000
--- a/config.h
+++ /dev/null
@@ -1,414 +0,0 @@
-/* config.h.  Generated by configure.  */
-/* config.hin.  Generated from configure.ac by autoheader.  */
-
-/* Define to 1 if translation of program messages to the user's native
-   language is requested. */
-#define ENABLE_NLS 1
-
-/* Define on systems for which file names may have a so-called `drive letter'
-   prefix, define this to compute the length of that prefix, including the
-   colon. */
-#define FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX 0
-
-/* Define if the backslash character may also serve as a file name component
-   separator. */
-#define FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR 0
-
-#if FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX
-# define FILE_SYSTEM_PREFIX_LEN(Filename) \
-  ((Filename)[0] && (Filename)[1] == ':' ? 2 : 0)
-#else
-# define FILE_SYSTEM_PREFIX_LEN(Filename) 0
-#endif
-
-/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the
-   CoreFoundation framework. */
-/* #undef HAVE_CFLOCALECOPYCURRENT */
-
-/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in
-   the CoreFoundation framework. */
-/* #undef HAVE_CFPREFERENCESCOPYAPPVALUE */
-
-/* Define to 1 if the system has the type `clock_t'. */
-#define HAVE_CLOCK_T 1
-
-/* Define if the GNU dcgettext() function is already present or preinstalled.
-   */
-#define HAVE_DCGETTEXT 1
-
-/* Define to 1 if you have the declaration of `clearerr_unlocked', and to 0 if
-   you don't. */
-#define HAVE_DECL_CLEARERR_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `clock', and to 0 if you don't.
-   */
-#define HAVE_DECL_CLOCK 0
-
-/* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you
-   don't. */
-#define HAVE_DECL_FEOF_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `ferror_unlocked', and to 0 if
-   you don't. */
-#define HAVE_DECL_FERROR_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `fflush_unlocked', and to 0 if
-   you don't. */
-#define HAVE_DECL_FFLUSH_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if
-   you don't. */
-#define HAVE_DECL_FGETS_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `fputc_unlocked', and to 0 if
-   you don't. */
-#define HAVE_DECL_FPUTC_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `fputs_unlocked', and to 0 if
-   you don't. */
-#define HAVE_DECL_FPUTS_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `fread_unlocked', and to 0 if
-   you don't. */
-#define HAVE_DECL_FREAD_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `fwrite_unlocked', and to 0 if
-   you don't. */
-#define HAVE_DECL_FWRITE_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if
-   you don't. */
-#define HAVE_DECL_GETCHAR_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you
-   don't. */
-#define HAVE_DECL_GETC_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
-   */
-#define HAVE_DECL_GETENV 1
-
-/* Define to 1 if you have the declaration of `getrusage', and to 0 if you
-   don't. */
-#define HAVE_DECL_GETRUSAGE 1
-
-/* Define to 1 if you have a declaration of mbswidth() in <wchar.h>, and to 0
-   otherwise. */
-#define HAVE_DECL_MBSWIDTH_IN_WCHAR_H 0
-
-/* Define to 1 if you have the declaration of `putchar_unlocked', and to 0 if
-   you don't. */
-#define HAVE_DECL_PUTCHAR_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `putc_unlocked', and to 0 if you
-   don't. */
-#define HAVE_DECL_PUTC_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `strdup', and to 0 if you don't.
-   */
-#define HAVE_DECL_STRDUP 1
-
-/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
-   don't. */
-#define HAVE_DECL_STRERROR_R 1
-
-/* Define to 1 if you have the declaration of `strndup', and to 0 if you
-   don't. */
-#define HAVE_DECL_STRNDUP 1
-
-/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
-   don't. */
-#define HAVE_DECL_STRNLEN 1
-
-/* Define to 1 if you have the declaration of `sysconf', and to 0 if you
-   don't. */
-#define HAVE_DECL_SYSCONF 1
-
-/* Define to 1 if you have the declaration of `times', and to 0 if you don't.
-   */
-#define HAVE_DECL_TIMES 1
-
-/* Define to 1 if you have the declaration of wcwidth(), and to 0 otherwise.
-   */
-#define HAVE_DECL_WCWIDTH 1
-
-/* Define to 1 if you have the `dup2' function. */
-#define HAVE_DUP2 1
-
-/* Define to 1 if you have the `fork' function. */
-#define HAVE_FORK 1
-
-/* Define to 1 if you have the <getopt.h> header file. */
-#define HAVE_GETOPT_H 1
-
-/* Define to 1 if you have the `getopt_long_only' function. */
-#define HAVE_GETOPT_LONG_ONLY 1
-
-/* Define if the GNU gettext() function is already present or preinstalled. */
-#define HAVE_GETTEXT 1
-
-/* Define if you have the iconv() function. */
-/* #undef HAVE_ICONV */
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define if <inttypes.h> exists, doesn't clash with <sys/types.h>, and
-   declares uintmax_t. */
-#define HAVE_INTTYPES_H_WITH_UINTMAX 1
-
-/* Define to 1 if you have the `isascii' function. */
-#define HAVE_ISASCII 1
-
-/* Define to 1 if you have the `iswcntrl' function. */
-#define HAVE_ISWCNTRL 1
-
-/* Define to 1 if you have the `iswprint' function. */
-#define HAVE_ISWPRINT 1
-
-/* Define to 1 if you have the <locale.h> header file. */
-#define HAVE_LOCALE_H 1
-
-/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
-   to 0 otherwise. */
-#define HAVE_MALLOC 1
-
-/* Define to 1 if mbrtowc and mbstate_t are properly declared. */
-#define HAVE_MBRTOWC 1
-
-/* Define to 1 if you have the `mbsinit' function. */
-#define HAVE_MBSINIT 1
-
-/* Define to 1 if <wchar.h> declares mbstate_t. */
-#define HAVE_MBSTATE_T 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if libc includes obstacks. */
-#define HAVE_OBSTACK 1
-
-/* Define to 1 if you have the `setlocale' function. */
-#define HAVE_SETLOCALE 1
-
-/* Define to 1 if stdbool.h conforms to C99. */
-#define HAVE_STDBOOL_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define if <stdint.h> exists, doesn't clash with <sys/types.h>, and declares
-   uintmax_t. */
-#define HAVE_STDINT_H_WITH_UINTMAX 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the `stpcpy' function. */
-#define HAVE_STPCPY 1
-
-/* Define to 1 if you have the `strdup' function. */
-#define HAVE_STRDUP 1
-
-/* Define to 1 if you have the `strerror' function. */
-#define HAVE_STRERROR 1
-
-/* Define to 1 if you have the `strerror_r' function. */
-#define HAVE_STRERROR_R 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define if you have the strndup() function and it works. */
-#define HAVE_STRNDUP 1
-
-/* Define to 1 if you have the `strtol' function. */
-#define HAVE_STRTOL 1
-
-/* Define to 1 if you have the `strtoul' function. */
-#define HAVE_STRTOUL 1
-
-/* Define to 1 if the system has the type `struct tms'. */
-#define HAVE_STRUCT_TMS 1
-
-/* Define to 1 if you have the `strverscmp' function. */
-#define HAVE_STRVERSCMP 1
-
-/* Define to 1 if you have the <sys/resource.h> header file. */
-#define HAVE_SYS_RESOURCE_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/times.h> header file. */
-#define HAVE_SYS_TIMES_H 1
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#define HAVE_SYS_TIME_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
-#define HAVE_SYS_WAIT_H 1
-
-/* Define to 1 if you have the `times' function. */
-#define HAVE_TIMES 1
-
-/* Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>. */
-#define HAVE_UINTMAX_T 1
-
-/* Define to 1 if the system has the type `uintptr_t'. */
-#define HAVE_UINTPTR_T 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define if you have the 'unsigned long long' type. */
-#define HAVE_UNSIGNED_LONG_LONG 1
-
-/* Define to 1 if you have the `vfork' function. */
-#define HAVE_VFORK 1
-
-/* Define to 1 if you have the <vfork.h> header file. */
-/* #undef HAVE_VFORK_H */
-
-/* Define to 1 if you have the `waitpid' function. */
-#define HAVE_WAITPID 1
-
-/* Define to 1 if you have the <wchar.h> header file. */
-#define HAVE_WCHAR_H 1
-
-/* Define to 1 if you have the <wctype.h> header file. */
-#define HAVE_WCTYPE_H 1
-
-/* Define to 1 if you have the `wcwidth' function. */
-#define HAVE_WCWIDTH 1
-
-/* Define to 1 if `fork' works. */
-#define HAVE_WORKING_FORK 1
-
-/* Define to 1 if `vfork' works. */
-#define HAVE_WORKING_VFORK 1
-
-/* Define to 1 if the system has the type `_Bool'. */
-#define HAVE__BOOL 1
-
-#if FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR
-# define ISSLASH(C) ((C) == '/' || (C) == '\\')
-#else
-# define ISSLASH(C) ((C) == '/')
-#endif
-
-/* Define to the GNU M4 executable name. */
-#define M4 "/usr/bin/m4"
-
-/* Name of package */
-#define PACKAGE "bison"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "GNU Bison"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GNU Bison 2.3"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "bison"
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "2.3"
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to 1 if strerror_r returns char *. */
-#define STRERROR_R_CHAR_P 1
-
-/* Define to 1 if you want getc etc. to use unlocked I/O if available.
-   Unlocked I/O can improve performance in unithreaded apps, but it is not
-   safe for multithreaded apps. */
-#define USE_UNLOCKED_IO 1
-
-/* Version number of package */
-#define VERSION "2.3"
-
-/* Define if using the dmalloc debugging malloc package */
-/* #undef WITH_DMALLOC */
-
-/* Define to 1 to internationalize bison runtime messages. */
-#define YYENABLE_NLS 1
-
-/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a
-   `char[]'. */
-#define YYTEXT_POINTER 1
-
-/* Define to 1 if on AIX 3.
-   System headers sometimes define this.
-   We just want to avoid a redefinition error message.  */
-#ifndef _ALL_SOURCE
-/* # undef _ALL_SOURCE */
-#endif
-
-/* Enable GNU extensions on systems that have them.  */
-#ifndef _GNU_SOURCE
-# define _GNU_SOURCE 1
-#endif
-
-/* Define to 1 if on MINIX. */
-/* #undef _MINIX */
-
-/* Define to 2 if the system does not provide POSIX.1 features except with
-   this defined. */
-/* #undef _POSIX_1_SOURCE */
-
-/* Define to 1 if you need to in order for `stat' and other things to work. */
-/* #undef _POSIX_SOURCE */
-
-/* Enable extensions on Solaris.  */
-#ifndef __EXTENSIONS__
-# define __EXTENSIONS__ 1
-#endif
-#ifndef _POSIX_PTHREAD_SEMANTICS
-# define _POSIX_PTHREAD_SEMANTICS 1
-#endif
-
-/* Define to rpl_ if the getopt replacement functions and variables should be
-   used. */
-/* #undef __GETOPT_PREFIX */
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
-   calls it, or to nothing if 'inline' is not supported under any name.  */
-#ifndef __cplusplus
-/* #undef inline */
-#endif
-
-/* Define to 1 if the compiler is checking for lint. */
-/* #undef lint */
-
-/* Define to rpl_malloc if the replacement function should be used. */
-/* #undef malloc */
-
-/* Define to a type if <wchar.h> does not define. */
-/* #undef mbstate_t */
-
-/* Define to `int' if <sys/types.h> does not define. */
-/* #undef pid_t */
-
-/* Define to rpl_strndup if the replacement function should be used, */
-/* #undef strndup */
-
-/* Define to rpl_strnlen if the replacement function should be used. */
-/* #undef strnlen */
-
-/* Define to unsigned long or unsigned long long if <stdint.h> and
-   <inttypes.h> don't define. */
-/* #undef uintmax_t */
-
-/* Define as `fork' if `vfork' does not work. */
-/* #undef vfork */
diff --git a/config.hin b/config.hin
deleted file mode 100644
index ff0c48b..0000000
--- a/config.hin
+++ /dev/null
@@ -1,413 +0,0 @@
-/* config.hin.  Generated from configure.ac by autoheader.  */
-
-/* Define to 1 if translation of program messages to the user's native
-   language is requested. */
-#undef ENABLE_NLS
-
-/* Define on systems for which file names may have a so-called `drive letter'
-   prefix, define this to compute the length of that prefix, including the
-   colon. */
-#undef FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX
-
-/* Define if the backslash character may also serve as a file name component
-   separator. */
-#undef FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR
-
-#if FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX
-# define FILE_SYSTEM_PREFIX_LEN(Filename) \
-  ((Filename)[0] && (Filename)[1] == ':' ? 2 : 0)
-#else
-# define FILE_SYSTEM_PREFIX_LEN(Filename) 0
-#endif
-
-/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the
-   CoreFoundation framework. */
-#undef HAVE_CFLOCALECOPYCURRENT
-
-/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in
-   the CoreFoundation framework. */
-#undef HAVE_CFPREFERENCESCOPYAPPVALUE
-
-/* Define to 1 if the system has the type `clock_t'. */
-#undef HAVE_CLOCK_T
-
-/* Define if the GNU dcgettext() function is already present or preinstalled.
-   */
-#undef HAVE_DCGETTEXT
-
-/* Define to 1 if you have the declaration of `clearerr_unlocked', and to 0 if
-   you don't. */
-#undef HAVE_DECL_CLEARERR_UNLOCKED
-
-/* Define to 1 if you have the declaration of `clock', and to 0 if you don't.
-   */
-#undef HAVE_DECL_CLOCK
-
-/* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you
-   don't. */
-#undef HAVE_DECL_FEOF_UNLOCKED
-
-/* Define to 1 if you have the declaration of `ferror_unlocked', and to 0 if
-   you don't. */
-#undef HAVE_DECL_FERROR_UNLOCKED
-
-/* Define to 1 if you have the declaration of `fflush_unlocked', and to 0 if
-   you don't. */
-#undef HAVE_DECL_FFLUSH_UNLOCKED
-
-/* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if
-   you don't. */
-#undef HAVE_DECL_FGETS_UNLOCKED
-
-/* Define to 1 if you have the declaration of `fputc_unlocked', and to 0 if
-   you don't. */
-#undef HAVE_DECL_FPUTC_UNLOCKED
-
-/* Define to 1 if you have the declaration of `fputs_unlocked', and to 0 if
-   you don't. */
-#undef HAVE_DECL_FPUTS_UNLOCKED
-
-/* Define to 1 if you have the declaration of `fread_unlocked', and to 0 if
-   you don't. */
-#undef HAVE_DECL_FREAD_UNLOCKED
-
-/* Define to 1 if you have the declaration of `fwrite_unlocked', and to 0 if
-   you don't. */
-#undef HAVE_DECL_FWRITE_UNLOCKED
-
-/* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if
-   you don't. */
-#undef HAVE_DECL_GETCHAR_UNLOCKED
-
-/* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you
-   don't. */
-#undef HAVE_DECL_GETC_UNLOCKED
-
-/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
-   */
-#undef HAVE_DECL_GETENV
-
-/* Define to 1 if you have the declaration of `getrusage', and to 0 if you
-   don't. */
-#undef HAVE_DECL_GETRUSAGE
-
-/* Define to 1 if you have a declaration of mbswidth() in <wchar.h>, and to 0
-   otherwise. */
-#undef HAVE_DECL_MBSWIDTH_IN_WCHAR_H
-
-/* Define to 1 if you have the declaration of `putchar_unlocked', and to 0 if
-   you don't. */
-#undef HAVE_DECL_PUTCHAR_UNLOCKED
-
-/* Define to 1 if you have the declaration of `putc_unlocked', and to 0 if you
-   don't. */
-#undef HAVE_DECL_PUTC_UNLOCKED
-
-/* Define to 1 if you have the declaration of `strdup', and to 0 if you don't.
-   */
-#undef HAVE_DECL_STRDUP
-
-/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
-   don't. */
-#undef HAVE_DECL_STRERROR_R
-
-/* Define to 1 if you have the declaration of `strndup', and to 0 if you
-   don't. */
-#undef HAVE_DECL_STRNDUP
-
-/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
-   don't. */
-#undef HAVE_DECL_STRNLEN
-
-/* Define to 1 if you have the declaration of `sysconf', and to 0 if you
-   don't. */
-#undef HAVE_DECL_SYSCONF
-
-/* Define to 1 if you have the declaration of `times', and to 0 if you don't.
-   */
-#undef HAVE_DECL_TIMES
-
-/* Define to 1 if you have the declaration of wcwidth(), and to 0 otherwise.
-   */
-#undef HAVE_DECL_WCWIDTH
-
-/* Define to 1 if you have the `dup2' function. */
-#undef HAVE_DUP2
-
-/* Define to 1 if you have the `fork' function. */
-#undef HAVE_FORK
-
-/* Define to 1 if you have the <getopt.h> header file. */
-#undef HAVE_GETOPT_H
-
-/* Define to 1 if you have the `getopt_long_only' function. */
-#undef HAVE_GETOPT_LONG_ONLY
-
-/* Define if the GNU gettext() function is already present or preinstalled. */
-#undef HAVE_GETTEXT
-
-/* Define if you have the iconv() function. */
-#undef HAVE_ICONV
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define if <inttypes.h> exists, doesn't clash with <sys/types.h>, and
-   declares uintmax_t. */
-#undef HAVE_INTTYPES_H_WITH_UINTMAX
-
-/* Define to 1 if you have the `isascii' function. */
-#undef HAVE_ISASCII
-
-/* Define to 1 if you have the `iswcntrl' function. */
-#undef HAVE_ISWCNTRL
-
-/* Define to 1 if you have the `iswprint' function. */
-#undef HAVE_ISWPRINT
-
-/* Define to 1 if you have the <locale.h> header file. */
-#undef HAVE_LOCALE_H
-
-/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
-   to 0 otherwise. */
-#undef HAVE_MALLOC
-
-/* Define to 1 if mbrtowc and mbstate_t are properly declared. */
-#undef HAVE_MBRTOWC
-
-/* Define to 1 if you have the `mbsinit' function. */
-#undef HAVE_MBSINIT
-
-/* Define to 1 if <wchar.h> declares mbstate_t. */
-#undef HAVE_MBSTATE_T
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if libc includes obstacks. */
-#undef HAVE_OBSTACK
-
-/* Define to 1 if you have the `setlocale' function. */
-#undef HAVE_SETLOCALE
-
-/* Define to 1 if stdbool.h conforms to C99. */
-#undef HAVE_STDBOOL_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define if <stdint.h> exists, doesn't clash with <sys/types.h>, and declares
-   uintmax_t. */
-#undef HAVE_STDINT_H_WITH_UINTMAX
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the `stpcpy' function. */
-#undef HAVE_STPCPY
-
-/* Define to 1 if you have the `strdup' function. */
-#undef HAVE_STRDUP
-
-/* Define to 1 if you have the `strerror' function. */
-#undef HAVE_STRERROR
-
-/* Define to 1 if you have the `strerror_r' function. */
-#undef HAVE_STRERROR_R
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define if you have the strndup() function and it works. */
-#undef HAVE_STRNDUP
-
-/* Define to 1 if you have the `strtol' function. */
-#undef HAVE_STRTOL
-
-/* Define to 1 if you have the `strtoul' function. */
-#undef HAVE_STRTOUL
-
-/* Define to 1 if the system has the type `struct tms'. */
-#undef HAVE_STRUCT_TMS
-
-/* Define to 1 if you have the `strverscmp' function. */
-#undef HAVE_STRVERSCMP
-
-/* Define to 1 if you have the <sys/resource.h> header file. */
-#undef HAVE_SYS_RESOURCE_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/times.h> header file. */
-#undef HAVE_SYS_TIMES_H
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#undef HAVE_SYS_TIME_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
-#undef HAVE_SYS_WAIT_H
-
-/* Define to 1 if you have the `times' function. */
-#undef HAVE_TIMES
-
-/* Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>. */
-#undef HAVE_UINTMAX_T
-
-/* Define to 1 if the system has the type `uintptr_t'. */
-#undef HAVE_UINTPTR_T
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define if you have the 'unsigned long long' type. */
-#undef HAVE_UNSIGNED_LONG_LONG
-
-/* Define to 1 if you have the `vfork' function. */
-#undef HAVE_VFORK
-
-/* Define to 1 if you have the <vfork.h> header file. */
-#undef HAVE_VFORK_H
-
-/* Define to 1 if you have the `waitpid' function. */
-#undef HAVE_WAITPID
-
-/* Define to 1 if you have the <wchar.h> header file. */
-#undef HAVE_WCHAR_H
-
-/* Define to 1 if you have the <wctype.h> header file. */
-#undef HAVE_WCTYPE_H
-
-/* Define to 1 if you have the `wcwidth' function. */
-#undef HAVE_WCWIDTH
-
-/* Define to 1 if `fork' works. */
-#undef HAVE_WORKING_FORK
-
-/* Define to 1 if `vfork' works. */
-#undef HAVE_WORKING_VFORK
-
-/* Define to 1 if the system has the type `_Bool'. */
-#undef HAVE__BOOL
-
-#if FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR
-# define ISSLASH(C) ((C) == '/' || (C) == '\\')
-#else
-# define ISSLASH(C) ((C) == '/')
-#endif
-
-/* Define to the GNU M4 executable name. */
-#undef M4
-
-/* Name of package */
-#undef PACKAGE
-
-/* 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
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Define to 1 if strerror_r returns char *. */
-#undef STRERROR_R_CHAR_P
-
-/* Define to 1 if you want getc etc. to use unlocked I/O if available.
-   Unlocked I/O can improve performance in unithreaded apps, but it is not
-   safe for multithreaded apps. */
-#undef USE_UNLOCKED_IO
-
-/* Version number of package */
-#undef VERSION
-
-/* Define if using the dmalloc debugging malloc package */
-#undef WITH_DMALLOC
-
-/* Define to 1 to internationalize bison runtime messages. */
-#undef YYENABLE_NLS
-
-/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a
-   `char[]'. */
-#undef YYTEXT_POINTER
-
-/* Define to 1 if on AIX 3.
-   System headers sometimes define this.
-   We just want to avoid a redefinition error message.  */
-#ifndef _ALL_SOURCE
-# undef _ALL_SOURCE
-#endif
-
-/* Enable GNU extensions on systems that have them.  */
-#ifndef _GNU_SOURCE
-# undef _GNU_SOURCE
-#endif
-
-/* Define to 1 if on MINIX. */
-#undef _MINIX
-
-/* Define to 2 if the system does not provide POSIX.1 features except with
-   this defined. */
-#undef _POSIX_1_SOURCE
-
-/* Define to 1 if you need to in order for `stat' and other things to work. */
-#undef _POSIX_SOURCE
-
-/* Enable extensions on Solaris.  */
-#ifndef __EXTENSIONS__
-# undef __EXTENSIONS__
-#endif
-#ifndef _POSIX_PTHREAD_SEMANTICS
-# undef _POSIX_PTHREAD_SEMANTICS
-#endif
-
-/* Define to rpl_ if the getopt replacement functions and variables should be
-   used. */
-#undef __GETOPT_PREFIX
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
-   calls it, or to nothing if 'inline' is not supported under any name.  */
-#ifndef __cplusplus
-#undef inline
-#endif
-
-/* Define to 1 if the compiler is checking for lint. */
-#undef lint
-
-/* Define to rpl_malloc if the replacement function should be used. */
-#undef malloc
-
-/* Define to a type if <wchar.h> does not define. */
-#undef mbstate_t
-
-/* Define to `int' if <sys/types.h> does not define. */
-#undef pid_t
-
-/* Define to rpl_strndup if the replacement function should be used, */
-#undef strndup
-
-/* Define to rpl_strnlen if the replacement function should be used. */
-#undef strnlen
-
-/* Define to unsigned long or unsigned long long if <stdint.h> and
-   <inttypes.h> don't define. */
-#undef uintmax_t
-
-/* Define as `fork' if `vfork' does not work. */
-#undef vfork
diff --git a/config.log b/config.log
deleted file mode 100644
index 3d02da7..0000000
--- a/config.log
+++ /dev/null
@@ -1,2439 +0,0 @@
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by GNU Bison configure 2.3, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
-
-  $ ./configure --prefix /home/phanna/src/bison
-
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = phanna.cnc.corp.google.com
-uname -m = x86_64
-uname -r = 2.6.18.5-gg34workstation-mixed64-32
-uname -s = Linux
-uname -v = #1 SMP Thu May 8 01:31:23 UTC 2008
-
-/usr/bin/uname -p = unknown
-/bin/uname -X     = unknown
-
-/bin/arch              = x86_64
-/usr/bin/arch -k       = unknown
-/usr/convex/getsysinfo = unknown
-hostinfo               = unknown
-/bin/machine           = unknown
-/usr/bin/oslevel       = unknown
-/bin/universe          = unknown
-
-PATH: /usr/local/symlinks
-PATH: /usr/local/scripts
-PATH: /usr/local/sbin
-PATH: /usr/local/bin
-PATH: /usr/sbin
-PATH: /usr/bin
-PATH: /sbin
-PATH: /bin
-PATH: /usr/bin/X11
-PATH: /home/phanna/jswat-4.2/bin
-PATH: /usr/local/google/workspace/WebKit/out/host/linux-x86/bin
-PATH: /usr/local/google/workspace/WebKit/prebuilt/Linux/toolchain/arm-elf
-PATH: /usr/local/google/workspace/WebKit/tools/qtools
-PATH: /usr/local/google/workspace/WebKit/prebuilt/Linux/toolchain-eabi-4.2.1/bin
-PATH: /usr/local/google/workspace/WebKit/prebuilt/Linux/toolchain-eabi-4.2.1/bin
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-configure:1402: checking for a BSD-compatible install
-configure:1457: result: /usr/bin/install -c
-configure:1468: checking whether build environment is sane
-configure:1511: result: yes
-configure:1576: checking for gawk
-configure:1592: found /usr/bin/gawk
-configure:1602: result: gawk
-configure:1612: checking whether make sets $(MAKE)
-configure:1632: result: yes
-configure:1821: checking for style of include used by make
-configure:1849: result: GNU
-configure:1920: checking for gcc
-configure:1936: found /usr/bin/gcc
-configure:1946: result: gcc
-configure:2190: checking for C compiler version
-configure:2193: gcc --version </dev/null >&5
-gcc (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
-Copyright (C) 2006 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.
-
-configure:2196: $? = 0
-configure:2198: gcc -v </dev/null >&5
-Using built-in specs.
-Target: i486-linux-gnu
-Configured with: ../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-awt=gtk-default --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --disable-werror --with-tune=pentium4 --enable-checking=release i486-linux-gnu
-Thread model: posix
-gcc version 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
-configure:2201: $? = 0
-configure:2203: gcc -V </dev/null >&5
-gcc: '-V' option must have argument
-configure:2206: $? = 1
-configure:2229: checking for C compiler default output file name
-configure:2232: gcc    conftest.c  >&5
-configure:2235: $? = 0
-configure:2281: result: a.out
-configure:2286: checking whether the C compiler works
-configure:2292: ./a.out
-configure:2295: $? = 0
-configure:2312: result: yes
-configure:2319: checking whether we are cross compiling
-configure:2321: result: no
-configure:2324: checking for suffix of executables
-configure:2326: gcc -o conftest    conftest.c  >&5
-configure:2329: $? = 0
-configure:2354: result: 
-configure:2360: checking for suffix of object files
-configure:2381: gcc -c   conftest.c >&5
-configure:2384: $? = 0
-configure:2406: result: o
-configure:2410: checking whether we are using the GNU C compiler
-configure:2434: gcc -c   conftest.c >&5
-configure:2440: $? = 0
-configure:2443: test -z 			 || test ! -s conftest.err
-configure:2446: $? = 0
-configure:2449: test -s conftest.o
-configure:2452: $? = 0
-configure:2465: result: yes
-configure:2471: checking whether gcc accepts -g
-configure:2492: gcc -c -g  conftest.c >&5
-configure:2498: $? = 0
-configure:2501: test -z 			 || test ! -s conftest.err
-configure:2504: $? = 0
-configure:2507: test -s conftest.o
-configure:2510: $? = 0
-configure:2521: result: yes
-configure:2538: checking for gcc option to accept ANSI C
-configure:2608: gcc  -c -g -O2  conftest.c >&5
-configure:2614: $? = 0
-configure:2617: test -z 			 || test ! -s conftest.err
-configure:2620: $? = 0
-configure:2623: test -s conftest.o
-configure:2626: $? = 0
-configure:2644: result: none needed
-configure:2662: gcc -c -g -O2  conftest.c >&5
-conftest.c:2: error: syntax error before 'me'
-configure:2668: $? = 1
-configure: failed program was:
-| #ifndef __cplusplus
-|   choke me
-| #endif
-configure:2800: checking dependency style of gcc
-configure:2890: result: gcc3
-configure:2913: checking how to run the C preprocessor
-configure:2948: gcc -E  conftest.c
-configure:2954: $? = 0
-configure:2986: gcc -E  conftest.c
-conftest.c:12:28: error: ac_nonexistent.h: No such file or directory
-configure:2992: $? = 1
-configure: failed program was:
-| /* confdefs.h.  */
-| 
-| #define PACKAGE_NAME "GNU Bison"
-| #define PACKAGE_TARNAME "bison"
-| #define PACKAGE_VERSION "2.3"
-| #define PACKAGE_STRING "GNU Bison 2.3"
-| #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-| #define PACKAGE "bison"
-| #define VERSION "2.3"
-| #define _GNU_SOURCE 1
-| /* end confdefs.h.  */
-| #include <ac_nonexistent.h>
-configure:3031: result: gcc -E
-configure:3055: gcc -E  conftest.c
-configure:3061: $? = 0
-configure:3093: gcc -E  conftest.c
-conftest.c:12:28: error: ac_nonexistent.h: No such file or directory
-configure:3099: $? = 1
-configure: failed program was:
-| /* confdefs.h.  */
-| 
-| #define PACKAGE_NAME "GNU Bison"
-| #define PACKAGE_TARNAME "bison"
-| #define PACKAGE_VERSION "2.3"
-| #define PACKAGE_STRING "GNU Bison 2.3"
-| #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-| #define PACKAGE "bison"
-| #define VERSION "2.3"
-| #define _GNU_SOURCE 1
-| /* end confdefs.h.  */
-| #include <ac_nonexistent.h>
-configure:3143: checking for egrep
-configure:3153: result: grep -E
-configure:3159: checking for AIX
-configure:3181: result: no
-configure:3187: checking for ANSI C header files
-configure:3212: gcc -c -g -O2  conftest.c >&5
-configure:3218: $? = 0
-configure:3221: test -z 			 || test ! -s conftest.err
-configure:3224: $? = 0
-configure:3227: test -s conftest.o
-configure:3230: $? = 0
-configure:3319: gcc -o conftest -g -O2   conftest.c  >&5
-conftest.c: In function 'main':
-conftest.c:29: warning: incompatible implicit declaration of built-in function 'exit'
-configure:3322: $? = 0
-configure:3324: ./conftest
-configure:3327: $? = 0
-configure:3342: result: yes
-configure:3366: checking for sys/types.h
-configure:3382: gcc -c -g -O2  conftest.c >&5
-configure:3388: $? = 0
-configure:3391: test -z 			 || test ! -s conftest.err
-configure:3394: $? = 0
-configure:3397: test -s conftest.o
-configure:3400: $? = 0
-configure:3411: result: yes
-configure:3366: checking for sys/stat.h
-configure:3382: gcc -c -g -O2  conftest.c >&5
-configure:3388: $? = 0
-configure:3391: test -z 			 || test ! -s conftest.err
-configure:3394: $? = 0
-configure:3397: test -s conftest.o
-configure:3400: $? = 0
-configure:3411: result: yes
-configure:3366: checking for stdlib.h
-configure:3382: gcc -c -g -O2  conftest.c >&5
-configure:3388: $? = 0
-configure:3391: test -z 			 || test ! -s conftest.err
-configure:3394: $? = 0
-configure:3397: test -s conftest.o
-configure:3400: $? = 0
-configure:3411: result: yes
-configure:3366: checking for string.h
-configure:3382: gcc -c -g -O2  conftest.c >&5
-configure:3388: $? = 0
-configure:3391: test -z 			 || test ! -s conftest.err
-configure:3394: $? = 0
-configure:3397: test -s conftest.o
-configure:3400: $? = 0
-configure:3411: result: yes
-configure:3366: checking for memory.h
-configure:3382: gcc -c -g -O2  conftest.c >&5
-configure:3388: $? = 0
-configure:3391: test -z 			 || test ! -s conftest.err
-configure:3394: $? = 0
-configure:3397: test -s conftest.o
-configure:3400: $? = 0
-configure:3411: result: yes
-configure:3366: checking for strings.h
-configure:3382: gcc -c -g -O2  conftest.c >&5
-configure:3388: $? = 0
-configure:3391: test -z 			 || test ! -s conftest.err
-configure:3394: $? = 0
-configure:3397: test -s conftest.o
-configure:3400: $? = 0
-configure:3411: result: yes
-configure:3366: checking for inttypes.h
-configure:3382: gcc -c -g -O2  conftest.c >&5
-configure:3388: $? = 0
-configure:3391: test -z 			 || test ! -s conftest.err
-configure:3394: $? = 0
-configure:3397: test -s conftest.o
-configure:3400: $? = 0
-configure:3411: result: yes
-configure:3366: checking for stdint.h
-configure:3382: gcc -c -g -O2  conftest.c >&5
-configure:3388: $? = 0
-configure:3391: test -z 			 || test ! -s conftest.err
-configure:3394: $? = 0
-configure:3397: test -s conftest.o
-configure:3400: $? = 0
-configure:3411: result: yes
-configure:3366: checking for unistd.h
-configure:3382: gcc -c -g -O2  conftest.c >&5
-configure:3388: $? = 0
-configure:3391: test -z 			 || test ! -s conftest.err
-configure:3394: $? = 0
-configure:3397: test -s conftest.o
-configure:3400: $? = 0
-configure:3411: result: yes
-configure:3433: checking minix/config.h usability
-configure:3445: gcc -c -g -O2  conftest.c >&5
-conftest.c:56:26: error: minix/config.h: No such file or directory
-configure:3451: $? = 1
-configure: failed program was:
-| /* confdefs.h.  */
-| 
-| #define PACKAGE_NAME "GNU Bison"
-| #define PACKAGE_TARNAME "bison"
-| #define PACKAGE_VERSION "2.3"
-| #define PACKAGE_STRING "GNU Bison 2.3"
-| #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-| #define PACKAGE "bison"
-| #define VERSION "2.3"
-| #define _GNU_SOURCE 1
-| #define STDC_HEADERS 1
-| #define HAVE_SYS_TYPES_H 1
-| #define HAVE_SYS_STAT_H 1
-| #define HAVE_STDLIB_H 1
-| #define HAVE_STRING_H 1
-| #define HAVE_MEMORY_H 1
-| #define HAVE_STRINGS_H 1
-| #define HAVE_INTTYPES_H 1
-| #define HAVE_STDINT_H 1
-| #define HAVE_UNISTD_H 1
-| /* end confdefs.h.  */
-| #include <stdio.h>
-| #if HAVE_SYS_TYPES_H
-| # include <sys/types.h>
-| #endif
-| #if HAVE_SYS_STAT_H
-| # include <sys/stat.h>
-| #endif
-| #if STDC_HEADERS
-| # include <stdlib.h>
-| # include <stddef.h>
-| #else
-| # if HAVE_STDLIB_H
-| #  include <stdlib.h>
-| # endif
-| #endif
-| #if HAVE_STRING_H
-| # if !STDC_HEADERS && HAVE_MEMORY_H
-| #  include <memory.h>
-| # endif
-| # include <string.h>
-| #endif
-| #if HAVE_STRINGS_H
-| # include <strings.h>
-| #endif
-| #if HAVE_INTTYPES_H
-| # include <inttypes.h>
-| #else
-| # if HAVE_STDINT_H
-| #  include <stdint.h>
-| # endif
-| #endif
-| #if HAVE_UNISTD_H
-| # include <unistd.h>
-| #endif
-| #include <minix/config.h>
-configure:3473: result: no
-configure:3477: checking minix/config.h presence
-configure:3487: gcc -E  conftest.c
-conftest.c:22:26: error: minix/config.h: No such file or directory
-configure:3493: $? = 1
-configure: failed program was:
-| /* confdefs.h.  */
-| 
-| #define PACKAGE_NAME "GNU Bison"
-| #define PACKAGE_TARNAME "bison"
-| #define PACKAGE_VERSION "2.3"
-| #define PACKAGE_STRING "GNU Bison 2.3"
-| #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-| #define PACKAGE "bison"
-| #define VERSION "2.3"
-| #define _GNU_SOURCE 1
-| #define STDC_HEADERS 1
-| #define HAVE_SYS_TYPES_H 1
-| #define HAVE_SYS_STAT_H 1
-| #define HAVE_STDLIB_H 1
-| #define HAVE_STRING_H 1
-| #define HAVE_MEMORY_H 1
-| #define HAVE_STRINGS_H 1
-| #define HAVE_INTTYPES_H 1
-| #define HAVE_STDINT_H 1
-| #define HAVE_UNISTD_H 1
-| /* end confdefs.h.  */
-| #include <minix/config.h>
-configure:3513: result: no
-configure:3548: checking for minix/config.h
-configure:3555: result: no
-configure:3594: checking whether it is safe to define __EXTENSIONS__
-configure:3617: gcc -c -g -O2  conftest.c >&5
-configure:3623: $? = 0
-configure:3626: test -z 			 || test ! -s conftest.err
-configure:3629: $? = 0
-configure:3632: test -s conftest.o
-configure:3635: $? = 0
-configure:3646: result: yes
-configure:3706: checking for gcc
-configure:3732: result: gcc
-configure:3976: checking for C compiler version
-configure:3979: gcc --version </dev/null >&5
-gcc (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
-Copyright (C) 2006 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.
-
-configure:3982: $? = 0
-configure:3984: gcc -v </dev/null >&5
-Using built-in specs.
-Target: i486-linux-gnu
-Configured with: ../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-awt=gtk-default --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --disable-werror --with-tune=pentium4 --enable-checking=release i486-linux-gnu
-Thread model: posix
-gcc version 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
-configure:3987: $? = 0
-configure:3989: gcc -V </dev/null >&5
-gcc: '-V' option must have argument
-configure:3992: $? = 1
-configure:3995: checking whether we are using the GNU C compiler
-configure:4050: result: yes
-configure:4056: checking whether gcc accepts -g
-configure:4106: result: yes
-configure:4123: checking for gcc option to accept ANSI C
-configure:4229: result: none needed
-configure:4247: gcc -c -g -O2  conftest.c >&5
-conftest.c:2: error: syntax error before 'me'
-configure:4253: $? = 1
-configure: failed program was:
-| #ifndef __cplusplus
-|   choke me
-| #endif
-configure:4385: checking dependency style of gcc
-configure:4475: result: gcc3
-configure:4538: checking for gcc
-configure:4564: result: gcc
-configure:4808: checking for C compiler version
-configure:4811: gcc --version </dev/null >&5
-gcc (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
-Copyright (C) 2006 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.
-
-configure:4814: $? = 0
-configure:4816: gcc -v </dev/null >&5
-Using built-in specs.
-Target: i486-linux-gnu
-Configured with: ../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-awt=gtk-default --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --disable-werror --with-tune=pentium4 --enable-checking=release i486-linux-gnu
-Thread model: posix
-gcc version 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
-configure:4819: $? = 0
-configure:4821: gcc -V </dev/null >&5
-gcc: '-V' option must have argument
-configure:4824: $? = 1
-configure:4827: checking whether we are using the GNU C compiler
-configure:4882: result: yes
-configure:4888: checking whether gcc accepts -g
-configure:4938: result: yes
-configure:4955: checking for gcc option to accept ANSI C
-configure:5061: result: none needed
-configure:5079: gcc -c -g -O2  conftest.c >&5
-conftest.c:2: error: syntax error before 'me'
-configure:5085: $? = 1
-configure: failed program was:
-| #ifndef __cplusplus
-|   choke me
-| #endif
-configure:5217: checking dependency style of gcc
-configure:5307: result: gcc3
-configure:6007: gcc -c -g -O2  conftest.c >&5
-configure:6013: $? = 0
-configure:6016: test -z 			 || test ! -s conftest.err
-configure:6019: $? = 0
-configure:6022: test -s conftest.o
-configure:6025: $? = 0
-configure:6064: checking for flex
-configure:6080: found /usr/bin/flex
-configure:6090: result: flex
-configure:6103: checking for yywrap in -lfl
-configure:6133: gcc -o conftest -g -O2   conftest.c -lfl   >&5
-configure:6139: $? = 0
-configure:6142: test -z 			 || test ! -s conftest.err
-configure:6145: $? = 0
-configure:6148: test -s conftest
-configure:6151: $? = 0
-configure:6164: result: yes
-configure:6241: checking lex output file root
-configure:6252: flex conftest.l
-configure:6255: $? = 0
-configure:6267: result: lex.yy
-configure:6272: checking whether yytext is a pointer
-configure:6288: gcc -o conftest -g -O2   conftest.c  -lfl >&5
-configure:6294: $? = 0
-configure:6297: test -z 			 || test ! -s conftest.err
-configure:6300: $? = 0
-configure:6303: test -s conftest
-configure:6306: $? = 0
-configure:6320: result: yes
-configure:6335: checking for bison
-configure:6351: found /usr/bin/bison
-configure:6361: result: bison -y
-configure:6413: checking for ranlib
-configure:6429: found /usr/bin/ranlib
-configure:6440: result: ranlib
-configure:6456: checking for gm4
-configure:6489: result: no
-configure:6456: checking for gnum4
-configure:6489: result: no
-configure:6456: checking for m4
-configure:6474: found /usr/bin/m4
-configure:6486: result: /usr/bin/m4
-configure:6497: checking whether m4 supports frozen files
-configure:6509: result: yes
-configure:6541: checking locale.h usability
-configure:6553: gcc -c -g -O2  conftest.c >&5
-configure:6559: $? = 0
-configure:6562: test -z 			 || test ! -s conftest.err
-configure:6565: $? = 0
-configure:6568: test -s conftest.o
-configure:6571: $? = 0
-configure:6581: result: yes
-configure:6585: checking locale.h presence
-configure:6595: gcc -E  conftest.c
-configure:6601: $? = 0
-configure:6621: result: yes
-configure:6656: checking for locale.h
-configure:6663: result: yes
-configure:6541: checking wchar.h usability
-configure:6553: gcc -c -g -O2  conftest.c >&5
-configure:6559: $? = 0
-configure:6562: test -z 			 || test ! -s conftest.err
-configure:6565: $? = 0
-configure:6568: test -s conftest.o
-configure:6571: $? = 0
-configure:6581: result: yes
-configure:6585: checking wchar.h presence
-configure:6595: gcc -E  conftest.c
-configure:6601: $? = 0
-configure:6621: result: yes
-configure:6656: checking for wchar.h
-configure:6663: result: yes
-configure:6541: checking wctype.h usability
-configure:6553: gcc -c -g -O2  conftest.c >&5
-configure:6559: $? = 0
-configure:6562: test -z 			 || test ! -s conftest.err
-configure:6565: $? = 0
-configure:6568: test -s conftest.o
-configure:6571: $? = 0
-configure:6581: result: yes
-configure:6585: checking wctype.h presence
-configure:6595: gcc -E  conftest.c
-configure:6601: $? = 0
-configure:6621: result: yes
-configure:6656: checking for wctype.h
-configure:6663: result: yes
-configure:6688: checking for stdbool.h that conforms to C99
-configure:6776: gcc -c -g -O2  conftest.c >&5
-configure:6782: $? = 0
-configure:6785: test -z 			 || test ! -s conftest.err
-configure:6788: $? = 0
-configure:6791: test -s conftest.o
-configure:6794: $? = 0
-configure:6805: result: yes
-configure:6807: checking for _Bool
-configure:6831: gcc -c -g -O2  conftest.c >&5
-configure:6837: $? = 0
-configure:6840: test -z 			 || test ! -s conftest.err
-configure:6843: $? = 0
-configure:6846: test -s conftest.o
-configure:6849: $? = 0
-configure:6860: result: yes
-configure:6899: checking for inline
-configure:6920: gcc -c -g -O2  conftest.c >&5
-configure:6926: $? = 0
-configure:6929: test -z 			 || test ! -s conftest.err
-configure:6932: $? = 0
-configure:6935: test -s conftest.o
-configure:6938: $? = 0
-configure:6950: result: inline
-configure:6971: checking for uintptr_t
-configure:6995: gcc -c -g -O2  conftest.c >&5
-configure:7001: $? = 0
-configure:7004: test -z 			 || test ! -s conftest.err
-configure:7007: $? = 0
-configure:7010: test -s conftest.o
-configure:7013: $? = 0
-configure:7024: result: yes
-configure:7045: checking for setlocale
-configure:7102: gcc -o conftest -g -O2   conftest.c  >&5
-configure:7108: $? = 0
-configure:7111: test -z 			 || test ! -s conftest.err
-configure:7114: $? = 0
-configure:7117: test -s conftest
-configure:7120: $? = 0
-configure:7132: result: yes
-configure:7045: checking for isascii
-configure:7102: gcc -o conftest -g -O2   conftest.c  >&5
-conftest.c:57: warning: conflicting types for built-in function 'isascii'
-configure:7108: $? = 0
-configure:7111: test -z 			 || test ! -s conftest.err
-configure:7114: $? = 0
-configure:7117: test -s conftest
-configure:7120: $? = 0
-configure:7132: result: yes
-configure:7045: checking for iswprint
-configure:7102: gcc -o conftest -g -O2   conftest.c  >&5
-conftest.c:58: warning: conflicting types for built-in function 'iswprint'
-configure:7108: $? = 0
-configure:7111: test -z 			 || test ! -s conftest.err
-configure:7114: $? = 0
-configure:7117: test -s conftest
-configure:7120: $? = 0
-configure:7132: result: yes
-configure:7045: checking for mbsinit
-configure:7102: gcc -o conftest -g -O2   conftest.c  >&5
-configure:7108: $? = 0
-configure:7111: test -z 			 || test ! -s conftest.err
-configure:7114: $? = 0
-configure:7117: test -s conftest
-configure:7120: $? = 0
-configure:7132: result: yes
-configure:7154: checking if malloc debugging is wanted
-configure:7175: result: no
-configure:7180: checking for pid_t
-configure:7204: gcc -c -g -O2  conftest.c >&5
-configure:7210: $? = 0
-configure:7213: test -z 			 || test ! -s conftest.err
-configure:7216: $? = 0
-configure:7219: test -s conftest.o
-configure:7222: $? = 0
-configure:7233: result: yes
-configure:7245: checking for sys/wait.h that is POSIX.1 compatible
-configure:7276: gcc -c -g -O2  conftest.c >&5
-configure:7282: $? = 0
-configure:7285: test -z 			 || test ! -s conftest.err
-configure:7288: $? = 0
-configure:7291: test -s conftest.o
-configure:7294: $? = 0
-configure:7305: result: yes
-configure:7320: checking for dup2
-configure:7377: gcc -o conftest -g -O2   conftest.c  >&5
-configure:7383: $? = 0
-configure:7386: test -z 			 || test ! -s conftest.err
-configure:7389: $? = 0
-configure:7392: test -s conftest
-configure:7395: $? = 0
-configure:7407: result: yes
-configure:7320: checking for waitpid
-configure:7377: gcc -o conftest -g -O2   conftest.c  >&5
-configure:7383: $? = 0
-configure:7386: test -z 			 || test ! -s conftest.err
-configure:7389: $? = 0
-configure:7392: test -s conftest
-configure:7395: $? = 0
-configure:7407: result: yes
-configure:7423: checking for unistd.h
-configure:7428: result: yes
-configure:7432: checking vfork.h usability
-configure:7444: gcc -c -g -O2  conftest.c >&5
-conftest.c:74:19: error: vfork.h: No such file or directory
-configure:7450: $? = 1
-configure: failed program was:
-| /* confdefs.h.  */
-| 
-| #define PACKAGE_NAME "GNU Bison"
-| #define PACKAGE_TARNAME "bison"
-| #define PACKAGE_VERSION "2.3"
-| #define PACKAGE_STRING "GNU Bison 2.3"
-| #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-| #define PACKAGE "bison"
-| #define VERSION "2.3"
-| #define _GNU_SOURCE 1
-| #define STDC_HEADERS 1
-| #define HAVE_SYS_TYPES_H 1
-| #define HAVE_SYS_STAT_H 1
-| #define HAVE_STDLIB_H 1
-| #define HAVE_STRING_H 1
-| #define HAVE_MEMORY_H 1
-| #define HAVE_STRINGS_H 1
-| #define HAVE_INTTYPES_H 1
-| #define HAVE_STDINT_H 1
-| #define HAVE_UNISTD_H 1
-| #define __EXTENSIONS__ 1
-| #define _POSIX_PTHREAD_SEMANTICS 1
-| #define YYTEXT_POINTER 1
-| #define M4 "/usr/bin/m4"
-| #define HAVE_LOCALE_H 1
-| #define HAVE_WCHAR_H 1
-| #define HAVE_WCTYPE_H 1
-| #define HAVE__BOOL 1
-| #define HAVE_STDBOOL_H 1
-| #define HAVE_UINTPTR_T 1
-| #define HAVE_SETLOCALE 1
-| #define HAVE_ISASCII 1
-| #define HAVE_ISWPRINT 1
-| #define HAVE_MBSINIT 1
-| #define HAVE_SYS_WAIT_H 1
-| #define HAVE_DUP2 1
-| #define HAVE_WAITPID 1
-| #define HAVE_UNISTD_H 1
-| /* end confdefs.h.  */
-| #include <stdio.h>
-| #if HAVE_SYS_TYPES_H
-| # include <sys/types.h>
-| #endif
-| #if HAVE_SYS_STAT_H
-| # include <sys/stat.h>
-| #endif
-| #if STDC_HEADERS
-| # include <stdlib.h>
-| # include <stddef.h>
-| #else
-| # if HAVE_STDLIB_H
-| #  include <stdlib.h>
-| # endif
-| #endif
-| #if HAVE_STRING_H
-| # if !STDC_HEADERS && HAVE_MEMORY_H
-| #  include <memory.h>
-| # endif
-| # include <string.h>
-| #endif
-| #if HAVE_STRINGS_H
-| # include <strings.h>
-| #endif
-| #if HAVE_INTTYPES_H
-| # include <inttypes.h>
-| #else
-| # if HAVE_STDINT_H
-| #  include <stdint.h>
-| # endif
-| #endif
-| #if HAVE_UNISTD_H
-| # include <unistd.h>
-| #endif
-| #include <vfork.h>
-configure:7472: result: no
-configure:7476: checking vfork.h presence
-configure:7486: gcc -E  conftest.c
-conftest.c:40:19: error: vfork.h: No such file or directory
-configure:7492: $? = 1
-configure: failed program was:
-| /* confdefs.h.  */
-| 
-| #define PACKAGE_NAME "GNU Bison"
-| #define PACKAGE_TARNAME "bison"
-| #define PACKAGE_VERSION "2.3"
-| #define PACKAGE_STRING "GNU Bison 2.3"
-| #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-| #define PACKAGE "bison"
-| #define VERSION "2.3"
-| #define _GNU_SOURCE 1
-| #define STDC_HEADERS 1
-| #define HAVE_SYS_TYPES_H 1
-| #define HAVE_SYS_STAT_H 1
-| #define HAVE_STDLIB_H 1
-| #define HAVE_STRING_H 1
-| #define HAVE_MEMORY_H 1
-| #define HAVE_STRINGS_H 1
-| #define HAVE_INTTYPES_H 1
-| #define HAVE_STDINT_H 1
-| #define HAVE_UNISTD_H 1
-| #define __EXTENSIONS__ 1
-| #define _POSIX_PTHREAD_SEMANTICS 1
-| #define YYTEXT_POINTER 1
-| #define M4 "/usr/bin/m4"
-| #define HAVE_LOCALE_H 1
-| #define HAVE_WCHAR_H 1
-| #define HAVE_WCTYPE_H 1
-| #define HAVE__BOOL 1
-| #define HAVE_STDBOOL_H 1
-| #define HAVE_UINTPTR_T 1
-| #define HAVE_SETLOCALE 1
-| #define HAVE_ISASCII 1
-| #define HAVE_ISWPRINT 1
-| #define HAVE_MBSINIT 1
-| #define HAVE_SYS_WAIT_H 1
-| #define HAVE_DUP2 1
-| #define HAVE_WAITPID 1
-| #define HAVE_UNISTD_H 1
-| /* end confdefs.h.  */
-| #include <vfork.h>
-configure:7512: result: no
-configure:7547: checking for vfork.h
-configure:7554: result: no
-configure:7572: checking for fork
-configure:7629: gcc -o conftest -g -O2   conftest.c  >&5
-conftest.c:64: warning: conflicting types for built-in function 'fork'
-configure:7635: $? = 0
-configure:7638: test -z 			 || test ! -s conftest.err
-configure:7641: $? = 0
-configure:7644: test -s conftest
-configure:7647: $? = 0
-configure:7659: result: yes
-configure:7572: checking for vfork
-configure:7629: gcc -o conftest -g -O2   conftest.c  >&5
-configure:7635: $? = 0
-configure:7638: test -z 			 || test ! -s conftest.err
-configure:7641: $? = 0
-configure:7644: test -s conftest
-configure:7647: $? = 0
-configure:7659: result: yes
-configure:7670: checking for working fork
-configure:7693: gcc -o conftest -g -O2   conftest.c  >&5
-conftest.c: In function 'main':
-conftest.c:10: warning: incompatible implicit declaration of built-in function 'exit'
-configure:7696: $? = 0
-configure:7698: ./conftest
-configure:7701: $? = 0
-configure:7715: result: yes
-configure:7736: checking for working vfork
-configure:7869: result: yes
-configure:7916: checking sys/time.h usability
-configure:7928: gcc -c -g -O2  conftest.c >&5
-configure:7934: $? = 0
-configure:7937: test -z 			 || test ! -s conftest.err
-configure:7940: $? = 0
-configure:7943: test -s conftest.o
-configure:7946: $? = 0
-configure:7956: result: yes
-configure:7960: checking sys/time.h presence
-configure:7970: gcc -E  conftest.c
-configure:7976: $? = 0
-configure:7996: result: yes
-configure:8031: checking for sys/time.h
-configure:8038: result: yes
-configure:7916: checking sys/times.h usability
-configure:7928: gcc -c -g -O2  conftest.c >&5
-configure:7934: $? = 0
-configure:7937: test -z 			 || test ! -s conftest.err
-configure:7940: $? = 0
-configure:7943: test -s conftest.o
-configure:7946: $? = 0
-configure:7956: result: yes
-configure:7960: checking sys/times.h presence
-configure:7970: gcc -E  conftest.c
-configure:7976: $? = 0
-configure:7996: result: yes
-configure:8031: checking for sys/times.h
-configure:8038: result: yes
-configure:8055: checking for sys/resource.h
-configure:8078: gcc -c -g -O2  conftest.c >&5
-configure:8084: $? = 0
-configure:8087: test -z 			 || test ! -s conftest.err
-configure:8090: $? = 0
-configure:8093: test -s conftest.o
-configure:8096: $? = 0
-configure:8107: result: yes
-configure:8122: checking for times
-configure:8179: gcc -o conftest -g -O2   conftest.c  >&5
-configure:8185: $? = 0
-configure:8188: test -z 			 || test ! -s conftest.err
-configure:8191: $? = 0
-configure:8194: test -s conftest
-configure:8197: $? = 0
-configure:8209: result: yes
-configure:8220: checking whether getrusage is declared
-configure:8255: gcc -c -g -O2  conftest.c >&5
-configure:8261: $? = 0
-configure:8264: test -z 			 || test ! -s conftest.err
-configure:8267: $? = 0
-configure:8270: test -s conftest.o
-configure:8273: $? = 0
-configure:8284: result: yes
-configure:8300: checking whether times is declared
-configure:8335: gcc -c -g -O2  conftest.c >&5
-configure:8341: $? = 0
-configure:8344: test -z 			 || test ! -s conftest.err
-configure:8347: $? = 0
-configure:8350: test -s conftest.o
-configure:8353: $? = 0
-configure:8364: result: yes
-configure:8380: checking whether clock is declared
-configure:8415: gcc -c -g -O2  conftest.c >&5
-conftest.c: In function 'main':
-conftest.c:99: error: 'clock' undeclared (first use in this function)
-conftest.c:99: error: (Each undeclared identifier is reported only once
-conftest.c:99: error: for each function it appears in.)
-configure:8421: $? = 1
-configure: failed program was:
-| /* confdefs.h.  */
-| 
-| #define PACKAGE_NAME "GNU Bison"
-| #define PACKAGE_TARNAME "bison"
-| #define PACKAGE_VERSION "2.3"
-| #define PACKAGE_STRING "GNU Bison 2.3"
-| #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-| #define PACKAGE "bison"
-| #define VERSION "2.3"
-| #define _GNU_SOURCE 1
-| #define STDC_HEADERS 1
-| #define HAVE_SYS_TYPES_H 1
-| #define HAVE_SYS_STAT_H 1
-| #define HAVE_STDLIB_H 1
-| #define HAVE_STRING_H 1
-| #define HAVE_MEMORY_H 1
-| #define HAVE_STRINGS_H 1
-| #define HAVE_INTTYPES_H 1
-| #define HAVE_STDINT_H 1
-| #define HAVE_UNISTD_H 1
-| #define __EXTENSIONS__ 1
-| #define _POSIX_PTHREAD_SEMANTICS 1
-| #define YYTEXT_POINTER 1
-| #define M4 "/usr/bin/m4"
-| #define HAVE_LOCALE_H 1
-| #define HAVE_WCHAR_H 1
-| #define HAVE_WCTYPE_H 1
-| #define HAVE__BOOL 1
-| #define HAVE_STDBOOL_H 1
-| #define HAVE_UINTPTR_T 1
-| #define HAVE_SETLOCALE 1
-| #define HAVE_ISASCII 1
-| #define HAVE_ISWPRINT 1
-| #define HAVE_MBSINIT 1
-| #define HAVE_SYS_WAIT_H 1
-| #define HAVE_DUP2 1
-| #define HAVE_WAITPID 1
-| #define HAVE_UNISTD_H 1
-| #define HAVE_FORK 1
-| #define HAVE_VFORK 1
-| #define HAVE_WORKING_VFORK 1
-| #define HAVE_WORKING_FORK 1
-| #define HAVE_SYS_TIME_H 1
-| #define HAVE_SYS_TIMES_H 1
-| #define HAVE_SYS_RESOURCE_H 1
-| #define HAVE_TIMES 1
-| #define HAVE_DECL_GETRUSAGE 1
-| #define HAVE_DECL_TIMES 1
-| /* end confdefs.h.  */
-| #include <stdio.h>
-| #if HAVE_SYS_TYPES_H
-| # include <sys/types.h>
-| #endif
-| #if HAVE_SYS_STAT_H
-| # include <sys/stat.h>
-| #endif
-| #if STDC_HEADERS
-| # include <stdlib.h>
-| # include <stddef.h>
-| #else
-| # if HAVE_STDLIB_H
-| #  include <stdlib.h>
-| # endif
-| #endif
-| #if HAVE_STRING_H
-| # if !STDC_HEADERS && HAVE_MEMORY_H
-| #  include <memory.h>
-| # endif
-| # include <string.h>
-| #endif
-| #if HAVE_STRINGS_H
-| # include <strings.h>
-| #endif
-| #if HAVE_INTTYPES_H
-| # include <inttypes.h>
-| #else
-| # if HAVE_STDINT_H
-| #  include <stdint.h>
-| # endif
-| #endif
-| #if HAVE_UNISTD_H
-| # include <unistd.h>
-| #endif
-| #if HAVE_SYS_TIME_H
-| # include <sys/time.h>
-| #endif
-| #if HAVE_SYS_TIMES_H
-| # include <sys/times.h>
-| #endif
-| #if HAVE_SYS_RESOURCE_H
-| # include <sys/resource.h>
-| #endif
-| 
-| 
-| int
-| main ()
-| {
-| #ifndef clock
-|   char *p = (char *) clock;
-| #endif
-| 
-|   ;
-|   return 0;
-| }
-configure:8444: result: no
-configure:8460: checking whether sysconf is declared
-configure:8495: gcc -c -g -O2  conftest.c >&5
-configure:8501: $? = 0
-configure:8504: test -z 			 || test ! -s conftest.err
-configure:8507: $? = 0
-configure:8510: test -s conftest.o
-configure:8513: $? = 0
-configure:8524: result: yes
-configure:8543: checking for clock_t
-configure:8578: gcc -c -g -O2  conftest.c >&5
-configure:8584: $? = 0
-configure:8587: test -z 			 || test ! -s conftest.err
-configure:8590: $? = 0
-configure:8593: test -s conftest.o
-configure:8596: $? = 0
-configure:8607: result: yes
-configure:8617: checking for struct tms
-configure:8652: gcc -c -g -O2  conftest.c >&5
-configure:8658: $? = 0
-configure:8661: test -z 			 || test ! -s conftest.err
-configure:8664: $? = 0
-configure:8667: test -s conftest.o
-configure:8670: $? = 0
-configure:8681: result: yes
-configure:8696: checking whether system is Windows or MSDOS
-configure:8720: gcc -c -g -O2  conftest.c >&5
-conftest.c: In function 'main':
-conftest.c:59: error: 'neither' undeclared (first use in this function)
-conftest.c:59: error: (Each undeclared identifier is reported only once
-conftest.c:59: error: for each function it appears in.)
-conftest.c:59: error: syntax error before 'MSDOS'
-configure:8726: $? = 1
-configure: failed program was:
-| /* confdefs.h.  */
-| 
-| #define PACKAGE_NAME "GNU Bison"
-| #define PACKAGE_TARNAME "bison"
-| #define PACKAGE_VERSION "2.3"
-| #define PACKAGE_STRING "GNU Bison 2.3"
-| #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-| #define PACKAGE "bison"
-| #define VERSION "2.3"
-| #define _GNU_SOURCE 1
-| #define STDC_HEADERS 1
-| #define HAVE_SYS_TYPES_H 1
-| #define HAVE_SYS_STAT_H 1
-| #define HAVE_STDLIB_H 1
-| #define HAVE_STRING_H 1
-| #define HAVE_MEMORY_H 1
-| #define HAVE_STRINGS_H 1
-| #define HAVE_INTTYPES_H 1
-| #define HAVE_STDINT_H 1
-| #define HAVE_UNISTD_H 1
-| #define __EXTENSIONS__ 1
-| #define _POSIX_PTHREAD_SEMANTICS 1
-| #define YYTEXT_POINTER 1
-| #define M4 "/usr/bin/m4"
-| #define HAVE_LOCALE_H 1
-| #define HAVE_WCHAR_H 1
-| #define HAVE_WCTYPE_H 1
-| #define HAVE__BOOL 1
-| #define HAVE_STDBOOL_H 1
-| #define HAVE_UINTPTR_T 1
-| #define HAVE_SETLOCALE 1
-| #define HAVE_ISASCII 1
-| #define HAVE_ISWPRINT 1
-| #define HAVE_MBSINIT 1
-| #define HAVE_SYS_WAIT_H 1
-| #define HAVE_DUP2 1
-| #define HAVE_WAITPID 1
-| #define HAVE_UNISTD_H 1
-| #define HAVE_FORK 1
-| #define HAVE_VFORK 1
-| #define HAVE_WORKING_VFORK 1
-| #define HAVE_WORKING_FORK 1
-| #define HAVE_SYS_TIME_H 1
-| #define HAVE_SYS_TIMES_H 1
-| #define HAVE_SYS_RESOURCE_H 1
-| #define HAVE_TIMES 1
-| #define HAVE_DECL_GETRUSAGE 1
-| #define HAVE_DECL_TIMES 1
-| #define HAVE_DECL_CLOCK 0
-| #define HAVE_DECL_SYSCONF 1
-| #define HAVE_CLOCK_T 1
-| #define HAVE_STRUCT_TMS 1
-| /* end confdefs.h.  */
-| 
-| int
-| main ()
-| {
-| #if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __CYGWIN__
-| neither MSDOS nor Windows
-| #endif
-|   ;
-|   return 0;
-| }
-configure:8750: result: no
-configure:8779: checking whether strerror_r is declared
-configure:8803: gcc -c -g -O2  conftest.c >&5
-configure:8809: $? = 0
-configure:8812: test -z 			 || test ! -s conftest.err
-configure:8815: $? = 0
-configure:8818: test -s conftest.o
-configure:8821: $? = 0
-configure:8832: result: yes
-configure:8854: checking for strerror_r
-configure:8911: gcc -o conftest -g -O2   conftest.c  >&5
-configure:8917: $? = 0
-configure:8920: test -z 			 || test ! -s conftest.err
-configure:8923: $? = 0
-configure:8926: test -s conftest
-configure:8929: $? = 0
-configure:8941: result: yes
-configure:8951: checking whether strerror_r returns char *
-configure:8979: gcc -c -g -O2  conftest.c >&5
-configure:8985: $? = 0
-configure:8988: test -z 			 || test ! -s conftest.err
-configure:8991: $? = 0
-configure:8994: test -s conftest.o
-configure:8997: $? = 0
-configure:9057: result: yes
-configure:9083: checking getopt.h usability
-configure:9095: gcc -c -g -O2  conftest.c >&5
-configure:9101: $? = 0
-configure:9104: test -z 			 || test ! -s conftest.err
-configure:9107: $? = 0
-configure:9110: test -s conftest.o
-configure:9113: $? = 0
-configure:9123: result: yes
-configure:9127: checking getopt.h presence
-configure:9137: gcc -E  conftest.c
-configure:9143: $? = 0
-configure:9163: result: yes
-configure:9198: checking for getopt.h
-configure:9205: result: yes
-configure:9227: checking for getopt_long_only
-configure:9284: gcc -o conftest -g -O2   conftest.c  >&5
-configure:9290: $? = 0
-configure:9293: test -z 			 || test ! -s conftest.err
-configure:9296: $? = 0
-configure:9299: test -s conftest
-configure:9302: $? = 0
-configure:9314: result: yes
-configure:9329: checking whether optreset is declared
-configure:9354: gcc -c -g -O2  conftest.c >&5
-conftest.c: In function 'main':
-conftest.c:67: error: 'optreset' undeclared (first use in this function)
-conftest.c:67: error: (Each undeclared identifier is reported only once
-conftest.c:67: error: for each function it appears in.)
-configure:9360: $? = 1
-configure: failed program was:
-| /* confdefs.h.  */
-| 
-| #define PACKAGE_NAME "GNU Bison"
-| #define PACKAGE_TARNAME "bison"
-| #define PACKAGE_VERSION "2.3"
-| #define PACKAGE_STRING "GNU Bison 2.3"
-| #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-| #define PACKAGE "bison"
-| #define VERSION "2.3"
-| #define _GNU_SOURCE 1
-| #define STDC_HEADERS 1
-| #define HAVE_SYS_TYPES_H 1
-| #define HAVE_SYS_STAT_H 1
-| #define HAVE_STDLIB_H 1
-| #define HAVE_STRING_H 1
-| #define HAVE_MEMORY_H 1
-| #define HAVE_STRINGS_H 1
-| #define HAVE_INTTYPES_H 1
-| #define HAVE_STDINT_H 1
-| #define HAVE_UNISTD_H 1
-| #define __EXTENSIONS__ 1
-| #define _POSIX_PTHREAD_SEMANTICS 1
-| #define YYTEXT_POINTER 1
-| #define M4 "/usr/bin/m4"
-| #define HAVE_LOCALE_H 1
-| #define HAVE_WCHAR_H 1
-| #define HAVE_WCTYPE_H 1
-| #define HAVE__BOOL 1
-| #define HAVE_STDBOOL_H 1
-| #define HAVE_UINTPTR_T 1
-| #define HAVE_SETLOCALE 1
-| #define HAVE_ISASCII 1
-| #define HAVE_ISWPRINT 1
-| #define HAVE_MBSINIT 1
-| #define HAVE_SYS_WAIT_H 1
-| #define HAVE_DUP2 1
-| #define HAVE_WAITPID 1
-| #define HAVE_UNISTD_H 1
-| #define HAVE_FORK 1
-| #define HAVE_VFORK 1
-| #define HAVE_WORKING_VFORK 1
-| #define HAVE_WORKING_FORK 1
-| #define HAVE_SYS_TIME_H 1
-| #define HAVE_SYS_TIMES_H 1
-| #define HAVE_SYS_RESOURCE_H 1
-| #define HAVE_TIMES 1
-| #define HAVE_DECL_GETRUSAGE 1
-| #define HAVE_DECL_TIMES 1
-| #define HAVE_DECL_CLOCK 0
-| #define HAVE_DECL_SYSCONF 1
-| #define HAVE_CLOCK_T 1
-| #define HAVE_STRUCT_TMS 1
-| #define FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX 0
-| #define FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR 0
-| #define HAVE_DECL_STRERROR_R 1
-| #define HAVE_STRERROR_R 1
-| #define STRERROR_R_CHAR_P 1
-| #define HAVE_GETOPT_H 1
-| #define HAVE_GETOPT_LONG_ONLY 1
-| /* end confdefs.h.  */
-| #include <getopt.h>
-| 
-| int
-| main ()
-| {
-| #ifndef optreset
-|   char *p = (char *) optreset;
-| #endif
-| 
-|   ;
-|   return 0;
-| }
-configure:9383: result: no
-configure:9392: checking for working GNU getopt function
-configure:9483: gcc -o conftest -g -O2   conftest.c  >&5
-configure:9486: $? = 0
-configure:9488: ./conftest
-conftest: invalid option -- +
-configure:9491: $? = 0
-configure:9505: result: yes
-configure:9513: checking whether getenv is declared
-configure:9537: gcc -c -g -O2  conftest.c >&5
-configure:9543: $? = 0
-configure:9546: test -z 			 || test ! -s conftest.err
-configure:9549: $? = 0
-configure:9552: test -s conftest.o
-configure:9555: $? = 0
-configure:9566: result: yes
-configure:9600: checking whether NLS is requested
-configure:9609: result: yes
-configure:9647: checking for msgfmt
-configure: trying /usr/bin/msgfmt...
-0 translated messages.
-configure:9679: result: /usr/bin/msgfmt
-configure:9688: checking for gmsgfmt
-configure:9719: result: /usr/bin/msgfmt
-configure:9758: checking for xgettext
-configure: trying /usr/bin/xgettext...
-/usr/bin/xgettext: warning: file `/dev/null' extension `' is unknown; will try C
-configure:9790: result: /usr/bin/xgettext
-configure:9830: checking for msgmerge
-configure: trying /usr/bin/msgmerge...
-configure:9861: result: /usr/bin/msgmerge
-configure:9918: checking build system type
-configure:9936: result: x86_64-unknown-linux-gnu
-configure:9944: checking host system type
-configure:9958: result: x86_64-unknown-linux-gnu
-configure:9990: checking for ld used by GCC
-configure:10054: result: /usr/bin/ld
-configure:10063: checking if the linker (/usr/bin/ld) is GNU ld
-configure:10076: result: yes
-configure:10083: checking for shared library run path origin
-configure:10096: result: done
-configure:10547: checking for inttypes.h
-configure:10569: gcc -c -g -O2  conftest.c >&5
-configure:10575: $? = 0
-configure:10578: test -z 			 || test ! -s conftest.err
-configure:10581: $? = 0
-configure:10584: test -s conftest.o
-configure:10587: $? = 0
-configure:10598: result: yes
-configure:10609: checking for stdint.h
-configure:10631: gcc -c -g -O2  conftest.c >&5
-configure:10637: $? = 0
-configure:10640: test -z 			 || test ! -s conftest.err
-configure:10643: $? = 0
-configure:10646: test -s conftest.o
-configure:10649: $? = 0
-configure:10660: result: yes
-configure:10671: checking for unsigned long long
-configure:10693: gcc -o conftest -g -O2   conftest.c  >&5
-configure:10699: $? = 0
-configure:10702: test -z 			 || test ! -s conftest.err
-configure:10705: $? = 0
-configure:10708: test -s conftest
-configure:10711: $? = 0
-configure:10723: result: yes
-configure:10755: checking whether strdup is declared
-configure:10779: gcc -c -g -O2  conftest.c >&5
-configure:10785: $? = 0
-configure:10788: test -z 			 || test ! -s conftest.err
-configure:10791: $? = 0
-configure:10794: test -s conftest.o
-configure:10797: $? = 0
-configure:10808: result: yes
-configure:10828: checking whether strndup is declared
-configure:10852: gcc -c -g -O2  conftest.c >&5
-configure:10858: $? = 0
-configure:10861: test -z 			 || test ! -s conftest.err
-configure:10864: $? = 0
-configure:10867: test -s conftest.o
-configure:10870: $? = 0
-configure:10881: result: yes
-configure:10901: checking whether strnlen is declared
-configure:10925: gcc -c -g -O2  conftest.c >&5
-configure:10931: $? = 0
-configure:10934: test -z 			 || test ! -s conftest.err
-configure:10937: $? = 0
-configure:10940: test -s conftest.o
-configure:10943: $? = 0
-configure:10954: result: yes
-configure:10974: checking whether clearerr_unlocked is declared
-configure:10998: gcc -c -g -O2  conftest.c >&5
-configure:11004: $? = 0
-configure:11007: test -z 			 || test ! -s conftest.err
-configure:11010: $? = 0
-configure:11013: test -s conftest.o
-configure:11016: $? = 0
-configure:11027: result: yes
-configure:11047: checking whether feof_unlocked is declared
-configure:11071: gcc -c -g -O2  conftest.c >&5
-configure:11077: $? = 0
-configure:11080: test -z 			 || test ! -s conftest.err
-configure:11083: $? = 0
-configure:11086: test -s conftest.o
-configure:11089: $? = 0
-configure:11100: result: yes
-configure:11120: checking whether ferror_unlocked is declared
-configure:11144: gcc -c -g -O2  conftest.c >&5
-configure:11150: $? = 0
-configure:11153: test -z 			 || test ! -s conftest.err
-configure:11156: $? = 0
-configure:11159: test -s conftest.o
-configure:11162: $? = 0
-configure:11173: result: yes
-configure:11193: checking whether fflush_unlocked is declared
-configure:11217: gcc -c -g -O2  conftest.c >&5
-configure:11223: $? = 0
-configure:11226: test -z 			 || test ! -s conftest.err
-configure:11229: $? = 0
-configure:11232: test -s conftest.o
-configure:11235: $? = 0
-configure:11246: result: yes
-configure:11266: checking whether fgets_unlocked is declared
-configure:11290: gcc -c -g -O2  conftest.c >&5
-configure:11296: $? = 0
-configure:11299: test -z 			 || test ! -s conftest.err
-configure:11302: $? = 0
-configure:11305: test -s conftest.o
-configure:11308: $? = 0
-configure:11319: result: yes
-configure:11339: checking whether fputc_unlocked is declared
-configure:11363: gcc -c -g -O2  conftest.c >&5
-configure:11369: $? = 0
-configure:11372: test -z 			 || test ! -s conftest.err
-configure:11375: $? = 0
-configure:11378: test -s conftest.o
-configure:11381: $? = 0
-configure:11392: result: yes
-configure:11412: checking whether fputs_unlocked is declared
-configure:11436: gcc -c -g -O2  conftest.c >&5
-configure:11442: $? = 0
-configure:11445: test -z 			 || test ! -s conftest.err
-configure:11448: $? = 0
-configure:11451: test -s conftest.o
-configure:11454: $? = 0
-configure:11465: result: yes
-configure:11485: checking whether fread_unlocked is declared
-configure:11509: gcc -c -g -O2  conftest.c >&5
-configure:11515: $? = 0
-configure:11518: test -z 			 || test ! -s conftest.err
-configure:11521: $? = 0
-configure:11524: test -s conftest.o
-configure:11527: $? = 0
-configure:11538: result: yes
-configure:11558: checking whether fwrite_unlocked is declared
-configure:11582: gcc -c -g -O2  conftest.c >&5
-configure:11588: $? = 0
-configure:11591: test -z 			 || test ! -s conftest.err
-configure:11594: $? = 0
-configure:11597: test -s conftest.o
-configure:11600: $? = 0
-configure:11611: result: yes
-configure:11631: checking whether getc_unlocked is declared
-configure:11655: gcc -c -g -O2  conftest.c >&5
-configure:11661: $? = 0
-configure:11664: test -z 			 || test ! -s conftest.err
-configure:11667: $? = 0
-configure:11670: test -s conftest.o
-configure:11673: $? = 0
-configure:11684: result: yes
-configure:11704: checking whether getchar_unlocked is declared
-configure:11728: gcc -c -g -O2  conftest.c >&5
-configure:11734: $? = 0
-configure:11737: test -z 			 || test ! -s conftest.err
-configure:11740: $? = 0
-configure:11743: test -s conftest.o
-configure:11746: $? = 0
-configure:11757: result: yes
-configure:11777: checking whether putc_unlocked is declared
-configure:11801: gcc -c -g -O2  conftest.c >&5
-configure:11807: $? = 0
-configure:11810: test -z 			 || test ! -s conftest.err
-configure:11813: $? = 0
-configure:11816: test -s conftest.o
-configure:11819: $? = 0
-configure:11830: result: yes
-configure:11850: checking whether putchar_unlocked is declared
-configure:11874: gcc -c -g -O2  conftest.c >&5
-configure:11880: $? = 0
-configure:11883: test -z 			 || test ! -s conftest.err
-configure:11886: $? = 0
-configure:11889: test -s conftest.o
-configure:11892: $? = 0
-configure:11903: result: yes
-configure:11940: checking for error_at_line
-configure:11961: gcc -o conftest -g -O2   conftest.c  >&5
-configure:11967: $? = 0
-configure:11970: test -z 			 || test ! -s conftest.err
-configure:11973: $? = 0
-configure:11976: test -s conftest
-configure:11979: $? = 0
-configure:11991: result: yes
-configure:12085: checking for CFPreferencesCopyAppValue
-configure:12110: gcc -o conftest -g -O2  -I/System/Library/Frameworks/CoreFoundation.framework/Headers  conftest.c  -framework CoreFoundation >&5
-gcc: CoreFoundation: No such file or directory
-cc1: error: unrecognized command line option "-framework"
-configure:12116: $? = 1
-configure: failed program was:
-| /* confdefs.h.  */
-| 
-| #define PACKAGE_NAME "GNU Bison"
-| #define PACKAGE_TARNAME "bison"
-| #define PACKAGE_VERSION "2.3"
-| #define PACKAGE_STRING "GNU Bison 2.3"
-| #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-| #define PACKAGE "bison"
-| #define VERSION "2.3"
-| #define _GNU_SOURCE 1
-| #define STDC_HEADERS 1
-| #define HAVE_SYS_TYPES_H 1
-| #define HAVE_SYS_STAT_H 1
-| #define HAVE_STDLIB_H 1
-| #define HAVE_STRING_H 1
-| #define HAVE_MEMORY_H 1
-| #define HAVE_STRINGS_H 1
-| #define HAVE_INTTYPES_H 1
-| #define HAVE_STDINT_H 1
-| #define HAVE_UNISTD_H 1
-| #define __EXTENSIONS__ 1
-| #define _POSIX_PTHREAD_SEMANTICS 1
-| #define YYTEXT_POINTER 1
-| #define M4 "/usr/bin/m4"
-| #define HAVE_LOCALE_H 1
-| #define HAVE_WCHAR_H 1
-| #define HAVE_WCTYPE_H 1
-| #define HAVE__BOOL 1
-| #define HAVE_STDBOOL_H 1
-| #define HAVE_UINTPTR_T 1
-| #define HAVE_SETLOCALE 1
-| #define HAVE_ISASCII 1
-| #define HAVE_ISWPRINT 1
-| #define HAVE_MBSINIT 1
-| #define HAVE_SYS_WAIT_H 1
-| #define HAVE_DUP2 1
-| #define HAVE_WAITPID 1
-| #define HAVE_UNISTD_H 1
-| #define HAVE_FORK 1
-| #define HAVE_VFORK 1
-| #define HAVE_WORKING_VFORK 1
-| #define HAVE_WORKING_FORK 1
-| #define HAVE_SYS_TIME_H 1
-| #define HAVE_SYS_TIMES_H 1
-| #define HAVE_SYS_RESOURCE_H 1
-| #define HAVE_TIMES 1
-| #define HAVE_DECL_GETRUSAGE 1
-| #define HAVE_DECL_TIMES 1
-| #define HAVE_DECL_CLOCK 0
-| #define HAVE_DECL_SYSCONF 1
-| #define HAVE_CLOCK_T 1
-| #define HAVE_STRUCT_TMS 1
-| #define FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX 0
-| #define FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR 0
-| #define HAVE_DECL_STRERROR_R 1
-| #define HAVE_STRERROR_R 1
-| #define STRERROR_R_CHAR_P 1
-| #define HAVE_GETOPT_H 1
-| #define HAVE_GETOPT_LONG_ONLY 1
-| #define HAVE_DECL_GETENV 1
-| #define HAVE_INTTYPES_H_WITH_UINTMAX 1
-| #define HAVE_STDINT_H_WITH_UINTMAX 1
-| #define HAVE_UNSIGNED_LONG_LONG 1
-| #define HAVE_UINTMAX_T 1
-| #define HAVE_DECL_STRDUP 1
-| #define HAVE_DECL_STRNDUP 1
-| #define HAVE_DECL_STRNLEN 1
-| #define HAVE_DECL_CLEARERR_UNLOCKED 1
-| #define HAVE_DECL_FEOF_UNLOCKED 1
-| #define HAVE_DECL_FERROR_UNLOCKED 1
-| #define HAVE_DECL_FFLUSH_UNLOCKED 1
-| #define HAVE_DECL_FGETS_UNLOCKED 1
-| #define HAVE_DECL_FPUTC_UNLOCKED 1
-| #define HAVE_DECL_FPUTS_UNLOCKED 1
-| #define HAVE_DECL_FREAD_UNLOCKED 1
-| #define HAVE_DECL_FWRITE_UNLOCKED 1
-| #define HAVE_DECL_GETC_UNLOCKED 1
-| #define HAVE_DECL_GETCHAR_UNLOCKED 1
-| #define HAVE_DECL_PUTC_UNLOCKED 1
-| #define HAVE_DECL_PUTCHAR_UNLOCKED 1
-| /* end confdefs.h.  */
-| #include <CFPreferences.h>
-| int
-| main ()
-| {
-| CFPreferencesCopyAppValue(NULL, NULL)
-|   ;
-|   return 0;
-| }
-configure:12142: result: no
-configure:12151: checking for CFLocaleCopyCurrent
-configure:12176: gcc -o conftest -g -O2  -I/System/Library/Frameworks/CoreFoundation.framework/Headers  conftest.c  -framework CoreFoundation >&5
-gcc: CoreFoundation: No such file or directory
-cc1: error: unrecognized command line option "-framework"
-configure:12182: $? = 1
-configure: failed program was:
-| /* confdefs.h.  */
-| 
-| #define PACKAGE_NAME "GNU Bison"
-| #define PACKAGE_TARNAME "bison"
-| #define PACKAGE_VERSION "2.3"
-| #define PACKAGE_STRING "GNU Bison 2.3"
-| #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-| #define PACKAGE "bison"
-| #define VERSION "2.3"
-| #define _GNU_SOURCE 1
-| #define STDC_HEADERS 1
-| #define HAVE_SYS_TYPES_H 1
-| #define HAVE_SYS_STAT_H 1
-| #define HAVE_STDLIB_H 1
-| #define HAVE_STRING_H 1
-| #define HAVE_MEMORY_H 1
-| #define HAVE_STRINGS_H 1
-| #define HAVE_INTTYPES_H 1
-| #define HAVE_STDINT_H 1
-| #define HAVE_UNISTD_H 1
-| #define __EXTENSIONS__ 1
-| #define _POSIX_PTHREAD_SEMANTICS 1
-| #define YYTEXT_POINTER 1
-| #define M4 "/usr/bin/m4"
-| #define HAVE_LOCALE_H 1
-| #define HAVE_WCHAR_H 1
-| #define HAVE_WCTYPE_H 1
-| #define HAVE__BOOL 1
-| #define HAVE_STDBOOL_H 1
-| #define HAVE_UINTPTR_T 1
-| #define HAVE_SETLOCALE 1
-| #define HAVE_ISASCII 1
-| #define HAVE_ISWPRINT 1
-| #define HAVE_MBSINIT 1
-| #define HAVE_SYS_WAIT_H 1
-| #define HAVE_DUP2 1
-| #define HAVE_WAITPID 1
-| #define HAVE_UNISTD_H 1
-| #define HAVE_FORK 1
-| #define HAVE_VFORK 1
-| #define HAVE_WORKING_VFORK 1
-| #define HAVE_WORKING_FORK 1
-| #define HAVE_SYS_TIME_H 1
-| #define HAVE_SYS_TIMES_H 1
-| #define HAVE_SYS_RESOURCE_H 1
-| #define HAVE_TIMES 1
-| #define HAVE_DECL_GETRUSAGE 1
-| #define HAVE_DECL_TIMES 1
-| #define HAVE_DECL_CLOCK 0
-| #define HAVE_DECL_SYSCONF 1
-| #define HAVE_CLOCK_T 1
-| #define HAVE_STRUCT_TMS 1
-| #define FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX 0
-| #define FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR 0
-| #define HAVE_DECL_STRERROR_R 1
-| #define HAVE_STRERROR_R 1
-| #define STRERROR_R_CHAR_P 1
-| #define HAVE_GETOPT_H 1
-| #define HAVE_GETOPT_LONG_ONLY 1
-| #define HAVE_DECL_GETENV 1
-| #define HAVE_INTTYPES_H_WITH_UINTMAX 1
-| #define HAVE_STDINT_H_WITH_UINTMAX 1
-| #define HAVE_UNSIGNED_LONG_LONG 1
-| #define HAVE_UINTMAX_T 1
-| #define HAVE_DECL_STRDUP 1
-| #define HAVE_DECL_STRNDUP 1
-| #define HAVE_DECL_STRNLEN 1
-| #define HAVE_DECL_CLEARERR_UNLOCKED 1
-| #define HAVE_DECL_FEOF_UNLOCKED 1
-| #define HAVE_DECL_FERROR_UNLOCKED 1
-| #define HAVE_DECL_FFLUSH_UNLOCKED 1
-| #define HAVE_DECL_FGETS_UNLOCKED 1
-| #define HAVE_DECL_FPUTC_UNLOCKED 1
-| #define HAVE_DECL_FPUTS_UNLOCKED 1
-| #define HAVE_DECL_FREAD_UNLOCKED 1
-| #define HAVE_DECL_FWRITE_UNLOCKED 1
-| #define HAVE_DECL_GETC_UNLOCKED 1
-| #define HAVE_DECL_GETCHAR_UNLOCKED 1
-| #define HAVE_DECL_PUTC_UNLOCKED 1
-| #define HAVE_DECL_PUTCHAR_UNLOCKED 1
-| /* end confdefs.h.  */
-| #include <CFLocale.h>
-| int
-| main ()
-| {
-| CFLocaleCopyCurrent();
-|   ;
-|   return 0;
-| }
-configure:12208: result: no
-configure:12225: checking whether NLS is requested
-configure:12234: result: yes
-configure:12252: checking for GNU gettext in libc
-configure:12276: gcc -o conftest -g -O2   conftest.c  >&5
-configure:12282: $? = 0
-configure:12285: test -z 			 || test ! -s conftest.err
-configure:12288: $? = 0
-configure:12291: test -s conftest
-configure:12294: $? = 0
-configure:12306: result: yes
-configure:13010: checking whether to use NLS
-configure:13012: result: yes
-configure:13015: checking where the gettext function comes from
-configure:13026: result: libc
-configure:13122: checking for stdlib.h
-configure:13127: result: yes
-configure:13266: checking for GNU libc compatible malloc
-configure:13295: gcc -o conftest -g -O2   conftest.c  >&5
-configure:13298: $? = 0
-configure:13300: ./conftest
-configure:13303: $? = 0
-configure:13317: result: yes
-configure:13377: checking for iswcntrl
-configure:13434: gcc -o conftest -g -O2   conftest.c  >&5
-conftest.c:111: warning: conflicting types for built-in function 'iswcntrl'
-configure:13440: $? = 0
-configure:13443: test -z 			 || test ! -s conftest.err
-configure:13446: $? = 0
-configure:13449: test -s conftest
-configure:13452: $? = 0
-configure:13464: result: yes
-configure:13377: checking for wcwidth
-configure:13434: gcc -o conftest -g -O2   conftest.c  >&5
-configure:13440: $? = 0
-configure:13443: test -z 			 || test ! -s conftest.err
-configure:13446: $? = 0
-configure:13449: test -s conftest
-configure:13452: $? = 0
-configure:13464: result: yes
-configure:13475: checking whether mbrtowc and mbstate_t are properly declared
-configure:13500: gcc -o conftest -g -O2   conftest.c  >&5
-configure:13506: $? = 0
-configure:13509: test -z 			 || test ! -s conftest.err
-configure:13512: $? = 0
-configure:13515: test -s conftest
-configure:13518: $? = 0
-configure:13530: result: yes
-configure:13541: checking whether wcwidth is declared
-configure:13574: gcc -c -g -O2  conftest.c >&5
-configure:13580: $? = 0
-configure:13583: test -z 			 || test ! -s conftest.err
-configure:13586: $? = 0
-configure:13589: test -s conftest.o
-configure:13592: $? = 0
-configure:13603: result: yes
-configure:13616: checking whether mbswidth is declared in <wchar.h>
-configure:13643: gcc -c -g -O2  conftest.c >&5
-conftest.c: In function 'main':
-conftest.c:100: error: 'mbswidth' undeclared (first use in this function)
-conftest.c:100: error: (Each undeclared identifier is reported only once
-conftest.c:100: error: for each function it appears in.)
-configure:13649: $? = 1
-configure: failed program was:
-| /* confdefs.h.  */
-| 
-| #define PACKAGE_NAME "GNU Bison"
-| #define PACKAGE_TARNAME "bison"
-| #define PACKAGE_VERSION "2.3"
-| #define PACKAGE_STRING "GNU Bison 2.3"
-| #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-| #define PACKAGE "bison"
-| #define VERSION "2.3"
-| #define _GNU_SOURCE 1
-| #define STDC_HEADERS 1
-| #define HAVE_SYS_TYPES_H 1
-| #define HAVE_SYS_STAT_H 1
-| #define HAVE_STDLIB_H 1
-| #define HAVE_STRING_H 1
-| #define HAVE_MEMORY_H 1
-| #define HAVE_STRINGS_H 1
-| #define HAVE_INTTYPES_H 1
-| #define HAVE_STDINT_H 1
-| #define HAVE_UNISTD_H 1
-| #define __EXTENSIONS__ 1
-| #define _POSIX_PTHREAD_SEMANTICS 1
-| #define YYTEXT_POINTER 1
-| #define M4 "/usr/bin/m4"
-| #define HAVE_LOCALE_H 1
-| #define HAVE_WCHAR_H 1
-| #define HAVE_WCTYPE_H 1
-| #define HAVE__BOOL 1
-| #define HAVE_STDBOOL_H 1
-| #define HAVE_UINTPTR_T 1
-| #define HAVE_SETLOCALE 1
-| #define HAVE_ISASCII 1
-| #define HAVE_ISWPRINT 1
-| #define HAVE_MBSINIT 1
-| #define HAVE_SYS_WAIT_H 1
-| #define HAVE_DUP2 1
-| #define HAVE_WAITPID 1
-| #define HAVE_UNISTD_H 1
-| #define HAVE_FORK 1
-| #define HAVE_VFORK 1
-| #define HAVE_WORKING_VFORK 1
-| #define HAVE_WORKING_FORK 1
-| #define HAVE_SYS_TIME_H 1
-| #define HAVE_SYS_TIMES_H 1
-| #define HAVE_SYS_RESOURCE_H 1
-| #define HAVE_TIMES 1
-| #define HAVE_DECL_GETRUSAGE 1
-| #define HAVE_DECL_TIMES 1
-| #define HAVE_DECL_CLOCK 0
-| #define HAVE_DECL_SYSCONF 1
-| #define HAVE_CLOCK_T 1
-| #define HAVE_STRUCT_TMS 1
-| #define FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX 0
-| #define FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR 0
-| #define HAVE_DECL_STRERROR_R 1
-| #define HAVE_STRERROR_R 1
-| #define STRERROR_R_CHAR_P 1
-| #define HAVE_GETOPT_H 1
-| #define HAVE_GETOPT_LONG_ONLY 1
-| #define HAVE_DECL_GETENV 1
-| #define HAVE_INTTYPES_H_WITH_UINTMAX 1
-| #define HAVE_STDINT_H_WITH_UINTMAX 1
-| #define HAVE_UNSIGNED_LONG_LONG 1
-| #define HAVE_UINTMAX_T 1
-| #define HAVE_DECL_STRDUP 1
-| #define HAVE_DECL_STRNDUP 1
-| #define HAVE_DECL_STRNLEN 1
-| #define HAVE_DECL_CLEARERR_UNLOCKED 1
-| #define HAVE_DECL_FEOF_UNLOCKED 1
-| #define HAVE_DECL_FERROR_UNLOCKED 1
-| #define HAVE_DECL_FFLUSH_UNLOCKED 1
-| #define HAVE_DECL_FGETS_UNLOCKED 1
-| #define HAVE_DECL_FPUTC_UNLOCKED 1
-| #define HAVE_DECL_FPUTS_UNLOCKED 1
-| #define HAVE_DECL_FREAD_UNLOCKED 1
-| #define HAVE_DECL_FWRITE_UNLOCKED 1
-| #define HAVE_DECL_GETC_UNLOCKED 1
-| #define HAVE_DECL_GETCHAR_UNLOCKED 1
-| #define HAVE_DECL_PUTC_UNLOCKED 1
-| #define HAVE_DECL_PUTCHAR_UNLOCKED 1
-| #define ENABLE_NLS 1
-| #define HAVE_GETTEXT 1
-| #define HAVE_DCGETTEXT 1
-| #define HAVE_STDLIB_H 1
-| #define HAVE_MALLOC 1
-| #define HAVE_ISWCNTRL 1
-| #define HAVE_WCWIDTH 1
-| #define HAVE_MBRTOWC 1
-| #define HAVE_DECL_WCWIDTH 1
-| /* end confdefs.h.  */
-| 
-| #if HAVE_WCHAR_H
-| # include <wchar.h>
-| #endif
-| 
-| int
-| main ()
-| {
-| 
-|   char *p = (char *) mbswidth;
-| 
-|   ;
-|   return 0;
-| }
-configure:13672: result: no
-configure:13685: checking for mbstate_t
-configure:13707: gcc -c -g -O2  conftest.c >&5
-configure:13713: $? = 0
-configure:13716: test -z 			 || test ! -s conftest.err
-configure:13719: $? = 0
-configure:13722: test -s conftest.o
-configure:13725: $? = 0
-configure:13736: result: yes
-configure:13754: checking for obstacks
-configure:13775: gcc -o conftest -g -O2   conftest.c  >&5
-configure:13781: $? = 0
-configure:13784: test -z 			 || test ! -s conftest.err
-configure:13787: $? = 0
-configure:13790: test -s conftest
-configure:13793: $? = 0
-configure:13805: result: yes
-configure:13878: checking for mbstate_t
-configure:13929: result: yes
-configure:13945: checking whether mbrtowc and mbstate_t are properly declared
-configure:14000: result: yes
-configure:14051: checking for stpcpy
-configure:14108: gcc -o conftest -g -O2   conftest.c  >&5
-conftest.c:120: warning: conflicting types for built-in function 'stpcpy'
-configure:14114: $? = 0
-configure:14117: test -z 			 || test ! -s conftest.err
-configure:14120: $? = 0
-configure:14123: test -s conftest
-configure:14126: $? = 0
-configure:14138: result: yes
-configure:14172: checking for strdup
-configure:14229: gcc -o conftest -g -O2   conftest.c  >&5
-conftest.c:121: warning: conflicting types for built-in function 'strdup'
-configure:14235: $? = 0
-configure:14238: test -z 			 || test ! -s conftest.err
-configure:14241: $? = 0
-configure:14244: test -s conftest
-configure:14247: $? = 0
-configure:14259: result: yes
-configure:14294: checking for strerror
-configure:14351: gcc -o conftest -g -O2   conftest.c  >&5
-configure:14357: $? = 0
-configure:14360: test -z 			 || test ! -s conftest.err
-configure:14363: $? = 0
-configure:14366: test -s conftest
-configure:14369: $? = 0
-configure:14381: result: yes
-configure:14422: checking for working strndup
-configure:14474: gcc -o conftest -g -O2   conftest.c  >&5
-configure:14477: $? = 0
-configure:14479: ./conftest
-configure:14482: $? = 0
-configure:14496: result: yes
-configure:14527: checking for working strnlen
-configure:14566: gcc -o conftest -g -O2   conftest.c  >&5
-configure:14569: $? = 0
-configure:14571: ./conftest
-configure:14574: $? = 0
-configure:14588: result: yes
-configure:14626: checking for strtol
-configure:14683: gcc -o conftest -g -O2   conftest.c  >&5
-configure:14689: $? = 0
-configure:14692: test -z 			 || test ! -s conftest.err
-configure:14695: $? = 0
-configure:14698: test -s conftest
-configure:14701: $? = 0
-configure:14713: result: yes
-configure:14752: checking for strtoul
-configure:14809: gcc -o conftest -g -O2   conftest.c  >&5
-configure:14815: $? = 0
-configure:14818: test -z 			 || test ! -s conftest.err
-configure:14821: $? = 0
-configure:14824: test -s conftest
-configure:14827: $? = 0
-configure:14839: result: yes
-configure:14884: checking for strverscmp
-configure:14941: gcc -o conftest -g -O2   conftest.c  >&5
-configure:14947: $? = 0
-configure:14950: test -z 			 || test ! -s conftest.err
-configure:14953: $? = 0
-configure:14956: test -s conftest
-configure:14959: $? = 0
-configure:14971: result: yes
-configure:15004: checking for unistd.h
-configure:15009: result: yes
-configure:15386: checking for valgrind
-configure:15415: result: no
-configure:15474: checking for g++
-configure:15490: found /usr/bin/g++
-configure:15500: result: g++
-configure:15516: checking for C++ compiler version
-configure:15519: g++ --version </dev/null >&5
-g++ (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
-Copyright (C) 2006 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.
-
-configure:15522: $? = 0
-configure:15524: g++ -v </dev/null >&5
-Using built-in specs.
-Target: i486-linux-gnu
-Configured with: ../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-awt=gtk-default --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --disable-werror --with-tune=pentium4 --enable-checking=release i486-linux-gnu
-Thread model: posix
-gcc version 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
-configure:15527: $? = 0
-configure:15529: g++ -V </dev/null >&5
-g++: '-V' option must have argument
-configure:15532: $? = 1
-configure:15535: checking whether we are using the GNU C++ compiler
-configure:15559: g++ -c   conftest.cc >&5
-configure:15565: $? = 0
-configure:15568: test -z 			 || test ! -s conftest.err
-configure:15571: $? = 0
-configure:15574: test -s conftest.o
-configure:15577: $? = 0
-configure:15590: result: yes
-configure:15596: checking whether g++ accepts -g
-configure:15617: g++ -c -g  conftest.cc >&5
-configure:15623: $? = 0
-configure:15626: test -z 			 || test ! -s conftest.err
-configure:15629: $? = 0
-configure:15632: test -s conftest.o
-configure:15635: $? = 0
-configure:15646: result: yes
-configure:15688: g++ -c -g -O2  conftest.cc >&5
-configure:15694: $? = 0
-configure:15697: test -z 			 || test ! -s conftest.err
-configure:15700: $? = 0
-configure:15703: test -s conftest.o
-configure:15706: $? = 0
-configure:15732: g++ -c -g -O2  conftest.cc >&5
-conftest.cc: In function 'int main()':
-conftest.cc:110: error: 'exit' was not declared in this scope
-configure:15738: $? = 1
-configure: failed program was:
-| /* confdefs.h.  */
-| 
-| #define PACKAGE_NAME "GNU Bison"
-| #define PACKAGE_TARNAME "bison"
-| #define PACKAGE_VERSION "2.3"
-| #define PACKAGE_STRING "GNU Bison 2.3"
-| #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-| #define PACKAGE "bison"
-| #define VERSION "2.3"
-| #define _GNU_SOURCE 1
-| #define STDC_HEADERS 1
-| #define HAVE_SYS_TYPES_H 1
-| #define HAVE_SYS_STAT_H 1
-| #define HAVE_STDLIB_H 1
-| #define HAVE_STRING_H 1
-| #define HAVE_MEMORY_H 1
-| #define HAVE_STRINGS_H 1
-| #define HAVE_INTTYPES_H 1
-| #define HAVE_STDINT_H 1
-| #define HAVE_UNISTD_H 1
-| #define __EXTENSIONS__ 1
-| #define _POSIX_PTHREAD_SEMANTICS 1
-| #define YYTEXT_POINTER 1
-| #define M4 "/usr/bin/m4"
-| #define HAVE_LOCALE_H 1
-| #define HAVE_WCHAR_H 1
-| #define HAVE_WCTYPE_H 1
-| #define HAVE__BOOL 1
-| #define HAVE_STDBOOL_H 1
-| #define HAVE_UINTPTR_T 1
-| #define HAVE_SETLOCALE 1
-| #define HAVE_ISASCII 1
-| #define HAVE_ISWPRINT 1
-| #define HAVE_MBSINIT 1
-| #define HAVE_SYS_WAIT_H 1
-| #define HAVE_DUP2 1
-| #define HAVE_WAITPID 1
-| #define HAVE_UNISTD_H 1
-| #define HAVE_FORK 1
-| #define HAVE_VFORK 1
-| #define HAVE_WORKING_VFORK 1
-| #define HAVE_WORKING_FORK 1
-| #define HAVE_SYS_TIME_H 1
-| #define HAVE_SYS_TIMES_H 1
-| #define HAVE_SYS_RESOURCE_H 1
-| #define HAVE_TIMES 1
-| #define HAVE_DECL_GETRUSAGE 1
-| #define HAVE_DECL_TIMES 1
-| #define HAVE_DECL_CLOCK 0
-| #define HAVE_DECL_SYSCONF 1
-| #define HAVE_CLOCK_T 1
-| #define HAVE_STRUCT_TMS 1
-| #define FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX 0
-| #define FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR 0
-| #define HAVE_DECL_STRERROR_R 1
-| #define HAVE_STRERROR_R 1
-| #define STRERROR_R_CHAR_P 1
-| #define HAVE_GETOPT_H 1
-| #define HAVE_GETOPT_LONG_ONLY 1
-| #define HAVE_DECL_GETENV 1
-| #define HAVE_INTTYPES_H_WITH_UINTMAX 1
-| #define HAVE_STDINT_H_WITH_UINTMAX 1
-| #define HAVE_UNSIGNED_LONG_LONG 1
-| #define HAVE_UINTMAX_T 1
-| #define HAVE_DECL_STRDUP 1
-| #define HAVE_DECL_STRNDUP 1
-| #define HAVE_DECL_STRNLEN 1
-| #define HAVE_DECL_CLEARERR_UNLOCKED 1
-| #define HAVE_DECL_FEOF_UNLOCKED 1
-| #define HAVE_DECL_FERROR_UNLOCKED 1
-| #define HAVE_DECL_FFLUSH_UNLOCKED 1
-| #define HAVE_DECL_FGETS_UNLOCKED 1
-| #define HAVE_DECL_FPUTC_UNLOCKED 1
-| #define HAVE_DECL_FPUTS_UNLOCKED 1
-| #define HAVE_DECL_FREAD_UNLOCKED 1
-| #define HAVE_DECL_FWRITE_UNLOCKED 1
-| #define HAVE_DECL_GETC_UNLOCKED 1
-| #define HAVE_DECL_GETCHAR_UNLOCKED 1
-| #define HAVE_DECL_PUTC_UNLOCKED 1
-| #define HAVE_DECL_PUTCHAR_UNLOCKED 1
-| #define ENABLE_NLS 1
-| #define HAVE_GETTEXT 1
-| #define HAVE_DCGETTEXT 1
-| #define HAVE_STDLIB_H 1
-| #define HAVE_MALLOC 1
-| #define HAVE_ISWCNTRL 1
-| #define HAVE_WCWIDTH 1
-| #define HAVE_MBRTOWC 1
-| #define HAVE_DECL_WCWIDTH 1
-| #define HAVE_DECL_MBSWIDTH_IN_WCHAR_H 0
-| #define HAVE_MBSTATE_T 1
-| #define HAVE_OBSTACK 1
-| #define HAVE_MBSTATE_T 1
-| #define HAVE_MBRTOWC 1
-| #define HAVE_STPCPY 1
-| #define HAVE_STRDUP 1
-| #define HAVE_STRERROR 1
-| #define HAVE_STRNDUP 1
-| #define HAVE_STRTOL 1
-| #define HAVE_STRTOUL 1
-| #define HAVE_STRVERSCMP 1
-| #define HAVE_UNISTD_H 1
-| #define USE_UNLOCKED_IO 1
-| #define YYENABLE_NLS 1
-| /* end confdefs.h.  */
-| 
-| int
-| main ()
-| {
-| exit (42);
-|   ;
-|   return 0;
-| }
-configure:15688: g++ -c -g -O2  conftest.cc >&5
-configure:15694: $? = 0
-configure:15697: test -z 			 || test ! -s conftest.err
-configure:15700: $? = 0
-configure:15703: test -s conftest.o
-configure:15706: $? = 0
-configure:15732: g++ -c -g -O2  conftest.cc >&5
-configure:15738: $? = 0
-configure:15741: test -z 			 || test ! -s conftest.err
-configure:15744: $? = 0
-configure:15747: test -s conftest.o
-configure:15750: $? = 0
-configure:15775: checking dependency style of g++
-configure:15865: result: gcc3
-configure:15884: checking whether g++ builds executables that work
-configure:15924: g++ -c -g -O2  conftest.cc >&5
-configure:15930: $? = 0
-configure:15933: test -z 			 || test ! -s conftest.err
-configure:15936: $? = 0
-configure:15939: test -s conftest.o
-configure:15942: $? = 0
-configure:15945: g++ -o conftest -g -O2   conftest.o  >&5
-configure:15948: $? = 0
-configure:15954: ./conftest
-configure:15957: $? = 0
-configure:15980: result: yes
-configure:16151: creating ./config.status
-
-## ---------------------- ##
-## Running config.status. ##
-## ---------------------- ##
-
-This file was extended by GNU Bison config.status 2.3, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
-
-  CONFIG_FILES    = 
-  CONFIG_HEADERS  = 
-  CONFIG_LINKS    = 
-  CONFIG_COMMANDS = 
-  $ ./config.status 
-
-on phanna.cnc.corp.google.com
-
-config.status:802: creating runtime-po/Makefile.in
-config.status:802: creating tests/Makefile
-config.status:802: creating tests/atlocal
-config.status:802: creating tests/bison
-config.status:802: creating Makefile
-config.status:802: creating build-aux/Makefile
-config.status:802: creating po/Makefile.in
-config.status:802: creating data/Makefile
-config.status:802: creating examples/Makefile
-config.status:802: creating examples/calc++/Makefile
-config.status:802: creating lib/Makefile
-config.status:802: creating src/Makefile
-config.status:802: creating doc/Makefile
-config.status:872: creating config.h
-config.status:1364: executing depfiles commands
-config.status:1364: executing default-1 commands
-config.status:1364: executing tests/atconfig commands
-
-## ---------------- ##
-## Cache variables. ##
-## ---------------- ##
-
-ac_cv_build=x86_64-unknown-linux-gnu
-ac_cv_build_alias=x86_64-unknown-linux-gnu
-ac_cv_c_compiler_gnu=yes
-ac_cv_c_inline=inline
-ac_cv_cxx_compiler_gnu=yes
-ac_cv_env_CC_set=
-ac_cv_env_CC_value=
-ac_cv_env_CFLAGS_set=
-ac_cv_env_CFLAGS_value=
-ac_cv_env_CPPFLAGS_set=
-ac_cv_env_CPPFLAGS_value=
-ac_cv_env_CPP_set=
-ac_cv_env_CPP_value=
-ac_cv_env_CXXFLAGS_set=
-ac_cv_env_CXXFLAGS_value=
-ac_cv_env_CXX_set=
-ac_cv_env_CXX_value=
-ac_cv_env_LDFLAGS_set=
-ac_cv_env_LDFLAGS_value=
-ac_cv_env_build_alias_set=
-ac_cv_env_build_alias_value=
-ac_cv_env_host_alias_set=
-ac_cv_env_host_alias_value=
-ac_cv_env_target_alias_set=
-ac_cv_env_target_alias_value=
-ac_cv_exeext=
-ac_cv_func_dup2=yes
-ac_cv_func_fork=yes
-ac_cv_func_fork_works=yes
-ac_cv_func_getopt_long_only=yes
-ac_cv_func_isascii=yes
-ac_cv_func_iswcntrl=yes
-ac_cv_func_iswprint=yes
-ac_cv_func_malloc_0_nonnull=yes
-ac_cv_func_mbsinit=yes
-ac_cv_func_obstack=yes
-ac_cv_func_setlocale=yes
-ac_cv_func_stpcpy=yes
-ac_cv_func_strdup=yes
-ac_cv_func_strerror=yes
-ac_cv_func_strerror_r=yes
-ac_cv_func_strerror_r_char_p=yes
-ac_cv_func_strnlen_working=yes
-ac_cv_func_strtol=yes
-ac_cv_func_strtoul=yes
-ac_cv_func_strverscmp=yes
-ac_cv_func_times=yes
-ac_cv_func_vfork=yes
-ac_cv_func_vfork_works=yes
-ac_cv_func_waitpid=yes
-ac_cv_func_wcwidth=yes
-ac_cv_have_decl_clearerr_unlocked=yes
-ac_cv_have_decl_clock=no
-ac_cv_have_decl_feof_unlocked=yes
-ac_cv_have_decl_ferror_unlocked=yes
-ac_cv_have_decl_fflush_unlocked=yes
-ac_cv_have_decl_fgets_unlocked=yes
-ac_cv_have_decl_fputc_unlocked=yes
-ac_cv_have_decl_fputs_unlocked=yes
-ac_cv_have_decl_fread_unlocked=yes
-ac_cv_have_decl_fwrite_unlocked=yes
-ac_cv_have_decl_getc_unlocked=yes
-ac_cv_have_decl_getchar_unlocked=yes
-ac_cv_have_decl_getenv=yes
-ac_cv_have_decl_getrusage=yes
-ac_cv_have_decl_mbswidth=no
-ac_cv_have_decl_optreset=no
-ac_cv_have_decl_putc_unlocked=yes
-ac_cv_have_decl_putchar_unlocked=yes
-ac_cv_have_decl_strdup=yes
-ac_cv_have_decl_strerror_r=yes
-ac_cv_have_decl_strndup=yes
-ac_cv_have_decl_strnlen=yes
-ac_cv_have_decl_sysconf=yes
-ac_cv_have_decl_times=yes
-ac_cv_have_decl_wcwidth=yes
-ac_cv_header_getopt_h=yes
-ac_cv_header_inttypes_h=yes
-ac_cv_header_locale_h=yes
-ac_cv_header_memory_h=yes
-ac_cv_header_minix_config_h=no
-ac_cv_header_stdbool_h=yes
-ac_cv_header_stdc=yes
-ac_cv_header_stdint_h=yes
-ac_cv_header_stdlib_h=yes
-ac_cv_header_string_h=yes
-ac_cv_header_strings_h=yes
-ac_cv_header_sys_resource_h=yes
-ac_cv_header_sys_stat_h=yes
-ac_cv_header_sys_time_h=yes
-ac_cv_header_sys_times_h=yes
-ac_cv_header_sys_types_h=yes
-ac_cv_header_sys_wait_h=yes
-ac_cv_header_unistd_h=yes
-ac_cv_header_vfork_h=no
-ac_cv_header_wchar_h=yes
-ac_cv_header_wctype_h=yes
-ac_cv_host=x86_64-unknown-linux-gnu
-ac_cv_host_alias=x86_64-unknown-linux-gnu
-ac_cv_lib_error_at_line=yes
-ac_cv_lib_fl_yywrap=yes
-ac_cv_objext=o
-ac_cv_path_GMSGFMT=/usr/bin/msgfmt
-ac_cv_path_M4=/usr/bin/m4
-ac_cv_path_MSGFMT=/usr/bin/msgfmt
-ac_cv_path_MSGMERGE=/usr/bin/msgmerge
-ac_cv_path_XGETTEXT=/usr/bin/xgettext
-ac_cv_path_install='/usr/bin/install -c'
-ac_cv_prog_AWK=gawk
-ac_cv_prog_CPP='gcc -E'
-ac_cv_prog_LEX=flex
-ac_cv_prog_YACC='bison -y'
-ac_cv_prog_ac_ct_CC=gcc
-ac_cv_prog_ac_ct_CXX=g++
-ac_cv_prog_ac_ct_RANLIB=ranlib
-ac_cv_prog_cc_g=yes
-ac_cv_prog_cc_stdc=
-ac_cv_prog_cxx_g=yes
-ac_cv_prog_egrep='grep -E'
-ac_cv_prog_gnu_m4=yes
-ac_cv_prog_lex_root=lex.yy
-ac_cv_prog_lex_yytext_pointer=yes
-ac_cv_prog_make_make_set=yes
-ac_cv_safe_to_define___extensions__=yes
-ac_cv_type__Bool=yes
-ac_cv_type_clock_t=yes
-ac_cv_type_mbstate_t=yes
-ac_cv_type_pid_t=yes
-ac_cv_type_struct_tms=yes
-ac_cv_type_uintptr_t=yes
-ac_cv_type_unsigned_long_long=yes
-ac_cv_win_or_dos=no
-acl_cv_hardcode_direct=no
-acl_cv_hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-acl_cv_hardcode_libdir_separator=
-acl_cv_hardcode_minus_L=no
-acl_cv_libext=a
-acl_cv_path_LD=/usr/bin/ld
-acl_cv_prog_gnu_ld=yes
-acl_cv_rpath=done
-acl_cv_shlibext=so
-acl_cv_wl=-Wl,
-am_cv_CC_dependencies_compiler_type=gcc3
-am_cv_CXX_dependencies_compiler_type=gcc3
-am_cv_prog_cc_stdc=
-bison_cv_cxx_works=yes
-gl_cv_func_gnu_getopt=yes
-gl_cv_func_mbrtowc=yes
-gl_cv_func_strndup=yes
-gl_cv_header_inttypes_h=yes
-gl_cv_header_stdint_h=yes
-gt_cv_func_CFLocaleCopyCurrent=no
-gt_cv_func_CFPreferencesCopyAppValue=no
-gt_cv_func_gnugettext1_libc=yes
-
-## ----------------- ##
-## Output variables. ##
-## ----------------- ##
-
-ACLOCAL='${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run aclocal-1.9'
-AMDEPBACKSLASH='\'
-AMDEP_FALSE='#'
-AMDEP_TRUE=''
-AMTAR='${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run tar'
-AUTOCONF='${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoconf'
-AUTOHEADER='${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoheader'
-AUTOM4TE='${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autom4te'
-AUTOMAKE='${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run automake-1.9'
-AWK='gawk'
-BISON_CXX_WORKS=':'
-BISON_CXX_WORKS_FALSE='#'
-BISON_CXX_WORKS_TRUE=''
-BISON_LOCALEDIR='/usr/share/locale'
-CC='gcc'
-CCDEPMODE='depmode=gcc3'
-CFLAGS='-g -O2'
-CPP='gcc -E'
-CPPFLAGS=''
-CXX='g++'
-CXXDEPMODE='depmode=gcc3'
-CXXFLAGS='-g -O2'
-CYGPATH_W='echo'
-DEFS='-DHAVE_CONFIG_H'
-DEPDIR='.deps'
-ECHO_C=''
-ECHO_N='-n'
-ECHO_T=''
-EGREP='grep -E'
-EXEEXT=''
-GCC='yes'
-GETOPT_H=''
-GMSGFMT='/usr/bin/msgfmt'
-HAVE__BOOL='1'
-INSTALL_DATA='${INSTALL} -m 644'
-INSTALL_PROGRAM='${INSTALL}'
-INSTALL_SCRIPT='${INSTALL}'
-INSTALL_STRIP_PROGRAM='${SHELL} $(install_sh) -c -s'
-INTLLIBS=''
-INTL_MACOSX_LIBS=''
-LDFLAGS=''
-LEX='flex'
-LEXLIB='-lfl'
-LEX_OUTPUT_ROOT='lex.yy'
-LIBICONV='-liconv'
-LIBINTL=''
-LIBOBJS=' dirname$U.o exitfail$U.o hard-locale$U.o hash$U.o quote$U.o quotearg$U.o fopen-safer$U.o dup-safer$U.o fd-safer$U.o pipe-safer$U.o xmalloc$U.o'
-LIBS=''
-LTLIBICONV='-liconv'
-LTLIBINTL=''
-LTLIBOBJS=' dirname$U.lo exitfail$U.lo hard-locale$U.lo hash$U.lo quote$U.lo quotearg$U.lo fopen-safer$U.lo dup-safer$U.lo fd-safer$U.lo pipe-safer$U.lo xmalloc$U.lo'
-M4='/usr/bin/m4'
-MAKEINFO='${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run makeinfo'
-MKINSTALLDIRS='$(top_builddir)/build-aux/mkinstalldirs'
-MSGFMT='/usr/bin/msgfmt'
-MSGMERGE='/usr/bin/msgmerge'
-O0CFLAGS='-g '
-O0CXXFLAGS='-g '
-OBJEXT='o'
-PACKAGE='bison'
-PACKAGE_BUGREPORT='bug-bison@gnu.org'
-PACKAGE_NAME='GNU Bison'
-PACKAGE_STRING='GNU Bison 2.3'
-PACKAGE_TARNAME='bison'
-PACKAGE_VERSION='2.3'
-PATH_SEPARATOR=':'
-POSUB='po'
-RANLIB='ranlib'
-SET_MAKE=''
-SHELL='/bin/sh'
-STDBOOL_H=''
-STRIP=''
-UNISTD_H=''
-USE_NLS='yes'
-VALGRIND=''
-VERSION='2.3'
-WARNING_CFLAGS=''
-WARNING_CXXFLAGS=''
-WERROR_CFLAGS=''
-XGETTEXT='/usr/bin/xgettext'
-YACC='bison -y'
-YACC_LIBRARY='liby.a'
-YACC_SCRIPT='yacc'
-ac_ct_CC='gcc'
-ac_ct_CXX='g++'
-ac_ct_RANLIB='ranlib'
-ac_ct_STRIP=''
-aclocaldir='${datadir}/aclocal'
-am__fastdepCC_FALSE='#'
-am__fastdepCC_TRUE=''
-am__fastdepCXX_FALSE='#'
-am__fastdepCXX_TRUE=''
-am__include='include'
-am__leading_dot='.'
-am__quote=''
-am__tar='${AMTAR} chof - "$$tardir"'
-am__untar='${AMTAR} xf -'
-bindir='${exec_prefix}/bin'
-build='x86_64-unknown-linux-gnu'
-build_alias=''
-build_cpu='x86_64'
-build_os='linux-gnu'
-build_vendor='unknown'
-datadir='${prefix}/share'
-exec_prefix='${prefix}'
-host='x86_64-unknown-linux-gnu'
-host_alias=''
-host_cpu='x86_64'
-host_os='linux-gnu'
-host_vendor='unknown'
-includedir='${prefix}/include'
-infodir='${prefix}/info'
-install_sh='/usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/install-sh'
-libdir='${exec_prefix}/lib'
-libexecdir='${exec_prefix}/libexec'
-localstatedir='${prefix}/var'
-mandir='${prefix}/man'
-mkdir_p='mkdir -p --'
-oldincludedir='/usr/include'
-prefix='/home/phanna/src/bison'
-program_transform_name='s,x,x,'
-sbindir='${exec_prefix}/sbin'
-sharedstatedir='${prefix}/com'
-sysconfdir='${prefix}/etc'
-target_alias=''
-
-## ----------- ##
-## confdefs.h. ##
-## ----------- ##
-
-#define ENABLE_NLS 1
-#define FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX 0
-#define FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR 0
-#define HAVE_CLOCK_T 1
-#define HAVE_DCGETTEXT 1
-#define HAVE_DECL_CLEARERR_UNLOCKED 1
-#define HAVE_DECL_CLOCK 0
-#define HAVE_DECL_FEOF_UNLOCKED 1
-#define HAVE_DECL_FERROR_UNLOCKED 1
-#define HAVE_DECL_FFLUSH_UNLOCKED 1
-#define HAVE_DECL_FGETS_UNLOCKED 1
-#define HAVE_DECL_FPUTC_UNLOCKED 1
-#define HAVE_DECL_FPUTS_UNLOCKED 1
-#define HAVE_DECL_FREAD_UNLOCKED 1
-#define HAVE_DECL_FWRITE_UNLOCKED 1
-#define HAVE_DECL_GETCHAR_UNLOCKED 1
-#define HAVE_DECL_GETC_UNLOCKED 1
-#define HAVE_DECL_GETENV 1
-#define HAVE_DECL_GETRUSAGE 1
-#define HAVE_DECL_MBSWIDTH_IN_WCHAR_H 0
-#define HAVE_DECL_PUTCHAR_UNLOCKED 1
-#define HAVE_DECL_PUTC_UNLOCKED 1
-#define HAVE_DECL_STRDUP 1
-#define HAVE_DECL_STRERROR_R 1
-#define HAVE_DECL_STRNDUP 1
-#define HAVE_DECL_STRNLEN 1
-#define HAVE_DECL_SYSCONF 1
-#define HAVE_DECL_TIMES 1
-#define HAVE_DECL_WCWIDTH 1
-#define HAVE_DUP2 1
-#define HAVE_FORK 1
-#define HAVE_GETOPT_H 1
-#define HAVE_GETOPT_LONG_ONLY 1
-#define HAVE_GETTEXT 1
-#define HAVE_INTTYPES_H 1
-#define HAVE_INTTYPES_H_WITH_UINTMAX 1
-#define HAVE_ISASCII 1
-#define HAVE_ISWCNTRL 1
-#define HAVE_ISWPRINT 1
-#define HAVE_LOCALE_H 1
-#define HAVE_MALLOC 1
-#define HAVE_MBRTOWC 1
-#define HAVE_MBRTOWC 1
-#define HAVE_MBSINIT 1
-#define HAVE_MBSTATE_T 1
-#define HAVE_MBSTATE_T 1
-#define HAVE_MEMORY_H 1
-#define HAVE_OBSTACK 1
-#define HAVE_SETLOCALE 1
-#define HAVE_STDBOOL_H 1
-#define HAVE_STDINT_H 1
-#define HAVE_STDINT_H_WITH_UINTMAX 1
-#define HAVE_STDLIB_H 1
-#define HAVE_STDLIB_H 1
-#define HAVE_STPCPY 1
-#define HAVE_STRDUP 1
-#define HAVE_STRERROR 1
-#define HAVE_STRERROR_R 1
-#define HAVE_STRINGS_H 1
-#define HAVE_STRING_H 1
-#define HAVE_STRNDUP 1
-#define HAVE_STRTOL 1
-#define HAVE_STRTOUL 1
-#define HAVE_STRUCT_TMS 1
-#define HAVE_STRVERSCMP 1
-#define HAVE_SYS_RESOURCE_H 1
-#define HAVE_SYS_STAT_H 1
-#define HAVE_SYS_TIMES_H 1
-#define HAVE_SYS_TIME_H 1
-#define HAVE_SYS_TYPES_H 1
-#define HAVE_SYS_WAIT_H 1
-#define HAVE_TIMES 1
-#define HAVE_UINTMAX_T 1
-#define HAVE_UINTPTR_T 1
-#define HAVE_UNISTD_H 1
-#define HAVE_UNISTD_H 1
-#define HAVE_UNISTD_H 1
-#define HAVE_UNSIGNED_LONG_LONG 1
-#define HAVE_VFORK 1
-#define HAVE_WAITPID 1
-#define HAVE_WCHAR_H 1
-#define HAVE_WCTYPE_H 1
-#define HAVE_WCWIDTH 1
-#define HAVE_WORKING_FORK 1
-#define HAVE_WORKING_VFORK 1
-#define HAVE__BOOL 1
-#define M4 "/usr/bin/m4"
-#define PACKAGE "bison"
-#define PACKAGE_BUGREPORT "bug-bison@gnu.org"
-#define PACKAGE_NAME "GNU Bison"
-#define PACKAGE_STRING "GNU Bison 2.3"
-#define PACKAGE_TARNAME "bison"
-#define PACKAGE_VERSION "2.3"
-#define STDC_HEADERS 1
-#define STRERROR_R_CHAR_P 1
-#define USE_UNLOCKED_IO 1
-#define VERSION "2.3"
-#define YYENABLE_NLS 1
-#define YYTEXT_POINTER 1
-#define _GNU_SOURCE 1
-#define _POSIX_PTHREAD_SEMANTICS 1
-#define __EXTENSIONS__ 1
-#endif
-#ifdef __cplusplus
-extern "C" void std::exit (int) throw (); using std::exit;
-
-configure: exit 0
diff --git a/config.status b/config.status
deleted file mode 100755
index 0c4904a..0000000
--- a/config.status
+++ /dev/null
@@ -1,1587 +0,0 @@
-#! /bin/sh
-# Generated by configure.
-# 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-/bin/sh}
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
-
-
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
-echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
-    sed '
-      N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
-      t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
-    ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
-echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
-   { (exit 1); exit 1; }; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
-  # Exit status is that of the last command.
-  exit
-}
-
-
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
-    as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-as_executable_p="test -f"
-
-# 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'"
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
-exec 6>&1
-
-# Open the log real soon, to keep \$[0] and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.  Logging --version etc. is OK.
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-} >&5
-cat >&5 <<_CSEOF
-
-This file was extended by GNU Bison $as_me 2.3, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-_CSEOF
-echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
-echo >&5
-config_files=" runtime-po/Makefile.in tests/Makefile tests/atlocal tests/bison Makefile build-aux/Makefile po/Makefile.in data/Makefile examples/Makefile examples/calc++/Makefile lib/Makefile src/Makefile doc/Makefile"
-config_headers=" config.h:config.hin"
-config_commands=" depfiles default-1 tests/atconfig"
-
-ac_cs_usage="\
-\`$as_me' instantiates files from templates according to the
-current configuration.
-
-Usage: $0 [OPTIONS] [FILE]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number, then exit
-  -q, --quiet      do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-  --file=FILE[:TEMPLATE]
-		   instantiate the configuration file FILE
-  --header=FILE[:TEMPLATE]
-		   instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Configuration commands:
-$config_commands
-
-Report bugs to <bug-autoconf@gnu.org>."
-ac_cs_version="\
-GNU Bison config.status 2.3
-configured by ./configure, generated by GNU Autoconf 2.59,
-  with options \"'--prefix' '/home/phanna/src/bison'\"
-
-Copyright (C) 2003 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-srcdir=.
-INSTALL="/usr/bin/install -c"
-# If no file are specified by the user, then we need to provide default
-# value.  By we need to know if files were specified by the user.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=*)
-    ac_option=`expr "x$1" : 'x\([^=]*\)='`
-    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  -*)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  *) # This is not an option, so the user has probably given explicit
-     # arguments.
-     ac_option=$1
-     ac_need_defaults=false;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --vers* | -V )
-    echo "$ac_cs_version"; exit 0 ;;
-  --he | --h)
-    # Conflict between --help and --header
-    { { echo "$as_me:$LINENO: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; };;
-  --help | --hel | -h )
-    echo "$ac_cs_usage"; exit 0 ;;
-  --debug | --d* | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
-    ac_need_defaults=false;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; } ;;
-
-  *) ac_config_targets="$ac_config_targets $1" ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-if $ac_cs_recheck; then
-  echo "running /bin/sh ./configure " '--prefix' '/home/phanna/src/bison' $ac_configure_extra_args " --no-create --no-recursion" >&6
-  exec /bin/sh ./configure '--prefix' '/home/phanna/src/bison' $ac_configure_extra_args --no-create --no-recursion
-fi
-
-#
-# INIT-COMMANDS section.
-#
-
-AMDEP_TRUE="" ac_aux_dir="build-aux"
-# Capture the value of obsolete ALL_LINGUAS because we need it to compute
-    # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
-    # from automake.
-    eval 'OBSOLETE_ALL_LINGUAS''=""'
-    # Capture the value of LINGUAS because we need it to compute CATALOGS.
-    LINGUAS="%UNSET%"
-
-
-for ac_config_target in $ac_config_targets
-do
-  case "$ac_config_target" in
-  # Handling of arguments.
-  "runtime-po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES runtime-po/Makefile.in" ;;
-  "tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
-  "tests/atlocal" ) CONFIG_FILES="$CONFIG_FILES tests/atlocal" ;;
-  "tests/bison" ) CONFIG_FILES="$CONFIG_FILES tests/bison" ;;
-  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-  "build-aux/Makefile" ) CONFIG_FILES="$CONFIG_FILES build-aux/Makefile" ;;
-  "po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
-  "data/Makefile" ) CONFIG_FILES="$CONFIG_FILES data/Makefile" ;;
-  "examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
-  "examples/calc++/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/calc++/Makefile" ;;
-  "lib/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;;
-  "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
-  "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
-  "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-  "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
-  "tests/atconfig" ) CONFIG_COMMANDS="$CONFIG_COMMANDS tests/atconfig" ;;
-  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.hin" ;;
-  *) { { 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
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason to put it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Create a temporary directory, and hook for its removal unless debugging.
-$debug ||
-{
-  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
-  trap '{ (exit 1); exit 1; }' 1 2 13 15
-}
-
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./confstat$$-$RANDOM
-  (umask 077 && mkdir $tmp)
-} ||
-{
-   echo "$me: cannot create a temporary directory in ." >&2
-   { (exit 1); exit 1; }
-}
-
-
-#
-# CONFIG_FILES section.
-#
-
-# No need to generate the scripts if there are no CONFIG_FILES.
-# This happens for instance when ./config.status config.h
-if test -n "$CONFIG_FILES"; then
-  # Protect against being on the right side of a sed subst in config.status.
-  sed 's/,@/@@/; s/@,/@@/; s/,;t t$/@;t t/; /@;t t$/s/[\\&,]/\\&/g;
-   s/@@/,@/; s/@@/@,/; s/@;t t$/,;t t/' >$tmp/subs.sed <<\CEOF
-s,@SHELL@,/bin/sh,;t t
-s,@PATH_SEPARATOR@,:,;t t
-s,@PACKAGE_NAME@,GNU Bison,;t t
-s,@PACKAGE_TARNAME@,bison,;t t
-s,@PACKAGE_VERSION@,2.3,;t t
-s,@PACKAGE_STRING@,GNU Bison 2.3,;t t
-s,@PACKAGE_BUGREPORT@,bug-bison@gnu.org,;t t
-s,@exec_prefix@,${prefix},;t t
-s,@prefix@,/home/phanna/src/bison,;t t
-s,@program_transform_name@,s,x,x,,;t t
-s,@bindir@,${exec_prefix}/bin,;t t
-s,@sbindir@,${exec_prefix}/sbin,;t t
-s,@libexecdir@,${exec_prefix}/libexec,;t t
-s,@datadir@,${prefix}/share,;t t
-s,@sysconfdir@,${prefix}/etc,;t t
-s,@sharedstatedir@,${prefix}/com,;t t
-s,@localstatedir@,${prefix}/var,;t t
-s,@libdir@,${exec_prefix}/lib,;t t
-s,@includedir@,${prefix}/include,;t t
-s,@oldincludedir@,/usr/include,;t t
-s,@infodir@,${prefix}/info,;t t
-s,@mandir@,${prefix}/man,;t t
-s,@build_alias@,,;t t
-s,@host_alias@,,;t t
-s,@target_alias@,,;t t
-s,@DEFS@,-DHAVE_CONFIG_H,;t t
-s,@ECHO_C@,,;t t
-s,@ECHO_N@,-n,;t t
-s,@ECHO_T@,,;t t
-s,@LIBS@,,;t t
-s,@INSTALL_PROGRAM@,${INSTALL},;t t
-s,@INSTALL_SCRIPT@,${INSTALL},;t t
-s,@INSTALL_DATA@,${INSTALL} -m 644,;t t
-s,@CYGPATH_W@,echo,;t t
-s,@PACKAGE@,bison,;t t
-s,@VERSION@,2.3,;t t
-s,@ACLOCAL@,${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run aclocal-1.9,;t t
-s,@AUTOCONF@,${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoconf,;t t
-s,@AUTOMAKE@,${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run automake-1.9,;t t
-s,@AUTOHEADER@,${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoheader,;t t
-s,@MAKEINFO@,${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run makeinfo,;t t
-s,@install_sh@,/usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/install-sh,;t t
-s,@STRIP@,,;t t
-s,@ac_ct_STRIP@,,;t t
-s,@INSTALL_STRIP_PROGRAM@,${SHELL} $(install_sh) -c -s,;t t
-s,@mkdir_p@,mkdir -p --,;t t
-s,@AWK@,gawk,;t t
-s,@SET_MAKE@,,;t t
-s,@am__leading_dot@,.,;t t
-s,@AMTAR@,${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run tar,;t t
-s,@am__tar@,${AMTAR} chof - "$$tardir",;t t
-s,@am__untar@,${AMTAR} xf -,;t t
-s,@CC@,gcc,;t t
-s,@CFLAGS@,-g -O2,;t t
-s,@LDFLAGS@,,;t t
-s,@CPPFLAGS@,,;t t
-s,@ac_ct_CC@,gcc,;t t
-s,@EXEEXT@,,;t t
-s,@OBJEXT@,o,;t t
-s,@DEPDIR@,.deps,;t t
-s,@am__include@,include,;t t
-s,@am__quote@,,;t t
-s,@AMDEP_TRUE@,,;t t
-s,@AMDEP_FALSE@,#,;t t
-s,@AMDEPBACKSLASH@,\,;t t
-s,@CCDEPMODE@,depmode=gcc3,;t t
-s,@am__fastdepCC_TRUE@,,;t t
-s,@am__fastdepCC_FALSE@,#,;t t
-s,@CPP@,gcc -E,;t t
-s,@EGREP@,grep -E,;t t
-s,@WARNING_CFLAGS@,,;t t
-s,@WERROR_CFLAGS@,,;t t
-s,@WARNING_CXXFLAGS@,,;t t
-s,@YACC_SCRIPT@,yacc,;t t
-s,@YACC_LIBRARY@,liby.a,;t t
-s,@LEX@,flex,;t t
-s,@LEXLIB@,-lfl,;t t
-s,@LEX_OUTPUT_ROOT@,lex.yy,;t t
-s,@YACC@,bison -y,;t t
-s,@RANLIB@,ranlib,;t t
-s,@ac_ct_RANLIB@,ranlib,;t t
-s,@M4@,/usr/bin/m4,;t t
-s,@STDBOOL_H@,,;t t
-s,@HAVE__BOOL@,1,;t t
-s,@LIBOBJS@, dirname$U.o exitfail$U.o hard-locale$U.o hash$U.o quote$U.o quotearg$U.o fopen-safer$U.o dup-safer$U.o fd-safer$U.o pipe-safer$U.o xmalloc$U.o,;t t
-s,@GETOPT_H@,,;t t
-s,@MKINSTALLDIRS@,$(top_builddir)/build-aux/mkinstalldirs,;t t
-s,@USE_NLS@,yes,;t t
-s,@MSGFMT@,/usr/bin/msgfmt,;t t
-s,@GMSGFMT@,/usr/bin/msgfmt,;t t
-s,@XGETTEXT@,/usr/bin/xgettext,;t t
-s,@MSGMERGE@,/usr/bin/msgmerge,;t t
-s,@build@,x86_64-unknown-linux-gnu,;t t
-s,@build_cpu@,x86_64,;t t
-s,@build_vendor@,unknown,;t t
-s,@build_os@,linux-gnu,;t t
-s,@host@,x86_64-unknown-linux-gnu,;t t
-s,@host_cpu@,x86_64,;t t
-s,@host_vendor@,unknown,;t t
-s,@host_os@,linux-gnu,;t t
-s,@INTL_MACOSX_LIBS@,,;t t
-s,@LIBICONV@,-liconv,;t t
-s,@LTLIBICONV@,-liconv,;t t
-s,@INTLLIBS@,,;t t
-s,@LIBINTL@,,;t t
-s,@LTLIBINTL@,,;t t
-s,@POSUB@,po,;t t
-s,@UNISTD_H@,,;t t
-s,@BISON_LOCALEDIR@,/usr/share/locale,;t t
-s,@aclocaldir@,${datadir}/aclocal,;t t
-s,@VALGRIND@,,;t t
-s,@CXX@,g++,;t t
-s,@CXXFLAGS@,-g -O2,;t t
-s,@ac_ct_CXX@,g++,;t t
-s,@CXXDEPMODE@,depmode=gcc3,;t t
-s,@am__fastdepCXX_TRUE@,,;t t
-s,@am__fastdepCXX_FALSE@,#,;t t
-s,@BISON_CXX_WORKS@,:,;t t
-s,@BISON_CXX_WORKS_TRUE@,,;t t
-s,@BISON_CXX_WORKS_FALSE@,#,;t t
-s,@AUTOM4TE@,${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autom4te,;t t
-s,@GCC@,yes,;t t
-s,@O0CFLAGS@,-g ,;t t
-s,@O0CXXFLAGS@,-g ,;t t
-s,@LTLIBOBJS@, dirname$U.lo exitfail$U.lo hard-locale$U.lo hash$U.lo quote$U.lo quotearg$U.lo fopen-safer$U.lo dup-safer$U.lo fd-safer$U.lo pipe-safer$U.lo xmalloc$U.lo,;t t
-CEOF
-
-  # Split the substitutions into bite-sized pieces for seds with
-  # small command number limits, like on Digital OSF/1 and HP-UX.
-  ac_max_sed_lines=48
-  ac_sed_frag=1 # Number of current file.
-  ac_beg=1 # First line for current file.
-  ac_end=$ac_max_sed_lines # Line after last line for current file.
-  ac_more_lines=:
-  ac_sed_cmds=
-  while $ac_more_lines; do
-    if test $ac_beg -gt 1; then
-      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    else
-      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    fi
-    if test ! -s $tmp/subs.frag; then
-      ac_more_lines=false
-    else
-      # The purpose of the label and of the branching condition is to
-      # speed up the sed processing (if there are no `@' at all, there
-      # is no need to browse any of the substitutions).
-      # These are the two extra sed commands mentioned above.
-      (echo ':t
-  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
-      if test -z "$ac_sed_cmds"; then
-	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
-      else
-	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
-      fi
-      ac_sed_frag=`expr $ac_sed_frag + 1`
-      ac_beg=$ac_end
-      ac_end=`expr $ac_end + $ac_max_sed_lines`
-    fi
-  done
-  if test -z "$ac_sed_cmds"; then
-    ac_sed_cmds=cat
-  fi
-fi # test -n "$CONFIG_FILES"
-
-for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
-  esac
-
-  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
-  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-  ac_builddir=.
-
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
-  esac
-
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    configure_input=
-  else
-    configure_input="$ac_file.  "
-  fi
-  configure_input=$configure_input"Generated from `echo $ac_file_in |
-				     sed 's,.*/,,'` by configure."
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-
-  if test x"$ac_file" != x-; then
-    { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-    rm -f "$ac_file"
-  fi
-  sed "/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/;
-s/:*\${srcdir}:*/:/;
-s/:*@srcdir@:*/:/;
-s/^\([^=]*=[	 ]*\):*/\1/;
-s/:*$//;
-s/^[^=]*=[	 ]*$//;
-}
-
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s,@configure_input@,$configure_input,;t t
-s,@srcdir@,$ac_srcdir,;t t
-s,@abs_srcdir@,$ac_abs_srcdir,;t t
-s,@top_srcdir@,$ac_top_srcdir,;t t
-s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
-s,@builddir@,$ac_builddir,;t t
-s,@abs_builddir@,$ac_abs_builddir,;t t
-s,@top_builddir@,$ac_top_builddir,;t t
-s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
-s,@INSTALL@,$ac_INSTALL,;t t
-" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
-  rm -f $tmp/stdin
-  if test x"$ac_file" != x-; then
-    mv $tmp/out $ac_file
-  else
-    cat $tmp/out
-    rm -f $tmp/out
-  fi
-
-  # Run the commands associated with the file.
-  case $ac_file in
-    tests/bison ) chmod +x tests/bison ;;
-  esac
-done
-
-#
-# CONFIG_HEADER section.
-#
-
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
-ac_dB='[	 ].*$,\1#\2'
-ac_dC=' '
-ac_dD=',;t'
-# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
-ac_uB='$,\1#\2define\3'
-ac_uC=' '
-ac_uD=',;t'
-
-for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
-  esac
-
-  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 # Do quote $f, to prevent DOS paths from being IFS'd.
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-  # Remove the trailing spaces.
-  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
-
-  # Handle all the #define templates only if necessary.
-  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then
-  # If there are no defines, we may have an empty if/fi
-  :
-  cat >$tmp/defines.sed <<CEOF
-/^[	 ]*#[	 ]*define/!b
-t clr
-: clr
-${ac_dA}PACKAGE_NAME${ac_dB}PACKAGE_NAME${ac_dC}"GNU Bison"${ac_dD}
-${ac_dA}PACKAGE_TARNAME${ac_dB}PACKAGE_TARNAME${ac_dC}"bison"${ac_dD}
-${ac_dA}PACKAGE_VERSION${ac_dB}PACKAGE_VERSION${ac_dC}"2.3"${ac_dD}
-${ac_dA}PACKAGE_STRING${ac_dB}PACKAGE_STRING${ac_dC}"GNU Bison 2.3"${ac_dD}
-${ac_dA}PACKAGE_BUGREPORT${ac_dB}PACKAGE_BUGREPORT${ac_dC}"bug-bison@gnu.org"${ac_dD}
-${ac_dA}PACKAGE${ac_dB}PACKAGE${ac_dC}"bison"${ac_dD}
-${ac_dA}VERSION${ac_dB}VERSION${ac_dC}"2.3"${ac_dD}
-${ac_dA}_GNU_SOURCE${ac_dB}_GNU_SOURCE${ac_dC}1${ac_dD}
-${ac_dA}STDC_HEADERS${ac_dB}STDC_HEADERS${ac_dC}1${ac_dD}
-${ac_dA}HAVE_SYS_TYPES_H${ac_dB}HAVE_SYS_TYPES_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_SYS_STAT_H${ac_dB}HAVE_SYS_STAT_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STDLIB_H${ac_dB}HAVE_STDLIB_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STRING_H${ac_dB}HAVE_STRING_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_MEMORY_H${ac_dB}HAVE_MEMORY_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STRINGS_H${ac_dB}HAVE_STRINGS_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_INTTYPES_H${ac_dB}HAVE_INTTYPES_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STDINT_H${ac_dB}HAVE_STDINT_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_UNISTD_H${ac_dB}HAVE_UNISTD_H${ac_dC}1${ac_dD}
-${ac_dA}__EXTENSIONS__${ac_dB}__EXTENSIONS__${ac_dC}1${ac_dD}
-${ac_dA}_POSIX_PTHREAD_SEMANTICS${ac_dB}_POSIX_PTHREAD_SEMANTICS${ac_dC}1${ac_dD}
-${ac_dA}YYTEXT_POINTER${ac_dB}YYTEXT_POINTER${ac_dC}1${ac_dD}
-${ac_dA}M4${ac_dB}M4${ac_dC}"/usr/bin/m4"${ac_dD}
-${ac_dA}HAVE_LOCALE_H${ac_dB}HAVE_LOCALE_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_WCHAR_H${ac_dB}HAVE_WCHAR_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_WCTYPE_H${ac_dB}HAVE_WCTYPE_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE__BOOL${ac_dB}HAVE__BOOL${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STDBOOL_H${ac_dB}HAVE_STDBOOL_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_UINTPTR_T${ac_dB}HAVE_UINTPTR_T${ac_dC}1${ac_dD}
-${ac_dA}HAVE_SETLOCALE${ac_dB}HAVE_SETLOCALE${ac_dC}1${ac_dD}
-${ac_dA}HAVE_ISASCII${ac_dB}HAVE_ISASCII${ac_dC}1${ac_dD}
-${ac_dA}HAVE_ISWPRINT${ac_dB}HAVE_ISWPRINT${ac_dC}1${ac_dD}
-${ac_dA}HAVE_MBSINIT${ac_dB}HAVE_MBSINIT${ac_dC}1${ac_dD}
-${ac_dA}HAVE_SYS_WAIT_H${ac_dB}HAVE_SYS_WAIT_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DUP2${ac_dB}HAVE_DUP2${ac_dC}1${ac_dD}
-${ac_dA}HAVE_WAITPID${ac_dB}HAVE_WAITPID${ac_dC}1${ac_dD}
-${ac_dA}HAVE_UNISTD_H${ac_dB}HAVE_UNISTD_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_FORK${ac_dB}HAVE_FORK${ac_dC}1${ac_dD}
-${ac_dA}HAVE_VFORK${ac_dB}HAVE_VFORK${ac_dC}1${ac_dD}
-CEOF
-  sed -f $tmp/defines.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-
-  cat >$tmp/defines.sed <<CEOF
-/^[	 ]*#[	 ]*define/!b
-t clr
-: clr
-${ac_dA}HAVE_WORKING_VFORK${ac_dB}HAVE_WORKING_VFORK${ac_dC}1${ac_dD}
-${ac_dA}HAVE_WORKING_FORK${ac_dB}HAVE_WORKING_FORK${ac_dC}1${ac_dD}
-${ac_dA}HAVE_SYS_TIME_H${ac_dB}HAVE_SYS_TIME_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_SYS_TIMES_H${ac_dB}HAVE_SYS_TIMES_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_SYS_RESOURCE_H${ac_dB}HAVE_SYS_RESOURCE_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_TIMES${ac_dB}HAVE_TIMES${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_GETRUSAGE${ac_dB}HAVE_DECL_GETRUSAGE${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_TIMES${ac_dB}HAVE_DECL_TIMES${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_CLOCK${ac_dB}HAVE_DECL_CLOCK${ac_dC}0${ac_dD}
-${ac_dA}HAVE_DECL_SYSCONF${ac_dB}HAVE_DECL_SYSCONF${ac_dC}1${ac_dD}
-${ac_dA}HAVE_CLOCK_T${ac_dB}HAVE_CLOCK_T${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STRUCT_TMS${ac_dB}HAVE_STRUCT_TMS${ac_dC}1${ac_dD}
-${ac_dA}FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX${ac_dB}FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX${ac_dC}0${ac_dD}
-${ac_dA}FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR${ac_dB}FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR${ac_dC}0${ac_dD}
-${ac_dA}HAVE_DECL_STRERROR_R${ac_dB}HAVE_DECL_STRERROR_R${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STRERROR_R${ac_dB}HAVE_STRERROR_R${ac_dC}1${ac_dD}
-${ac_dA}STRERROR_R_CHAR_P${ac_dB}STRERROR_R_CHAR_P${ac_dC}1${ac_dD}
-${ac_dA}HAVE_GETOPT_H${ac_dB}HAVE_GETOPT_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_GETOPT_LONG_ONLY${ac_dB}HAVE_GETOPT_LONG_ONLY${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_GETENV${ac_dB}HAVE_DECL_GETENV${ac_dC}1${ac_dD}
-${ac_dA}HAVE_INTTYPES_H_WITH_UINTMAX${ac_dB}HAVE_INTTYPES_H_WITH_UINTMAX${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STDINT_H_WITH_UINTMAX${ac_dB}HAVE_STDINT_H_WITH_UINTMAX${ac_dC}1${ac_dD}
-${ac_dA}HAVE_UNSIGNED_LONG_LONG${ac_dB}HAVE_UNSIGNED_LONG_LONG${ac_dC}1${ac_dD}
-${ac_dA}HAVE_UINTMAX_T${ac_dB}HAVE_UINTMAX_T${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_STRDUP${ac_dB}HAVE_DECL_STRDUP${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_STRNDUP${ac_dB}HAVE_DECL_STRNDUP${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_STRNLEN${ac_dB}HAVE_DECL_STRNLEN${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_CLEARERR_UNLOCKED${ac_dB}HAVE_DECL_CLEARERR_UNLOCKED${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_FEOF_UNLOCKED${ac_dB}HAVE_DECL_FEOF_UNLOCKED${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_FERROR_UNLOCKED${ac_dB}HAVE_DECL_FERROR_UNLOCKED${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_FFLUSH_UNLOCKED${ac_dB}HAVE_DECL_FFLUSH_UNLOCKED${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_FGETS_UNLOCKED${ac_dB}HAVE_DECL_FGETS_UNLOCKED${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_FPUTC_UNLOCKED${ac_dB}HAVE_DECL_FPUTC_UNLOCKED${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_FPUTS_UNLOCKED${ac_dB}HAVE_DECL_FPUTS_UNLOCKED${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_FREAD_UNLOCKED${ac_dB}HAVE_DECL_FREAD_UNLOCKED${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_FWRITE_UNLOCKED${ac_dB}HAVE_DECL_FWRITE_UNLOCKED${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_GETC_UNLOCKED${ac_dB}HAVE_DECL_GETC_UNLOCKED${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_GETCHAR_UNLOCKED${ac_dB}HAVE_DECL_GETCHAR_UNLOCKED${ac_dC}1${ac_dD}
-CEOF
-  sed -f $tmp/defines.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-
-  cat >$tmp/defines.sed <<CEOF
-/^[	 ]*#[	 ]*define/!b
-t clr
-: clr
-${ac_dA}HAVE_DECL_PUTC_UNLOCKED${ac_dB}HAVE_DECL_PUTC_UNLOCKED${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_PUTCHAR_UNLOCKED${ac_dB}HAVE_DECL_PUTCHAR_UNLOCKED${ac_dC}1${ac_dD}
-${ac_dA}ENABLE_NLS${ac_dB}ENABLE_NLS${ac_dC}1${ac_dD}
-${ac_dA}HAVE_GETTEXT${ac_dB}HAVE_GETTEXT${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DCGETTEXT${ac_dB}HAVE_DCGETTEXT${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STDLIB_H${ac_dB}HAVE_STDLIB_H${ac_dC}1${ac_dD}
-${ac_dA}HAVE_MALLOC${ac_dB}HAVE_MALLOC${ac_dC}1${ac_dD}
-${ac_dA}HAVE_ISWCNTRL${ac_dB}HAVE_ISWCNTRL${ac_dC}1${ac_dD}
-${ac_dA}HAVE_WCWIDTH${ac_dB}HAVE_WCWIDTH${ac_dC}1${ac_dD}
-${ac_dA}HAVE_MBRTOWC${ac_dB}HAVE_MBRTOWC${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_WCWIDTH${ac_dB}HAVE_DECL_WCWIDTH${ac_dC}1${ac_dD}
-${ac_dA}HAVE_DECL_MBSWIDTH_IN_WCHAR_H${ac_dB}HAVE_DECL_MBSWIDTH_IN_WCHAR_H${ac_dC}0${ac_dD}
-${ac_dA}HAVE_MBSTATE_T${ac_dB}HAVE_MBSTATE_T${ac_dC}1${ac_dD}
-${ac_dA}HAVE_OBSTACK${ac_dB}HAVE_OBSTACK${ac_dC}1${ac_dD}
-${ac_dA}HAVE_MBSTATE_T${ac_dB}HAVE_MBSTATE_T${ac_dC}1${ac_dD}
-${ac_dA}HAVE_MBRTOWC${ac_dB}HAVE_MBRTOWC${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STPCPY${ac_dB}HAVE_STPCPY${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STRDUP${ac_dB}HAVE_STRDUP${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STRERROR${ac_dB}HAVE_STRERROR${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STRNDUP${ac_dB}HAVE_STRNDUP${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STRTOL${ac_dB}HAVE_STRTOL${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STRTOUL${ac_dB}HAVE_STRTOUL${ac_dC}1${ac_dD}
-${ac_dA}HAVE_STRVERSCMP${ac_dB}HAVE_STRVERSCMP${ac_dC}1${ac_dD}
-${ac_dA}HAVE_UNISTD_H${ac_dB}HAVE_UNISTD_H${ac_dC}1${ac_dD}
-${ac_dA}USE_UNLOCKED_IO${ac_dB}USE_UNLOCKED_IO${ac_dC}1${ac_dD}
-${ac_dA}YYENABLE_NLS${ac_dB}YYENABLE_NLS${ac_dC}1${ac_dD}
-CEOF
-  sed -f $tmp/defines.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-
-  fi # grep
-
-  # Handle all the #undef templates
-  cat >$tmp/undefs.sed <<CEOF
-/^[	 ]*#[	 ]*undef/!b
-t clr
-: clr
-${ac_uA}PACKAGE_NAME${ac_uB}PACKAGE_NAME${ac_uC}"GNU Bison"${ac_uD}
-${ac_uA}PACKAGE_TARNAME${ac_uB}PACKAGE_TARNAME${ac_uC}"bison"${ac_uD}
-${ac_uA}PACKAGE_VERSION${ac_uB}PACKAGE_VERSION${ac_uC}"2.3"${ac_uD}
-${ac_uA}PACKAGE_STRING${ac_uB}PACKAGE_STRING${ac_uC}"GNU Bison 2.3"${ac_uD}
-${ac_uA}PACKAGE_BUGREPORT${ac_uB}PACKAGE_BUGREPORT${ac_uC}"bug-bison@gnu.org"${ac_uD}
-${ac_uA}PACKAGE${ac_uB}PACKAGE${ac_uC}"bison"${ac_uD}
-${ac_uA}VERSION${ac_uB}VERSION${ac_uC}"2.3"${ac_uD}
-${ac_uA}_GNU_SOURCE${ac_uB}_GNU_SOURCE${ac_uC}1${ac_uD}
-${ac_uA}STDC_HEADERS${ac_uB}STDC_HEADERS${ac_uC}1${ac_uD}
-${ac_uA}HAVE_SYS_TYPES_H${ac_uB}HAVE_SYS_TYPES_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_SYS_STAT_H${ac_uB}HAVE_SYS_STAT_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STDLIB_H${ac_uB}HAVE_STDLIB_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STRING_H${ac_uB}HAVE_STRING_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_MEMORY_H${ac_uB}HAVE_MEMORY_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STRINGS_H${ac_uB}HAVE_STRINGS_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_INTTYPES_H${ac_uB}HAVE_INTTYPES_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STDINT_H${ac_uB}HAVE_STDINT_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_UNISTD_H${ac_uB}HAVE_UNISTD_H${ac_uC}1${ac_uD}
-${ac_uA}__EXTENSIONS__${ac_uB}__EXTENSIONS__${ac_uC}1${ac_uD}
-${ac_uA}_POSIX_PTHREAD_SEMANTICS${ac_uB}_POSIX_PTHREAD_SEMANTICS${ac_uC}1${ac_uD}
-${ac_uA}YYTEXT_POINTER${ac_uB}YYTEXT_POINTER${ac_uC}1${ac_uD}
-${ac_uA}M4${ac_uB}M4${ac_uC}"/usr/bin/m4"${ac_uD}
-${ac_uA}HAVE_LOCALE_H${ac_uB}HAVE_LOCALE_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_WCHAR_H${ac_uB}HAVE_WCHAR_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_WCTYPE_H${ac_uB}HAVE_WCTYPE_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE__BOOL${ac_uB}HAVE__BOOL${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STDBOOL_H${ac_uB}HAVE_STDBOOL_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_UINTPTR_T${ac_uB}HAVE_UINTPTR_T${ac_uC}1${ac_uD}
-${ac_uA}HAVE_SETLOCALE${ac_uB}HAVE_SETLOCALE${ac_uC}1${ac_uD}
-${ac_uA}HAVE_ISASCII${ac_uB}HAVE_ISASCII${ac_uC}1${ac_uD}
-${ac_uA}HAVE_ISWPRINT${ac_uB}HAVE_ISWPRINT${ac_uC}1${ac_uD}
-${ac_uA}HAVE_MBSINIT${ac_uB}HAVE_MBSINIT${ac_uC}1${ac_uD}
-${ac_uA}HAVE_SYS_WAIT_H${ac_uB}HAVE_SYS_WAIT_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DUP2${ac_uB}HAVE_DUP2${ac_uC}1${ac_uD}
-${ac_uA}HAVE_WAITPID${ac_uB}HAVE_WAITPID${ac_uC}1${ac_uD}
-${ac_uA}HAVE_UNISTD_H${ac_uB}HAVE_UNISTD_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_FORK${ac_uB}HAVE_FORK${ac_uC}1${ac_uD}
-${ac_uA}HAVE_VFORK${ac_uB}HAVE_VFORK${ac_uC}1${ac_uD}
-CEOF
-  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-
-  cat >$tmp/undefs.sed <<CEOF
-/^[	 ]*#[	 ]*undef/!b
-t clr
-: clr
-${ac_uA}HAVE_WORKING_VFORK${ac_uB}HAVE_WORKING_VFORK${ac_uC}1${ac_uD}
-${ac_uA}HAVE_WORKING_FORK${ac_uB}HAVE_WORKING_FORK${ac_uC}1${ac_uD}
-${ac_uA}HAVE_SYS_TIME_H${ac_uB}HAVE_SYS_TIME_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_SYS_TIMES_H${ac_uB}HAVE_SYS_TIMES_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_SYS_RESOURCE_H${ac_uB}HAVE_SYS_RESOURCE_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_TIMES${ac_uB}HAVE_TIMES${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_GETRUSAGE${ac_uB}HAVE_DECL_GETRUSAGE${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_TIMES${ac_uB}HAVE_DECL_TIMES${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_CLOCK${ac_uB}HAVE_DECL_CLOCK${ac_uC}0${ac_uD}
-${ac_uA}HAVE_DECL_SYSCONF${ac_uB}HAVE_DECL_SYSCONF${ac_uC}1${ac_uD}
-${ac_uA}HAVE_CLOCK_T${ac_uB}HAVE_CLOCK_T${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STRUCT_TMS${ac_uB}HAVE_STRUCT_TMS${ac_uC}1${ac_uD}
-${ac_uA}FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX${ac_uB}FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX${ac_uC}0${ac_uD}
-${ac_uA}FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR${ac_uB}FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR${ac_uC}0${ac_uD}
-${ac_uA}HAVE_DECL_STRERROR_R${ac_uB}HAVE_DECL_STRERROR_R${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STRERROR_R${ac_uB}HAVE_STRERROR_R${ac_uC}1${ac_uD}
-${ac_uA}STRERROR_R_CHAR_P${ac_uB}STRERROR_R_CHAR_P${ac_uC}1${ac_uD}
-${ac_uA}HAVE_GETOPT_H${ac_uB}HAVE_GETOPT_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_GETOPT_LONG_ONLY${ac_uB}HAVE_GETOPT_LONG_ONLY${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_GETENV${ac_uB}HAVE_DECL_GETENV${ac_uC}1${ac_uD}
-${ac_uA}HAVE_INTTYPES_H_WITH_UINTMAX${ac_uB}HAVE_INTTYPES_H_WITH_UINTMAX${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STDINT_H_WITH_UINTMAX${ac_uB}HAVE_STDINT_H_WITH_UINTMAX${ac_uC}1${ac_uD}
-${ac_uA}HAVE_UNSIGNED_LONG_LONG${ac_uB}HAVE_UNSIGNED_LONG_LONG${ac_uC}1${ac_uD}
-${ac_uA}HAVE_UINTMAX_T${ac_uB}HAVE_UINTMAX_T${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_STRDUP${ac_uB}HAVE_DECL_STRDUP${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_STRNDUP${ac_uB}HAVE_DECL_STRNDUP${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_STRNLEN${ac_uB}HAVE_DECL_STRNLEN${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_CLEARERR_UNLOCKED${ac_uB}HAVE_DECL_CLEARERR_UNLOCKED${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_FEOF_UNLOCKED${ac_uB}HAVE_DECL_FEOF_UNLOCKED${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_FERROR_UNLOCKED${ac_uB}HAVE_DECL_FERROR_UNLOCKED${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_FFLUSH_UNLOCKED${ac_uB}HAVE_DECL_FFLUSH_UNLOCKED${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_FGETS_UNLOCKED${ac_uB}HAVE_DECL_FGETS_UNLOCKED${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_FPUTC_UNLOCKED${ac_uB}HAVE_DECL_FPUTC_UNLOCKED${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_FPUTS_UNLOCKED${ac_uB}HAVE_DECL_FPUTS_UNLOCKED${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_FREAD_UNLOCKED${ac_uB}HAVE_DECL_FREAD_UNLOCKED${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_FWRITE_UNLOCKED${ac_uB}HAVE_DECL_FWRITE_UNLOCKED${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_GETC_UNLOCKED${ac_uB}HAVE_DECL_GETC_UNLOCKED${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_GETCHAR_UNLOCKED${ac_uB}HAVE_DECL_GETCHAR_UNLOCKED${ac_uC}1${ac_uD}
-CEOF
-  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-
-  cat >$tmp/undefs.sed <<CEOF
-/^[	 ]*#[	 ]*undef/!b
-t clr
-: clr
-${ac_uA}HAVE_DECL_PUTC_UNLOCKED${ac_uB}HAVE_DECL_PUTC_UNLOCKED${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_PUTCHAR_UNLOCKED${ac_uB}HAVE_DECL_PUTCHAR_UNLOCKED${ac_uC}1${ac_uD}
-${ac_uA}ENABLE_NLS${ac_uB}ENABLE_NLS${ac_uC}1${ac_uD}
-${ac_uA}HAVE_GETTEXT${ac_uB}HAVE_GETTEXT${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DCGETTEXT${ac_uB}HAVE_DCGETTEXT${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STDLIB_H${ac_uB}HAVE_STDLIB_H${ac_uC}1${ac_uD}
-${ac_uA}HAVE_MALLOC${ac_uB}HAVE_MALLOC${ac_uC}1${ac_uD}
-${ac_uA}HAVE_ISWCNTRL${ac_uB}HAVE_ISWCNTRL${ac_uC}1${ac_uD}
-${ac_uA}HAVE_WCWIDTH${ac_uB}HAVE_WCWIDTH${ac_uC}1${ac_uD}
-${ac_uA}HAVE_MBRTOWC${ac_uB}HAVE_MBRTOWC${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_WCWIDTH${ac_uB}HAVE_DECL_WCWIDTH${ac_uC}1${ac_uD}
-${ac_uA}HAVE_DECL_MBSWIDTH_IN_WCHAR_H${ac_uB}HAVE_DECL_MBSWIDTH_IN_WCHAR_H${ac_uC}0${ac_uD}
-${ac_uA}HAVE_MBSTATE_T${ac_uB}HAVE_MBSTATE_T${ac_uC}1${ac_uD}
-${ac_uA}HAVE_OBSTACK${ac_uB}HAVE_OBSTACK${ac_uC}1${ac_uD}
-${ac_uA}HAVE_MBSTATE_T${ac_uB}HAVE_MBSTATE_T${ac_uC}1${ac_uD}
-${ac_uA}HAVE_MBRTOWC${ac_uB}HAVE_MBRTOWC${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STPCPY${ac_uB}HAVE_STPCPY${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STRDUP${ac_uB}HAVE_STRDUP${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STRERROR${ac_uB}HAVE_STRERROR${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STRNDUP${ac_uB}HAVE_STRNDUP${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STRTOL${ac_uB}HAVE_STRTOL${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STRTOUL${ac_uB}HAVE_STRTOUL${ac_uC}1${ac_uD}
-${ac_uA}HAVE_STRVERSCMP${ac_uB}HAVE_STRVERSCMP${ac_uC}1${ac_uD}
-${ac_uA}HAVE_UNISTD_H${ac_uB}HAVE_UNISTD_H${ac_uC}1${ac_uD}
-${ac_uA}USE_UNLOCKED_IO${ac_uB}USE_UNLOCKED_IO${ac_uC}1${ac_uD}
-${ac_uA}YYENABLE_NLS${ac_uB}YYENABLE_NLS${ac_uC}1${ac_uD}
-s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
-CEOF
-  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    echo "/* Generated by configure.  */" >$tmp/config.h
-  else
-    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
-  fi
-  cat $tmp/in >>$tmp/config.h
-  rm -f $tmp/in
-  if test x"$ac_file" != x-; then
-    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
-      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
-echo "$as_me: $ac_file is unchanged" >&6;}
-    else
-      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-      { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-      rm -f $ac_file
-      mv $tmp/config.h $ac_file
-    fi
-  else
-    cat $tmp/config.h
-    rm -f $tmp/config.h
-  fi
-# Compute $ac_file's index in $config_headers.
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $ac_file | $ac_file:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
-$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X$ac_file : 'X\(//\)[^/]' \| \
-	 X$ac_file : 'X\(//\)$' \| \
-	 X$ac_file : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X$ac_file |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`/stamp-h$_am_stamp_count
-done
-
-#
-# CONFIG_COMMANDS section.
-#
-for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
-  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
-  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
-  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
-$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_dest" : 'X\(//\)[^/]' \| \
-	 X"$ac_dest" : 'X\(//\)$' \| \
-	 X"$ac_dest" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_dest" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-  ac_builddir=.
-
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-
-  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
-echo "$as_me: executing $ac_dest commands" >&6;}
-  case $ac_dest in
-    depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
-  # Strip MF so we end up with the name of the file.
-  mf=`echo "$mf" | sed -e 's/:.*$//'`
-  # Check whether this is an Automake generated Makefile or not.
-  # We used to match only the files named `Makefile.in', but
-  # some people rename them; so instead we look at the file content.
-  # Grep'ing the first line is not enough: some people post-process
-  # each Makefile.in and add a new line on top of each file to say so.
-  # So let's grep whole file.
-  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
-    dirpart=`(dirname "$mf") 2>/dev/null ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$mf" : 'X\(//\)[^/]' \| \
-	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  else
-    continue
-  fi
-  # Extract the definition of DEPDIR, am__include, and am__quote
-  # from the Makefile without running `make'.
-  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-  test -z "$DEPDIR" && continue
-  am__include=`sed -n 's/^am__include = //p' < "$mf"`
-  test -z "am__include" && continue
-  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-  # When using ansi2knr, U may be empty or an underscore; expand it
-  U=`sed -n 's/^U = //p' < "$mf"`
-  # Find all dependency output files, they are included files with
-  # $(DEPDIR) in their names.  We invoke sed twice because it is the
-  # simplest approach to changing $(DEPDIR) to its actual value in the
-  # expansion.
-  for file in `sed -n "
-    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-    # Make sure the directory exists.
-    test -f "$dirpart/$file" && continue
-    fdir=`(dirname "$file") 2>/dev/null ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$file" : 'X\(//\)[^/]' \| \
-	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    { if $as_mkdir_p; then
-    mkdir -p $dirpart/$fdir
-  else
-    as_dir=$dirpart/$fdir
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
-echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-    # echo "creating $dirpart/$file"
-    echo '# dummy' > "$dirpart/$file"
-  done
-done
- ;;
-    default-1 )
-    for ac_file in $CONFIG_FILES; do
-      # Support "outfile[:infile[:infile...]]"
-      case "$ac_file" in
-        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
-      esac
-      # PO directories have a Makefile.in generated from Makefile.in.in.
-      case "$ac_file" in */Makefile.in)
-        # Adjust a relative srcdir.
-        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
-        ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
-        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
-        # In autoconf-2.13 it is called $ac_given_srcdir.
-        # In autoconf-2.50 it is called $srcdir.
-        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
-        case "$ac_given_srcdir" in
-          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
-          /*) top_srcdir="$ac_given_srcdir" ;;
-          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
-        esac
-        # Treat a directory as a PO directory if and only if it has a
-        # POTFILES.in file. This allows packages to have multiple PO
-        # directories under different names or in different locations.
-        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
-          rm -f "$ac_dir/POTFILES"
-          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
-          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ 	]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
-          POMAKEFILEDEPS="POTFILES.in"
-          # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
-          # on $ac_dir but don't depend on user-specified configuration
-          # parameters.
-          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
-            # The LINGUAS file contains the set of available languages.
-            if test -n "$OBSOLETE_ALL_LINGUAS"; then
-              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
-            fi
-            ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
-            # Hide the ALL_LINGUAS assigment from automake.
-            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
-            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
-          else
-            # The set of available languages was given in configure.in.
-            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
-          fi
-          # Compute POFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
-          # Compute UPDATEPOFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
-          # Compute DUMMYPOFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
-          # Compute GMOFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
-          case "$ac_given_srcdir" in
-            .) srcdirpre= ;;
-            *) srcdirpre='$(srcdir)/' ;;
-          esac
-          POFILES=
-          UPDATEPOFILES=
-          DUMMYPOFILES=
-          GMOFILES=
-          for lang in $ALL_LINGUAS; do
-            POFILES="$POFILES $srcdirpre$lang.po"
-            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
-            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
-            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
-          done
-          # CATALOGS depends on both $ac_dir and the user's LINGUAS
-          # environment variable.
-          INST_LINGUAS=
-          if test -n "$ALL_LINGUAS"; then
-            for presentlang in $ALL_LINGUAS; do
-              useit=no
-              if test "%UNSET%" != "$LINGUAS"; then
-                desiredlanguages="$LINGUAS"
-              else
-                desiredlanguages="$ALL_LINGUAS"
-              fi
-              for desiredlang in $desiredlanguages; do
-                # Use the presentlang catalog if desiredlang is
-                #   a. equal to presentlang, or
-                #   b. a variant of presentlang (because in this case,
-                #      presentlang can be used as a fallback for messages
-                #      which are not translated in the desiredlang catalog).
-                case "$desiredlang" in
-                  "$presentlang"*) useit=yes;;
-                esac
-              done
-              if test $useit = yes; then
-                INST_LINGUAS="$INST_LINGUAS $presentlang"
-              fi
-            done
-          fi
-          CATALOGS=
-          if test -n "$INST_LINGUAS"; then
-            for lang in $INST_LINGUAS; do
-              CATALOGS="$CATALOGS $lang.gmo"
-            done
-          fi
-          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
-          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
-          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
-            if test -f "$f"; then
-              case "$f" in
-                *.orig | *.bak | *~) ;;
-                *) cat "$f" >> "$ac_dir/Makefile" ;;
-              esac
-            fi
-          done
-        fi
-        ;;
-      esac
-    done ;;
-    tests/atconfig ) cat >tests/atconfig <<ATEOF
-# Configurable variable values for building test suites.
-# Generated by $0.
-# Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
-
-# The test suite will define top_srcdir=$at_top_srcdir/../.. etc.
-at_testdir='tests'
-abs_builddir='$ac_abs_builddir'
-at_srcdir='$ac_srcdir'
-abs_srcdir='$ac_abs_srcdir'
-at_top_srcdir='$ac_top_srcdir'
-abs_top_srcdir='$ac_abs_top_srcdir'
-at_top_builddir='$ac_top_builddir'
-abs_top_builddir='$ac_abs_top_builddir'
-
-AUTOTEST_PATH='tests'
-
-SHELL=\${CONFIG_SHELL-'$SHELL'}
-ATEOF
- ;;
-  esac
-done
-
-{ (exit 0); exit 0; }
diff --git a/configure b/configure
deleted file mode 100755
index 40270df..0000000
--- a/configure
+++ /dev/null
@@ -1,17646 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59 for GNU Bison 2.3.
-#
-# Report bugs to <bug-bison@gnu.org>.
-#
-# Copyright (C) 2003 Free Software Foundation, Inc.
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
-
-
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
-    sed '
-      N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
-      t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
-    ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
-   { (exit 1); exit 1; }; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
-  # Exit status is that of the last command.
-  exit
-}
-
-
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
-    as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-as_executable_p="test -f"
-
-# 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'"
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
-
-# Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-exec 6>&1
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_config_libobj_dir=.
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-# Maximum number of lines to put in a shell here document.
-# This variable seems obsolete.  It should probably be removed, and
-# only ac_max_sed_lines should be used.
-: ${ac_max_here_lines=38}
-
-# Identity of this package.
-PACKAGE_NAME='GNU Bison'
-PACKAGE_TARNAME='bison'
-PACKAGE_VERSION='2.3'
-PACKAGE_STRING='GNU Bison 2.3'
-PACKAGE_BUGREPORT='bug-bison@gnu.org'
-
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#if STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# if HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
-#endif
-#if HAVE_STRING_H
-# if !STDC_HEADERS && HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# include <string.h>
-#endif
-#if HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#else
-# if HAVE_STDINT_H
-#  include <stdint.h>
-# endif
-#endif
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-gl_header_list=
-gl_func_list=
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP WARNING_CFLAGS WERROR_CFLAGS WARNING_CXXFLAGS YACC_SCRIPT YACC_LIBRARY LEX LEXLIB LEX_OUTPUT_ROOT YACC RANLIB ac_ct_RANLIB M4 STDBOOL_H HAVE__BOOL LIBOBJS GETOPT_H MKINSTALLDIRS USE_NLS MSGFMT GMSGFMT XGETTEXT MSGMERGE build build_cpu build_vendor build_os host host_cpu host_vendor host_os INTL_MACOSX_LIBS LIBICONV LTLIBICONV INTLLIBS LIBINTL LTLIBINTL POSUB UNISTD_H BISON_LOCALEDIR aclocaldir VALGRIND CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE BISON_CXX_WORKS BISON_CXX_WORKS_TRUE BISON_CXX_WORKS_FALSE AUTOM4TE GCC O0CFLAGS O0CXXFLAGS LTLIBOBJS'
-ac_subst_files=''
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
-
-ac_prev=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval "$ac_prev=\$ac_option"
-    ac_prev=
-    continue
-  fi
-
-  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_option in
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
-  | --da=*)
-    datadir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
-   { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    eval "enable_$ac_feature=no" ;;
-
-  -enable-* | --enable-*)
-    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
-   { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "enable_$ac_feature='$ac_optarg'" ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst \
-  | --locals | --local | --loca | --loc | --lo)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid package name: $ac_package" >&2
-   { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "with_$ac_package='$ac_optarg'" ;;
-
-  -without-* | --without-*)
-    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid package name: $ac_package" >&2
-   { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/-/_/g'`
-    eval "with_$ac_package=no" ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) { echo "$as_me: error: unrecognized option: $ac_option
-Try \`$0 --help' for more information." >&2
-   { (exit 1); exit 1; }; }
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
-   { (exit 1); exit 1; }; }
-    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
-    eval "$ac_envvar='$ac_optarg'"
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  { echo "$as_me: error: missing argument to $ac_option" >&2
-   { (exit 1); exit 1; }; }
-fi
-
-# Be sure to have absolute paths.
-for ac_var in exec_prefix prefix
-do
-  eval ac_val=$`echo $ac_var`
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
-  esac
-done
-
-# Be sure to have absolute paths.
-for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
-	      localstatedir libdir includedir oldincludedir infodir mandir
-do
-  eval ac_val=$`echo $ac_var`
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
-  esac
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used." >&2
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then its parent.
-  ac_confdir=`(dirname "$0") 2>/dev/null ||
-$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$0" : 'X\(//\)[^/]' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$0" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r $srcdir/$ac_unique_file; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r $srcdir/$ac_unique_file; then
-  if test "$ac_srcdir_defaulted" = yes; then
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
-   { (exit 1); exit 1; }; }
-  else
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
-   { (exit 1); exit 1; }; }
-  fi
-fi
-(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
-  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
-   { (exit 1); exit 1; }; }
-srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
-ac_env_build_alias_set=${build_alias+set}
-ac_env_build_alias_value=$build_alias
-ac_cv_env_build_alias_set=${build_alias+set}
-ac_cv_env_build_alias_value=$build_alias
-ac_env_host_alias_set=${host_alias+set}
-ac_env_host_alias_value=$host_alias
-ac_cv_env_host_alias_set=${host_alias+set}
-ac_cv_env_host_alias_value=$host_alias
-ac_env_target_alias_set=${target_alias+set}
-ac_env_target_alias_value=$target_alias
-ac_cv_env_target_alias_set=${target_alias+set}
-ac_cv_env_target_alias_value=$target_alias
-ac_env_CC_set=${CC+set}
-ac_env_CC_value=$CC
-ac_cv_env_CC_set=${CC+set}
-ac_cv_env_CC_value=$CC
-ac_env_CFLAGS_set=${CFLAGS+set}
-ac_env_CFLAGS_value=$CFLAGS
-ac_cv_env_CFLAGS_set=${CFLAGS+set}
-ac_cv_env_CFLAGS_value=$CFLAGS
-ac_env_LDFLAGS_set=${LDFLAGS+set}
-ac_env_LDFLAGS_value=$LDFLAGS
-ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
-ac_cv_env_LDFLAGS_value=$LDFLAGS
-ac_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_env_CPPFLAGS_value=$CPPFLAGS
-ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_cv_env_CPPFLAGS_value=$CPPFLAGS
-ac_env_CPP_set=${CPP+set}
-ac_env_CPP_value=$CPP
-ac_cv_env_CPP_set=${CPP+set}
-ac_cv_env_CPP_value=$CPP
-ac_env_CXX_set=${CXX+set}
-ac_env_CXX_value=$CXX
-ac_cv_env_CXX_set=${CXX+set}
-ac_cv_env_CXX_value=$CXX
-ac_env_CXXFLAGS_set=${CXXFLAGS+set}
-ac_env_CXXFLAGS_value=$CXXFLAGS
-ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
-ac_cv_env_CXXFLAGS_value=$CXXFLAGS
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
-  # Omit some internal or obsolete options to make the list less imposing.
-  # This message is too long to be a string in the A/UX 3.1 sh.
-  cat <<_ACEOF
-\`configure' configures GNU Bison 2.3 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE.  See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-_ACEOF
-
-  cat <<_ACEOF
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-			  [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-			  [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR           user executables [EPREFIX/bin]
-  --sbindir=DIR          system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR       program executables [EPREFIX/libexec]
-  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
-  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
-  --libdir=DIR           object code libraries [EPREFIX/lib]
-  --includedir=DIR       C header files [PREFIX/include]
-  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
-  --infodir=DIR          info documentation [PREFIX/info]
-  --mandir=DIR           man documentation [PREFIX/man]
-_ACEOF
-
-  cat <<\_ACEOF
-
-Program names:
-  --program-prefix=PREFIX            prepend PREFIX to installed program names
-  --program-suffix=SUFFIX            append SUFFIX to installed program names
-  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
-
-System types:
-  --build=BUILD     configure for building on BUILD [guessed]
-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of GNU Bison 2.3:";;
-   esac
-  cat <<\_ACEOF
-
-Optional Features:
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
-  --enable-gcc-warnings   turn on lots of GCC warnings (not recommended)
-  --disable-yacc          do not build a yacc command or an -ly library
-  --disable-nls           do not use Native Language Support
-  --disable-rpath         do not hardcode runtime library paths
-
-Optional Packages:
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-dmalloc          use dmalloc, as in
-                          http://www.dmalloc.com/dmalloc.tar.gz
-  --with-gnu-ld           assume the C compiler uses GNU ld default=no
-  --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
-  --without-libiconv-prefix     don't search for libiconv in includedir and libdir
-  --with-libintl-prefix[=DIR]  search for libintl in DIR/include and DIR/lib
-  --without-libintl-prefix     don't search for libintl in includedir and libdir
-
-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>
-  CPPFLAGS    C/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
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <bug-bison@gnu.org>.
-_ACEOF
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  ac_popdir=`pwd`
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d $ac_dir || continue
-    ac_builddir=.
-
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-    cd $ac_dir
-    # Check for guested configure; otherwise get Cygnus style configure.
-    if test -f $ac_srcdir/configure.gnu; then
-      echo
-      $SHELL $ac_srcdir/configure.gnu  --help=recursive
-    elif test -f $ac_srcdir/configure; then
-      echo
-      $SHELL $ac_srcdir/configure  --help=recursive
-    elif test -f $ac_srcdir/configure.ac ||
-	   test -f $ac_srcdir/configure.in; then
-      echo
-      $ac_configure --help
-    else
-      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi
-    cd "$ac_popdir"
-  done
-fi
-
-test -n "$ac_init_help" && exit 0
-if $ac_init_version; then
-  cat <<\_ACEOF
-GNU Bison configure 2.3
-generated by GNU Autoconf 2.59
-
-Copyright (C) 2003 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
-  exit 0
-fi
-exec 5>config.log
-cat >&5 <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by GNU Bison $as_me 2.3, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  echo "PATH: $as_dir"
-done
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_sep=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
-      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
-    2)
-      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
-      # Get rid of the leading space.
-      ac_sep=" "
-      ;;
-    esac
-  done
-done
-$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
-$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Be sure not to use single quotes in there, as some shells,
-# such as our DU 5.0 friend, will then `close' the trap.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    cat <<\_ASBOX
-## ---------------- ##
-## Cache variables. ##
-## ---------------- ##
-_ASBOX
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-{
-  (set) 2>&1 |
-    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
-      sed -n \
-	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
-      ;;
-    *)
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
-      ;;
-    esac;
-}
-    echo
-
-    cat <<\_ASBOX
-## ----------------- ##
-## Output variables. ##
-## ----------------- ##
-_ASBOX
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=$`echo $ac_var`
-      echo "$ac_var='"'"'$ac_val'"'"'"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      cat <<\_ASBOX
-## ------------- ##
-## Output files. ##
-## ------------- ##
-_ASBOX
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=$`echo $ac_var`
-	echo "$ac_var='"'"'$ac_val'"'"'"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      cat <<\_ASBOX
-## ----------- ##
-## confdefs.h. ##
-## ----------- ##
-_ASBOX
-      echo
-      sed "/^$/d" confdefs.h | sort
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      echo "$as_me: caught signal $ac_signal"
-    echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core &&
-  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-     ' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo >confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
-  fi
-fi
-for ac_site_file in $CONFIG_SITE; do
-  if test -r "$ac_site_file"; then
-    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
-echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special
-  # files actually), so we avoid doing that.
-  if test -f "$cache_file"; then
-    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
-echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . $cache_file;;
-      *)                      . ./$cache_file;;
-    esac
-  fi
-else
-  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
-echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in `(set) 2>&1 |
-	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
-  eval ac_new_val="\$ac_env_${ac_var}_value"
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
-echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
-echo "$as_me:   former value:  $ac_old_val" >&2;}
-	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
-echo "$as_me:   current value: $ac_new_val" >&2;}
-	ac_cache_corrupted=:
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
-      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
-echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
-echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-gl_header_list="$gl_header_list locale.h"
-gl_func_list="$gl_func_list setlocale"
-gl_header_list="$gl_header_list wchar.h"
-gl_header_list="$gl_header_list wctype.h"
-gl_func_list="$gl_func_list isascii"
-gl_func_list="$gl_func_list iswprint"
-gl_func_list="$gl_func_list mbsinit"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-ac_aux_dir=
-for ac_dir in build-aux $srcdir/build-aux; do
-  if test -f $ac_dir/install-sh; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f $ac_dir/install.sh; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f $ac_dir/shtool; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in build-aux $srcdir/build-aux" >&5
-echo "$as_me: error: cannot find install-sh or install.sh in build-aux $srcdir/build-aux" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"
-ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
-
-case m4 in
-  [\\/]* | ?:[\\/]* ) ac_macro_dir=m4         ;;
-  *)                      ac_macro_dir=$srcdir/m4 ;;
-esac
-if test -d "$ac_macro_dir"; then :
-else
-  { { echo "$as_me:$LINENO: error: cannot find macro directory \`m4'" >&5
-echo "$as_me: error: cannot find macro directory \`m4'" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-
-# We don't have a file m4/Makefile.am, so we need Automake 1.8 or later.
-am__api_version="1.9"
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in
-  ./ | .// | /cC/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	    break 3
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-done
-
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  We don't cache a
-    # path for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the path is relative.
-    INSTALL=$ac_install_sh
-  fi
-fi
-echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-echo "$as_me:$LINENO: checking whether build environment is sane" >&5
-echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t $srcdir/configure conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" >&5
-echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" >&2;}
-   { (exit 1); exit 1; }; }
-   fi
-
-   test "$2" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
-Check your system clock" >&5
-echo "$as_me: error: newly created file is older than distributed files!
-Check your system clock" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-test "$program_prefix" != NONE &&
-  program_transform_name="s,^,$program_prefix,;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
-  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
-# Double any \ or $.  echo might interpret backslashes.
-# By default was `s,x,x', remove it if useless.
-cat <<\_ACEOF >conftest.sed
-s/[\\$]/&&/g;s/;s,x,x,$//
-_ACEOF
-program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
-rm conftest.sed
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
-echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
-  # We used to keeping the `.' as first argument, in order to
-  # allow $(mkdir_p) to be used without argument.  As in
-  #   $(mkdir_p) $(somedir)
-  # where $(somedir) is conditionally defined.  However this is wrong
-  # for two reasons:
-  #  1. if the package is installed by a user who cannot write `.'
-  #     make install will fail,
-  #  2. the above comment should most certainly read
-  #     $(mkdir_p) $(DESTDIR)$(somedir)
-  #     so it does not work when $(somedir) is undefined and
-  #     $(DESTDIR) is not.
-  #  To support the latter case, we have to write
-  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
-  #  so the `.' trick is pointless.
-  mkdir_p='mkdir -p --'
-else
-  # On NextStep and OpenStep, the `mkdir' command does not
-  # recognize any option.  It will interpret all options as
-  # directories to create, and then abort because `.' already
-  # exists.
-  for d in ./-p ./--version;
-  do
-    test -d $d && rmdir $d
-  done
-  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
-  if test -f "$ac_aux_dir/mkinstalldirs"; then
-    mkdir_p='$(mkinstalldirs)'
-  else
-    mkdir_p='$(install_sh) -d'
-  fi
-fi
-
-for ac_prog in gawk mawk nawk awk
-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_AWK+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_AWK="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
-  echo "$as_me:$LINENO: result: $AWK" >&5
-echo "${ECHO_T}$AWK" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  test -n "$AWK" && break
-done
-
-echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.make <<\_ACEOF
-all:
-	@echo 'ac_maketemp="$(MAKE)"'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
-if test -n "$ac_maketemp"; then
-  eval ac_cv_prog_make_${ac_make}_set=yes
-else
-  eval ac_cv_prog_make_${ac_make}_set=no
-fi
-rm -f conftest.make
-fi
-if eval "test \"`echo '$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
-
-rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-
-# test to see if srcdir already configured
-if test "`cd $srcdir && pwd`" != "`pwd`" &&
-   test -f $srcdir/config.status; then
-  { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
-echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-
-
-# Define the identity of the package.
- PACKAGE='bison'
- VERSION='2.3'
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-install_sh=${install_sh-"$am_aux_dir/install-sh"}
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; 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_STRIP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  echo "$as_me:$LINENO: result: $STRIP" >&5
-echo "${ECHO_T}$STRIP" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; 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_STRIP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-echo "${ECHO_T}$ac_ct_STRIP" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  STRIP=$ac_ct_STRIP
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
-
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility.
-
-AMTAR=${AMTAR-"${am_missing_run}tar"}
-
-am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
-
-
-
-
-
-          ac_config_headers="$ac_config_headers config.h:config.hin"
-
-
-
-cat >>confdefs.h <<\_ACEOF
-#define _GNU_SOURCE 1
-_ACEOF
-
-
-DEPDIR="${am__leading_dot}deps"
-
-          ac_config_commands="$ac_config_commands depfiles"
-
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo done
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
-echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# We grep out `Entering directory' and `Leaving directory'
-# messages which can occur if `w' ends up in MAKEFLAGS.
-# In particular we don't look at `^make:' because GNU make might
-# be invoked under some other name (usually "gmake"), in which
-# case it prints its new name instead of `make'.
-if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
-   am__include=include
-   am__quote=
-   _am_result=GNU
-fi
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
-      am__include=.include
-      am__quote="\""
-      _am_result=BSD
-   fi
-fi
-
-
-echo "$as_me:$LINENO: result: $_am_result" >&5
-echo "${ECHO_T}$_am_result" >&6
-rm -f confinc confmf
-
-# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then
-  enableval="$enable_dependency_tracking"
-
-fi;
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
-
-
-if test "x$enable_dependency_tracking" != xno; then
-  AMDEP_TRUE=
-  AMDEP_FALSE='#'
-else
-  AMDEP_TRUE='#'
-  AMDEP_FALSE=
-fi
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  test -n "$ac_ct_CC" && break
-done
-
-  CC=$ac_ct_CC
-fi
-
-fi
-
-
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-
-# Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&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[^ ]*//'`
-if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
-  (eval $ac_link_default) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  # Find the output, starting from the most likely.  This scheme is
-# not robust to junk in `.', hence go to wildcards (a.*) only as a last
-# resort.
-
-# Be careful to initialize this variable, since it used to be cached.
-# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
-ac_cv_exeext=
-# b.out is created by i960 compilers.
-for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
-	;;
-    conftest.$ac_ext )
-	# This is the source file.
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	# FIXME: I believe we export ac_cv_exeext for Libtool,
-	# but it would be cool to find out if it's true.  Does anybody
-	# maintain Libtool? --akim.
-	export ac_cv_exeext
-	break;;
-    * )
-	break;;
-  esac
-done
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
-See \`config.log' for more details." >&5
-echo "$as_me: error: C compiler cannot create executables
-See \`config.log' for more details." >&2;}
-   { (exit 77); exit 77; }; }
-fi
-
-ac_exeext=$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6
-
-# Check the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
-# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
-# If not cross compiling, check that we can run a simple program.
-if test "$cross_compiling" != yes; then
-  if { ac_try='./$ac_file'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-    fi
-  fi
-fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-
-rm -f a.out a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-# Check the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6
-
-echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  export ac_cv_exeext
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
-if test "${ac_cv_objext+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
-if test "${ac_cv_c_compiler_gnu+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_compiler_gnu=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_compiler_gnu=no
-fi
-rm -f conftest.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
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_g+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_g=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_prog_cc_g=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_prog_cc_stdc=no
-ac_save_CC=$CC
-cat >conftest.$ac_ext <<_ACEOF
-/* 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 -std1 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 -std1.  */
-int osf4_cc_array ['\x00' == 0 ? 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
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext
-done
-rm -f conftest.$ac_ext conftest.$ac_objext
-CC=$ac_save_CC
-
-fi
-
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
-  *)
-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
-esac
-
-# Some people use a C++ compiler to compile C.  Since we use `exit',
-# in C++ we need to declare it.  In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
-  choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-continue
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.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
-
-depcc="$CC"   am_compiler_list=
-
-echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CC_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    case $depmode in
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    none) break ;;
-    esac
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.
-    if depmode=$depmode \
-       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
-
-
-if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
-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 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 { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&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; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_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 non-existent 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 { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&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; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_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 { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&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; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_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 non-existent 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 { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&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; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  # Broken: success on invalid input.
-continue
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  :
-else
-  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." >&5
-echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-echo "$as_me:$LINENO: checking for egrep" >&5
-echo $ECHO_N "checking for egrep... $ECHO_C" >&6
-if test "${ac_cv_prog_egrep+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if echo a | (grep -E '(a|b)') >/dev/null 2>&1
-    then ac_cv_prog_egrep='grep -E'
-    else ac_cv_prog_egrep='egrep'
-    fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
-echo "${ECHO_T}$ac_cv_prog_egrep" >&6
- EGREP=$ac_cv_prog_egrep
-
-
-
-echo "$as_me:$LINENO: checking for AIX" >&5
-echo $ECHO_N "checking for AIX... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef _AIX
-  yes
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "yes" >/dev/null 2>&1; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-cat >>confdefs.h <<\_ACEOF
-#define _ALL_SOURCE 1
-_ACEOF
-
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest*
-
-
-echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
-if test "${ac_cv_header_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_header_stdc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_header_stdc=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then
-  :
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then
-  :
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then
-  :
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ctype.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      exit(2);
-  exit (0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-ac_cv_header_stdc=no
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6
-if test $ac_cv_header_stdc = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define STDC_HEADERS 1
-_ACEOF
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-
-
-
-
-
-
-
-
-
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_Header=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_Header=no"
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-if test "${ac_cv_header_minix_config_h+set}" = set; then
-  echo "$as_me:$LINENO: checking for minix/config.h" >&5
-echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6
-if test "${ac_cv_header_minix_config_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5
-echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking minix/config.h usability" >&5
-echo $ECHO_N "checking minix/config.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <minix/config.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking minix/config.h presence" >&5
-echo $ECHO_N "checking minix/config.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <minix/config.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&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; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: minix/config.h:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: minix/config.h:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: minix/config.h:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: minix/config.h:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## -------------------------------- ##
-## Report this to bug-bison@gnu.org ##
-## -------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for minix/config.h" >&5
-echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6
-if test "${ac_cv_header_minix_config_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_header_minix_config_h=$ac_header_preproc
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5
-echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6
-
-fi
-if test $ac_cv_header_minix_config_h = yes; then
-  MINIX=yes
-else
-  MINIX=
-fi
-
-
-if test "$MINIX" = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define _POSIX_SOURCE 1
-_ACEOF
-
-
-cat >>confdefs.h <<\_ACEOF
-#define _POSIX_1_SOURCE 2
-_ACEOF
-
-
-cat >>confdefs.h <<\_ACEOF
-#define _MINIX 1
-_ACEOF
-
-fi
-
-
-
-
-
-
-
-
-
-
-
-  echo "$as_me:$LINENO: checking whether it is safe to define __EXTENSIONS__" >&5
-echo $ECHO_N "checking whether it is safe to define __EXTENSIONS__... $ECHO_C" >&6
-if test "${ac_cv_safe_to_define___extensions__+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-	  #define __EXTENSIONS__ 1
-	  $ac_includes_default
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_safe_to_define___extensions__=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_safe_to_define___extensions__=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_safe_to_define___extensions__" >&5
-echo "${ECHO_T}$ac_cv_safe_to_define___extensions__" >&6
-  test $ac_cv_safe_to_define___extensions__ = yes &&
-    cat >>confdefs.h <<\_ACEOF
-#define __EXTENSIONS__ 1
-_ACEOF
-
-  cat >>confdefs.h <<\_ACEOF
-#define _POSIX_PTHREAD_SEMANTICS 1
-_ACEOF
-
-
-
-# Checks for the compiler.
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  test -n "$ac_ct_CC" && break
-done
-
-  CC=$ac_ct_CC
-fi
-
-fi
-
-
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-
-# Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&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_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 { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_compiler_gnu=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_compiler_gnu=no
-fi
-rm -f conftest.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
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_g+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_g=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_prog_cc_g=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_prog_cc_stdc=no
-ac_save_CC=$CC
-cat >conftest.$ac_ext <<_ACEOF
-/* 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 -std1 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 -std1.  */
-int osf4_cc_array ['\x00' == 0 ? 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
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext
-done
-rm -f conftest.$ac_ext conftest.$ac_objext
-CC=$ac_save_CC
-
-fi
-
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
-  *)
-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
-esac
-
-# Some people use a C++ compiler to compile C.  Since we use `exit',
-# in C++ we need to declare it.  In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
-  choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-continue
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.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
-
-depcc="$CC"   am_compiler_list=
-
-echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CC_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    case $depmode in
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    none) break ;;
-    esac
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.
-    if depmode=$depmode \
-       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
-
-
-if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
-fi
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  test -n "$ac_ct_CC" && break
-done
-
-  CC=$ac_ct_CC
-fi
-
-fi
-
-
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-
-# Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&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_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 { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_compiler_gnu=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_compiler_gnu=no
-fi
-rm -f conftest.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
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_g+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_g=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_prog_cc_g=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_prog_cc_stdc=no
-ac_save_CC=$CC
-cat >conftest.$ac_ext <<_ACEOF
-/* 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 -std1 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 -std1.  */
-int osf4_cc_array ['\x00' == 0 ? 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
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext
-done
-rm -f conftest.$ac_ext conftest.$ac_objext
-CC=$ac_save_CC
-
-fi
-
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
-  *)
-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
-esac
-
-# Some people use a C++ compiler to compile C.  Since we use `exit',
-# in C++ we need to declare it.  In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
-  choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-continue
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.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
-
-depcc="$CC"   am_compiler_list=
-
-echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CC_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    case $depmode in
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    none) break ;;
-    esac
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.
-    if depmode=$depmode \
-       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
-
-
-if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
-fi
-
-
-
-am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc
-
-# Check whether --enable-gcc-warnings or --disable-gcc-warnings was given.
-if test "${enable_gcc_warnings+set}" = set; then
-  enableval="$enable_gcc_warnings"
-  case "${enableval}" in
-   yes|no) ;;
-   *)      { { echo "$as_me:$LINENO: error: bad value ${enableval} for gcc-warnings option" >&5
-echo "$as_me: error: bad value ${enableval} for gcc-warnings option" >&2;}
-   { (exit 1); exit 1; }; } ;;
- esac
-else
-  enableval=no
-fi;
-if test "${enableval}" = yes; then
-  echo "$as_me:$LINENO: checking whether compiler accepts -Werror" >&5
-echo $ECHO_N "checking whether compiler accepts -Werror... $ECHO_C" >&6
-
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Werror"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-int x;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  WARNING_CFLAGS="$WARNING_CFLAGS -Werror"
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$ac_save_CFLAGS"
-  WERROR_CFLAGS=$WARNING_CFLAGS
-
-  WARNING_CFLAGS=
-  echo "$as_me:$LINENO: checking whether compiler accepts -W" >&5
-echo $ECHO_N "checking whether compiler accepts -W... $ECHO_C" >&6
-
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -W"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-int x;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  WARNING_CFLAGS="$WARNING_CFLAGS -W"
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$ac_save_CFLAGS"
-  echo "$as_me:$LINENO: checking whether compiler accepts -Wall" >&5
-echo $ECHO_N "checking whether compiler accepts -Wall... $ECHO_C" >&6
-
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Wall"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-int x;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  WARNING_CFLAGS="$WARNING_CFLAGS -Wall"
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$ac_save_CFLAGS"
-  echo "$as_me:$LINENO: checking whether compiler accepts -Wcast-align" >&5
-echo $ECHO_N "checking whether compiler accepts -Wcast-align... $ECHO_C" >&6
-
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Wcast-align"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-int x;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  WARNING_CFLAGS="$WARNING_CFLAGS -Wcast-align"
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$ac_save_CFLAGS"
-  echo "$as_me:$LINENO: checking whether compiler accepts -Wcast-qual" >&5
-echo $ECHO_N "checking whether compiler accepts -Wcast-qual... $ECHO_C" >&6
-
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Wcast-qual"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-int x;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  WARNING_CFLAGS="$WARNING_CFLAGS -Wcast-qual"
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$ac_save_CFLAGS"
-  echo "$as_me:$LINENO: checking whether compiler accepts -Wformat" >&5
-echo $ECHO_N "checking whether compiler accepts -Wformat... $ECHO_C" >&6
-
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Wformat"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-int x;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  WARNING_CFLAGS="$WARNING_CFLAGS -Wformat"
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$ac_save_CFLAGS"
-  echo "$as_me:$LINENO: checking whether compiler accepts -Wwrite-strings" >&5
-echo $ECHO_N "checking whether compiler accepts -Wwrite-strings... $ECHO_C" >&6
-
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Wwrite-strings"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-int x;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  WARNING_CFLAGS="$WARNING_CFLAGS -Wwrite-strings"
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$ac_save_CFLAGS"
-  WARNING_CXXFLAGS=$WARNING_CFLAGS
-
-  # The following warnings are not suitable for C++.
-  echo "$as_me:$LINENO: checking whether compiler accepts -Wbad-function-cast" >&5
-echo $ECHO_N "checking whether compiler accepts -Wbad-function-cast... $ECHO_C" >&6
-
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Wbad-function-cast"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-int x;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  WARNING_CFLAGS="$WARNING_CFLAGS -Wbad-function-cast"
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$ac_save_CFLAGS"
-  echo "$as_me:$LINENO: checking whether compiler accepts -Wmissing-declarations" >&5
-echo $ECHO_N "checking whether compiler accepts -Wmissing-declarations... $ECHO_C" >&6
-
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Wmissing-declarations"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-int x;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  WARNING_CFLAGS="$WARNING_CFLAGS -Wmissing-declarations"
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$ac_save_CFLAGS"
-  echo "$as_me:$LINENO: checking whether compiler accepts -Wmissing-prototypes" >&5
-echo $ECHO_N "checking whether compiler accepts -Wmissing-prototypes... $ECHO_C" >&6
-
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Wmissing-prototypes"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-int x;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  WARNING_CFLAGS="$WARNING_CFLAGS -Wmissing-prototypes"
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$ac_save_CFLAGS"
-  echo "$as_me:$LINENO: checking whether compiler accepts -Wshadow" >&5
-echo $ECHO_N "checking whether compiler accepts -Wshadow... $ECHO_C" >&6
-
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Wshadow"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-int x;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  WARNING_CFLAGS="$WARNING_CFLAGS -Wshadow"
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$ac_save_CFLAGS"
-  echo "$as_me:$LINENO: checking whether compiler accepts -Wstrict-prototypes" >&5
-echo $ECHO_N "checking whether compiler accepts -Wstrict-prototypes... $ECHO_C" >&6
-
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -Wstrict-prototypes"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-int x;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  WARNING_CFLAGS="$WARNING_CFLAGS -Wstrict-prototypes"
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$ac_save_CFLAGS"
-
-cat >>confdefs.h <<\_ACEOF
-#define lint 1
-_ACEOF
-
-fi
-
-
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <limits.h>
-	 int test_array[CHAR_BIT];
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { echo "$as_me:$LINENO: error: cannot compile a simple C program
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compile a simple C program
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-
-
-# Check whether --enable-yacc or --disable-yacc was given.
-if test "${enable_yacc+set}" = set; then
-  enableval="$enable_yacc"
-
-else
-  enable_yacc=yes
-fi;
-case $enable_yacc in
-yes)
-  YACC_SCRIPT=yacc
-  YACC_LIBRARY=liby.a;;
-*)
-  YACC_SCRIPT=
-  YACC_LIBRARY=;;
-esac
-
-
-
-# Checks for programs.
-for ac_prog in flex lex
-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_LEX+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$LEX"; then
-  ac_cv_prog_LEX="$LEX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_LEX="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-LEX=$ac_cv_prog_LEX
-if test -n "$LEX"; then
-  echo "$as_me:$LINENO: result: $LEX" >&5
-echo "${ECHO_T}$LEX" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  test -n "$LEX" && break
-done
-test -n "$LEX" || LEX=":"
-
-if test -z "$LEXLIB"
-then
-  echo "$as_me:$LINENO: checking for yywrap in -lfl" >&5
-echo $ECHO_N "checking for yywrap in -lfl... $ECHO_C" >&6
-if test "${ac_cv_lib_fl_yywrap+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lfl  $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 gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char yywrap ();
-int
-main ()
-{
-yywrap ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_fl_yywrap=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_fl_yywrap=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_fl_yywrap" >&5
-echo "${ECHO_T}$ac_cv_lib_fl_yywrap" >&6
-if test $ac_cv_lib_fl_yywrap = yes; then
-  LEXLIB="-lfl"
-else
-  echo "$as_me:$LINENO: checking for yywrap in -ll" >&5
-echo $ECHO_N "checking for yywrap in -ll... $ECHO_C" >&6
-if test "${ac_cv_lib_l_yywrap+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ll  $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 gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char yywrap ();
-int
-main ()
-{
-yywrap ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_l_yywrap=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_l_yywrap=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_l_yywrap" >&5
-echo "${ECHO_T}$ac_cv_lib_l_yywrap" >&6
-if test $ac_cv_lib_l_yywrap = yes; then
-  LEXLIB="-ll"
-fi
-
-fi
-
-fi
-
-if test "x$LEX" != "x:"; then
-  echo "$as_me:$LINENO: checking lex output file root" >&5
-echo $ECHO_N "checking lex output file root... $ECHO_C" >&6
-if test "${ac_cv_prog_lex_root+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  # The minimal lex program is just a single line: %%.  But some broken lexes
-# (Solaris, I think it was) want two %% lines, so accommodate them.
-cat >conftest.l <<_ACEOF
-%%
-%%
-_ACEOF
-{ (eval echo "$as_me:$LINENO: \"$LEX conftest.l\"") >&5
-  (eval $LEX conftest.l) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-if test -f lex.yy.c; then
-  ac_cv_prog_lex_root=lex.yy
-elif test -f lexyy.c; then
-  ac_cv_prog_lex_root=lexyy
-else
-  { { echo "$as_me:$LINENO: error: cannot find output from $LEX; giving up" >&5
-echo "$as_me: error: cannot find output from $LEX; giving up" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_lex_root" >&5
-echo "${ECHO_T}$ac_cv_prog_lex_root" >&6
-rm -f conftest.l
-LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root
-
-echo "$as_me:$LINENO: checking whether yytext is a pointer" >&5
-echo $ECHO_N "checking whether yytext is a pointer... $ECHO_C" >&6
-if test "${ac_cv_prog_lex_yytext_pointer+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  # POSIX says lex can declare yytext either as a pointer or an array; the
-# default is implementation-dependent. Figure out which it is, since
-# not all implementations provide the %pointer and %array declarations.
-ac_cv_prog_lex_yytext_pointer=no
-echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c
-ac_save_LIBS=$LIBS
-LIBS="$LIBS $LEXLIB"
-cat >conftest.$ac_ext <<_ACEOF
-`cat $LEX_OUTPUT_ROOT.c`
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_lex_yytext_pointer=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_save_LIBS
-rm -f "${LEX_OUTPUT_ROOT}.c"
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_lex_yytext_pointer" >&5
-echo "${ECHO_T}$ac_cv_prog_lex_yytext_pointer" >&6
-if test $ac_cv_prog_lex_yytext_pointer = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define YYTEXT_POINTER 1
-_ACEOF
-
-fi
-
-fi
-for ac_prog in 'bison -y' byacc
-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_YACC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$YACC"; then
-  ac_cv_prog_YACC="$YACC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_YACC="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-YACC=$ac_cv_prog_YACC
-if test -n "$YACC"; then
-  echo "$as_me:$LINENO: result: $YACC" >&5
-echo "${ECHO_T}$YACC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  test -n "$YACC" && break
-done
-test -n "$YACC" || YACC="yacc"
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_RANLIB+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  RANLIB=$ac_ct_RANLIB
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-for ac_prog in gm4 gnum4 m4
-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_path_M4+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  case $M4 in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_M4="$M4" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_M4="$as_dir/$ac_word$ac_exec_ext"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-  ;;
-esac
-fi
-M4=$ac_cv_path_M4
-
-if test -n "$M4"; then
-  echo "$as_me:$LINENO: result: $M4" >&5
-echo "${ECHO_T}$M4" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  test -n "$M4" && break
-done
-test -n "$M4" || M4="m4"
-
-echo "$as_me:$LINENO: checking whether m4 supports frozen files" >&5
-echo $ECHO_N "checking whether m4 supports frozen files... $ECHO_C" >&6
-if test "${ac_cv_prog_gnu_m4+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_prog_gnu_m4=no
-if test x"$M4" != x; then
-  case `$M4 --help < /dev/null 2>&1` in
-    *reload-state*) ac_cv_prog_gnu_m4=yes ;;
-  esac
-fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_gnu_m4" >&5
-echo "${ECHO_T}$ac_cv_prog_gnu_m4" >&6
-if test x"$ac_cv_prog_gnu_m4" != xyes; then
-  { { echo "$as_me:$LINENO: error: GNU M4 1.4 is required" >&5
-echo "$as_me: error: GNU M4 1.4 is required" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define M4 "$M4"
-_ACEOF
-
-
-# Checks for header files.
-
-
-
-
-
-for ac_header in $gl_header_list
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&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; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## -------------------------------- ##
-## Report this to bug-bison@gnu.org ##
-## -------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
-
-
-
-
-  :
-
-
-
-
-
-echo "$as_me:$LINENO: checking for stdbool.h that conforms to C99" >&5
-echo $ECHO_N "checking for stdbool.h that conforms to C99... $ECHO_C" >&6
-if test "${ac_cv_header_stdbool_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-	  #include <stdbool.h>
-	  #ifndef bool
-	   "error: bool is not defined"
-	  #endif
-	  #ifndef false
-	   "error: false is not defined"
-	  #endif
-	  #if false
-	   "error: false is not 0"
-	  #endif
-	  #ifndef true
-	   "error: true is not defined"
-	  #endif
-	  #if true != 1
-	   "error: true is not 1"
-	  #endif
-	  #ifndef __bool_true_false_are_defined
-	   "error: __bool_true_false_are_defined is not defined"
-	  #endif
-
-	  struct s { _Bool s: 1; _Bool t; } s;
-
-	  char a[true == 1 ? 1 : -1];
-	  char b[false == 0 ? 1 : -1];
-	  char c[__bool_true_false_are_defined == 1 ? 1 : -1];
-	  char d[(bool) 0.5 == true ? 1 : -1];
-	  bool e = &s;
-	  char f[(_Bool) 0.0 == false ? 1 : -1];
-	  char g[true];
-	  char h[sizeof (_Bool)];
-	  char i[sizeof s.t];
-	  enum { j = false, k = true, l = false * true, m = true * 256 };
-	  _Bool n[m];
-	  char o[sizeof n == m * sizeof n[0] ? 1 : -1];
-	  char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
-	  #if defined __xlc__ || defined __GNUC__
-	   /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0
-	      reported by James Lemley on 2005-10-05; see
-	      http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
-	      This test is not quite right, since xlc is allowed to
-	      reject this program, as the initializer for xlcbug is
-	      not one of the forms that C requires support for.
-	      However, doing the test right would require a run-time
-	      test, and that would make cross-compilation harder.
-	      Let us hope that IBM fixes the xlc bug, and also adds
-	      support for this kind of constant expression.  In the
-	      meantime, this test will reject xlc, which is OK, since
-	      our stdbool.h substitute should suffice.  We also test
-	      this with GCC, where it should work, to detect more
-	      quickly whether someone messes up the test in the
-	      future.  */
-	   char digs[] = "0123456789";
-	   int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1);
-	  #endif
-	  /* Catch a bug in an HP-UX C compiler.  See
-	     http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
-	     http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
-	   */
-	  _Bool q = true;
-	  _Bool *pq = &q;
-
-int
-main ()
-{
-
-	  *pq |= q;
-	  *pq |= ! q;
-	  /* Refer to every declared value, to avoid compiler optimizations.  */
-	  return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
-		  + !m + !n + !o + !p + !q + !pq);
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_header_stdbool_h=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_header_stdbool_h=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdbool_h" >&5
-echo "${ECHO_T}$ac_cv_header_stdbool_h" >&6
-   echo "$as_me:$LINENO: checking for _Bool" >&5
-echo $ECHO_N "checking for _Bool... $ECHO_C" >&6
-if test "${ac_cv_type__Bool+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-if ((_Bool *) 0)
-  return 0;
-if (sizeof (_Bool))
-  return 0;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type__Bool=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_type__Bool=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type__Bool" >&5
-echo "${ECHO_T}$ac_cv_type__Bool" >&6
-if test $ac_cv_type__Bool = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE__BOOL 1
-_ACEOF
-
-
-fi
-
-   if test $ac_cv_header_stdbool_h = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_STDBOOL_H 1
-_ACEOF
-
-   fi
-
-
-
-  # Define two additional variables used in the Makefile substitution.
-
-  if test "$ac_cv_header_stdbool_h" = yes; then
-    STDBOOL_H=''
-  else
-    STDBOOL_H='stdbool.h'
-  fi
-
-
-  if test "$ac_cv_type__Bool" = yes; then
-    HAVE__BOOL=1
-  else
-    HAVE__BOOL=0
-  fi
-
-
-
-# Checks for compiler characteristics.
-echo "$as_me:$LINENO: checking for inline" >&5
-echo $ECHO_N "checking for inline... $ECHO_C" >&6
-if test "${ac_cv_c_inline+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_c_inline=no
-for ac_kw in inline __inline__ __inline; do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifndef __cplusplus
-typedef int foo_t;
-static $ac_kw foo_t static_foo () {return 0; }
-$ac_kw foo_t foo () {return 0; }
-#endif
-
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_c_inline=$ac_kw; break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
-echo "${ECHO_T}$ac_cv_c_inline" >&6
-
-
-case $ac_cv_c_inline in
-  inline | yes) ;;
-  *)
-    case $ac_cv_c_inline in
-      no) ac_val=;;
-      *) ac_val=$ac_cv_c_inline;;
-    esac
-    cat >>confdefs.h <<_ACEOF
-#ifndef __cplusplus
-#define inline $ac_val
-#endif
-_ACEOF
-    ;;
-esac
-
-
-# Checks for types.
-echo "$as_me:$LINENO: checking for uintptr_t" >&5
-echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6
-if test "${ac_cv_type_uintptr_t+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-if ((uintptr_t *) 0)
-  return 0;
-if (sizeof (uintptr_t))
-  return 0;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_uintptr_t=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_type_uintptr_t=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5
-echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6
-if test $ac_cv_type_uintptr_t = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_UINTPTR_T 1
-_ACEOF
-
-
-fi
-
-
-# Checks for library functions.
-
-
-
-
-
-for ac_func in $gl_func_list
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-
-
-
-
-
-  :
-
-
-
-
-
-echo "$as_me:$LINENO: checking if malloc debugging is wanted" >&5
-echo $ECHO_N "checking if malloc debugging is wanted... $ECHO_C" >&6
-
-# Check whether --with-dmalloc or --without-dmalloc was given.
-if test "${with_dmalloc+set}" = set; then
-  withval="$with_dmalloc"
-  if test "$withval" = yes; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-
-cat >>confdefs.h <<\_ACEOF
-#define WITH_DMALLOC 1
-_ACEOF
-
-  LIBS="$LIBS -ldmalloc"
-  LDFLAGS="$LDFLAGS -g"
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi;
-
-
- echo "$as_me:$LINENO: checking for pid_t" >&5
-echo $ECHO_N "checking for pid_t... $ECHO_C" >&6
-if test "${ac_cv_type_pid_t+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-if ((pid_t *) 0)
-  return 0;
-if (sizeof (pid_t))
-  return 0;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_pid_t=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_type_pid_t=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5
-echo "${ECHO_T}$ac_cv_type_pid_t" >&6
-if test $ac_cv_type_pid_t = yes; then
-  :
-else
-
-cat >>confdefs.h <<_ACEOF
-#define pid_t int
-_ACEOF
-
-fi
-
- echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5
-echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6
-if test "${ac_cv_header_sys_wait_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <sys/types.h>
-#include <sys/wait.h>
-#ifndef WEXITSTATUS
-# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
-#endif
-#ifndef WIFEXITED
-# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
-#endif
-
-int
-main ()
-{
-  int s;
-  wait (&s);
-  s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_header_sys_wait_h=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_header_sys_wait_h=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5
-echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6
-if test $ac_cv_header_sys_wait_h = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_SYS_WAIT_H 1
-_ACEOF
-
-fi
-
-
-
-for ac_func in dup2 waitpid
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-
-for ac_header in unistd.h vfork.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&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; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## -------------------------------- ##
-## Report this to bug-bison@gnu.org ##
-## -------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
-for ac_func in fork vfork
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-if test "x$ac_cv_func_fork" = xyes; then
-  echo "$as_me:$LINENO: checking for working fork" >&5
-echo $ECHO_N "checking for working fork... $ECHO_C" >&6
-if test "${ac_cv_func_fork_works+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test "$cross_compiling" = yes; then
-  ac_cv_func_fork_works=cross
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* By Ruediger Kuhlmann. */
-      #include <sys/types.h>
-      #if HAVE_UNISTD_H
-      # include <unistd.h>
-      #endif
-      /* Some systems only have a dummy stub for fork() */
-      int main ()
-      {
-	if (fork() < 0)
-	  exit (1);
-	exit (0);
-      }
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_fork_works=yes
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-ac_cv_func_fork_works=no
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_fork_works" >&5
-echo "${ECHO_T}$ac_cv_func_fork_works" >&6
-
-else
-  ac_cv_func_fork_works=$ac_cv_func_fork
-fi
-if test "x$ac_cv_func_fork_works" = xcross; then
-  case $host in
-    *-*-amigaos* | *-*-msdosdjgpp*)
-      # Override, as these systems have only a dummy fork() stub
-      ac_cv_func_fork_works=no
-      ;;
-    *)
-      ac_cv_func_fork_works=yes
-      ;;
-  esac
-  { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5
-echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;}
-fi
-ac_cv_func_vfork_works=$ac_cv_func_vfork
-if test "x$ac_cv_func_vfork" = xyes; then
-  echo "$as_me:$LINENO: checking for working vfork" >&5
-echo $ECHO_N "checking for working vfork... $ECHO_C" >&6
-if test "${ac_cv_func_vfork_works+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test "$cross_compiling" = yes; then
-  ac_cv_func_vfork_works=cross
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Thanks to Paul Eggert for this test.  */
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-#if HAVE_VFORK_H
-# include <vfork.h>
-#endif
-/* On some sparc systems, changes by the child to local and incoming
-   argument registers are propagated back to the parent.  The compiler
-   is told about this with #include <vfork.h>, but some compilers
-   (e.g. gcc -O) don't grok <vfork.h>.  Test for this by using a
-   static variable whose address is put into a register that is
-   clobbered by the vfork.  */
-static void
-#ifdef __cplusplus
-sparc_address_test (int arg)
-# else
-sparc_address_test (arg) int arg;
-#endif
-{
-  static pid_t child;
-  if (!child) {
-    child = vfork ();
-    if (child < 0) {
-      perror ("vfork");
-      _exit(2);
-    }
-    if (!child) {
-      arg = getpid();
-      write(-1, "", 0);
-      _exit (arg);
-    }
-  }
-}
-
-int
-main ()
-{
-  pid_t parent = getpid ();
-  pid_t child;
-
-  sparc_address_test (0);
-
-  child = vfork ();
-
-  if (child == 0) {
-    /* Here is another test for sparc vfork register problems.  This
-       test uses lots of local variables, at least as many local
-       variables as main has allocated so far including compiler
-       temporaries.  4 locals are enough for gcc 1.40.3 on a Solaris
-       4.1.3 sparc, but we use 8 to be safe.  A buggy compiler should
-       reuse the register of parent for one of the local variables,
-       since it will think that parent can't possibly be used any more
-       in this routine.  Assigning to the local variable will thus
-       munge parent in the parent process.  */
-    pid_t
-      p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),
-      p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();
-    /* Convince the compiler that p..p7 are live; otherwise, it might
-       use the same hardware register for all 8 local variables.  */
-    if (p != p1 || p != p2 || p != p3 || p != p4
-	|| p != p5 || p != p6 || p != p7)
-      _exit(1);
-
-    /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent
-       from child file descriptors.  If the child closes a descriptor
-       before it execs or exits, this munges the parent's descriptor
-       as well.  Test for this by closing stdout in the child.  */
-    _exit(close(fileno(stdout)) != 0);
-  } else {
-    int status;
-    struct stat st;
-
-    while (wait(&status) != child)
-      ;
-    exit(
-	 /* Was there some problem with vforking?  */
-	 child < 0
-
-	 /* Did the child fail?  (This shouldn't happen.)  */
-	 || status
-
-	 /* Did the vfork/compiler bug occur?  */
-	 || parent != getpid()
-
-	 /* Did the file descriptor bug occur?  */
-	 || fstat(fileno(stdout), &st) != 0
-	 );
-  }
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_vfork_works=yes
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-ac_cv_func_vfork_works=no
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_vfork_works" >&5
-echo "${ECHO_T}$ac_cv_func_vfork_works" >&6
-
-fi;
-if test "x$ac_cv_func_fork_works" = xcross; then
-  ac_cv_func_vfork_works=$ac_cv_func_vfork
-  { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5
-echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;}
-fi
-
-if test "x$ac_cv_func_vfork_works" = xyes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_WORKING_VFORK 1
-_ACEOF
-
-else
-
-cat >>confdefs.h <<\_ACEOF
-#define vfork fork
-_ACEOF
-
-fi
-if test "x$ac_cv_func_fork_works" = xyes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_WORKING_FORK 1
-_ACEOF
-
-fi
-
-
-
-
-for ac_header in sys/time.h sys/times.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&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; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## -------------------------------- ##
-## Report this to bug-bison@gnu.org ##
-## -------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in sys/resource.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#if HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
-#ifdef HAVE_SYS_TIMES_H
-# include <sys/times.h>
-#endif
-
-
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_Header=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_Header=no"
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_func in times
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-echo "$as_me:$LINENO: checking whether getrusage is declared" >&5
-echo $ECHO_N "checking whether getrusage is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_getrusage+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#if HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
-#if HAVE_SYS_TIMES_H
-# include <sys/times.h>
-#endif
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-
-int
-main ()
-{
-#ifndef getrusage
-  char *p = (char *) getrusage;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_getrusage=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_getrusage=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_getrusage" >&5
-echo "${ECHO_T}$ac_cv_have_decl_getrusage" >&6
-if test $ac_cv_have_decl_getrusage = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_GETRUSAGE 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_GETRUSAGE 0
-_ACEOF
-
-
-fi
-echo "$as_me:$LINENO: checking whether times is declared" >&5
-echo $ECHO_N "checking whether times is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_times+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#if HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
-#if HAVE_SYS_TIMES_H
-# include <sys/times.h>
-#endif
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-
-int
-main ()
-{
-#ifndef times
-  char *p = (char *) times;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_times=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_times=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_times" >&5
-echo "${ECHO_T}$ac_cv_have_decl_times" >&6
-if test $ac_cv_have_decl_times = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_TIMES 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_TIMES 0
-_ACEOF
-
-
-fi
-echo "$as_me:$LINENO: checking whether clock is declared" >&5
-echo $ECHO_N "checking whether clock is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_clock+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#if HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
-#if HAVE_SYS_TIMES_H
-# include <sys/times.h>
-#endif
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-
-int
-main ()
-{
-#ifndef clock
-  char *p = (char *) clock;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_clock=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_clock=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_clock" >&5
-echo "${ECHO_T}$ac_cv_have_decl_clock" >&6
-if test $ac_cv_have_decl_clock = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_CLOCK 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_CLOCK 0
-_ACEOF
-
-
-fi
-echo "$as_me:$LINENO: checking whether sysconf is declared" >&5
-echo $ECHO_N "checking whether sysconf is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_sysconf+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#if HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
-#if HAVE_SYS_TIMES_H
-# include <sys/times.h>
-#endif
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-
-int
-main ()
-{
-#ifndef sysconf
-  char *p = (char *) sysconf;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_sysconf=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_sysconf=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_sysconf" >&5
-echo "${ECHO_T}$ac_cv_have_decl_sysconf" >&6
-if test $ac_cv_have_decl_sysconf = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_SYSCONF 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_SYSCONF 0
-_ACEOF
-
-
-fi
-
-
-
-echo "$as_me:$LINENO: checking for clock_t" >&5
-echo $ECHO_N "checking for clock_t... $ECHO_C" >&6
-if test "${ac_cv_type_clock_t+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#if HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
-#if HAVE_SYS_TIMES_H
-# include <sys/times.h>
-#endif
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-
-int
-main ()
-{
-if ((clock_t *) 0)
-  return 0;
-if (sizeof (clock_t))
-  return 0;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_clock_t=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_type_clock_t=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_clock_t" >&5
-echo "${ECHO_T}$ac_cv_type_clock_t" >&6
-if test $ac_cv_type_clock_t = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_CLOCK_T 1
-_ACEOF
-
-
-fi
-echo "$as_me:$LINENO: checking for struct tms" >&5
-echo $ECHO_N "checking for struct tms... $ECHO_C" >&6
-if test "${ac_cv_type_struct_tms+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#if HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
-#if HAVE_SYS_TIMES_H
-# include <sys/times.h>
-#endif
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-
-int
-main ()
-{
-if ((struct tms *) 0)
-  return 0;
-if (sizeof (struct tms))
-  return 0;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_struct_tms=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_type_struct_tms=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_struct_tms" >&5
-echo "${ECHO_T}$ac_cv_type_struct_tms" >&6
-if test $ac_cv_type_struct_tms = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STRUCT_TMS 1
-_ACEOF
-
-
-fi
-
-
-
-# gnulib and gettext.
-
-    echo "$as_me:$LINENO: checking whether system is Windows or MSDOS" >&5
-echo $ECHO_N "checking whether system is Windows or MSDOS... $ECHO_C" >&6
-if test "${ac_cv_win_or_dos+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 ()
-{
-#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __CYGWIN__
-neither MSDOS nor Windows
-#endif
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_win_or_dos=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_win_or_dos=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_win_or_dos" >&5
-echo "${ECHO_T}$ac_cv_win_or_dos" >&6
-
-    if test x"$ac_cv_win_or_dos" = xyes; then
-      ac_fs_accepts_drive_letter_prefix=1
-      ac_fs_backslash_is_file_name_separator=1
-    else
-      ac_fs_accepts_drive_letter_prefix=0
-      ac_fs_backslash_is_file_name_separator=0
-    fi
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX $ac_fs_accepts_drive_letter_prefix
-_ACEOF
-
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR $ac_fs_backslash_is_file_name_separator
-_ACEOF
-
-
-echo "$as_me:$LINENO: checking whether strerror_r is declared" >&5
-echo $ECHO_N "checking whether strerror_r is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_strerror_r+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef strerror_r
-  char *p = (char *) strerror_r;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_strerror_r=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_strerror_r=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_strerror_r" >&5
-echo "${ECHO_T}$ac_cv_have_decl_strerror_r" >&6
-if test $ac_cv_have_decl_strerror_r = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRERROR_R 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRERROR_R 0
-_ACEOF
-
-
-fi
-
-
-
-for ac_func in strerror_r
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-echo "$as_me:$LINENO: checking whether strerror_r returns char *" >&5
-echo $ECHO_N "checking whether strerror_r returns char *... $ECHO_C" >&6
-if test "${ac_cv_func_strerror_r_char_p+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-
-    ac_cv_func_strerror_r_char_p=no
-    if test $ac_cv_have_decl_strerror_r = yes; then
-      cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-
-	  char buf[100];
-	  char x = *strerror_r (0, buf, sizeof buf);
-	  char *p = strerror_r (0, buf, sizeof buf);
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_strerror_r_char_p=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-    else
-      # strerror_r is not declared.  Choose between
-      # systems that have relatively inaccessible declarations for the
-      # function.  BeOS and DEC UNIX 4.0 fall in this category, but the
-      # former has a strerror_r that returns char*, while the latter
-      # has a strerror_r that returns `int'.
-      # This test should segfault on the DEC system.
-      if test "$cross_compiling" = yes; then
-  :
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-	extern char *strerror_r ();
-int
-main ()
-{
-char buf[100];
-	  char x = *strerror_r (0, buf, sizeof buf);
-	  exit (!isalpha (x));
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_strerror_r_char_p=yes
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-    fi
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_strerror_r_char_p" >&5
-echo "${ECHO_T}$ac_cv_func_strerror_r_char_p" >&6
-if test $ac_cv_func_strerror_r_char_p = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define STRERROR_R_CHAR_P 1
-_ACEOF
-
-fi
-
-
-  if test -z "$GETOPT_H"; then
-
-for ac_header in getopt.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&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; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## -------------------------------- ##
-## Report this to bug-bison@gnu.org ##
-## -------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-else
-  GETOPT_H=getopt.h
-fi
-
-done
-
-  fi
-
-  if test -z "$GETOPT_H"; then
-
-for ac_func in getopt_long_only
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-else
-  GETOPT_H=getopt.h
-fi
-done
-
-  fi
-
-      if test -z "$GETOPT_H"; then
-    echo "$as_me:$LINENO: checking whether optreset is declared" >&5
-echo $ECHO_N "checking whether optreset is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_optreset+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <getopt.h>
-
-int
-main ()
-{
-#ifndef optreset
-  char *p = (char *) optreset;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_optreset=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_optreset=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_optreset" >&5
-echo "${ECHO_T}$ac_cv_have_decl_optreset" >&6
-if test $ac_cv_have_decl_optreset = yes; then
-  GETOPT_H=getopt.h
-fi
-
-  fi
-
-      if test -z "$GETOPT_H"; then
-    echo "$as_me:$LINENO: checking for working GNU getopt function" >&5
-echo $ECHO_N "checking for working GNU getopt function... $ECHO_C" >&6
-if test "${gl_cv_func_gnu_getopt+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test "$cross_compiling" = yes; then
-  	 	 	 echo "$as_me:$LINENO: checking whether getopt_clip is declared" >&5
-echo $ECHO_N "checking whether getopt_clip is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_getopt_clip+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <getopt.h>
-
-int
-main ()
-{
-#ifndef getopt_clip
-  char *p = (char *) getopt_clip;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_getopt_clip=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_getopt_clip=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_getopt_clip" >&5
-echo "${ECHO_T}$ac_cv_have_decl_getopt_clip" >&6
-if test $ac_cv_have_decl_getopt_clip = yes; then
-  gl_cv_func_gnu_getopt=no
-else
-  gl_cv_func_gnu_getopt=yes
-fi
-
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <getopt.h>
-int
-main ()
-{
-
-	     char *myargv[3];
-	     myargv[0] = "conftest";
-	     myargv[1] = "-+";
-	     myargv[2] = 0;
-	     return getopt (2, myargv, "+a") != '?';
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  gl_cv_func_gnu_getopt=yes
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-gl_cv_func_gnu_getopt=no
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-echo "$as_me:$LINENO: result: $gl_cv_func_gnu_getopt" >&5
-echo "${ECHO_T}$gl_cv_func_gnu_getopt" >&6
-    if test "$gl_cv_func_gnu_getopt" = "no"; then
-      GETOPT_H=getopt.h
-    fi
-  fi
-
-
-      echo "$as_me:$LINENO: checking whether getenv is declared" >&5
-echo $ECHO_N "checking whether getenv is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_getenv+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef getenv
-  char *p = (char *) getenv;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_getenv=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_getenv=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_getenv" >&5
-echo "${ECHO_T}$ac_cv_have_decl_getenv" >&6
-if test $ac_cv_have_decl_getenv = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_GETENV 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_GETENV 0
-_ACEOF
-
-
-fi
-
-
-
-
-
-        MKINSTALLDIRS=
-  if test -n "$ac_aux_dir"; then
-    case "$ac_aux_dir" in
-      /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;;
-      *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;;
-    esac
-  fi
-  if test -z "$MKINSTALLDIRS"; then
-    MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
-  fi
-
-
-
-  echo "$as_me:$LINENO: checking whether NLS is requested" >&5
-echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
-    # Check whether --enable-nls or --disable-nls was given.
-if test "${enable_nls+set}" = set; then
-  enableval="$enable_nls"
-  USE_NLS=$enableval
-else
-  USE_NLS=yes
-fi;
-  echo "$as_me:$LINENO: result: $USE_NLS" >&5
-echo "${ECHO_T}$USE_NLS" >&6
-
-
-
-
-
-
-# Prepare PATH_SEPARATOR.
-# 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
-
-# Find out how to test for executable files. Don't use a zero-byte file,
-# as systems may use methods other than mode bits to determine executability.
-cat >conf$$.file <<_ASEOF
-#! /bin/sh
-exit 0
-_ASEOF
-chmod +x conf$$.file
-if test -x conf$$.file >/dev/null 2>&1; then
-  ac_executable_p="test -x"
-else
-  ac_executable_p="test -f"
-fi
-rm -f conf$$.file
-
-# Extract the first word of "msgfmt", so it can be a program name with args.
-set dummy msgfmt; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_MSGFMT+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  case "$MSGFMT" in
-  [\\/]* | ?:[\\/]*)
-    ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
-    ;;
-  *)
-    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH; do
-      IFS="$ac_save_IFS"
-      test -z "$ac_dir" && ac_dir=.
-      for ac_exec_ext in '' $ac_executable_extensions; do
-        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
-          echo "$as_me: trying $ac_dir/$ac_word..." >&5
-          if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 &&
-     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
-            ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
-            break 2
-          fi
-        fi
-      done
-    done
-    IFS="$ac_save_IFS"
-  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
-    ;;
-esac
-fi
-MSGFMT="$ac_cv_path_MSGFMT"
-if test "$MSGFMT" != ":"; then
-  echo "$as_me:$LINENO: result: $MSGFMT" >&5
-echo "${ECHO_T}$MSGFMT" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  # Extract the first word of "gmsgfmt", so it can be a program name with args.
-set dummy gmsgfmt; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_GMSGFMT+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  case $GMSGFMT in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
-  ;;
-esac
-fi
-GMSGFMT=$ac_cv_path_GMSGFMT
-
-if test -n "$GMSGFMT"; then
-  echo "$as_me:$LINENO: result: $GMSGFMT" >&5
-echo "${ECHO_T}$GMSGFMT" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-
-
-# Prepare PATH_SEPARATOR.
-# 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
-
-# Find out how to test for executable files. Don't use a zero-byte file,
-# as systems may use methods other than mode bits to determine executability.
-cat >conf$$.file <<_ASEOF
-#! /bin/sh
-exit 0
-_ASEOF
-chmod +x conf$$.file
-if test -x conf$$.file >/dev/null 2>&1; then
-  ac_executable_p="test -x"
-else
-  ac_executable_p="test -f"
-fi
-rm -f conf$$.file
-
-# Extract the first word of "xgettext", so it can be a program name with args.
-set dummy xgettext; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_XGETTEXT+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  case "$XGETTEXT" in
-  [\\/]* | ?:[\\/]*)
-    ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
-    ;;
-  *)
-    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH; do
-      IFS="$ac_save_IFS"
-      test -z "$ac_dir" && ac_dir=.
-      for ac_exec_ext in '' $ac_executable_extensions; do
-        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
-          echo "$as_me: trying $ac_dir/$ac_word..." >&5
-          if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 &&
-     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
-            ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
-            break 2
-          fi
-        fi
-      done
-    done
-    IFS="$ac_save_IFS"
-  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
-    ;;
-esac
-fi
-XGETTEXT="$ac_cv_path_XGETTEXT"
-if test "$XGETTEXT" != ":"; then
-  echo "$as_me:$LINENO: result: $XGETTEXT" >&5
-echo "${ECHO_T}$XGETTEXT" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-    rm -f messages.po
-
-
-# Prepare PATH_SEPARATOR.
-# 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
-
-# Find out how to test for executable files. Don't use a zero-byte file,
-# as systems may use methods other than mode bits to determine executability.
-cat >conf$$.file <<_ASEOF
-#! /bin/sh
-exit 0
-_ASEOF
-chmod +x conf$$.file
-if test -x conf$$.file >/dev/null 2>&1; then
-  ac_executable_p="test -x"
-else
-  ac_executable_p="test -f"
-fi
-rm -f conf$$.file
-
-# Extract the first word of "msgmerge", so it can be a program name with args.
-set dummy msgmerge; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_MSGMERGE+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  case "$MSGMERGE" in
-  [\\/]* | ?:[\\/]*)
-    ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
-    ;;
-  *)
-    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH; do
-      IFS="$ac_save_IFS"
-      test -z "$ac_dir" && ac_dir=.
-      for ac_exec_ext in '' $ac_executable_extensions; do
-        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
-          echo "$as_me: trying $ac_dir/$ac_word..." >&5
-          if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
-            ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
-            break 2
-          fi
-        fi
-      done
-    done
-    IFS="$ac_save_IFS"
-  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
-    ;;
-esac
-fi
-MSGMERGE="$ac_cv_path_MSGMERGE"
-if test "$MSGMERGE" != ":"; then
-  echo "$as_me:$LINENO: result: $MSGMERGE" >&5
-echo "${ECHO_T}$MSGMERGE" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-
-      if test "$GMSGFMT" != ":"; then
-            if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
-       (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
-      : ;
-    else
-      GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
-      echo "$as_me:$LINENO: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5
-echo "${ECHO_T}found $GMSGFMT program is not GNU msgfmt; ignore it" >&6
-      GMSGFMT=":"
-    fi
-  fi
-
-      if test "$XGETTEXT" != ":"; then
-            if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
-       (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
-      : ;
-    else
-      echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5
-echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6
-      XGETTEXT=":"
-    fi
-        rm -f messages.po
-  fi
-
-            ac_config_commands="$ac_config_commands default-1"
-
-
-
-      if test "X$prefix" = "XNONE"; then
-    acl_final_prefix="$ac_default_prefix"
-  else
-    acl_final_prefix="$prefix"
-  fi
-  if test "X$exec_prefix" = "XNONE"; then
-    acl_final_exec_prefix='${prefix}'
-  else
-    acl_final_exec_prefix="$exec_prefix"
-  fi
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
-  prefix="$acl_save_prefix"
-
-# Make sure we can run config.sub.
-$ac_config_sub sun4 >/dev/null 2>&1 ||
-  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
-echo "$as_me: error: cannot run $ac_config_sub" >&2;}
-   { (exit 1); exit 1; }; }
-
-echo "$as_me:$LINENO: checking build system type" >&5
-echo $ECHO_N "checking build system type... $ECHO_C" >&6
-if test "${ac_cv_build+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_build_alias=$build_alias
-test -z "$ac_cv_build_alias" &&
-  ac_cv_build_alias=`$ac_config_guess`
-test -z "$ac_cv_build_alias" &&
-  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
-echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
-   { (exit 1); exit 1; }; }
-ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-echo "${ECHO_T}$ac_cv_build" >&6
-build=$ac_cv_build
-build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-
-echo "$as_me:$LINENO: checking host system type" >&5
-echo $ECHO_N "checking host system type... $ECHO_C" >&6
-if test "${ac_cv_host+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_host_alias=$host_alias
-test -z "$ac_cv_host_alias" &&
-  ac_cv_host_alias=$ac_cv_build_alias
-ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_host" >&5
-echo "${ECHO_T}$ac_cv_host" >&6
-host=$ac_cv_host
-host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-
-
-# Check whether --with-gnu-ld or --without-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then
-  withval="$with_gnu_ld"
-  test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi;
-# Prepare PATH_SEPARATOR.
-# 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
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  echo "$as_me:$LINENO: checking for ld used by GCC" >&5
-echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | [A-Za-z]:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the path of ld
-      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
-      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  echo "$as_me:$LINENO: checking for GNU ld" >&5
-echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
-else
-  echo "$as_me:$LINENO: checking for non-GNU ld" >&5
-echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
-fi
-if test "${acl_cv_path_LD+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -z "$LD"; then
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      acl_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some GNU ld's only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break ;;
-      *)
-	test "$with_gnu_ld" != yes && break ;;
-      esac
-    fi
-  done
-  IFS="$ac_save_ifs"
-else
-  acl_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$acl_cv_path_LD"
-if test -n "$LD"; then
-  echo "$as_me:$LINENO: result: $LD" >&5
-echo "${ECHO_T}$LD" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
-echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
-   { (exit 1); exit 1; }; }
-echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
-echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
-if test "${acl_cv_prog_gnu_ld+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  # I'd rather use --version here, but apparently some GNU ld's only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  acl_cv_prog_gnu_ld=yes ;;
-*)
-  acl_cv_prog_gnu_ld=no ;;
-esac
-fi
-echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5
-echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6
-with_gnu_ld=$acl_cv_prog_gnu_ld
-
-
-
-
-                                                echo "$as_me:$LINENO: checking for shared library run path origin" >&5
-echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6
-if test "${acl_cv_rpath+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-
-    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
-    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
-    . ./conftest.sh
-    rm -f ./conftest.sh
-    acl_cv_rpath=done
-
-fi
-echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5
-echo "${ECHO_T}$acl_cv_rpath" >&6
-  wl="$acl_cv_wl"
-  libext="$acl_cv_libext"
-  shlibext="$acl_cv_shlibext"
-  hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
-  hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
-  hardcode_direct="$acl_cv_hardcode_direct"
-  hardcode_minus_L="$acl_cv_hardcode_minus_L"
-    # Check whether --enable-rpath or --disable-rpath was given.
-if test "${enable_rpath+set}" = set; then
-  enableval="$enable_rpath"
-  :
-else
-  enable_rpath=yes
-fi;
-
-
-                  acl_libdirstem=lib
-  searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
-  if test -n "$searchpath"; then
-    acl_save_IFS="${IFS= 	}"; IFS=":"
-    for searchdir in $searchpath; do
-      if test -d "$searchdir"; then
-        case "$searchdir" in
-          */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
-          *) searchdir=`cd "$searchdir" && pwd`
-             case "$searchdir" in
-               */lib64 ) acl_libdirstem=lib64 ;;
-             esac ;;
-        esac
-      fi
-    done
-    IFS="$acl_save_IFS"
-  fi
-
-
-
-
-
-
-
-
-    use_additional=yes
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-
-    eval additional_includedir=\"$includedir\"
-    eval additional_libdir=\"$libdir\"
-
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-
-# Check whether --with-libiconv-prefix or --without-libiconv-prefix was given.
-if test "${with_libiconv_prefix+set}" = set; then
-  withval="$with_libiconv_prefix"
-
-    if test "X$withval" = "Xno"; then
-      use_additional=no
-    else
-      if test "X$withval" = "X"; then
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-
-          eval additional_includedir=\"$includedir\"
-          eval additional_libdir=\"$libdir\"
-
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-      else
-        additional_includedir="$withval/include"
-        additional_libdir="$withval/$acl_libdirstem"
-      fi
-    fi
-
-fi;
-      LIBICONV=
-  LTLIBICONV=
-  INCICONV=
-  rpathdirs=
-  ltrpathdirs=
-  names_already_handled=
-  names_next_round='iconv '
-  while test -n "$names_next_round"; do
-    names_this_round="$names_next_round"
-    names_next_round=
-    for name in $names_this_round; do
-      already_handled=
-      for n in $names_already_handled; do
-        if test "$n" = "$name"; then
-          already_handled=yes
-          break
-        fi
-      done
-      if test -z "$already_handled"; then
-        names_already_handled="$names_already_handled $name"
-                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
-        eval value=\"\$HAVE_LIB$uppername\"
-        if test -n "$value"; then
-          if test "$value" = yes; then
-            eval value=\"\$LIB$uppername\"
-            test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
-            eval value=\"\$LTLIB$uppername\"
-            test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
-          else
-                                    :
-          fi
-        else
-                              found_dir=
-          found_la=
-          found_so=
-          found_a=
-          if test $use_additional = yes; then
-            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
-              found_dir="$additional_libdir"
-              found_so="$additional_libdir/lib$name.$shlibext"
-              if test -f "$additional_libdir/lib$name.la"; then
-                found_la="$additional_libdir/lib$name.la"
-              fi
-            else
-              if test -f "$additional_libdir/lib$name.$libext"; then
-                found_dir="$additional_libdir"
-                found_a="$additional_libdir/lib$name.$libext"
-                if test -f "$additional_libdir/lib$name.la"; then
-                  found_la="$additional_libdir/lib$name.la"
-                fi
-              fi
-            fi
-          fi
-          if test "X$found_dir" = "X"; then
-            for x in $LDFLAGS $LTLIBICONV; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-              case "$x" in
-                -L*)
-                  dir=`echo "X$x" | sed -e 's/^X-L//'`
-                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
-                    found_dir="$dir"
-                    found_so="$dir/lib$name.$shlibext"
-                    if test -f "$dir/lib$name.la"; then
-                      found_la="$dir/lib$name.la"
-                    fi
-                  else
-                    if test -f "$dir/lib$name.$libext"; then
-                      found_dir="$dir"
-                      found_a="$dir/lib$name.$libext"
-                      if test -f "$dir/lib$name.la"; then
-                        found_la="$dir/lib$name.la"
-                      fi
-                    fi
-                  fi
-                  ;;
-              esac
-              if test "X$found_dir" != "X"; then
-                break
-              fi
-            done
-          fi
-          if test "X$found_dir" != "X"; then
-                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
-            if test "X$found_so" != "X"; then
-                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
-                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
-              else
-                                                                                haveit=
-                for x in $ltrpathdirs; do
-                  if test "X$x" = "X$found_dir"; then
-                    haveit=yes
-                    break
-                  fi
-                done
-                if test -z "$haveit"; then
-                  ltrpathdirs="$ltrpathdirs $found_dir"
-                fi
-                                if test "$hardcode_direct" = yes; then
-                                                      LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
-                else
-                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
-                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
-                                                            haveit=
-                    for x in $rpathdirs; do
-                      if test "X$x" = "X$found_dir"; then
-                        haveit=yes
-                        break
-                      fi
-                    done
-                    if test -z "$haveit"; then
-                      rpathdirs="$rpathdirs $found_dir"
-                    fi
-                  else
-                                                                                haveit=
-                    for x in $LDFLAGS $LIBICONV; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-                      if test "X$x" = "X-L$found_dir"; then
-                        haveit=yes
-                        break
-                      fi
-                    done
-                    if test -z "$haveit"; then
-                      LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
-                    fi
-                    if test "$hardcode_minus_L" != no; then
-                                                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
-                    else
-                                                                                                                                                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
-                    fi
-                  fi
-                fi
-              fi
-            else
-              if test "X$found_a" != "X"; then
-                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
-              else
-                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
-              fi
-            fi
-                        additional_includedir=
-            case "$found_dir" in
-              */$acl_libdirstem | */$acl_libdirstem/)
-                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
-                additional_includedir="$basedir/include"
-                ;;
-            esac
-            if test "X$additional_includedir" != "X"; then
-                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
-                haveit=
-                if test "X$additional_includedir" = "X/usr/local/include"; then
-                  if test -n "$GCC"; then
-                    case $host_os in
-                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
-                    esac
-                  fi
-                fi
-                if test -z "$haveit"; then
-                  for x in $CPPFLAGS $INCICONV; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-                    if test "X$x" = "X-I$additional_includedir"; then
-                      haveit=yes
-                      break
-                    fi
-                  done
-                  if test -z "$haveit"; then
-                    if test -d "$additional_includedir"; then
-                                            INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
-                    fi
-                  fi
-                fi
-              fi
-            fi
-                        if test -n "$found_la"; then
-                                                        save_libdir="$libdir"
-              case "$found_la" in
-                */* | *\\*) . "$found_la" ;;
-                *) . "./$found_la" ;;
-              esac
-              libdir="$save_libdir"
-                            for dep in $dependency_libs; do
-                case "$dep" in
-                  -L*)
-                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
-                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
-                      haveit=
-                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
-                        if test -n "$GCC"; then
-                          case $host_os in
-                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
-                          esac
-                        fi
-                      fi
-                      if test -z "$haveit"; then
-                        haveit=
-                        for x in $LDFLAGS $LIBICONV; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-                          if test "X$x" = "X-L$additional_libdir"; then
-                            haveit=yes
-                            break
-                          fi
-                        done
-                        if test -z "$haveit"; then
-                          if test -d "$additional_libdir"; then
-                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
-                          fi
-                        fi
-                        haveit=
-                        for x in $LDFLAGS $LTLIBICONV; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-                          if test "X$x" = "X-L$additional_libdir"; then
-                            haveit=yes
-                            break
-                          fi
-                        done
-                        if test -z "$haveit"; then
-                          if test -d "$additional_libdir"; then
-                                                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
-                          fi
-                        fi
-                      fi
-                    fi
-                    ;;
-                  -R*)
-                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
-                    if test "$enable_rpath" != no; then
-                                                                  haveit=
-                      for x in $rpathdirs; do
-                        if test "X$x" = "X$dir"; then
-                          haveit=yes
-                          break
-                        fi
-                      done
-                      if test -z "$haveit"; then
-                        rpathdirs="$rpathdirs $dir"
-                      fi
-                                                                  haveit=
-                      for x in $ltrpathdirs; do
-                        if test "X$x" = "X$dir"; then
-                          haveit=yes
-                          break
-                        fi
-                      done
-                      if test -z "$haveit"; then
-                        ltrpathdirs="$ltrpathdirs $dir"
-                      fi
-                    fi
-                    ;;
-                  -l*)
-                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
-                    ;;
-                  *.la)
-                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
-                    ;;
-                  *)
-                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
-                    LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
-                    ;;
-                esac
-              done
-            fi
-          else
-                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
-            LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
-          fi
-        fi
-      fi
-    done
-  done
-  if test "X$rpathdirs" != "X"; then
-    if test -n "$hardcode_libdir_separator"; then
-                        alldirs=
-      for found_dir in $rpathdirs; do
-        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
-      done
-            acl_save_libdir="$libdir"
-      libdir="$alldirs"
-      eval flag=\"$hardcode_libdir_flag_spec\"
-      libdir="$acl_save_libdir"
-      LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
-    else
-            for found_dir in $rpathdirs; do
-        acl_save_libdir="$libdir"
-        libdir="$found_dir"
-        eval flag=\"$hardcode_libdir_flag_spec\"
-        libdir="$acl_save_libdir"
-        LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
-      done
-    fi
-  fi
-  if test "X$ltrpathdirs" != "X"; then
-            for found_dir in $ltrpathdirs; do
-      LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
-    done
-  fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  echo "$as_me:$LINENO: checking for inttypes.h" >&5
-echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6
-if test "${gl_cv_header_inttypes_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <sys/types.h>
-#include <inttypes.h>
-int
-main ()
-{
-uintmax_t i = (uintmax_t) -1;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  gl_cv_header_inttypes_h=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-gl_cv_header_inttypes_h=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $gl_cv_header_inttypes_h" >&5
-echo "${ECHO_T}$gl_cv_header_inttypes_h" >&6
-  if test $gl_cv_header_inttypes_h = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_INTTYPES_H_WITH_UINTMAX 1
-_ACEOF
-
-  fi
-
-
-  echo "$as_me:$LINENO: checking for stdint.h" >&5
-echo $ECHO_N "checking for stdint.h... $ECHO_C" >&6
-if test "${gl_cv_header_stdint_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <sys/types.h>
-#include <stdint.h>
-int
-main ()
-{
-uintmax_t i = (uintmax_t) -1;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  gl_cv_header_stdint_h=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-gl_cv_header_stdint_h=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $gl_cv_header_stdint_h" >&5
-echo "${ECHO_T}$gl_cv_header_stdint_h" >&6
-  if test $gl_cv_header_stdint_h = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STDINT_H_WITH_UINTMAX 1
-_ACEOF
-
-  fi
-
-
-  echo "$as_me:$LINENO: checking for unsigned long long" >&5
-echo $ECHO_N "checking for unsigned long long... $ECHO_C" >&6
-if test "${ac_cv_type_unsigned_long_long+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.  */
-unsigned long long ull = 1ULL; int i = 63;
-int
-main ()
-{
-unsigned long long ullmax = (unsigned long long) -1;
-     return ull << i | ull >> i | ullmax / ull | ullmax % ull;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_unsigned_long_long=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_type_unsigned_long_long=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long_long" >&5
-echo "${ECHO_T}$ac_cv_type_unsigned_long_long" >&6
-  if test $ac_cv_type_unsigned_long_long = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_UNSIGNED_LONG_LONG 1
-_ACEOF
-
-  fi
-
-
-
-
-  if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
-
-    test $ac_cv_type_unsigned_long_long = yes \
-      && ac_type='unsigned long long' \
-      || ac_type='unsigned long'
-
-cat >>confdefs.h <<_ACEOF
-#define uintmax_t $ac_type
-_ACEOF
-
-  else
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_UINTMAX_T 1
-_ACEOF
-
-  fi
-
-
-      echo "$as_me:$LINENO: checking whether strdup is declared" >&5
-echo $ECHO_N "checking whether strdup is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_strdup+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef strdup
-  char *p = (char *) strdup;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_strdup=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_strdup=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_strdup" >&5
-echo "${ECHO_T}$ac_cv_have_decl_strdup" >&6
-if test $ac_cv_have_decl_strdup = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRDUP 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRDUP 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether strndup is declared" >&5
-echo $ECHO_N "checking whether strndup is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_strndup+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef strndup
-  char *p = (char *) strndup;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_strndup=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_strndup=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_strndup" >&5
-echo "${ECHO_T}$ac_cv_have_decl_strndup" >&6
-if test $ac_cv_have_decl_strndup = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRNDUP 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRNDUP 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether strnlen is declared" >&5
-echo $ECHO_N "checking whether strnlen is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_strnlen+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef strnlen
-  char *p = (char *) strnlen;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_strnlen=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_strnlen=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_strnlen" >&5
-echo "${ECHO_T}$ac_cv_have_decl_strnlen" >&6
-if test $ac_cv_have_decl_strnlen = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRNLEN 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRNLEN 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether clearerr_unlocked is declared" >&5
-echo $ECHO_N "checking whether clearerr_unlocked is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_clearerr_unlocked+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef clearerr_unlocked
-  char *p = (char *) clearerr_unlocked;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_clearerr_unlocked=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_clearerr_unlocked=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_clearerr_unlocked" >&5
-echo "${ECHO_T}$ac_cv_have_decl_clearerr_unlocked" >&6
-if test $ac_cv_have_decl_clearerr_unlocked = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_CLEARERR_UNLOCKED 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_CLEARERR_UNLOCKED 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether feof_unlocked is declared" >&5
-echo $ECHO_N "checking whether feof_unlocked is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_feof_unlocked+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef feof_unlocked
-  char *p = (char *) feof_unlocked;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_feof_unlocked=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_feof_unlocked=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_feof_unlocked" >&5
-echo "${ECHO_T}$ac_cv_have_decl_feof_unlocked" >&6
-if test $ac_cv_have_decl_feof_unlocked = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FEOF_UNLOCKED 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FEOF_UNLOCKED 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether ferror_unlocked is declared" >&5
-echo $ECHO_N "checking whether ferror_unlocked is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_ferror_unlocked+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef ferror_unlocked
-  char *p = (char *) ferror_unlocked;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_ferror_unlocked=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_ferror_unlocked=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_ferror_unlocked" >&5
-echo "${ECHO_T}$ac_cv_have_decl_ferror_unlocked" >&6
-if test $ac_cv_have_decl_ferror_unlocked = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FERROR_UNLOCKED 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FERROR_UNLOCKED 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether fflush_unlocked is declared" >&5
-echo $ECHO_N "checking whether fflush_unlocked is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_fflush_unlocked+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef fflush_unlocked
-  char *p = (char *) fflush_unlocked;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_fflush_unlocked=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_fflush_unlocked=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_fflush_unlocked" >&5
-echo "${ECHO_T}$ac_cv_have_decl_fflush_unlocked" >&6
-if test $ac_cv_have_decl_fflush_unlocked = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FFLUSH_UNLOCKED 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FFLUSH_UNLOCKED 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether fgets_unlocked is declared" >&5
-echo $ECHO_N "checking whether fgets_unlocked is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_fgets_unlocked+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef fgets_unlocked
-  char *p = (char *) fgets_unlocked;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_fgets_unlocked=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_fgets_unlocked=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_fgets_unlocked" >&5
-echo "${ECHO_T}$ac_cv_have_decl_fgets_unlocked" >&6
-if test $ac_cv_have_decl_fgets_unlocked = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FGETS_UNLOCKED 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FGETS_UNLOCKED 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether fputc_unlocked is declared" >&5
-echo $ECHO_N "checking whether fputc_unlocked is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_fputc_unlocked+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef fputc_unlocked
-  char *p = (char *) fputc_unlocked;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_fputc_unlocked=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_fputc_unlocked=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_fputc_unlocked" >&5
-echo "${ECHO_T}$ac_cv_have_decl_fputc_unlocked" >&6
-if test $ac_cv_have_decl_fputc_unlocked = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FPUTC_UNLOCKED 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FPUTC_UNLOCKED 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether fputs_unlocked is declared" >&5
-echo $ECHO_N "checking whether fputs_unlocked is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_fputs_unlocked+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef fputs_unlocked
-  char *p = (char *) fputs_unlocked;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_fputs_unlocked=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_fputs_unlocked=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_fputs_unlocked" >&5
-echo "${ECHO_T}$ac_cv_have_decl_fputs_unlocked" >&6
-if test $ac_cv_have_decl_fputs_unlocked = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FPUTS_UNLOCKED 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FPUTS_UNLOCKED 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether fread_unlocked is declared" >&5
-echo $ECHO_N "checking whether fread_unlocked is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_fread_unlocked+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef fread_unlocked
-  char *p = (char *) fread_unlocked;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_fread_unlocked=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_fread_unlocked=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_fread_unlocked" >&5
-echo "${ECHO_T}$ac_cv_have_decl_fread_unlocked" >&6
-if test $ac_cv_have_decl_fread_unlocked = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FREAD_UNLOCKED 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FREAD_UNLOCKED 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether fwrite_unlocked is declared" >&5
-echo $ECHO_N "checking whether fwrite_unlocked is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_fwrite_unlocked+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef fwrite_unlocked
-  char *p = (char *) fwrite_unlocked;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_fwrite_unlocked=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_fwrite_unlocked=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_fwrite_unlocked" >&5
-echo "${ECHO_T}$ac_cv_have_decl_fwrite_unlocked" >&6
-if test $ac_cv_have_decl_fwrite_unlocked = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FWRITE_UNLOCKED 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FWRITE_UNLOCKED 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether getc_unlocked is declared" >&5
-echo $ECHO_N "checking whether getc_unlocked is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_getc_unlocked+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef getc_unlocked
-  char *p = (char *) getc_unlocked;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_getc_unlocked=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_getc_unlocked=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_getc_unlocked" >&5
-echo "${ECHO_T}$ac_cv_have_decl_getc_unlocked" >&6
-if test $ac_cv_have_decl_getc_unlocked = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_GETC_UNLOCKED 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_GETC_UNLOCKED 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether getchar_unlocked is declared" >&5
-echo $ECHO_N "checking whether getchar_unlocked is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_getchar_unlocked+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef getchar_unlocked
-  char *p = (char *) getchar_unlocked;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_getchar_unlocked=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_getchar_unlocked=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_getchar_unlocked" >&5
-echo "${ECHO_T}$ac_cv_have_decl_getchar_unlocked" >&6
-if test $ac_cv_have_decl_getchar_unlocked = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_GETCHAR_UNLOCKED 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_GETCHAR_UNLOCKED 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether putc_unlocked is declared" >&5
-echo $ECHO_N "checking whether putc_unlocked is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_putc_unlocked+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef putc_unlocked
-  char *p = (char *) putc_unlocked;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_putc_unlocked=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_putc_unlocked=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_putc_unlocked" >&5
-echo "${ECHO_T}$ac_cv_have_decl_putc_unlocked" >&6
-if test $ac_cv_have_decl_putc_unlocked = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_PUTC_UNLOCKED 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_PUTC_UNLOCKED 0
-_ACEOF
-
-
-fi
-
-
-
-
-      echo "$as_me:$LINENO: checking whether putchar_unlocked is declared" >&5
-echo $ECHO_N "checking whether putchar_unlocked is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_putchar_unlocked+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-#ifndef putchar_unlocked
-  char *p = (char *) putchar_unlocked;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_putchar_unlocked=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_putchar_unlocked=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_putchar_unlocked" >&5
-echo "${ECHO_T}$ac_cv_have_decl_putchar_unlocked" >&6
-if test $ac_cv_have_decl_putchar_unlocked = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_PUTCHAR_UNLOCKED 1
-_ACEOF
-
-
-else
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_PUTCHAR_UNLOCKED 0
-_ACEOF
-
-
-fi
-
-
-
-
-
-
-
-  case $LIBOBJS in
-    "dirname.$ac_objext"   | \
-  *" dirname.$ac_objext"   | \
-    "dirname.$ac_objext "* | \
-  *" dirname.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS dirname.$ac_objext" ;;
-esac
-
-
-
-
-
-
-
-  echo "$as_me:$LINENO: checking for error_at_line" >&5
-echo $ECHO_N "checking for error_at_line... $ECHO_C" >&6
-if test "${ac_cv_lib_error_at_line+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-error_at_line (0, 0, "", 0, "");
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_error_at_line=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_error_at_line=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_error_at_line" >&5
-echo "${ECHO_T}$ac_cv_lib_error_at_line" >&6
-if test $ac_cv_lib_error_at_line = no; then
-  case $LIBOBJS in
-    "error.$ac_objext"   | \
-  *" error.$ac_objext"   | \
-    "error.$ac_objext "* | \
-  *" error.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS error.$ac_objext" ;;
-esac
-
-fi
-
-
-
-  :
-
-
-
-
-
-
-  case $LIBOBJS in
-    "exitfail.$ac_objext"   | \
-  *" exitfail.$ac_objext"   | \
-    "exitfail.$ac_objext "* | \
-  *" exitfail.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS exitfail.$ac_objext" ;;
-esac
-
-
-    :
-
-
-
-
-
-  if test -n "$GETOPT_H"; then
-
-  case $LIBOBJS in
-    "getopt.$ac_objext"   | \
-  *" getopt.$ac_objext"   | \
-    "getopt.$ac_objext "* | \
-  *" getopt.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS getopt.$ac_objext" ;;
-esac
-
-  case $LIBOBJS in
-    "getopt1.$ac_objext"   | \
-  *" getopt1.$ac_objext"   | \
-    "getopt1.$ac_objext "* | \
-  *" getopt1.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS getopt1.$ac_objext" ;;
-esac
-
-
-  GETOPT_H=getopt.h
-
-cat >>confdefs.h <<\_ACEOF
-#define __GETOPT_PREFIX rpl_
-_ACEOF
-
-
-
-
-
-  :
-
-
-
-
-
-
-
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    echo "$as_me:$LINENO: checking for CFPreferencesCopyAppValue" >&5
-echo $ECHO_N "checking for CFPreferencesCopyAppValue... $ECHO_C" >&6
-if test "${gt_cv_func_CFPreferencesCopyAppValue+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  gt_save_CPPFLAGS="$CPPFLAGS"
-     CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/CoreFoundation.framework/Headers"
-     gt_save_LIBS="$LIBS"
-     LIBS="$LIBS -framework CoreFoundation"
-     cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <CFPreferences.h>
-int
-main ()
-{
-CFPreferencesCopyAppValue(NULL, NULL)
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  gt_cv_func_CFPreferencesCopyAppValue=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-gt_cv_func_CFPreferencesCopyAppValue=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-     CPPFLAGS="$gt_save_CPPFLAGS"
-     LIBS="$gt_save_LIBS"
-fi
-echo "$as_me:$LINENO: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
-echo "${ECHO_T}$gt_cv_func_CFPreferencesCopyAppValue" >&6
-  if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_CFPREFERENCESCOPYAPPVALUE 1
-_ACEOF
-
-  fi
-    echo "$as_me:$LINENO: checking for CFLocaleCopyCurrent" >&5
-echo $ECHO_N "checking for CFLocaleCopyCurrent... $ECHO_C" >&6
-if test "${gt_cv_func_CFLocaleCopyCurrent+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  gt_save_CPPFLAGS="$CPPFLAGS"
-     CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/CoreFoundation.framework/Headers"
-     gt_save_LIBS="$LIBS"
-     LIBS="$LIBS -framework CoreFoundation"
-     cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <CFLocale.h>
-int
-main ()
-{
-CFLocaleCopyCurrent();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  gt_cv_func_CFLocaleCopyCurrent=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-gt_cv_func_CFLocaleCopyCurrent=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-     CPPFLAGS="$gt_save_CPPFLAGS"
-     LIBS="$gt_save_LIBS"
-fi
-echo "$as_me:$LINENO: result: $gt_cv_func_CFLocaleCopyCurrent" >&5
-echo "${ECHO_T}$gt_cv_func_CFLocaleCopyCurrent" >&6
-  if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_CFLOCALECOPYCURRENT 1
-_ACEOF
-
-  fi
-  INTL_MACOSX_LIBS=
-  if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
-    INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
-  fi
-
-
-
-
-  echo "$as_me:$LINENO: checking whether NLS is requested" >&5
-echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
-    # Check whether --enable-nls or --disable-nls was given.
-if test "${enable_nls+set}" = set; then
-  enableval="$enable_nls"
-  USE_NLS=$enableval
-else
-  USE_NLS=yes
-fi;
-  echo "$as_me:$LINENO: result: $USE_NLS" >&5
-echo "${ECHO_T}$USE_NLS" >&6
-
-
-
-
-  LIBINTL=
-  LTLIBINTL=
-  POSUB=
-
-    if test "$USE_NLS" = "yes"; then
-    gt_use_preinstalled_gnugettext=no
-
-
-
-
-
-
-        echo "$as_me:$LINENO: checking for GNU gettext in libc" >&5
-echo $ECHO_N "checking for GNU gettext in libc... $ECHO_C" >&6
-if test "${gt_cv_func_gnugettext1_libc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <libintl.h>
-extern int _nl_msg_cat_cntr;
-extern int *_nl_domain_bindings;
-int
-main ()
-{
-bindtextdomain ("", "");
-return * gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  gt_cv_func_gnugettext1_libc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-gt_cv_func_gnugettext1_libc=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext1_libc" >&5
-echo "${ECHO_T}$gt_cv_func_gnugettext1_libc" >&6
-
-        if test "$gt_cv_func_gnugettext1_libc" != "yes"; then
-
-
-
-
-
-          am_save_CPPFLAGS="$CPPFLAGS"
-
-  for element in $INCICONV; do
-    haveit=
-    for x in $CPPFLAGS; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-      if test "X$x" = "X$element"; then
-        haveit=yes
-        break
-      fi
-    done
-    if test -z "$haveit"; then
-      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
-    fi
-  done
-
-
-  echo "$as_me:$LINENO: checking for iconv" >&5
-echo $ECHO_N "checking for iconv... $ECHO_C" >&6
-if test "${am_cv_func_iconv+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-
-    am_cv_func_iconv="no, consider installing GNU libiconv"
-    am_cv_lib_iconv=no
-    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <iconv.h>
-int
-main ()
-{
-iconv_t cd = iconv_open("","");
-       iconv(cd,NULL,NULL,NULL,NULL);
-       iconv_close(cd);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  am_cv_func_iconv=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-    if test "$am_cv_func_iconv" != yes; then
-      am_save_LIBS="$LIBS"
-      LIBS="$LIBS $LIBICONV"
-      cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <iconv.h>
-int
-main ()
-{
-iconv_t cd = iconv_open("","");
-         iconv(cd,NULL,NULL,NULL,NULL);
-         iconv_close(cd);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  am_cv_lib_iconv=yes
-        am_cv_func_iconv=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-      LIBS="$am_save_LIBS"
-    fi
-
-fi
-echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5
-echo "${ECHO_T}$am_cv_func_iconv" >&6
-  if test "$am_cv_func_iconv" = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_ICONV 1
-_ACEOF
-
-  fi
-  if test "$am_cv_lib_iconv" = yes; then
-    echo "$as_me:$LINENO: checking how to link with libiconv" >&5
-echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6
-    echo "$as_me:$LINENO: result: $LIBICONV" >&5
-echo "${ECHO_T}$LIBICONV" >&6
-  else
-            CPPFLAGS="$am_save_CPPFLAGS"
-    LIBICONV=
-    LTLIBICONV=
-  fi
-
-
-
-
-
-
-
-    use_additional=yes
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-
-    eval additional_includedir=\"$includedir\"
-    eval additional_libdir=\"$libdir\"
-
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-
-# Check whether --with-libintl-prefix or --without-libintl-prefix was given.
-if test "${with_libintl_prefix+set}" = set; then
-  withval="$with_libintl_prefix"
-
-    if test "X$withval" = "Xno"; then
-      use_additional=no
-    else
-      if test "X$withval" = "X"; then
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-
-          eval additional_includedir=\"$includedir\"
-          eval additional_libdir=\"$libdir\"
-
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-      else
-        additional_includedir="$withval/include"
-        additional_libdir="$withval/$acl_libdirstem"
-      fi
-    fi
-
-fi;
-      LIBINTL=
-  LTLIBINTL=
-  INCINTL=
-  rpathdirs=
-  ltrpathdirs=
-  names_already_handled=
-  names_next_round='intl '
-  while test -n "$names_next_round"; do
-    names_this_round="$names_next_round"
-    names_next_round=
-    for name in $names_this_round; do
-      already_handled=
-      for n in $names_already_handled; do
-        if test "$n" = "$name"; then
-          already_handled=yes
-          break
-        fi
-      done
-      if test -z "$already_handled"; then
-        names_already_handled="$names_already_handled $name"
-                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
-        eval value=\"\$HAVE_LIB$uppername\"
-        if test -n "$value"; then
-          if test "$value" = yes; then
-            eval value=\"\$LIB$uppername\"
-            test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
-            eval value=\"\$LTLIB$uppername\"
-            test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
-          else
-                                    :
-          fi
-        else
-                              found_dir=
-          found_la=
-          found_so=
-          found_a=
-          if test $use_additional = yes; then
-            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
-              found_dir="$additional_libdir"
-              found_so="$additional_libdir/lib$name.$shlibext"
-              if test -f "$additional_libdir/lib$name.la"; then
-                found_la="$additional_libdir/lib$name.la"
-              fi
-            else
-              if test -f "$additional_libdir/lib$name.$libext"; then
-                found_dir="$additional_libdir"
-                found_a="$additional_libdir/lib$name.$libext"
-                if test -f "$additional_libdir/lib$name.la"; then
-                  found_la="$additional_libdir/lib$name.la"
-                fi
-              fi
-            fi
-          fi
-          if test "X$found_dir" = "X"; then
-            for x in $LDFLAGS $LTLIBINTL; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-              case "$x" in
-                -L*)
-                  dir=`echo "X$x" | sed -e 's/^X-L//'`
-                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
-                    found_dir="$dir"
-                    found_so="$dir/lib$name.$shlibext"
-                    if test -f "$dir/lib$name.la"; then
-                      found_la="$dir/lib$name.la"
-                    fi
-                  else
-                    if test -f "$dir/lib$name.$libext"; then
-                      found_dir="$dir"
-                      found_a="$dir/lib$name.$libext"
-                      if test -f "$dir/lib$name.la"; then
-                        found_la="$dir/lib$name.la"
-                      fi
-                    fi
-                  fi
-                  ;;
-              esac
-              if test "X$found_dir" != "X"; then
-                break
-              fi
-            done
-          fi
-          if test "X$found_dir" != "X"; then
-                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
-            if test "X$found_so" != "X"; then
-                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
-                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
-              else
-                                                                                haveit=
-                for x in $ltrpathdirs; do
-                  if test "X$x" = "X$found_dir"; then
-                    haveit=yes
-                    break
-                  fi
-                done
-                if test -z "$haveit"; then
-                  ltrpathdirs="$ltrpathdirs $found_dir"
-                fi
-                                if test "$hardcode_direct" = yes; then
-                                                      LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
-                else
-                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
-                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
-                                                            haveit=
-                    for x in $rpathdirs; do
-                      if test "X$x" = "X$found_dir"; then
-                        haveit=yes
-                        break
-                      fi
-                    done
-                    if test -z "$haveit"; then
-                      rpathdirs="$rpathdirs $found_dir"
-                    fi
-                  else
-                                                                                haveit=
-                    for x in $LDFLAGS $LIBINTL; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-                      if test "X$x" = "X-L$found_dir"; then
-                        haveit=yes
-                        break
-                      fi
-                    done
-                    if test -z "$haveit"; then
-                      LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
-                    fi
-                    if test "$hardcode_minus_L" != no; then
-                                                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
-                    else
-                                                                                                                                                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
-                    fi
-                  fi
-                fi
-              fi
-            else
-              if test "X$found_a" != "X"; then
-                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
-              else
-                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
-              fi
-            fi
-                        additional_includedir=
-            case "$found_dir" in
-              */$acl_libdirstem | */$acl_libdirstem/)
-                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
-                additional_includedir="$basedir/include"
-                ;;
-            esac
-            if test "X$additional_includedir" != "X"; then
-                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
-                haveit=
-                if test "X$additional_includedir" = "X/usr/local/include"; then
-                  if test -n "$GCC"; then
-                    case $host_os in
-                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
-                    esac
-                  fi
-                fi
-                if test -z "$haveit"; then
-                  for x in $CPPFLAGS $INCINTL; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-                    if test "X$x" = "X-I$additional_includedir"; then
-                      haveit=yes
-                      break
-                    fi
-                  done
-                  if test -z "$haveit"; then
-                    if test -d "$additional_includedir"; then
-                                            INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
-                    fi
-                  fi
-                fi
-              fi
-            fi
-                        if test -n "$found_la"; then
-                                                        save_libdir="$libdir"
-              case "$found_la" in
-                */* | *\\*) . "$found_la" ;;
-                *) . "./$found_la" ;;
-              esac
-              libdir="$save_libdir"
-                            for dep in $dependency_libs; do
-                case "$dep" in
-                  -L*)
-                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
-                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
-                      haveit=
-                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
-                        if test -n "$GCC"; then
-                          case $host_os in
-                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
-                          esac
-                        fi
-                      fi
-                      if test -z "$haveit"; then
-                        haveit=
-                        for x in $LDFLAGS $LIBINTL; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-                          if test "X$x" = "X-L$additional_libdir"; then
-                            haveit=yes
-                            break
-                          fi
-                        done
-                        if test -z "$haveit"; then
-                          if test -d "$additional_libdir"; then
-                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir"
-                          fi
-                        fi
-                        haveit=
-                        for x in $LDFLAGS $LTLIBINTL; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-                          if test "X$x" = "X-L$additional_libdir"; then
-                            haveit=yes
-                            break
-                          fi
-                        done
-                        if test -z "$haveit"; then
-                          if test -d "$additional_libdir"; then
-                                                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir"
-                          fi
-                        fi
-                      fi
-                    fi
-                    ;;
-                  -R*)
-                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
-                    if test "$enable_rpath" != no; then
-                                                                  haveit=
-                      for x in $rpathdirs; do
-                        if test "X$x" = "X$dir"; then
-                          haveit=yes
-                          break
-                        fi
-                      done
-                      if test -z "$haveit"; then
-                        rpathdirs="$rpathdirs $dir"
-                      fi
-                                                                  haveit=
-                      for x in $ltrpathdirs; do
-                        if test "X$x" = "X$dir"; then
-                          haveit=yes
-                          break
-                        fi
-                      done
-                      if test -z "$haveit"; then
-                        ltrpathdirs="$ltrpathdirs $dir"
-                      fi
-                    fi
-                    ;;
-                  -l*)
-                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
-                    ;;
-                  *.la)
-                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
-                    ;;
-                  *)
-                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
-                    LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
-                    ;;
-                esac
-              done
-            fi
-          else
-                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
-            LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
-          fi
-        fi
-      fi
-    done
-  done
-  if test "X$rpathdirs" != "X"; then
-    if test -n "$hardcode_libdir_separator"; then
-                        alldirs=
-      for found_dir in $rpathdirs; do
-        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
-      done
-            acl_save_libdir="$libdir"
-      libdir="$alldirs"
-      eval flag=\"$hardcode_libdir_flag_spec\"
-      libdir="$acl_save_libdir"
-      LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
-    else
-            for found_dir in $rpathdirs; do
-        acl_save_libdir="$libdir"
-        libdir="$found_dir"
-        eval flag=\"$hardcode_libdir_flag_spec\"
-        libdir="$acl_save_libdir"
-        LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
-      done
-    fi
-  fi
-  if test "X$ltrpathdirs" != "X"; then
-            for found_dir in $ltrpathdirs; do
-      LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
-    done
-  fi
-
-          echo "$as_me:$LINENO: checking for GNU gettext in libintl" >&5
-echo $ECHO_N "checking for GNU gettext in libintl... $ECHO_C" >&6
-if test "${gt_cv_func_gnugettext1_libintl+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  gt_save_CPPFLAGS="$CPPFLAGS"
-            CPPFLAGS="$CPPFLAGS $INCINTL"
-            gt_save_LIBS="$LIBS"
-            LIBS="$LIBS $LIBINTL"
-                        cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <libintl.h>
-extern int _nl_msg_cat_cntr;
-extern
-#ifdef __cplusplus
-"C"
-#endif
-const char *_nl_expand_alias (const char *);
-int
-main ()
-{
-bindtextdomain ("", "");
-return * gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias ("")
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  gt_cv_func_gnugettext1_libintl=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-gt_cv_func_gnugettext1_libintl=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-                        if test "$gt_cv_func_gnugettext1_libintl" != yes && test -n "$LIBICONV"; then
-              LIBS="$LIBS $LIBICONV"
-              cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <libintl.h>
-extern int _nl_msg_cat_cntr;
-extern
-#ifdef __cplusplus
-"C"
-#endif
-const char *_nl_expand_alias (const char *);
-int
-main ()
-{
-bindtextdomain ("", "");
-return * gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias ("")
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  LIBINTL="$LIBINTL $LIBICONV"
-                LTLIBINTL="$LTLIBINTL $LTLIBICONV"
-                gt_cv_func_gnugettext1_libintl=yes
-
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-            fi
-            CPPFLAGS="$gt_save_CPPFLAGS"
-            LIBS="$gt_save_LIBS"
-fi
-echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext1_libintl" >&5
-echo "${ECHO_T}$gt_cv_func_gnugettext1_libintl" >&6
-        fi
-
-                                        if test "$gt_cv_func_gnugettext1_libc" = "yes" \
-           || { test "$gt_cv_func_gnugettext1_libintl" = "yes" \
-                && test "$PACKAGE" != gettext-runtime \
-                && test "$PACKAGE" != gettext-tools; }; then
-          gt_use_preinstalled_gnugettext=yes
-        else
-                    LIBINTL=
-          LTLIBINTL=
-          INCINTL=
-        fi
-
-
-
-    if test -n "$INTL_MACOSX_LIBS"; then
-      if test "$gt_use_preinstalled_gnugettext" = "yes" \
-         || test "$nls_cv_use_gnu_gettext" = "yes"; then
-                LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
-        LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
-      fi
-    fi
-
-    if test "$gt_use_preinstalled_gnugettext" = "yes" \
-       || test "$nls_cv_use_gnu_gettext" = "yes"; then
-
-cat >>confdefs.h <<\_ACEOF
-#define ENABLE_NLS 1
-_ACEOF
-
-    else
-      USE_NLS=no
-    fi
-  fi
-
-  echo "$as_me:$LINENO: checking whether to use NLS" >&5
-echo $ECHO_N "checking whether to use NLS... $ECHO_C" >&6
-  echo "$as_me:$LINENO: result: $USE_NLS" >&5
-echo "${ECHO_T}$USE_NLS" >&6
-  if test "$USE_NLS" = "yes"; then
-    echo "$as_me:$LINENO: checking where the gettext function comes from" >&5
-echo $ECHO_N "checking where the gettext function comes from... $ECHO_C" >&6
-    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
-      if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then
-        gt_source="external libintl"
-      else
-        gt_source="libc"
-      fi
-    else
-      gt_source="included intl directory"
-    fi
-    echo "$as_me:$LINENO: result: $gt_source" >&5
-echo "${ECHO_T}$gt_source" >&6
-  fi
-
-  if test "$USE_NLS" = "yes"; then
-
-    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
-      if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then
-        echo "$as_me:$LINENO: checking how to link with libintl" >&5
-echo $ECHO_N "checking how to link with libintl... $ECHO_C" >&6
-        echo "$as_me:$LINENO: result: $LIBINTL" >&5
-echo "${ECHO_T}$LIBINTL" >&6
-
-  for element in $INCINTL; do
-    haveit=
-    for x in $CPPFLAGS; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-      if test "X$x" = "X$element"; then
-        haveit=yes
-        break
-      fi
-    done
-    if test -z "$haveit"; then
-      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
-    fi
-  done
-
-      fi
-
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_GETTEXT 1
-_ACEOF
-
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_DCGETTEXT 1
-_ACEOF
-
-    fi
-
-        POSUB=po
-  fi
-
-
-
-    INTLLIBS="$LIBINTL"
-
-
-
-
-
-
-
-
-
-
-
-  case $LIBOBJS in
-    "hard-locale.$ac_objext"   | \
-  *" hard-locale.$ac_objext"   | \
-    "hard-locale.$ac_objext "* | \
-  *" hard-locale.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS hard-locale.$ac_objext" ;;
-esac
-
-
-
-
-
-  case $LIBOBJS in
-    "hash.$ac_objext"   | \
-  *" hash.$ac_objext"   | \
-    "hash.$ac_objext "* | \
-  *" hash.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS hash.$ac_objext" ;;
-esac
-
-
-
-
-
-
-
-for ac_header in stdlib.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&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; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## -------------------------------- ##
-## Report this to bug-bison@gnu.org ##
-## -------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5
-echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6
-if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test "$cross_compiling" = yes; then
-  ac_cv_func_malloc_0_nonnull=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#if STDC_HEADERS || HAVE_STDLIB_H
-# include <stdlib.h>
-#else
-char *malloc ();
-#endif
-
-int
-main ()
-{
-exit (malloc (0) ? 0 : 1);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_malloc_0_nonnull=yes
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-ac_cv_func_malloc_0_nonnull=no
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_malloc_0_nonnull" >&5
-echo "${ECHO_T}$ac_cv_func_malloc_0_nonnull" >&6
-if test $ac_cv_func_malloc_0_nonnull = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_MALLOC 1
-_ACEOF
-
-else
-  cat >>confdefs.h <<\_ACEOF
-#define HAVE_MALLOC 0
-_ACEOF
-
-   case $LIBOBJS in
-    "malloc.$ac_objext"   | \
-  *" malloc.$ac_objext"   | \
-    "malloc.$ac_objext "* | \
-  *" malloc.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;;
-esac
-
-
-cat >>confdefs.h <<\_ACEOF
-#define malloc rpl_malloc
-_ACEOF
-
-fi
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-
-
-
-
-
-
-
-for ac_func in iswcntrl wcwidth
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-    echo "$as_me:$LINENO: checking whether mbrtowc and mbstate_t are properly declared" >&5
-echo $ECHO_N "checking whether mbrtowc and mbstate_t are properly declared... $ECHO_C" >&6
-if test "${gl_cv_func_mbrtowc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <wchar.h>
-int
-main ()
-{
-wchar_t wc;
-              char const s[] = "";
-              size_t n = 1;
-              mbstate_t state;
-              return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  gl_cv_func_mbrtowc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-gl_cv_func_mbrtowc=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $gl_cv_func_mbrtowc" >&5
-echo "${ECHO_T}$gl_cv_func_mbrtowc" >&6
-  if test $gl_cv_func_mbrtowc = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_MBRTOWC 1
-_ACEOF
-
-  fi
-
-
-  echo "$as_me:$LINENO: checking whether wcwidth is declared" >&5
-echo $ECHO_N "checking whether wcwidth is declared... $ECHO_C" >&6
-if test "${ac_cv_have_decl_wcwidth+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.  */
-
-/* AIX 3.2.5 declares wcwidth in <string.h>. */
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-#if HAVE_WCHAR_H
-# include <wchar.h>
-#endif
-
-int
-main ()
-{
-
-#ifndef wcwidth
-  char *p = (char *) wcwidth;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_wcwidth=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_wcwidth=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_wcwidth" >&5
-echo "${ECHO_T}$ac_cv_have_decl_wcwidth" >&6
-  if test $ac_cv_have_decl_wcwidth = yes; then
-    ac_val=1
-  else
-    ac_val=0
-  fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_WCWIDTH $ac_val
-_ACEOF
-
-
-      echo "$as_me:$LINENO: checking whether mbswidth is declared in <wchar.h>" >&5
-echo $ECHO_N "checking whether mbswidth is declared in <wchar.h>... $ECHO_C" >&6
-if test "${ac_cv_have_decl_mbswidth+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.  */
-
-#if HAVE_WCHAR_H
-# include <wchar.h>
-#endif
-
-int
-main ()
-{
-
-  char *p = (char *) mbswidth;
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_have_decl_mbswidth=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_have_decl_mbswidth=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_have_decl_mbswidth" >&5
-echo "${ECHO_T}$ac_cv_have_decl_mbswidth" >&6
-  if test $ac_cv_have_decl_mbswidth = yes; then
-    ac_val=1
-  else
-    ac_val=0
-  fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_MBSWIDTH_IN_WCHAR_H $ac_val
-_ACEOF
-
-
-  echo "$as_me:$LINENO: checking for mbstate_t" >&5
-echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6
-if test "${ac_cv_type_mbstate_t+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#	    include <wchar.h>
-int
-main ()
-{
-mbstate_t x; return sizeof x;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_mbstate_t=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_type_mbstate_t=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_mbstate_t" >&5
-echo "${ECHO_T}$ac_cv_type_mbstate_t" >&6
-   if test $ac_cv_type_mbstate_t = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_MBSTATE_T 1
-_ACEOF
-
-   else
-
-cat >>confdefs.h <<\_ACEOF
-#define mbstate_t int
-_ACEOF
-
-   fi
-
-
-
-  echo "$as_me:$LINENO: checking for obstacks" >&5
-echo $ECHO_N "checking for obstacks... $ECHO_C" >&6
-if test "${ac_cv_func_obstack+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include "obstack.h"
-int
-main ()
-{
-struct obstack *mem; obstack_free(mem,(char *) 0)
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_obstack=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_func_obstack=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_obstack" >&5
-echo "${ECHO_T}$ac_cv_func_obstack" >&6
-if test $ac_cv_func_obstack = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_OBSTACK 1
-_ACEOF
-
-else
-  case $LIBOBJS in
-    "obstack.$ac_objext"   | \
-  *" obstack.$ac_objext"   | \
-    "obstack.$ac_objext "* | \
-  *" obstack.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS obstack.$ac_objext" ;;
-esac
-
-fi
-
-    if test $ac_cv_func_obstack = no; then
-
-
-
-
-  :
-
-  fi
-
-
-
-
-  case $LIBOBJS in
-    "quote.$ac_objext"   | \
-  *" quote.$ac_objext"   | \
-    "quote.$ac_objext "* | \
-  *" quote.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS quote.$ac_objext" ;;
-esac
-
-
-
-
-
-
-  case $LIBOBJS in
-    "quotearg.$ac_objext"   | \
-  *" quotearg.$ac_objext"   | \
-    "quotearg.$ac_objext "* | \
-  *" quotearg.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS quotearg.$ac_objext" ;;
-esac
-
-
-
-  :
-
-
-
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-
-
-  echo "$as_me:$LINENO: checking for mbstate_t" >&5
-echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6
-if test "${ac_cv_type_mbstate_t+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#	    include <wchar.h>
-int
-main ()
-{
-mbstate_t x; return sizeof x;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_mbstate_t=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_type_mbstate_t=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_mbstate_t" >&5
-echo "${ECHO_T}$ac_cv_type_mbstate_t" >&6
-   if test $ac_cv_type_mbstate_t = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_MBSTATE_T 1
-_ACEOF
-
-   else
-
-cat >>confdefs.h <<\_ACEOF
-#define mbstate_t int
-_ACEOF
-
-   fi
-
-    echo "$as_me:$LINENO: checking whether mbrtowc and mbstate_t are properly declared" >&5
-echo $ECHO_N "checking whether mbrtowc and mbstate_t are properly declared... $ECHO_C" >&6
-if test "${gl_cv_func_mbrtowc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <wchar.h>
-int
-main ()
-{
-wchar_t wc;
-              char const s[] = "";
-              size_t n = 1;
-              mbstate_t state;
-              return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  gl_cv_func_mbrtowc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-gl_cv_func_mbrtowc=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $gl_cv_func_mbrtowc" >&5
-echo "${ECHO_T}$gl_cv_func_mbrtowc" >&6
-  if test $gl_cv_func_mbrtowc = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_MBRTOWC 1
-_ACEOF
-
-  fi
-
-
-
-
-
-
-  # Define two additional variables used in the Makefile substitution.
-
-  if test "$ac_cv_header_stdbool_h" = yes; then
-    STDBOOL_H=''
-  else
-    STDBOOL_H='stdbool.h'
-  fi
-
-
-  if test "$ac_cv_type__Bool" = yes; then
-    HAVE__BOOL=1
-  else
-    HAVE__BOOL=0
-  fi
-
-
-
-
-
-  case $LIBOBJS in
-    "fopen-safer.$ac_objext"   | \
-  *" fopen-safer.$ac_objext"   | \
-    "fopen-safer.$ac_objext "* | \
-  *" fopen-safer.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS fopen-safer.$ac_objext" ;;
-esac
-
-
-
-
-
-
-
-for ac_func in stpcpy
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-else
-  case $LIBOBJS in
-    "$ac_func.$ac_objext"   | \
-  *" $ac_func.$ac_objext"   | \
-    "$ac_func.$ac_objext "* | \
-  *" $ac_func.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;;
-esac
-
-fi
-done
-
-
-  if test $ac_cv_func_stpcpy = no; then
-
-  :
-
-  fi
-
-
-
-
-
-
-for ac_func in strdup
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-else
-  case $LIBOBJS in
-    "$ac_func.$ac_objext"   | \
-  *" $ac_func.$ac_objext"   | \
-    "$ac_func.$ac_objext "* | \
-  *" $ac_func.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;;
-esac
-
-fi
-done
-
-
-
-  :
-
-
-
-
-
-  :
-
-
-
-
-for ac_func in strerror
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-else
-  case $LIBOBJS in
-    "$ac_func.$ac_objext"   | \
-  *" $ac_func.$ac_objext"   | \
-    "$ac_func.$ac_objext "* | \
-  *" $ac_func.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;;
-esac
-
-fi
-done
-
-
-  if test $ac_cv_func_strerror = no; then
-
-  :
-
-  fi
-
-
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-  # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'.
-  echo "$as_me:$LINENO: checking for working strndup" >&5
-echo $ECHO_N "checking for working strndup... $ECHO_C" >&6
-if test "${gl_cv_func_strndup+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test "$cross_compiling" = yes; then
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-#ifdef _AIX
-            too risky
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "too risky" >/dev/null 2>&1; then
-  gl_cv_func_strndup=no
-else
-  gl_cv_func_strndup=yes
-fi
-rm -f conftest*
-
-else
-  cat >conftest.$ac_ext <<_ACEOF
-
-       /* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <string.h>
-int
-main ()
-{
-
-#ifndef HAVE_DECL_STRNDUP
-  extern char *strndup (const char *, size_t);
-#endif
-  char *s;
-  s = strndup ("some longer string", 15);
-  free (s);
-  s = strndup ("shorter string", 13);
-  return s[13] != '\0';
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  gl_cv_func_strndup=yes
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-gl_cv_func_strndup=no
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-echo "$as_me:$LINENO: result: $gl_cv_func_strndup" >&5
-echo "${ECHO_T}$gl_cv_func_strndup" >&6
-  if test $gl_cv_func_strndup = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_STRNDUP 1
-_ACEOF
-
-  else
-    case $LIBOBJS in
-    "strndup.$ac_objext"   | \
-  *" strndup.$ac_objext"   | \
-    "strndup.$ac_objext "* | \
-  *" strndup.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS strndup.$ac_objext" ;;
-esac
-
-
-cat >>confdefs.h <<\_ACEOF
-#define strndup rpl_strndup
-_ACEOF
-
-    :
-  fi
-
-
-
-
-
-
-
-  echo "$as_me:$LINENO: checking for working strnlen" >&5
-echo $ECHO_N "checking for working strnlen... $ECHO_C" >&6
-if test "${ac_cv_func_strnlen_working+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test "$cross_compiling" = yes; then
-  ac_cv_func_strnlen_working=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-
-#define S "foobar"
-#define S_LEN (sizeof S - 1)
-
-  /* At least one implementation is buggy: that of AIX 4.3 would
-     give strnlen (S, 1) == 3.  */
-
-  int i;
-  for (i = 0; i < S_LEN + 1; ++i)
-    {
-      int expected = i <= S_LEN ? i : S_LEN;
-      if (strnlen (S, i) != expected)
-	exit (1);
-    }
-  exit (0);
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_strnlen_working=yes
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-ac_cv_func_strnlen_working=no
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_strnlen_working" >&5
-echo "${ECHO_T}$ac_cv_func_strnlen_working" >&6
-test $ac_cv_func_strnlen_working = no && case $LIBOBJS in
-    "strnlen.$ac_objext"   | \
-  *" strnlen.$ac_objext"   | \
-    "strnlen.$ac_objext "* | \
-  *" strnlen.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS strnlen.$ac_objext" ;;
-esac
-
-
-  if test $ac_cv_func_strnlen_working = no; then
-    # This is necessary because automake-1.6.1 doens't understand
-    # that the above use of AC_FUNC_STRNLEN means we may have to use
-    # lib/strnlen.c.
-    #AC_LIBOBJ(strnlen)
-
-cat >>confdefs.h <<\_ACEOF
-#define strnlen rpl_strnlen
-_ACEOF
-
-
-
-  :
-
-
-
-
-
-
-  fi
-
-
-
-
-for ac_func in strtol
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-else
-  case $LIBOBJS in
-    "$ac_func.$ac_objext"   | \
-  *" $ac_func.$ac_objext"   | \
-    "$ac_func.$ac_objext "* | \
-  *" $ac_func.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;;
-esac
-
-fi
-done
-
-
-  if test $ac_cv_func_strtol = no; then
-
-
-
-  :
-
-
-
-
-
-
-  fi
-
-
-
-
-for ac_func in strtoul
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-else
-  case $LIBOBJS in
-    "$ac_func.$ac_objext"   | \
-  *" $ac_func.$ac_objext"   | \
-    "$ac_func.$ac_objext "* | \
-  *" $ac_func.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;;
-esac
-
-fi
-done
-
-
-  if test $ac_cv_func_strtoul = no; then
-
-
-
-
-  :
-
-
-
-
-
-
-
-  fi
-
-
-
-
-
-
-
-
-for ac_func in strverscmp
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-else
-  case $LIBOBJS in
-    "$ac_func.$ac_objext"   | \
-  *" $ac_func.$ac_objext"   | \
-    "$ac_func.$ac_objext "* | \
-  *" $ac_func.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;;
-esac
-
-fi
-done
-
-
-  if test $ac_cv_func_strverscmp = no; then
-
-  :
-
-  fi
-
-
-
-
-for ac_header in unistd.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&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; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## -------------------------------- ##
-## Report this to bug-bison@gnu.org ##
-## -------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-    UNISTD_H=''
-
-else
-
-    UNISTD_H='unistd.h'
-
-fi
-
-done
-
-
-
-
-
-
-  case $LIBOBJS in
-    "dup-safer.$ac_objext"   | \
-  *" dup-safer.$ac_objext"   | \
-    "dup-safer.$ac_objext "* | \
-  *" dup-safer.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS dup-safer.$ac_objext" ;;
-esac
-
-  case $LIBOBJS in
-    "fd-safer.$ac_objext"   | \
-  *" fd-safer.$ac_objext"   | \
-    "fd-safer.$ac_objext "* | \
-  *" fd-safer.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS fd-safer.$ac_objext" ;;
-esac
-
-  case $LIBOBJS in
-    "pipe-safer.$ac_objext"   | \
-  *" pipe-safer.$ac_objext"   | \
-    "pipe-safer.$ac_objext "* | \
-  *" pipe-safer.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS pipe-safer.$ac_objext" ;;
-esac
-
-
-
-
-
-
-
-cat >>confdefs.h <<\_ACEOF
-#define USE_UNLOCKED_IO 1
-_ACEOF
-
-
-
-
-
-  :
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-
-
-
-
-  case $LIBOBJS in
-    "xmalloc.$ac_objext"   | \
-  *" xmalloc.$ac_objext"   | \
-    "xmalloc.$ac_objext "* | \
-  *" xmalloc.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS xmalloc.$ac_objext" ;;
-esac
-
-
-
-  :
-
-
-
-  :
-
-
-
-
-
-
-  :
-
-
-
-
-# We use po/Makevars, so we need at least gettext 0.12.
-
-
-  if test -z "$USE_NLS"; then
-    echo "The BISON-I18N macro is used without being preceded by AM-GNU-GETTEXT." 1>&2
-    exit 1
-  fi
-  BISON_LOCALEDIR=
-  if test "$USE_NLS" = yes; then
-        if test -n "$YACC"; then
-      case "$YACC" in
-        *bison*)
-          if ($YACC --print-localedir) >/dev/null 2>&1; then
-            BISON_LOCALEDIR=`$YACC --print-localedir`
-          fi
-          ;;
-      esac
-    else
-      if test -n "$BISON"; then
-        if test "$BISON" != ":"; then
-          if ($BISON --print-localedir) >/dev/null 2>&1; then
-            BISON_LOCALEDIR=`$BISON --print-localedir`
-          fi
-        fi
-      fi
-    fi
-
-    if test -n "$BISON_LOCALEDIR"; then
-      USER_LINGUAS="${LINGUAS-%UNSET%}"
-      if test -n "$USER_LINGUAS"; then
-        BISON_USE_NLS=yes
-      else
-        BISON_USE_NLS=no
-      fi
-    else
-      BISON_USE_NLS=no
-    fi
-  else
-    BISON_USE_NLS=no
-  fi
-  if test $BISON_USE_NLS = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define YYENABLE_NLS 1
-_ACEOF
-
-  fi
-
-
-# Internationalized parsers.
-          ac_config_files="$ac_config_files runtime-po/Makefile.in"
-
-# Autoconf macros for packages using internationalized parsers.
-aclocaldir='${datadir}/aclocal'
-
-
-# Initialize the test suite.
-          ac_config_commands="$ac_config_commands tests/atconfig"
-
-
-                    ac_config_files="$ac_config_files tests/Makefile tests/atlocal"
-
-          ac_config_files="$ac_config_files tests/bison"
-
-for ac_prog in valgrind
-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_VALGRIND+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$VALGRIND"; then
-  ac_cv_prog_VALGRIND="$VALGRIND" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_VALGRIND="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-VALGRIND=$ac_cv_prog_VALGRIND
-if test -n "$VALGRIND"; then
-  echo "$as_me:$LINENO: result: $VALGRIND" >&5
-echo "${ECHO_T}$VALGRIND" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  test -n "$VALGRIND" && break
-done
-
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CXX+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CXX"; then
-  ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
-  echo "$as_me:$LINENO: result: $CXX" >&5
-echo "${ECHO_T}$CXX" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-    test -n "$CXX" && break
-  done
-fi
-if test -z "$CXX"; then
-  ac_ct_CXX=$CXX
-  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CXX"; then
-  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CXX="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
-echo "${ECHO_T}$ac_ct_CXX" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  test -n "$ac_ct_CXX" && break
-done
-test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
-
-  CXX=$ac_ct_CXX
-fi
-
-
-# Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C++ compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&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 { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_compiler_gnu=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_compiler_gnu=no
-fi
-rm -f conftest.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
-CXXFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
-echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_cxx_g+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cxx_g=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_prog_cxx_g=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
-if test "$ac_test_CXXFLAGS" = set; then
-  CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
-  if test "$GXX" = yes; then
-    CXXFLAGS="-g -O2"
-  else
-    CXXFLAGS="-g"
-  fi
-else
-  if test "$GXX" = yes; then
-    CXXFLAGS="-O2"
-  else
-    CXXFLAGS=
-  fi
-fi
-for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-continue
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>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); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-depcc="$CXX"  am_compiler_list=
-
-echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
-if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CXX_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    case $depmode in
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    none) break ;;
-    esac
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.
-    if depmode=$depmode \
-       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CXX_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CXX_dependencies_compiler_type=none
-fi
-
-fi
-echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
-CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
-
-
-
-if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
-  am__fastdepCXX_TRUE=
-  am__fastdepCXX_FALSE='#'
-else
-  am__fastdepCXX_TRUE='#'
-  am__fastdepCXX_FALSE=
-fi
-
-
-
-
- echo "$as_me:$LINENO: checking whether $CXX builds executables that work" >&5
-echo $ECHO_N "checking whether $CXX builds executables that work... $ECHO_C" >&6
-if test "${bison_cv_cxx_works+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-    bison_cv_cxx_works=no
-    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <cstdlib>
-	  #include <iostream>
-	  #include <map>
-	  #include <string>
-	  using namespace std;
-int
-main ()
-{
-std::cerr << "";
-          cout << "";
-	  typedef std::pair<unsigned int, int> uipair;
-	  std::map<unsigned int, int> m;
-	  std::map<unsigned int, int>::iterator i;
-	  m.insert (uipair (4, -4));
-	  for (i = m.begin (); i != m.end (); ++i)
-	    if (i->first != 4)
-	      return 1;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  if { ac_try='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_objext $LIBS >&5'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  if test "$cross_compiling" = yes; then
-  bison_cv_cxx_works=cross
-else
-  if { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  bison_cv_cxx_works=yes
-fi
-
-fi
-
-fi
-
-       rm -f conftest$ac_exeext
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f 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: $bison_cv_cxx_works" >&5
-echo "${ECHO_T}$bison_cv_cxx_works" >&6
-
- case $bison_cv_cxx_works in
- yes)
-    BISON_CXX_WORKS=':';;
- no | cross)
-    BISON_CXX_WORKS='exit 77';;
- esac
-
-
-
-
-if test $bison_cv_cxx_works = yes; then
-  BISON_CXX_WORKS_TRUE=
-  BISON_CXX_WORKS_FALSE='#'
-else
-  BISON_CXX_WORKS_TRUE='#'
-  BISON_CXX_WORKS_FALSE=
-fi
-
-
-
-AUTOM4TE=${AUTOM4TE-"${am_missing_run}autom4te"}
-
-# Needed by tests/atlocal.in.
-
-O0CFLAGS=`echo $CFLAGS | sed 's/-O[0-9] *//'`
-
-O0CXXFLAGS=`echo $CXXFLAGS | sed 's/-O[0-9] *//'`
-
-
-                                                                                          ac_config_files="$ac_config_files Makefile build-aux/Makefile po/Makefile.in data/Makefile examples/Makefile examples/calc++/Makefile lib/Makefile src/Makefile doc/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, don't put newlines in cache variables' values.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-{
-  (set) 2>&1 |
-    case `(ac_space=' '; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
-      # `set' does not quote correctly, so add quotes (double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \).
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;;
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
-      ;;
-    esac;
-} |
-  sed '
-     t clear
-     : clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     : end' >>confcache
-if diff $cache_file confcache >/dev/null 2>&1; then :; else
-  if test -w $cache_file; then
-    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
-    cat confcache >$cache_file
-  else
-    echo "not updating unwritable cache $cache_file"
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/;
-s/:*\${srcdir}:*/:/;
-s/:*@srcdir@:*/:/;
-s/^\([^=]*=[	 ]*\):*/\1/;
-s/:*$//;
-s/^[^=]*=[	 ]*$//;
-}'
-fi
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_i=`echo "$ac_i" |
-	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
-  # 2. Add them.
-  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
-  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${BISON_CXX_WORKS_TRUE}" && test -z "${BISON_CXX_WORKS_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"BISON_CXX_WORKS\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"BISON_CXX_WORKS\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-: ${CONFIG_STATUS=./config.status}
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
-echo "$as_me: creating $CONFIG_STATUS" >&6;}
-cat >$CONFIG_STATUS <<_ACEOF
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
-
-
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
-echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
-    sed '
-      N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
-      t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
-    ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
-echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
-   { (exit 1); exit 1; }; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
-  # Exit status is that of the last command.
-  exit
-}
-
-
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
-    as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-as_executable_p="test -f"
-
-# 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'"
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
-exec 6>&1
-
-# Open the log real soon, to keep \$[0] and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.  Logging --version etc. is OK.
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-} >&5
-cat >&5 <<_CSEOF
-
-This file was extended by GNU Bison $as_me 2.3, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-_CSEOF
-echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
-echo >&5
-_ACEOF
-
-# Files that config.status was made for.
-if test -n "$ac_config_files"; then
-  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_headers"; then
-  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_links"; then
-  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_commands"; then
-  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-ac_cs_usage="\
-\`$as_me' instantiates files from templates according to the
-current configuration.
-
-Usage: $0 [OPTIONS] [FILE]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number, then exit
-  -q, --quiet      do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-  --file=FILE[:TEMPLATE]
-		   instantiate the configuration file FILE
-  --header=FILE[:TEMPLATE]
-		   instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Configuration commands:
-$config_commands
-
-Report bugs to <bug-autoconf@gnu.org>."
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-ac_cs_version="\\
-GNU Bison config.status 2.3
-configured by $0, generated by GNU Autoconf 2.59,
-  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
-
-Copyright (C) 2003 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-srcdir=$srcdir
-INSTALL="$INSTALL"
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-# If no file are specified by the user, then we need to provide default
-# value.  By we need to know if files were specified by the user.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=*)
-    ac_option=`expr "x$1" : 'x\([^=]*\)='`
-    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  -*)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  *) # This is not an option, so the user has probably given explicit
-     # arguments.
-     ac_option=$1
-     ac_need_defaults=false;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --vers* | -V )
-    echo "$ac_cs_version"; exit 0 ;;
-  --he | --h)
-    # Conflict between --help and --header
-    { { echo "$as_me:$LINENO: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; };;
-  --help | --hel | -h )
-    echo "$ac_cs_usage"; exit 0 ;;
-  --debug | --d* | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
-    ac_need_defaults=false;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; } ;;
-
-  *) ac_config_targets="$ac_config_targets $1" ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-if \$ac_cs_recheck; then
-  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
-  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-fi
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-#
-# INIT-COMMANDS section.
-#
-
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
-# Capture the value of obsolete ALL_LINGUAS because we need it to compute
-    # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
-    # from automake.
-    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
-    # Capture the value of LINGUAS because we need it to compute CATALOGS.
-    LINGUAS="${LINGUAS-%UNSET%}"
-
-
-_ACEOF
-
-
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_config_target in $ac_config_targets
-do
-  case "$ac_config_target" in
-  # Handling of arguments.
-  "runtime-po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES runtime-po/Makefile.in" ;;
-  "tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
-  "tests/atlocal" ) CONFIG_FILES="$CONFIG_FILES tests/atlocal" ;;
-  "tests/bison" ) CONFIG_FILES="$CONFIG_FILES tests/bison" ;;
-  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-  "build-aux/Makefile" ) CONFIG_FILES="$CONFIG_FILES build-aux/Makefile" ;;
-  "po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
-  "data/Makefile" ) CONFIG_FILES="$CONFIG_FILES data/Makefile" ;;
-  "examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
-  "examples/calc++/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/calc++/Makefile" ;;
-  "lib/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;;
-  "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
-  "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
-  "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-  "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
-  "tests/atconfig" ) CONFIG_COMMANDS="$CONFIG_COMMANDS tests/atconfig" ;;
-  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.hin" ;;
-  *) { { 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
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason to put it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Create a temporary directory, and hook for its removal unless debugging.
-$debug ||
-{
-  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
-  trap '{ (exit 1); exit 1; }' 1 2 13 15
-}
-
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./confstat$$-$RANDOM
-  (umask 077 && mkdir $tmp)
-} ||
-{
-   echo "$me: cannot create a temporary directory in ." >&2
-   { (exit 1); exit 1; }
-}
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-
-#
-# CONFIG_FILES section.
-#
-
-# No need to generate the scripts if there are no CONFIG_FILES.
-# This happens for instance when ./config.status config.h
-if test -n "\$CONFIG_FILES"; then
-  # Protect against being on the right side of a sed subst in config.status.
-  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
-   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
-s,@SHELL@,$SHELL,;t t
-s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
-s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
-s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
-s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
-s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
-s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
-s,@exec_prefix@,$exec_prefix,;t t
-s,@prefix@,$prefix,;t t
-s,@program_transform_name@,$program_transform_name,;t t
-s,@bindir@,$bindir,;t t
-s,@sbindir@,$sbindir,;t t
-s,@libexecdir@,$libexecdir,;t t
-s,@datadir@,$datadir,;t t
-s,@sysconfdir@,$sysconfdir,;t t
-s,@sharedstatedir@,$sharedstatedir,;t t
-s,@localstatedir@,$localstatedir,;t t
-s,@libdir@,$libdir,;t t
-s,@includedir@,$includedir,;t t
-s,@oldincludedir@,$oldincludedir,;t t
-s,@infodir@,$infodir,;t t
-s,@mandir@,$mandir,;t t
-s,@build_alias@,$build_alias,;t t
-s,@host_alias@,$host_alias,;t t
-s,@target_alias@,$target_alias,;t t
-s,@DEFS@,$DEFS,;t t
-s,@ECHO_C@,$ECHO_C,;t t
-s,@ECHO_N@,$ECHO_N,;t t
-s,@ECHO_T@,$ECHO_T,;t t
-s,@LIBS@,$LIBS,;t t
-s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
-s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
-s,@INSTALL_DATA@,$INSTALL_DATA,;t t
-s,@CYGPATH_W@,$CYGPATH_W,;t t
-s,@PACKAGE@,$PACKAGE,;t t
-s,@VERSION@,$VERSION,;t t
-s,@ACLOCAL@,$ACLOCAL,;t t
-s,@AUTOCONF@,$AUTOCONF,;t t
-s,@AUTOMAKE@,$AUTOMAKE,;t t
-s,@AUTOHEADER@,$AUTOHEADER,;t t
-s,@MAKEINFO@,$MAKEINFO,;t t
-s,@install_sh@,$install_sh,;t t
-s,@STRIP@,$STRIP,;t t
-s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
-s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
-s,@mkdir_p@,$mkdir_p,;t t
-s,@AWK@,$AWK,;t t
-s,@SET_MAKE@,$SET_MAKE,;t t
-s,@am__leading_dot@,$am__leading_dot,;t t
-s,@AMTAR@,$AMTAR,;t t
-s,@am__tar@,$am__tar,;t t
-s,@am__untar@,$am__untar,;t t
-s,@CC@,$CC,;t t
-s,@CFLAGS@,$CFLAGS,;t t
-s,@LDFLAGS@,$LDFLAGS,;t t
-s,@CPPFLAGS@,$CPPFLAGS,;t t
-s,@ac_ct_CC@,$ac_ct_CC,;t t
-s,@EXEEXT@,$EXEEXT,;t t
-s,@OBJEXT@,$OBJEXT,;t t
-s,@DEPDIR@,$DEPDIR,;t t
-s,@am__include@,$am__include,;t t
-s,@am__quote@,$am__quote,;t t
-s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
-s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
-s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
-s,@CCDEPMODE@,$CCDEPMODE,;t t
-s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
-s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
-s,@CPP@,$CPP,;t t
-s,@EGREP@,$EGREP,;t t
-s,@WARNING_CFLAGS@,$WARNING_CFLAGS,;t t
-s,@WERROR_CFLAGS@,$WERROR_CFLAGS,;t t
-s,@WARNING_CXXFLAGS@,$WARNING_CXXFLAGS,;t t
-s,@YACC_SCRIPT@,$YACC_SCRIPT,;t t
-s,@YACC_LIBRARY@,$YACC_LIBRARY,;t t
-s,@LEX@,$LEX,;t t
-s,@LEXLIB@,$LEXLIB,;t t
-s,@LEX_OUTPUT_ROOT@,$LEX_OUTPUT_ROOT,;t t
-s,@YACC@,$YACC,;t t
-s,@RANLIB@,$RANLIB,;t t
-s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
-s,@M4@,$M4,;t t
-s,@STDBOOL_H@,$STDBOOL_H,;t t
-s,@HAVE__BOOL@,$HAVE__BOOL,;t t
-s,@LIBOBJS@,$LIBOBJS,;t t
-s,@GETOPT_H@,$GETOPT_H,;t t
-s,@MKINSTALLDIRS@,$MKINSTALLDIRS,;t t
-s,@USE_NLS@,$USE_NLS,;t t
-s,@MSGFMT@,$MSGFMT,;t t
-s,@GMSGFMT@,$GMSGFMT,;t t
-s,@XGETTEXT@,$XGETTEXT,;t t
-s,@MSGMERGE@,$MSGMERGE,;t t
-s,@build@,$build,;t t
-s,@build_cpu@,$build_cpu,;t t
-s,@build_vendor@,$build_vendor,;t t
-s,@build_os@,$build_os,;t t
-s,@host@,$host,;t t
-s,@host_cpu@,$host_cpu,;t t
-s,@host_vendor@,$host_vendor,;t t
-s,@host_os@,$host_os,;t t
-s,@INTL_MACOSX_LIBS@,$INTL_MACOSX_LIBS,;t t
-s,@LIBICONV@,$LIBICONV,;t t
-s,@LTLIBICONV@,$LTLIBICONV,;t t
-s,@INTLLIBS@,$INTLLIBS,;t t
-s,@LIBINTL@,$LIBINTL,;t t
-s,@LTLIBINTL@,$LTLIBINTL,;t t
-s,@POSUB@,$POSUB,;t t
-s,@UNISTD_H@,$UNISTD_H,;t t
-s,@BISON_LOCALEDIR@,$BISON_LOCALEDIR,;t t
-s,@aclocaldir@,$aclocaldir,;t t
-s,@VALGRIND@,$VALGRIND,;t t
-s,@CXX@,$CXX,;t t
-s,@CXXFLAGS@,$CXXFLAGS,;t t
-s,@ac_ct_CXX@,$ac_ct_CXX,;t t
-s,@CXXDEPMODE@,$CXXDEPMODE,;t t
-s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
-s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
-s,@BISON_CXX_WORKS@,$BISON_CXX_WORKS,;t t
-s,@BISON_CXX_WORKS_TRUE@,$BISON_CXX_WORKS_TRUE,;t t
-s,@BISON_CXX_WORKS_FALSE@,$BISON_CXX_WORKS_FALSE,;t t
-s,@AUTOM4TE@,$AUTOM4TE,;t t
-s,@GCC@,$GCC,;t t
-s,@O0CFLAGS@,$O0CFLAGS,;t t
-s,@O0CXXFLAGS@,$O0CXXFLAGS,;t t
-s,@LTLIBOBJS@,$LTLIBOBJS,;t t
-CEOF
-
-_ACEOF
-
-  cat >>$CONFIG_STATUS <<\_ACEOF
-  # Split the substitutions into bite-sized pieces for seds with
-  # small command number limits, like on Digital OSF/1 and HP-UX.
-  ac_max_sed_lines=48
-  ac_sed_frag=1 # Number of current file.
-  ac_beg=1 # First line for current file.
-  ac_end=$ac_max_sed_lines # Line after last line for current file.
-  ac_more_lines=:
-  ac_sed_cmds=
-  while $ac_more_lines; do
-    if test $ac_beg -gt 1; then
-      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    else
-      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    fi
-    if test ! -s $tmp/subs.frag; then
-      ac_more_lines=false
-    else
-      # The purpose of the label and of the branching condition is to
-      # speed up the sed processing (if there are no `@' at all, there
-      # is no need to browse any of the substitutions).
-      # These are the two extra sed commands mentioned above.
-      (echo ':t
-  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
-      if test -z "$ac_sed_cmds"; then
-	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
-      else
-	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
-      fi
-      ac_sed_frag=`expr $ac_sed_frag + 1`
-      ac_beg=$ac_end
-      ac_end=`expr $ac_end + $ac_max_sed_lines`
-    fi
-  done
-  if test -z "$ac_sed_cmds"; then
-    ac_sed_cmds=cat
-  fi
-fi # test -n "$CONFIG_FILES"
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
-  esac
-
-  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
-  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-  ac_builddir=.
-
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
-  esac
-
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    configure_input=
-  else
-    configure_input="$ac_file.  "
-  fi
-  configure_input=$configure_input"Generated from `echo $ac_file_in |
-				     sed 's,.*/,,'` by configure."
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-
-  if test x"$ac_file" != x-; then
-    { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-    rm -f "$ac_file"
-  fi
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-  sed "$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s,@configure_input@,$configure_input,;t t
-s,@srcdir@,$ac_srcdir,;t t
-s,@abs_srcdir@,$ac_abs_srcdir,;t t
-s,@top_srcdir@,$ac_top_srcdir,;t t
-s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
-s,@builddir@,$ac_builddir,;t t
-s,@abs_builddir@,$ac_abs_builddir,;t t
-s,@top_builddir@,$ac_top_builddir,;t t
-s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
-s,@INSTALL@,$ac_INSTALL,;t t
-" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
-  rm -f $tmp/stdin
-  if test x"$ac_file" != x-; then
-    mv $tmp/out $ac_file
-  else
-    cat $tmp/out
-    rm -f $tmp/out
-  fi
-
-  # Run the commands associated with the file.
-  case $ac_file in
-    tests/bison ) chmod +x tests/bison ;;
-  esac
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-#
-# CONFIG_HEADER section.
-#
-
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
-ac_dB='[	 ].*$,\1#\2'
-ac_dC=' '
-ac_dD=',;t'
-# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
-ac_uB='$,\1#\2define\3'
-ac_uC=' '
-ac_uD=',;t'
-
-for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
-  esac
-
-  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 # Do quote $f, to prevent DOS paths from being IFS'd.
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-  # Remove the trailing spaces.
-  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
-
-_ACEOF
-
-# Transform confdefs.h into two sed scripts, `conftest.defines' and
-# `conftest.undefs', that substitutes the proper values into
-# config.h.in to produce config.h.  The first handles `#define'
-# templates, and the second `#undef' templates.
-# And first: Protect against being on the right side of a sed subst in
-# config.status.  Protect against being in an unquoted here document
-# in config.status.
-rm -f conftest.defines conftest.undefs
-# Using a here document instead of a string reduces the quoting nightmare.
-# Putting comments in sed scripts is not portable.
-#
-# `end' is used to avoid that the second main sed command (meant for
-# 0-ary CPP macros) applies to n-ary macro definitions.
-# See the Autoconf documentation for `clear'.
-cat >confdef2sed.sed <<\_ACEOF
-s/[\\&,]/\\&/g
-s,[\\$`],\\&,g
-t clear
-: clear
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
-t end
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
-: end
-_ACEOF
-# If some macros were called several times there might be several times
-# the same #defines, which is useless.  Nevertheless, we may not want to
-# sort them, since we want the *last* AC-DEFINE to be honored.
-uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
-sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
-rm -f confdef2sed.sed
-
-# This sed command replaces #undef with comments.  This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-cat >>conftest.undefs <<\_ACEOF
-s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
-_ACEOF
-
-# Break up conftest.defines because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
-echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
-echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
-echo '  :' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.defines >/dev/null
-do
-  # Write a limited-size here document to $tmp/defines.sed.
-  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#define' lines.
-  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
-  echo 'CEOF
-  sed -f $tmp/defines.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
-  rm -f conftest.defines
-  mv conftest.tail conftest.defines
-done
-rm -f conftest.defines
-echo '  fi # grep' >>$CONFIG_STATUS
-echo >>$CONFIG_STATUS
-
-# Break up conftest.undefs because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.undefs >/dev/null
-do
-  # Write a limited-size here document to $tmp/undefs.sed.
-  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#undef'
-  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
-  echo 'CEOF
-  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
-  rm -f conftest.undefs
-  mv conftest.tail conftest.undefs
-done
-rm -f conftest.undefs
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    echo "/* Generated by configure.  */" >$tmp/config.h
-  else
-    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
-  fi
-  cat $tmp/in >>$tmp/config.h
-  rm -f $tmp/in
-  if test x"$ac_file" != x-; then
-    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
-      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
-echo "$as_me: $ac_file is unchanged" >&6;}
-    else
-      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-      { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-      rm -f $ac_file
-      mv $tmp/config.h $ac_file
-    fi
-  else
-    cat $tmp/config.h
-    rm -f $tmp/config.h
-  fi
-# Compute $ac_file's index in $config_headers.
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $ac_file | $ac_file:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
-$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X$ac_file : 'X\(//\)[^/]' \| \
-	 X$ac_file : 'X\(//\)$' \| \
-	 X$ac_file : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X$ac_file |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`/stamp-h$_am_stamp_count
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-#
-# CONFIG_COMMANDS section.
-#
-for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
-  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
-  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
-  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
-$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_dest" : 'X\(//\)[^/]' \| \
-	 X"$ac_dest" : 'X\(//\)$' \| \
-	 X"$ac_dest" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_dest" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-  ac_builddir=.
-
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-
-  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
-echo "$as_me: executing $ac_dest commands" >&6;}
-  case $ac_dest in
-    depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
-  # Strip MF so we end up with the name of the file.
-  mf=`echo "$mf" | sed -e 's/:.*$//'`
-  # Check whether this is an Automake generated Makefile or not.
-  # We used to match only the files named `Makefile.in', but
-  # some people rename them; so instead we look at the file content.
-  # Grep'ing the first line is not enough: some people post-process
-  # each Makefile.in and add a new line on top of each file to say so.
-  # So let's grep whole file.
-  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
-    dirpart=`(dirname "$mf") 2>/dev/null ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$mf" : 'X\(//\)[^/]' \| \
-	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  else
-    continue
-  fi
-  # Extract the definition of DEPDIR, am__include, and am__quote
-  # from the Makefile without running `make'.
-  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-  test -z "$DEPDIR" && continue
-  am__include=`sed -n 's/^am__include = //p' < "$mf"`
-  test -z "am__include" && continue
-  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-  # When using ansi2knr, U may be empty or an underscore; expand it
-  U=`sed -n 's/^U = //p' < "$mf"`
-  # Find all dependency output files, they are included files with
-  # $(DEPDIR) in their names.  We invoke sed twice because it is the
-  # simplest approach to changing $(DEPDIR) to its actual value in the
-  # expansion.
-  for file in `sed -n "
-    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-    # Make sure the directory exists.
-    test -f "$dirpart/$file" && continue
-    fdir=`(dirname "$file") 2>/dev/null ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$file" : 'X\(//\)[^/]' \| \
-	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    { if $as_mkdir_p; then
-    mkdir -p $dirpart/$fdir
-  else
-    as_dir=$dirpart/$fdir
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
-echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-    # echo "creating $dirpart/$file"
-    echo '# dummy' > "$dirpart/$file"
-  done
-done
- ;;
-    default-1 )
-    for ac_file in $CONFIG_FILES; do
-      # Support "outfile[:infile[:infile...]]"
-      case "$ac_file" in
-        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
-      esac
-      # PO directories have a Makefile.in generated from Makefile.in.in.
-      case "$ac_file" in */Makefile.in)
-        # Adjust a relative srcdir.
-        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
-        ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
-        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
-        # In autoconf-2.13 it is called $ac_given_srcdir.
-        # In autoconf-2.50 it is called $srcdir.
-        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
-        case "$ac_given_srcdir" in
-          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
-          /*) top_srcdir="$ac_given_srcdir" ;;
-          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
-        esac
-        # Treat a directory as a PO directory if and only if it has a
-        # POTFILES.in file. This allows packages to have multiple PO
-        # directories under different names or in different locations.
-        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
-          rm -f "$ac_dir/POTFILES"
-          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
-          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ 	]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
-          POMAKEFILEDEPS="POTFILES.in"
-          # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
-          # on $ac_dir but don't depend on user-specified configuration
-          # parameters.
-          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
-            # The LINGUAS file contains the set of available languages.
-            if test -n "$OBSOLETE_ALL_LINGUAS"; then
-              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
-            fi
-            ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
-            # Hide the ALL_LINGUAS assigment from automake.
-            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
-            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
-          else
-            # The set of available languages was given in configure.in.
-            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
-          fi
-          # Compute POFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
-          # Compute UPDATEPOFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
-          # Compute DUMMYPOFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
-          # Compute GMOFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
-          case "$ac_given_srcdir" in
-            .) srcdirpre= ;;
-            *) srcdirpre='$(srcdir)/' ;;
-          esac
-          POFILES=
-          UPDATEPOFILES=
-          DUMMYPOFILES=
-          GMOFILES=
-          for lang in $ALL_LINGUAS; do
-            POFILES="$POFILES $srcdirpre$lang.po"
-            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
-            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
-            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
-          done
-          # CATALOGS depends on both $ac_dir and the user's LINGUAS
-          # environment variable.
-          INST_LINGUAS=
-          if test -n "$ALL_LINGUAS"; then
-            for presentlang in $ALL_LINGUAS; do
-              useit=no
-              if test "%UNSET%" != "$LINGUAS"; then
-                desiredlanguages="$LINGUAS"
-              else
-                desiredlanguages="$ALL_LINGUAS"
-              fi
-              for desiredlang in $desiredlanguages; do
-                # Use the presentlang catalog if desiredlang is
-                #   a. equal to presentlang, or
-                #   b. a variant of presentlang (because in this case,
-                #      presentlang can be used as a fallback for messages
-                #      which are not translated in the desiredlang catalog).
-                case "$desiredlang" in
-                  "$presentlang"*) useit=yes;;
-                esac
-              done
-              if test $useit = yes; then
-                INST_LINGUAS="$INST_LINGUAS $presentlang"
-              fi
-            done
-          fi
-          CATALOGS=
-          if test -n "$INST_LINGUAS"; then
-            for lang in $INST_LINGUAS; do
-              CATALOGS="$CATALOGS $lang.gmo"
-            done
-          fi
-          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
-          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
-          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
-            if test -f "$f"; then
-              case "$f" in
-                *.orig | *.bak | *~) ;;
-                *) cat "$f" >> "$ac_dir/Makefile" ;;
-              esac
-            fi
-          done
-        fi
-        ;;
-      esac
-    done ;;
-    tests/atconfig ) cat >tests/atconfig <<ATEOF
-# Configurable variable values for building test suites.
-# Generated by $0.
-# Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
-
-# The test suite will define top_srcdir=$at_top_srcdir/../.. etc.
-at_testdir='tests'
-abs_builddir='$ac_abs_builddir'
-at_srcdir='$ac_srcdir'
-abs_srcdir='$ac_abs_srcdir'
-at_top_srcdir='$ac_top_srcdir'
-abs_top_srcdir='$ac_abs_top_srcdir'
-at_top_builddir='$ac_top_builddir'
-abs_top_builddir='$ac_abs_top_builddir'
-
-AUTOTEST_PATH='tests'
-
-SHELL=\${CONFIG_SHELL-'$SHELL'}
-ATEOF
- ;;
-  esac
-done
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-{ (exit 0); exit 0; }
-_ACEOF
-chmod +x $CONFIG_STATUS
-ac_clean_files=$ac_clean_files_save
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || { (exit 1); exit 1; }
-fi
-
diff --git a/configure.ac b/configure.ac
deleted file mode 100644
index 7804b02..0000000
--- a/configure.ac
+++ /dev/null
@@ -1,144 +0,0 @@
-# Configure template for GNU Bison.                   -*-Autoconf-*-
-#
-# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 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 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
-
-# This file uses AC_CONFIG_MACRO_DIR, so we need Autoconf 2.58 or better.
-# But Autoconf 2.58 has a bug in the way that it generates tests: it
-# puts the wrong absolute path names in the tests.  So we need at
-# least Autoconf 2.59.
-AC_PREREQ(2.59)
-
-AC_INIT([GNU Bison], [2.3], [bug-bison@gnu.org])
-AC_CONFIG_AUX_DIR([build-aux])
-AC_CONFIG_MACRO_DIR([m4])
-
-# We don't have a file m4/Makefile.am, so we need Automake 1.8 or later.
-AM_INIT_AUTOMAKE([1.8 check-news readme-alpha dist-bzip2])
-AC_CONFIG_HEADERS([config.h:config.hin])
-
-gl_USE_SYSTEM_EXTENSIONS
-
-# Checks for the compiler.
-AC_PROG_CC
-AM_PROG_CC_STDC
-AC_ARG_ENABLE(gcc-warnings,
-[  --enable-gcc-warnings   turn on lots of GCC warnings (not recommended)],
-[case "${enableval}" in
-   yes|no) ;;
-   *)      AC_MSG_ERROR([bad value ${enableval} for gcc-warnings option]) ;;
- esac],
-              [enableval=no])
-if test "${enableval}" = yes; then
-  BISON_WARNING(-Werror)
-  AC_SUBST([WERROR_CFLAGS], [$WARNING_CFLAGS])
-  WARNING_CFLAGS=
-  BISON_WARNING(-W)
-  BISON_WARNING(-Wall)
-  BISON_WARNING(-Wcast-align)
-  BISON_WARNING(-Wcast-qual)
-  BISON_WARNING(-Wformat)
-  BISON_WARNING(-Wwrite-strings)
-  AC_SUBST([WARNING_CXXFLAGS], [$WARNING_CFLAGS])
-  # The following warnings are not suitable for C++.
-  BISON_WARNING(-Wbad-function-cast)
-  BISON_WARNING(-Wmissing-declarations)
-  BISON_WARNING(-Wmissing-prototypes)
-  BISON_WARNING(-Wshadow)
-  BISON_WARNING(-Wstrict-prototypes)
-  AC_DEFINE([lint], 1, [Define to 1 if the compiler is checking for lint.])
-fi
-
-BISON_TEST_FOR_WORKING_C_COMPILER
-
-AC_ARG_ENABLE([yacc],
-  [AC_HELP_STRING([--disable-yacc],
-     [do not build a yacc command or an -ly library])],
-  , [enable_yacc=yes])
-case $enable_yacc in
-yes)
-  YACC_SCRIPT=yacc
-  YACC_LIBRARY=liby.a;;
-*)
-  YACC_SCRIPT=
-  YACC_LIBRARY=;;
-esac
-AC_SUBST([YACC_SCRIPT])
-AC_SUBST([YACC_LIBRARY])
-
-# Checks for programs.
-AC_PROG_LEX
-AC_PROG_YACC
-AC_PROG_RANLIB
-BISON_PROG_GNU_M4
-if test x"$ac_cv_prog_gnu_m4" != xyes; then
-  AC_MSG_ERROR([GNU M4 1.4 is required])
-fi
-AC_DEFINE_UNQUOTED([M4], ["$M4"], [Define to the GNU M4 executable name.])
-
-# Checks for header files.
-AC_CHECK_HEADERS_ONCE([locale.h])
-AM_STDBOOL_H
-
-# Checks for compiler characteristics.
-AC_C_INLINE
-
-# Checks for types.
-AC_CHECK_TYPES([uintptr_t])
-
-# Checks for library functions.
-AC_CHECK_FUNCS_ONCE([setlocale])
-AM_WITH_DMALLOC
-BISON_PREREQ_SUBPIPE
-BISON_PREREQ_TIMEVAR
-
-# gnulib and gettext.
-GNULIB_AUTOCONF_SNIPPET
-# We use po/Makevars, so we need at least gettext 0.12.
-AM_GNU_GETTEXT_VERSION([0.12])
-BISON_I18N
-
-# Internationalized parsers.
-AC_CONFIG_FILES([runtime-po/Makefile.in])
-# Autoconf macros for packages using internationalized parsers.
-aclocaldir='${datadir}/aclocal'
-AC_SUBST([aclocaldir])
-
-# Initialize the test suite.
-AC_CONFIG_TESTDIR(tests)
-AC_CONFIG_FILES([tests/Makefile tests/atlocal])
-AC_CONFIG_FILES([tests/bison], [chmod +x tests/bison])
-AC_CHECK_PROGS([VALGRIND], [valgrind])
-AC_PROG_CXX
-BISON_TEST_FOR_WORKING_CXX_COMPILER
-AM_MISSING_PROG([AUTOM4TE], [autom4te])
-# Needed by tests/atlocal.in.
-AC_SUBST([GCC])
-O0CFLAGS=`echo $CFLAGS | sed 's/-O[[0-9]] *//'`
-AC_SUBST([O0CFLAGS])
-O0CXXFLAGS=`echo $CXXFLAGS | sed 's/-O[[0-9]] *//'`
-AC_SUBST([O0CXXFLAGS])
-
-AC_CONFIG_FILES([Makefile
-                 build-aux/Makefile
-                 po/Makefile.in
-                 data/Makefile
-		 examples/Makefile
-		    examples/calc++/Makefile
-                 lib/Makefile src/Makefile doc/Makefile])
-AC_OUTPUT
diff --git a/data/Makefile b/data/Makefile
deleted file mode 100644
index b69236d..0000000
--- a/data/Makefile
+++ /dev/null
@@ -1,412 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# data/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-
-srcdir = .
-top_srcdir = ..
-
-pkgdatadir = $(datadir)/bison
-pkglibdir = $(libdir)/bison
-pkgincludedir = $(includedir)/bison
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = /usr/bin/install -c
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-unknown-linux-gnu
-host_triplet = x86_64-unknown-linux-gnu
-subdir = data
-DIST_COMMON = README $(dist_m4sugar_DATA) $(dist_pkgdata_DATA) \
-	$(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-SOURCES =
-DIST_SOURCES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-am__installdirs = "$(DESTDIR)$(m4sugardir)" "$(DESTDIR)$(pkgdatadir)"
-dist_m4sugarDATA_INSTALL = $(INSTALL_DATA)
-dist_pkgdataDATA_INSTALL = $(INSTALL_DATA)
-DATA = $(dist_m4sugar_DATA) $(dist_pkgdata_DATA)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run aclocal-1.9
-AMDEP_FALSE = #
-AMDEP_TRUE = 
-AMTAR = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run tar
-AUTOCONF = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoconf
-AUTOHEADER = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoheader
-AUTOM4TE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autom4te
-AUTOMAKE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run automake-1.9
-AWK = gawk
-BISON_CXX_WORKS = :
-BISON_CXX_WORKS_FALSE = #
-BISON_CXX_WORKS_TRUE = 
-BISON_LOCALEDIR = /usr/share/locale
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPP = gcc -E
-CPPFLAGS = 
-CXX = g++
-CXXDEPMODE = depmode=gcc3
-CXXFLAGS = -g -O2
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = grep -E
-EXEEXT = 
-GCC = yes
-GETOPT_H = 
-GMSGFMT = /usr/bin/msgfmt
-HAVE__BOOL = 1
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
-INTLLIBS = 
-INTL_MACOSX_LIBS = 
-LDFLAGS = 
-LEX = flex
-LEXLIB = -lfl
-LEX_OUTPUT_ROOT = lex.yy
-LIBICONV = -liconv
-LIBINTL = 
-LIBOBJS =  dirname$U.o exitfail$U.o hard-locale$U.o hash$U.o quote$U.o quotearg$U.o fopen-safer$U.o dup-safer$U.o fd-safer$U.o pipe-safer$U.o xmalloc$U.o
-LIBS = 
-LTLIBICONV = -liconv
-LTLIBINTL = 
-LTLIBOBJS =  dirname$U.lo exitfail$U.lo hard-locale$U.lo hash$U.lo quote$U.lo quotearg$U.lo fopen-safer$U.lo dup-safer$U.lo fd-safer$U.lo pipe-safer$U.lo xmalloc$U.lo
-M4 = /usr/bin/m4
-MAKEINFO = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run makeinfo
-MKINSTALLDIRS = $(top_builddir)/build-aux/mkinstalldirs
-MSGFMT = /usr/bin/msgfmt
-MSGMERGE = /usr/bin/msgmerge
-O0CFLAGS = -g 
-O0CXXFLAGS = -g 
-OBJEXT = o
-PACKAGE = bison
-PACKAGE_BUGREPORT = bug-bison@gnu.org
-PACKAGE_NAME = GNU Bison
-PACKAGE_STRING = GNU Bison 2.3
-PACKAGE_TARNAME = bison
-PACKAGE_VERSION = 2.3
-PATH_SEPARATOR = :
-POSUB = po
-RANLIB = ranlib
-SET_MAKE = 
-SHELL = /bin/sh
-STDBOOL_H = 
-STRIP = 
-UNISTD_H = 
-USE_NLS = yes
-VALGRIND = 
-VERSION = 2.3
-WARNING_CFLAGS = 
-WARNING_CXXFLAGS = 
-WERROR_CFLAGS = 
-XGETTEXT = /usr/bin/xgettext
-YACC = bison -y
-YACC_LIBRARY = liby.a
-YACC_SCRIPT = yacc
-ac_ct_CC = gcc
-ac_ct_CXX = g++
-ac_ct_RANLIB = ranlib
-ac_ct_STRIP = 
-aclocaldir = ${datadir}/aclocal
-am__fastdepCC_FALSE = #
-am__fastdepCC_TRUE = 
-am__fastdepCXX_FALSE = #
-am__fastdepCXX_TRUE = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = ${AMTAR} chof - "$$tardir"
-am__untar = ${AMTAR} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-unknown-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = unknown
-datadir = ${prefix}/share
-exec_prefix = ${prefix}
-host = x86_64-unknown-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = unknown
-includedir = ${prefix}/include
-infodir = ${prefix}/info
-install_sh = /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localstatedir = ${prefix}/var
-mandir = ${prefix}/man
-mkdir_p = mkdir -p --
-oldincludedir = /usr/include
-prefix = /home/phanna/src/bison
-program_transform_name = s,x,x,
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-sysconfdir = ${prefix}/etc
-target_alias = 
-dist_pkgdata_DATA = README \
-   c.m4 yacc.c glr.c \
-   c++.m4 location.cc lalr1.cc glr.cc
-
-m4sugardir = $(pkgdatadir)/m4sugar
-dist_m4sugar_DATA = m4sugar/m4sugar.m4
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  data/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  data/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-uninstall-info-am:
-install-dist_m4sugarDATA: $(dist_m4sugar_DATA)
-	@$(NORMAL_INSTALL)
-	test -z "$(m4sugardir)" || $(mkdir_p) "$(DESTDIR)$(m4sugardir)"
-	@list='$(dist_m4sugar_DATA)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(dist_m4sugarDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(m4sugardir)/$$f'"; \
-	  $(dist_m4sugarDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(m4sugardir)/$$f"; \
-	done
-
-uninstall-dist_m4sugarDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(dist_m4sugar_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(m4sugardir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(m4sugardir)/$$f"; \
-	done
-install-dist_pkgdataDATA: $(dist_pkgdata_DATA)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgdatadir)"
-	@list='$(dist_pkgdata_DATA)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(dist_pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \
-	  $(dist_pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \
-	done
-
-uninstall-dist_pkgdataDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(dist_pkgdata_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \
-	done
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	$(mkdir_p) $(distdir)/m4sugar
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(DATA)
-installdirs:
-	for dir in "$(DESTDIR)$(m4sugardir)" "$(DESTDIR)$(pkgdatadir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am: install-dist_m4sugarDATA install-dist_pkgdataDATA
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-dist_m4sugarDATA uninstall-dist_pkgdataDATA \
-	uninstall-info-am
-
-.PHONY: all all-am check check-am clean clean-generic distclean \
-	distclean-generic distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am \
-	install-dist_m4sugarDATA install-dist_pkgdataDATA install-exec \
-	install-exec-am install-info install-info-am install-man \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
-	uninstall-dist_m4sugarDATA uninstall-dist_pkgdataDATA \
-	uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/data/Makefile.am b/data/Makefile.am
deleted file mode 100644
index 7c4ccf9..0000000
--- a/data/Makefile.am
+++ /dev/null
@@ -1,23 +0,0 @@
-## Copyright (C) 2002, 2005 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 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, write to the Free Software
-## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-## 02110-1301  USA
-
-dist_pkgdata_DATA = README \
-   c.m4 yacc.c glr.c \
-   c++.m4 location.cc lalr1.cc glr.cc
-
-m4sugardir = $(pkgdatadir)/m4sugar
-dist_m4sugar_DATA = m4sugar/m4sugar.m4
diff --git a/data/Makefile.in b/data/Makefile.in
deleted file mode 100644
index 3a5f561..0000000
--- a/data/Makefile.in
+++ /dev/null
@@ -1,412 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = data
-DIST_COMMON = README $(dist_m4sugar_DATA) $(dist_pkgdata_DATA) \
-	$(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-SOURCES =
-DIST_SOURCES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-am__installdirs = "$(DESTDIR)$(m4sugardir)" "$(DESTDIR)$(pkgdatadir)"
-dist_m4sugarDATA_INSTALL = $(INSTALL_DATA)
-dist_pkgdataDATA_INSTALL = $(INSTALL_DATA)
-DATA = $(dist_m4sugar_DATA) $(dist_pkgdata_DATA)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOM4TE = @AUTOM4TE@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BISON_CXX_WORKS = @BISON_CXX_WORKS@
-BISON_CXX_WORKS_FALSE = @BISON_CXX_WORKS_FALSE@
-BISON_CXX_WORKS_TRUE = @BISON_CXX_WORKS_TRUE@
-BISON_LOCALEDIR = @BISON_LOCALEDIR@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-GCC = @GCC@
-GETOPT_H = @GETOPT_H@
-GMSGFMT = @GMSGFMT@
-HAVE__BOOL = @HAVE__BOOL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTLLIBS = @INTLLIBS@
-INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
-LDFLAGS = @LDFLAGS@
-LEX = @LEX@
-LEXLIB = @LEXLIB@
-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
-LIBICONV = @LIBICONV@
-LIBINTL = @LIBINTL@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LTLIBICONV = @LTLIBICONV@
-LTLIBINTL = @LTLIBINTL@
-LTLIBOBJS = @LTLIBOBJS@
-M4 = @M4@
-MAKEINFO = @MAKEINFO@
-MKINSTALLDIRS = @MKINSTALLDIRS@
-MSGFMT = @MSGFMT@
-MSGMERGE = @MSGMERGE@
-O0CFLAGS = @O0CFLAGS@
-O0CXXFLAGS = @O0CXXFLAGS@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-POSUB = @POSUB@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STDBOOL_H = @STDBOOL_H@
-STRIP = @STRIP@
-UNISTD_H = @UNISTD_H@
-USE_NLS = @USE_NLS@
-VALGRIND = @VALGRIND@
-VERSION = @VERSION@
-WARNING_CFLAGS = @WARNING_CFLAGS@
-WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
-WERROR_CFLAGS = @WERROR_CFLAGS@
-XGETTEXT = @XGETTEXT@
-YACC = @YACC@
-YACC_LIBRARY = @YACC_LIBRARY@
-YACC_SCRIPT = @YACC_SCRIPT@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-aclocaldir = @aclocaldir@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-dist_pkgdata_DATA = README \
-   c.m4 yacc.c glr.c \
-   c++.m4 location.cc lalr1.cc glr.cc
-
-m4sugardir = $(pkgdatadir)/m4sugar
-dist_m4sugar_DATA = m4sugar/m4sugar.m4
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  data/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  data/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-uninstall-info-am:
-install-dist_m4sugarDATA: $(dist_m4sugar_DATA)
-	@$(NORMAL_INSTALL)
-	test -z "$(m4sugardir)" || $(mkdir_p) "$(DESTDIR)$(m4sugardir)"
-	@list='$(dist_m4sugar_DATA)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(dist_m4sugarDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(m4sugardir)/$$f'"; \
-	  $(dist_m4sugarDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(m4sugardir)/$$f"; \
-	done
-
-uninstall-dist_m4sugarDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(dist_m4sugar_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(m4sugardir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(m4sugardir)/$$f"; \
-	done
-install-dist_pkgdataDATA: $(dist_pkgdata_DATA)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgdatadir)"
-	@list='$(dist_pkgdata_DATA)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(dist_pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \
-	  $(dist_pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \
-	done
-
-uninstall-dist_pkgdataDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(dist_pkgdata_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \
-	done
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	$(mkdir_p) $(distdir)/m4sugar
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(DATA)
-installdirs:
-	for dir in "$(DESTDIR)$(m4sugardir)" "$(DESTDIR)$(pkgdatadir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am: install-dist_m4sugarDATA install-dist_pkgdataDATA
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-dist_m4sugarDATA uninstall-dist_pkgdataDATA \
-	uninstall-info-am
-
-.PHONY: all all-am check check-am clean clean-generic distclean \
-	distclean-generic distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am \
-	install-dist_m4sugarDATA install-dist_pkgdataDATA install-exec \
-	install-exec-am install-info install-info-am install-man \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
-	uninstall-dist_m4sugarDATA uninstall-dist_pkgdataDATA \
-	uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/data/README b/data/README
deleted file mode 100644
index 2267791..0000000
--- a/data/README
+++ /dev/null
@@ -1,45 +0,0 @@
--*- outline -*-
-
-This directory contains Bison skeletons: the general shapes of the
-different parser kinds, that are specialized for specific grammars by
-the bison program.
-
-Currently, there are only three supported skeletons:
-
-- yacc.c
-  It used to be named bison.simple: it corresponds to C Yacc
-  compatible LALR(1) parsers.
-
-- lalr1.cc
-  Produces a C++ parser class.  It is still very experimental, and not
-  yet supported.  Please, subscribe to bison-patches@gnu.org.
-
-- glr.c
-  A Generalized LR C parser based on Bison's LALR(1) tables.
-
-These skeletons are the only ones supported by the Bison team.
-Because the interface between skeletons and the bison program is not
-finished, *we are not bound to it*.  In particular, Bison is not
-mature enough for us to consider that ``foreign skeletons'' are
-supported.
-
------
-
-Copyright (C) 2002 Free Software Foundation, Inc.
-
-This file is part of GNU Bison.
-
-GNU Bison 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 Bison 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 Bison; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA.
diff --git a/data/c++.m4 b/data/c++.m4
deleted file mode 100644
index 57aee0c..0000000
--- a/data/c++.m4
+++ /dev/null
@@ -1,122 +0,0 @@
-m4_divert(-1)                                               -*- Autoconf -*-
-
-# C++ skeleton for Bison
-
-# Copyright (C) 2002, 2003, 2004, 2005, 2006 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 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
-
-m4_include(b4_pkgdatadir/[c.m4])
-
-## ---------------- ##
-## Default values.  ##
-## ---------------- ##
-
-# Default parser class name.
-m4_define_default([b4_parser_class_name], [parser])
-m4_define_default([b4_location_type], [location])
-m4_define_default([b4_filename_type], [std::string])
-m4_define_default([b4_namespace], m4_defn([b4_prefix]))
-
-
-# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
-# -----------------------------------------------------
-# Output the definition of the tokens as enums.
-m4_define([b4_token_enums],
-[/* Tokens.  */
-   enum yytokentype {
-m4_map_sep([     b4_token_enum], [,
-],
-           [$@])
-   };
-])
-
-
-## ----------------- ##
-## Semantic Values.  ##
-## ----------------- ##
-
-
-# b4_lhs_value([TYPE])
-# --------------------
-# Expansion of $<TYPE>$.
-m4_define([b4_lhs_value],
-[(yyval[]m4_ifval([$1], [.$1]))])
-
-
-# b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
-# --------------------------------------
-# Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
-# symbols on RHS.
-m4_define([b4_rhs_value],
-[(yysemantic_stack_@{($1) - ($2)@}m4_ifval([$3], [.$3]))])
-
-# b4_lhs_location()
-# -----------------
-# Expansion of @$.
-m4_define([b4_lhs_location],
-[(yyloc)])
-
-
-# b4_rhs_location(RULE-LENGTH, NUM)
-# ---------------------------------
-# Expansion of @NUM, where the current rule has RULE-LENGTH symbols
-# on RHS.
-m4_define([b4_rhs_location],
-[(yylocation_stack_@{($1) - ($2)@})])
-
-
-# b4_parse_param_decl
-# -------------------
-# Extra formal arguments of the constructor.
-# Change the parameter names from "foo" into "foo_yyarg", so that
-# there is no collision bw the user chosen attribute name, and the
-# argument name in the constructor.
-m4_define([b4_parse_param_decl],
-[m4_ifset([b4_parse_param],
-          [m4_map_sep([b4_parse_param_decl_1], [, ], [b4_parse_param])])])
-
-m4_define([b4_parse_param_decl_1],
-[$1_yyarg])
-
-
-
-# b4_parse_param_cons
-# -------------------
-# Extra initialisations of the constructor.
-m4_define([b4_parse_param_cons],
-          [m4_ifset([b4_parse_param],
-		    [,
-      b4_cc_constructor_calls(b4_parse_param)])])
-m4_define([b4_cc_constructor_calls],
-	  [m4_map_sep([b4_cc_constructor_call], [,
-      ], [$@])])
-m4_define([b4_cc_constructor_call],
-	  [$2 ($2_yyarg)])
-
-# b4_parse_param_vars
-# -------------------
-# Extra instance variables.
-m4_define([b4_parse_param_vars],
-          [m4_ifset([b4_parse_param],
-		    [
-    /* User arguments.  */
-b4_cc_var_decls(b4_parse_param)])])
-m4_define([b4_cc_var_decls],
-	  [m4_map_sep([b4_cc_var_decl], [
-], [$@])])
-m4_define([b4_cc_var_decl],
-	  [    $1;])
diff --git a/data/c.m4 b/data/c.m4
deleted file mode 100644
index f10e090..0000000
--- a/data/c.m4
+++ /dev/null
@@ -1,534 +0,0 @@
-m4_divert(-1)                                               -*- Autoconf -*-
-
-# C M4 Macros for Bison.
-# Copyright (C) 2002, 2004, 2005, 2006 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 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
-
-
-## ---------------- ##
-## Identification.  ##
-## ---------------- ##
-
-# b4_copyright(TITLE, YEARS)
-# --------------------------
-m4_define([b4_copyright],
-[/* A Bison parser, made by GNU Bison b4_version.  */
-
-/* $1
-
-m4_text_wrap([Copyright (C) $2 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.  */
-
-/* As a special exception, you may create a larger work that contains
-   part or all of the Bison parser skeleton and distribute that work
-   under terms of your choice, so long as that work isn't itself a
-   parser generator using the skeleton or a modified version thereof
-   as a parser skeleton.  Alternatively, if you modify or redistribute
-   the parser skeleton itself, you may (at your option) remove this
-   special exception, which will cause the skeleton and the resulting
-   Bison output files to be licensed under the GNU General Public
-   License without this special exception.
-
-   This special exception was added by the Free Software Foundation in
-   version 2.2 of Bison.  */])
-
-
-# b4_identification
-# -----------------
-m4_define([b4_identification],
-[/* Identify Bison output.  */
-[#]define YYBISON 1
-
-/* Bison version.  */
-[#]define YYBISON_VERSION "b4_version"
-
-/* Skeleton name.  */
-[#]define YYSKELETON_NAME b4_skeleton
-
-/* Pure parsers.  */
-[#]define YYPURE b4_pure_flag
-
-/* Using locations.  */
-[#]define YYLSP_NEEDED b4_locations_flag
-])
-
-
-
-## ---------------- ##
-## Default values.  ##
-## ---------------- ##
-
-m4_define_default([b4_epilogue], [])
-
-
-
-## ------------------------ ##
-## Pure/impure interfaces.  ##
-## ------------------------ ##
-
-
-# b4_user_args
-# ------------
-m4_define([b4_user_args],
-[m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])])
-
-
-# b4_parse_param
-# --------------
-# If defined, b4_parse_param arrives double quoted, but below we prefer
-# it to be single quoted.
-m4_define_default([b4_parse_param])
-m4_define([b4_parse_param],
-b4_parse_param))
-
-
-# b4_parse_param_for(DECL, FORMAL, BODY)
-# ---------------------------------------
-# Iterate over the user parameters, binding the declaration to DECL,
-# the formal name to FORMAL, and evaluating the BODY.
-m4_define([b4_parse_param_for],
-[m4_foreach([$1_$2], m4_defn([b4_parse_param]),
-[m4_pushdef([$1], m4_fst($1_$2))dnl
-m4_pushdef([$2], m4_shift($1_$2))dnl
-$3[]dnl
-m4_popdef([$2])dnl
-m4_popdef([$1])dnl
-])])
-
-# b4_parse_param_use
-# ------------------
-# `YYUSE' all the parse-params.
-m4_define([b4_parse_param_use],
-[b4_parse_param_for([Decl], [Formal], [  YYUSE (Formal);
-])dnl
-])
-
-## ------------ ##
-## Data Types.  ##
-## ------------ ##
-
-
-# b4_ints_in(INT1, INT2, LOW, HIGH)
-# ---------------------------------
-# Return 1 iff both INT1 and INT2 are in [LOW, HIGH], 0 otherwise.
-m4_define([b4_ints_in],
-[m4_eval([$3 <= $1 && $1 <= $4 && $3 <= $2 && $2 <= $4])])
-
-
-# b4_int_type(MIN, MAX)
-# ---------------------
-# Return the smallest int type able to handle numbers ranging from
-# MIN to MAX (included).
-m4_define([b4_int_type],
-[m4_if(b4_ints_in($@,      [0],   [255]), [1], [unsigned char],
-       b4_ints_in($@,   [-128],   [127]), [1], [signed char],
-
-       b4_ints_in($@,      [0], [65535]), [1], [unsigned short int],
-       b4_ints_in($@, [-32768], [32767]), [1], [short int],
-
-       m4_eval([0 <= $1]),                [1], [unsigned int],
-
-					       [int])])
-
-
-# b4_int_type_for(NAME)
-# ---------------------
-# Return the smallest int type able to handle numbers ranging from
-# `NAME_min' to `NAME_max' (included).
-m4_define([b4_int_type_for],
-[b4_int_type($1_min, $1_max)])
-
-
-## ------------------ ##
-## Decoding options.  ##
-## ------------------ ##
-
-# b4_flag_if(FLAG, IF-TRUE, IF-FALSE)
-# -----------------------------------
-# Run IF-TRUE if b4_FLAG_flag is 1, IF-FALSE if FLAG is 0, otherwise fail.
-m4_define([b4_flag_if],
-[m4_case(b4_$1_flag,
-         [0], [$3],
-	 [1], [$2],
-	 [m4_fatal([invalid $1 value: ]$1)])])
-
-
-# b4_define_flag_if(FLAG)
-# -----------------------
-# Define "b4_FLAG_if(IF-TRUE, IF-FALSE)" that depends on the
-# value of the Boolean FLAG.
-m4_define([b4_define_flag_if],
-[_b4_define_flag_if($[1], $[2], [$1])])
-
-# _b4_define_flag_if($1, $2, FLAG)
-# --------------------------------
-# This macro works around the impossibility to define macros
-# inside macros, because issuing `[$1]' is not possible in M4 :(.
-# This sucks hard, GNU M4 should really provide M5 like $$1.
-m4_define([_b4_define_flag_if],
-[m4_if([$1$2], $[1]$[2], [],
-       [m4_fatal([$0: Invalid arguments: $@])])dnl
-m4_define([b4_$3_if], 
-          [b4_flag_if([$3], [$1], [$2])])])
-
-
-# b4_FLAG_if(IF-TRUE, IF-FALSE)
-# -----------------------------
-# Expand IF-TRUE, if FLAG is true, IF-FALSE otherwise.
-b4_define_flag_if([defines])        # Whether headers are requested.
-b4_define_flag_if([error_verbose])  # Wheter error are verbose.
-b4_define_flag_if([locations])      # Whether locations are tracked.
-b4_define_flag_if([pure])           # Whether the interface is pure.
-
-
-
-## ------------------------- ##
-## Assigning token numbers.  ##
-## ------------------------- ##
-
-# b4_token_define(TOKEN-NAME, TOKEN-NUMBER)
-# -----------------------------------------
-# Output the definition of this token as #define.
-m4_define([b4_token_define],
-[#define $1 $2
-])
-
-
-# b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
-# -------------------------------------------------------
-# Output the definition of the tokens (if there are) as #defines.
-m4_define([b4_token_defines],
-[m4_if([$@], [[]], [],
-[/* Tokens.  */
-m4_map([b4_token_define], [$@])])
-])
-
-
-# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER)
-# ---------------------------------------
-# Output the definition of this token as an enum.
-m4_define([b4_token_enum],
-[$1 = $2])
-
-
-# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
-# -----------------------------------------------------
-# Output the definition of the tokens (if there are) as enums.
-m4_define([b4_token_enums],
-[m4_if([$@], [[]], [],
-[/* Tokens.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-m4_map_sep([     b4_token_enum], [,
-],
-	   [$@])
-   };
-#endif
-])])
-
-
-# b4_token_enums_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
-# -------------------------------------------------------------
-# Output the definition of the tokens (if there are) as enums and #defines.
-m4_define([b4_token_enums_defines],
-[b4_token_enums($@)b4_token_defines($@)
-])
-
-
-
-## --------------------------------------------- ##
-## Defining C functions in both K&R and ANSI-C.  ##
-## --------------------------------------------- ##
-
-
-# b4_modern_c
-# -----------
-# A predicate useful in #if to determine whether C is ancient or modern.
-#
-# If __STDC__ is defined, the compiler is modern.  IBM xlc 7.0 when run
-# as 'cc' doesn't define __STDC__ (or __STDC_VERSION__) for pedantic
-# reasons, but it defines __C99__FUNC__ so check that as well.
-# Microsoft C normally doesn't define these macros, but it defines _MSC_VER.
-# Consider a C++ compiler to be modern if it defines __cplusplus.
-#
-m4_define([b4_c_modern],
-  [[(defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)]])
-
-# b4_c_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
-# ----------------------------------------------------------
-# Declare the function NAME.
-m4_define([b4_c_function_def],
-[#if b4_c_modern
-b4_c_ansi_function_def($@)
-#else
-$2
-$1 (b4_c_knr_formal_names(m4_shiftn(2, $@)))
-b4_c_knr_formal_decls(m4_shiftn(2, $@))
-#endif[]dnl
-])
-
-
-# b4_c_ansi_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
-# ---------------------------------------------------------------
-# Declare the function NAME in ANSI.
-m4_define([b4_c_ansi_function_def],
-[$2
-$1 (b4_c_ansi_formals(m4_shiftn(2, $@)))[]dnl
-])
-
-
-# b4_c_ansi_formals([DECL1, NAME1], ...)
-# --------------------------------------
-# Output the arguments ANSI-C definition.
-m4_define([b4_c_ansi_formals],
-[m4_case([$@],
-	 [],   [void],
-	 [[]], [void],
-	       [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])])
-
-m4_define([b4_c_ansi_formal],
-[$1])
-
-
-# b4_c_knr_formal_names([DECL1, NAME1], ...)
-# ------------------------------------------
-# Output the argument names.
-m4_define([b4_c_knr_formal_names],
-[m4_map_sep([b4_c_knr_formal_name], [, ], [$@])])
-
-m4_define([b4_c_knr_formal_name],
-[$2])
-
-
-# b4_c_knr_formal_decls([DECL1, NAME1], ...)
-# ------------------------------------------
-# Output the K&R argument declarations.
-m4_define([b4_c_knr_formal_decls],
-[m4_map_sep([b4_c_knr_formal_decl],
-	    [
-],
-	    [$@])])
-
-m4_define([b4_c_knr_formal_decl],
-[    $1;])
-
-
-
-## ------------------------------------------------------------ ##
-## Declaring (prototyping) C functions in both K&R and ANSI-C.  ##
-## ------------------------------------------------------------ ##
-
-
-# b4_c_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
-# -----------------------------------------------------------
-# Declare the function NAME.
-m4_define([b4_c_function_decl],
-[#if defined __STDC__ || defined __cplusplus
-b4_c_ansi_function_decl($@)
-#else
-$2 $1 ();
-#endif[]dnl
-])
-
-
-# b4_c_ansi_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
-# ----------------------------------------------------------------
-# Declare the function NAME.
-m4_define([b4_c_ansi_function_decl],
-[$2 $1 (b4_c_ansi_formals(m4_shiftn(2, $@)));[]dnl
-])
-
-
-
-
-## --------------------- ##
-## Calling C functions.  ##
-## --------------------- ##
-
-
-# b4_c_function_call(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
-# -----------------------------------------------------------
-# Call the function NAME with arguments NAME1, NAME2 etc.
-m4_define([b4_c_function_call],
-[$1 (b4_c_args(m4_shiftn(2, $@)))[]dnl
-])
-
-
-# b4_c_args([DECL1, NAME1], ...)
-# ------------------------------
-# Output the arguments NAME1, NAME2...
-m4_define([b4_c_args],
-[m4_map_sep([b4_c_arg], [, ], [$@])])
-
-m4_define([b4_c_arg],
-[$2])
-
-
-## ----------- ##
-## Synclines.  ##
-## ----------- ##
-
-# b4_syncline(LINE, FILE)
-# -----------------------
-m4_define([b4_syncline],
-[b4_flag_if([synclines], [[#]line $1 $2])])
-
-
-
-## -------------- ##
-## User actions.  ##
-## -------------- ##
-
-# b4_symbol_actions(FILENAME, LINENO,
-#                   SYMBOL-TAG, SYMBOL-NUM,
-#                   SYMBOL-ACTION, SYMBOL-TYPENAME)
-# -------------------------------------------------
-m4_define([b4_symbol_actions],
-[m4_pushdef([b4_dollar_dollar],
-   [m4_ifval([$6], [(yyvaluep->$6)], [(*yyvaluep)])])dnl
-m4_pushdef([b4_at_dollar], [(*yylocationp)])dnl
-      case $4: /* $3 */
-b4_syncline([$2], [$1])
-	$5;
-b4_syncline([@oline@], [@ofile@])
-	break;
-m4_popdef([b4_at_dollar])dnl
-m4_popdef([b4_dollar_dollar])dnl
-])
-
-
-# b4_yydestruct_generate(FUNCTION-DECLARATOR)
-# -------------------------------------------
-# Generate the "yydestruct" function, which declaration is issued using
-# FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C
-# or "b4_c_function_def" for K&R.
-m4_define_default([b4_yydestruct_generate],
-[[/*-----------------------------------------------.
-| Release the memory associated to this symbol.  |
-`-----------------------------------------------*/
-
-/*ARGSUSED*/
-]$1([yydestruct],
-    [static void],
-    [[const char *yymsg],    [yymsg]],
-    [[int yytype],           [yytype]],
-    [[YYSTYPE *yyvaluep],    [yyvaluep]][]dnl
-b4_locations_if(            [, [[YYLTYPE *yylocationp], [yylocationp]]])[]dnl
-m4_ifset([b4_parse_param], [, b4_parse_param]))[
-{
-  YYUSE (yyvaluep);
-]b4_locations_if([  YYUSE (yylocationp);
-])dnl
-b4_parse_param_use[]dnl
-[
-  if (!yymsg)
-    yymsg = "Deleting";
-  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-
-  switch (yytype)
-    {
-]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
-      default:
-	break;
-    }
-}]dnl
-])
-
-
-# b4_yy_symbol_print_generate(FUNCTION-DECLARATOR)
-# ------------------------------------------------
-# Generate the "yy_symbol_print" function, which declaration is issued using
-# FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C
-# or "b4_c_function_def" for K&R.
-m4_define_default([b4_yy_symbol_print_generate],
-[[
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
-
-/*ARGSUSED*/
-]$1([yy_symbol_value_print],
-    [static void],
-	       [[FILE *yyoutput],                       [yyoutput]],
-	       [[int yytype],                           [yytype]],
-	       [[YYSTYPE const * const yyvaluep],       [yyvaluep]][]dnl
-b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
-m4_ifset([b4_parse_param], [, b4_parse_param]))[
-{
-  if (!yyvaluep)
-    return;
-]b4_locations_if([  YYUSE (yylocationp);
-])dnl
-b4_parse_param_use[]dnl
-[# ifdef YYPRINT
-  if (yytype < YYNTOKENS)
-    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# else
-  YYUSE (yyoutput);
-# endif
-  switch (yytype)
-    {
-]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
-[      default:
-	break;
-    }
-}
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
-
-]$1([yy_symbol_print],
-    [static void],
-	       [[FILE *yyoutput],                       [yyoutput]],
-	       [[int yytype],                           [yytype]],
-	       [[YYSTYPE const * const yyvaluep],       [yyvaluep]][]dnl
-b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
-m4_ifset([b4_parse_param], [, b4_parse_param]))[
-{
-  if (yytype < YYNTOKENS)
-    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-  else
-    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
-]b4_locations_if([  YY_LOCATION_PRINT (yyoutput, *yylocationp);
-  YYFPRINTF (yyoutput, ": ");
-])dnl
-[  yy_symbol_value_print (yyoutput, yytype, yyvaluep]dnl
-b4_locations_if([, yylocationp])[]b4_user_args[);
-  YYFPRINTF (yyoutput, ")");
-}]dnl
-])
diff --git a/data/glr.c b/data/glr.c
deleted file mode 100644
index b872bf4..0000000
--- a/data/glr.c
+++ /dev/null
@@ -1,2616 +0,0 @@
-m4_divert(-1)                                                       -*- C -*-
-
-# GLR skeleton for Bison
-# Copyright (C) 2002, 2003, 2004, 2005, 2006 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 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
-
-
-m4_include(b4_pkgdatadir/[c.m4])
-
-## ---------------- ##
-## Default values.  ##
-## ---------------- ##
-
-# Stack parameters.
-m4_define_default([b4_stack_depth_max], [10000])
-m4_define_default([b4_stack_depth_init],  [200])
-
-
-
-## ------------------------ ##
-## Pure/impure interfaces.  ##
-## ------------------------ ##
-
-
-# b4_user_formals
-# ---------------
-# The possible parse-params formal arguments preceded by a comma.
-#
-# This is not shared with yacc.c in c.m4 because  GLR relies on ISO C
-# formal argument declarations.
-m4_define([b4_user_formals],
-[m4_ifset([b4_parse_param], [, b4_c_ansi_formals(b4_parse_param)])])
-
-
-# b4_lex_param
-# ------------
-# Accumule in b4_lex_param all the yylex arguments.
-# Yes, this is quite ugly...
-m4_define([b4_lex_param],
-m4_dquote(b4_pure_if([[[[YYSTYPE *]], [[&yylval]]][]dnl
-b4_locations_if([, [[YYLTYPE *], [&yylloc]]])])dnl
-m4_ifdef([b4_lex_param], [, ]b4_lex_param)))
-
-
-# b4_yyerror_args
-# ---------------
-# Optional effective arguments passed to yyerror: user args plus yylloc, and
-# a trailing comma.
-m4_define([b4_yyerror_args],
-[b4_pure_if([b4_locations_if([yylocp, ])])dnl
-m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
-
-
-# b4_lyyerror_args
-# ----------------
-# Same as above, but on the look-ahead, hence &yylloc instead of yylocp.
-m4_define([b4_lyyerror_args],
-[b4_pure_if([b4_locations_if([&yylloc, ])])dnl
-m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
-
-
-# b4_pure_args
-# ------------
-# Same as b4_yyerror_args, but with a leading comma.
-m4_define([b4_pure_args],
-[b4_pure_if([b4_locations_if([, yylocp])])[]b4_user_args])
-
-
-# b4_lpure_args
-# -------------
-# Same as above, but on the look-ahead, hence &yylloc instead of yylocp.
-m4_define([b4_lpure_args],
-[b4_pure_if([b4_locations_if([, &yylloc])])[]b4_user_args])
-
-
-# b4_pure_formals
-# ---------------
-# Arguments passed to yyerror: user formals plus yylocp.
-m4_define([b4_pure_formals],
-[b4_pure_if([b4_locations_if([, YYLTYPE *yylocp])])[]b4_user_formals])
-
-
-## ----------------- ##
-## Semantic Values.  ##
-## ----------------- ##
-
-
-# b4_lhs_value([TYPE])
-# --------------------
-# Expansion of $<TYPE>$.
-m4_define([b4_lhs_value],
-[((*yyvalp)[]m4_ifval([$1], [.$1]))])
-
-
-# b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
-# --------------------------------------
-# Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
-# symbols on RHS.
-m4_define([b4_rhs_value],
-[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3]))])
-
-
-
-## ----------- ##
-## Locations.  ##
-## ----------- ##
-
-# b4_lhs_location()
-# -----------------
-# Expansion of @$.
-m4_define([b4_lhs_location],
-[(*yylocp)])
-
-
-# b4_rhs_location(RULE-LENGTH, NUM)
-# ---------------------------------
-# Expansion of @NUM, where the current rule has RULE-LENGTH symbols
-# on RHS.
-m4_define([b4_rhs_location],
-[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yyloc)])
-
-
-
-## -------------- ##
-## Output files.  ##
-## -------------- ##
-
-# We do want M4 expansion after # for CPP macros.
-m4_changecom()
-m4_divert(0)dnl
-@output @output_parser_name@
-b4_copyright([Skeleton implementation for Bison GLR parsers in C],
-  [2002, 2003, 2004, 2005, 2006])
-[
-/* C GLR parser skeleton written by Paul Hilfinger.  */
-
-]b4_identification
-
-m4_if(b4_prefix, [yy], [],
-[/* Substitute the variable and function names.  */
-#define yyparse b4_prefix[]parse
-#define yylex   b4_prefix[]lex
-#define yyerror b4_prefix[]error
-#define yylval  b4_prefix[]lval
-#define yychar  b4_prefix[]char
-#define yydebug b4_prefix[]debug
-#define yynerrs b4_prefix[]nerrs
-#define yylloc  b4_prefix[]lloc])
-
-dnl # b4_shared_declarations
-dnl # ----------------------
-dnl # Declaration that might either go into the header (if --defines)
-dnl # or open coded in the parser body.
-m4_define([b4_shared_declarations],
-[b4_token_enums(b4_tokens)[
-
-/* Copy the first part of user declarations.  */
-]b4_pre_prologue[
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-]m4_ifdef([b4_stype],
-[typedef union m4_bregexp(b4_stype, [^{], [YYSTYPE ])
-b4_stype
-/* Line __line__ of glr.c.  */
-b4_syncline([@oline@], [@ofile@])
-	YYSTYPE;],
-[typedef int YYSTYPE;])[
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
-typedef struct YYLTYPE
-{
-]b4_locations_if([
-  int first_line;
-  int first_column;
-  int last_line;
-  int last_column;
-],[
-  char yydummy;
-])[
-} YYLTYPE;
-# define YYLTYPE_IS_DECLARED 1
-# define YYLTYPE_IS_TRIVIAL 1
-#endif
-]])
-
-b4_defines_if([#include @output_header_name@],
-	      [b4_shared_declarations])[
-
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG ]b4_debug_flag[
-#endif
-
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE ]b4_error_verbose_flag[
-#endif
-
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE ]b4_token_table[
-#endif
-
-/* Default (constant) value used for initialization for null
-   right-hand sides.  Unlike the standard yacc.c template,
-   here we set the default value of $$ to a zeroed-out value.
-   Since the default value is undefined, this behavior is
-   technically correct.  */
-static YYSTYPE yyval_default;
-
-/* Copy the second part of user declarations.  */
-]b4_post_prologue[
-
-]/* Line __line__ of glr.c.  */
-b4_syncline([@oline@], [@ofile@])
-[
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-#ifndef YY_
-# if YYENABLE_NLS
-#  if ENABLE_NLS
-#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-#   define YY_(msgid) dgettext ("bison-runtime", msgid)
-#  endif
-# endif
-# ifndef YY_
-#  define YY_(msgid) msgid
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E.  */
-#if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
-#else
-# define YYUSE(e) /* empty */
-#endif
-
-/* Identity function, used to suppress warnings about constant conditions.  */
-#ifndef lint
-# define YYID(n) (n)
-#else
-]b4_c_function_def([YYID], [static int], [[int i], [i]])[
-{
-  return i;
-}
-#endif
-
-#ifndef YYFREE
-# define YYFREE free
-#endif
-#ifndef YYMALLOC
-# define YYMALLOC malloc
-#endif
-#ifndef YYREALLOC
-# define YYREALLOC realloc
-#endif
-
-#define YYSIZEMAX ((size_t) -1)
-
-#ifdef __cplusplus
-   typedef bool yybool;
-#else
-   typedef unsigned char yybool;
-#endif
-#define yytrue 1
-#define yyfalse 0
-
-#ifndef YYSETJMP
-# include <setjmp.h>
-# define YYJMP_BUF jmp_buf
-# define YYSETJMP(env) setjmp (env)
-# define YYLONGJMP(env, val) longjmp (env, val)
-#endif
-
-/*-----------------.
-| GCC extensions.  |
-`-----------------*/
-
-#ifndef __attribute__
-/* This feature is available in gcc versions 2.5 and later.  */
-# if (! defined __GNUC__ || __GNUC__ < 2 \
-      || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__)
-#  define __attribute__(Spec) /* empty */
-# endif
-#endif
-
-]b4_locations_if([#define YYOPTIONAL_LOC(Name) Name],[
-#ifdef __cplusplus
-# define YYOPTIONAL_LOC(Name) /* empty */
-#else
-# define YYOPTIONAL_LOC(Name) Name __attribute__ ((__unused__))
-#endif])[
-
-#ifndef YYASSERT
-# define YYASSERT(condition) ((void) ((condition) || (abort (), 0)))
-#endif
-
-/* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  ]b4_final_state_number[
-/* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   ]b4_last[
-
-/* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  ]b4_tokens_number[
-/* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  ]b4_nterms_number[
-/* YYNRULES -- Number of rules.  */
-#define YYNRULES  ]b4_rules_number[
-/* YYNRULES -- Number of states.  */
-#define YYNSTATES  ]b4_states_number[
-/* YYMAXRHS -- Maximum number of symbols on right-hand side of rule.  */
-#define YYMAXRHS ]b4_r2_max[
-/* YYMAXLEFT -- Maximum number of symbols to the left of a handle
-   accessed by $0, $-1, etc., in any rule.  */
-#define YYMAXLEFT ]b4_max_left_semantic_context[
-
-/* YYTRANSLATE(X) -- Bison symbol number corresponding to X.  */
-#define YYUNDEFTOK  ]b4_undef_token_number[
-#define YYMAXUTOK   ]b4_user_token_number_max[
-
-#define YYTRANSLATE(YYX)						\
-  ((YYX <= 0) ? YYEOF :							\
-   (unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
-static const ]b4_int_type_for([b4_translate])[ yytranslate[] =
-{
-  ]b4_translate[
-};
-
-#if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-   YYRHS.  */
-static const ]b4_int_type_for([b4_prhs])[ yyprhs[] =
-{
-  ]b4_prhs[
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
-static const ]b4_int_type_for([b4_rhs])[ yyrhs[] =
-{
-  ]b4_rhs[
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-static const ]b4_int_type_for([b4_rline])[ yyrline[] =
-{
-  ]b4_rline[
-};
-#endif
-
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
-static const char *const yytname[] =
-{
-  ]b4_tname[
-};
-#endif
-
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const ]b4_int_type_for([b4_r1])[ yyr1[] =
-{
-  ]b4_r1[
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-static const ]b4_int_type_for([b4_r2])[ yyr2[] =
-{
-  ]b4_r2[
-};
-
-/* YYDPREC[RULE-NUM] -- Dynamic precedence of rule #RULE-NUM (0 if none).  */
-static const ]b4_int_type_for([b4_dprec])[ yydprec[] =
-{
-  ]b4_dprec[
-};
-
-/* YYMERGER[RULE-NUM] -- Index of merging function for rule #RULE-NUM.  */
-static const ]b4_int_type_for([b4_merger])[ yymerger[] =
-{
-  ]b4_merger[
-};
-
-/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
-   doesn't specify something else to do.  Zero means the default is an
-   error.  */
-static const ]b4_int_type_for([b4_defact])[ yydefact[] =
-{
-  ]b4_defact[
-};
-
-/* YYPDEFGOTO[NTERM-NUM].  */
-static const ]b4_int_type_for([b4_defgoto])[ yydefgoto[] =
-{
-  ]b4_defgoto[
-};
-
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-   STATE-NUM.  */
-#define YYPACT_NINF ]b4_pact_ninf[
-static const ]b4_int_type_for([b4_pact])[ yypact[] =
-{
-  ]b4_pact[
-};
-
-/* YYPGOTO[NTERM-NUM].  */
-static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] =
-{
-  ]b4_pgoto[
-};
-
-/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
-   positive, shift that token.  If negative, reduce the rule which
-   number is the opposite.  If zero, do what YYDEFACT says.
-   If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF ]b4_table_ninf[
-static const ]b4_int_type_for([b4_table])[ yytable[] =
-{
-  ]b4_table[
-};
-
-/* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of
-   list of conflicting reductions corresponding to action entry for
-   state STATE-NUM in yytable.  0 means no conflicts.  The list in
-   yyconfl is terminated by a rule number of 0.  */
-static const ]b4_int_type_for([b4_conflict_list_heads])[ yyconflp[] =
-{
-  ]b4_conflict_list_heads[
-};
-
-/* YYCONFL[I] -- lists of conflicting rule numbers, each terminated by
-   0, pointed into by YYCONFLP.  */
-]dnl Do not use b4_int_type_for here, since there are places where
-dnl pointers onto yyconfl are taken, which type is "short int *".
-dnl We probably ought to introduce a type for confl.
-[static const short int yyconfl[] =
-{
-  ]b4_conflicting_rules[
-};
-
-static const ]b4_int_type_for([b4_check])[ yycheck[] =
-{
-  ]b4_check[
-};
-
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-   symbol of state STATE-NUM.  */
-static const ]b4_int_type_for([b4_stos])[ yystos[] =
-{
-  ]b4_stos[
-};
-
-
-/* Prevent warning if -Wmissing-prototypes.  */
-]b4_c_ansi_function_decl([yyparse], [int], b4_parse_param)[
-
-/* Error token number */
-#define YYTERROR 1
-
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-   If N is 0, then set CURRENT to the empty location which ends
-   the previous symbol: RHS[0] (always defined).  */
-
-]b4_locations_if([[
-#define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc)
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)				\
-    do									\
-      if (YYID (N))							\
-	{								\
-	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
-	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
-	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
-	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
-	}								\
-      else								\
-	{								\
-	  (Current).first_line   = (Current).last_line   =		\
-	    YYRHSLOC (Rhs, 0).last_line;				\
-	  (Current).first_column = (Current).last_column =		\
-	    YYRHSLOC (Rhs, 0).last_column;				\
-	}								\
-    while (YYID (0))
-
-/* YY_LOCATION_PRINT -- Print the location on the stream.
-   This macro was not mandated originally: define only if we know
-   we won't break user code: when these are the locations we know.  */
-
-# define YY_LOCATION_PRINT(File, Loc)			\
-    fprintf (File, "%d.%d-%d.%d",			\
-	     (Loc).first_line, (Loc).first_column,	\
-	     (Loc).last_line,  (Loc).last_column)
-#endif
-]],[
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N) ((void) 0)
-#endif
-])[
-
-#ifndef YY_LOCATION_PRINT
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-#endif
-
-
-/* YYLEX -- calling `yylex' with the right arguments.  */
-#define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[
-
-]b4_pure_if(
-[
-#undef yynerrs
-#define yynerrs (yystackp->yyerrcnt)
-#undef yychar
-#define yychar (yystackp->yyrawchar)
-#undef yylval
-#define yylval (yystackp->yyval)
-#undef yylloc
-#define yylloc (yystackp->yyloc)
-m4_if(b4_prefix[], [yy], [],
-[#define b4_prefix[]nerrs yynerrs
-#define b4_prefix[]char yychar
-#define b4_prefix[]lval yylval
-#define b4_prefix[]lloc yylloc])],
-[YYSTYPE yylval;
-
-YYLTYPE yylloc;
-
-int yynerrs;
-int yychar;])[
-
-static const int YYEOF = 0;
-static const int YYEMPTY = -2;
-
-typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG;
-
-#define YYCHK(YYE)							     \
-   do { YYRESULTTAG yyflag = YYE; if (yyflag != yyok) return yyflag; }	     \
-   while (YYID (0))
-
-#if YYDEBUG
-
-# ifndef YYFPRINTF
-#  define YYFPRINTF fprintf
-# endif
-
-# define YYDPRINTF(Args)			\
-do {						\
-  if (yydebug)					\
-    YYFPRINTF Args;				\
-} while (YYID (0))
-
-]b4_yy_symbol_print_generate([b4_c_ansi_function_def])[
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			    \
-do {									    \
-  if (yydebug)								    \
-    {									    \
-      YYFPRINTF (stderr, "%s ", Title);					    \
-      yy_symbol_print (stderr, Type,					    \
-		       Value]b4_locations_if([, Location])[]b4_user_args[);  \
-      YYFPRINTF (stderr, "\n");						    \
-    }									    \
-} while (YYID (0))
-
-/* Nonzero means print parse trace.  It is left uninitialized so that
-   multiple parsers can coexist.  */
-int yydebug;
-
-#else /* !YYDEBUG */
-
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-
-#endif /* !YYDEBUG */
-
-/* YYINITDEPTH -- initial size of the parser's stacks.  */
-#ifndef	YYINITDEPTH
-# define YYINITDEPTH ]b4_stack_depth_init[
-#endif
-
-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
-   if the built-in stack extension method is used).
-
-   Do not make this value too large; the results are undefined if
-   SIZE_MAX < YYMAXDEPTH * sizeof (GLRStackItem)
-   evaluated with infinite-precision integer arithmetic.  */
-
-#ifndef YYMAXDEPTH
-# define YYMAXDEPTH ]b4_stack_depth_max[
-#endif
-
-/* Minimum number of free items on the stack allowed after an
-   allocation.  This is to allow allocation and initialization
-   to be completed by functions that call yyexpandGLRStack before the
-   stack is expanded, thus insuring that all necessary pointers get
-   properly redirected to new data.  */
-#define YYHEADROOM 2
-
-#ifndef YYSTACKEXPANDABLE
-# if (! defined __cplusplus \
-      || (]b4_locations_if([[defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
-	  && ]])[defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))
-#  define YYSTACKEXPANDABLE 1
-# else
-#  define YYSTACKEXPANDABLE 0
-# endif
-#endif
-
-#if YYSTACKEXPANDABLE
-# define YY_RESERVE_GLRSTACK(Yystack)			\
-  do {							\
-    if (Yystack->yyspaceLeft < YYHEADROOM)		\
-      yyexpandGLRStack (Yystack);			\
-  } while (YYID (0))
-#else
-# define YY_RESERVE_GLRSTACK(Yystack)			\
-  do {							\
-    if (Yystack->yyspaceLeft < YYHEADROOM)		\
-      yyMemoryExhausted (Yystack);			\
-  } while (YYID (0))
-#endif
-
-
-#if YYERROR_VERBOSE
-
-# ifndef yystpcpy
-#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-#   define yystpcpy stpcpy
-#  else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-   YYDEST.  */
-static char *
-yystpcpy (char *yydest, const char *yysrc)
-{
-  char *yyd = yydest;
-  const char *yys = yysrc;
-
-  while ((*yyd++ = *yys++) != '\0')
-    continue;
-
-  return yyd - 1;
-}
-#  endif
-# endif
-
-# ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
-   quotes and backslashes, so that it's suitable for yyerror.  The
-   heuristic is that double-quoting is unnecessary unless the string
-   contains an apostrophe, a comma, or backslash (other than
-   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
-   null, do not copy; instead, return the length of what the result
-   would have been.  */
-static size_t
-yytnamerr (char *yyres, const char *yystr)
-{
-  if (*yystr == '"')
-    {
-      size_t yyn = 0;
-      char const *yyp = yystr;
-
-      for (;;)
-	switch (*++yyp)
-	  {
-	  case '\'':
-	  case ',':
-	    goto do_not_strip_quotes;
-
-	  case '\\':
-	    if (*++yyp != '\\')
-	      goto do_not_strip_quotes;
-	    /* Fall through.  */
-	  default:
-	    if (yyres)
-	      yyres[yyn] = *yyp;
-	    yyn++;
-	    break;
-
-	  case '"':
-	    if (yyres)
-	      yyres[yyn] = '\0';
-	    return yyn;
-	  }
-    do_not_strip_quotes: ;
-    }
-
-  if (! yyres)
-    return strlen (yystr);
-
-  return yystpcpy (yyres, yystr) - yyres;
-}
-# endif
-
-#endif /* !YYERROR_VERBOSE */
-
-/** State numbers, as in LALR(1) machine */
-typedef int yyStateNum;
-
-/** Rule numbers, as in LALR(1) machine */
-typedef int yyRuleNum;
-
-/** Grammar symbol */
-typedef short int yySymbol;
-
-/** Item references, as in LALR(1) machine */
-typedef short int yyItemNum;
-
-typedef struct yyGLRState yyGLRState;
-typedef struct yyGLRStateSet yyGLRStateSet;
-typedef struct yySemanticOption yySemanticOption;
-typedef union yyGLRStackItem yyGLRStackItem;
-typedef struct yyGLRStack yyGLRStack;
-
-struct yyGLRState {
-  /** Type tag: always true.  */
-  yybool yyisState;
-  /** Type tag for yysemantics.  If true, yysval applies, otherwise
-   *  yyfirstVal applies.  */
-  yybool yyresolved;
-  /** Number of corresponding LALR(1) machine state.  */
-  yyStateNum yylrState;
-  /** Preceding state in this stack */
-  yyGLRState* yypred;
-  /** Source position of the first token produced by my symbol */
-  size_t yyposn;
-  union {
-    /** First in a chain of alternative reductions producing the
-     *  non-terminal corresponding to this state, threaded through
-     *  yynext.  */
-    yySemanticOption* yyfirstVal;
-    /** Semantic value for this state.  */
-    YYSTYPE yysval;
-  } yysemantics;
-  /** Source location for this state.  */
-  YYLTYPE yyloc;
-};
-
-struct yyGLRStateSet {
-  yyGLRState** yystates;
-  /** During nondeterministic operation, yylookaheadNeeds tracks which
-   *  stacks have actually needed the current lookahead.  During deterministic
-   *  operation, yylookaheadNeeds[0] is not maintained since it would merely
-   *  duplicate yychar != YYEMPTY.  */
-  yybool* yylookaheadNeeds;
-  size_t yysize, yycapacity;
-};
-
-struct yySemanticOption {
-  /** Type tag: always false.  */
-  yybool yyisState;
-  /** Rule number for this reduction */
-  yyRuleNum yyrule;
-  /** The last RHS state in the list of states to be reduced.  */
-  yyGLRState* yystate;
-  /** The lookahead for this reduction.  */
-  int yyrawchar;
-  YYSTYPE yyval;
-  YYLTYPE yyloc;
-  /** Next sibling in chain of options.  To facilitate merging,
-   *  options are chained in decreasing order by address.  */
-  yySemanticOption* yynext;
-};
-
-/** Type of the items in the GLR stack.  The yyisState field
- *  indicates which item of the union is valid.  */
-union yyGLRStackItem {
-  yyGLRState yystate;
-  yySemanticOption yyoption;
-};
-
-struct yyGLRStack {
-  int yyerrState;
-]b4_locations_if([[  /* To compute the location of the error token.  */
-  yyGLRStackItem yyerror_range[3];]])[
-]b4_pure_if(
-[
-  int yyerrcnt;
-  int yyrawchar;
-  YYSTYPE yyval;
-  YYLTYPE yyloc;
-])[
-  YYJMP_BUF yyexception_buffer;
-  yyGLRStackItem* yyitems;
-  yyGLRStackItem* yynextFree;
-  size_t yyspaceLeft;
-  yyGLRState* yysplitPoint;
-  yyGLRState* yylastDeleted;
-  yyGLRStateSet yytops;
-};
-
-#if YYSTACKEXPANDABLE
-static void yyexpandGLRStack (yyGLRStack* yystackp);
-#endif
-
-static void yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg)
-  __attribute__ ((__noreturn__));
-static void
-yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg)
-{
-  if (yymsg != NULL)
-    yyerror (]b4_yyerror_args[yymsg);
-  YYLONGJMP (yystackp->yyexception_buffer, 1);
-}
-
-static void yyMemoryExhausted (yyGLRStack* yystackp)
-  __attribute__ ((__noreturn__));
-static void
-yyMemoryExhausted (yyGLRStack* yystackp)
-{
-  YYLONGJMP (yystackp->yyexception_buffer, 2);
-}
-
-#if YYDEBUG || YYERROR_VERBOSE
-/** A printable representation of TOKEN.  */
-static inline const char*
-yytokenName (yySymbol yytoken)
-{
-  if (yytoken == YYEMPTY)
-    return "";
-
-  return yytname[yytoken];
-}
-#endif
-
-/** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting
- *  at YYVSP[YYLOW0].yystate.yypred.  Leaves YYVSP[YYLOW1].yystate.yypred
- *  containing the pointer to the next state in the chain.  */
-static void yyfillin (yyGLRStackItem *, int, int) __attribute__ ((__unused__));
-static void
-yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1)
-{
-  yyGLRState* s;
-  int i;
-  s = yyvsp[yylow0].yystate.yypred;
-  for (i = yylow0-1; i >= yylow1; i -= 1)
-    {
-      YYASSERT (s->yyresolved);
-      yyvsp[i].yystate.yyresolved = yytrue;
-      yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval;
-      yyvsp[i].yystate.yyloc = s->yyloc;
-      s = yyvsp[i].yystate.yypred = s->yypred;
-    }
-}
-
-/* Do nothing if YYNORMAL or if *YYLOW <= YYLOW1.  Otherwise, fill in
- * YYVSP[YYLOW1 .. *YYLOW-1] as in yyfillin and set *YYLOW = YYLOW1.
- * For convenience, always return YYLOW1.  */
-static inline int yyfill (yyGLRStackItem *, int *, int, yybool)
-     __attribute__ ((__unused__));
-static inline int
-yyfill (yyGLRStackItem *yyvsp, int *yylow, int yylow1, yybool yynormal)
-{
-  if (!yynormal && yylow1 < *yylow)
-    {
-      yyfillin (yyvsp, *yylow, yylow1);
-      *yylow = yylow1;
-    }
-  return yylow1;
-}
-
-/** Perform user action for rule number YYN, with RHS length YYRHSLEN,
- *  and top stack item YYVSP.  YYLVALP points to place to put semantic
- *  value ($$), and yylocp points to place for location information
- *  (@@$).  Returns yyok for normal return, yyaccept for YYACCEPT,
- *  yyerr for YYERROR, yyabort for YYABORT.  */
-/*ARGSUSED*/ static YYRESULTTAG
-yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
-	      YYSTYPE* yyvalp,
-	      YYLTYPE* YYOPTIONAL_LOC (yylocp),
-	      yyGLRStack* yystackp
-	      ]b4_user_formals[)
-{
-  yybool yynormal __attribute__ ((__unused__)) =
-    (yystackp->yysplitPoint == NULL);
-  int yylow;
-]b4_parse_param_use[]dnl
-[# undef yyerrok
-# define yyerrok (yystackp->yyerrState = 0)
-# undef YYACCEPT
-# define YYACCEPT return yyaccept
-# undef YYABORT
-# define YYABORT return yyabort
-# undef YYERROR
-# define YYERROR return yyerrok, yyerr
-# undef YYRECOVERING
-# define YYRECOVERING() (yystackp->yyerrState != 0)
-# undef yyclearin
-# define yyclearin (yychar = YYEMPTY)
-# undef YYFILL
-# define YYFILL(N) yyfill (yyvsp, &yylow, N, yynormal)
-# undef YYBACKUP
-# define YYBACKUP(Token, Value)						     \
-  return yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")),     \
-	 yyerrok, yyerr
-
-  yylow = 1;
-  if (yyrhslen == 0)
-    *yyvalp = yyval_default;
-  else
-    *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval;
-  YYLLOC_DEFAULT ((*yylocp), (yyvsp - yyrhslen), yyrhslen);
-]b4_locations_if([[  yystackp->yyerror_range[1].yystate.yyloc = *yylocp;
-]])[
-  switch (yyn)
-    {
-      ]b4_actions
-/* Line __line__ of glr.c.  */
-b4_syncline([@oline@], [@ofile@])[
-      default: break;
-    }
-
-  return yyok;
-# undef yyerrok
-# undef YYABORT
-# undef YYACCEPT
-# undef YYERROR
-# undef YYBACKUP
-# undef yyclearin
-# undef YYRECOVERING
-}
-
-
-/*ARGSUSED*/ static void
-yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1)
-{
-  YYUSE (yy0);
-  YYUSE (yy1);
-
-  switch (yyn)
-    {
-      ]b4_mergers[
-      default: break;
-    }
-}
-
-			      /* Bison grammar-table manipulation.  */
-
-]b4_yydestruct_generate([b4_c_ansi_function_def])[
-
-/** Number of symbols composing the right hand side of rule #RULE.  */
-static inline int
-yyrhsLength (yyRuleNum yyrule)
-{
-  return yyr2[yyrule];
-}
-
-static void
-yydestroyGLRState (char const *yymsg, yyGLRState *yys]b4_user_formals[)
-{
-  if (yys->yyresolved)
-    yydestruct (yymsg, yystos[yys->yylrState],
-		&yys->yysemantics.yysval]b4_locations_if([, &yys->yyloc])[]b4_user_args[);
-  else
-    {
-#if YYDEBUG
-      if (yydebug)
-	{
-	  if (yys->yysemantics.yyfirstVal)
-	    YYFPRINTF (stderr, "%s unresolved ", yymsg);
-	  else
-	    YYFPRINTF (stderr, "%s incomplete ", yymsg);
-	  yy_symbol_print (stderr, yystos[yys->yylrState],
-			   NULL]b4_locations_if([, &yys->yyloc])[]b4_user_args[);
-	  YYFPRINTF (stderr, "\n");
-	}
-#endif
-
-      if (yys->yysemantics.yyfirstVal)
-	{
-	  yySemanticOption *yyoption = yys->yysemantics.yyfirstVal;
-	  yyGLRState *yyrh;
-	  int yyn;
-	  for (yyrh = yyoption->yystate, yyn = yyrhsLength (yyoption->yyrule);
-	       yyn > 0;
-	       yyrh = yyrh->yypred, yyn -= 1)
-	    yydestroyGLRState (yymsg, yyrh]b4_user_args[);
-	}
-    }
-}
-
-/** Left-hand-side symbol for rule #RULE.  */
-static inline yySymbol
-yylhsNonterm (yyRuleNum yyrule)
-{
-  return yyr1[yyrule];
-}
-
-#define yyis_pact_ninf(yystate) \
-  ]m4_if(m4_eval(b4_pact_ninf < b4_pact_min), [1],
-	 [0],
-	 [((yystate) == YYPACT_NINF)])[
-
-/** True iff LR state STATE has only a default reduction (regardless
- *  of token).  */
-static inline yybool
-yyisDefaultedState (yyStateNum yystate)
-{
-  return yyis_pact_ninf (yypact[yystate]);
-}
-
-/** The default reduction for STATE, assuming it has one.  */
-static inline yyRuleNum
-yydefaultAction (yyStateNum yystate)
-{
-  return yydefact[yystate];
-}
-
-#define yyis_table_ninf(yytable_value) \
-  ]m4_if(m4_eval(b4_table_ninf < b4_table_min), [1],
-	 [YYID (0)],
-	 [((yytable_value) == YYTABLE_NINF)])[
-
-/** Set *YYACTION to the action to take in YYSTATE on seeing YYTOKEN.
- *  Result R means
- *    R < 0:  Reduce on rule -R.
- *    R = 0:  Error.
- *    R > 0:  Shift to state R.
- *  Set *CONFLICTS to a pointer into yyconfl to 0-terminated list of
- *  conflicting reductions.
- */
-static inline void
-yygetLRActions (yyStateNum yystate, int yytoken,
-		int* yyaction, const short int** yyconflicts)
-{
-  int yyindex = yypact[yystate] + yytoken;
-  if (yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken)
-    {
-      *yyaction = -yydefact[yystate];
-      *yyconflicts = yyconfl;
-    }
-  else if (! yyis_table_ninf (yytable[yyindex]))
-    {
-      *yyaction = yytable[yyindex];
-      *yyconflicts = yyconfl + yyconflp[yyindex];
-    }
-  else
-    {
-      *yyaction = 0;
-      *yyconflicts = yyconfl + yyconflp[yyindex];
-    }
-}
-
-static inline yyStateNum
-yyLRgotoState (yyStateNum yystate, yySymbol yylhs)
-{
-  int yyr;
-  yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
-  if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate)
-    return yytable[yyr];
-  else
-    return yydefgoto[yylhs - YYNTOKENS];
-}
-
-static inline yybool
-yyisShiftAction (int yyaction)
-{
-  return 0 < yyaction;
-}
-
-static inline yybool
-yyisErrorAction (int yyaction)
-{
-  return yyaction == 0;
-}
-
-				/* GLRStates */
-
-/** Return a fresh GLRStackItem.  Callers should call
- * YY_RESERVE_GLRSTACK afterwards to make sure there is sufficient
- * headroom.  */
-
-static inline yyGLRStackItem*
-yynewGLRStackItem (yyGLRStack* yystackp, yybool yyisState)
-{
-  yyGLRStackItem* yynewItem = yystackp->yynextFree;
-  yystackp->yyspaceLeft -= 1;
-  yystackp->yynextFree += 1;
-  yynewItem->yystate.yyisState = yyisState;
-  return yynewItem;
-}
-
-/** Add a new semantic action that will execute the action for rule
- *  RULENUM on the semantic values in RHS to the list of
- *  alternative actions for STATE.  Assumes that RHS comes from
- *  stack #K of *STACKP. */
-static void
-yyaddDeferredAction (yyGLRStack* yystackp, size_t yyk, yyGLRState* yystate,
-		     yyGLRState* rhs, yyRuleNum yyrule)
-{
-  yySemanticOption* yynewOption =
-    &yynewGLRStackItem (yystackp, yyfalse)->yyoption;
-  yynewOption->yystate = rhs;
-  yynewOption->yyrule = yyrule;
-  if (yystackp->yytops.yylookaheadNeeds[yyk])
-    {
-      yynewOption->yyrawchar = yychar;
-      yynewOption->yyval = yylval;
-      yynewOption->yyloc = yylloc;
-    }
-  else
-    yynewOption->yyrawchar = YYEMPTY;
-  yynewOption->yynext = yystate->yysemantics.yyfirstVal;
-  yystate->yysemantics.yyfirstVal = yynewOption;
-
-  YY_RESERVE_GLRSTACK (yystackp);
-}
-
-				/* GLRStacks */
-
-/** Initialize SET to a singleton set containing an empty stack.  */
-static yybool
-yyinitStateSet (yyGLRStateSet* yyset)
-{
-  yyset->yysize = 1;
-  yyset->yycapacity = 16;
-  yyset->yystates = (yyGLRState**) YYMALLOC (16 * sizeof yyset->yystates[0]);
-  if (! yyset->yystates)
-    return yyfalse;
-  yyset->yystates[0] = NULL;
-  yyset->yylookaheadNeeds =
-    (yybool*) YYMALLOC (16 * sizeof yyset->yylookaheadNeeds[0]);
-  if (! yyset->yylookaheadNeeds)
-    {
-      YYFREE (yyset->yystates);
-      return yyfalse;
-    }
-  return yytrue;
-}
-
-static void yyfreeStateSet (yyGLRStateSet* yyset)
-{
-  YYFREE (yyset->yystates);
-  YYFREE (yyset->yylookaheadNeeds);
-}
-
-/** Initialize STACK to a single empty stack, with total maximum
- *  capacity for all stacks of SIZE.  */
-static yybool
-yyinitGLRStack (yyGLRStack* yystackp, size_t yysize)
-{
-  yystackp->yyerrState = 0;
-  yynerrs = 0;
-  yystackp->yyspaceLeft = yysize;
-  yystackp->yyitems =
-    (yyGLRStackItem*) YYMALLOC (yysize * sizeof yystackp->yynextFree[0]);
-  if (!yystackp->yyitems)
-    return yyfalse;
-  yystackp->yynextFree = yystackp->yyitems;
-  yystackp->yysplitPoint = NULL;
-  yystackp->yylastDeleted = NULL;
-  return yyinitStateSet (&yystackp->yytops);
-}
-
-
-#if YYSTACKEXPANDABLE
-# define YYRELOC(YYFROMITEMS,YYTOITEMS,YYX,YYTYPE) \
-  &((YYTOITEMS) - ((YYFROMITEMS) - (yyGLRStackItem*) (YYX)))->YYTYPE
-
-/** If STACK is expandable, extend it.  WARNING: Pointers into the
-    stack from outside should be considered invalid after this call.
-    We always expand when there are 1 or fewer items left AFTER an
-    allocation, so that we can avoid having external pointers exist
-    across an allocation.  */
-static void
-yyexpandGLRStack (yyGLRStack* yystackp)
-{
-  yyGLRStackItem* yynewItems;
-  yyGLRStackItem* yyp0, *yyp1;
-  size_t yysize, yynewSize;
-  size_t yyn;
-  yysize = yystackp->yynextFree - yystackp->yyitems;
-  if (YYMAXDEPTH - YYHEADROOM < yysize)
-    yyMemoryExhausted (yystackp);
-  yynewSize = 2*yysize;
-  if (YYMAXDEPTH < yynewSize)
-    yynewSize = YYMAXDEPTH;
-  yynewItems = (yyGLRStackItem*) YYMALLOC (yynewSize * sizeof yynewItems[0]);
-  if (! yynewItems)
-    yyMemoryExhausted (yystackp);
-  for (yyp0 = yystackp->yyitems, yyp1 = yynewItems, yyn = yysize;
-       0 < yyn;
-       yyn -= 1, yyp0 += 1, yyp1 += 1)
-    {
-      *yyp1 = *yyp0;
-      if (*(yybool *) yyp0)
-	{
-	  yyGLRState* yys0 = &yyp0->yystate;
-	  yyGLRState* yys1 = &yyp1->yystate;
-	  if (yys0->yypred != NULL)
-	    yys1->yypred =
-	      YYRELOC (yyp0, yyp1, yys0->yypred, yystate);
-	  if (! yys0->yyresolved && yys0->yysemantics.yyfirstVal != NULL)
-	    yys1->yysemantics.yyfirstVal =
-	      YYRELOC(yyp0, yyp1, yys0->yysemantics.yyfirstVal, yyoption);
-	}
-      else
-	{
-	  yySemanticOption* yyv0 = &yyp0->yyoption;
-	  yySemanticOption* yyv1 = &yyp1->yyoption;
-	  if (yyv0->yystate != NULL)
-	    yyv1->yystate = YYRELOC (yyp0, yyp1, yyv0->yystate, yystate);
-	  if (yyv0->yynext != NULL)
-	    yyv1->yynext = YYRELOC (yyp0, yyp1, yyv0->yynext, yyoption);
-	}
-    }
-  if (yystackp->yysplitPoint != NULL)
-    yystackp->yysplitPoint = YYRELOC (yystackp->yyitems, yynewItems,
-				 yystackp->yysplitPoint, yystate);
-
-  for (yyn = 0; yyn < yystackp->yytops.yysize; yyn += 1)
-    if (yystackp->yytops.yystates[yyn] != NULL)
-      yystackp->yytops.yystates[yyn] =
-	YYRELOC (yystackp->yyitems, yynewItems,
-		 yystackp->yytops.yystates[yyn], yystate);
-  YYFREE (yystackp->yyitems);
-  yystackp->yyitems = yynewItems;
-  yystackp->yynextFree = yynewItems + yysize;
-  yystackp->yyspaceLeft = yynewSize - yysize;
-}
-#endif
-
-static void
-yyfreeGLRStack (yyGLRStack* yystackp)
-{
-  YYFREE (yystackp->yyitems);
-  yyfreeStateSet (&yystackp->yytops);
-}
-
-/** Assuming that S is a GLRState somewhere on STACK, update the
- *  splitpoint of STACK, if needed, so that it is at least as deep as
- *  S.  */
-static inline void
-yyupdateSplit (yyGLRStack* yystackp, yyGLRState* yys)
-{
-  if (yystackp->yysplitPoint != NULL && yystackp->yysplitPoint > yys)
-    yystackp->yysplitPoint = yys;
-}
-
-/** Invalidate stack #K in STACK.  */
-static inline void
-yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk)
-{
-  if (yystackp->yytops.yystates[yyk] != NULL)
-    yystackp->yylastDeleted = yystackp->yytops.yystates[yyk];
-  yystackp->yytops.yystates[yyk] = NULL;
-}
-
-/** Undelete the last stack that was marked as deleted.  Can only be
-    done once after a deletion, and only when all other stacks have
-    been deleted.  */
-static void
-yyundeleteLastStack (yyGLRStack* yystackp)
-{
-  if (yystackp->yylastDeleted == NULL || yystackp->yytops.yysize != 0)
-    return;
-  yystackp->yytops.yystates[0] = yystackp->yylastDeleted;
-  yystackp->yytops.yysize = 1;
-  YYDPRINTF ((stderr, "Restoring last deleted stack as stack #0.\n"));
-  yystackp->yylastDeleted = NULL;
-}
-
-static inline void
-yyremoveDeletes (yyGLRStack* yystackp)
-{
-  size_t yyi, yyj;
-  yyi = yyj = 0;
-  while (yyj < yystackp->yytops.yysize)
-    {
-      if (yystackp->yytops.yystates[yyi] == NULL)
-	{
-	  if (yyi == yyj)
-	    {
-	      YYDPRINTF ((stderr, "Removing dead stacks.\n"));
-	    }
-	  yystackp->yytops.yysize -= 1;
-	}
-      else
-	{
-	  yystackp->yytops.yystates[yyj] = yystackp->yytops.yystates[yyi];
-	  /* In the current implementation, it's unnecessary to copy
-	     yystackp->yytops.yylookaheadNeeds[yyi] since, after
-	     yyremoveDeletes returns, the parser immediately either enters
-	     deterministic operation or shifts a token.  However, it doesn't
-	     hurt, and the code might evolve to need it.  */
-	  yystackp->yytops.yylookaheadNeeds[yyj] =
-	    yystackp->yytops.yylookaheadNeeds[yyi];
-	  if (yyj != yyi)
-	    {
-	      YYDPRINTF ((stderr, "Rename stack %lu -> %lu.\n",
-			  (unsigned long int) yyi, (unsigned long int) yyj));
-	    }
-	  yyj += 1;
-	}
-      yyi += 1;
-    }
-}
-
-/** Shift to a new state on stack #K of STACK, corresponding to LR state
- * LRSTATE, at input position POSN, with (resolved) semantic value SVAL.  */
-static inline void
-yyglrShift (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState,
-	    size_t yyposn,
-	    YYSTYPE* yyvalp, YYLTYPE* yylocp)
-{
-  yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate;
-
-  yynewState->yylrState = yylrState;
-  yynewState->yyposn = yyposn;
-  yynewState->yyresolved = yytrue;
-  yynewState->yypred = yystackp->yytops.yystates[yyk];
-  yynewState->yysemantics.yysval = *yyvalp;
-  yynewState->yyloc = *yylocp;
-  yystackp->yytops.yystates[yyk] = yynewState;
-
-  YY_RESERVE_GLRSTACK (yystackp);
-}
-
-/** Shift stack #K of YYSTACK, to a new state corresponding to LR
- *  state YYLRSTATE, at input position YYPOSN, with the (unresolved)
- *  semantic value of YYRHS under the action for YYRULE.  */
-static inline void
-yyglrShiftDefer (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState,
-		 size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule)
-{
-  yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate;
-
-  yynewState->yylrState = yylrState;
-  yynewState->yyposn = yyposn;
-  yynewState->yyresolved = yyfalse;
-  yynewState->yypred = yystackp->yytops.yystates[yyk];
-  yynewState->yysemantics.yyfirstVal = NULL;
-  yystackp->yytops.yystates[yyk] = yynewState;
-
-  /* Invokes YY_RESERVE_GLRSTACK.  */
-  yyaddDeferredAction (yystackp, yyk, yynewState, rhs, yyrule);
-}
-
-/** Pop the symbols consumed by reduction #RULE from the top of stack
- *  #K of STACK, and perform the appropriate semantic action on their
- *  semantic values.  Assumes that all ambiguities in semantic values
- *  have been previously resolved.  Set *VALP to the resulting value,
- *  and *LOCP to the computed location (if any).  Return value is as
- *  for userAction.  */
-static inline YYRESULTTAG
-yydoAction (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
-	    YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[)
-{
-  int yynrhs = yyrhsLength (yyrule);
-
-  if (yystackp->yysplitPoint == NULL)
-    {
-      /* Standard special case: single stack.  */
-      yyGLRStackItem* rhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
-      YYASSERT (yyk == 0);
-      yystackp->yynextFree -= yynrhs;
-      yystackp->yyspaceLeft += yynrhs;
-      yystackp->yytops.yystates[0] = & yystackp->yynextFree[-1].yystate;
-      return yyuserAction (yyrule, yynrhs, rhs,
-			   yyvalp, yylocp, yystackp]b4_user_args[);
-    }
-  else
-    {
-      /* At present, doAction is never called in nondeterministic
-       * mode, so this branch is never taken.  It is here in
-       * anticipation of a future feature that will allow immediate
-       * evaluation of selected actions in nondeterministic mode.  */
-      int yyi;
-      yyGLRState* yys;
-      yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1];
-      yys = yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred
-	= yystackp->yytops.yystates[yyk];]b4_locations_if([[
-      if (yynrhs == 0)
-	/* Set default location.  */
-	yyrhsVals[YYMAXRHS + YYMAXLEFT - 1].yystate.yyloc = yys->yyloc;]])[
-      for (yyi = 0; yyi < yynrhs; yyi += 1)
-	{
-	  yys = yys->yypred;
-	  YYASSERT (yys);
-	}
-      yyupdateSplit (yystackp, yys);
-      yystackp->yytops.yystates[yyk] = yys;
-      return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
-			   yyvalp, yylocp, yystackp]b4_user_args[);
-    }
-}
-
-#if !YYDEBUG
-# define YY_REDUCE_PRINT(Args)
-#else
-# define YY_REDUCE_PRINT(Args)		\
-do {					\
-  if (yydebug)				\
-    yy_reduce_print Args;		\
-} while (YYID (0))
-
-/*----------------------------------------------------------.
-| Report that the RULE is going to be reduced on stack #K.  |
-`----------------------------------------------------------*/
-
-/*ARGSUSED*/ static inline void
-yy_reduce_print (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
-		 YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[)
-{
-  int yynrhs = yyrhsLength (yyrule);
-  yybool yynormal __attribute__ ((__unused__)) =
-    (yystackp->yysplitPoint == NULL);
-  yyGLRStackItem* yyvsp = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
-  int yylow = 1;
-  int yyi;
-  YYUSE (yyvalp);
-  YYUSE (yylocp);
-]b4_parse_param_use[]dnl
-[  YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n",
-	     (unsigned long int) yyk, yyrule - 1,
-	     (unsigned long int) yyrline[yyrule]);
-  /* The symbols being reduced.  */
-  for (yyi = 0; yyi < yynrhs; yyi++)
-    {
-      fprintf (stderr, "   $%d = ", yyi + 1);
-      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
-		       &]b4_rhs_value(yynrhs, yyi + 1)[
-		       ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
-		       b4_user_args[);
-      fprintf (stderr, "\n");
-    }
-}
-#endif
-
-/** Pop items off stack #K of STACK according to grammar rule RULE,
- *  and push back on the resulting nonterminal symbol.  Perform the
- *  semantic action associated with RULE and store its value with the
- *  newly pushed state, if FORCEEVAL or if STACK is currently
- *  unambiguous.  Otherwise, store the deferred semantic action with
- *  the new state.  If the new state would have an identical input
- *  position, LR state, and predecessor to an existing state on the stack,
- *  it is identified with that existing state, eliminating stack #K from
- *  the STACK.  In this case, the (necessarily deferred) semantic value is
- *  added to the options for the existing state's semantic value.
- */
-static inline YYRESULTTAG
-yyglrReduce (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
-	     yybool yyforceEval]b4_user_formals[)
-{
-  size_t yyposn = yystackp->yytops.yystates[yyk]->yyposn;
-
-  if (yyforceEval || yystackp->yysplitPoint == NULL)
-    {
-      YYSTYPE yysval;
-      YYLTYPE yyloc;
-
-      YY_REDUCE_PRINT ((yystackp, yyk, yyrule, &yysval, &yyloc]b4_user_args[));
-      YYCHK (yydoAction (yystackp, yyk, yyrule, &yysval,
-			 &yyloc]b4_user_args[));
-      YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyrule], &yysval, &yyloc);
-      yyglrShift (yystackp, yyk,
-		  yyLRgotoState (yystackp->yytops.yystates[yyk]->yylrState,
-				 yylhsNonterm (yyrule)),
-		  yyposn, &yysval, &yyloc);
-    }
-  else
-    {
-      size_t yyi;
-      int yyn;
-      yyGLRState* yys, *yys0 = yystackp->yytops.yystates[yyk];
-      yyStateNum yynewLRState;
-
-      for (yys = yystackp->yytops.yystates[yyk], yyn = yyrhsLength (yyrule);
-	   0 < yyn; yyn -= 1)
-	{
-	  yys = yys->yypred;
-	  YYASSERT (yys);
-	}
-      yyupdateSplit (yystackp, yys);
-      yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule));
-      YYDPRINTF ((stderr,
-		  "Reduced stack %lu by rule #%d; action deferred.  Now in state %d.\n",
-		  (unsigned long int) yyk, yyrule - 1, yynewLRState));
-      for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1)
-	if (yyi != yyk && yystackp->yytops.yystates[yyi] != NULL)
-	  {
-	    yyGLRState* yyp, *yysplit = yystackp->yysplitPoint;
-	    yyp = yystackp->yytops.yystates[yyi];
-	    while (yyp != yys && yyp != yysplit && yyp->yyposn >= yyposn)
-	      {
-		if (yyp->yylrState == yynewLRState && yyp->yypred == yys)
-		  {
-		    yyaddDeferredAction (yystackp, yyk, yyp, yys0, yyrule);
-		    yymarkStackDeleted (yystackp, yyk);
-		    YYDPRINTF ((stderr, "Merging stack %lu into stack %lu.\n",
-				(unsigned long int) yyk,
-				(unsigned long int) yyi));
-		    return yyok;
-		  }
-		yyp = yyp->yypred;
-	      }
-	  }
-      yystackp->yytops.yystates[yyk] = yys;
-      yyglrShiftDefer (yystackp, yyk, yynewLRState, yyposn, yys0, yyrule);
-    }
-  return yyok;
-}
-
-static size_t
-yysplitStack (yyGLRStack* yystackp, size_t yyk)
-{
-  if (yystackp->yysplitPoint == NULL)
-    {
-      YYASSERT (yyk == 0);
-      yystackp->yysplitPoint = yystackp->yytops.yystates[yyk];
-    }
-  if (yystackp->yytops.yysize >= yystackp->yytops.yycapacity)
-    {
-      yyGLRState** yynewStates;
-      yybool* yynewLookaheadNeeds;
-
-      yynewStates = NULL;
-
-      if (yystackp->yytops.yycapacity
-	  > (YYSIZEMAX / (2 * sizeof yynewStates[0])))
-	yyMemoryExhausted (yystackp);
-      yystackp->yytops.yycapacity *= 2;
-
-      yynewStates =
-	(yyGLRState**) YYREALLOC (yystackp->yytops.yystates,
-				  (yystackp->yytops.yycapacity
-				   * sizeof yynewStates[0]));
-      if (yynewStates == NULL)
-	yyMemoryExhausted (yystackp);
-      yystackp->yytops.yystates = yynewStates;
-
-      yynewLookaheadNeeds =
-	(yybool*) YYREALLOC (yystackp->yytops.yylookaheadNeeds,
-			     (yystackp->yytops.yycapacity
-			      * sizeof yynewLookaheadNeeds[0]));
-      if (yynewLookaheadNeeds == NULL)
-	yyMemoryExhausted (yystackp);
-      yystackp->yytops.yylookaheadNeeds = yynewLookaheadNeeds;
-    }
-  yystackp->yytops.yystates[yystackp->yytops.yysize]
-    = yystackp->yytops.yystates[yyk];
-  yystackp->yytops.yylookaheadNeeds[yystackp->yytops.yysize]
-    = yystackp->yytops.yylookaheadNeeds[yyk];
-  yystackp->yytops.yysize += 1;
-  return yystackp->yytops.yysize-1;
-}
-
-/** True iff Y0 and Y1 represent identical options at the top level.
- *  That is, they represent the same rule applied to RHS symbols
- *  that produce the same terminal symbols.  */
-static yybool
-yyidenticalOptions (yySemanticOption* yyy0, yySemanticOption* yyy1)
-{
-  if (yyy0->yyrule == yyy1->yyrule)
-    {
-      yyGLRState *yys0, *yys1;
-      int yyn;
-      for (yys0 = yyy0->yystate, yys1 = yyy1->yystate,
-	   yyn = yyrhsLength (yyy0->yyrule);
-	   yyn > 0;
-	   yys0 = yys0->yypred, yys1 = yys1->yypred, yyn -= 1)
-	if (yys0->yyposn != yys1->yyposn)
-	  return yyfalse;
-      return yytrue;
-    }
-  else
-    return yyfalse;
-}
-
-/** Assuming identicalOptions (Y0,Y1), destructively merge the
- *  alternative semantic values for the RHS-symbols of Y1 and Y0.  */
-static void
-yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1)
-{
-  yyGLRState *yys0, *yys1;
-  int yyn;
-  for (yys0 = yyy0->yystate, yys1 = yyy1->yystate,
-       yyn = yyrhsLength (yyy0->yyrule);
-       yyn > 0;
-       yys0 = yys0->yypred, yys1 = yys1->yypred, yyn -= 1)
-    {
-      if (yys0 == yys1)
-	break;
-      else if (yys0->yyresolved)
-	{
-	  yys1->yyresolved = yytrue;
-	  yys1->yysemantics.yysval = yys0->yysemantics.yysval;
-	}
-      else if (yys1->yyresolved)
-	{
-	  yys0->yyresolved = yytrue;
-	  yys0->yysemantics.yysval = yys1->yysemantics.yysval;
-	}
-      else
-	{
-	  yySemanticOption** yyz0p;
-	  yySemanticOption* yyz1;
-	  yyz0p = &yys0->yysemantics.yyfirstVal;
-	  yyz1 = yys1->yysemantics.yyfirstVal;
-	  while (YYID (yytrue))
-	    {
-	      if (yyz1 == *yyz0p || yyz1 == NULL)
-		break;
-	      else if (*yyz0p == NULL)
-		{
-		  *yyz0p = yyz1;
-		  break;
-		}
-	      else if (*yyz0p < yyz1)
-		{
-		  yySemanticOption* yyz = *yyz0p;
-		  *yyz0p = yyz1;
-		  yyz1 = yyz1->yynext;
-		  (*yyz0p)->yynext = yyz;
-		}
-	      yyz0p = &(*yyz0p)->yynext;
-	    }
-	  yys1->yysemantics.yyfirstVal = yys0->yysemantics.yyfirstVal;
-	}
-    }
-}
-
-/** Y0 and Y1 represent two possible actions to take in a given
- *  parsing state; return 0 if no combination is possible,
- *  1 if user-mergeable, 2 if Y0 is preferred, 3 if Y1 is preferred.  */
-static int
-yypreference (yySemanticOption* y0, yySemanticOption* y1)
-{
-  yyRuleNum r0 = y0->yyrule, r1 = y1->yyrule;
-  int p0 = yydprec[r0], p1 = yydprec[r1];
-
-  if (p0 == p1)
-    {
-      if (yymerger[r0] == 0 || yymerger[r0] != yymerger[r1])
-	return 0;
-      else
-	return 1;
-    }
-  if (p0 == 0 || p1 == 0)
-    return 0;
-  if (p0 < p1)
-    return 3;
-  if (p1 < p0)
-    return 2;
-  return 0;
-}
-
-static YYRESULTTAG yyresolveValue (yyGLRState* yys,
-				   yyGLRStack* yystackp]b4_user_formals[);
-
-
-/** Resolve the previous N states starting at and including state S.  If result
- *  != yyok, some states may have been left unresolved possibly with empty
- *  semantic option chains.  Regardless of whether result = yyok, each state
- *  has been left with consistent data so that yydestroyGLRState can be invoked
- *  if necessary.  */
-static YYRESULTTAG
-yyresolveStates (yyGLRState* yys, int yyn,
-		 yyGLRStack* yystackp]b4_user_formals[)
-{
-  if (0 < yyn)
-    {
-      YYASSERT (yys->yypred);
-      YYCHK (yyresolveStates (yys->yypred, yyn-1, yystackp]b4_user_args[));
-      if (! yys->yyresolved)
-	YYCHK (yyresolveValue (yys, yystackp]b4_user_args[));
-    }
-  return yyok;
-}
-
-/** Resolve the states for the RHS of OPT, perform its user action, and return
- *  the semantic value and location.  Regardless of whether result = yyok, all
- *  RHS states have been destroyed (assuming the user action destroys all RHS
- *  semantic values if invoked).  */
-static YYRESULTTAG
-yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystackp,
-		 YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[)
-{
-  yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1];
-  int yynrhs;
-  int yychar_current;
-  YYSTYPE yylval_current;
-  YYLTYPE yylloc_current;
-  YYRESULTTAG yyflag;
-
-  yynrhs = yyrhsLength (yyopt->yyrule);
-  yyflag = yyresolveStates (yyopt->yystate, yynrhs, yystackp]b4_user_args[);
-  if (yyflag != yyok)
-    {
-      yyGLRState *yys;
-      for (yys = yyopt->yystate; yynrhs > 0; yys = yys->yypred, yynrhs -= 1)
-	yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[);
-      return yyflag;
-    }
-
-  yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred = yyopt->yystate;]b4_locations_if([[
-  if (yynrhs == 0)
-    /* Set default location.  */
-    yyrhsVals[YYMAXRHS + YYMAXLEFT - 1].yystate.yyloc = yyopt->yystate->yyloc;]])[
-  yychar_current = yychar;
-  yylval_current = yylval;
-  yylloc_current = yylloc;
-  yychar = yyopt->yyrawchar;
-  yylval = yyopt->yyval;
-  yylloc = yyopt->yyloc;
-  yyflag = yyuserAction (yyopt->yyrule, yynrhs,
-			   yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
-			   yyvalp, yylocp, yystackp]b4_user_args[);
-  yychar = yychar_current;
-  yylval = yylval_current;
-  yylloc = yylloc_current;
-  return yyflag;
-}
-
-#if YYDEBUG
-static void
-yyreportTree (yySemanticOption* yyx, int yyindent)
-{
-  int yynrhs = yyrhsLength (yyx->yyrule);
-  int yyi;
-  yyGLRState* yys;
-  yyGLRState* yystates[1 + YYMAXRHS];
-  yyGLRState yyleftmost_state;
-
-  for (yyi = yynrhs, yys = yyx->yystate; 0 < yyi; yyi -= 1, yys = yys->yypred)
-    yystates[yyi] = yys;
-  if (yys == NULL)
-    {
-      yyleftmost_state.yyposn = 0;
-      yystates[0] = &yyleftmost_state;
-    }
-  else
-    yystates[0] = yys;
-
-  if (yyx->yystate->yyposn < yys->yyposn + 1)
-    YYFPRINTF (stderr, "%*s%s -> <Rule %d, empty>\n",
-	       yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)),
-	       yyx->yyrule - 1);
-  else
-    YYFPRINTF (stderr, "%*s%s -> <Rule %d, tokens %lu .. %lu>\n",
-	       yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)),
-	       yyx->yyrule - 1, (unsigned long int) (yys->yyposn + 1),
-	       (unsigned long int) yyx->yystate->yyposn);
-  for (yyi = 1; yyi <= yynrhs; yyi += 1)
-    {
-      if (yystates[yyi]->yyresolved)
-	{
-	  if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn)
-	    YYFPRINTF (stderr, "%*s%s <empty>\n", yyindent+2, "",
-		       yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]));
-	  else
-	    YYFPRINTF (stderr, "%*s%s <tokens %lu .. %lu>\n", yyindent+2, "",
-		       yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]),
-		       (unsigned long int) (yystates[yyi - 1]->yyposn + 1),
-		       (unsigned long int) yystates[yyi]->yyposn);
-	}
-      else
-	yyreportTree (yystates[yyi]->yysemantics.yyfirstVal, yyindent+2);
-    }
-}
-#endif
-
-/*ARGSUSED*/ static YYRESULTTAG
-yyreportAmbiguity (yySemanticOption* yyx0,
-		   yySemanticOption* yyx1]b4_pure_formals[)
-{
-  YYUSE (yyx0);
-  YYUSE (yyx1);
-
-#if YYDEBUG
-  YYFPRINTF (stderr, "Ambiguity detected.\n");
-  YYFPRINTF (stderr, "Option 1,\n");
-  yyreportTree (yyx0, 2);
-  YYFPRINTF (stderr, "\nOption 2,\n");
-  yyreportTree (yyx1, 2);
-  YYFPRINTF (stderr, "\n");
-#endif
-
-  yyerror (]b4_yyerror_args[YY_("syntax is ambiguous"));
-  return yyabort;
-}
-
-/** Starting at and including state S1, resolve the location for each of the
- *  previous N1 states that is unresolved.  The first semantic option of a state
- *  is always chosen.  */
-static void
-yyresolveLocations (yyGLRState* yys1, int yyn1,
-		    yyGLRStack *yystackp]b4_user_formals[)
-{
-  if (0 < yyn1)
-    {
-      yyresolveLocations (yys1->yypred, yyn1 - 1, yystackp]b4_user_args[);
-      if (!yys1->yyresolved)
-	{
-	  yySemanticOption *yyoption;
-	  yyGLRStackItem yyrhsloc[1 + YYMAXRHS];
-	  int yynrhs;
-	  int yychar_current;
-	  YYSTYPE yylval_current;
-	  YYLTYPE yylloc_current;
-	  yyoption = yys1->yysemantics.yyfirstVal;
-	  YYASSERT (yyoption != NULL);
-	  yynrhs = yyrhsLength (yyoption->yyrule);
-	  if (yynrhs > 0)
-	    {
-	      yyGLRState *yys;
-	      int yyn;
-	      yyresolveLocations (yyoption->yystate, yynrhs,
-				  yystackp]b4_user_args[);
-	      for (yys = yyoption->yystate, yyn = yynrhs;
-		   yyn > 0;
-		   yys = yys->yypred, yyn -= 1)
-		yyrhsloc[yyn].yystate.yyloc = yys->yyloc;
-	    }
-	  else
-	    {
-	      /* Both yyresolveAction and yyresolveLocations traverse the GSS
-		 in reverse rightmost order.  It is only necessary to invoke
-		 yyresolveLocations on a subforest for which yyresolveAction
-		 would have been invoked next had an ambiguity not been
-		 detected.  Thus the location of the previous state (but not
-		 necessarily the previous state itself) is guaranteed to be
-		 resolved already.  */
-	      yyGLRState *yyprevious = yyoption->yystate;
-	      yyrhsloc[0].yystate.yyloc = yyprevious->yyloc;
-	    }
-	  yychar_current = yychar;
-	  yylval_current = yylval;
-	  yylloc_current = yylloc;
-	  yychar = yyoption->yyrawchar;
-	  yylval = yyoption->yyval;
-	  yylloc = yyoption->yyloc;
-	  YYLLOC_DEFAULT ((yys1->yyloc), yyrhsloc, yynrhs);
-	  yychar = yychar_current;
-	  yylval = yylval_current;
-	  yylloc = yylloc_current;
-	}
-    }
-}
-
-/** Resolve the ambiguity represented in state S, perform the indicated
- *  actions, and set the semantic value of S.  If result != yyok, the chain of
- *  semantic options in S has been cleared instead or it has been left
- *  unmodified except that redundant options may have been removed.  Regardless
- *  of whether result = yyok, S has been left with consistent data so that
- *  yydestroyGLRState can be invoked if necessary.  */
-static YYRESULTTAG
-yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[)
-{
-  yySemanticOption* yyoptionList = yys->yysemantics.yyfirstVal;
-  yySemanticOption* yybest;
-  yySemanticOption** yypp;
-  yybool yymerge;
-  YYSTYPE yysval;
-  YYRESULTTAG yyflag;
-  YYLTYPE *yylocp = &yys->yyloc;
-
-  yybest = yyoptionList;
-  yymerge = yyfalse;
-  for (yypp = &yyoptionList->yynext; *yypp != NULL; )
-    {
-      yySemanticOption* yyp = *yypp;
-
-      if (yyidenticalOptions (yybest, yyp))
-	{
-	  yymergeOptionSets (yybest, yyp);
-	  *yypp = yyp->yynext;
-	}
-      else
-	{
-	  switch (yypreference (yybest, yyp))
-	    {
-	    case 0:
-	      yyresolveLocations (yys, 1, yystackp]b4_user_args[);
-	      return yyreportAmbiguity (yybest, yyp]b4_pure_args[);
-	      break;
-	    case 1:
-	      yymerge = yytrue;
-	      break;
-	    case 2:
-	      break;
-	    case 3:
-	      yybest = yyp;
-	      yymerge = yyfalse;
-	      break;
-	    default:
-	      /* This cannot happen so it is not worth a YYASSERT (yyfalse),
-		 but some compilers complain if the default case is
-		 omitted.  */
-	      break;
-	    }
-	  yypp = &yyp->yynext;
-	}
-    }
-
-  if (yymerge)
-    {
-      yySemanticOption* yyp;
-      int yyprec = yydprec[yybest->yyrule];
-      yyflag = yyresolveAction (yybest, yystackp, &yysval,
-				yylocp]b4_user_args[);
-      if (yyflag == yyok)
-	for (yyp = yybest->yynext; yyp != NULL; yyp = yyp->yynext)
-	  {
-	    if (yyprec == yydprec[yyp->yyrule])
-	      {
-		YYSTYPE yysval_other;
-		YYLTYPE yydummy;
-		yyflag = yyresolveAction (yyp, yystackp, &yysval_other,
-					  &yydummy]b4_user_args[);
-		if (yyflag != yyok)
-		  {
-		    yydestruct ("Cleanup: discarding incompletely merged value for",
-				yystos[yys->yylrState],
-				&yysval]b4_locations_if([, yylocp])[]b4_user_args[);
-		    break;
-		  }
-		yyuserMerge (yymerger[yyp->yyrule], &yysval, &yysval_other);
-	      }
-	  }
-    }
-  else
-    yyflag = yyresolveAction (yybest, yystackp, &yysval, yylocp]b4_user_args[);
-
-  if (yyflag == yyok)
-    {
-      yys->yyresolved = yytrue;
-      yys->yysemantics.yysval = yysval;
-    }
-  else
-    yys->yysemantics.yyfirstVal = NULL;
-  return yyflag;
-}
-
-static YYRESULTTAG
-yyresolveStack (yyGLRStack* yystackp]b4_user_formals[)
-{
-  if (yystackp->yysplitPoint != NULL)
-    {
-      yyGLRState* yys;
-      int yyn;
-
-      for (yyn = 0, yys = yystackp->yytops.yystates[0];
-	   yys != yystackp->yysplitPoint;
-	   yys = yys->yypred, yyn += 1)
-	continue;
-      YYCHK (yyresolveStates (yystackp->yytops.yystates[0], yyn, yystackp
-			     ]b4_user_args[));
-    }
-  return yyok;
-}
-
-static void
-yycompressStack (yyGLRStack* yystackp)
-{
-  yyGLRState* yyp, *yyq, *yyr;
-
-  if (yystackp->yytops.yysize != 1 || yystackp->yysplitPoint == NULL)
-    return;
-
-  for (yyp = yystackp->yytops.yystates[0], yyq = yyp->yypred, yyr = NULL;
-       yyp != yystackp->yysplitPoint;
-       yyr = yyp, yyp = yyq, yyq = yyp->yypred)
-    yyp->yypred = yyr;
-
-  yystackp->yyspaceLeft += yystackp->yynextFree - yystackp->yyitems;
-  yystackp->yynextFree = ((yyGLRStackItem*) yystackp->yysplitPoint) + 1;
-  yystackp->yyspaceLeft -= yystackp->yynextFree - yystackp->yyitems;
-  yystackp->yysplitPoint = NULL;
-  yystackp->yylastDeleted = NULL;
-
-  while (yyr != NULL)
-    {
-      yystackp->yynextFree->yystate = *yyr;
-      yyr = yyr->yypred;
-      yystackp->yynextFree->yystate.yypred = &yystackp->yynextFree[-1].yystate;
-      yystackp->yytops.yystates[0] = &yystackp->yynextFree->yystate;
-      yystackp->yynextFree += 1;
-      yystackp->yyspaceLeft -= 1;
-    }
-}
-
-static YYRESULTTAG
-yyprocessOneStack (yyGLRStack* yystackp, size_t yyk,
-		   size_t yyposn]b4_pure_formals[)
-{
-  int yyaction;
-  const short int* yyconflicts;
-  yyRuleNum yyrule;
-
-  while (yystackp->yytops.yystates[yyk] != NULL)
-    {
-      yyStateNum yystate = yystackp->yytops.yystates[yyk]->yylrState;
-      YYDPRINTF ((stderr, "Stack %lu Entering state %d\n",
-		  (unsigned long int) yyk, yystate));
-
-      YYASSERT (yystate != YYFINAL);
-
-      if (yyisDefaultedState (yystate))
-	{
-	  yyrule = yydefaultAction (yystate);
-	  if (yyrule == 0)
-	    {
-	      YYDPRINTF ((stderr, "Stack %lu dies.\n",
-			  (unsigned long int) yyk));
-	      yymarkStackDeleted (yystackp, yyk);
-	      return yyok;
-	    }
-	  YYCHK (yyglrReduce (yystackp, yyk, yyrule, yyfalse]b4_user_args[));
-	}
-      else
-	{
-	  yySymbol yytoken;
-	  yystackp->yytops.yylookaheadNeeds[yyk] = yytrue;
-	  if (yychar == YYEMPTY)
-	    {
-	      YYDPRINTF ((stderr, "Reading a token: "));
-	      yychar = YYLEX;
-	      yytoken = YYTRANSLATE (yychar);
-	      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
-	    }
-	  else
-	    yytoken = YYTRANSLATE (yychar);
-	  yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts);
-
-	  while (*yyconflicts != 0)
-	    {
-	      size_t yynewStack = yysplitStack (yystackp, yyk);
-	      YYDPRINTF ((stderr, "Splitting off stack %lu from %lu.\n",
-			  (unsigned long int) yynewStack,
-			  (unsigned long int) yyk));
-	      YYCHK (yyglrReduce (yystackp, yynewStack,
-				  *yyconflicts, yyfalse]b4_user_args[));
-	      YYCHK (yyprocessOneStack (yystackp, yynewStack,
-					yyposn]b4_pure_args[));
-	      yyconflicts += 1;
-	    }
-
-	  if (yyisShiftAction (yyaction))
-	    break;
-	  else if (yyisErrorAction (yyaction))
-	    {
-	      YYDPRINTF ((stderr, "Stack %lu dies.\n",
-			  (unsigned long int) yyk));
-	      yymarkStackDeleted (yystackp, yyk);
-	      break;
-	    }
-	  else
-	    YYCHK (yyglrReduce (yystackp, yyk, -yyaction,
-				yyfalse]b4_user_args[));
-	}
-    }
-  return yyok;
-}
-
-/*ARGSUSED*/ static void
-yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
-{
-  if (yystackp->yyerrState == 0)
-    {
-#if YYERROR_VERBOSE
-      int yyn;
-      yyn = yypact[yystackp->yytops.yystates[0]->yylrState];
-      if (YYPACT_NINF < yyn && yyn <= YYLAST)
-	{
-	  yySymbol yytoken = YYTRANSLATE (yychar);
-	  size_t yysize0 = yytnamerr (NULL, yytokenName (yytoken));
-	  size_t yysize = yysize0;
-	  size_t yysize1;
-	  yybool yysize_overflow = yyfalse;
-	  char* yymsg = NULL;
-	  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-	  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-	  int yyx;
-	  char *yyfmt;
-	  char const *yyf;
-	  static char const yyunexpected[] = "syntax error, unexpected %s";
-	  static char const yyexpecting[] = ", expecting %s";
-	  static char const yyor[] = " or %s";
-	  char yyformat[sizeof yyunexpected
-			+ sizeof yyexpecting - 1
-			+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-			   * (sizeof yyor - 1))];
-	  char const *yyprefix = yyexpecting;
-
-	  /* Start YYX at -YYN if negative to avoid negative indexes in
-	     YYCHECK.  */
-	  int yyxbegin = yyn < 0 ? -yyn : 0;
-
-	  /* Stay within bounds of both yycheck and yytname.  */
-	  int yychecklim = YYLAST - yyn + 1;
-	  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-	  int yycount = 1;
-
-	  yyarg[0] = yytokenName (yytoken);
-	  yyfmt = yystpcpy (yyformat, yyunexpected);
-
-	  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-	      {
-		if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-		  {
-		    yycount = 1;
-		    yysize = yysize0;
-		    yyformat[sizeof yyunexpected - 1] = '\0';
-		    break;
-		  }
-		yyarg[yycount++] = yytokenName (yyx);
-		yysize1 = yysize + yytnamerr (NULL, yytokenName (yyx));
-		yysize_overflow |= yysize1 < yysize;
-		yysize = yysize1;
-		yyfmt = yystpcpy (yyfmt, yyprefix);
-		yyprefix = yyor;
-	      }
-
-	  yyf = YY_(yyformat);
-	  yysize1 = yysize + strlen (yyf);
-	  yysize_overflow |= yysize1 < yysize;
-	  yysize = yysize1;
-
-	  if (!yysize_overflow)
-	    yymsg = (char *) YYMALLOC (yysize);
-
-	  if (yymsg)
-	    {
-	      char *yyp = yymsg;
-	      int yyi = 0;
-	      while ((*yyp = *yyf))
-		{
-		  if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-		    {
-		      yyp += yytnamerr (yyp, yyarg[yyi++]);
-		      yyf += 2;
-		    }
-		  else
-		    {
-		      yyp++;
-		      yyf++;
-		    }
-		}
-	      yyerror (]b4_lyyerror_args[yymsg);
-	      YYFREE (yymsg);
-	    }
-	  else
-	    {
-	      yyerror (]b4_lyyerror_args[YY_("syntax error"));
-	      yyMemoryExhausted (yystackp);
-	    }
-	}
-      else
-#endif /* YYERROR_VERBOSE */
-	yyerror (]b4_lyyerror_args[YY_("syntax error"));
-      yynerrs += 1;
-    }
-}
-
-/* Recover from a syntax error on *YYSTACKP, assuming that *YYSTACKP->YYTOKENP,
-   yylval, and yylloc are the syntactic category, semantic value, and location
-   of the look-ahead.  */
-/*ARGSUSED*/ static void
-yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
-{
-  size_t yyk;
-  int yyj;
-
-  if (yystackp->yyerrState == 3)
-    /* We just shifted the error token and (perhaps) took some
-       reductions.  Skip tokens until we can proceed.  */
-    while (YYID (yytrue))
-      {
-	yySymbol yytoken;
-	if (yychar == YYEOF)
-	  yyFail (yystackp][]b4_lpure_args[, NULL);
-	if (yychar != YYEMPTY)
-	  {]b4_locations_if([[
-	    /* We throw away the lookahead, but the error range
-	       of the shifted error token must take it into account.  */
-	    yyGLRState *yys = yystackp->yytops.yystates[0];
-	    yyGLRStackItem yyerror_range[3];
-	    yyerror_range[1].yystate.yyloc = yys->yyloc;
-	    yyerror_range[2].yystate.yyloc = yylloc;
-	    YYLLOC_DEFAULT ((yys->yyloc), yyerror_range, 2);]])[
-	    yytoken = YYTRANSLATE (yychar);
-	    yydestruct ("Error: discarding",
-			yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
-	  }
-	YYDPRINTF ((stderr, "Reading a token: "));
-	yychar = YYLEX;
-	yytoken = YYTRANSLATE (yychar);
-	YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
-	yyj = yypact[yystackp->yytops.yystates[0]->yylrState];
-	if (yyis_pact_ninf (yyj))
-	  return;
-	yyj += yytoken;
-	if (yyj < 0 || YYLAST < yyj || yycheck[yyj] != yytoken)
-	  {
-	    if (yydefact[yystackp->yytops.yystates[0]->yylrState] != 0)
-	      return;
-	  }
-	else if (yytable[yyj] != 0 && ! yyis_table_ninf (yytable[yyj]))
-	  return;
-      }
-
-  /* Reduce to one stack.  */
-  for (yyk = 0; yyk < yystackp->yytops.yysize; yyk += 1)
-    if (yystackp->yytops.yystates[yyk] != NULL)
-      break;
-  if (yyk >= yystackp->yytops.yysize)
-    yyFail (yystackp][]b4_lpure_args[, NULL);
-  for (yyk += 1; yyk < yystackp->yytops.yysize; yyk += 1)
-    yymarkStackDeleted (yystackp, yyk);
-  yyremoveDeletes (yystackp);
-  yycompressStack (yystackp);
-
-  /* Now pop stack until we find a state that shifts the error token.  */
-  yystackp->yyerrState = 3;
-  while (yystackp->yytops.yystates[0] != NULL)
-    {
-      yyGLRState *yys = yystackp->yytops.yystates[0];
-      yyj = yypact[yys->yylrState];
-      if (! yyis_pact_ninf (yyj))
-	{
-	  yyj += YYTERROR;
-	  if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR
-	      && yyisShiftAction (yytable[yyj]))
-	    {
-	      /* Shift the error token having adjusted its location.  */
-	      YYLTYPE yyerrloc;]b4_locations_if([[
-	      yystackp->yyerror_range[2].yystate.yyloc = yylloc;
-	      YYLLOC_DEFAULT (yyerrloc, (yystackp->yyerror_range), 2);]])[
-	      YY_SYMBOL_PRINT ("Shifting", yystos[yytable[yyj]],
-			       &yylval, &yyerrloc);
-	      yyglrShift (yystackp, 0, yytable[yyj],
-			  yys->yyposn, &yylval, &yyerrloc);
-	      yys = yystackp->yytops.yystates[0];
-	      break;
-	    }
-	}
-]b4_locations_if([[      yystackp->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[
-      yydestroyGLRState ("Error: popping", yys]b4_user_args[);
-      yystackp->yytops.yystates[0] = yys->yypred;
-      yystackp->yynextFree -= 1;
-      yystackp->yyspaceLeft += 1;
-    }
-  if (yystackp->yytops.yystates[0] == NULL)
-    yyFail (yystackp][]b4_lpure_args[, NULL);
-}
-
-#define YYCHK1(YYE)							     \
-  do {									     \
-    switch (YYE) {							     \
-    case yyok:								     \
-      break;								     \
-    case yyabort:							     \
-      goto yyabortlab;							     \
-    case yyaccept:							     \
-      goto yyacceptlab;							     \
-    case yyerr:								     \
-      goto yyuser_error;						     \
-    default:								     \
-      goto yybuglab;							     \
-    }									     \
-  } while (YYID (0))
-
-
-/*----------.
-| yyparse.  |
-`----------*/
-
-]b4_c_ansi_function_def([yyparse], [int], b4_parse_param)[
-{
-  int yyresult;
-  yyGLRStack yystack;
-  yyGLRStack* const yystackp = &yystack;
-  size_t yyposn;
-
-  YYDPRINTF ((stderr, "Starting parse\n"));
-
-  yychar = YYEMPTY;
-  yylval = yyval_default;
-]b4_locations_if([
-#if YYLTYPE_IS_TRIVIAL
-  yylloc.first_line   = yylloc.last_line   = 1;
-  yylloc.first_column = yylloc.last_column = 0;
-#endif
-])
-m4_ifdef([b4_initial_action], [
-m4_pushdef([b4_at_dollar],     [yylloc])dnl
-m4_pushdef([b4_dollar_dollar], [yylval])dnl
-  /* User initialization code.  */
-  b4_initial_action
-m4_popdef([b4_dollar_dollar])dnl
-m4_popdef([b4_at_dollar])dnl
-/* Line __line__ of glr.c.  */
-b4_syncline([@oline@], [@ofile@])])dnl
-[
-  if (! yyinitGLRStack (yystackp, YYINITDEPTH))
-    goto yyexhaustedlab;
-  switch (YYSETJMP (yystack.yyexception_buffer))
-    {
-    case 0: break;
-    case 1: goto yyabortlab;
-    case 2: goto yyexhaustedlab;
-    default: goto yybuglab;
-    }
-  yyglrShift (&yystack, 0, 0, 0, &yylval, &yylloc);
-  yyposn = 0;
-
-  while (YYID (yytrue))
-    {
-      /* For efficiency, we have two loops, the first of which is
-	 specialized to deterministic operation (single stack, no
-	 potential ambiguity).  */
-      /* Standard mode */
-      while (YYID (yytrue))
-	{
-	  yyRuleNum yyrule;
-	  int yyaction;
-	  const short int* yyconflicts;
-
-	  yyStateNum yystate = yystack.yytops.yystates[0]->yylrState;
-	  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-	  if (yystate == YYFINAL)
-	    goto yyacceptlab;
-	  if (yyisDefaultedState (yystate))
-	    {
-	      yyrule = yydefaultAction (yystate);
-	      if (yyrule == 0)
-		{
-]b4_locations_if([[		  yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[
-		  yyreportSyntaxError (&yystack]b4_user_args[);
-		  goto yyuser_error;
-		}
-	      YYCHK1 (yyglrReduce (&yystack, 0, yyrule, yytrue]b4_user_args[));
-	    }
-	  else
-	    {
-	      yySymbol yytoken;
-	      if (yychar == YYEMPTY)
-		{
-		  YYDPRINTF ((stderr, "Reading a token: "));
-		  yychar = YYLEX;
-		  yytoken = YYTRANSLATE (yychar);
-		  YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
-		}
-	      else
-		yytoken = YYTRANSLATE (yychar);
-	      yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts);
-	      if (*yyconflicts != 0)
-		break;
-	      if (yyisShiftAction (yyaction))
-		{
-		  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-		  if (yychar != YYEOF)
-		    yychar = YYEMPTY;
-		  yyposn += 1;
-		  yyglrShift (&yystack, 0, yyaction, yyposn, &yylval, &yylloc);
-		  if (0 < yystack.yyerrState)
-		    yystack.yyerrState -= 1;
-		}
-	      else if (yyisErrorAction (yyaction))
-		{
-]b4_locations_if([[		  yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[
-		  yyreportSyntaxError (&yystack]b4_user_args[);
-		  goto yyuser_error;
-		}
-	      else
-		YYCHK1 (yyglrReduce (&yystack, 0, -yyaction, yytrue]b4_user_args[));
-	    }
-	}
-
-      while (YYID (yytrue))
-	{
-	  yySymbol yytoken_to_shift;
-	  size_t yys;
-
-	  for (yys = 0; yys < yystack.yytops.yysize; yys += 1)
-	    yystackp->yytops.yylookaheadNeeds[yys] = yychar != YYEMPTY;
-
-	  /* yyprocessOneStack returns one of three things:
-
-	      - An error flag.  If the caller is yyprocessOneStack, it
-		immediately returns as well.  When the caller is finally
-		yyparse, it jumps to an error label via YYCHK1.
-
-	      - yyok, but yyprocessOneStack has invoked yymarkStackDeleted
-		(&yystack, yys), which sets the top state of yys to NULL.  Thus,
-		yyparse's following invocation of yyremoveDeletes will remove
-		the stack.
-
-	      - yyok, when ready to shift a token.
-
-	     Except in the first case, yyparse will invoke yyremoveDeletes and
-	     then shift the next token onto all remaining stacks.  This
-	     synchronization of the shift (that is, after all preceding
-	     reductions on all stacks) helps prevent double destructor calls
-	     on yylval in the event of memory exhaustion.  */
-
-	  for (yys = 0; yys < yystack.yytops.yysize; yys += 1)
-	    YYCHK1 (yyprocessOneStack (&yystack, yys, yyposn]b4_lpure_args[));
-	  yyremoveDeletes (&yystack);
-	  if (yystack.yytops.yysize == 0)
-	    {
-	      yyundeleteLastStack (&yystack);
-	      if (yystack.yytops.yysize == 0)
-		yyFail (&yystack][]b4_lpure_args[, YY_("syntax error"));
-	      YYCHK1 (yyresolveStack (&yystack]b4_user_args[));
-	      YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
-]b4_locations_if([[	      yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[
-	      yyreportSyntaxError (&yystack]b4_user_args[);
-	      goto yyuser_error;
-	    }
-
-	  /* If any yyglrShift call fails, it will fail after shifting.  Thus,
-	     a copy of yylval will already be on stack 0 in the event of a
-	     failure in the following loop.  Thus, yychar is set to YYEMPTY
-	     before the loop to make sure the user destructor for yylval isn't
-	     called twice.  */
-	  yytoken_to_shift = YYTRANSLATE (yychar);
-	  yychar = YYEMPTY;
-	  yyposn += 1;
-	  for (yys = 0; yys < yystack.yytops.yysize; yys += 1)
-	    {
-	      int yyaction;
-	      const short int* yyconflicts;
-	      yyStateNum yystate = yystack.yytops.yystates[yys]->yylrState;
-	      yygetLRActions (yystate, yytoken_to_shift, &yyaction,
-			      &yyconflicts);
-	      /* Note that yyconflicts were handled by yyprocessOneStack.  */
-	      YYDPRINTF ((stderr, "On stack %lu, ", (unsigned long int) yys));
-	      YY_SYMBOL_PRINT ("shifting", yytoken_to_shift, &yylval, &yylloc);
-	      yyglrShift (&yystack, yys, yyaction, yyposn,
-			  &yylval, &yylloc);
-	      YYDPRINTF ((stderr, "Stack %lu now in state #%d\n",
-			  (unsigned long int) yys,
-			  yystack.yytops.yystates[yys]->yylrState));
-	    }
-
-	  if (yystack.yytops.yysize == 1)
-	    {
-	      YYCHK1 (yyresolveStack (&yystack]b4_user_args[));
-	      YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
-	      yycompressStack (&yystack);
-	      break;
-	    }
-	}
-      continue;
-    yyuser_error:
-      yyrecoverSyntaxError (&yystack]b4_user_args[);
-      yyposn = yystack.yytops.yystates[0]->yyposn;
-    }
-
- yyacceptlab:
-  yyresult = 0;
-  goto yyreturn;
-
- yybuglab:
-  YYASSERT (yyfalse);
-  goto yyabortlab;
-
- yyabortlab:
-  yyresult = 1;
-  goto yyreturn;
-
- yyexhaustedlab:
-  yyerror (]b4_lyyerror_args[YY_("memory exhausted"));
-  yyresult = 2;
-  goto yyreturn;
-
- yyreturn:
-  if (yychar != YYEOF && yychar != YYEMPTY)
-    yydestruct ("Cleanup: discarding lookahead",
-		YYTRANSLATE (yychar),
-		&yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
-
-  /* If the stack is well-formed, pop the stack until it is empty,
-     destroying its entries as we go.  But free the stack regardless
-     of whether it is well-formed.  */
-  if (yystack.yyitems)
-    {
-      yyGLRState** yystates = yystack.yytops.yystates;
-      if (yystates)
-	{
-	  size_t yysize = yystack.yytops.yysize;
-	  size_t yyk;
-	  for (yyk = 0; yyk < yysize; yyk += 1)
-	    if (yystates[yyk])
-	      {
-		while (yystates[yyk])
-		  {
-		    yyGLRState *yys = yystates[yyk];
-]b4_locations_if([[		    yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]]
-)[		    yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[);
-		    yystates[yyk] = yys->yypred;
-		    yystack.yynextFree -= 1;
-		    yystack.yyspaceLeft += 1;
-		  }
-		break;
-	      }
-	}
-      yyfreeGLRStack (&yystack);
-    }
-
-  /* Make sure YYID is used.  */
-  return YYID (yyresult);
-}
-
-/* DEBUGGING ONLY */
-#ifdef YYDEBUG
-static void yypstack (yyGLRStack* yystackp, size_t yyk)
-  __attribute__ ((__unused__));
-static void yypdumpstack (yyGLRStack* yystackp) __attribute__ ((__unused__));
-
-static void
-yy_yypstack (yyGLRState* yys)
-{
-  if (yys->yypred)
-    {
-      yy_yypstack (yys->yypred);
-      fprintf (stderr, " -> ");
-    }
-  fprintf (stderr, "%d@@%lu", yys->yylrState, (unsigned long int) yys->yyposn);
-}
-
-static void
-yypstates (yyGLRState* yyst)
-{
-  if (yyst == NULL)
-    fprintf (stderr, "<null>");
-  else
-    yy_yypstack (yyst);
-  fprintf (stderr, "\n");
-}
-
-static void
-yypstack (yyGLRStack* yystackp, size_t yyk)
-{
-  yypstates (yystackp->yytops.yystates[yyk]);
-}
-
-#define YYINDEX(YYX)							     \
-    ((YYX) == NULL ? -1 : (yyGLRStackItem*) (YYX) - yystackp->yyitems)
-
-
-static void
-yypdumpstack (yyGLRStack* yystackp)
-{
-  yyGLRStackItem* yyp;
-  size_t yyi;
-  for (yyp = yystackp->yyitems; yyp < yystackp->yynextFree; yyp += 1)
-    {
-      fprintf (stderr, "%3lu. ", (unsigned long int) (yyp - yystackp->yyitems));
-      if (*(yybool *) yyp)
-	{
-	  fprintf (stderr, "Res: %d, LR State: %d, posn: %lu, pred: %ld",
-		   yyp->yystate.yyresolved, yyp->yystate.yylrState,
-		   (unsigned long int) yyp->yystate.yyposn,
-		   (long int) YYINDEX (yyp->yystate.yypred));
-	  if (! yyp->yystate.yyresolved)
-	    fprintf (stderr, ", firstVal: %ld",
-		     (long int) YYINDEX (yyp->yystate.yysemantics.yyfirstVal));
-	}
-      else
-	{
-	  fprintf (stderr, "Option. rule: %d, state: %ld, next: %ld",
-		   yyp->yyoption.yyrule - 1,
-		   (long int) YYINDEX (yyp->yyoption.yystate),
-		   (long int) YYINDEX (yyp->yyoption.yynext));
-	}
-      fprintf (stderr, "\n");
-    }
-  fprintf (stderr, "Tops:");
-  for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1)
-    fprintf (stderr, "%lu: %ld; ", (unsigned long int) yyi,
-	     (long int) YYINDEX (yystackp->yytops.yystates[yyi]));
-  fprintf (stderr, "\n");
-}
-#endif
-]
-
-b4_epilogue
-b4_defines_if(
-[@output @output_header_name@
-b4_copyright([Skeleton interface for Bison GLR parsers in C],
-  [2002, 2003, 2004, 2005, 2006])
-
-b4_shared_declarations
-
-extern YYSTYPE b4_prefix[]lval;
-
-b4_locations_if([b4_pure_if([],
-[extern YYLTYPE b4_prefix[]lloc;])
-])
-])
diff --git a/data/glr.cc b/data/glr.cc
deleted file mode 100644
index d07b5a4..0000000
--- a/data/glr.cc
+++ /dev/null
@@ -1,389 +0,0 @@
-m4_divert(-1)                                                       -*- C -*-
-
-# C++ GLR skeleton for Bison
-# Copyright (C) 2002, 2003, 2004, 2005, 2006 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 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
-
-
-# This skeleton produces a C++ class that encapsulates a C glr parser.
-# This is in order to reduce the maintenance burden.  The glr.c
-# skeleton is clean and pure enough so that there are no real
-# problems.  The C++ interface is the same as that of lalr1.cc.  In
-# fact, glr.c can replace yacc.c without the user noticing any
-# difference, and similarly for glr.cc replacing lalr1.cc.
-#
-# The passing of parse-params
-#
-#   The additional arguments are stored as members of the parser
-#   object, yyparser.  The C routines need to carry yyparser
-#   throughout the C parser; that easy: just let yyparser become an
-#   additional parse-param.  But because the C++ skeleton needs to
-#   know the "real" original parse-param, we save them
-#   (b4_parse_param_orig).  Note that b4_parse_param is overquoted
-#   (and c.m4 strips one level of quotes).  This is a PITA, and
-#   explains why there are so many levels of quotes.
-#
-# The locations
-#
-#   We use location.cc just like lalr1.cc, but because glr.c stores
-#   the locations in a (C++) union, the position and location classes
-#   must not have a constructor.  Therefore, contrary to lalr1.cc, we
-#   must not define "b4_location_constructors".  As a consequence the
-#   user must initialize the first positions (in particular the
-#   filename member).
-
-# We require a pure interface using locations.
-m4_define([b4_locations_flag], [1])
-m4_define([b4_pure_flag],      [1])
-
-# The header is mandatory.
-b4_defines_if([],
-              [m4_fatal(b4_skeleton[: using %defines is mandatory])])
-
-m4_include(b4_pkgdatadir/[c++.m4])
-m4_include(b4_pkgdatadir/[location.cc])
-
-
-# Save the parse parameters.
-m4_define([b4_parse_param_orig], m4_defn([b4_parse_param]))
-
-
-# b4_yy_symbol_print_generate
-# ---------------------------
-# Bypass the default implementation to generate the "yy_symbol_print"
-# and "yy_symbol_value_print" functions.
-m4_define([b4_yy_symbol_print_generate],
-[[
-/*--------------------.
-| Print this symbol.  |
-`--------------------*/
-
-]b4_c_ansi_function_def([yy_symbol_print],
-    [static void],
-    [[FILE *],               []],
-    [[int yytype],           [yytype]],
-    [[const b4_namespace::b4_parser_class_name::semantic_type *yyvaluep],
-			     [yyvaluep]],
-    [[const b4_namespace::b4_parser_class_name::location_type *yylocationp],
-			     [yylocationp]],
-    b4_parse_param)[
-{
-]b4_parse_param_use[]dnl
-[  yyparser.yy_symbol_print_ (yytype, yyvaluep]b4_locations_if([, yylocationp])[);
-}
-]])
-
-
-# Declare yyerror.
-m4_append([b4_post_prologue],
-[/* Line __line__ of glr.cc.  */
-b4_syncline([@oline@], [@ofile@])
-
-b4_c_ansi_function_decl([yyerror],
-    [static void],
-    [[b4_namespace::b4_parser_class_name::location_type *yylocationp], [yylocationp]],
-    b4_parse_param,
-    [[const char* msg], [msg]])])
-
-
-# Define yyerror.
-m4_append([b4_epilogue],
-[/* Line __line__ of glr.cc.  */
-b4_syncline([@oline@], [@ofile@])[
-/*------------------.
-| Report an error.  |
-`------------------*/
-
-]b4_c_ansi_function_def([yyerror],
-    [static void],
-    [[b4_namespace::b4_parser_class_name::location_type *yylocationp], [yylocationp]],
-    b4_parse_param,
-    [[const char* msg], [msg]])[
-{
-]b4_parse_param_use[]dnl
-[  yyparser.error (*yylocationp, msg);
-}
-
-
-namespace ]b4_namespace[
-{
-]dnl In this section, the parse param are the original parse_params.
-m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
-[  /// Build a parser object.
-  ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)
-    : yycdebug_ (&std::cerr)]b4_parse_param_cons[
-  {
-  }
-
-  ]b4_parser_class_name::~b4_parser_class_name[ ()
-  {
-  }
-
-  int
-  ]b4_parser_class_name[::parse ()
-  {
-    return ::yyparse (*this]b4_user_args[);
-  }
-
-#if YYDEBUG
-  /*--------------------.
-  | Print this symbol.  |
-  `--------------------*/
-
-  inline void
-  ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype,
-			   const semantic_type* yyvaluep, const location_type* yylocationp)
-  {
-    /* Pacify ``unused variable'' warnings.  */
-    YYUSE (yyvaluep);
-    YYUSE (yylocationp);
-    switch (yytype)
-      {
-  ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
-[        default:
-	  break;
-      }
-  }
-
-
-  void
-  ]b4_parser_class_name[::yy_symbol_print_ (int yytype,
-			   const semantic_type* yyvaluep, const location_type* yylocationp)
-  {
-    *yycdebug_ << (yytype < YYNTOKENS ? "token" : "nterm")
-	       << ' ' << yytname[yytype] << " ("
-	       << *yylocationp << ": ";
-    yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
-    *yycdebug_ << ')';
-  }
-
-  std::ostream&
-  ]b4_parser_class_name[::debug_stream () const
-  {
-    return *yycdebug_;
-  }
-
-  void
-  ]b4_parser_class_name[::set_debug_stream (std::ostream& o)
-  {
-    yycdebug_ = &o;
-  }
-
-
-  ]b4_parser_class_name[::debug_level_type
-  ]b4_parser_class_name[::debug_level () const
-  {
-    return ::yydebug;
-  }
-
-  void
-  ]b4_parser_class_name[::set_debug_level (debug_level_type l)
-  {
-    ::yydebug = l;
-  }
-
-#endif /* ! YYDEBUG */
-]m4_popdef([b4_parse_param])dnl
-[} // namespace ]b4_namespace[
-
-]])
-
-
-# Let glr.c believe that the user arguments include the parser itself.
-m4_ifset([b4_parse_param],
-[m4_pushdef([b4_parse_param],
-	    m4_dquote([[[b4_namespace::b4_parser_class_name& yyparser], [[yyparser]]],]
-m4_defn([b4_parse_param])))],
-[m4_pushdef([b4_parse_param],
-	    [[[[b4_namespace::b4_parser_class_name& yyparser], [[yyparser]]]]])
-])
-m4_include(b4_pkgdatadir/[glr.c])
-m4_popdef([b4_parse_param])
-
-
-@output @output_header_name@
-b4_copyright([Skeleton interface for Bison GLR parsers in C++],
-  [2002, 2003, 2004, 2005, 2006])[
-
-/* C++ GLR parser skeleton written by Akim Demaille.  */
-
-#ifndef PARSER_HEADER_H
-# define PARSER_HEADER_H
-
-#include <string>
-#include <iostream>
-
-/* Using locations.  */
-#define YYLSP_NEEDED ]b4_locations_flag[
-
-namespace ]b4_namespace[
-{
-  class position;
-  class location;
-}
-
-/* Copy the first part of user declarations.  */
-]b4_pre_prologue[
-
-]/* Line __line__ of glr.cc.  */
-b4_syncline([@oline@], [@ofile@])[
-
-#include "location.hh"
-
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG ]b4_debug_flag[
-#endif
-
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE ]b4_error_verbose_flag[
-#endif
-
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE ]b4_token_table[
-#endif
-
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-   If N is 0, then set CURRENT to the empty location which ends
-   the previous symbol: RHS[0] (always defined).  */
-
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)				\
-    do									\
-      if (N)								\
-	{								\
-	  (Current).begin  = YYRHSLOC (Rhs, 1).begin;			\
-	  (Current).end    = YYRHSLOC (Rhs, N).end;			\
-	}								\
-      else								\
-	{								\
-	  (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end;	\
-	}								\
-    while (/*CONSTCOND*/ 0)
-#endif
-
-namespace ]b4_namespace[
-{
-  /// A Bison parser.
-  class ]b4_parser_class_name[
-  {
-  public:
-    /// Symbol semantic values.
-#ifndef YYSTYPE
-]m4_ifdef([b4_stype],
-[    union semantic_type
-b4_stype
-/* Line __line__ of lalr1.cc.  */
-b4_syncline([@oline@], [@ofile@])
-	;],
-[    typedef int semantic_type;])[
-#else
-    typedef YYSTYPE semantic_type;
-#endif
-    /// Symbol locations.
-    typedef ]b4_location_type[ location_type;
-    /// Tokens.
-    struct token
-    {
-      ]b4_token_enums(b4_tokens)[
-    };
-    /// Token type.
-    typedef token::yytokentype token_type;
-
-    /// Build a parser object.
-    ]b4_parser_class_name[ (]b4_parse_param_decl[);
-    virtual ~]b4_parser_class_name[ ();
-
-    /// Parse.
-    /// \returns  0 iff parsing succeeded.
-    virtual int parse ();
-
-    /// The current debugging stream.
-    std::ostream& debug_stream () const;
-    /// Set the current debugging stream.
-    void set_debug_stream (std::ostream &);
-
-    /// Type for debugging levels.
-    typedef int debug_level_type;
-    /// The current debugging level.
-    debug_level_type debug_level () const;
-    /// Set the current debugging level.
-    void set_debug_level (debug_level_type l);
-
-  private:
-
-  public:
-    /// Report a syntax error.
-    /// \param loc    where the syntax error is found.
-    /// \param msg    a description of the syntax error.
-    virtual void error (const location_type& loc, const std::string& msg);
-  private:
-
-#if YYDEBUG
-  public:
-    /// \brief Report a symbol value on the debug stream.
-    /// \param yytype       The token type.
-    /// \param yyvaluep     Its semantic value.
-    /// \param yylocationp  Its location.
-    virtual void yy_symbol_value_print_ (int yytype,
-					 const semantic_type* yyvaluep,
-					 const location_type* yylocationp);
-    /// \brief Report a symbol on the debug stream.
-    /// \param yytype       The token type.
-    /// \param yyvaluep     Its semantic value.
-    /// \param yylocationp  Its location.
-    virtual void yy_symbol_print_ (int yytype,
-				   const semantic_type* yyvaluep,
-				   const location_type* yylocationp);
-  private:
-#endif /* ! YYDEBUG */
-
-
-    /// \brief Reclaim the memory associated to a symbol.
-    /// \param yymsg        Why this token is reclaimed.
-    /// \param yytype       The symbol type.
-    /// \param yyvaluep     Its semantic value.
-    /// \param yylocationp  Its location.
-    inline void yydestruct_ (const char* yymsg,
-			     int yytype,
-			     semantic_type* yyvaluep,
-			     location_type* yylocationp);
-
-    /* Debugging.  */
-    std::ostream* yycdebug_;
-]b4_parse_param_vars[
-  };
-
-]dnl Redirections for glr.c.
-m4_ifset([b4_global_tokens_and_yystype],
-[b4_token_defines(b4_tokens)])
-[
-#ifndef YYSTYPE
-# define YYSTYPE ]b4_namespace[::]b4_parser_class_name[::semantic_type
-#endif
-#ifndef YYLTYPE
-# define YYLTYPE ]b4_namespace[::]b4_parser_class_name[::location_type
-#endif
-
-}
-
-#endif /* ! defined PARSER_HEADER_H */]
diff --git a/data/lalr1.cc b/data/lalr1.cc
deleted file mode 100644
index abcdcd5..0000000
--- a/data/lalr1.cc
+++ /dev/null
@@ -1,1157 +0,0 @@
-m4_divert(-1)
-
-# C++ skeleton for Bison
-
-# Copyright (C) 2002, 2003, 2004, 2005, 2006 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 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
-
-m4_include(b4_pkgdatadir/[c++.m4])
-
-# The header is mandatory.
-b4_defines_if([],
-              [m4_fatal(b4_skeleton[: using %defines is mandatory])])
-
-# Backward compatibility.
-m4_define([b4_location_constructors])
-m4_include(b4_pkgdatadir/[location.cc])
-
-# We do want M4 expansion after # for CPP macros.
-m4_changecom()
-m4_divert(0)dnl
-b4_defines_if(
-[@output @output_header_name@
-b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++],
-  [2002, 2003, 2004, 2005, 2006])
-dnl FIXME: This is wrong, we want computed header guards.
-[
-/* C++ LALR(1) parser skeleton written by Akim Demaille.  */
-
-#ifndef PARSER_HEADER_H
-# define PARSER_HEADER_H
-
-#include <string>
-#include <iostream>
-#include "stack.hh"
-
-namespace ]b4_namespace[
-{
-  class position;
-  class location;
-}
-
-/* First part of user declarations.  */
-]b4_pre_prologue[
-
-]/* Line __line__ of lalr1.cc.  */
-b4_syncline([@oline@], [@ofile@])[
-
-]dnl Include location.hh here: it might depend on headers included above.
-[#include "location.hh"
-
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG ]b4_debug_flag[
-#endif
-
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE ]b4_error_verbose_flag[
-#endif
-
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE ]b4_token_table[
-#endif
-
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-   If N is 0, then set CURRENT to the empty location which ends
-   the previous symbol: RHS[0] (always defined).  */
-
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)		\
-do {							\
-  if (N)						\
-    {							\
-      (Current).begin = (Rhs)[1].begin;			\
-      (Current).end   = (Rhs)[N].end;			\
-    }							\
-  else							\
-    {							\
-      (Current).begin = (Current).end = (Rhs)[0].end;	\
-    }							\
-} while (false)
-#endif
-
-namespace ]b4_namespace[
-{
-
-  /// A Bison parser.
-  class ]b4_parser_class_name[
-  {
-  public:
-    /// Symbol semantic values.
-#ifndef YYSTYPE
-]m4_ifdef([b4_stype],
-[    union semantic_type
-b4_stype
-/* Line __line__ of lalr1.cc.  */
-b4_syncline([@oline@], [@ofile@])
-	;],
-[    typedef int semantic_type;])[
-#else
-    typedef YYSTYPE semantic_type;
-#endif
-    /// Symbol locations.
-    typedef ]b4_location_type[ location_type;
-    /// Tokens.
-    struct token
-    {
-      ]b4_token_enums(b4_tokens)[
-    };
-    /// Token type.
-    typedef token::yytokentype token_type;
-
-    /// Build a parser object.
-    ]b4_parser_class_name[ (]b4_parse_param_decl[);
-    virtual ~]b4_parser_class_name[ ();
-
-    /// Parse.
-    /// \returns  0 iff parsing succeeded.
-    virtual int parse ();
-
-    /// The current debugging stream.
-    std::ostream& debug_stream () const;
-    /// Set the current debugging stream.
-    void set_debug_stream (std::ostream &);
-
-    /// Type for debugging levels.
-    typedef int debug_level_type;
-    /// The current debugging level.
-    debug_level_type debug_level () const;
-    /// Set the current debugging level.
-    void set_debug_level (debug_level_type l);
-
-  private:
-    /// Report a syntax error.
-    /// \param loc    where the syntax error is found.
-    /// \param msg    a description of the syntax error.
-    virtual void error (const location_type& loc, const std::string& msg);
-
-    /// Generate an error message.
-    /// \param state   the state where the error occurred.
-    /// \param tok     the look-ahead token.
-    virtual std::string yysyntax_error_ (int yystate]dnl
-b4_error_verbose_if([, int tok])[);
-
-#if YYDEBUG
-    /// \brief Report a symbol value on the debug stream.
-    /// \param yytype       The token type.
-    /// \param yyvaluep     Its semantic value.
-    /// \param yylocationp  Its location.
-    virtual void yy_symbol_value_print_ (int yytype,
-					 const semantic_type* yyvaluep,
-					 const location_type* yylocationp);
-    /// \brief Report a symbol on the debug stream.
-    /// \param yytype       The token type.
-    /// \param yyvaluep     Its semantic value.
-    /// \param yylocationp  Its location.
-    virtual void yy_symbol_print_ (int yytype,
-				   const semantic_type* yyvaluep,
-				   const location_type* yylocationp);
-#endif /* ! YYDEBUG */
-
-
-    /// State numbers.
-    typedef int state_type;
-    /// State stack type.
-    typedef stack<state_type>    state_stack_type;
-    /// Semantic value stack type.
-    typedef stack<semantic_type> semantic_stack_type;
-    /// location stack type.
-    typedef stack<location_type> location_stack_type;
-
-    /// The state stack.
-    state_stack_type yystate_stack_;
-    /// The semantic value stack.
-    semantic_stack_type yysemantic_stack_;
-    /// The location stack.
-    location_stack_type yylocation_stack_;
-
-    /// Internal symbol numbers.
-    typedef ]b4_int_type_for([b4_translate])[ token_number_type;
-    /* Tables.  */
-    /// For a state, the index in \a yytable_ of its portion.
-    static const ]b4_int_type_for([b4_pact])[ yypact_[];
-    static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
-
-    /// For a state, default rule to reduce.
-    /// Unless\a  yytable_ specifies something else to do.
-    /// Zero means the default is an error.
-    static const ]b4_int_type_for([b4_defact])[ yydefact_[];
-
-    static const ]b4_int_type_for([b4_pgoto])[ yypgoto_[];
-    static const ]b4_int_type_for([b4_defgoto])[ yydefgoto_[];
-
-    /// What to do in a state.
-    /// \a yytable_[yypact_[s]]: what to do in state \a s.
-    /// - if positive, shift that token.
-    /// - if negative, reduce the rule which number is the opposite.
-    /// - if zero, do what YYDEFACT says.
-    static const ]b4_int_type_for([b4_table])[ yytable_[];
-    static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
-
-    static const ]b4_int_type_for([b4_check])[ yycheck_[];
-
-    /// For a state, its accessing symbol.
-    static const ]b4_int_type_for([b4_stos])[ yystos_[];
-
-    /// For a rule, its LHS.
-    static const ]b4_int_type_for([b4_r1])[ yyr1_[];
-    /// For a rule, its RHS length.
-    static const ]b4_int_type_for([b4_r2])[ yyr2_[];
-
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-    /// For a symbol, its name in clear.
-    static const char* const yytname_[];
-#endif
-
-#if YYERROR_VERBOSE
-    /// Convert the symbol name \a n to a form suitable for a diagnostic.
-    virtual std::string yytnamerr_ (const char *n);
-#endif
-
-#if YYDEBUG
-    /// A type to store symbol numbers and -1.
-    typedef ]b4_int_type_for([b4_rhs])[ rhs_number_type;
-    /// A `-1'-separated list of the rules' RHS.
-    static const rhs_number_type yyrhs_[];
-    /// For each rule, the index of the first RHS symbol in \a yyrhs_.
-    static const ]b4_int_type_for([b4_prhs])[ yyprhs_[];
-    /// For each rule, its source line number.
-    static const ]b4_int_type_for([b4_rline])[ yyrline_[];
-    /// For each scanner token number, its symbol number.
-    static const ]b4_int_type_for([b4_toknum])[ yytoken_number_[];
-    /// Report on the debug stream that the rule \a r is going to be reduced.
-    virtual void yy_reduce_print_ (int r);
-    /// Print the state stack on the debug stream.
-    virtual void yystack_print_ ();
-#endif
-
-    /// Convert a scanner token number \a t to a symbol number.
-    token_number_type yytranslate_ (int t);
-
-    /// \brief Reclaim the memory associated to a symbol.
-    /// \param yymsg        Why this token is reclaimed.
-    /// \param yytype       The symbol type.
-    /// \param yyvaluep     Its semantic value.
-    /// \param yylocationp  Its location.
-    inline void yydestruct_ (const char* yymsg,
-			     int yytype,
-			     semantic_type* yyvaluep,
-			     location_type* yylocationp);
-
-    /// Pop \a n symbols the three stacks.
-    inline void yypop_ (unsigned int n = 1);
-
-    /* Constants.  */
-    static const int yyeof_;
-    /* LAST_ -- Last index in TABLE_.  */
-    static const int yylast_;
-    static const int yynnts_;
-    static const int yyempty_;
-    static const int yyfinal_;
-    static const int yyterror_;
-    static const int yyerrcode_;
-    static const int yyntokens_;
-    static const unsigned int yyuser_token_number_max_;
-    static const token_number_type yyundef_token_;
-
-    /* Debugging.  */
-    int yydebug_;
-    std::ostream* yycdebug_;
-
-]b4_parse_param_vars[
-  };
-}
-
-]m4_ifset([b4_global_tokens_and_yystype],
-[b4_token_defines(b4_tokens)
-
-#ifndef YYSTYPE
- /* Redirection for backward compatibility.  */
-# define YYSTYPE b4_namespace::b4_parser_class_name::semantic_type
-#endif
-])[
-#endif /* ! defined PARSER_HEADER_H */]
-])dnl
-@output @output_parser_name@
-b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++],
-  [2002, 2003, 2004, 2005, 2006])
-m4_if(b4_prefix, [yy], [],
-[
-// Take the name prefix into account.
-#define yylex   b4_prefix[]lex])
-b4_defines_if([
-#include @output_header_name@])[
-
-/* User implementation prologue.  */
-]b4_post_prologue[
-
-]/* Line __line__ of lalr1.cc.  */
-b4_syncline([@oline@], [@ofile@])[
-
-#ifndef YY_
-# if YYENABLE_NLS
-#  if ENABLE_NLS
-#   include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
-#   define YY_(msgid) dgettext ("bison-runtime", msgid)
-#  endif
-# endif
-# ifndef YY_
-#  define YY_(msgid) msgid
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E.  */
-#define YYUSE(e) ((void) (e))
-
-/* A pseudo ostream that takes yydebug_ into account.  */
-# define YYCDEBUG							\
-  for (bool yydebugcond_ = yydebug_; yydebugcond_; yydebugcond_ = false)	\
-    (*yycdebug_)
-
-/* Enable debugging if requested.  */
-#if YYDEBUG
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)	\
-do {							\
-  if (yydebug_)						\
-    {							\
-      *yycdebug_ << Title << ' ';			\
-      yy_symbol_print_ ((Type), (Value), (Location));	\
-      *yycdebug_ << std::endl;				\
-    }							\
-} while (false)
-
-# define YY_REDUCE_PRINT(Rule)		\
-do {					\
-  if (yydebug_)				\
-    yy_reduce_print_ (Rule);		\
-} while (false)
-
-# define YY_STACK_PRINT()		\
-do {					\
-  if (yydebug_)				\
-    yystack_print_ ();			\
-} while (false)
-
-#else /* !YYDEBUG */
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-# define YY_REDUCE_PRINT(Rule)
-# define YY_STACK_PRINT()
-
-#endif /* !YYDEBUG */
-
-#define YYACCEPT	goto yyacceptlab
-#define YYABORT		goto yyabortlab
-#define YYERROR		goto yyerrorlab
-
-namespace ]b4_namespace[
-{
-#if YYERROR_VERBOSE
-
-  /* Return YYSTR after stripping away unnecessary quotes and
-     backslashes, so that it's suitable for yyerror.  The heuristic is
-     that double-quoting is unnecessary unless the string contains an
-     apostrophe, a comma, or backslash (other than backslash-backslash).
-     YYSTR is taken from yytname.  */
-  std::string
-  ]b4_parser_class_name[::yytnamerr_ (const char *yystr)
-  {
-    if (*yystr == '"')
-      {
-        std::string yyr = "";
-        char const *yyp = yystr;
-
-        for (;;)
-          switch (*++yyp)
-            {
-            case '\'':
-            case ',':
-              goto do_not_strip_quotes;
-
-            case '\\':
-              if (*++yyp != '\\')
-                goto do_not_strip_quotes;
-              /* Fall through.  */
-            default:
-              yyr += *yyp;
-              break;
-
-            case '"':
-              return yyr;
-            }
-      do_not_strip_quotes: ;
-      }
-
-    return yystr;
-  }
-
-#endif
-
-  /// Build a parser object.
-  ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)
-    : yydebug_ (false),
-      yycdebug_ (&std::cerr)]b4_parse_param_cons[
-  {
-  }
-
-  ]b4_parser_class_name::~b4_parser_class_name[ ()
-  {
-  }
-
-#if YYDEBUG
-  /*--------------------------------.
-  | Print this symbol on YYOUTPUT.  |
-  `--------------------------------*/
-
-  inline void
-  ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype,
-			   const semantic_type* yyvaluep, const location_type* yylocationp)
-  {
-    YYUSE (yylocationp);
-    YYUSE (yyvaluep);
-    switch (yytype)
-      {
-  ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
-[       default:
-	  break;
-      }
-  }
-
-
-  void
-  ]b4_parser_class_name[::yy_symbol_print_ (int yytype,
-			   const semantic_type* yyvaluep, const location_type* yylocationp)
-  {
-    *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm")
-	       << ' ' << yytname_[yytype] << " ("
-	       << *yylocationp << ": ";
-    yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
-    *yycdebug_ << ')';
-  }
-#endif /* ! YYDEBUG */
-
-  void
-  ]b4_parser_class_name[::yydestruct_ (const char* yymsg,
-			   int yytype, semantic_type* yyvaluep, location_type* yylocationp)
-  {
-    YYUSE (yylocationp);
-    YYUSE (yymsg);
-    YYUSE (yyvaluep);
-
-    YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-
-    switch (yytype)
-      {
-  ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
-	default:
-	  break;
-      }
-  }
-
-  void
-  ]b4_parser_class_name[::yypop_ (unsigned int n)
-  {
-    yystate_stack_.pop (n);
-    yysemantic_stack_.pop (n);
-    yylocation_stack_.pop (n);
-  }
-
-  std::ostream&
-  ]b4_parser_class_name[::debug_stream () const
-  {
-    return *yycdebug_;
-  }
-
-  void
-  ]b4_parser_class_name[::set_debug_stream (std::ostream& o)
-  {
-    yycdebug_ = &o;
-  }
-
-
-  ]b4_parser_class_name[::debug_level_type
-  ]b4_parser_class_name[::debug_level () const
-  {
-    return yydebug_;
-  }
-
-  void
-  ]b4_parser_class_name[::set_debug_level (debug_level_type l)
-  {
-    yydebug_ = l;
-  }
-
-
-  int
-  ]b4_parser_class_name[::parse ()
-  {
-    /// Look-ahead and look-ahead in internal form.
-    int yychar = yyempty_;
-    int yytoken = 0;
-
-    /* State.  */
-    int yyn;
-    int yylen = 0;
-    int yystate = 0;
-
-    /* Error handling.  */
-    int yynerrs_ = 0;
-    int yyerrstatus_ = 0;
-
-    /// Semantic value of the look-ahead.
-    semantic_type yylval;
-    /// Location of the look-ahead.
-    location_type yylloc;
-    /// The locations where the error started and ended.
-    location yyerror_range[2];
-
-    /// $$.
-    semantic_type yyval;
-    /// @@$.
-    location_type yyloc;
-
-    int yyresult;
-
-    YYCDEBUG << "Starting parse" << std::endl;
-
-]m4_ifdef([b4_initial_action], [
-m4_pushdef([b4_at_dollar],     [yylloc])dnl
-m4_pushdef([b4_dollar_dollar], [yylval])dnl
-    /* User initialization code.  */
-    b4_initial_action
-m4_popdef([b4_dollar_dollar])dnl
-m4_popdef([b4_at_dollar])dnl
-  /* Line __line__ of yacc.c.  */
-b4_syncline([@oline@], [@ofile@])])dnl
-
-  [  /* Initialize the stacks.  The initial state will be pushed in
-       yynewstate, since the latter expects the semantical and the
-       location values to have been already stored, initialize these
-       stacks with a primary value.  */
-    yystate_stack_ = state_stack_type (0);
-    yysemantic_stack_ = semantic_stack_type (0);
-    yylocation_stack_ = location_stack_type (0);
-    yysemantic_stack_.push (yylval);
-    yylocation_stack_.push (yylloc);
-
-    /* New state.  */
-  yynewstate:
-    yystate_stack_.push (yystate);
-    YYCDEBUG << "Entering state " << yystate << std::endl;
-    goto yybackup;
-
-    /* Backup.  */
-  yybackup:
-
-    /* Try to take a decision without look-ahead.  */
-    yyn = yypact_[yystate];
-    if (yyn == yypact_ninf_)
-      goto yydefault;
-
-    /* Read a look-ahead token.  */
-    if (yychar == yyempty_)
-      {
-	YYCDEBUG << "Reading a token: ";
-	yychar = ]b4_c_function_call([yylex], [int],
-				     [[YYSTYPE*], [&yylval]][]dnl
-b4_locations_if([, [[location*], [&yylloc]]])dnl
-m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
-      }
-
-
-    /* Convert token to internal form.  */
-    if (yychar <= yyeof_)
-      {
-	yychar = yytoken = yyeof_;
-	YYCDEBUG << "Now at end of input." << std::endl;
-      }
-    else
-      {
-	yytoken = yytranslate_ (yychar);
-	YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
-      }
-
-    /* If the proper action on seeing token YYTOKEN is to reduce or to
-       detect an error, take that action.  */
-    yyn += yytoken;
-    if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken)
-      goto yydefault;
-
-    /* Reduce or error.  */
-    yyn = yytable_[yyn];
-    if (yyn <= 0)
-      {
-	if (yyn == 0 || yyn == yytable_ninf_)
-	goto yyerrlab;
-	yyn = -yyn;
-	goto yyreduce;
-      }
-
-    /* Accept?  */
-    if (yyn == yyfinal_)
-      goto yyacceptlab;
-
-    /* Shift the look-ahead token.  */
-    YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
-    /* Discard the token being shifted unless it is eof.  */
-    if (yychar != yyeof_)
-      yychar = yyempty_;
-
-    yysemantic_stack_.push (yylval);
-    yylocation_stack_.push (yylloc);
-
-    /* Count tokens shifted since error; after three, turn off error
-       status.  */
-    if (yyerrstatus_)
-      --yyerrstatus_;
-
-    yystate = yyn;
-    goto yynewstate;
-
-  /*-----------------------------------------------------------.
-  | yydefault -- do the default action for the current state.  |
-  `-----------------------------------------------------------*/
-  yydefault:
-    yyn = yydefact_[yystate];
-    if (yyn == 0)
-      goto yyerrlab;
-    goto yyreduce;
-
-  /*-----------------------------.
-  | yyreduce -- Do a reduction.  |
-  `-----------------------------*/
-  yyreduce:
-    yylen = yyr2_[yyn];
-    /* If YYLEN is nonzero, implement the default value of the action:
-       `$$ = $1'.  Otherwise, use the top of the stack.
-
-       Otherwise, the following line sets YYVAL to garbage.
-       This behavior is undocumented and Bison
-       users should not rely upon it.  */
-    if (yylen)
-      yyval = yysemantic_stack_[yylen - 1];
-    else
-      yyval = yysemantic_stack_[0];
-
-    {
-      slice<location_type, location_stack_type> slice (yylocation_stack_, yylen);
-      YYLLOC_DEFAULT (yyloc, slice, yylen);
-    }
-    YY_REDUCE_PRINT (yyn);
-    switch (yyn)
-      {
-	]b4_actions
-    /* Line __line__ of lalr1.cc.  */
-b4_syncline([@oline@], [@ofile@])[
-	default: break;
-      }
-    YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc);
-
-    yypop_ (yylen);
-    yylen = 0;
-    YY_STACK_PRINT ();
-
-    yysemantic_stack_.push (yyval);
-    yylocation_stack_.push (yyloc);
-
-    /* Shift the result of the reduction.  */
-    yyn = yyr1_[yyn];
-    yystate = yypgoto_[yyn - yyntokens_] + yystate_stack_[0];
-    if (0 <= yystate && yystate <= yylast_
-	&& yycheck_[yystate] == yystate_stack_[0])
-      yystate = yytable_[yystate];
-    else
-      yystate = yydefgoto_[yyn - yyntokens_];
-    goto yynewstate;
-
-  /*------------------------------------.
-  | yyerrlab -- here on detecting error |
-  `------------------------------------*/
-  yyerrlab:
-    /* If not already recovering from an error, report this error.  */
-    if (!yyerrstatus_)
-      {
-	++yynerrs_;
-	error (yylloc, yysyntax_error_ (yystate]dnl
-b4_error_verbose_if([, yytoken])[));
-      }
-
-    yyerror_range[0] = yylloc;
-    if (yyerrstatus_ == 3)
-      {
-	/* If just tried and failed to reuse look-ahead token after an
-	 error, discard it.  */
-
-	if (yychar <= yyeof_)
-	  {
-	  /* Return failure if at end of input.  */
-	  if (yychar == yyeof_)
-	    YYABORT;
-	  }
-	else
-	  {
-	    yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc);
-	    yychar = yyempty_;
-	  }
-      }
-
-    /* Else will try to reuse look-ahead token after shifting the error
-       token.  */
-    goto yyerrlab1;
-
-
-  /*---------------------------------------------------.
-  | yyerrorlab -- error raised explicitly by YYERROR.  |
-  `---------------------------------------------------*/
-  yyerrorlab:
-
-    /* Pacify compilers like GCC when the user code never invokes
-       YYERROR and the label yyerrorlab therefore never appears in user
-       code.  */
-    if (false)
-      goto yyerrorlab;
-
-    yyerror_range[0] = yylocation_stack_[yylen - 1];
-    /* Do not reclaim the symbols of the rule which action triggered
-       this YYERROR.  */
-    yypop_ (yylen);
-    yylen = 0;
-    yystate = yystate_stack_[0];
-    goto yyerrlab1;
-
-  /*-------------------------------------------------------------.
-  | yyerrlab1 -- common code for both syntax error and YYERROR.  |
-  `-------------------------------------------------------------*/
-  yyerrlab1:
-    yyerrstatus_ = 3;	/* Each real token shifted decrements this.  */
-
-    for (;;)
-      {
-	yyn = yypact_[yystate];
-	if (yyn != yypact_ninf_)
-	{
-	  yyn += yyterror_;
-	  if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
-	    {
-	      yyn = yytable_[yyn];
-	      if (0 < yyn)
-		break;
-	    }
-	}
-
-	/* Pop the current state because it cannot handle the error token.  */
-	if (yystate_stack_.height () == 1)
-	YYABORT;
-
-	yyerror_range[0] = yylocation_stack_[0];
-	yydestruct_ ("Error: popping",
-		     yystos_[yystate],
-		     &yysemantic_stack_[0], &yylocation_stack_[0]);
-	yypop_ ();
-	yystate = yystate_stack_[0];
-	YY_STACK_PRINT ();
-      }
-
-    if (yyn == yyfinal_)
-      goto yyacceptlab;
-
-    yyerror_range[1] = yylloc;
-    // Using YYLLOC is tempting, but would change the location of
-    // the look-ahead.  YYLOC is available though.
-    YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2);
-    yysemantic_stack_.push (yylval);
-    yylocation_stack_.push (yyloc);
-
-    /* Shift the error token.  */
-    YY_SYMBOL_PRINT ("Shifting", yystos_[yyn],
-		   &yysemantic_stack_[0], &yylocation_stack_[0]);
-
-    yystate = yyn;
-    goto yynewstate;
-
-    /* Accept.  */
-  yyacceptlab:
-    yyresult = 0;
-    goto yyreturn;
-
-    /* Abort.  */
-  yyabortlab:
-    yyresult = 1;
-    goto yyreturn;
-
-  yyreturn:
-    if (yychar != yyeof_ && yychar != yyempty_)
-      yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc);
-
-    /* Do not reclaim the symbols of the rule which action triggered
-       this YYABORT or YYACCEPT.  */
-    yypop_ (yylen);
-    while (yystate_stack_.height () != 1)
-      {
-	yydestruct_ ("Cleanup: popping",
-		   yystos_[yystate_stack_[0]],
-		   &yysemantic_stack_[0],
-		   &yylocation_stack_[0]);
-	yypop_ ();
-      }
-
-    return yyresult;
-  }
-
-  // Generate an error message.
-  std::string
-  ]b4_parser_class_name[::yysyntax_error_ (int yystate]dnl
-b4_error_verbose_if([, int tok])[)
-  {
-    std::string res;
-    YYUSE (yystate);
-#if YYERROR_VERBOSE
-    int yyn = yypact_[yystate];
-    if (yypact_ninf_ < yyn && yyn <= yylast_)
-      {
-	/* Start YYX at -YYN if negative to avoid negative indexes in
-	   YYCHECK.  */
-	int yyxbegin = yyn < 0 ? -yyn : 0;
-
-	/* Stay within bounds of both yycheck and yytname.  */
-	int yychecklim = yylast_ - yyn + 1;
-	int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
-	int count = 0;
-	for (int x = yyxbegin; x < yyxend; ++x)
-	  if (yycheck_[x + yyn] == x && x != yyterror_)
-	    ++count;
-
-	// FIXME: This method of building the message is not compatible
-	// with internationalization.  It should work like yacc.c does it.
-	// That is, first build a string that looks like this:
-	// "syntax error, unexpected %s or %s or %s"
-	// Then, invoke YY_ on this string.
-	// Finally, use the string as a format to output
-	// yytname_[tok], etc.
-	// Until this gets fixed, this message appears in English only.
-	res = "syntax error, unexpected ";
-	res += yytnamerr_ (yytname_[tok]);
-	if (count < 5)
-	  {
-	    count = 0;
-	    for (int x = yyxbegin; x < yyxend; ++x)
-	      if (yycheck_[x + yyn] == x && x != yyterror_)
-		{
-		  res += (!count++) ? ", expecting " : " or ";
-		  res += yytnamerr_ (yytname_[x]);
-		}
-	  }
-      }
-    else
-#endif
-      res = YY_("syntax error");
-    return res;
-  }
-
-
-  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-     STATE-NUM.  */
-  const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
-  const ]b4_int_type_for([b4_pact])[
-  ]b4_parser_class_name[::yypact_[] =
-  {
-    ]b4_pact[
-  };
-
-  /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
-     doesn't specify something else to do.  Zero means the default is an
-     error.  */
-  const ]b4_int_type_for([b4_defact])[
-  ]b4_parser_class_name[::yydefact_[] =
-  {
-    ]b4_defact[
-  };
-
-  /* YYPGOTO[NTERM-NUM].  */
-  const ]b4_int_type_for([b4_pgoto])[
-  ]b4_parser_class_name[::yypgoto_[] =
-  {
-    ]b4_pgoto[
-  };
-
-  /* YYDEFGOTO[NTERM-NUM].  */
-  const ]b4_int_type_for([b4_defgoto])[
-  ]b4_parser_class_name[::yydefgoto_[] =
-  {
-    ]b4_defgoto[
-  };
-
-  /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
-     positive, shift that token.  If negative, reduce the rule which
-     number is the opposite.  If zero, do what YYDEFACT says.  */
-  const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
-  const ]b4_int_type_for([b4_table])[
-  ]b4_parser_class_name[::yytable_[] =
-  {
-    ]b4_table[
-  };
-
-  /* YYCHECK.  */
-  const ]b4_int_type_for([b4_check])[
-  ]b4_parser_class_name[::yycheck_[] =
-  {
-    ]b4_check[
-  };
-
-  /* STOS_[STATE-NUM] -- The (internal number of the) accessing
-     symbol of state STATE-NUM.  */
-  const ]b4_int_type_for([b4_stos])[
-  ]b4_parser_class_name[::yystos_[] =
-  {
-    ]b4_stos[
-  };
-
-#if YYDEBUG
-  /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
-     to YYLEX-NUM.  */
-  const ]b4_int_type_for([b4_toknum])[
-  ]b4_parser_class_name[::yytoken_number_[] =
-  {
-    ]b4_toknum[
-  };
-#endif
-
-  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-  const ]b4_int_type_for([b4_r1])[
-  ]b4_parser_class_name[::yyr1_[] =
-  {
-    ]b4_r1[
-  };
-
-  /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-  const ]b4_int_type_for([b4_r2])[
-  ]b4_parser_class_name[::yyr2_[] =
-  {
-    ]b4_r2[
-  };
-
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-  /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-     First, the terminals, then, starting at \a yyntokens_, nonterminals.  */
-  const char*
-  const ]b4_parser_class_name[::yytname_[] =
-  {
-    ]b4_tname[
-  };
-#endif
-
-#if YYDEBUG
-  /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
-  const ]b4_parser_class_name[::rhs_number_type
-  ]b4_parser_class_name[::yyrhs_[] =
-  {
-    ]b4_rhs[
-  };
-
-  /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-     YYRHS.  */
-  const ]b4_int_type_for([b4_prhs])[
-  ]b4_parser_class_name[::yyprhs_[] =
-  {
-    ]b4_prhs[
-  };
-
-  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
-  const ]b4_int_type_for([b4_rline])[
-  ]b4_parser_class_name[::yyrline_[] =
-  {
-    ]b4_rline[
-  };
-
-  // Print the state stack on the debug stream.
-  void
-  ]b4_parser_class_name[::yystack_print_ ()
-  {
-    *yycdebug_ << "Stack now";
-    for (state_stack_type::const_iterator i = yystate_stack_.begin ();
-	 i != yystate_stack_.end (); ++i)
-      *yycdebug_ << ' ' << *i;
-    *yycdebug_ << std::endl;
-  }
-
-  // Report on the debug stream that the rule \a yyrule is going to be reduced.
-  void
-  ]b4_parser_class_name[::yy_reduce_print_ (int yyrule)
-  {
-    unsigned int yylno = yyrline_[yyrule];
-    int yynrhs = yyr2_[yyrule];
-    /* Print the symbols being reduced, and their result.  */
-    *yycdebug_ << "Reducing stack by rule " << yyrule - 1
-	       << " (line " << yylno << "), ";
-    /* The symbols being reduced.  */
-    for (int yyi = 0; yyi < yynrhs; yyi++)
-      YY_SYMBOL_PRINT ("   $" << yyi + 1 << " =",
-		       yyrhs_[yyprhs_[yyrule] + yyi],
-		       &]b4_rhs_value(yynrhs, yyi + 1)[,
-		       &]b4_rhs_location(yynrhs, yyi + 1)[);
-  }
-#endif // YYDEBUG
-
-  /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
-  ]b4_parser_class_name[::token_number_type
-  ]b4_parser_class_name[::yytranslate_ (int t)
-  {
-    static
-    const token_number_type
-    translate_table[] =
-    {
-      ]b4_translate[
-    };
-    if ((unsigned int) t <= yyuser_token_number_max_)
-      return translate_table[t];
-    else
-      return yyundef_token_;
-  }
-
-  const int ]b4_parser_class_name[::yyeof_ = 0;
-  const int ]b4_parser_class_name[::yylast_ = ]b4_last[;
-  const int ]b4_parser_class_name[::yynnts_ = ]b4_nterms_number[;
-  const int ]b4_parser_class_name[::yyempty_ = -2;
-  const int ]b4_parser_class_name[::yyfinal_ = ]b4_final_state_number[;
-  const int ]b4_parser_class_name[::yyterror_ = 1;
-  const int ]b4_parser_class_name[::yyerrcode_ = 256;
-  const int ]b4_parser_class_name[::yyntokens_ = ]b4_tokens_number[;
-
-  const unsigned int ]b4_parser_class_name[::yyuser_token_number_max_ = ]b4_user_token_number_max[;
-  const ]b4_parser_class_name[::token_number_type ]b4_parser_class_name[::yyundef_token_ = ]b4_undef_token_number[;
-
-} // namespace ]b4_namespace[
-
-]b4_epilogue
-dnl
-@output b4_dir_prefix[]stack.hh
-b4_copyright([Stack handling for Bison parsers in C++],
-  [2002, 2003, 2004, 2005, 2006])[
-
-#ifndef BISON_STACK_HH
-# define BISON_STACK_HH
-
-#include <deque>
-
-namespace ]b4_namespace[
-{
-  template <class T, class S = std::deque<T> >
-  class stack
-  {
-  public:
-
-    // Hide our reversed order.
-    typedef typename S::reverse_iterator iterator;
-    typedef typename S::const_reverse_iterator const_iterator;
-
-    stack () : seq_ ()
-    {
-    }
-
-    stack (unsigned int n) : seq_ (n)
-    {
-    }
-
-    inline
-    T&
-    operator [] (unsigned int i)
-    {
-      return seq_[i];
-    }
-
-    inline
-    const T&
-    operator [] (unsigned int i) const
-    {
-      return seq_[i];
-    }
-
-    inline
-    void
-    push (const T& t)
-    {
-      seq_.push_front (t);
-    }
-
-    inline
-    void
-    pop (unsigned int n = 1)
-    {
-      for (; n; --n)
-	seq_.pop_front ();
-    }
-
-    inline
-    unsigned int
-    height () const
-    {
-      return seq_.size ();
-    }
-
-    inline const_iterator begin () const { return seq_.rbegin (); }
-    inline const_iterator end () const { return seq_.rend (); }
-
-  private:
-
-    S seq_;
-  };
-
-  /// Present a slice of the top of a stack.
-  template <class T, class S = stack<T> >
-  class slice
-  {
-  public:
-
-    slice (const S& stack,
-	   unsigned int range) : stack_ (stack),
-				 range_ (range)
-    {
-    }
-
-    inline
-    const T&
-    operator [] (unsigned int i) const
-    {
-      return stack_[range_ - i];
-    }
-
-  private:
-
-    const S& stack_;
-    unsigned int range_;
-  };
-}
-
-#endif // not BISON_STACK_HH]
-m4_divert(-1)
diff --git a/data/location.cc b/data/location.cc
deleted file mode 100644
index 869320e..0000000
--- a/data/location.cc
+++ /dev/null
@@ -1,253 +0,0 @@
-m4_divert(-1)
-
-# C++ skeleton for Bison
-
-# Copyright (C) 2002, 2003, 2004, 2005, 2006 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 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
-
-# We do want M4 expansion after # for CPP macros.
-m4_changecom()
-m4_divert(0)dnl
-@output b4_dir_prefix[]position.hh
-b4_copyright([Positions for Bison parsers in C++],
-  [2002, 2003, 2004, 2005, 2006])[
-
-/**
- ** \file position.hh
- ** Define the ]b4_namespace[::position class.
- */
-
-#ifndef BISON_POSITION_HH
-# define BISON_POSITION_HH
-
-# include <iostream>
-# include <string>
-
-namespace ]b4_namespace[
-{
-  /// Abstract a position.
-  class position
-  {
-  public:
-]m4_ifdef([b4_location_constructors], [
-    /// Construct a position.
-    position ()
-      : filename (0), line (1), column (0)
-    {
-    }
-
-])[
-    /// Initialization.
-    inline void initialize (]b4_filename_type[* fn)
-    {
-      filename = fn;
-      line = 1;
-      column = 0;
-    }
-
-    /** \name Line and Column related manipulators
-     ** \{ */
-  public:
-    /// (line related) Advance to the COUNT next lines.
-    inline void lines (int count = 1)
-    {
-      column = 0;
-      line += count;
-    }
-
-    /// (column related) Advance to the COUNT next columns.
-    inline void columns (int count = 1)
-    {
-      int leftmost = 0;
-      int current  = column;
-      if (leftmost <= current + count)
-	column += count;
-      else
-	column = 0;
-    }
-    /** \} */
-
-  public:
-    /// File name to which this position refers.
-    ]b4_filename_type[* filename;
-    /// Current line number.
-    unsigned int line;
-    /// Current column number.
-    unsigned int column;
-  };
-
-  /// Add and assign a position.
-  inline const position&
-  operator+= (position& res, const int width)
-  {
-    res.columns (width);
-    return res;
-  }
-
-  /// Add two position objects.
-  inline const position
-  operator+ (const position& begin, const int width)
-  {
-    position res = begin;
-    return res += width;
-  }
-
-  /// Add and assign a position.
-  inline const position&
-  operator-= (position& res, const int width)
-  {
-    return res += -width;
-  }
-
-  /// Add two position objects.
-  inline const position
-  operator- (const position& begin, const int width)
-  {
-    return begin + -width;
-  }
-
-  /** \brief Intercept output stream redirection.
-   ** \param ostr the destination output stream
-   ** \param pos a reference to the position to redirect
-   */
-  inline std::ostream&
-  operator<< (std::ostream& ostr, const position& pos)
-  {
-    if (pos.filename)
-      ostr << *pos.filename << ':';
-    return ostr << pos.line << '.' << pos.column;
-  }
-
-}
-#endif // not BISON_POSITION_HH]
-@output b4_dir_prefix[]location.hh
-b4_copyright([Locations for Bison parsers in C++],
-  [2002, 2003, 2004, 2005, 2006])[
-
-/**
- ** \file location.hh
- ** Define the ]b4_namespace[::location class.
- */
-
-#ifndef BISON_LOCATION_HH
-# define BISON_LOCATION_HH
-
-# include <iostream>
-# include <string>
-# include "position.hh"
-
-namespace ]b4_namespace[
-{
-
-  /// Abstract a location.
-  class location
-  {
-  public:
-]m4_ifdef([b4_location_constructors], [
-    /// Construct a location.
-    location ()
-      : begin (), end ()
-    {
-    }
-
-])[
-    /// Initialization.
-    inline void initialize (]b4_filename_type[* fn)
-    {
-      begin.initialize (fn);
-      end = begin;
-    }
-
-    /** \name Line and Column related manipulators
-     ** \{ */
-  public:
-    /// Reset initial location to final location.
-    inline void step ()
-    {
-      begin = end;
-    }
-
-    /// Extend the current location to the COUNT next columns.
-    inline void columns (unsigned int count = 1)
-    {
-      end += count;
-    }
-
-    /// Extend the current location to the COUNT next lines.
-    inline void lines (unsigned int count = 1)
-    {
-      end.lines (count);
-    }
-    /** \} */
-
-
-  public:
-    /// Beginning of the located region.
-    position begin;
-    /// End of the located region.
-    position end;
-  };
-
-  /// Join two location objects to create a location.
-  inline const location operator+ (const location& begin, const location& end)
-  {
-    location res = begin;
-    res.end = end.end;
-    return res;
-  }
-
-  /// Add two location objects.
-  inline const location operator+ (const location& begin, unsigned int width)
-  {
-    location res = begin;
-    res.columns (width);
-    return res;
-  }
-
-  /// Add and assign a location.
-  inline location& operator+= (location& res, unsigned int width)
-  {
-    res.columns (width);
-    return res;
-  }
-
-  /** \brief Intercept output stream redirection.
-   ** \param ostr the destination output stream
-   ** \param loc a reference to the location to redirect
-   **
-   ** Avoid duplicate information.
-   */
-  inline std::ostream& operator<< (std::ostream& ostr, const location& loc)
-  {
-    position last = loc.end - 1;
-    ostr << loc.begin;
-    if (last.filename
-	&& (!loc.begin.filename
-	    || *loc.begin.filename != *last.filename))
-      ostr << '-' << last;
-    else if (loc.begin.line != last.line)
-      ostr << '-' << last.line  << '.' << last.column;
-    else if (loc.begin.column != last.column)
-      ostr << '-' << last.column;
-    return ostr;
-  }
-
-}
-
-#endif // not BISON_LOCATION_HH]
-m4_divert(-1)
-m4_changecom([#])
diff --git a/data/m4sugar/m4sugar.m4 b/data/m4sugar/m4sugar.m4
deleted file mode 100644
index 225b7c7..0000000
--- a/data/m4sugar/m4sugar.m4
+++ /dev/null
@@ -1,1776 +0,0 @@
-divert(-1)#                                                  -*- Autoconf -*-
-# This file is part of Autoconf.
-# Base M4 layer.
-# Requires GNU M4.
-#
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 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.
-#
-# As a special exception, the Free Software Foundation gives unlimited
-# permission to copy, distribute and modify the configure scripts that
-# are the output of Autoconf.  You need not follow the terms of the GNU
-# General Public License when using or distributing such scripts, even
-# though portions of the text of Autoconf appear in them.  The GNU
-# General Public License (GPL) does govern all other use of the material
-# that constitutes the Autoconf program.
-#
-# Certain portions of the Autoconf source text are designed to be copied
-# (in certain cases, depending on the input) into the output of
-# Autoconf.  We call these the "data" portions.  The rest of the Autoconf
-# source text consists of comments plus executable code that decides which
-# of the data portions to output in any given case.  We call these
-# comments and executable code the "non-data" portions.  Autoconf never
-# copies any of the non-data portions into its output.
-#
-# This special exception to the GPL applies to versions of Autoconf
-# released by the Free Software Foundation.  When you make and
-# distribute a modified version of Autoconf, you may extend this special
-# exception to the GPL to apply to your modified version as well, *unless*
-# your modified version has the potential to copy into its output some
-# of the text that was the non-data portion of the version that you started
-# with.  (In other words, unless your change moves or copies text from
-# the non-data portions to the data portions.)  If your modification has
-# such potential, you must delete any notice of this special exception
-# to the GPL from your modified version.
-#
-# Written by Akim Demaille.
-#
-
-# Set the quotes, whatever the current quoting system.
-changequote()
-changequote([, ])
-
-# Some old m4's don't support m4exit.  But they provide
-# equivalent functionality by core dumping because of the
-# long macros we define.
-ifdef([__gnu__], ,
-[errprint(M4sugar requires GNU M4. Install it before installing M4sugar or
-set the M4 environment variable to its absolute file name.)
-m4exit(2)])
-
-
-## ------------------------------- ##
-## 1. Simulate --prefix-builtins.  ##
-## ------------------------------- ##
-
-# m4_define
-# m4_defn
-# m4_undefine
-define([m4_define],   defn([define]))
-define([m4_defn],     defn([defn]))
-define([m4_undefine], defn([undefine]))
-
-m4_undefine([define])
-m4_undefine([defn])
-m4_undefine([undefine])
-
-
-# m4_copy(SRC, DST)
-# -----------------
-# Define DST as the definition of SRC.
-# What's the difference between:
-# 1. m4_copy([from], [to])
-# 2. m4_define([to], [from($@)])
-# Well, obviously 1 is more expensive in space.  Maybe 2 is more expensive
-# in time, but because of the space cost of 1, it's not that obvious.
-# Nevertheless, one huge difference is the handling of `$0'.  If `from'
-# uses `$0', then with 1, `to''s `$0' is `to', while it is `from' in 2.
-# The user will certainly prefer to see `to'.
-m4_define([m4_copy],
-[m4_define([$2], m4_defn([$1]))])
-
-
-# m4_rename(SRC, DST)
-# -------------------
-# Rename the macro SRC as DST.
-m4_define([m4_rename],
-[m4_copy([$1], [$2])m4_undefine([$1])])
-
-
-# m4_rename_m4(MACRO-NAME)
-# ------------------------
-# Rename MACRO-NAME as m4_MACRO-NAME.
-m4_define([m4_rename_m4],
-[m4_rename([$1], [m4_$1])])
-
-
-# m4_copy_unm4(m4_MACRO-NAME)
-# ---------------------------
-# Copy m4_MACRO-NAME as MACRO-NAME.
-m4_define([m4_copy_unm4],
-[m4_copy([$1], m4_bpatsubst([$1], [^m4_\(.*\)], [[\1]]))])
-
-
-# Some m4 internals have names colliding with tokens we might use.
-# Rename them a` la `m4 --prefix-builtins'.
-m4_rename_m4([builtin])
-m4_rename_m4([changecom])
-m4_rename_m4([changequote])
-m4_rename_m4([debugfile])
-m4_rename_m4([debugmode])
-m4_rename_m4([decr])
-m4_undefine([divert])
-m4_rename_m4([divnum])
-m4_rename_m4([dumpdef])
-m4_rename_m4([errprint])
-m4_rename_m4([esyscmd])
-m4_rename_m4([eval])
-m4_rename_m4([format])
-m4_rename_m4([ifdef])
-m4_rename([ifelse], [m4_if])
-m4_undefine([include])
-m4_rename_m4([incr])
-m4_rename_m4([index])
-m4_rename_m4([indir])
-m4_rename_m4([len])
-m4_rename([m4exit], [m4_exit])
-m4_rename([m4wrap], [m4_wrap])
-m4_rename_m4([maketemp])
-m4_rename([patsubst], [m4_bpatsubst])
-m4_undefine([popdef])
-m4_rename_m4([pushdef])
-m4_rename([regexp], [m4_bregexp])
-m4_rename_m4([shift])
-m4_undefine([sinclude])
-m4_rename_m4([substr])
-m4_rename_m4([symbols])
-m4_rename_m4([syscmd])
-m4_rename_m4([sysval])
-m4_rename_m4([traceoff])
-m4_rename_m4([traceon])
-m4_rename_m4([translit])
-m4_undefine([undivert])
-
-
-## ------------------- ##
-## 2. Error messages.  ##
-## ------------------- ##
-
-
-# m4_location
-# -----------
-m4_define([m4_location],
-[__file__:__line__])
-
-
-# m4_errprintn(MSG)
-# -----------------
-# Same as `errprint', but with the missing end of line.
-m4_define([m4_errprintn],
-[m4_errprint([$1
-])])
-
-
-# m4_warning(MSG)
-# ---------------
-# Warn the user.
-m4_define([m4_warning],
-[m4_errprintn(m4_location[: warning: $1])])
-
-
-# m4_fatal(MSG, [EXIT-STATUS])
-# ----------------------------
-# Fatal the user.                                                      :)
-m4_define([m4_fatal],
-[m4_errprintn(m4_location[: error: $1])dnl
-m4_expansion_stack_dump()dnl
-m4_exit(m4_if([$2],, 1, [$2]))])
-
-
-# m4_assert(EXPRESSION, [EXIT-STATUS = 1])
-# ----------------------------------------
-# This macro ensures that EXPRESSION evaluates to true, and exits if
-# EXPRESSION evaluates to false.
-m4_define([m4_assert],
-[m4_if(m4_eval([$1]), 0,
-       [m4_fatal([assert failed: $1], [$2])])])
-
-
-
-## ------------- ##
-## 3. Warnings.  ##
-## ------------- ##
-
-
-# _m4_warn(CATEGORY, MESSAGE, STACK-TRACE)
-# ----------------------------------------
-# Report a MESSAGE to the user if the CATEGORY of warnings is enabled.
-# This is for traces only.
-# The STACK-TRACE is a \n-separated list of "LOCATION: MESSAGE".
-m4_define([_m4_warn], [])
-
-
-# m4_warn(CATEGORY, MESSAGE)
-# --------------------------
-# Report a MESSAGE to the user if the CATEGORY of warnings is enabled.
-m4_define([m4_warn],
-[_m4_warn([$1], [$2],
-m4_ifdef([m4_expansion_stack],
-         [m4_defn([m4_expansion_stack])
-m4_location[: the top level]]))dnl
-])
-
-
-
-## ------------------- ##
-## 4. File inclusion.  ##
-## ------------------- ##
-
-
-# We also want to neutralize include (and sinclude for symmetry),
-# but we want to extend them slightly: warn when a file is included
-# several times.  This is in general a dangerous operation because
-# quite nobody quotes the first argument of m4_define.
-#
-# For instance in the following case:
-#   m4_define(foo, [bar])
-# then a second reading will turn into
-#   m4_define(bar, [bar])
-# which is certainly not what was meant.
-
-# m4_include_unique(FILE)
-# -----------------------
-# Declare that the FILE was loading; and warn if it has already
-# been included.
-m4_define([m4_include_unique],
-[m4_ifdef([m4_include($1)],
-	  [m4_warn([syntax], [file `$1' included several times])])dnl
-m4_define([m4_include($1)])])
-
-
-# m4_include(FILE)
-# ----------------
-# As the builtin include, but warns against multiple inclusions.
-m4_define([m4_include],
-[m4_include_unique([$1])dnl
-m4_builtin([include], [$1])])
-
-
-# m4_sinclude(FILE)
-# -----------------
-# As the builtin sinclude, but warns against multiple inclusions.
-m4_define([m4_sinclude],
-[m4_include_unique([$1])dnl
-m4_builtin([sinclude], [$1])])
-
-
-
-## ------------------------------------ ##
-## 5. Additional branching constructs.  ##
-## ------------------------------------ ##
-
-# Both `m4_ifval' and `m4_ifset' tests against the empty string.  The
-# difference is that `m4_ifset' is specialized on macros.
-#
-# In case of arguments of macros, eg $[1], it makes little difference.
-# In the case of a macro `FOO', you don't want to check `m4_ifval(FOO,
-# TRUE)', because if `FOO' expands with commas, there is a shifting of
-# the arguments.  So you want to run `m4_ifval([FOO])', but then you just
-# compare the *string* `FOO' against `', which, of course fails.
-#
-# So you want a variation of `m4_ifset' that expects a macro name as $[1].
-# If this macro is both defined and defined to a non empty value, then
-# it runs TRUE etc.
-
-
-# m4_ifval(COND, [IF-TRUE], [IF-FALSE])
-# -------------------------------------
-# If COND is not the empty string, expand IF-TRUE, otherwise IF-FALSE.
-# Comparable to m4_ifdef.
-m4_define([m4_ifval],
-[m4_if([$1], [], [$3], [$2])])
-
-
-# m4_n(TEXT)
-# ----------
-# If TEXT is not empty, return TEXT and a new line, otherwise nothing.
-m4_define([m4_n],
-[m4_if([$1],
-       [], [],
-	   [$1
-])])
-
-
-# m4_ifvaln(COND, [IF-TRUE], [IF-FALSE])
-# --------------------------------------
-# Same as `m4_ifval', but add an extra newline to IF-TRUE or IF-FALSE
-# unless that argument is empty.
-m4_define([m4_ifvaln],
-[m4_if([$1],
-       [],   [m4_n([$3])],
-	     [m4_n([$2])])])
-
-
-# m4_ifset(MACRO, [IF-TRUE], [IF-FALSE])
-# --------------------------------------
-# If MACRO has no definition, or of its definition is the empty string,
-# expand IF-FALSE, otherwise IF-TRUE.
-m4_define([m4_ifset],
-[m4_ifdef([$1],
-	  [m4_ifval(m4_defn([$1]), [$2], [$3])],
-	  [$3])])
-
-
-# m4_ifndef(NAME, [IF-NOT-DEFINED], [IF-DEFINED])
-# -----------------------------------------------
-m4_define([m4_ifndef],
-[m4_ifdef([$1], [$3], [$2])])
-
-
-# m4_case(SWITCH, VAL1, IF-VAL1, VAL2, IF-VAL2, ..., DEFAULT)
-# -----------------------------------------------------------
-# m4 equivalent of
-# switch (SWITCH)
-# {
-#   case VAL1:
-#     IF-VAL1;
-#     break;
-#   case VAL2:
-#     IF-VAL2;
-#     break;
-#   ...
-#   default:
-#     DEFAULT;
-#     break;
-# }.
-# All the values are optional, and the macro is robust to active
-# symbols properly quoted.
-m4_define([m4_case],
-[m4_if([$#], 0, [],
-       [$#], 1, [],
-       [$#], 2, [$2],
-       [$1], [$2], [$3],
-       [$0([$1], m4_shiftn(3, $@))])])
-
-
-# m4_bmatch(SWITCH, RE1, VAL1, RE2, VAL2, ..., DEFAULT)
-# -----------------------------------------------------
-# m4 equivalent of
-#
-# if (SWITCH =~ RE1)
-#   VAL1;
-# elif (SWITCH =~ RE2)
-#   VAL2;
-# elif ...
-#   ...
-# else
-#   DEFAULT
-#
-# All the values are optional, and the macro is robust to active symbols
-# properly quoted.
-m4_define([m4_bmatch],
-[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
-       [$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
-       [$#], 2, [$2],
-       [m4_if(m4_bregexp([$1], [$2]), -1, [$0([$1], m4_shiftn(3, $@))],
-	      [$3])])])
-
-
-# m4_car(LIST)
-# m4_cdr(LIST)
-# ------------
-# Manipulate m4 lists.
-m4_define([m4_car], [[$1]])
-m4_define([m4_cdr],
-[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
-       [$#], 1, [],
-       [m4_dquote(m4_shift($@))])])
-
-
-# m4_map(MACRO, LIST)
-# -------------------
-# Invoke MACRO($1), MACRO($2) etc. where $1, $2... are the elements
-# of LIST (which can be lists themselves, for multiple arguments MACROs).
-m4_define([m4_fst], [$1])
-m4_define([m4_map],
-[m4_if([$2], [[]], [],
-       [_m4_map([$1], [$2])])])
-m4_define([_m4_map],
-[m4_ifval([$2],
-	  [$1(m4_fst($2))[]_m4_map([$1], m4_cdr($2))])])
-
-
-# m4_map_sep(MACRO, SEPARATOR, LIST)
-# ----------------------------------
-# Invoke MACRO($1), SEPARATOR, MACRO($2), ..., MACRO($N) where $1, $2... $N
-# are the elements of LIST (which can be lists themselves, for multiple
-# arguments MACROs).
-m4_define([m4_map_sep],
-[m4_if([$3], [[]], [],
-       [$1(m4_fst($3))[]_m4_map([$2[]$1], m4_cdr($3))])])
-
-
-## ---------------------------------------- ##
-## 6. Enhanced version of some primitives.  ##
-## ---------------------------------------- ##
-
-# m4_bpatsubsts(STRING, RE1, SUBST1, RE2, SUBST2, ...)
-# ----------------------------------------------------
-# m4 equivalent of
-#
-#   $_ = STRING;
-#   s/RE1/SUBST1/g;
-#   s/RE2/SUBST2/g;
-#   ...
-#
-# All the values are optional, and the macro is robust to active symbols
-# properly quoted.
-#
-# I would have liked to name this macro `m4_bpatsubst', unfortunately,
-# due to quotation problems, I need to double quote $1 below, therefore
-# the anchors are broken :(  I can't let users be trapped by that.
-m4_define([m4_bpatsubsts],
-[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
-       [$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
-       [$#], 2, [m4_builtin([patsubst], $@)],
-       [$0(m4_builtin([patsubst], [[$1]], [$2], [$3]),
-	   m4_shiftn(3, $@))])])
-
-
-
-# m4_do(STRING, ...)
-# ------------------
-# This macro invokes all its arguments (in sequence, of course).  It is
-# useful for making your macros more structured and readable by dropping
-# unnecessary dnl's and have the macros indented properly.
-m4_define([m4_do],
-[m4_if($#, 0, [],
-       $#, 1, [$1],
-       [$1[]m4_do(m4_shift($@))])])
-
-
-# m4_define_default(MACRO, VALUE)
-# -------------------------------
-# If MACRO is undefined, set it to VALUE.
-m4_define([m4_define_default],
-[m4_ifndef([$1], [m4_define($@)])])
-
-
-# m4_default(EXP1, EXP2)
-# ----------------------
-# Returns EXP1 if non empty, otherwise EXP2.
-m4_define([m4_default],
-[m4_ifval([$1], [$1], [$2])])
-
-
-# m4_defn(NAME)
-# -------------
-# Unlike to the original, don't tolerate popping something which is
-# undefined.
-m4_define([m4_defn],
-[m4_ifndef([$1],
-	   [m4_fatal([$0: undefined macro: $1])])dnl
-m4_builtin([defn], $@)])
-
-
-# _m4_dumpdefs_up(NAME)
-# ---------------------
-m4_define([_m4_dumpdefs_up],
-[m4_ifdef([$1],
-	  [m4_pushdef([_m4_dumpdefs], m4_defn([$1]))dnl
-m4_dumpdef([$1])dnl
-m4_popdef([$1])dnl
-_m4_dumpdefs_up([$1])])])
-
-
-# _m4_dumpdefs_down(NAME)
-# -----------------------
-m4_define([_m4_dumpdefs_down],
-[m4_ifdef([_m4_dumpdefs],
-	  [m4_pushdef([$1], m4_defn([_m4_dumpdefs]))dnl
-m4_popdef([_m4_dumpdefs])dnl
-_m4_dumpdefs_down([$1])])])
-
-
-# m4_dumpdefs(NAME)
-# -----------------
-# Similar to `m4_dumpdef(NAME)', but if NAME was m4_pushdef'ed, display its
-# value stack (most recent displayed first).
-m4_define([m4_dumpdefs],
-[_m4_dumpdefs_up([$1])dnl
-_m4_dumpdefs_down([$1])])
-
-
-# m4_popdef(NAME)
-# ---------------
-# Unlike to the original, don't tolerate popping something which is
-# undefined.
-m4_define([m4_popdef],
-[m4_ifndef([$1],
-	   [m4_fatal([$0: undefined macro: $1])])dnl
-m4_builtin([popdef], $@)])
-
-
-# m4_quote(ARGS)
-# --------------
-# Return ARGS as a single arguments.
-#
-# It is important to realize the difference between `m4_quote(exp)' and
-# `[exp]': in the first case you obtain the quoted *result* of the
-# expansion of EXP, while in the latter you just obtain the string
-# `exp'.
-m4_define([m4_quote],  [[$*]])
-m4_define([m4_dquote],  [[$@]])
-
-
-# m4_noquote(STRING)
-# ------------------
-# Return the result of ignoring all quotes in STRING and invoking the
-# macros it contains.  Amongst other things useful for enabling macro
-# invocations inside strings with [] blocks (for instance regexps and
-# help-strings).
-m4_define([m4_noquote],
-[m4_changequote(-=<{,}>=-)$1-=<{}>=-m4_changequote([,])])
-
-
-# m4_shiftn(N, ...)
-# -----------------
-# Returns ... shifted N times.  Useful for recursive "varargs" constructs.
-m4_define([m4_shiftn],
-[m4_assert(($1 >= 0) && ($# > $1))dnl
-_m4_shiftn($@)])
-
-m4_define([_m4_shiftn],
-[m4_if([$1], 0,
-       [m4_shift($@)],
-       [_m4_shiftn(m4_eval([$1]-1), m4_shift(m4_shift($@)))])])
-
-
-# m4_undefine(NAME)
-# -----------------
-# Unlike to the original, don't tolerate undefining something which is
-# undefined.
-m4_define([m4_undefine],
-[m4_ifndef([$1],
-	   [m4_fatal([$0: undefined macro: $1])])dnl
-m4_builtin([undefine], $@)])
-
-
-## -------------------------- ##
-## 7. Implementing m4 loops.  ##
-## -------------------------- ##
-
-
-# m4_for(VARIABLE, FIRST, LAST, [STEP = +/-1], EXPRESSION)
-# --------------------------------------------------------
-# Expand EXPRESSION defining VARIABLE to FROM, FROM + 1, ..., TO.
-# Both limits are included, and bounds are checked for consistency.
-m4_define([m4_for],
-[m4_case(m4_sign(m4_eval($3 - $2)),
-	 1, [m4_assert(m4_sign(m4_default($4, 1)) == 1)],
-	-1, [m4_assert(m4_sign(m4_default($4, -1)) == -1)])dnl
-m4_pushdef([$1], [$2])dnl
-m4_if(m4_eval([$3 > $2]), 1,
-      [_m4_for([$1], [$3], m4_default([$4], 1), [$5])],
-      [_m4_for([$1], [$3], m4_default([$4], -1), [$5])])dnl
-m4_popdef([$1])])
-
-
-# _m4_for(VARIABLE, FIRST, LAST, STEP, EXPRESSION)
-# ------------------------------------------------
-# Core of the loop, no consistency checks.
-m4_define([_m4_for],
-[$4[]dnl
-m4_if($1, [$2], [],
-      [m4_define([$1], m4_eval($1+[$3]))_m4_for([$1], [$2], [$3], [$4])])])
-
-
-# Implementing `foreach' loops in m4 is much more tricky than it may
-# seem.  Actually, the example of a `foreach' loop in the m4
-# documentation is wrong: it does not quote the arguments properly,
-# which leads to undesirable expansions.
-#
-# The example in the documentation is:
-#
-# | # foreach(VAR, (LIST), STMT)
-# | m4_define([foreach],
-# |        [m4_pushdef([$1])_foreach([$1], [$2], [$3])m4_popdef([$1])])
-# | m4_define([_arg1], [$1])
-# | m4_define([_foreach],
-# |	       [m4_if([$2], [()], ,
-# |		     [m4_define([$1], _arg1$2)$3[]_foreach([$1],
-# |                                                        (shift$2),
-# |                                                        [$3])])])
-#
-# But then if you run
-#
-# | m4_define(a, 1)
-# | m4_define(b, 2)
-# | m4_define(c, 3)
-# | foreach([f], [([a], [(b], [c)])], [echo f
-# | ])
-#
-# it gives
-#
-#  => echo 1
-#  => echo (2,3)
-#
-# which is not what is expected.
-#
-# Of course the problem is that many quotes are missing.  So you add
-# plenty of quotes at random places, until you reach the expected
-# result.  Alternatively, if you are a quoting wizard, you directly
-# reach the following implementation (but if you really did, then
-# apply to the maintenance of m4sugar!).
-#
-# | # foreach(VAR, (LIST), STMT)
-# | m4_define([foreach], [m4_pushdef([$1])_foreach($@)m4_popdef([$1])])
-# | m4_define([_arg1], [[$1]])
-# | m4_define([_foreach],
-# |  [m4_if($2, [()], ,
-# |	     [m4_define([$1], [_arg1$2])$3[]_foreach([$1],
-# |                                                 [(shift$2)],
-# |                                                 [$3])])])
-#
-# which this time answers
-#
-#  => echo a
-#  => echo (b
-#  => echo c)
-#
-# Bingo!
-#
-# Well, not quite.
-#
-# With a better look, you realize that the parens are more a pain than
-# a help: since anyway you need to quote properly the list, you end up
-# with always using an outermost pair of parens and an outermost pair
-# of quotes.  Rejecting the parens both eases the implementation, and
-# simplifies the use:
-#
-# | # foreach(VAR, (LIST), STMT)
-# | m4_define([foreach], [m4_pushdef([$1])_foreach($@)m4_popdef([$1])])
-# | m4_define([_arg1], [$1])
-# | m4_define([_foreach],
-# |  [m4_if($2, [], ,
-# |	     [m4_define([$1], [_arg1($2)])$3[]_foreach([$1],
-# |                                                   [shift($2)],
-# |                                                   [$3])])])
-#
-#
-# Now, just replace the `$2' with `m4_quote($2)' in the outer `m4_if'
-# to improve robustness, and you come up with a quite satisfactory
-# implementation.
-
-
-# m4_foreach(VARIABLE, LIST, EXPRESSION)
-# --------------------------------------
-#
-# Expand EXPRESSION assigning each value of the LIST to VARIABLE.
-# LIST should have the form `item_1, item_2, ..., item_n', i.e. the
-# whole list must *quoted*.  Quote members too if you don't want them
-# to be expanded.
-#
-# This macro is robust to active symbols:
-#      | m4_define(active, [ACT, IVE])
-#      | m4_foreach(Var, [active, active], [-Var-])
-#     => -ACT--IVE--ACT--IVE-
-#
-#      | m4_foreach(Var, [[active], [active]], [-Var-])
-#     => -ACT, IVE--ACT, IVE-
-#
-#      | m4_foreach(Var, [[[active]], [[active]]], [-Var-])
-#     => -active--active-
-m4_define([m4_foreach],
-[m4_pushdef([$1])_m4_foreach($@)m4_popdef([$1])])
-
-m4_define([_m4_foreach],
-[m4_ifval([$2],
-	  [m4_define([$1], m4_car($2))$3[]dnl
-_m4_foreach([$1], m4_cdr($2), [$3])])])
-
-
-# m4_foreach_w(VARIABLE, LIST, EXPRESSION)
-# ----------------------------------------
-#
-# Like m4_foreach, but the list is whitespace separated.
-#
-# This macro is robust to active symbols:
-#    m4_foreach_w([Var], [ active
-#    b	act\
-#    ive  ], [-Var-])end
-#    => -active--b--active-end
-#
-m4_define([m4_foreach_w],
-[m4_foreach([$1], m4_split(m4_normalize([$2])), [$3])])
-
-
-
-## --------------------------- ##
-## 8. More diversion support.  ##
-## --------------------------- ##
-
-
-# _m4_divert(DIVERSION-NAME or NUMBER)
-# ------------------------------------
-# If DIVERSION-NAME is the name of a diversion, return its number,
-# otherwise if it is a NUMBER return it.
-m4_define([_m4_divert],
-[m4_ifdef([_m4_divert($1)],
-	  [m4_indir([_m4_divert($1)])],
-	  [$1])])
-
-# KILL is only used to suppress output.
-m4_define([_m4_divert(KILL)],           -1)
-
-
-# _m4_divert_n_stack
-# ------------------
-# Print m4_divert_stack with newline prepended, if it's nonempty.
-m4_define([_m4_divert_n_stack],
-[m4_ifdef([m4_divert_stack], [
-m4_defn([m4_divert_stack])])])
-
-
-# m4_divert(DIVERSION-NAME)
-# -------------------------
-# Change the diversion stream to DIVERSION-NAME.
-m4_define([m4_divert],
-[m4_define([m4_divert_stack], m4_location[: $0: $1]_m4_divert_n_stack)dnl
-m4_builtin([divert], _m4_divert([$1]))dnl
-])
-
-
-# m4_divert_push(DIVERSION-NAME)
-# ------------------------------
-# Change the diversion stream to DIVERSION-NAME, while stacking old values.
-m4_define([m4_divert_push],
-[m4_pushdef([m4_divert_stack], m4_location[: $0: $1]_m4_divert_n_stack)dnl
-m4_pushdef([_m4_divert_diversion], [$1])dnl
-m4_builtin([divert], _m4_divert([$1]))dnl
-])
-
-
-# m4_divert_pop([DIVERSION-NAME])
-# -------------------------------
-# Change the diversion stream to its previous value, unstacking it.
-# If specified, verify we left DIVERSION-NAME.
-# When we pop the last value from the stack, we divert to -1.
-m4_define([m4_divert_pop],
-[m4_ifndef([_m4_divert_diversion],
-           [m4_fatal([too many m4_divert_pop])])dnl
-m4_if([$1], [], [],
-      [$1], m4_defn([_m4_divert_diversion]), [],
-      [m4_fatal([$0($1): diversion mismatch: ]_m4_divert_n_stack)])dnl
-m4_popdef([m4_divert_stack])dnl
-m4_popdef([_m4_divert_diversion])dnl
-m4_builtin([divert],
-	   m4_ifdef([_m4_divert_diversion],
-		    [_m4_divert(m4_defn([_m4_divert_diversion]))],
-		    -1))dnl
-])
-
-
-# m4_divert_text(DIVERSION-NAME, CONTENT)
-# ---------------------------------------
-# Output CONTENT into DIVERSION-NAME (which may be a number actually).
-# An end of line is appended for free to CONTENT.
-m4_define([m4_divert_text],
-[m4_divert_push([$1])dnl
-$2
-m4_divert_pop([$1])dnl
-])
-
-
-# m4_divert_once(DIVERSION-NAME, CONTENT)
-# ---------------------------------------
-# Output once CONTENT into DIVERSION-NAME (which may be a number
-# actually).  An end of line is appended for free to CONTENT.
-m4_define([m4_divert_once],
-[m4_expand_once([m4_divert_text([$1], [$2])])])
-
-
-# m4_undivert(DIVERSION-NAME)
-# ---------------------------
-# Undivert DIVERSION-NAME.
-m4_define([m4_undivert],
-[m4_builtin([undivert], _m4_divert([$1]))])
-
-
-## -------------------------------------------- ##
-## 8. Defining macros with bells and whistles.  ##
-## -------------------------------------------- ##
-
-# `m4_defun' is basically `m4_define' but it equips the macro with the
-# needed machinery for `m4_require'.  A macro must be m4_defun'd if
-# either it is m4_require'd, or it m4_require's.
-#
-# Two things deserve attention and are detailed below:
-#  1. Implementation of m4_require
-#  2. Keeping track of the expansion stack
-#
-# 1. Implementation of m4_require
-# ===============================
-#
-# Of course m4_defun AC_PROVIDE's the macro, so that a macro which has
-# been expanded is not expanded again when m4_require'd, but the
-# difficult part is the proper expansion of macros when they are
-# m4_require'd.
-#
-# The implementation is based on two ideas, (i) using diversions to
-# prepare the expansion of the macro and its dependencies (by Franc,ois
-# Pinard), and (ii) expand the most recently m4_require'd macros _after_
-# the previous macros (by Axel Thimm).
-#
-#
-# The first idea: why using diversions?
-# -------------------------------------
-#
-# When a macro requires another, the other macro is expanded in new
-# diversion, GROW.  When the outer macro is fully expanded, we first
-# undivert the most nested diversions (GROW - 1...), and finally
-# undivert GROW.  To understand why we need several diversions,
-# consider the following example:
-#
-# | m4_defun([TEST1], [Test...REQUIRE([TEST2])1])
-# | m4_defun([TEST2], [Test...REQUIRE([TEST3])2])
-# | m4_defun([TEST3], [Test...3])
-#
-# Because m4_require is not required to be first in the outer macros, we
-# must keep the expansions of the various level of m4_require separated.
-# Right before executing the epilogue of TEST1, we have:
-#
-#	   GROW - 2: Test...3
-#	   GROW - 1: Test...2
-#	   GROW:     Test...1
-#	   BODY:
-#
-# Finally the epilogue of TEST1 undiverts GROW - 2, GROW - 1, and
-# GROW into the regular flow, BODY.
-#
-#	   GROW - 2:
-#	   GROW - 1:
-#	   GROW:
-#	   BODY:        Test...3; Test...2; Test...1
-#
-# (The semicolons are here for clarification, but of course are not
-# emitted.)  This is what Autoconf 2.0 (I think) to 2.13 (I'm sure)
-# implement.
-#
-#
-# The second idea: first required first out
-# -----------------------------------------
-#
-# The natural implementation of the idea above is buggy and produces
-# very surprising results in some situations.  Let's consider the
-# following example to explain the bug:
-#
-# | m4_defun([TEST1],  [REQUIRE([TEST2a])REQUIRE([TEST2b])])
-# | m4_defun([TEST2a], [])
-# | m4_defun([TEST2b], [REQUIRE([TEST3])])
-# | m4_defun([TEST3],  [REQUIRE([TEST2a])])
-# |
-# | AC_INIT
-# | TEST1
-#
-# The dependencies between the macros are:
-#
-#		 3 --- 2b
-#		/        \              is m4_require'd by
-#	       /          \       left -------------------- right
-#	    2a ------------ 1
-#
-# If you strictly apply the rules given in the previous section you get:
-#
-#	   GROW - 2: TEST3
-#	   GROW - 1: TEST2a; TEST2b
-#	   GROW:     TEST1
-#	   BODY:
-#
-# (TEST2a, although required by TEST3 is not expanded in GROW - 3
-# because is has already been expanded before in GROW - 1, so it has
-# been AC_PROVIDE'd, so it is not expanded again) so when you undivert
-# the stack of diversions, you get:
-#
-#	   GROW - 2:
-#	   GROW - 1:
-#	   GROW:
-#	   BODY:        TEST3; TEST2a; TEST2b; TEST1
-#
-# i.e., TEST2a is expanded after TEST3 although the latter required the
-# former.
-#
-# Starting from 2.50, uses an implementation provided by Axel Thimm.
-# The idea is simple: the order in which macros are emitted must be the
-# same as the one in which macro are expanded.  (The bug above can
-# indeed be described as: a macro has been AC_PROVIDE'd, but it is
-# emitted after: the lack of correlation between emission and expansion
-# order is guilty).
-#
-# How to do that?  You keeping the stack of diversions to elaborate the
-# macros, but each time a macro is fully expanded, emit it immediately.
-#
-# In the example above, when TEST2a is expanded, but it's epilogue is
-# not run yet, you have:
-#
-#	   GROW - 2:
-#	   GROW - 1: TEST2a
-#	   GROW:     Elaboration of TEST1
-#	   BODY:
-#
-# The epilogue of TEST2a emits it immediately:
-#
-#	   GROW - 2:
-#	   GROW - 1:
-#	   GROW:     Elaboration of TEST1
-#	   BODY:     TEST2a
-#
-# TEST2b then requires TEST3, so right before the epilogue of TEST3, you
-# have:
-#
-#	   GROW - 2: TEST3
-#	   GROW - 1: Elaboration of TEST2b
-#	   GROW:     Elaboration of TEST1
-#	   BODY:      TEST2a
-#
-# The epilogue of TEST3 emits it:
-#
-#	   GROW - 2:
-#	   GROW - 1: Elaboration of TEST2b
-#	   GROW:     Elaboration of TEST1
-#	   BODY:     TEST2a; TEST3
-#
-# TEST2b is now completely expanded, and emitted:
-#
-#	   GROW - 2:
-#	   GROW - 1:
-#	   GROW:     Elaboration of TEST1
-#	   BODY:     TEST2a; TEST3; TEST2b
-#
-# and finally, TEST1 is finished and emitted:
-#
-#	   GROW - 2:
-#	   GROW - 1:
-#	   GROW:
-#	   BODY:     TEST2a; TEST3; TEST2b: TEST1
-#
-# The idea is simple, but the implementation is a bit evolved.  If you
-# are like me, you will want to see the actual functioning of this
-# implementation to be convinced.  The next section gives the full
-# details.
-#
-#
-# The Axel Thimm implementation at work
-# -------------------------------------
-#
-# We consider the macros above, and this configure.ac:
-#
-#	    AC_INIT
-#	    TEST1
-#
-# You should keep the definitions of _m4_defun_pro, _m4_defun_epi, and
-# m4_require at hand to follow the steps.
-#
-# This implements tries not to assume that the current diversion is
-# BODY, so as soon as a macro (m4_defun'd) is expanded, we first
-# record the current diversion under the name _m4_divert_dump (denoted
-# DUMP below for short).  This introduces an important difference with
-# the previous versions of Autoconf: you cannot use m4_require if you
-# are not inside an m4_defun'd macro, and especially, you cannot
-# m4_require directly from the top level.
-#
-# We have not tried to simulate the old behavior (better yet, we
-# diagnose it), because it is too dangerous: a macro m4_require'd from
-# the top level is expanded before the body of `configure', i.e., before
-# any other test was run.  I let you imagine the result of requiring
-# AC_STDC_HEADERS for instance, before AC_PROG_CC was actually run....
-#
-# After AC_INIT was run, the current diversion is BODY.
-# * AC_INIT was run
-#   DUMP:                undefined
-#   diversion stack:     BODY |-
-#
-# * TEST1 is expanded
-# The prologue of TEST1 sets _m4_divert_dump, which is the diversion
-# where the current elaboration will be dumped, to the current
-# diversion.  It also m4_divert_push to GROW, where the full
-# expansion of TEST1 and its dependencies will be elaborated.
-#   DUMP:        BODY
-#   BODY:        empty
-#   diversions:  GROW, BODY |-
-#
-# * TEST1 requires TEST2a
-# _m4_require_call m4_divert_pushes another temporary diversion,
-# GROW - 1, and expands TEST2a in there.
-#   DUMP:        BODY
-#   BODY:        empty
-#   GROW - 1:    TEST2a
-#   diversions:  GROW - 1, GROW, BODY |-
-# Than the content of the temporary diversion is moved to DUMP and the
-# temporary diversion is popped.
-#   DUMP:        BODY
-#   BODY:        TEST2a
-#   diversions:  GROW, BODY |-
-#
-# * TEST1 requires TEST2b
-# Again, _m4_require_call pushes GROW - 1 and heads to expand TEST2b.
-#   DUMP:        BODY
-#   BODY:        TEST2a
-#   diversions:  GROW - 1, GROW, BODY |-
-#
-# * TEST2b requires TEST3
-# _m4_require_call pushes GROW - 2 and expands TEST3 here.
-# (TEST3 requires TEST2a, but TEST2a has already been m4_provide'd, so
-# nothing happens.)
-#   DUMP:        BODY
-#   BODY:        TEST2a
-#   GROW - 2:    TEST3
-#   diversions:  GROW - 2, GROW - 1, GROW, BODY |-
-# Than the diversion is appended to DUMP, and popped.
-#   DUMP:        BODY
-#   BODY:        TEST2a; TEST3
-#   diversions:  GROW - 1, GROW, BODY |-
-#
-# * TEST1 requires TEST2b (contd.)
-# The content of TEST2b is expanded...
-#   DUMP:        BODY
-#   BODY:        TEST2a; TEST3
-#   GROW - 1:    TEST2b,
-#   diversions:  GROW - 1, GROW, BODY |-
-# ... and moved to DUMP.
-#   DUMP:        BODY
-#   BODY:        TEST2a; TEST3; TEST2b
-#   diversions:  GROW, BODY |-
-#
-# * TEST1 is expanded: epilogue
-# TEST1's own content is in GROW...
-#   DUMP:        BODY
-#   BODY:        TEST2a; TEST3; TEST2b
-#   GROW:        TEST1
-#   diversions:  BODY |-
-# ... and it's epilogue moves it to DUMP and then undefines DUMP.
-#   DUMP:       undefined
-#   BODY:       TEST2a; TEST3; TEST2b; TEST1
-#   diversions: BODY |-
-#
-#
-# 2. Keeping track of the expansion stack
-# =======================================
-#
-# When M4 expansion goes wrong it is often extremely hard to find the
-# path amongst macros that drove to the failure.  What is needed is
-# the stack of macro `calls'. One could imagine that GNU M4 would
-# maintain a stack of macro expansions, unfortunately it doesn't, so
-# we do it by hand.  This is of course extremely costly, but the help
-# this stack provides is worth it.  Nevertheless to limit the
-# performance penalty this is implemented only for m4_defun'd macros,
-# not for define'd macros.
-#
-# The scheme is simplistic: each time we enter an m4_defun'd macros,
-# we prepend its name in m4_expansion_stack, and when we exit the
-# macro, we remove it (thanks to pushdef/popdef).
-#
-# In addition, we want to detect circular m4_require dependencies.
-# Each time we expand a macro FOO we define _m4_expanding(FOO); and
-# m4_require(BAR) simply checks whether _m4_expanding(BAR) is defined.
-
-
-# m4_expansion_stack_push(TEXT)
-# -----------------------------
-m4_define([m4_expansion_stack_push],
-[m4_pushdef([m4_expansion_stack],
-	    [$1]m4_ifdef([m4_expansion_stack], [
-m4_defn([m4_expansion_stack])]))])
-
-
-# m4_expansion_stack_pop
-# ----------------------
-m4_define([m4_expansion_stack_pop],
-[m4_popdef([m4_expansion_stack])])
-
-
-# m4_expansion_stack_dump
-# -----------------------
-# Dump the expansion stack.
-m4_define([m4_expansion_stack_dump],
-[m4_ifdef([m4_expansion_stack],
-	  [m4_errprintn(m4_defn([m4_expansion_stack]))])dnl
-m4_errprintn(m4_location[: the top level])])
-
-
-# _m4_divert(GROW)
-# ----------------
-# This diversion is used by the m4_defun/m4_require machinery.  It is
-# important to keep room before GROW because for each nested
-# AC_REQUIRE we use an additional diversion (i.e., two m4_require's
-# will use GROW - 2.  More than 3 levels has never seemed to be
-# needed.)
-#
-# ...
-# - GROW - 2
-#   m4_require'd code, 2 level deep
-# - GROW - 1
-#   m4_require'd code, 1 level deep
-# - GROW
-#   m4_defun'd macros are elaborated here.
-
-m4_define([_m4_divert(GROW)],       10000)
-
-
-# _m4_defun_pro(MACRO-NAME)
-# -------------------------
-# The prologue for Autoconf macros.
-m4_define([_m4_defun_pro],
-[m4_ifndef([m4_expansion_stack], [_m4_defun_pro_outer[]])dnl
-m4_expansion_stack_push(m4_defn([m4_location($1)])[: $1 is expanded from...])dnl
-m4_pushdef([_m4_expanding($1)])dnl
-])
-
-m4_define([_m4_defun_pro_outer],
-[m4_copy([_m4_divert_diversion], [_m4_divert_dump])dnl
-m4_divert_push([GROW])dnl
-])
-
-# _m4_defun_epi(MACRO-NAME)
-# -------------------------
-# The Epilogue for Autoconf macros.  MACRO-NAME only helps tracing
-# the PRO/EPI pairs.
-m4_define([_m4_defun_epi],
-[m4_popdef([_m4_expanding($1)])dnl
-m4_expansion_stack_pop()dnl
-m4_ifndef([m4_expansion_stack], [_m4_defun_epi_outer[]])dnl
-m4_provide([$1])dnl
-])
-
-m4_define([_m4_defun_epi_outer],
-[m4_undefine([_m4_divert_dump])dnl
-m4_divert_pop([GROW])dnl
-m4_undivert([GROW])dnl
-])
-
-
-# m4_defun(NAME, EXPANSION)
-# -------------------------
-# Define a macro which automatically provides itself.  Add machinery
-# so the macro automatically switches expansion to the diversion
-# stack if it is not already using it.  In this case, once finished,
-# it will bring back all the code accumulated in the diversion stack.
-# This, combined with m4_require, achieves the topological ordering of
-# macros.  We don't use this macro to define some frequently called
-# macros that are not involved in ordering constraints, to save m4
-# processing.
-m4_define([m4_defun],
-[m4_define([m4_location($1)], m4_location)dnl
-m4_define([$1],
-	  [_m4_defun_pro([$1])$2[]_m4_defun_epi([$1])])])
-
-
-# m4_defun_once(NAME, EXPANSION)
-# ------------------------------
-# As m4_defun, but issues the EXPANSION only once, and warns if used
-# several times.
-m4_define([m4_defun_once],
-[m4_define([m4_location($1)], m4_location)dnl
-m4_define([$1],
-	  [m4_provide_if([$1],
-			 [m4_warn([syntax], [$1 invoked multiple times])],
-			 [_m4_defun_pro([$1])$2[]_m4_defun_epi([$1])])])])
-
-
-# m4_pattern_forbid(ERE, [WHY])
-# -----------------------------
-# Declare that no token matching the extended regular expression ERE
-# should be seen in the output but if...
-m4_define([m4_pattern_forbid], [])
-
-
-# m4_pattern_allow(ERE)
-# ---------------------
-# ... but if that token matches the extended regular expression ERE.
-# Both used via traces.
-m4_define([m4_pattern_allow], [])
-
-
-## ----------------------------- ##
-## Dependencies between macros.  ##
-## ----------------------------- ##
-
-
-# m4_before(THIS-MACRO-NAME, CALLED-MACRO-NAME)
-# ---------------------------------------------
-m4_define([m4_before],
-[m4_provide_if([$2],
-	       [m4_warn([syntax], [$2 was called before $1])])])
-
-
-# m4_require(NAME-TO-CHECK, [BODY-TO-EXPAND = NAME-TO-CHECK])
-# -----------------------------------------------------------
-# If NAME-TO-CHECK has never been expanded (actually, if it is not
-# m4_provide'd), expand BODY-TO-EXPAND *before* the current macro
-# expansion.  Once expanded, emit it in _m4_divert_dump.  Keep track
-# of the m4_require chain in m4_expansion_stack.
-#
-# The normal cases are:
-#
-# - NAME-TO-CHECK == BODY-TO-EXPAND
-#   Which you can use for regular macros with or without arguments, e.g.,
-#     m4_require([AC_PROG_CC], [AC_PROG_CC])
-#     m4_require([AC_CHECK_HEADERS(limits.h)], [AC_CHECK_HEADERS(limits.h)])
-#   which is just the same as
-#     m4_require([AC_PROG_CC])
-#     m4_require([AC_CHECK_HEADERS(limits.h)])
-#
-# - BODY-TO-EXPAND == m4_indir([NAME-TO-CHECK])
-#   In the case of macros with irregular names.  For instance:
-#     m4_require([AC_LANG_COMPILER(C)], [indir([AC_LANG_COMPILER(C)])])
-#   which means `if the macro named `AC_LANG_COMPILER(C)' (the parens are
-#   part of the name, it is not an argument) has not been run, then
-#   call it.'
-#   Had you used
-#     m4_require([AC_LANG_COMPILER(C)], [AC_LANG_COMPILER(C)])
-#   then m4_require would have tried to expand `AC_LANG_COMPILER(C)', i.e.,
-#   call the macro `AC_LANG_COMPILER' with `C' as argument.
-#
-#   You could argue that `AC_LANG_COMPILER', when it receives an argument
-#   such as `C' should dispatch the call to `AC_LANG_COMPILER(C)'.  But this
-#   `extension' prevents `AC_LANG_COMPILER' from having actual arguments that
-#   it passes to `AC_LANG_COMPILER(C)'.
-m4_define([m4_require],
-[m4_ifdef([_m4_expanding($1)],
-	 [m4_fatal([$0: circular dependency of $1])])dnl
-m4_ifndef([_m4_divert_dump],
-	  [m4_fatal([$0($1): cannot be used outside of an m4_defun'd macro])])dnl
-m4_provide_if([$1],
-	      [],
-	      [_m4_require_call([$1], [$2])])dnl
-])
-
-
-# _m4_require_call(BODY-TO-EXPAND)
-# --------------------------------
-# If m4_require decides to expand the body, it calls this macro.
-m4_define([_m4_require_call],
-[m4_define([_m4_divert_grow], m4_decr(_m4_divert_grow))dnl
-m4_divert_push(_m4_divert_grow)dnl
-m4_default([$2], [$1])
-m4_provide_if([$1],
-	      [],
-	      [m4_warn([syntax],
-		       [$1 is m4_require'd but not m4_defun'd])])dnl
-m4_divert(m4_defn([_m4_divert_dump]))dnl
-m4_undivert(_m4_divert_grow)dnl
-m4_divert_pop(_m4_divert_grow)dnl
-m4_define([_m4_divert_grow], m4_incr(_m4_divert_grow))dnl
-])
-
-
-# _m4_divert_grow
-# ---------------
-# The counter for _m4_require_call.
-m4_define([_m4_divert_grow], _m4_divert([GROW]))
-
-
-# m4_expand_once(TEXT, [WITNESS = TEXT])
-# --------------------------------------
-# If TEXT has never been expanded, expand it *here*.  Use WITNESS as
-# as a memory that TEXT has already been expanded.
-m4_define([m4_expand_once],
-[m4_provide_if(m4_ifval([$2], [[$2]], [[$1]]),
-	       [],
-	       [m4_provide(m4_ifval([$2], [[$2]], [[$1]]))[]$1])])
-
-
-# m4_provide(MACRO-NAME)
-# ----------------------
-m4_define([m4_provide],
-[m4_define([m4_provide($1)])])
-
-
-# m4_provide_if(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
-# -------------------------------------------------------
-# If MACRO-NAME is provided do IF-PROVIDED, else IF-NOT-PROVIDED.
-# The purpose of this macro is to provide the user with a means to
-# check macros which are provided without letting her know how the
-# information is coded.
-m4_define([m4_provide_if],
-[m4_ifdef([m4_provide($1)],
-	  [$2], [$3])])
-
-
-## -------------------- ##
-## 9. Text processing.  ##
-## -------------------- ##
-
-
-# m4_cr_letters
-# m4_cr_LETTERS
-# m4_cr_Letters
-# -------------
-m4_define([m4_cr_letters], [abcdefghijklmnopqrstuvwxyz])
-m4_define([m4_cr_LETTERS], [ABCDEFGHIJKLMNOPQRSTUVWXYZ])
-m4_define([m4_cr_Letters],
-m4_defn([m4_cr_letters])dnl
-m4_defn([m4_cr_LETTERS])dnl
-)
-
-
-# m4_cr_digits
-# ------------
-m4_define([m4_cr_digits], [0123456789])
-
-
-# m4_cr_symbols1 & m4_cr_symbols2
-# -------------------------------
-m4_define([m4_cr_symbols1],
-m4_defn([m4_cr_Letters])dnl
-_)
-
-m4_define([m4_cr_symbols2],
-m4_defn([m4_cr_symbols1])dnl
-m4_defn([m4_cr_digits])dnl
-)
-
-
-# m4_re_escape(STRING)
-# --------------------
-# Escape RE active characters in STRING.
-m4_define([m4_re_escape],
-[m4_bpatsubst([$1],
-	      [[][*+.?\^$]], [\\\&])])
-
-
-# m4_re_string
-# ------------
-# Regexp for `[a-zA-Z_0-9]*'
-# m4_dquote provides literal [] for the character class.
-m4_define([m4_re_string],
-m4_dquote(m4_defn([m4_cr_symbols2]))dnl
-[*]dnl
-)
-
-
-# m4_re_word
-# ----------
-# Regexp for `[a-zA-Z_][a-zA-Z_0-9]*'
-m4_define([m4_re_word],
-m4_dquote(m4_defn([m4_cr_symbols1]))dnl
-m4_defn([m4_re_string])dnl
-)
-
-
-# m4_tolower(STRING)
-# m4_toupper(STRING)
-# ------------------
-# These macros lowercase and uppercase strings.
-m4_define([m4_tolower],
-[m4_translit([$1], m4_defn([m4_cr_LETTERS]), m4_defn([m4_cr_letters]))])
-m4_define([m4_toupper],
-[m4_translit([$1], m4_defn([m4_cr_letters]), m4_defn([m4_cr_LETTERS]))])
-
-
-# m4_split(STRING, [REGEXP])
-# --------------------------
-#
-# Split STRING into an m4 list of quoted elements.  The elements are
-# quoted with [ and ].  Beginning spaces and end spaces *are kept*.
-# Use m4_strip to remove them.
-#
-# REGEXP specifies where to split.  Default is [\t ]+.
-#
-# If STRING is empty, the result is an empty list.
-#
-# Pay attention to the m4_changequotes.  When m4 reads the definition of
-# m4_split, it still has quotes set to [ and ].  Luckily, these are matched
-# in the macro body, so the definition is stored correctly.
-#
-# Also, notice that $1 is quoted twice, since we want the result to
-# be quoted.  Then you should understand that the argument of
-# patsubst is ``STRING'' (i.e., with additional `` and '').
-#
-# This macro is safe on active symbols, i.e.:
-#   m4_define(active, ACTIVE)
-#   m4_split([active active ])end
-#   => [active], [active], []end
-
-m4_define([m4_split],
-[m4_ifval([$1], [_m4_split($@)])])
-
-m4_define([_m4_split],
-[m4_changequote(``, '')dnl
-[dnl Can't use m4_default here instead of m4_if, because m4_default uses
-dnl [ and ] as quotes.
-m4_bpatsubst(````$1'''',
-	     m4_if(``$2'',, ``[	 ]+'', ``$2''),
-	     ``], ['')]dnl
-m4_changequote([, ])])
-
-
-
-# m4_flatten(STRING)
-# ------------------
-# If STRING contains end of lines, replace them with spaces.  If there
-# are backslashed end of lines, remove them.  This macro is safe with
-# active symbols.
-#    m4_define(active, ACTIVE)
-#    m4_flatten([active
-#    act\
-#    ive])end
-#    => active activeend
-m4_define([m4_flatten],
-[m4_translit(m4_bpatsubst([[[$1]]], [\\
-]), [
-], [ ])])
-
-
-# m4_strip(STRING)
-# ----------------
-# Expands into STRING with tabs and spaces singled out into a single
-# space, and removing leading and trailing spaces.
-#
-# This macro is robust to active symbols.
-#    m4_define(active, ACTIVE)
-#    m4_strip([  active <tab> <tab>active ])end
-#    => active activeend
-#
-# Because we want to preserve active symbols, STRING must be double-quoted.
-#
-# Then notice the 2 last patterns: they are in charge of removing the
-# leading/trailing spaces.  Why not just `[^ ]'?  Because they are
-# applied to doubly quoted strings, i.e. more or less [[STRING]].  So
-# if there is a leading space in STRING, then it is the *third*
-# character, since there are two leading `['; equally for the last pattern.
-m4_define([m4_strip],
-[m4_bpatsubsts([[$1]],
-	       [[	 ]+], [ ],
-	       [^\(..\) ],    [\1],
-	       [ \(..\)$],    [\1])])
-
-
-# m4_normalize(STRING)
-# --------------------
-# Apply m4_flatten and m4_strip to STRING.
-#
-# The argument is quoted, so that the macro is robust to active symbols:
-#
-#    m4_define(active, ACTIVE)
-#    m4_normalize([  act\
-#    ive
-#    active ])end
-#    => active activeend
-
-m4_define([m4_normalize],
-[m4_strip(m4_flatten([$1]))])
-
-
-
-# m4_join(SEP, ARG1, ARG2...)
-# ---------------------------
-# Produce ARG1SEPARG2...SEPARGn.
-m4_defun([m4_join],
-[m4_case([$#],
-	 [1], [],
-	 [2], [[$2]],
-	 [[$2][$1]$0([$1], m4_shiftn(2, $@))])])
-
-
-
-# m4_append(MACRO-NAME, STRING, [SEPARATOR])
-# ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR`'STRING'
-# at the end.  It is valid to use this macro with MACRO-NAME undefined,
-# in which case no SEPARATOR is added.  Be aware that the criterion is
-# `not being defined', and not `not being empty'.
-#
-# This macro is robust to active symbols.  It can be used to grow
-# strings.
-#
-#    | m4_define(active, ACTIVE)
-#    | m4_append([sentence], [This is an])
-#    | m4_append([sentence], [ active ])
-#    | m4_append([sentence], [symbol.])
-#    | sentence
-#    | m4_undefine([active])dnl
-#    | sentence
-#    => This is an ACTIVE symbol.
-#    => This is an active symbol.
-#
-# It can be used to define hooks.
-#
-#    | m4_define(active, ACTIVE)
-#    | m4_append([hooks], [m4_define([act1], [act2])])
-#    | m4_append([hooks], [m4_define([act2], [active])])
-#    | m4_undefine([active])
-#    | act1
-#    | hooks
-#    | act1
-#    => act1
-#    =>
-#    => active
-m4_define([m4_append],
-[m4_define([$1],
-	   m4_ifdef([$1], [m4_defn([$1])$3])[$2])])
-
-# m4_prepend(MACRO-NAME, STRING, [SEPARATOR])
-# -------------------------------------------
-# Same, but prepend.
-m4_define([m4_prepend],
-[m4_define([$1],
-	   [$2]m4_ifdef([$1], [$3[]m4_defn([$1])]))])
-
-# m4_append_uniq(MACRO-NAME, STRING, [SEPARATOR])
-# -----------------------------------------------
-# As `m4_append', but append only if not yet present.
-m4_define([m4_append_uniq],
-[m4_ifdef([$1],
-	  [m4_bmatch([$3]m4_defn([$1])[$3], m4_re_escape([$3$2$3]), [],
-		     [m4_append($@)])],
-	  [m4_append($@)])])
-
-
-# m4_text_wrap(STRING, [PREFIX], [FIRST-PREFIX], [WIDTH])
-# -------------------------------------------------------
-# Expands into STRING wrapped to hold in WIDTH columns (default = 79).
-# If PREFIX is given, each line is prefixed with it.  If FIRST-PREFIX is
-# specified, then the first line is prefixed with it.  As a special case,
-# if the length of FIRST-PREFIX is greater than that of PREFIX, then
-# FIRST-PREFIX will be left alone on the first line.
-#
-# Typical outputs are:
-#
-# m4_text_wrap([Short string */], [   ], [/* ], 20)
-#  => /* Short string */
-#
-# m4_text_wrap([Much longer string */], [   ], [/* ], 20)
-#  => /* Much longer
-#  =>    string */
-#
-# m4_text_wrap([Short doc.], [          ], [  --short ], 30)
-#  =>   --short Short doc.
-#
-# m4_text_wrap([Short doc.], [          ], [  --too-wide ], 30)
-#  =>   --too-wide
-#  =>           Short doc.
-#
-# m4_text_wrap([Super long documentation.], [          ], [  --too-wide ], 30)
-#  =>   --too-wide
-#  =>      Super long
-#  =>      documentation.
-#
-# FIXME: there is no checking of a longer PREFIX than WIDTH, but do
-# we really want to bother with people trying each single corner
-# of a software?
-#
-# more important:
-# FIXME: handle quadrigraphs correctly, both in TEXT and in FIRST_PREFIX.
-#
-# This macro does not leave a trailing space behind the last word,
-# what complicates it a bit.  The algorithm is stupid simple: all the
-# words are preceded by m4_Separator which is defined to empty for the
-# first word, and then ` ' (single space) for all the others.
-m4_define([m4_text_wrap],
-[m4_pushdef([m4_Prefix], [$2])dnl
-m4_pushdef([m4_Prefix1], m4_default([$3], [m4_Prefix]))dnl
-m4_pushdef([m4_Width], m4_default([$4], 79))dnl
-m4_pushdef([m4_Cursor], m4_len(m4_Prefix1))dnl
-m4_pushdef([m4_Separator], [])dnl
-m4_Prefix1[]dnl
-m4_if(m4_eval(m4_Cursor > m4_len(m4_Prefix)),
-      1, [m4_define([m4_Cursor], m4_len(m4_Prefix))
-m4_Prefix])[]dnl
-m4_foreach_w([m4_Word], [$1],
-[m4_define([m4_Cursor], m4_eval(m4_Cursor + m4_len(m4_defn([m4_Word])) + 1))dnl
-dnl New line if too long, else insert a space unless it is the first
-dnl of the words.
-m4_if(m4_eval(m4_Cursor > m4_Width),
-      1, [m4_define([m4_Cursor],
-		    m4_eval(m4_len(m4_Prefix) + m4_len(m4_defn([m4_Word])) + 1))]
-m4_Prefix,
-       [m4_Separator])[]dnl
-m4_defn([m4_Word])[]dnl
-m4_define([m4_Separator], [ ])])dnl
-m4_popdef([m4_Separator])dnl
-m4_popdef([m4_Cursor])dnl
-m4_popdef([m4_Width])dnl
-m4_popdef([m4_Prefix1])dnl
-m4_popdef([m4_Prefix])dnl
-])
-
-
-# m4_text_box(MESSAGE, [FRAME-CHARACTER = `-'])
-# ---------------------------------------------
-m4_define([m4_text_box],
-[@%:@@%:@ m4_bpatsubst([$1], [.], m4_if([$2], [], [[-]], [[$2]])) @%:@@%:@
-@%:@@%:@ $1 @%:@@%:@
-@%:@@%:@ m4_bpatsubst([$1], [.], m4_if([$2], [], [[-]], [[$2]])) @%:@@%:@[]dnl
-])
-
-
-# m4_qlen(STRING)
-# ---------------
-# Expands to the length of STRING after autom4te converts all quadrigraphs.
-m4_define([m4_qlen],
-[m4_len(m4_bpatsubsts([[$1]], [@\(<:\|:>\|S|\|%:\)@], [P], [@&t@]))])
-
-
-# m4_qdelta(STRING)
-# -----------------
-# Expands to the net change in the length of STRING from autom4te converting the
-# quadrigraphs in STRING.  This number is always negative or zero.
-m4_define([m4_qdelta],
-[m4_eval(m4_qlen([$1]) - m4_len([$1]))])
-
-
-
-## ----------------------- ##
-## 10. Number processing.  ##
-## ----------------------- ##
-
-# m4_sign(A)
-# ----------
-#
-# The sign of the integer A.
-m4_define([m4_sign],
-[m4_bmatch([$1],
-	   [^-], -1,
-	   [^0+], 0,
-		  1)])
-
-# m4_cmp(A, B)
-# ------------
-#
-# Compare two integers.
-# A < B -> -1
-# A = B ->  0
-# A > B ->  1
-m4_define([m4_cmp],
-[m4_sign(m4_eval([$1 - $2]))])
-
-
-# m4_list_cmp(A, B)
-# -----------------
-#
-# Compare the two lists of integers A and B.  For instance:
-#   m4_list_cmp((1, 0),     (1))    ->  0
-#   m4_list_cmp((1, 0),     (1, 0)) ->  0
-#   m4_list_cmp((1, 2),     (1, 0)) ->  1
-#   m4_list_cmp((1, 2, 3),  (1, 2)) ->  1
-#   m4_list_cmp((1, 2, -3), (1, 2)) -> -1
-#   m4_list_cmp((1, 0),     (1, 2)) -> -1
-#   m4_list_cmp((1),        (1, 2)) -> -1
-m4_define([m4_list_cmp],
-[m4_if([$1$2], [()()], 0,
-       [$1], [()], [$0((0), [$2])],
-       [$2], [()], [$0([$1], (0))],
-       [m4_case(m4_cmp(m4_car$1, m4_car$2),
-		-1, -1,
-		 1, 1,
-		 0, [$0((m4_shift$1), (m4_shift$2))])])])
-
-
-
-## ------------------------ ##
-## 11. Version processing.  ##
-## ------------------------ ##
-
-
-# m4_version_unletter(VERSION)
-# ----------------------------
-# Normalize beta version numbers with letters to numbers only for comparison.
-#
-#   Nl -> (N+1).-1.(l#)
-#
-#i.e., 2.14a -> 2.15.-1.1, 2.14b -> 2.15.-1.2, etc.
-# This macro is absolutely not robust to active macro, it expects
-# reasonable version numbers and is valid up to `z', no double letters.
-m4_define([m4_version_unletter],
-[m4_translit(m4_bpatsubsts([$1],
-			   [\([0-9]+\)\([abcdefghi]\)],
-			     [m4_eval(\1 + 1).-1.\2],
-			   [\([0-9]+\)\([jklmnopqrs]\)],
-			     [m4_eval(\1 + 1).-1.1\2],
-			   [\([0-9]+\)\([tuvwxyz]\)],
-			     [m4_eval(\1 + 1).-1.2\2]),
-	     [abcdefghijklmnopqrstuvwxyz],
-	     [12345678901234567890123456])])
-
-
-# m4_version_compare(VERSION-1, VERSION-2)
-# ----------------------------------------
-# Compare the two version numbers and expand into
-#  -1 if VERSION-1 < VERSION-2
-#   0 if           =
-#   1 if           >
-m4_define([m4_version_compare],
-[m4_list_cmp((m4_split(m4_version_unletter([$1]), [\.])),
-	     (m4_split(m4_version_unletter([$2]), [\.])))])
-
-
-# m4_PACKAGE_NAME
-# m4_PACKAGE_TARNAME
-# m4_PACKAGE_VERSION
-# m4_PACKAGE_STRING
-# m4_PACKAGE_BUGREPORT
-# --------------------
-#m4_include([m4sugar/version.m4]) # This is needed for Autoconf, but not Bison.
-
-
-# m4_version_prereq(VERSION, [IF-OK], [IF-NOT = FAIL])
-# ----------------------------------------------------
-# Check this Autoconf version against VERSION.
-m4_define([m4_version_prereq],
-[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]), [$1]), -1,
-       [m4_default([$3],
-		   [m4_fatal([Autoconf version $1 or higher is required],
-			     63)])],
-       [$2])[]dnl
-])
-
-
-
-## ------------------- ##
-## 12. File handling.  ##
-## ------------------- ##
-
-
-# It is a real pity that M4 comes with no macros to bind a diversion
-# to a file.  So we have to deal without, which makes us a lot more
-# fragile that we should.
-
-
-# m4_file_append(FILE-NAME, CONTENT)
-# ----------------------------------
-m4_define([m4_file_append],
-[m4_syscmd([cat >>$1 <<_m4eof
-$2
-_m4eof
-])
-m4_if(m4_sysval, [0], [],
-      [m4_fatal([$0: cannot write: $1])])])
-
-
-
-## ------------------------ ##
-## 13. Setting M4sugar up.  ##
-## ------------------------ ##
-
-
-# m4_init
-# -------
-m4_define([m4_init],
-[# All the M4sugar macros start with `m4_', except `dnl' kept as is
-# for sake of simplicity.
-m4_pattern_forbid([^_?m4_])
-m4_pattern_forbid([^dnl$])
-
-# Check the divert push/pop perfect balance.
-m4_wrap([m4_ifdef([_m4_divert_diversion],
-	   [m4_fatal([$0: unbalanced m4_divert_push:]_m4_divert_n_stack)])[]])
-
-m4_divert_push([KILL])
-m4_wrap([m4_divert_pop([KILL])[]])
-])
diff --git a/data/yacc.c b/data/yacc.c
deleted file mode 100644
index 1e8fa56..0000000
--- a/data/yacc.c
+++ /dev/null
@@ -1,1529 +0,0 @@
-m4_divert(-1)                                                -*- C -*-
-
-# Yacc compatible skeleton for Bison
-
-# Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-# 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 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
-
-m4_include(b4_pkgdatadir/[c.m4])
-
-## ---------------- ##
-## Default values.  ##
-## ---------------- ##
-
-# Stack parameters.
-m4_define_default([b4_stack_depth_max], [10000])
-m4_define_default([b4_stack_depth_init],  [200])
-
-
-## ------------------------ ##
-## Pure/impure interfaces.  ##
-## ------------------------ ##
-
-
-# b4_yacc_pure_if(IF-TRUE, IF-FALSE)
-# ----------------------------------
-# Expand IF-TRUE, if %pure-parser and %parse-param, IF-FALSE otherwise.
-m4_define([b4_yacc_pure_if],
-[b4_pure_if([m4_ifset([b4_parse_param],
-		      [$1], [$2])],
-	    [$2])])
-
-
-# b4_yyerror_args
-# ---------------
-# Arguments passed to yyerror: user args plus yylloc.
-m4_define([b4_yyerror_args],
-[b4_yacc_pure_if([b4_locations_if([&yylloc, ])])dnl
-m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
-
-
-# b4_lex_param
-# ------------
-# Accumulate in b4_lex_param all the yylex arguments.
-# b4_lex_param arrives quoted twice, but we want to keep only one level.
-m4_define([b4_lex_param],
-m4_dquote(b4_pure_if([[[[YYSTYPE *]], [[&yylval]]][]dnl
-b4_locations_if([, [[YYLTYPE *], [&yylloc]]])m4_ifdef([b4_lex_param], [, ])])dnl
-m4_ifdef([b4_lex_param], b4_lex_param)))
-
-
-
-## ------------ ##
-## Data Types.  ##
-## ------------ ##
-
-# b4_int_type(MIN, MAX)
-# ---------------------
-# Return the smallest int type able to handle numbers ranging from
-# MIN to MAX (included).  Overwrite the version from c.m4, which
-# uses only C89 types, so that the user can override the shorter
-# types, and so that pre-C89 compilers are handled correctly.
-m4_define([b4_int_type],
-[m4_if(b4_ints_in($@,      [0],   [255]), [1], [yytype_uint8],
-       b4_ints_in($@,   [-128],   [127]), [1], [yytype_int8],
-
-       b4_ints_in($@,      [0], [65535]), [1], [yytype_uint16],
-       b4_ints_in($@, [-32768], [32767]), [1], [yytype_int16],
-
-       m4_eval([0 <= $1]),                [1], [unsigned int],
-
-					       [int])])
-
-
-## ----------------- ##
-## Semantic Values.  ##
-## ----------------- ##
-
-
-# b4_lhs_value([TYPE])
-# --------------------
-# Expansion of $<TYPE>$.
-m4_define([b4_lhs_value],
-[(yyval[]m4_ifval([$1], [.$1]))])
-
-
-# b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
-# --------------------------------------
-# Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
-# symbols on RHS.
-m4_define([b4_rhs_value],
-[(yyvsp@{($2) - ($1)@}m4_ifval([$3], [.$3]))])
-
-
-
-## ----------- ##
-## Locations.  ##
-## ----------- ##
-
-# b4_lhs_location()
-# -----------------
-# Expansion of @$.
-m4_define([b4_lhs_location],
-[(yyloc)])
-
-
-# b4_rhs_location(RULE-LENGTH, NUM)
-# ---------------------------------
-# Expansion of @NUM, where the current rule has RULE-LENGTH symbols
-# on RHS.
-m4_define([b4_rhs_location],
-[(yylsp@{($2) - ($1)@})])
-
-
-
-## --------------------------------------------------------- ##
-## Defining symbol actions, e.g., printers and destructors.  ##
-## --------------------------------------------------------- ##
-
-# We do want M4 expansion after # for CPP macros.
-m4_changecom()
-m4_divert(0)dnl
-@output @output_parser_name@
-b4_copyright([Skeleton implementation for Bison's Yacc-like parsers in C],dnl '
-  [1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006])[
-
-/* C LALR(1) parser skeleton written by Richard Stallman, by
-   simplifying the original so-called "semantic" parser.  */
-
-/* All symbols defined below should begin with yy or YY, to avoid
-   infringing on user name space.  This should be done even for local
-   variables, as they might otherwise be expanded by user macros.
-   There are some unavoidable exceptions within include files to
-   define necessary library symbols; they are noted "INFRINGES ON
-   USER NAME SPACE" below.  */
-
-]b4_identification
-m4_if(b4_prefix, [yy], [],
-[/* Substitute the variable and function names.  */
-#define yyparse b4_prefix[]parse
-#define yylex   b4_prefix[]lex
-#define yyerror b4_prefix[]error
-#define yylval  b4_prefix[]lval
-#define yychar  b4_prefix[]char
-#define yydebug b4_prefix[]debug
-#define yynerrs b4_prefix[]nerrs
-b4_locations_if([#define yylloc b4_prefix[]lloc])])[
-
-]b4_token_enums_defines(b4_tokens)[
-
-/* Copy the first part of user declarations.  */
-]b4_pre_prologue[
-
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG ]b4_debug_flag[
-#endif
-
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE ]b4_error_verbose_flag[
-#endif
-
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE ]b4_token_table[
-#endif
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-]m4_ifdef([b4_stype],
-[typedef union[]m4_bregexp(b4_stype, [^{], [ YYSTYPE])
-b4_stype
-/* Line __line__ of yacc.c.  */
-b4_syncline([@oline@], [@ofile@])
-	YYSTYPE;],
-[typedef int YYSTYPE;])[
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-]b4_locations_if([#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
-typedef struct YYLTYPE
-{
-  int first_line;
-  int first_column;
-  int last_line;
-  int last_column;
-} YYLTYPE;
-# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
-# define YYLTYPE_IS_DECLARED 1
-# define YYLTYPE_IS_TRIVIAL 1
-#endif
-])[
-
-/* Copy the second part of user declarations.  */
-]b4_post_prologue
-
-/* Line __line__ of yacc.c.  */
-b4_syncline([@oline@], [@ofile@])[
-
-#ifdef short
-# undef short
-#endif
-
-#ifdef YYTYPE_UINT8
-typedef YYTYPE_UINT8 yytype_uint8;
-#else
-typedef unsigned char yytype_uint8;
-#endif
-
-#ifdef YYTYPE_INT8
-typedef YYTYPE_INT8 yytype_int8;
-#elif ]b4_c_modern[
-typedef signed char yytype_int8;
-#else
-typedef short int yytype_int8;
-#endif
-
-#ifdef YYTYPE_UINT16
-typedef YYTYPE_UINT16 yytype_uint16;
-#else
-typedef unsigned short int yytype_uint16;
-#endif
-
-#ifdef YYTYPE_INT16
-typedef YYTYPE_INT16 yytype_int16;
-#else
-typedef short int yytype_int16;
-#endif
-
-#ifndef YYSIZE_T
-# ifdef __SIZE_TYPE__
-#  define YYSIZE_T __SIZE_TYPE__
-# elif defined size_t
-#  define YYSIZE_T size_t
-# elif ! defined YYSIZE_T && ]b4_c_modern[
-#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-#  define YYSIZE_T size_t
-# else
-#  define YYSIZE_T unsigned int
-# endif
-#endif
-
-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
-
-#ifndef YY_
-# if YYENABLE_NLS
-#  if ENABLE_NLS
-#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-#   define YY_(msgid) dgettext ("bison-runtime", msgid)
-#  endif
-# endif
-# ifndef YY_
-#  define YY_(msgid) msgid
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E.  */
-#if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
-#else
-# define YYUSE(e) /* empty */
-#endif
-
-/* Identity function, used to suppress warnings about constant conditions.  */
-#ifndef lint
-# define YYID(n) (n)
-#else
-]b4_c_function_def([YYID], [static int], [[int i], [i]])[
-{
-  return i;
-}
-#endif
-
-#if ! defined yyoverflow || YYERROR_VERBOSE
-
-/* The parser invokes alloca or malloc; define the necessary symbols.  */
-
-# ifdef YYSTACK_USE_ALLOCA
-#  if YYSTACK_USE_ALLOCA
-#   ifdef __GNUC__
-#    define YYSTACK_ALLOC __builtin_alloca
-#   elif defined __BUILTIN_VA_ARG_INCR
-#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
-#   elif defined _AIX
-#    define YYSTACK_ALLOC __alloca
-#   elif defined _MSC_VER
-#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
-#    define alloca _alloca
-#   else
-#    define YYSTACK_ALLOC alloca
-#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && ]b4_c_modern[
-#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#     ifndef _STDLIB_H
-#      define _STDLIB_H 1
-#     endif
-#    endif
-#   endif
-#  endif
-# endif
-
-# ifdef YYSTACK_ALLOC
-   /* Pacify GCC's `empty if-body' warning.  */
-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
-#  ifndef YYSTACK_ALLOC_MAXIMUM
-    /* The OS might guarantee only one guard page at the bottom of the stack,
-       and a page size can be as small as 4096 bytes.  So we cannot safely
-       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
-       to allow for a few compiler-allocated temporary stack slots.  */
-#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
-#  endif
-# else
-#  define YYSTACK_ALLOC YYMALLOC
-#  define YYSTACK_FREE YYFREE
-#  ifndef YYSTACK_ALLOC_MAXIMUM
-#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
-#  endif
-#  if (defined __cplusplus && ! defined _STDLIB_H \
-       && ! ((defined YYMALLOC || defined malloc) \
-	     && (defined YYFREE || defined free)))
-#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#   ifndef _STDLIB_H
-#    define _STDLIB_H 1
-#   endif
-#  endif
-#  ifndef YYMALLOC
-#   define YYMALLOC malloc
-#   if ! defined malloc && ! defined _STDLIB_H && ]b4_c_modern[
-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-#   endif
-#  endif
-#  ifndef YYFREE
-#   define YYFREE free
-#   if ! defined free && ! defined _STDLIB_H && ]b4_c_modern[
-void free (void *); /* INFRINGES ON USER NAME SPACE */
-#   endif
-#  endif
-# endif
-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
-
-
-#if (! defined yyoverflow \
-     && (! defined __cplusplus \
-	 || (]b4_locations_if([[defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
-	     && ]])[defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member.  */
-union yyalloc
-{
-  yytype_int16 yyss;
-  YYSTYPE yyvs;
-  ]b4_locations_if([  YYLTYPE yyls;
-])dnl
-[};
-
-/* The size of the maximum gap between one aligned stack and the next.  */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
-   N elements.  */
-]b4_locations_if(
-[# define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
-      + 2 * YYSTACK_GAP_MAXIMUM)],
-[# define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
-      + YYSTACK_GAP_MAXIMUM)])[
-
-/* Copy COUNT objects from FROM to TO.  The source and destination do
-   not overlap.  */
-# ifndef YYCOPY
-#  if defined __GNUC__ && 1 < __GNUC__
-#   define YYCOPY(To, From, Count) \
-      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-#  else
-#   define YYCOPY(To, From, Count)		\
-      do					\
-	{					\
-	  YYSIZE_T yyi;				\
-	  for (yyi = 0; yyi < (Count); yyi++)	\
-	    (To)[yyi] = (From)[yyi];		\
-	}					\
-      while (YYID (0))
-#  endif
-# endif
-
-/* Relocate STACK from its old location to the new one.  The
-   local variables YYSIZE and YYSTACKSIZE give the old and new number of
-   elements in the stack, and YYPTR gives the new location of the
-   stack.  Advance YYPTR to a properly aligned location for the next
-   stack.  */
-# define YYSTACK_RELOCATE(Stack)					\
-    do									\
-      {									\
-	YYSIZE_T yynewbytes;						\
-	YYCOPY (&yyptr->Stack, Stack, yysize);				\
-	Stack = &yyptr->Stack;						\
-	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-	yyptr += yynewbytes / sizeof (*yyptr);				\
-      }									\
-    while (YYID (0))
-
-#endif
-
-/* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  ]b4_final_state_number[
-/* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   ]b4_last[
-
-/* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  ]b4_tokens_number[
-/* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  ]b4_nterms_number[
-/* YYNRULES -- Number of rules.  */
-#define YYNRULES  ]b4_rules_number[
-/* YYNRULES -- Number of states.  */
-#define YYNSTATES  ]b4_states_number[
-
-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
-#define YYUNDEFTOK  ]b4_undef_token_number[
-#define YYMAXUTOK   ]b4_user_token_number_max[
-
-#define YYTRANSLATE(YYX)						\
-  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
-static const ]b4_int_type_for([b4_translate])[ yytranslate[] =
-{
-  ]b4_translate[
-};
-
-#if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-   YYRHS.  */
-static const ]b4_int_type_for([b4_prhs])[ yyprhs[] =
-{
-  ]b4_prhs[
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
-static const ]b4_int_type_for([b4_rhs])[ yyrhs[] =
-{
-  ]b4_rhs[
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-static const ]b4_int_type_for([b4_rline])[ yyrline[] =
-{
-  ]b4_rline[
-};
-#endif
-
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
-static const char *const yytname[] =
-{
-  ]b4_tname[
-};
-#endif
-
-# ifdef YYPRINT
-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
-   token YYLEX-NUM.  */
-static const ]b4_int_type_for([b4_toknum])[ yytoknum[] =
-{
-  ]b4_toknum[
-};
-# endif
-
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const ]b4_int_type_for([b4_r1])[ yyr1[] =
-{
-  ]b4_r1[
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-static const ]b4_int_type_for([b4_r2])[ yyr2[] =
-{
-  ]b4_r2[
-};
-
-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
-   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
-   means the default is an error.  */
-static const ]b4_int_type_for([b4_defact])[ yydefact[] =
-{
-  ]b4_defact[
-};
-
-/* YYDEFGOTO[NTERM-NUM].  */
-static const ]b4_int_type_for([b4_defgoto])[ yydefgoto[] =
-{
-  ]b4_defgoto[
-};
-
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-   STATE-NUM.  */
-#define YYPACT_NINF ]b4_pact_ninf[
-static const ]b4_int_type_for([b4_pact])[ yypact[] =
-{
-  ]b4_pact[
-};
-
-/* YYPGOTO[NTERM-NUM].  */
-static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] =
-{
-  ]b4_pgoto[
-};
-
-/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
-   positive, shift that token.  If negative, reduce the rule which
-   number is the opposite.  If zero, do what YYDEFACT says.
-   If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF ]b4_table_ninf[
-static const ]b4_int_type_for([b4_table])[ yytable[] =
-{
-  ]b4_table[
-};
-
-static const ]b4_int_type_for([b4_check])[ yycheck[] =
-{
-  ]b4_check[
-};
-
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-   symbol of state STATE-NUM.  */
-static const ]b4_int_type_for([b4_stos])[ yystos[] =
-{
-  ]b4_stos[
-};
-
-#define yyerrok		(yyerrstatus = 0)
-#define yyclearin	(yychar = YYEMPTY)
-#define YYEMPTY		(-2)
-#define YYEOF		0
-
-#define YYACCEPT	goto yyacceptlab
-#define YYABORT		goto yyabortlab
-#define YYERROR		goto yyerrorlab
-
-
-/* Like YYERROR except do call yyerror.  This remains here temporarily
-   to ease the transition to the new meaning of YYERROR, for GCC.
-   Once GCC version 2 has supplanted version 1, this can go.  */
-
-#define YYFAIL		goto yyerrlab
-
-#define YYRECOVERING()  (!!yyerrstatus)
-
-#define YYBACKUP(Token, Value)					\
-do								\
-  if (yychar == YYEMPTY && yylen == 1)				\
-    {								\
-      yychar = (Token);						\
-      yylval = (Value);						\
-      yytoken = YYTRANSLATE (yychar);				\
-      YYPOPSTACK (1);						\
-      goto yybackup;						\
-    }								\
-  else								\
-    {								\
-      yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")); \
-      YYERROR;							\
-    }								\
-while (YYID (0))
-
-
-#define YYTERROR	1
-#define YYERRCODE	256
-
-
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-   If N is 0, then set CURRENT to the empty location which ends
-   the previous symbol: RHS[0] (always defined).  */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)				\
-    do									\
-      if (YYID (N))                                                    \
-	{								\
-	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
-	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
-	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
-	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
-	}								\
-      else								\
-	{								\
-	  (Current).first_line   = (Current).last_line   =		\
-	    YYRHSLOC (Rhs, 0).last_line;				\
-	  (Current).first_column = (Current).last_column =		\
-	    YYRHSLOC (Rhs, 0).last_column;				\
-	}								\
-    while (YYID (0))
-#endif
-
-
-/* YY_LOCATION_PRINT -- Print the location on the stream.
-   This macro was not mandated originally: define only if we know
-   we won't break user code: when these are the locations we know.  */
-
-#ifndef YY_LOCATION_PRINT
-# if YYLTYPE_IS_TRIVIAL
-#  define YY_LOCATION_PRINT(File, Loc)			\
-     fprintf (File, "%d.%d-%d.%d",			\
-	      (Loc).first_line, (Loc).first_column,	\
-	      (Loc).last_line,  (Loc).last_column)
-# else
-#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-# endif
-#endif
-
-
-/* YYLEX -- calling `yylex' with the right arguments.  */
-
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (]b4_pure_if([&yylval[]b4_locations_if([, &yylloc]), ])[YYLEX_PARAM)
-#else
-# define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[
-#endif
-
-/* Enable debugging if requested.  */
-#if YYDEBUG
-
-# ifndef YYFPRINTF
-#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
-#  define YYFPRINTF fprintf
-# endif
-
-# define YYDPRINTF(Args)			\
-do {						\
-  if (yydebug)					\
-    YYFPRINTF Args;				\
-} while (YYID (0))
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
-do {									  \
-  if (yydebug)								  \
-    {									  \
-      YYFPRINTF (stderr, "%s ", Title);					  \
-      yy_symbol_print (stderr,						  \
-		  Type, Value]b4_locations_if([, Location])[]b4_user_args[); \
-      YYFPRINTF (stderr, "\n");						  \
-    }									  \
-} while (YYID (0))
-
-]b4_yy_symbol_print_generate([b4_c_function_def])[
-
-/*------------------------------------------------------------------.
-| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-| TOP (included).                                                   |
-`------------------------------------------------------------------*/
-
-]b4_c_function_def([yy_stack_print], [static void],
-		   [[yytype_int16 *bottom], [bottom]],
-		   [[yytype_int16 *top],    [top]])[
-{
-  YYFPRINTF (stderr, "Stack now");
-  for (; bottom <= top; ++bottom)
-    YYFPRINTF (stderr, " %d", *bottom);
-  YYFPRINTF (stderr, "\n");
-}
-
-# define YY_STACK_PRINT(Bottom, Top)				\
-do {								\
-  if (yydebug)							\
-    yy_stack_print ((Bottom), (Top));				\
-} while (YYID (0))
-
-
-/*------------------------------------------------.
-| Report that the YYRULE is going to be reduced.  |
-`------------------------------------------------*/
-
-]b4_c_function_def([yy_reduce_print], [static void],
-		   [[YYSTYPE *yyvsp], [yyvsp]],
-    b4_locations_if([[[YYLTYPE *yylsp], [yylsp]],
-		   ])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [,
-		   ])b4_parse_param)[
-{
-  int yynrhs = yyr2[yyrule];
-  int yyi;
-  unsigned long int yylno = yyrline[yyrule];
-  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
-	     yyrule - 1, yylno);
-  /* The symbols being reduced.  */
-  for (yyi = 0; yyi < yynrhs; yyi++)
-    {
-      fprintf (stderr, "   $%d = ", yyi + 1);
-      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
-		       &]b4_rhs_value(yynrhs, yyi + 1)[
-		       ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
-		       b4_user_args[);
-      fprintf (stderr, "\n");
-    }
-}
-
-# define YY_REDUCE_PRINT(Rule)		\
-do {					\
-  if (yydebug)				\
-    yy_reduce_print (yyvsp, ]b4_locations_if([yylsp, ])[Rule]b4_user_args[); \
-} while (YYID (0))
-
-/* Nonzero means print parse trace.  It is left uninitialized so that
-   multiple parsers can coexist.  */
-int yydebug;
-#else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-# define YY_STACK_PRINT(Bottom, Top)
-# define YY_REDUCE_PRINT(Rule)
-#endif /* !YYDEBUG */
-
-
-/* YYINITDEPTH -- initial size of the parser's stacks.  */
-#ifndef	YYINITDEPTH
-# define YYINITDEPTH ]b4_stack_depth_init[
-#endif
-
-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
-   if the built-in stack extension method is used).
-
-   Do not make this value too large; the results are undefined if
-   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
-   evaluated with infinite-precision integer arithmetic.  */
-
-#ifndef YYMAXDEPTH
-# define YYMAXDEPTH ]b4_stack_depth_max[
-#endif
-
-
-
-#if YYERROR_VERBOSE
-
-# ifndef yystrlen
-#  if defined __GLIBC__ && defined _STRING_H
-#   define yystrlen strlen
-#  else
-/* Return the length of YYSTR.  */
-]b4_c_function_def([yystrlen], [static YYSIZE_T],
-   [[const char *yystr], [yystr]])[
-{
-  YYSIZE_T yylen;
-  for (yylen = 0; yystr[yylen]; yylen++)
-    continue;
-  return yylen;
-}
-#  endif
-# endif
-
-# ifndef yystpcpy
-#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-#   define yystpcpy stpcpy
-#  else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-   YYDEST.  */
-]b4_c_function_def([yystpcpy], [static char *],
-   [[char *yydest], [yydest]], [[const char *yysrc], [yysrc]])[
-{
-  char *yyd = yydest;
-  const char *yys = yysrc;
-
-  while ((*yyd++ = *yys++) != '\0')
-    continue;
-
-  return yyd - 1;
-}
-#  endif
-# endif
-
-# ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
-   quotes and backslashes, so that it's suitable for yyerror.  The
-   heuristic is that double-quoting is unnecessary unless the string
-   contains an apostrophe, a comma, or backslash (other than
-   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
-   null, do not copy; instead, return the length of what the result
-   would have been.  */
-static YYSIZE_T
-yytnamerr (char *yyres, const char *yystr)
-{
-  if (*yystr == '"')
-    {
-      YYSIZE_T yyn = 0;
-      char const *yyp = yystr;
-
-      for (;;)
-	switch (*++yyp)
-	  {
-	  case '\'':
-	  case ',':
-	    goto do_not_strip_quotes;
-
-	  case '\\':
-	    if (*++yyp != '\\')
-	      goto do_not_strip_quotes;
-	    /* Fall through.  */
-	  default:
-	    if (yyres)
-	      yyres[yyn] = *yyp;
-	    yyn++;
-	    break;
-
-	  case '"':
-	    if (yyres)
-	      yyres[yyn] = '\0';
-	    return yyn;
-	  }
-    do_not_strip_quotes: ;
-    }
-
-  if (! yyres)
-    return yystrlen (yystr);
-
-  return yystpcpy (yyres, yystr) - yyres;
-}
-# endif
-
-/* Copy into YYRESULT an error message about the unexpected token
-   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
-   including the terminating null byte.  If YYRESULT is null, do not
-   copy anything; just return the number of bytes that would be
-   copied.  As a special case, return 0 if an ordinary "syntax error"
-   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
-   size calculation.  */
-static YYSIZE_T
-yysyntax_error (char *yyresult, int yystate, int yychar)
-{
-  int yyn = yypact[yystate];
-
-  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
-    return 0;
-  else
-    {
-      int yytype = YYTRANSLATE (yychar);
-      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
-      YYSIZE_T yysize = yysize0;
-      YYSIZE_T yysize1;
-      int yysize_overflow = 0;
-      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-      int yyx;
-
-# if 0
-      /* This is so xgettext sees the translatable formats that are
-	 constructed on the fly.  */
-      YY_("syntax error, unexpected %s");
-      YY_("syntax error, unexpected %s, expecting %s");
-      YY_("syntax error, unexpected %s, expecting %s or %s");
-      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
-      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-# endif
-      char *yyfmt;
-      char const *yyf;
-      static char const yyunexpected[] = "syntax error, unexpected %s";
-      static char const yyexpecting[] = ", expecting %s";
-      static char const yyor[] = " or %s";
-      char yyformat[sizeof yyunexpected
-		    + sizeof yyexpecting - 1
-		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-		       * (sizeof yyor - 1))];
-      char const *yyprefix = yyexpecting;
-
-      /* Start YYX at -YYN if negative to avoid negative indexes in
-	 YYCHECK.  */
-      int yyxbegin = yyn < 0 ? -yyn : 0;
-
-      /* Stay within bounds of both yycheck and yytname.  */
-      int yychecklim = YYLAST - yyn + 1;
-      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-      int yycount = 1;
-
-      yyarg[0] = yytname[yytype];
-      yyfmt = yystpcpy (yyformat, yyunexpected);
-
-      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-	  {
-	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-	      {
-		yycount = 1;
-		yysize = yysize0;
-		yyformat[sizeof yyunexpected - 1] = '\0';
-		break;
-	      }
-	    yyarg[yycount++] = yytname[yyx];
-	    yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-	    yysize_overflow |= (yysize1 < yysize);
-	    yysize = yysize1;
-	    yyfmt = yystpcpy (yyfmt, yyprefix);
-	    yyprefix = yyor;
-	  }
-
-      yyf = YY_(yyformat);
-      yysize1 = yysize + yystrlen (yyf);
-      yysize_overflow |= (yysize1 < yysize);
-      yysize = yysize1;
-
-      if (yysize_overflow)
-	return YYSIZE_MAXIMUM;
-
-      if (yyresult)
-	{
-	  /* Avoid sprintf, as that infringes on the user's name space.
-	     Don't have undefined behavior even if the translation
-	     produced a string with the wrong number of "%s"s.  */
-	  char *yyp = yyresult;
-	  int yyi = 0;
-	  while ((*yyp = *yyf) != '\0')
-	    {
-	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-		{
-		  yyp += yytnamerr (yyp, yyarg[yyi++]);
-		  yyf += 2;
-		}
-	      else
-		{
-		  yyp++;
-		  yyf++;
-		}
-	    }
-	}
-      return yysize;
-    }
-}
-#endif /* YYERROR_VERBOSE */
-
-
-]b4_yydestruct_generate([b4_c_function_def])[
-
-
-/* Prevent warnings from -Wmissing-prototypes.  */
-
-#ifdef YYPARSE_PARAM
-]b4_c_function_decl([yyparse], [int],
-   [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[
-#else /* ! YYPARSE_PARAM */
-]b4_c_function_decl([yyparse], [int], b4_parse_param)[
-#endif /* ! YYPARSE_PARAM */
-
-
-]m4_divert_push([KILL])# ======================== M4 code.
-# b4_declare_parser_variables
-# ---------------------------
-# Declare the variables that are global, or local to YYPARSE if
-# pure-parser.
-m4_define([b4_declare_parser_variables],
-[/* The look-ahead symbol.  */
-int yychar;
-
-/* The semantic value of the look-ahead symbol.  */
-YYSTYPE yylval;
-
-/* Number of syntax errors so far.  */
-int yynerrs;b4_locations_if([
-/* Location data for the look-ahead symbol.  */
-YYLTYPE yylloc;])
-])
-m4_divert_pop([KILL])dnl# ====================== End of M4 code.
-
-b4_pure_if([],
-	   [b4_declare_parser_variables])
-
-
-/*----------.
-| yyparse.  |
-`----------*/
-
-#ifdef YYPARSE_PARAM
-b4_c_function_def([yyparse], [int], [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])
-#else /* ! YYPARSE_PARAM */
-b4_c_function_def([yyparse], [int], b4_parse_param)
-#endif
-{[
-  ]b4_pure_if([b4_declare_parser_variables])[
-  int yystate;
-  int yyn;
-  int yyresult;
-  /* Number of tokens to shift before error messages enabled.  */
-  int yyerrstatus;
-  /* Look-ahead token as an internal (translated) token number.  */
-  int yytoken = 0;
-#if YYERROR_VERBOSE
-  /* Buffer for error messages, and its allocated size.  */
-  char yymsgbuf[128];
-  char *yymsg = yymsgbuf;
-  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
-
-  /* Three stacks and their tools:
-     `yyss': related to states,
-     `yyvs': related to semantic values,
-     `yyls': related to locations.
-
-     Refer to the stacks thru separate pointers, to allow yyoverflow
-     to reallocate them elsewhere.  */
-
-  /* The state stack.  */
-  yytype_int16 yyssa[YYINITDEPTH];
-  yytype_int16 *yyss = yyssa;
-  yytype_int16 *yyssp;
-
-  /* The semantic value stack.  */
-  YYSTYPE yyvsa[YYINITDEPTH];
-  YYSTYPE *yyvs = yyvsa;
-  YYSTYPE *yyvsp;
-
-]b4_locations_if(
-[[  /* The location stack.  */
-  YYLTYPE yylsa[YYINITDEPTH];
-  YYLTYPE *yyls = yylsa;
-  YYLTYPE *yylsp;
-  /* The locations where the error started and ended.  */
-  YYLTYPE yyerror_range[2];]])[
-
-#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N)]b4_locations_if([, yylsp -= (N)])[)
-
-  YYSIZE_T yystacksize = YYINITDEPTH;
-
-  /* The variables used to return semantic value and location from the
-     action routines.  */
-  YYSTYPE yyval;
-]b4_locations_if([  YYLTYPE yyloc;])[
-
-  /* The number of symbols on the RHS of the reduced rule.
-     Keep to zero when no symbol should be popped.  */
-  int yylen = 0;
-
-  YYDPRINTF ((stderr, "Starting parse\n"));
-
-  yystate = 0;
-  yyerrstatus = 0;
-  yynerrs = 0;
-  yychar = YYEMPTY;		/* Cause a token to be read.  */
-
-  /* Initialize stack pointers.
-     Waste one element of value and location stack
-     so that they stay on the same level as the state stack.
-     The wasted elements are never initialized.  */
-
-  yyssp = yyss;
-  yyvsp = yyvs;
-]b4_locations_if([[  yylsp = yyls;
-#if YYLTYPE_IS_TRIVIAL
-  /* Initialize the default location before parsing starts.  */
-  yylloc.first_line   = yylloc.last_line   = 1;
-  yylloc.first_column = yylloc.last_column = 0;
-#endif
-]])
-m4_ifdef([b4_initial_action], [
-m4_pushdef([b4_at_dollar],     [m4_define([b4_at_dollar_used])yylloc])dnl
-m4_pushdef([b4_dollar_dollar], [m4_define([b4_dollar_dollar_used])yylval])dnl
-  /* User initialization code.  */
-b4_initial_action
-m4_popdef([b4_dollar_dollar])dnl
-m4_popdef([b4_at_dollar])dnl
-/* Line __line__ of yacc.c.  */
-b4_syncline([@oline@], [@ofile@])
-])dnl
-m4_ifdef([b4_dollar_dollar_used],[[  yyvsp[0] = yylval;
-]])dnl
-m4_ifdef([b4_at_dollar_used], [[  yylsp[0] = yylloc;
-]])dnl
-[  goto yysetstate;
-
-/*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate.  |
-`------------------------------------------------------------*/
- yynewstate:
-  /* In all cases, when you get here, the value and location stacks
-     have just been pushed.  So pushing a state here evens the stacks.  */
-  yyssp++;
-
- yysetstate:
-  *yyssp = yystate;
-
-  if (yyss + yystacksize - 1 <= yyssp)
-    {
-      /* Get the current used size of the three stacks, in elements.  */
-      YYSIZE_T yysize = yyssp - yyss + 1;
-
-#ifdef yyoverflow
-      {
-	/* Give user a chance to reallocate the stack.  Use copies of
-	   these so that the &'s don't force the real ones into
-	   memory.  */
-	YYSTYPE *yyvs1 = yyvs;
-	yytype_int16 *yyss1 = yyss;
-]b4_locations_if([	YYLTYPE *yyls1 = yyls;])[
-
-	/* Each stack pointer address is followed by the size of the
-	   data in use in that stack, in bytes.  This used to be a
-	   conditional around just the two extra args, but that might
-	   be undefined if yyoverflow is a macro.  */
-	yyoverflow (YY_("memory exhausted"),
-		    &yyss1, yysize * sizeof (*yyssp),
-		    &yyvs1, yysize * sizeof (*yyvsp),
-]b4_locations_if([		    &yyls1, yysize * sizeof (*yylsp),])[
-		    &yystacksize);
-]b4_locations_if([	yyls = yyls1;])[
-	yyss = yyss1;
-	yyvs = yyvs1;
-      }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
-      goto yyexhaustedlab;
-# else
-      /* Extend the stack our own way.  */
-      if (YYMAXDEPTH <= yystacksize)
-	goto yyexhaustedlab;
-      yystacksize *= 2;
-      if (YYMAXDEPTH < yystacksize)
-	yystacksize = YYMAXDEPTH;
-
-      {
-	yytype_int16 *yyss1 = yyss;
-	union yyalloc *yyptr =
-	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-	if (! yyptr)
-	  goto yyexhaustedlab;
-	YYSTACK_RELOCATE (yyss);
-	YYSTACK_RELOCATE (yyvs);
-]b4_locations_if([	YYSTACK_RELOCATE (yyls);])[
-#  undef YYSTACK_RELOCATE
-	if (yyss1 != yyssa)
-	  YYSTACK_FREE (yyss1);
-      }
-# endif
-#endif /* no yyoverflow */
-
-      yyssp = yyss + yysize - 1;
-      yyvsp = yyvs + yysize - 1;
-]b4_locations_if([      yylsp = yyls + yysize - 1;])[
-
-      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-		  (unsigned long int) yystacksize));
-
-      if (yyss + yystacksize - 1 <= yyssp)
-	YYABORT;
-    }
-
-  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-
-  goto yybackup;
-
-/*-----------.
-| yybackup.  |
-`-----------*/
-yybackup:
-
-  /* Do appropriate processing given the current state.  Read a
-     look-ahead token if we need one and don't already have one.  */
-
-  /* First try to decide what to do without reference to look-ahead token.  */
-  yyn = yypact[yystate];
-  if (yyn == YYPACT_NINF)
-    goto yydefault;
-
-  /* Not known => get a look-ahead token if don't already have one.  */
-
-  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
-  if (yychar == YYEMPTY)
-    {
-      YYDPRINTF ((stderr, "Reading a token: "));
-      yychar = YYLEX;
-    }
-
-  if (yychar <= YYEOF)
-    {
-      yychar = yytoken = YYEOF;
-      YYDPRINTF ((stderr, "Now at end of input.\n"));
-    }
-  else
-    {
-      yytoken = YYTRANSLATE (yychar);
-      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
-    }
-
-  /* If the proper action on seeing token YYTOKEN is to reduce or to
-     detect an error, take that action.  */
-  yyn += yytoken;
-  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
-    goto yydefault;
-  yyn = yytable[yyn];
-  if (yyn <= 0)
-    {
-      if (yyn == 0 || yyn == YYTABLE_NINF)
-	goto yyerrlab;
-      yyn = -yyn;
-      goto yyreduce;
-    }
-
-  if (yyn == YYFINAL)
-    YYACCEPT;
-
-  /* Count tokens shifted since error; after three, turn off error
-     status.  */
-  if (yyerrstatus)
-    yyerrstatus--;
-
-  /* Shift the look-ahead token.  */
-  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
-  /* Discard the shifted token unless it is eof.  */
-  if (yychar != YYEOF)
-    yychar = YYEMPTY;
-
-  yystate = yyn;
-  *++yyvsp = yylval;
-]b4_locations_if([  *++yylsp = yylloc;])[
-  goto yynewstate;
-
-
-/*-----------------------------------------------------------.
-| yydefault -- do the default action for the current state.  |
-`-----------------------------------------------------------*/
-yydefault:
-  yyn = yydefact[yystate];
-  if (yyn == 0)
-    goto yyerrlab;
-  goto yyreduce;
-
-
-/*-----------------------------.
-| yyreduce -- Do a reduction.  |
-`-----------------------------*/
-yyreduce:
-  /* yyn is the number of a rule to reduce with.  */
-  yylen = yyr2[yyn];
-
-  /* If YYLEN is nonzero, implement the default value of the action:
-     `$$ = $1'.
-
-     Otherwise, the following line sets YYVAL to garbage.
-     This behavior is undocumented and Bison
-     users should not rely upon it.  Assigning to YYVAL
-     unconditionally makes the parser a bit smaller, and it avoids a
-     GCC warning that YYVAL may be used uninitialized.  */
-  yyval = yyvsp[1-yylen];
-
-]b4_locations_if(
-[[  /* Default location.  */
-  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);]])[
-  YY_REDUCE_PRINT (yyn);
-  switch (yyn)
-    {
-      ]b4_actions
-/* Line __line__ of yacc.c.  */
-b4_syncline([@oline@], [@ofile@])[
-      default: break;
-    }
-  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
-
-  YYPOPSTACK (yylen);
-  yylen = 0;
-  YY_STACK_PRINT (yyss, yyssp);
-
-  *++yyvsp = yyval;
-]b4_locations_if([  *++yylsp = yyloc;])[
-
-  /* Now `shift' the result of the reduction.  Determine what state
-     that goes to, based on the state we popped back to and the rule
-     number reduced by.  */
-
-  yyn = yyr1[yyn];
-
-  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
-  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
-    yystate = yytable[yystate];
-  else
-    yystate = yydefgoto[yyn - YYNTOKENS];
-
-  goto yynewstate;
-
-
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
-yyerrlab:
-  /* If not already recovering from an error, report this error.  */
-  if (!yyerrstatus)
-    {
-      ++yynerrs;
-#if ! YYERROR_VERBOSE
-      yyerror (]b4_yyerror_args[YY_("syntax error"));
-#else
-      {
-	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
-	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
-	  {
-	    YYSIZE_T yyalloc = 2 * yysize;
-	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
-	      yyalloc = YYSTACK_ALLOC_MAXIMUM;
-	    if (yymsg != yymsgbuf)
-	      YYSTACK_FREE (yymsg);
-	    yymsg = (char *) YYSTACK_ALLOC (yyalloc);
-	    if (yymsg)
-	      yymsg_alloc = yyalloc;
-	    else
-	      {
-		yymsg = yymsgbuf;
-		yymsg_alloc = sizeof yymsgbuf;
-	      }
-	  }
-
-	if (0 < yysize && yysize <= yymsg_alloc)
-	  {
-	    (void) yysyntax_error (yymsg, yystate, yychar);
-	    yyerror (]b4_yyerror_args[yymsg);
-	  }
-	else
-	  {
-	    yyerror (]b4_yyerror_args[YY_("syntax error"));
-	    if (yysize != 0)
-	      goto yyexhaustedlab;
-	  }
-      }
-#endif
-    }
-
-]b4_locations_if([[  yyerror_range[0] = yylloc;]])[
-
-  if (yyerrstatus == 3)
-    {
-      /* If just tried and failed to reuse look-ahead token after an
-	 error, discard it.  */
-
-      if (yychar <= YYEOF)
-	{
-	  /* Return failure if at end of input.  */
-	  if (yychar == YYEOF)
-	    YYABORT;
-	}
-      else
-	{
-	  yydestruct ("Error: discarding",
-		      yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
-	  yychar = YYEMPTY;
-	}
-    }
-
-  /* Else will try to reuse look-ahead token after shifting the error
-     token.  */
-  goto yyerrlab1;
-
-
-/*---------------------------------------------------.
-| yyerrorlab -- error raised explicitly by YYERROR.  |
-`---------------------------------------------------*/
-yyerrorlab:
-
-  /* Pacify compilers like GCC when the user code never invokes
-     YYERROR and the label yyerrorlab therefore never appears in user
-     code.  */
-  if (/*CONSTCOND*/ 0)
-     goto yyerrorlab;
-
-]b4_locations_if([[  yyerror_range[0] = yylsp[1-yylen];
-]])[  /* Do not reclaim the symbols of the rule which action triggered
-     this YYERROR.  */
-  YYPOPSTACK (yylen);
-  yylen = 0;
-  YY_STACK_PRINT (yyss, yyssp);
-  yystate = *yyssp;
-  goto yyerrlab1;
-
-
-/*-------------------------------------------------------------.
-| yyerrlab1 -- common code for both syntax error and YYERROR.  |
-`-------------------------------------------------------------*/
-yyerrlab1:
-  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
-
-  for (;;)
-    {
-      yyn = yypact[yystate];
-      if (yyn != YYPACT_NINF)
-	{
-	  yyn += YYTERROR;
-	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
-	    {
-	      yyn = yytable[yyn];
-	      if (0 < yyn)
-		break;
-	    }
-	}
-
-      /* Pop the current state because it cannot handle the error token.  */
-      if (yyssp == yyss)
-	YYABORT;
-
-]b4_locations_if([[      yyerror_range[0] = *yylsp;]])[
-      yydestruct ("Error: popping",
-		  yystos[yystate], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
-      YYPOPSTACK (1);
-      yystate = *yyssp;
-      YY_STACK_PRINT (yyss, yyssp);
-    }
-
-  if (yyn == YYFINAL)
-    YYACCEPT;
-
-  *++yyvsp = yylval;
-]b4_locations_if([[
-  yyerror_range[1] = yylloc;
-  /* Using YYLLOC is tempting, but would change the location of
-     the look-ahead.  YYLOC is available though.  */
-  YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2);
-  *++yylsp = yyloc;]])[
-
-  /* Shift the error token.  */
-  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-
-  yystate = yyn;
-  goto yynewstate;
-
-
-/*-------------------------------------.
-| yyacceptlab -- YYACCEPT comes here.  |
-`-------------------------------------*/
-yyacceptlab:
-  yyresult = 0;
-  goto yyreturn;
-
-/*-----------------------------------.
-| yyabortlab -- YYABORT comes here.  |
-`-----------------------------------*/
-yyabortlab:
-  yyresult = 1;
-  goto yyreturn;
-
-#ifndef yyoverflow
-/*-------------------------------------------------.
-| yyexhaustedlab -- memory exhaustion comes here.  |
-`-------------------------------------------------*/
-yyexhaustedlab:
-  yyerror (]b4_yyerror_args[YY_("memory exhausted"));
-  yyresult = 2;
-  /* Fall through.  */
-#endif
-
-yyreturn:
-  if (yychar != YYEOF && yychar != YYEMPTY)
-     yydestruct ("Cleanup: discarding lookahead",
-		 yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
-  /* Do not reclaim the symbols of the rule which action triggered
-     this YYABORT or YYACCEPT.  */
-  YYPOPSTACK (yylen);
-  YY_STACK_PRINT (yyss, yyssp);
-  while (yyssp != yyss)
-    {
-      yydestruct ("Cleanup: popping",
-		  yystos[*yyssp], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
-      YYPOPSTACK (1);
-    }
-#ifndef yyoverflow
-  if (yyss != yyssa)
-    YYSTACK_FREE (yyss);
-#endif
-#if YYERROR_VERBOSE
-  if (yymsg != yymsgbuf)
-    YYSTACK_FREE (yymsg);
-#endif
-  /* Make sure YYID is used.  */
-  return YYID (yyresult);
-]}
-
-
-b4_epilogue
-b4_defines_if(
-[@output @output_header_name@
-b4_copyright([Skeleton interface for Bison's Yacc-like parsers in C],dnl '
-  [1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006])
-
-b4_token_enums_defines(b4_tokens)
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-m4_ifdef([b4_stype],
-[typedef union[]m4_bregexp(b4_stype, [^{], [ YYSTYPE])
-b4_stype
-/* Line __line__ of yacc.c.  */
-b4_syncline([@oline@], [@ofile@])
-	YYSTYPE;],
-[typedef int YYSTYPE;])
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-b4_pure_if([],
-[extern YYSTYPE b4_prefix[]lval;])
-
-b4_locations_if(
-[#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
-typedef struct YYLTYPE
-{
-  int first_line;
-  int first_column;
-  int last_line;
-  int last_column;
-} YYLTYPE;
-# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
-# define YYLTYPE_IS_DECLARED 1
-# define YYLTYPE_IS_TRIVIAL 1
-#endif
-
-b4_pure_if([],
-	   [extern YYLTYPE b4_prefix[]lloc;])
-])dnl b4_locations_if
-])dnl b4_defines_if
diff --git a/djgpp/Makefile.maint b/djgpp/Makefile.maint
deleted file mode 100644
index 2566d15..0000000
--- a/djgpp/Makefile.maint
+++ /dev/null
@@ -1,38 +0,0 @@
-# DJGPP Maintainer's Makefile                                    -*-Makefile-*-
-# Requires GNU sed
-
-## Copyright (C) 2005, 2006 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.
-
-top_srcdir = ..
-srcdir = .
-
-SHELL = /bin/sh
-
-all: README
-
-README: README.in $(top_srcdir)/configure
-	PACKAGE=`grep "^[	 ]*PACKAGE=" $(top_srcdir)/configure | sed -e 's/^[	 ]*PACKAGE=//' -e s/[\"\']//g`; \
-	VERSION=`grep "^[	 ]*VERSION=" $(top_srcdir)/configure | sed -e 's/^[	 ]*VERSION=//' -e s/[\"\']//g`; \
-	package_version=`echo "$${VERSION}" | sed 's/\.//g'`; \
-	tree_version=`echo "$${VERSION}" | sed 's/\.//2g'`; \
-	sed \
-	    -e "s/@V@/$${PACKAGE}-$${VERSION}/g" \
-	    -e "s/@VERSION@/$${VERSION}/g" \
-	    -e "s/@PACKAGE_VERSION@/$$package_version/g" \
-	    -e "s/@TREE_VERSION@/$$tree_version/g" \
-	  $(srcdir)/README.in > t-$@
-	mv t-$@ $@
diff --git a/djgpp/README.in b/djgpp/README.in
deleted file mode 100644
index ec3990b..0000000
--- a/djgpp/README.in
+++ /dev/null
@@ -1,194 +0,0 @@
-This is a port of GNU Bison @VERSION@ to MSDOS/DJGPP.
-
-Copyright (C) 2005, 2006 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.
-
-
-1.:     DJGPP specific changes.
-	=======================
-
-	The DJGPP port of Bison offers LFN and SFN support depending on which
-	OS it is running. If LFN support is available or not is determinated at
-	run time.  If LFN support is available (DOS session under Win9X, Win2K,
-	WinXP, etc.) the standard posix file name extensions will be used.
-	These are: y.tab.c, y.tab.c++, y.tab.h, y.output, etc.  If only SFN
-	support is available (plain DOS), then the standard MSDOS short file
-	names will be used. These are: y_tab.c, y_tab.h, y.out, etc.
-	It should be noticed that this bison version needs the m4 program as
-	back end to generate the parser file (y.tab.c etc.) from the skeleton
-	files.  This implies that m4 must always be installed to get bison
-	working.  m4 will use a couple of m4 scripts that will be installed in
-	/dev/env/DJDIR/share/bison and shall not be removed.
-	It should also be noticed that the skeleton files bison.simple and
-	bison.hairy are no longer supported.  This applies also to the environ-
-	ment variables BISON_HAIRY and BISON_SIMPLE.  Those variables are *no*
-	longer honored at all.
-	The kind of skeleton file bison.hairy is no longer supported at all.
-	The skeleton file bison.simple is now called yacc.c and is an m4 script.
-	The other two skeleton files supported by this bison version are glr.c
-	and lalr1.cc.  The first one is a generalized LR C parser based on
-	Bison's LALR(1) tables and the second one is a experimental C++ parser
-	class.
-	As has been told before, bison uses m4 to generate the parser file.
-	This is done by forking and using pipes for the IPC.  MSDOS does not
-	support this functionality so this has been reproduced in the usual
-	way by redirecting stdin and stdout of bison and m4 to temporary files
-	and processing these files in sequence.  All the changes to the sources
-	are documented in the djgpp/diffs file.
-
-	Please **read** the docs.
-
-
-2.:     Installing the binary package.
-	==============================
-
-2.1.:   Copy the binary distribution into the top DJGPP installation directory,
-	just unzip it preserving the directory structure running *ONE* of the
-	following commands:
-	  unzip32 bsn@PACKAGE_VERSION@b.zip      or
-	  djtarx bsn@PACKAGE_VERSION@b.zip       or
-	  pkunzip -d bsn@PACKAGE_VERSION@b.zip
-
-
-
-3.:     Building the binaries from sources.
-	===================================
-
-3.1.:   Create a temporary directory and copy the source package into the
-	directory.  If you download the source distribution from one of the
-	DJGPP sites, just unzip it preserving the directory structure
-	running *ONE* of the following commands:
-	  unzip32 bsn@PACKAGE_VERSION@s.zip      or
-	  djtarx bsn@PACKAGE_VERSION@s.zip       or
-	  pkunzip -d bsn@PACKAGE_VERSION@s.zip
-	and proceed to the paragraph 3.3, below.
-
-3.2.:   Source distributions downloaded from one of the GNU FTP sites need
-	some more work to unpack, if LFN support is not available.  If LFN is
-	available then you can extract the source files from the archive with
-	any unzip program and proceed to the paragraph 3.3, below.  Any file
-	name issue will be handled by the the DJGPP configuration files.
-	To unpack the source distribution on SFN systems, first, you MUST use
-	the `djunpack' batch file to unzip the package.  That is because some
-	file names in the official distributions need to be changed to avoid
-	problems on the various platforms supported by DJGPP.
-	`djunpack' invokes the `djtar' program (that is part of the basic DJGPP
-	development kit) to rename these files on the fly given a file with
-	name mappings; the distribution includes a file `djgpp/fnchange.lst'
-	with the necessary mappings.  So you need first to retrieve that batch
-	file, and then invoke it to unpack the distribution.  Here's how:
-
-	  djtar -x -p -o bison-@VERSION@/djgpp/djunpack.bat bison-@VERSION@.tar.gz > djunpack.bat
-	  djunpack bison-@VERSION@.tar.gz
-
-	(The name of the distribution archive and the leading directory of the
-	path to `djunpack.bat' in the distribution will be different for
-	versions of Bison other than @VERSION@.)
-
-	If the argument to `djunpack.bat' include leading directories, it MUST
-	be given with the DOS-style backslashes; Unix-style forward slashes
-	will NOT work.
-
-	If the distribution comes as a .tar.bz2 archive, and your version of
-	`djtar' doesn't support bzip2 decompression, you need to unpack it as
-	follows:
-
-	  bnzip2 bison-@VERSION@.tar.bz2
-	  djtar -x -p -o bison-@VERSION@/djgpp/djunpack.bat bison-@VERSION@.tar > djunpack.bat
-	  djunpack bison-@VERSION@.tar
-
-3.3.:   To build the binaries you will need the following binary packages:
-	  djdev203.zip (or a later but NOT a prior version)
-	  bsh204b.zip  (or a later but NOT a prior version)
-	  gcc410b.zip, gpp410b.zip, bnu2161b.zip, mak3791b.zip,
-	  fil40b.zip, shl20jb.zip, txt20b.zip,
-	  txi48b.zip, grep24b.zip, sed415b.zip,
-	  m4-144b.zip.
-
-	If you want to run the check you will need also:
-	  dif287b.zip
-
-	All this packages can be found in the v2gnu directory of any
-	ftp.delorie.com mirror.
-	You will need bsh204b.zip or later and *NOT* a prior version or
-	the build will fail.  The same applies to djdev203.zip.  Please note
-	that Bison requires m4-144b.zip or later to work properly.  All the
-	other packages are the ones I have used to build the binaries
-	from this source.  Previuos versions of this packages may do the
-	job as well but I have not tested this.
-
-3.4.:   If for some reason you want to reconfigure the package cd into the top
-	srcdir (bison-@TREE_VERSION@) and run the following commands:
-	  del djgpp\config.cache
-	  make clean
-	  djgpp\config
-
-	Please note that you *MUST* delete the config.cache file in the djgpp
-	subdir or you will not really reconfigure the sources because the
-	configuration informations will be read from the cache file instead
-	of being newly computed.
-	To build the programs in a directory other than where the sources are,
-	you must add the parameter that specifies the source directory,
-	e.g:
-	  x:\src\gnu\bison-@TREE_VERSION@\djgpp\config x:/src/gnu/bison-@TREE_VERSION@
-
-	Lets assume you want to build the binaries in a directory placed on a
-	different drive (z:\build in this case) from where the sources are,
-	then you will run the following commands:
-	  z:
-	  md \build
-	  cd \build
-	  x:\src\gnu\bison-@TREE_VERSION@\djgpp\config x:/src/gnu/bison-@TREE_VERSION@
-
-	The order of the options and the srcdir option does not matter.  You
-	*MUST* use forward slashes to specify the source directory.
-
-	The batch file will set same environment variables, make MSDOS specific
-	modifications to the Makefile.in's and supply all other needed options
-	to the configure script.
-
-3.5.:   To compile the package run from the top srcdir the command:
-	  make
-
-3.6.:   Now you can run the tests if you like.  From the top srcdir run the
-	command:
-	  make check
-
-	No test should fail but the tests #131 (Doxygen Public Documentation)
-	and #132 (Doxygen Private Documentation) will be skipped.  Please note
-	that the testsuite only works with LFN available.  On plain DOS, most
-	of the tests will fail due to invalid DOS names.
-
-3.7.:   To install the binaries, header, library, catalogs, and info docs
-	run the following command from the top srcdir:
-	  make install
-
-	This will install the products into your DJGPP installation tree given
-	by the default prefix "/dev/env/DJDIR".  If you prefer to install them
-	into some other directory you will have to set prefix to the appropiate
-	value:
-	  make install prefix=z:/some/other/place
-
-
-
-	Send GNU bison specific bug reports to <bug-bison@gnu.org>.
-	Send suggestions and bug reports concerning the DJGPP port to
-	comp.os.msdos.djgpp or <djgpp@delorie.com>.
-
-
-Enjoy.
-
-	Guerrero, Juan Manuel <juan.guerrero@gmx.de>
diff --git a/djgpp/config.bat b/djgpp/config.bat
deleted file mode 100644
index 1fb6e61..0000000
--- a/djgpp/config.bat
+++ /dev/null
@@ -1,480 +0,0 @@
-@echo off
-Rem Configure Bison for DJGPP.
-
-Rem WARNING WARNING WARNING: This file needs to have DOS CRLF end-of-line
-Rem format, or else stock DOS/Windows shells will refuse to run it.
-
-Rem Copyright (C) 2005, 2006 Free Software Foundation, Inc.
-
-Rem This program is free software; you can redistribute it and/or modify
-Rem it under the terms of the GNU General Public License as published by
-Rem the Free Software Foundation; either version 2, or (at your option)
-Rem any later version.
-
-Rem This program is distributed in the hope that it will be useful,
-Rem but WITHOUT ANY WARRANTY; without even the implied warranty of
-Rem MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-Rem GNU General Public License for more details.
-
-Rem You should have received a copy of the GNU General Public License
-Rem along with this program; if not, write to the Free Software Foundation,
-Rem Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-echo Configuring Bison for DJGPP v2.x...
-
-Rem The SmallEnv tests protect against fixed and too small size
-Rem of the environment in stock DOS shell.
-
-Rem Find out if NLS is wanted or not,
-Rem if dependency-tracking is wanted or not,
-Rem if caching is wanted or not
-Rem and where the sources are.
-Rem We always default to NLS support,
-Rem no dependency tracking
-Rem and to in place configuration.
-set ARGS=
-set NLS=enabled
-if not "%NLS%" == "enabled" goto SmallEnv
-set CACHING=enabled
-if not "%CACHING%" == "enabled" goto SmallEnv
-set DEPENDENCY_TRACKING=disabled
-if not "%DEPENDENCY_TRACKING%" == "disabled" goto SmallEnv
-set LIBICONV_PREFIX=disabled
-if not "%LIBICONV_PREFIX%" == "disabled" goto SmallEnv
-set LIBINTL_PREFIX=disabled
-if not "%LIBINTL_PREFIX%" == "disabled" goto SmallEnv
-set HTML=enabled
-if not "%HTML%" == "enabled" goto SmallEnv
-set XSRC=.
-if not "%XSRC%" == "." goto SmallEnv
-
-Rem Loop over all arguments.
-Rem Special arguments are: NLS, XSRC, CACHE, STATIC_LIBS, LIBICONV_PREFIX, LIBINTL_PREFIX and DEPS.
-Rem All other arguments are stored into ARGS.
-:ArgLoop
-if "%1" == "nls" goto NextArgument
-if "%1" == "NLS" goto NextArgument
-if "%1" == "no-nls" goto NoNLS
-if "%1" == "no-NLS" goto NoNLS
-if "%1" == "NO-NLS" goto NoNLS
-goto CachingOption
-:NoNLS
-if "%1" == "no-nls" set NLS=disabled
-if "%1" == "no-NLS" set NLS=disabled
-if "%1" == "NO-NLS" set NLS=disabled
-if not "%NLS%" == "disabled" goto SmallEnv
-goto NextArgument
-:CachingOption
-if "%1" == "cache" goto NextArgument
-if "%1" == "CACHE" goto NextArgument
-if "%1" == "no-cache" goto NoCaching
-if "%1" == "no-CACHE" goto NoCaching
-if "%1" == "NO-CACHE" goto NoCaching
-goto DependencyOption
-:NoCaching
-if "%1" == "no-cache" set CACHING=disabled
-if "%1" == "no-CACHE" set CACHING=disabled
-if "%1" == "NO-CACHE" set CACHING=disabled
-if not "%CACHING%" == "disabled" goto SmallEnv
-goto NextArgument
-:DependencyOption
-if "%1" == "no-dep" goto NextArgument
-if "%1" == "no-DEP" goto NextArgument
-if "%1" == "NO-DEP" goto NextArgument
-if "%1" == "dep" goto DependecyTraking
-if "%1" == "DEP" goto DependecyTraking
-goto LibiconvPrefixOption
-:DependecyTraking
-if "%1" == "dep" set DEPENDENCY_TRACKING=enabled
-if "%1" == "DEP" set DEPENDENCY_TRACKING=enabled
-if not "%DEPENDENCY_TRACKING%" == "enabled" goto SmallEnv
-goto NextArgument
-:LibiconvPrefixOption
-if "%1" == "no-libiconvprefix" goto NextArgument
-if "%1" == "no-LIBICONVPREFIX" goto NextArgument
-if "%1" == "NO-LIBICONVPREFIX" goto NextArgument
-if "%1" == "libiconvprefix" goto WithLibiconvPrefix
-if "%1" == "LIBICONVPREFIX" goto WithLibiconvPrefix
-goto LibintlPrefixOption
-:WithLibiconvPrefix
-if "%1" == "libiconvprefix" set LIBICONV_PREFIX=enabled
-if "%1" == "LIBICONVPREFIX" set LIBICONV_PREFIX=enabled
-if not "%LIBICONV_PREFIX%" == "enabled" goto SmallEnv
-goto NextArgument
-:LibintlPrefixOption
-if "%1" == "no-libiconvprefix" goto NextArgument
-if "%1" == "no-LIBICONVPREFIX" goto NextArgument
-if "%1" == "NO-LIBICONVPREFIX" goto NextArgument
-if "%1" == "libintlprefix" goto _WithLibintlPrefix
-if "%1" == "LIBINTLPREFIX" goto _WithLibintlPrefix
-goto HTMLOption
-:_WithLibintlPrefix
-if "%1" == "libintlprefix" set LIBINTL_PREFIX=enabled
-if "%1" == "LIBINTLPREFIX" set LIBINTL_PREFIX=enabled
-if not "%LIBINTL_PREFIX%" == "enabled" goto SmallEnv
-:HTMLOption
-if "%1" == "withhtml" goto NextArgument
-if "%1" == "withHTML" goto NextArgument
-if "%1" == "WITHHTML" goto NextArgument
-if "%1" == "withouthtml" goto _WithoutHTML
-if "%1" == "withoutHTML" goto _WithoutHTML
-if "%1" == "WITHOUTHTML" goto _WithoutHTML
-goto SrcDirOption
-:_WithoutHTML
-if "%1" == "withouthtml" set HTML=disabled
-if "%1" == "withoutHTML" set HTML=disabled
-if "%1" == "WITHOUTHTML" set HTML=disabled
-if not "%HTML%" == "disabled" goto SmallEnv
-goto NextArgument
-:SrcDirOption
-echo %1 | grep -q "/"
-if errorlevel 1 goto CollectArgument
-set XSRC=%1
-if not "%XSRC%" == "%1" goto SmallEnv
-goto NextArgument
-:CollectArgument
-set _ARGS=%ARGS% %1
-if not "%_ARGS%" == "%ARGS% %1" if not "%_ARGS%" == "%ARGS%%1" goto SmallEnv
-echo %_ARGS% | grep -q "[^ ]"
-if not errorlevel 0 set ARGS=%_ARGS%
-set _ARGS=
-:NextArgument
-shift
-if not "%1" == "" goto ArgLoop
-
-Rem Create an arguments file for the configure script.
-echo --srcdir=%XSRC% > arguments
-if "%CACHING%" == "enabled"              echo --cache-file=%XSRC%/djgpp/config.cache >> arguments
-if "%DEPENDENCY_TRACKING%" == "enabled"  echo --enable-dependency-tracking >> arguments
-if "%DEPENDENCY_TRACKING%" == "disabled" echo --disable-dependency-tracking >> arguments
-if "%LIBICONV_PREFIX%" == "enabled"      echo --with-libiconv-prefix >> arguments
-if "%LIBICONV_PREFIX%" == "disabled"     echo --without-libiconv-prefix >> arguments
-if "%LIBINTL_PREFIX%" == "enabled"       echo --with-libintl-prefix >> arguments
-if "%LIBINTL_PREFIX%" == "disabled"      echo --without-libintl-prefix >> arguments
-if "%HTML%" == "enabled"                 echo --enable-html >> arguments
-if "%HTML%" == "disabled"                echo --disable-html >> arguments
-if not "%ARGS%" == ""                    echo %ARGS% >> arguments
-set ARGS=
-set CACHING=
-set DEPENDENCY_TRACKING=
-set LIBICONV_PREFIX=
-set LIBINTL_PREFIX=
-set HTML=
-
-if "%XSRC%" == "." goto InPlace
-
-:NotInPlace
-redir -e /dev/null update %XSRC%/configure.orig ./configure
-test -f ./configure
-if errorlevel 1 update %XSRC%/configure ./configure
-
-:InPlace
-Rem Update configuration files
-echo Updating configuration scripts...
-test -f ./configure.orig
-if errorlevel 1 update configure configure.orig
-sed -f %XSRC%/djgpp/config.sed configure.orig > configure
-if errorlevel 1 goto SedError
-
-Rem Make sure they have a config.site file
-set CONFIG_SITE=%XSRC%/djgpp/config.site
-if not "%CONFIG_SITE%" == "%XSRC%/djgpp/config.site" goto SmallEnv
-
-Rem Make sure crucial file names are not munged by unpacking
-test -f %XSRC%/po/Makefile.in.in
-if not errorlevel 1 mv -f %XSRC%/po/Makefile.in.in %XSRC%/po/Makefile.in-in
-test -f %XSRC%/po/Makefile.in-in
-if errorlevel 1 mv -f %XSRC%/po/Makefile.in %XSRC%/po/Makefile.in-in
-test -f %XSRC%/po/Makefile.in-in
-if errorlevel 1 mv -f %XSRC%/po/Makefile.inin %XSRC%/po/Makefile.in-in
-test -f %XSRC%/po/Makefile.in-in
-if errorlevel 1 mv -f %XSRC%/po/Makefile.in_in %XSRC%/po/Makefile.in-in
-test -f %XSRC%/po/Makefile.in-in
-if errorlevel 1 mv -f %XSRC%/po/Makefile_in.in %XSRC%/po/Makefile.in-in
-test -f %XSRC%/runtime-po/Makefile.in.in
-if not errorlevel 1 mv -f %XSRC%/runtime-po/Makefile.in.in %XSRC%/runtime-po/Makefile.in-in
-test -f %XSRC%/runtime-po/Makefile.in-in
-if errorlevel 1 mv -f %XSRC%/runtime-po/Makefile.in %XSRC%/runtime-po/Makefile.in-in
-test -f %XSRC%/runtime-po/Makefile.in-in
-if errorlevel 1 mv -f %XSRC%/runtime-po/Makefile.inin %XSRC%/runtime-po/Makefile.in-in
-test -f %XSRC%/runtime-po/Makefile.in-in
-if errorlevel 1 mv -f %XSRC%/runtime-po/Makefile.in_in %XSRC%/runtime-po/Makefile.in-in
-test -f %XSRC%/runtime-po/Makefile.in-in
-if errorlevel 1 mv -f %XSRC%/runtime-po/Makefile_in.in %XSRC%/runtime-po/Makefile.in-in
-test -f %XSRC%/data/c++.m4
-if not errorlevel 1 mv -f %XSRC%/data/c++.m4 %XSRC%/data/cxx.m4
-test -f %XSRC%/data/cxx.m4
-if errorlevel 1 mv -f %XSRC%/data/cpp.m4 %XSRC%/data/cxx.m4
-:scan_gram_c_Test
-test -f %XSRC%/src/c-scan-gram.c
-if not errorlevel 1 goto scan_skel_c_Test
-test -f %XSRC%/src/scan-gram-c.c
-if not errorlevel 1 mv -f %XSRC%/src/scan-gram-c.c %XSRC%/src/c-scan-gram.c
-:scan_skel_c_Test
-test -f %XSRC%/src/c-scan-skel.c
-if not errorlevel 1 goto FixFiles
-test -f %XSRC%/src/scan-skel-c.c
-if not errorlevel 1 mv -f %XSRC%/src/scan-skel-c.c %XSRC%/src/c-scan-skel.c
-
-:FixFiles
-Rem Fix data/lalr1.cc and data/location.cc to reflect the renaming of c++.m4
-sed "s/c++\.m4/cxx.m4/" %XSRC%/data/lalr1.cc > lalr1.cc
-if errorlevel 1 goto lalr1_ccFileError
-mv ./lalr1.cc %XSRC%/data/lalr1.cc
-sed "s/c++\.m4/cxx.m4/" %XSRC%/data/location.cc > location.cc
-if errorlevel 1 goto location.ccFileError
-mv ./location.cc %XSRC%/data/location.cc
-sed "s/c++\.m4/cxx.m4/" %XSRC%/data/glr.cc > glr.cc
-if errorlevel 1 goto glr.ccFileError
-mv ./glr.cc %XSRC%/data/glr.cc
-
-Rem Define DJGPP specific defs in config.hin
-echo Editing config.hin...
-test -f %XSRC%/config_h.orig
-if errorlevel 1 update %XSRC%/config.hin %XSRC%/config_h.orig
-sed -f %XSRC%/djgpp/config_h.sed %XSRC%/config_h.orig > config.hin
-if errorlevel 1 goto SedError2
-mv -f config.hin %XSRC%/config.hin
-
-
-Rem Fixing ilicit testsuite file name.
-test -f %XSRC%/tests/c++.at
-if not errorlevel 1 mv -f %XSRC%/tests/c++.at %XSRC%/tests/cxx.at
-
-Rem Fixing ilicit calc++ file names in the calc++ directory.
-test -d %XSRC%/examples/calc++
-if not errorlevel 1 mv -f %XSRC%/examples/calc++ %XSRC%/examples/calcxx
-test -d %XSRC%/examples/calcxx
-if errorlevel 1 mv -f %XSRC%/examples/calcpp %XSRC%/examples/calcxx
-test -f %XSRC%/examples/calcxx/calc++-scanner.cc
-if not errorlevel 1 mv -f %XSRC%/examples/calcxx/calc++-scanner.cc %XSRC%/examples/calcxx/calcxx-scanner.cc
-test -f %XSRC%/examples/calcxx/calcxx-scanner.cc
-if errorlevel 1 mv -f %XSRC%/examples/calcxx/calcpp-scanner.cc %XSRC%/examples/calcxx/calcxx-scanner.cc
-test -f %XSRC%/examples/calcxx/calc++-scanner.ll
-if not errorlevel 1 mv -f %XSRC%/examples/calcxx/calc++-scanner.ll %XSRC%/examples/calcxx/calcxx-scanner.ll
-test -f %XSRC%/examples/calcxx/calcxx-scanner.ll
-if errorlevel 1 mv -f %XSRC%/examples/calcxx/calcpp-scanner.ll %XSRC%/examples/calcxx/calcxx-scanner.ll
-test -f %XSRC%/examples/calcxx/calc++-driver.cc
-if not errorlevel 1 mv -f %XSRC%/examples/calcxx/calc++-driver.cc %XSRC%/examples/calcxx/calcxx-driver.cc
-test -f %XSRC%/examples/calcxx/calcxx-driver.cc
-if errorlevel 1 mv -f %XSRC%/examples/calcxx/calcpp-driver.cc %XSRC%/examples/calcxx/calcxx-driver.cc
-test -f %XSRC%/examples/calcxx/calc++-driver.hh
-if not errorlevel 1 mv -f %XSRC%/examples/calcxx/calc++-driver.hh %XSRC%/examples/calcxx/calcxx-driver.hh
-test -f %XSRC%/examples/calcxx/calcxx-driver.hh
-if errorlevel 1 mv -f %XSRC%/examples/calcxx/calcpp-driver.hh %XSRC%/examples/calcxx/calcxx-driver.hh
-test -f %XSRC%/examples/calcxx/calc++-parser.cc
-if not errorlevel 1 mv -f %XSRC%/examples/calcxx/calc++-parser.cc %XSRC%/examples/calcxx/calcxx-parser.cc
-test -f %XSRC%/examples/calcxx/calcxx-parser.cc
-if errorlevel 1 mv -f %XSRC%/examples/calcxx/calcpp-parser.cc %XSRC%/examples/calcxx/calcxx-parser.cc
-test -f %XSRC%/examples/calcxx/calc++-parser.hh
-if not errorlevel 1 mv -f %XSRC%/examples/calcxx/calc++-parser.hh %XSRC%/examples/calcxx/calcxx-parser.hh
-test -f %XSRC%/examples/calcxx/calcxx-parser.hh
-if errorlevel 1 mv -f %XSRC%/examples/calcxx/calcpp-parser.hh %XSRC%/examples/calcxx/calcxx-parser.hh
-test -f %XSRC%/examples/calcxx/calc++-parser.stamp
-if not errorlevel 1 mv -f %XSRC%/examples/calcxx/calc++-parser.stamp %XSRC%/examples/calcxx/calcxx-parser.stamp
-test -f %XSRC%/examples/calcxx/calcxx-parser.stamp
-if errorlevel 1 mv -f %XSRC%/examples/calcxx/calcpp-parser.stamp %XSRC%/examples/calcxx/calcxx-parser.stamp
-test -f %XSRC%/examples/calcxx/calc++-parser.yy
-if not errorlevel 1 mv -f %XSRC%/examples/calcxx/calc++-parser.yy %XSRC%/examples/calcxx/calcxx-parser.yy
-test -f %XSRC%/examples/calcxx/calcxx-parser.yy
-if errorlevel 1 mv -f %XSRC%/examples/calcxx/calcpp-parser.yy %XSRC%/examples/calcxx/calcxx-parser.yy
-test -f %XSRC%/examples/calcxx/calc++.cc
-if not errorlevel 1 mv -f %XSRC%/examples/calcxx/calc++.cc %XSRC%/examples/calcxx/calcxx.cc
-test -f %XSRC%/examples/calcxx/calcxx.cc
-if errorlevel 1 mv -f %XSRC%/examples/calcxx/calcpp.cc %XSRC%/examples/calcxx/calcxx.cc
-
-Rem Fixing #include lines in calcxx files.
-sed "/#[	 ]*include/s/++/xx/" %XSRC%/examples/calcxx/calcxx.cc > calcxx.cc
-if errorlevel 1 goto calcxxFileError
-mv ./calcxx.cc %XSRC%/examples/calcxx/calcxx.cc
-sed "/#[	 ]*include/s/++/xx/" %XSRC%/examples/calcxx/calcxx-driver.cc > calcxx-driver.cc
-if errorlevel 1 goto calcxxFileError
-mv ./calcxx-driver.cc %XSRC%/examples/calcxx/calcxx-driver.cc
-sed "/#[	 ]*include/s/++/xx/" %XSRC%/examples/calcxx/calcxx-driver.hh > calcxx-driver.hh
-if errorlevel 1 goto calcxxFileError
-mv ./calcxx-driver.hh %XSRC%/examples/calcxx/calcxx-driver.hh
-sed "/#[	 ]*include/s/++/xx/" %XSRC%/examples/calcxx/calcxx-parser.cc > calcxx-parser.cc
-if errorlevel 1 goto calcxxFileError
-mv ./calcxx-parser.cc %XSRC%/examples/calcxx/calcxx-parser.cc
-sed "/#[	 ]*include/s/++/xx/" %XSRC%/examples/calcxx/calcxx-parser.hh > calcxx-parser.hh
-if errorlevel 1 goto calcxxFileError
-mv ./calcxx-parser.hh %XSRC%/examples/calcxx/calcxx-parser.hh
-:sed "/#[	 ]*include/s/++/xx/" %XSRC%/examples/calcxx/calcxx-parser.yy > calcxx-parser.yy
-:if errorlevel 1 goto calcxxFileError
-:mv ./calcxx-parser.yy %XSRC%/examples/calcxx/calcxx-parser.yy
-sed "/#[	 ]*include/s/++/xx/" %XSRC%/examples/calcxx/calcxx-scanner.cc > calcxx-scanner.cc
-if errorlevel 1 goto calcxxFileError
-mv ./calcxx-scanner.cc %XSRC%/examples/calcxx/calcxx-scanner.cc
-:sed "/#[	 ]*include/s/++/xx/" %XSRC%/examples/calcxx/calcxx-scanner.ll > calcxx-scanner.ll
-:if errorlevel 1 goto calcxxFileError
-:mv ./calcxx-scanner.ll %XSRC%/examples/calcxx/calcxx-scanner.ll
-sed "s/calc++/calcxx/" %XSRC%/examples/calcxx/test > test
-if errorlevel 1 goto calcxxFileError
-mv ./test %XSRC%/examples/calcxx/test
-
-
-Rem Fixing the scanner files to make file names 8.3 valid.
-Rem Use only if you want to change the scan-gram.l and scan-skel.l files.
-: sed "/outfile=/s/\.yy/yy/" %XSRC%/src/scan-gram.l > scan-gram.l
-: if errorlevel 1 goto ScannerFileError
-: mv ./scan-gram.l %XSRC%/src/scan-gram.l
-: sed "/outfile=/s/\.yy/yy/" %XSRC%/src/scan-skel.l > scan-skel.l
-: if errorlevel 1 goto ScannerFileError
-: mv ./scan-skel.l %XSRC%/src/scan-skel.l
-
-
-Rem This is required because DOS/Windows are case-insensitive
-Rem to file names, and "make install" will do nothing if Make
-Rem finds a file called `install'.
-if exist INSTALL ren INSTALL INSTALL.txt
-
-Rem Set SHELL to a sane default or some configure tests stop working
-Rem if the package is configured across partitions.
-if not "%SHELL%" == "" goto HomeName
-set SHELL=/bin/sh
-if not "%SHELL%" == "/bin/sh" goto SmallEnv
-echo No SHELL found in the environment, using default value
-
-:HomeName
-Rem Set HOME to a sane default so configure stops complaining.
-if not "%HOME%" == "" goto HostName
-set HOME=%XSRC%/djgpp
-if not "%HOME%" == "%XSRC%/djgpp" goto SmallEnv
-echo No HOME found in the environment, using default value
-
-:HostName
-Rem Set HOSTNAME so it shows in config.status
-if not "%HOSTNAME%" == "" goto hostdone
-if "%windir%" == "" goto msdos
-set OS=MS-Windows
-if not "%OS%" == "MS-Windows" goto SmallEnv
-goto haveos
-:msdos
-set OS=MS-DOS
-if not "%OS%" == "MS-DOS" goto SmallEnv
-:haveos
-if not "%USERNAME%" == "" goto haveuname
-if not "%USER%" == "" goto haveuser
-echo No USERNAME and no USER found in the environment, using default values
-set HOSTNAME=Unknown PC
-if not "%HOSTNAME%" == "Unknown PC" goto SmallEnv
-goto userdone
-:haveuser
-set HOSTNAME=%USER%'s PC
-if not "%HOSTNAME%" == "%USER%'s PC" goto SmallEnv
-goto userdone
-:haveuname
-set HOSTNAME=%USERNAME%'s PC
-if not "%HOSTNAME%" == "%USERNAME%'s PC" goto SmallEnv
-:userdone
-set _HOSTNAME=%HOSTNAME%, %OS%
-if not "%_HOSTNAME%" == "%HOSTNAME%, %OS%" goto SmallEnv
-set HOSTNAME=%_HOSTNAME%
-:hostdone
-set _HOSTNAME=
-set OS=
-
-Rem install-sh is required by the configure script but clashes with the
-Rem various Makefile install-foo targets, so we MUST have it before the
-Rem script runs and rename it afterwards
-test -f %XSRC%/install-sh
-if not errorlevel 1 goto NoRen0
-test -f %XSRC%/install-sh.sh
-if not errorlevel 1 mv -f %XSRC%/install-sh.sh %XSRC%/install-sh
-:NoRen0
-
-if "%NLS%" == "disabled" goto WithoutNLS
-
-:WithNLS
-Rem Check for the needed libraries and binaries.
-test -x /dev/env/DJDIR/bin/msgfmt.exe
-if errorlevel 1 goto MissingNLSTools
-test -x /dev/env/DJDIR/bin/xgettext.exe
-if errorlevel 1 goto MissingNLSTools
-test -f /dev/env/DJDIR/include/libcharset.h
-if errorlevel 1 goto MissingNLSTools
-test -f /dev/env/DJDIR/lib/libcharset.a
-if errorlevel 1 goto MissingNLSTools
-test -f /dev/env/DJDIR/include/iconv.h
-if errorlevel 1 goto MissingNLSTools
-test -f /dev/env/DJDIR/lib/libiconv.a
-if errorlevel 1 goto MissingNLSTools
-test -f /dev/env/DJDIR/include/libintl.h
-if errorlevel 1 goto MissingNLSTools
-test -f /dev/env/DJDIR/lib/libintl.a
-if errorlevel 1 goto MissingNLSTools
-
-Rem Recreate the files in the %XSRC%/po subdir with our ported tools.
-redir -e /dev/null rm %XSRC%/po/*.gmo
-redir -e /dev/null rm %XSRC%/po/bison.pot
-redir -e /dev/null rm %XSRC%/po/cat-id-tbl.c
-redir -e /dev/null rm %XSRC%/po/stamp-cat-id
-
-Rem Update the arguments file for the configure script.
-Rem We prefer without-included-gettext because libintl.a from gettext package
-Rem is the only one that is garanteed to have been ported to DJGPP.
-echo --enable-nls --without-included-gettext >> arguments
-goto ConfigurePackage
-
-:MissingNLSTools
-echo Needed libs/tools for NLS not found. Configuring without NLS.
-:WithoutNLS
-Rem Update the arguments file for the configure script.
-echo --disable-nls >> arguments
-
-:ConfigurePackage
-echo Running the ./configure script...
-sh ./configure @arguments
-if errorlevel 1 goto CfgError
-rm arguments
-echo Done.
-goto End
-
-:lalr1_ccFileError
-echo ./data/lalr1.cc file editing failed!
-goto End
-
-:glr_ccFileError
-echo ./data/glr.cc file editing failed!
-goto End
-
-:location_ccFileError
-echo ./data/location.cc file editing failed!
-goto End
-
-:calcxxFileError
-echo ./examples/calcxx file editing failed!
-goto End
-
-:ScannerFileError
-echo ./scanner file editing failed!
-goto End
-
-:SedError
-echo ./configure script editing failed!
-goto End
-
-:SedError2
-echo ./config.hin editing failed!
-goto End
-
-:CfgError
-echo ./configure script exited abnormally!
-goto End
-
-:SmallEnv
-echo Your environment size is too small.  Enlarge it and run me again.
-echo Configuration NOT done!
-
-:End
-test -f %XSRC%/install-sh.sh
-if not errorlevel 1 goto NoRen1
-test -f %XSRC%/install-sh
-if not errorlevel 1 mv -f %XSRC%/install-sh %XSRC%/install-sh.sh
-:NoRen1
-if "%SHELL%" == "/bin/sh" set SHELL=
-if "%HOME%" == "%XSRC%/djgpp" set HOME=
-set CONFIG_SITE=
-set HOSTNAME=
-set NLS=
-set XSRC=
diff --git a/djgpp/config.sed b/djgpp/config.sed
deleted file mode 100644
index 0869e8c..0000000
--- a/djgpp/config.sed
+++ /dev/null
@@ -1,164 +0,0 @@
-# DJGPP specific configuration file.
-# Sed script for additional DJGPP specific editing
-# of the configure script generated by autoconf 2.57.
-
-
-# Copyright (C) 2005, 2006 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 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, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-# Additional editing of Makefiles
-/(echo[	 ]*':t/ a\
-# DJGPP specific Makefile changes.\
-  /^aliaspath *	*=/s,:,";",g;t t\
-  /TEXINPUTS=/s,:,";",g;t t\
-  /PATH=/s,:,";",g;t t\
-  s,\\.deps,_deps,g;t t\
-  s,\\.new\\.,_new.,g;t t\
-  s,\\.old\\.,_old.,g;t t\
-  s,c++\\.at,cxx.at,g;t t\
-  s,c++\\.m4,cxx.m4,g;t t\
-  s,calc++,calcxx,g;t t\
-  s,scan-gram-c,c-scan-gram,g;t t\
-  s,scan-skel-c,c-scan-skel,g;t t\
-  s,Makefile\\.in\\.in,Makefile.in-in,g;t t\
-  s,Makefile\\.am\\.in,Makefile.am-in,g;t t\
-  s,(MAKEINFOFLAGS),& --no-split,\
-  /^install-info-am:/,/^$/ {\
-    /@list=/ s,\\\$(INFO_DEPS),& bison.i,\
-    /@for *file/ s,\\\$(INFO_DEPS),& bison.i,\
-    s,file-\\[0-9\\]\\[0-9\\],& \\$\\$file[0-9] \\$\\$file[0-9][0-9],\
-  }\
-  /^\\.y\\.c:/,/^$/ {\
-    /\\\$(YACCCOMPILE)/ {\
-      a\\\
-	-@test -f y.tab.c && mv -f y.tab.c y_tab.c\\\
-	-@test -f y.tab.h && mv -f y.tab.h y_tab.h\
-    }\
-  }\
-/^libbison.a:/ i\\\
-\\$(top_srcdir)/djgpp/subpipe.c: \\$(top_srcdir)/djgpp/subpipe.h\\\
-subpipe.o: \\$(top_srcdir)/djgpp/subpipe.c \\$(top_srcdir)/djgpp/subpipe.h\\\
-	\\$(COMPILE) -c \\$<\
-/^yacc:/ i\\\
-yacc.bat:\\\
-	echo "bison\\$(EXEEXT) -y %1 %2 %3 %4 %5 %6 %7 %8 %9" >\\$@\
-/^bin_SCRIPTS =/s/$/ yacc.bat/\
-/^MOSTLYCLEANFILES = yacc/s/$/ yacc.bat/
-
-
-# Makefile.in.in is renamed to Makefile.in-in.
-/ac_config_files=/,/_ACEOF/ {
-  s|po/Makefile\.in|&:po/Makefile.in-in|
-}
-/CONFIG_FILES=/ s|po/Makefile\.in|&:po/Makefile.in-in|2
-
-# We always use _deps and _libs instead of .deps and .libs, because
-# the latter is an invalid name on 8+3 MS-DOS file system.  This makes
-# the generated Makefiles good for every DJGPP installation, not only
-# the one where the package was configured (which could happen to be
-# a Windows box, where leading dots in file names are allowed).
-s,\.deps,_deps,g
-s,\.libs,_libs,g
-/^rmdir[	 ]*\.tst/ i\
-am__leading_dot=_
-
-# Replace (command) > /dev/null with `command > /dev/null`, since
-# parenthesized commands always return zero status in the ported Bash,
-# even if the named command doesn't exist
-/if ([^|;`]*null/{
-  s,(,`,
-  s,),,
-  /null[	 ]*2>&1/ s,2>&1,&`,
-  /null.*null/ s,null.*null,&`,
-  /null.*null/ !{
-    /null[	 ]*2>&1/ !s,null,&`,
-  }
-}
-
-# DOS-style absolute file names should be supported as well
-/\*) top_srcdir=/s,/\*,[\\\\/]* | ?:[\\\\/]*,
-
-# Prevent the spliting of subs.sed.
-# The sed script: subs.sed is split into 48 lines long files.
-# This will produce sed scripts called subs-$ac_sed_frag.sed, where
-# $ac_sed_frag is some unique number. This will not work if the splited
-# sed script contains a multiple line sed command at line #48. In this
-# case the first part of the multiple line sed command will be written
-# at the end of one particular subs-$ac_sed_frag.sed and the rest of the
-# sed command will be written at the begining of the next subs-$ac_sed_frag.sed
-# making both sed script useless.
-# This matches the configure script produced by Autoconf 2.57
-/ac_max_sed_lines=[0-9]/ s,=.*$,=`sed -n "$=" $tmp/subs.sed`,
-
-# The following two items are changes needed for configuring
-# and compiling across partitions.
-# 1) The given srcdir value is always translated from the
-#    "x:" syntax into "/dev/x" syntax while we run configure.
-/^[	 ]*-srcdir=\*.*$/ a\
-    ac_optarg=`echo "$ac_optarg" | sed "s,^\\([A-Za-z]\\):,/dev/\\1,"`
-/set X `ls -Lt \$srcdir/ i\
-   if `echo $srcdir | grep "^/dev/" - > /dev/null`; then\
-     srcdir=`echo "$srcdir" | sed -e "s%^/dev/%%" -e "s%/%:/%"`\
-   fi
-
-# Autoconf 2.52e generated configure scripts
-# write absolute paths into Makefiles and bison.in
-# making them useless for DJGPP installations for
-# which the package has not been configured for.
-/MISSING=/,/^$/ {
-  /^fi$/ a\
-am_missing_run=`echo "$am_missing_run" | sed 's%/dev.*/bison[-_0-9]\\{1,1\\}[-.0-9A-z]*%${top_srcdir}%;s%.:.*/bison[-_0-9]\\{1,1\\}[-.0-9A-z]*%${top_srcdir}%'`
-}
-/^install_sh=/a\
-install_sh=`echo "$install_sh" | sed 's%/dev.*/bison[-_0-9]\\{1,1\\}[-.0-9A-z]*%${top_srcdir}%;s%.:.*/bison[-_0-9]\\{1,1\\}[-.0-9A-z]*%${top_srcdir}%'`
-
-# This will only work if the assumption that the
-# testsuite is ran from the following path:
-#   ${top_srcdir}/tests/testsuite.dir
-# holds. The explicit names are of no importance.
-#   ../../. == ${top_srcdir}
-/\.)[	 ]*ac_abs_builddir=/,/^esac$/ {
- /^esac$/ a\
-ac_abs_builddir=`echo "$ac_abs_builddir" | sed "s%/dev.*/bison[-_0-9]\\{1,1\\}[-.0-9A-z]*/[^/]*%../../.%;s%.:.*/bison[-_0-9]\\{1,1\\}[-.0-9A-z]*/[^/]*%../../.%"`
-}
-/\.)[	 ]*ac_abs_top_builddir=/,/^esac$/ {
- /^esac$/ a\
-ac_abs_top_builddir=`echo "$ac_abs_top_builddir" | sed "s%/dev.*/bison[-_0-9]\\{1,1\\}[-.0-9A-z]*/[^/]*%../../../%;s%.:.*/bison[-_0-9]\\{1,1\\}[-.0-9A-z]*/[^/]*%../../../%"`
-}
-/\.)[	 ]*ac_abs_srcdir=/,/^esac$/ {
- /^esac$/ a\
-ac_abs_srcdir=`echo "$ac_abs_srcdir" | sed "s%/dev.*/bison[-_0-9]\\{1,1\\}[-.0-9A-z]*/[^/]*%../../.%;s%.:.*/bison[-_0-9]\\{1,1\\}[-.0-9A-z]*/[^/]*%../../.%"`
-}
-/\.)[	 ]*ac_abs_top_srcdir=/,/^esac$/ {
- /^esac$/ a\
-ac_abs_top_srcdir=`echo "$ac_abs_top_srcdir" | sed "s%/dev.*/bison[-_0-9]\\{1,1\\}[-.0-9A-z]*/[^/]*%../../../%;s%.:.*/bison[-_0-9]\\{1,1\\}[-.0-9A-z]*/[^/]*%../../../%"`
-}
-
-# Add DJGPP version information.
-/^#define VERSION/ s/\$VERSION/&  (DJGPP port (r1))/
-
-# We need makeinfo to make the html formated docs.
-/\$am_missing_run[	 ]*makeinfo/ s,\$am_missing_run,,
-
-# The path to the FORTRAN compiler and libraries
-# shall contain no absolute path reference so it
-# will be good for all djgpp installations.
-/^FLIBS="\$ac_cv_flibs"/ i\
-ac_djgpp_path=`echo "$DJDIR" | sed 's%\\\\\\%/%g' | tr $as_cr_LETTERS $as_cr_letters`\
-ac_cv_flibs=`echo "$ac_cv_flibs" | sed "s%-L$ac_djgpp_path%-L/dev/env/DJDIR%g"`
-
-# The following is not a valid DOS file name
-s/calc++/calcxx/g
diff --git a/djgpp/config.site b/djgpp/config.site
deleted file mode 100644
index a545370..0000000
--- a/djgpp/config.site
+++ /dev/null
@@ -1,83 +0,0 @@
-#! /bin/sh
-
-# This is the config.site file for configuring GNU packages
-# which are to be built with DJGPP tools.
-
-# Copyright (C) 2005, 2006 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.
-
-
-# Include the djgpp subdirectory in PATH, so that getconf is found
-PATH="$srcdir/djgpp:$PATH"
-
-# These two variables are required, otherwise looking for
-# programs along the PATH will not work.
-PATH_SEPARATOR=:
-PATH_EXPAND=y
-
-# This is required in for "test -f foo" to find foo.exe
-export TEST_FINDS_EXE=y
-
-# The root of the DJGPP tree serves as the default prefix
-test "x$prefix" = xNONE && prefix='/dev/env/DJDIR'
-
-# This is required for config.status script to be run, since
-# ./configure runs it by invoking ${CONFIG_SHELL-/bin/sh}
-CONFIG_SHELL=${CONFIG_SHELL='sh'}
-
-# These are set here so the generated Makefile's will be good
-# for every DJGPP installation, not only the one where the
-# package was configured.
-# $INSTALL must be an absolute path name, otherwise config.status
-# will try to prepend ./ and ../ to it when it goes into subdirs.
-INSTALL=${INSTALL='/dev/env/DJDIR/bin/ginstall -c'}
-RANLIB=${RANLIB='ranlib'}
-GMSGFMT=${GMSGFMT='/dev/env/DJDIR/bin/msgfmt'}
-MSGFMT=${MSGFMT='/dev/env/DJDIR/bin/msgfmt'}
-XGETTEXT=${XGETTEXT='/dev/env/DJDIR/bin/xgettext'}
-AWK=${AWK='gawk'}
-
-# A sane default for emacs.
-ac_cv_path_EMACS=${EMACS='/dev/env/DJDIR/gnu/emacs/bin/emacs'}
-
-# A sane default for m4.
-ac_cv_path_M4=${M4='/dev/env/DJDIR/bin/m4'}
-
-# A sane default for grep.
-ac_cv_path_GREP=${GREP='/dev/env/DJDIR/bin/grep'}
-
-# A sane default for egrep.
-ac_cv_path_EGREP=${EGREP='/dev/env/DJDIR/bin/egrep'}
-
-# A sane default for fgrep.
-ac_cv_path_FGREP=${FGREP='/dev/env/DJDIR/bin/fgrep'}
-
-# A sane default for sed.
-ac_cv_path_SED=${SED='/dev/env/DJDIR/bin/sed'}
-
-# These are set here so the generated libtool will be good
-# for every DJGPP installation, not only the one where the
-# package was configured.
-NM=${NM='nm'}
-LD=${LD='ld'}
-
-# Force the test for 'ln -s' to report 'cp -pf'.
-ac_cv_prog_LN_S='cp -pf'
-
-# There is no fork and vfork functionality.
-ac_cv_func_fork=no
-ac_cv_func_vfork=no
-ac_cv_func_pipe=no
diff --git a/djgpp/config_h.sed b/djgpp/config_h.sed
deleted file mode 100644
index a8ea467..0000000
--- a/djgpp/config_h.sed
+++ /dev/null
@@ -1,29 +0,0 @@
-# sed script for DJGPP specific editing of config.hin
-
-# Copyright (C) 2005, 2006 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.
-
-
-$ a\
-\
-\
-/* DJGPP specific defines.  */\
-\
-#include <unistd.h>\
-#define TAB_EXT     ((pathconf(NULL, _PC_NAME_MAX) > 12) ? ".tab" : "_tab")\
-#define OUTPUT_EXT  ((pathconf(NULL, _PC_NAME_MAX) > 12) ? ".output" : ".out")\
-\
-#define DEFAULT_TMPDIR  "/dev/env/DJDIR/tmp"
diff --git a/djgpp/djunpack.bat b/djgpp/djunpack.bat
deleted file mode 100644
index 5b08a79..0000000
--- a/djgpp/djunpack.bat
+++ /dev/null
@@ -1,88 +0,0 @@
-@echo off
-Rem
-Rem WARNING WARNING WARNING: This file needs to have DOS CRLF end-of-line
-Rem format, or else stock DOS/Windows shells will refuse to run it.
-Rem
-Rem This batch file unpacks the Bison distribution while simultaneously
-Rem renaming some of the files whose names are invalid on DOS or conflict
-Rem with other file names after truncation to DOS 8+3 namespace.
-Rem
-Rem Copyright (C) 2005, 2006 Free Software Foundation, Inc.
-Rem
-Rem This program is free software; you can redistribute it and/or modify
-Rem it under the terms of the GNU General Public License as published by
-Rem the Free Software Foundation; either version 2, or (at your option)
-Rem any later version.
-Rem
-Rem This program is distributed in the hope that it will be useful,
-Rem but WITHOUT ANY WARRANTY; without even the implied warranty of
-Rem MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-Rem GNU General Public License for more details.
-Rem
-Rem You should have received a copy of the GNU General Public License
-Rem along with this program; if not, write to the Free Software Foundation,
-Rem Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-Rem
-Rem
-Rem Invoke like this:
-Rem
-Rem     djunpack bison-XYZ.tar.gz
-Rem or
-Rem     djunpack bison-XYZ.tar.bz2
-Rem
-Rem where XYZ is the version number.  If the argument includes leading
-Rem directories, it MUST use backslashes, not forward slashes.
-Rem
-
-set ENVIRONMENT_SIZE_TEST_STRING=ENVIRONMENT_SIZE_TEST_STRING
-if "%ENVIRONMENT_SIZE_TEST_STRING%"=="ENVIRONMENT_SIZE_TEST_STRING" GoTo EnvOk
-Rem If their environment space is too small, re-exec with a larger one
-command.com /e:4096 /c %0 %1
-GoTo End
-
-:EnvOk
-set ENVIRONMENT_SIZE_TEST_STRING=
-if "%1" == "" GoTo NoArgument
-if not exist %1 GoTo NoArchive
-Rem Extract top src dir from archive file.
-djtar -t %1 > top_src.dir
-Rem The following uses a feature of COPY whereby it does not copy
-Rem empty files.  We need that because the previous line will create
-Rem an empty fnchange.tmp even if the command failed for some reason.
-copy top_src.dir junk.tmp > nul
-if not exist junk.tmp GoTo NoDjTar
-del junk.tmp
-sed "1{s/^.*bison-/djtar -x -p -o bison-/;s|$|djgpp/fnchange.lst %%1 > fnchange.tmp|};2,$d" top_src.dir > ext_list.bat
-Rem See the comment above about the reason for using COPY.
-copy ext_list.bat junk.tmp > nul
-if not exist junk.tmp GoTo NoSed
-del junk.tmp
-Rem Extract fnchange.lst from archive.
-call ext_list.bat %1
-del ext_list.bat
-sed "1{s|^.*bison-|s/@V@/bison-|;s|$|g|};2,$d" top_src.dir > version.sed
-sed -f version.sed < fnchange.tmp > fnchange.lst
-del version.sed
-del fnchange.tmp
-del top_src.dir
-Rem unpack the source distribution
-djtar -x -n fnchange.lst %1
-del fnchange.lst
-GoTo End
-
-:NoSed
-del junk.tmp
-echo FAIL: Sed is not available.
-GoTo End
-:NoDjTar
-del junk.tmp
-echo FAIL: DJTAR is not available or no fnchange.lst file in %1.
-GoTo End
-:NoArchive
-echo FAIL: the file %1 does not seem to exist.
-echo Remember that %1 cannot use forward slashes, only backslashes.
-GoTo End
-:NoArgument
-echo FAIL: no archive file has been specified.
-echo Remember that the file name cannot use forward slashes, only backslashes.
-:End
diff --git a/djgpp/fnchange.lst b/djgpp/fnchange.lst
deleted file mode 100644
index 69a61e6..0000000
--- a/djgpp/fnchange.lst
+++ /dev/null
@@ -1,2 +0,0 @@
-@V@/src/scan-gram-c.c  @V@/src/c-scan-gram.c
-@V@/src/scan-skel-c.c  @V@/src/c-scan-skel.c
diff --git a/djgpp/subpipe.c b/djgpp/subpipe.c
deleted file mode 100644
index 33e2a38..0000000
--- a/djgpp/subpipe.c
+++ /dev/null
@@ -1,285 +0,0 @@
-/* Subprocesses with pipes.
-
-   Copyright (C) 2005, 2006 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-
-/* Written by Juan Manuel Guerrero <juan.guerrero@gmx.de>. */
-
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "subpipe.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <process.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "xalloc.h"
-
-
-#ifndef STDIN_FILENO
-# define STDIN_FILENO 0
-#endif
-#ifndef STDOUT_FILENO
-# define STDOUT_FILENO 1
-#endif
-
-
-#include "error.h"
-
-#include "gettext.h"
-#define _(Msgid)  gettext (Msgid)
-
-
-/* Initialize this module. */
-
-
-static int old_stdin;
-static int old_stdout;
-static char **arguments;
-static char tmp_file_name[2][L_tmpnam];
-
-#define remove_tmp_file(fd, name)                                     \
-  do {                                                                \
-    close ((fd));                                                     \
-    if (unlink ((name)))                                              \
-      error (EXIT_FAILURE, 0, _("removing of `%s' failed"), (name));  \
-  } while (0)
-
-
-void
-init_subpipe(void)
-{
-  int fd;
-
-  strcpy(tmp_file_name[0], "/dev/env/TMPDIR/bnXXXXXX");
-  fd = mkstemp(tmp_file_name[0]);
-  if (fd < 0)
-    error(EXIT_FAILURE, 0, _("creation of a temporary file failed"));
-  close (fd);
-
-  strcpy(tmp_file_name[1], "/dev/env/TMPDIR/bnXXXXXX");
-  fd = mkstemp(tmp_file_name[1]);
-  if (fd < 0)
-    error(EXIT_FAILURE, 0, _("creation of a temporary file failed"));
-  close (fd);
-}
-
-
-/* Create a subprocess that is run as a filter.  ARGV is the
-   NULL-terminated argument vector for the subprocess.  Store read and
-   write file descriptors for communication with the subprocess into
-   FD[0] and FD[1]: input meant for the process can be written into
-   FD[0], and output from the process can be read from FD[1].  Return
-   the subprocess id.
-
-   Because DOS has neither fork nor pipe functionality to run the subprocess
-   as a filter, the filter is reproduced using temporary files. First bison's
-   stdout is redirected to a temporary file. After bison has produced all of
-   is output, this file is closed and connected to m4's stdin. All m4's output
-   is redirected from m4's stdout to a second temporary file and reopened as
-   bison's stdin. */
-
-pid_t
-create_subpipe(char const *const *argv, int fd[2])
-{
-  int argc;
-  int from_in_fd;  /* pipe from bison to m4. */
-  pid_t pid;
-
-
-  pid = getpid();
-
-  /*
-   *  Save original stdin and stdout
-   *  for later restauration.
-   */
-  old_stdin = dup(STDIN_FILENO);
-  if (old_stdin < 0)
-    error(EXIT_FAILURE, 0, _("saving stdin failed"));
-
-  old_stdout = dup(STDOUT_FILENO);
-  if (old_stdout < 0)
-    error(EXIT_FAILURE, 0, _("saving stdout failed"));
-
-  /*
-   *  Save argv for later use.
-   */
-  for (argc = 0; argv[argc]; argc++)
-    ;
-  argc++;
-  arguments = xmalloc(argc * sizeof(arguments[0]));
-  for (argc = 0; argv[argc]; argc++)
-  {
-    arguments[argc] = xmalloc((strlen(argv[argc]) + 1) * sizeof(arguments[0][0]));
-    strcpy(arguments[argc], argv[argc]);
-  }
-  arguments[argc] = NULL;
-
-  /*
-   *  All bison's output will be gathered in this temporary file
-   *  and will be redirected to m4's stdin.
-   */
-  from_in_fd = open(tmp_file_name[0], O_WRONLY | O_CREAT | O_TRUNC, S_IWUSR);
-  if (from_in_fd < 0)
-    error(EXIT_FAILURE, 0, _("opening of tmpfile failed"));
-  if (dup2(from_in_fd, STDOUT_FILENO) < 0)
-  {
-    remove_tmp_file(from_in_fd, tmp_file_name[0]);
-    error(EXIT_FAILURE, 0, _("redirecting bison's stdout to the temporary file failed"));
-  }
-  close(from_in_fd);
-
-
-  fd[0] = STDOUT_FILENO;
-  return pid;
-}
-
-
-/* A signal handler that just records that a signal has happened. */
-static int child_interrupted;
-
-static void
-signal_catcher(int signo)
-{
-  child_interrupted++;
-}
-
-
-void
-end_of_output_subpipe(pid_t pid, int fd[2])
-{
-  char *program;
-  int from_out_fd = open(tmp_file_name[0], O_RDONLY, S_IRUSR);                   /* pipe from bison to m4. */
-  int to_in_fd = open(tmp_file_name[1], O_WRONLY | O_CREAT | O_TRUNC, S_IWUSR);  /* pipe from m4 to bison. */
-  int status;
-  void (*previous_handler)(int);
-
-
-  program = strrchr(arguments[0], '/');
-  if (program)
-    program++;
-  else
-    program = arguments[0];
-
-  /*
-   *  Redirect bison's output to m4's stdin.
-   */
-  if (from_out_fd < 0)
-    error(EXIT_FAILURE, 0, _("opening of tmpfile failed"));
-  if (dup2(from_out_fd, STDIN_FILENO) < 0)
-  {
-    remove_tmp_file(from_out_fd, tmp_file_name[0]);
-    error(EXIT_FAILURE, 0, _("redirecting m4's stdin from the temporary file failed"));
-  }
-  close(from_out_fd);
-
-  /*
-   *  All m4's output will be gathered in this temporary file
-   *  and will be redirected to bison's stdin.
-   */
-  if (to_in_fd < 0)
-  {
-    remove_tmp_file(STDIN_FILENO, tmp_file_name[0]);
-    error(EXIT_FAILURE, 0, _("opening of a temporary file failed"));
-  }
-  if (dup2(to_in_fd, STDOUT_FILENO) < 0)
-  {
-    remove_tmp_file(STDIN_FILENO, tmp_file_name[0]);
-    remove_tmp_file(to_in_fd, tmp_file_name[1]);
-    error(EXIT_FAILURE, 0, _("redirecting m4's stdout to a temporary file failed"));
-  }
-  close(to_in_fd);
-
-  /*
-   *  Run m4.
-   */
-  child_interrupted = 0;
-  errno = 0;
-  previous_handler = signal(SIGINT, signal_catcher);
-  status = spawnvp(P_WAIT, program, arguments);
-  signal(SIGINT, previous_handler);
-  if (child_interrupted)
-  {
-    remove_tmp_file(STDIN_FILENO, tmp_file_name[0]);
-    remove_tmp_file(STDOUT_FILENO, tmp_file_name[1]);
-    error(EXIT_FAILURE, 0, _("subsidiary program `%s' interrupted"), program);
-  }
-  if (status)
-  {
-    remove_tmp_file(STDIN_FILENO, tmp_file_name[0]);
-    remove_tmp_file(STDOUT_FILENO, tmp_file_name[1]);
-    error(EXIT_FAILURE, 0, _(errno == ENOENT
-			     ? "subsidiary program `%s' not found"
-			     : status < 1
-			     ? "subsidiary program `%s' failed"
-			     : "subsidiary program `%s' failed (status=%i, errno=%i)"), program, status, errno);
-  }
-
-
-  /*
-   *  Redirect m4's output to bison's stdin.
-   */
-  if (dup2(old_stdout, STDOUT_FILENO) < 0)
-    error(EXIT_FAILURE, 0, "restore of bison's stdout failed");
-  close(old_stdout);
-  to_in_fd = open(tmp_file_name[1], O_RDONLY, S_IRUSR);  /* pipe from m4 to bison. */
-  if (to_in_fd < 0)
-  {
-    remove_tmp_file(STDIN_FILENO, tmp_file_name[0]);
-    error(EXIT_FAILURE, 0, _("opening of tmpfile failed"));
-  }
-  if (dup2(to_in_fd, STDIN_FILENO) < 0)
-  {
-    remove_tmp_file(STDIN_FILENO, tmp_file_name[0]);
-    remove_tmp_file(to_in_fd, tmp_file_name[1]);
-    error(EXIT_FAILURE, -1, "dup2");
-    error(EXIT_FAILURE, 0, _("redirecting bison's stdin from the temporary file failed"));
-  }
-  close(to_in_fd);
-
-
-  fd[1] = STDIN_FILENO;
-}
-
-
-/* Free resources, unlink temporary files and restore stdin and stdout. */
-
-void
-reap_subpipe(pid_t pid, char const *program)
-{
-  int argc;
-
-  for (argc = 0; arguments[argc]; argc++)
-    free(arguments[argc]);
-  free(arguments);
-
-  if (unlink(tmp_file_name[0]))
-    error(EXIT_FAILURE, 0, _("removing of `%s' failed"), tmp_file_name[0]);
-  if (unlink(tmp_file_name[1]))
-    error(EXIT_FAILURE, 0, _("removing of `%s' failed"), tmp_file_name[1]);
-
-  if (dup2(old_stdin, STDIN_FILENO) < 0)
-    error(EXIT_FAILURE, 0, "restore of bison's stdin failed");
-  close(old_stdin);
-}
diff --git a/djgpp/subpipe.h b/djgpp/subpipe.h
deleted file mode 100644
index db2eb8c..0000000
--- a/djgpp/subpipe.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Subprocesses with pipes.
-   Copyright (C) 2005 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 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, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-/* Written by Juan Manuel Guerrero <juan.guerrero@gmx.de>. */
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-void init_subpipe(void);
-pid_t create_subpipe(char const * const *, int[2]);
-void end_of_output_subpipe(pid_t, int[2]);
-void reap_subpipe(pid_t, char const *);
diff --git a/doc/Makefile b/doc/Makefile
deleted file mode 100644
index 89398cd..0000000
--- a/doc/Makefile
+++ /dev/null
@@ -1,597 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# doc/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-srcdir = .
-top_srcdir = ..
-
-pkgdatadir = $(datadir)/bison
-pkglibdir = $(libdir)/bison
-pkgincludedir = $(includedir)/bison
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = /usr/bin/install -c
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-unknown-linux-gnu
-host_triplet = x86_64-unknown-linux-gnu
-subdir = doc
-DIST_COMMON = $(bison_TEXINFOS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(srcdir)/stamp-vti \
-	$(srcdir)/version.texi
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-SOURCES =
-DIST_SOURCES =
-INFO_DEPS = $(srcdir)/bison.info
-TEXINFO_TEX = $(top_srcdir)/build-aux/texinfo.tex
-am__TEXINFO_TEX_DIR = $(top_srcdir)/build-aux
-DVIS = bison.dvi
-PDFS = bison.pdf
-PSS = bison.ps
-HTMLS = bison.html
-TEXINFOS = bison.texinfo
-TEXI2DVI = texi2dvi
-TEXI2PDF = $(TEXI2DVI) --pdf --batch
-MAKEINFOHTML = $(MAKEINFO) --html
-AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
-DVIPS = dvips
-am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)"
-man1dir = $(mandir)/man1
-NROFF = nroff
-MANS = $(man_MANS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run aclocal-1.9
-AMDEP_FALSE = #
-AMDEP_TRUE = 
-AMTAR = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run tar
-AUTOCONF = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoconf
-AUTOHEADER = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoheader
-AUTOM4TE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autom4te
-AUTOMAKE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run automake-1.9
-AWK = gawk
-BISON_CXX_WORKS = :
-BISON_CXX_WORKS_FALSE = #
-BISON_CXX_WORKS_TRUE = 
-BISON_LOCALEDIR = /usr/share/locale
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPP = gcc -E
-CPPFLAGS = 
-CXX = g++
-CXXDEPMODE = depmode=gcc3
-CXXFLAGS = -g -O2
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = grep -E
-EXEEXT = 
-GCC = yes
-GETOPT_H = 
-GMSGFMT = /usr/bin/msgfmt
-HAVE__BOOL = 1
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
-INTLLIBS = 
-INTL_MACOSX_LIBS = 
-LDFLAGS = 
-LEX = flex
-LEXLIB = -lfl
-LEX_OUTPUT_ROOT = lex.yy
-LIBICONV = -liconv
-LIBINTL = 
-LIBOBJS =  dirname$U.o exitfail$U.o hard-locale$U.o hash$U.o quote$U.o quotearg$U.o fopen-safer$U.o dup-safer$U.o fd-safer$U.o pipe-safer$U.o xmalloc$U.o
-LIBS = 
-LTLIBICONV = -liconv
-LTLIBINTL = 
-LTLIBOBJS =  dirname$U.lo exitfail$U.lo hard-locale$U.lo hash$U.lo quote$U.lo quotearg$U.lo fopen-safer$U.lo dup-safer$U.lo fd-safer$U.lo pipe-safer$U.lo xmalloc$U.lo
-M4 = /usr/bin/m4
-MAKEINFO = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run makeinfo
-MKINSTALLDIRS = $(top_builddir)/build-aux/mkinstalldirs
-MSGFMT = /usr/bin/msgfmt
-MSGMERGE = /usr/bin/msgmerge
-O0CFLAGS = -g 
-O0CXXFLAGS = -g 
-OBJEXT = o
-PACKAGE = bison
-PACKAGE_BUGREPORT = bug-bison@gnu.org
-PACKAGE_NAME = GNU Bison
-PACKAGE_STRING = GNU Bison 2.3
-PACKAGE_TARNAME = bison
-PACKAGE_VERSION = 2.3
-PATH_SEPARATOR = :
-POSUB = po
-RANLIB = ranlib
-SET_MAKE = 
-SHELL = /bin/sh
-STDBOOL_H = 
-STRIP = 
-UNISTD_H = 
-USE_NLS = yes
-VALGRIND = 
-VERSION = 2.3
-WARNING_CFLAGS = 
-WARNING_CXXFLAGS = 
-WERROR_CFLAGS = 
-XGETTEXT = /usr/bin/xgettext
-YACC = bison -y
-YACC_LIBRARY = liby.a
-YACC_SCRIPT = yacc
-ac_ct_CC = gcc
-ac_ct_CXX = g++
-ac_ct_RANLIB = ranlib
-ac_ct_STRIP = 
-aclocaldir = ${datadir}/aclocal
-am__fastdepCC_FALSE = #
-am__fastdepCC_TRUE = 
-am__fastdepCXX_FALSE = #
-am__fastdepCXX_TRUE = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = ${AMTAR} chof - "$$tardir"
-am__untar = ${AMTAR} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-unknown-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = unknown
-datadir = ${prefix}/share
-exec_prefix = ${prefix}
-host = x86_64-unknown-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = unknown
-includedir = ${prefix}/include
-infodir = ${prefix}/info
-install_sh = /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localstatedir = ${prefix}/var
-mandir = ${prefix}/man
-mkdir_p = mkdir -p --
-oldincludedir = /usr/include
-prefix = /home/phanna/src/bison
-program_transform_name = s,x,x,
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-sysconfdir = ${prefix}/etc
-target_alias = 
-AM_MAKEINFOFLAGS = --no-split
-info_TEXINFOS = bison.texinfo
-man_MANS = bison.1
-bison_TEXINFOS = gpl.texi fdl.texi
-EXTRA_DIST = bison.1 refcard.tex
-CLEANFILES = refcard.dvi refcard.log refcard.ps bison.fns
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .dvi .html .info .pdf .ps .texinfo
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  doc/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  doc/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-.texinfo.info:
-	restore=: && backupdir="$(am__leading_dot)am$$$$" && \
-	am__cwd=`pwd` && cd $(srcdir) && \
-	rm -rf $$backupdir && mkdir $$backupdir && \
-	if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
-	  for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
-	    if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
-	  done; \
-	else :; fi && \
-	cd "$$am__cwd"; \
-	if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
-	 -o $@ $<; \
-	then \
-	  rc=0; \
-	  cd $(srcdir); \
-	else \
-	  rc=$$?; \
-	  cd $(srcdir) && \
-	  $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
-	fi; \
-	rm -rf $$backupdir; exit $$rc
-
-.texinfo.dvi:
-	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
-	MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
-	$(TEXI2DVI) $<
-
-.texinfo.pdf:
-	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
-	MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
-	$(TEXI2PDF) $<
-
-.texinfo.html:
-	rm -rf $(@:.html=.htp)
-	if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
-	 -o $(@:.html=.htp) $<; \
-	then \
-	  rm -rf $@; \
-	  if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
-	    mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
-	else \
-	  if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
-	    rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
-	  exit 1; \
-	fi
-$(srcdir)/bison.info: bison.texinfo $(srcdir)/version.texi $(bison_TEXINFOS)
-bison.dvi: bison.texinfo $(srcdir)/version.texi $(bison_TEXINFOS)
-bison.pdf: bison.texinfo $(srcdir)/version.texi $(bison_TEXINFOS)
-bison.html: bison.texinfo $(srcdir)/version.texi $(bison_TEXINFOS)
-$(srcdir)/version.texi:  $(srcdir)/stamp-vti
-$(srcdir)/stamp-vti: bison.texinfo $(top_srcdir)/configure
-	@(dir=.; test -f ./bison.texinfo || dir=$(srcdir); \
-	set `$(SHELL) $(top_srcdir)/build-aux/mdate-sh $$dir/bison.texinfo`; \
-	echo "@set UPDATED $$1 $$2 $$3"; \
-	echo "@set UPDATED-MONTH $$2 $$3"; \
-	echo "@set EDITION $(VERSION)"; \
-	echo "@set VERSION $(VERSION)") > vti.tmp
-	@cmp -s vti.tmp $(srcdir)/version.texi \
-	  || (echo "Updating $(srcdir)/version.texi"; \
-	      cp vti.tmp $(srcdir)/version.texi)
-	-@rm -f vti.tmp
-	@cp $(srcdir)/version.texi $@
-
-mostlyclean-vti:
-	-rm -f vti.tmp
-
-maintainer-clean-vti:
-	-rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi
-.dvi.ps:
-	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
-	$(DVIPS) -o $@ $<
-
-uninstall-info-am:
-	@$(PRE_UNINSTALL)
-	@if (install-info --version && \
-	     install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
-	  list='$(INFO_DEPS)'; \
-	  for file in $$list; do \
-	    relfile=`echo "$$file" | sed 's|^.*/||'`; \
-	    echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
-	    install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
-	  done; \
-	else :; fi
-	@$(NORMAL_UNINSTALL)
-	@list='$(INFO_DEPS)'; \
-	for file in $$list; do \
-	  relfile=`echo "$$file" | sed 's|^.*/||'`; \
-	  relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
-	  (if cd "$(DESTDIR)$(infodir)"; then \
-	     echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
-	     rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
-	   else :; fi); \
-	done
-
-dist-info: $(INFO_DEPS)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	list='$(INFO_DEPS)'; \
-	for base in $$list; do \
-	  case $$base in \
-	    $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
-	  esac; \
-	  if test -f $$base; then d=.; else d=$(srcdir); fi; \
-	  for file in $$d/$$base*; do \
-	    relfile=`expr "$$file" : "$$d/\(.*\)"`; \
-	    test -f $(distdir)/$$relfile || \
-	      cp -p $$file $(distdir)/$$relfile; \
-	  done; \
-	done
-
-mostlyclean-aminfo:
-	-rm -rf bison.aux bison.cp bison.cps bison.fn bison.ky bison.kys bison.log \
-	  bison.pg bison.pgs bison.tmp bison.toc bison.tp bison.vr \
-	  bison.dvi bison.pdf bison.ps bison.html
-
-maintainer-clean-aminfo:
-	@list='$(INFO_DEPS)'; for i in $$list; do \
-	  i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
-	  echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
-	  rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
-	done
-install-man1: $(man1_MANS) $(man_MANS)
-	@$(NORMAL_INSTALL)
-	test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
-	@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.1*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
-	  else file=$$i; fi; \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    1*) ;; \
-	    *) ext='1' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
-	  $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
-	done
-uninstall-man1:
-	@$(NORMAL_UNINSTALL)
-	@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.1*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    1*) ;; \
-	    *) ext='1' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
-	  rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
-	done
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-	$(MAKE) $(AM_MAKEFLAGS) \
-	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
-	  dist-info
-check-am: all-am
-check: check-am
-all-am: Makefile $(INFO_DEPS) $(MANS)
-installdirs:
-	for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-local mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am: $(DVIS)
-
-html: html-am
-
-html-am: $(HTMLS)
-
-info: info-am
-
-info-am: $(INFO_DEPS)
-
-install-data-am: install-info-am install-man
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-info-am: $(INFO_DEPS)
-	@$(NORMAL_INSTALL)
-	test -z "$(infodir)" || $(mkdir_p) "$(DESTDIR)$(infodir)"
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	list='$(INFO_DEPS)'; \
-	for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	  esac; \
-	  if test -f $$file; then d=.; else d=$(srcdir); fi; \
-	  file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
-	  for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
-                       $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
-	    if test -f $$ifile; then \
-	      relfile=`echo "$$ifile" | sed 's|^.*/||'`; \
-	      echo " $(INSTALL_DATA) '$$ifile' '$(DESTDIR)$(infodir)/$$relfile'"; \
-	      $(INSTALL_DATA) "$$ifile" "$(DESTDIR)$(infodir)/$$relfile"; \
-	    else : ; fi; \
-	  done; \
-	done
-	@$(POST_INSTALL)
-	@if (install-info --version && \
-	     install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
-	  list='$(INFO_DEPS)'; \
-	  for file in $$list; do \
-	    relfile=`echo "$$file" | sed 's|^.*/||'`; \
-	    echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
-	    install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
-	  done; \
-	else : ; fi
-install-man: install-man1
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-aminfo \
-	maintainer-clean-generic maintainer-clean-vti
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-aminfo mostlyclean-generic mostlyclean-vti
-
-pdf: pdf-am
-
-pdf-am: $(PDFS)
-
-ps: ps-am
-
-ps-am: $(PSS)
-
-uninstall-am: uninstall-info-am uninstall-man
-
-uninstall-man: uninstall-man1
-
-.PHONY: all all-am check check-am clean clean-generic clean-local \
-	dist-info distclean distclean-generic distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-man1 install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-aminfo maintainer-clean-generic \
-	maintainer-clean-vti mostlyclean mostlyclean-aminfo \
-	mostlyclean-generic mostlyclean-vti pdf pdf-am ps ps-am \
-	uninstall uninstall-am uninstall-info-am uninstall-man \
-	uninstall-man1
-
-
-clean-local:
-	rm -rf *.t2d
-
-refcard.dvi: refcard.tex
-	tex refcard.tex
-
-refcard.ps: refcard.dvi
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/doc/Makefile.am b/doc/Makefile.am
deleted file mode 100644
index 2466b26..0000000
--- a/doc/Makefile.am
+++ /dev/null
@@ -1,34 +0,0 @@
-## Process this file with automake to produce Makefile.in -*-Makefile-*-
-## Copyright (C) 2001, 2002, 2003, 2005, 2006 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 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, write to the Free Software
-## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-## 02110-1301  USA
-
-AM_MAKEINFOFLAGS = --no-split
-info_TEXINFOS = bison.texinfo
-man_MANS = bison.1
-bison_TEXINFOS = gpl.texi fdl.texi
-
-EXTRA_DIST = bison.1 refcard.tex
-
-CLEANFILES = refcard.dvi refcard.log refcard.ps bison.fns
-
-clean-local:
-	rm -rf *.t2d
-
-refcard.dvi: refcard.tex
-	tex refcard.tex
-
-refcard.ps: refcard.dvi
diff --git a/doc/Makefile.in b/doc/Makefile.in
deleted file mode 100644
index 6c87d7b..0000000
--- a/doc/Makefile.in
+++ /dev/null
@@ -1,597 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = doc
-DIST_COMMON = $(bison_TEXINFOS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(srcdir)/stamp-vti \
-	$(srcdir)/version.texi
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-SOURCES =
-DIST_SOURCES =
-INFO_DEPS = $(srcdir)/bison.info
-TEXINFO_TEX = $(top_srcdir)/build-aux/texinfo.tex
-am__TEXINFO_TEX_DIR = $(top_srcdir)/build-aux
-DVIS = bison.dvi
-PDFS = bison.pdf
-PSS = bison.ps
-HTMLS = bison.html
-TEXINFOS = bison.texinfo
-TEXI2DVI = texi2dvi
-TEXI2PDF = $(TEXI2DVI) --pdf --batch
-MAKEINFOHTML = $(MAKEINFO) --html
-AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
-DVIPS = dvips
-am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)"
-man1dir = $(mandir)/man1
-NROFF = nroff
-MANS = $(man_MANS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOM4TE = @AUTOM4TE@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BISON_CXX_WORKS = @BISON_CXX_WORKS@
-BISON_CXX_WORKS_FALSE = @BISON_CXX_WORKS_FALSE@
-BISON_CXX_WORKS_TRUE = @BISON_CXX_WORKS_TRUE@
-BISON_LOCALEDIR = @BISON_LOCALEDIR@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-GCC = @GCC@
-GETOPT_H = @GETOPT_H@
-GMSGFMT = @GMSGFMT@
-HAVE__BOOL = @HAVE__BOOL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTLLIBS = @INTLLIBS@
-INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
-LDFLAGS = @LDFLAGS@
-LEX = @LEX@
-LEXLIB = @LEXLIB@
-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
-LIBICONV = @LIBICONV@
-LIBINTL = @LIBINTL@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LTLIBICONV = @LTLIBICONV@
-LTLIBINTL = @LTLIBINTL@
-LTLIBOBJS = @LTLIBOBJS@
-M4 = @M4@
-MAKEINFO = @MAKEINFO@
-MKINSTALLDIRS = @MKINSTALLDIRS@
-MSGFMT = @MSGFMT@
-MSGMERGE = @MSGMERGE@
-O0CFLAGS = @O0CFLAGS@
-O0CXXFLAGS = @O0CXXFLAGS@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-POSUB = @POSUB@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STDBOOL_H = @STDBOOL_H@
-STRIP = @STRIP@
-UNISTD_H = @UNISTD_H@
-USE_NLS = @USE_NLS@
-VALGRIND = @VALGRIND@
-VERSION = @VERSION@
-WARNING_CFLAGS = @WARNING_CFLAGS@
-WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
-WERROR_CFLAGS = @WERROR_CFLAGS@
-XGETTEXT = @XGETTEXT@
-YACC = @YACC@
-YACC_LIBRARY = @YACC_LIBRARY@
-YACC_SCRIPT = @YACC_SCRIPT@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-aclocaldir = @aclocaldir@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-AM_MAKEINFOFLAGS = --no-split
-info_TEXINFOS = bison.texinfo
-man_MANS = bison.1
-bison_TEXINFOS = gpl.texi fdl.texi
-EXTRA_DIST = bison.1 refcard.tex
-CLEANFILES = refcard.dvi refcard.log refcard.ps bison.fns
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .dvi .html .info .pdf .ps .texinfo
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  doc/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  doc/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-.texinfo.info:
-	restore=: && backupdir="$(am__leading_dot)am$$$$" && \
-	am__cwd=`pwd` && cd $(srcdir) && \
-	rm -rf $$backupdir && mkdir $$backupdir && \
-	if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
-	  for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
-	    if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
-	  done; \
-	else :; fi && \
-	cd "$$am__cwd"; \
-	if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
-	 -o $@ $<; \
-	then \
-	  rc=0; \
-	  cd $(srcdir); \
-	else \
-	  rc=$$?; \
-	  cd $(srcdir) && \
-	  $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
-	fi; \
-	rm -rf $$backupdir; exit $$rc
-
-.texinfo.dvi:
-	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
-	MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
-	$(TEXI2DVI) $<
-
-.texinfo.pdf:
-	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
-	MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
-	$(TEXI2PDF) $<
-
-.texinfo.html:
-	rm -rf $(@:.html=.htp)
-	if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
-	 -o $(@:.html=.htp) $<; \
-	then \
-	  rm -rf $@; \
-	  if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
-	    mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
-	else \
-	  if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
-	    rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
-	  exit 1; \
-	fi
-$(srcdir)/bison.info: bison.texinfo $(srcdir)/version.texi $(bison_TEXINFOS)
-bison.dvi: bison.texinfo $(srcdir)/version.texi $(bison_TEXINFOS)
-bison.pdf: bison.texinfo $(srcdir)/version.texi $(bison_TEXINFOS)
-bison.html: bison.texinfo $(srcdir)/version.texi $(bison_TEXINFOS)
-$(srcdir)/version.texi:  $(srcdir)/stamp-vti
-$(srcdir)/stamp-vti: bison.texinfo $(top_srcdir)/configure
-	@(dir=.; test -f ./bison.texinfo || dir=$(srcdir); \
-	set `$(SHELL) $(top_srcdir)/build-aux/mdate-sh $$dir/bison.texinfo`; \
-	echo "@set UPDATED $$1 $$2 $$3"; \
-	echo "@set UPDATED-MONTH $$2 $$3"; \
-	echo "@set EDITION $(VERSION)"; \
-	echo "@set VERSION $(VERSION)") > vti.tmp
-	@cmp -s vti.tmp $(srcdir)/version.texi \
-	  || (echo "Updating $(srcdir)/version.texi"; \
-	      cp vti.tmp $(srcdir)/version.texi)
-	-@rm -f vti.tmp
-	@cp $(srcdir)/version.texi $@
-
-mostlyclean-vti:
-	-rm -f vti.tmp
-
-maintainer-clean-vti:
-	-rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi
-.dvi.ps:
-	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
-	$(DVIPS) -o $@ $<
-
-uninstall-info-am:
-	@$(PRE_UNINSTALL)
-	@if (install-info --version && \
-	     install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
-	  list='$(INFO_DEPS)'; \
-	  for file in $$list; do \
-	    relfile=`echo "$$file" | sed 's|^.*/||'`; \
-	    echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
-	    install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
-	  done; \
-	else :; fi
-	@$(NORMAL_UNINSTALL)
-	@list='$(INFO_DEPS)'; \
-	for file in $$list; do \
-	  relfile=`echo "$$file" | sed 's|^.*/||'`; \
-	  relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
-	  (if cd "$(DESTDIR)$(infodir)"; then \
-	     echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
-	     rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
-	   else :; fi); \
-	done
-
-dist-info: $(INFO_DEPS)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	list='$(INFO_DEPS)'; \
-	for base in $$list; do \
-	  case $$base in \
-	    $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
-	  esac; \
-	  if test -f $$base; then d=.; else d=$(srcdir); fi; \
-	  for file in $$d/$$base*; do \
-	    relfile=`expr "$$file" : "$$d/\(.*\)"`; \
-	    test -f $(distdir)/$$relfile || \
-	      cp -p $$file $(distdir)/$$relfile; \
-	  done; \
-	done
-
-mostlyclean-aminfo:
-	-rm -rf bison.aux bison.cp bison.cps bison.fn bison.ky bison.kys bison.log \
-	  bison.pg bison.pgs bison.tmp bison.toc bison.tp bison.vr \
-	  bison.dvi bison.pdf bison.ps bison.html
-
-maintainer-clean-aminfo:
-	@list='$(INFO_DEPS)'; for i in $$list; do \
-	  i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
-	  echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
-	  rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
-	done
-install-man1: $(man1_MANS) $(man_MANS)
-	@$(NORMAL_INSTALL)
-	test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
-	@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.1*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
-	  else file=$$i; fi; \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    1*) ;; \
-	    *) ext='1' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
-	  $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
-	done
-uninstall-man1:
-	@$(NORMAL_UNINSTALL)
-	@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.1*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    1*) ;; \
-	    *) ext='1' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
-	  rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
-	done
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-	$(MAKE) $(AM_MAKEFLAGS) \
-	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
-	  dist-info
-check-am: all-am
-check: check-am
-all-am: Makefile $(INFO_DEPS) $(MANS)
-installdirs:
-	for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-local mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am: $(DVIS)
-
-html: html-am
-
-html-am: $(HTMLS)
-
-info: info-am
-
-info-am: $(INFO_DEPS)
-
-install-data-am: install-info-am install-man
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-info-am: $(INFO_DEPS)
-	@$(NORMAL_INSTALL)
-	test -z "$(infodir)" || $(mkdir_p) "$(DESTDIR)$(infodir)"
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	list='$(INFO_DEPS)'; \
-	for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	  esac; \
-	  if test -f $$file; then d=.; else d=$(srcdir); fi; \
-	  file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
-	  for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
-                       $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
-	    if test -f $$ifile; then \
-	      relfile=`echo "$$ifile" | sed 's|^.*/||'`; \
-	      echo " $(INSTALL_DATA) '$$ifile' '$(DESTDIR)$(infodir)/$$relfile'"; \
-	      $(INSTALL_DATA) "$$ifile" "$(DESTDIR)$(infodir)/$$relfile"; \
-	    else : ; fi; \
-	  done; \
-	done
-	@$(POST_INSTALL)
-	@if (install-info --version && \
-	     install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
-	  list='$(INFO_DEPS)'; \
-	  for file in $$list; do \
-	    relfile=`echo "$$file" | sed 's|^.*/||'`; \
-	    echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
-	    install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
-	  done; \
-	else : ; fi
-install-man: install-man1
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-aminfo \
-	maintainer-clean-generic maintainer-clean-vti
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-aminfo mostlyclean-generic mostlyclean-vti
-
-pdf: pdf-am
-
-pdf-am: $(PDFS)
-
-ps: ps-am
-
-ps-am: $(PSS)
-
-uninstall-am: uninstall-info-am uninstall-man
-
-uninstall-man: uninstall-man1
-
-.PHONY: all all-am check check-am clean clean-generic clean-local \
-	dist-info distclean distclean-generic distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-man1 install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-aminfo maintainer-clean-generic \
-	maintainer-clean-vti mostlyclean mostlyclean-aminfo \
-	mostlyclean-generic mostlyclean-vti pdf pdf-am ps ps-am \
-	uninstall uninstall-am uninstall-info-am uninstall-man \
-	uninstall-man1
-
-
-clean-local:
-	rm -rf *.t2d
-
-refcard.dvi: refcard.tex
-	tex refcard.tex
-
-refcard.ps: refcard.dvi
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/doc/bison.1 b/doc/bison.1
deleted file mode 100644
index 5e1d962..0000000
--- a/doc/bison.1
+++ /dev/null
@@ -1,369 +0,0 @@
-.TH BISON 1 local
-.SH NAME
-bison \- GNU Project parser generator (yacc replacement)
-.SH SYNOPSIS
-.B bison
-[
-.BI \-b  " file-prefix"
-] [
-.BI \-\-file-prefix= file-prefix
-] [
-.B \-d
-] [
-.BI \-\-defines= defines-file
-] [
-.B \-g
-] [
-.BI \-\-graph= graph-file
-] [
-.B \-k
-] [
-.B \-\-token-table
-] [
-.B \-l
-] [
-.B \-\-no-lines
-] [
-.B \-n
-] [
-.B \-\-no-parser
-] [
-.BI \-o " outfile"
-] [
-.BI \-\-output-file= outfile
-] [
-.BI \-p " prefix"
-] [
-.BI \-\-name-prefix= prefix
-] [
-.B \-t
-] [
-.B \-\-debug
-] [
-.B \-v
-] [
-.B \-\-verbose
-] [
-.B \-V
-] [
-.B \-\-version
-] [
-.B \-y
-] [
-.B \-\-yacc
-] [
-.B \-h
-] [
-.B \-\-help
-] [
-.B \-\-fixed-output-files
-]
-file
-.br
-.B yacc
-[
-.I "similar options and operands"
-]
-.SH DESCRIPTION
-.I Bison
-is a parser generator in the style of
-.IR yacc (1).
-It should be upwardly compatible with input files designed
-for
-.IR yacc .
-.PP
-Input files should follow the
-.I yacc
-convention of ending in
-.BR .y .
-Unlike
-.IR yacc ,
-the generated files do not have fixed names, but instead use the prefix
-of the input file.
-Moreover, if you need to put
-.I C++
-code in the input file, you can end his name by a C++-like extension
-(.ypp or .y++), then bison will follow your extension to name the
-output file (.cpp or .c++).
-For instance, a grammar description file named
-.B parse.yxx
-would produce the generated parser in a file named
-.BR parse.tab.cxx ,
-instead of
-.IR yacc 's
-.B y.tab.c
-or old
-.I Bison
-version's
-.BR parse.tab.c .
-.PP
-This description of the options that can be given to
-.I bison
-is adapted from the node
-.B Invocation
-in the
-.B bison.texinfo
-manual, which should be taken as authoritative.
-.PP
-.I Bison
-supports both traditional single-letter options and mnemonic long
-option names.  Long option names are indicated with
-.B \-\-
-instead of
-.BR \- .
-Abbreviations for option names are allowed as long as they
-are unique.  When a long option takes an argument, like
-.BR \-\-file-prefix ,
-connect the option name and the argument with
-.BR = .
-.SS OPTIONS
-.TP
-.BI \-b " file-prefix"
-.br
-.ns
-.TP
-.BI \-\-file-prefix= file-prefix
-Specify a prefix to use for all
-.I bison
-output file names.  The names are
-chosen as if the input file were named
-\fIfile-prefix\fP\fB.c\fP.
-.TP
-.B \-d
-.br
-.ns
-Write an extra output file containing macro definitions for the token
-type names defined in the grammar and the semantic value type
-.BR YYSTYPE ,
-as well as a few
-.B extern
-variable declarations.
-.sp
-If the parser output file is named
-.IB name .c
-then this file
-is named
-\fIname\fP\fB.h\fP.
-.sp
-This output file is essential if you wish to put the definition of
-.B yylex
-in a separate source file, because
-.B yylex
-needs to be able to refer to token type codes and the variable
-.BR yylval .
-.TP
-.BI \-\-defines= defines-file
-The behavior of
-.B \-\-defines
-is the same than
-.B \-d
-option.
-The only difference is that it has an optional argument which is
-the name of the output filename.
-.TP
-.BI \-g
-.br
-.ns
-Output a VCG definition of the LALR(1) grammar automaton computed by
-Bison.  If the grammar file is
-.BR foo.y
-, the VCG output file will be
-.BR foo.vcg .
-.TP
-.BI \-\-graph= graph-file
-The behavior of
-.BI \-\-graph
-is the same than
-.BI \-g
-option.  The only difference is that it has an optional argument which
-is the name of the output graph filename.
-.TP
-.B \-k
-.br
-.ns
-.TP
-.B \-\-token-table
-This switch causes the
-.IB name .tab.c
-output to include a list of
-token names in order by their token numbers; this is defined in the array
-.IR yytname .
-Also generated
-are #defines for
-.IR YYNTOKENS ,
-.IR YYNNTS ,
-.IR YYNRULES ,
-and
-.IR YYNSTATES .
-.TP
-.B \-l
-.br
-.ns
-.TP
-.B \-\-no-lines
-Don't put any
-.B #line
-preprocessor commands in the parser file.
-Ordinarily
-.I bison
-puts them in the parser file so that the C compiler
-and debuggers will associate errors with your source file, the
-grammar file.  This option causes them to associate errors with the
-parser file, treating it an independent source file in its own right.
-.TP
-.B \-n
-.br
-.ns
-.TP
-.B \-\-no-parser
-Do not generate the parser code into the output; generate only
-declarations.  The generated
-.IB name .tab.c
-file will have only
-constant declarations.  In addition, a
-.IB name .act
-file is
-generated containing a switch statement body containing all the
-translated actions.
-.TP
-.BI \-o " outfile"
-.br
-.ns
-.TP
-.BI \-\-output-file= outfile
-Specify the name
-.I outfile
-for the parser file.
-.sp
-The other output files' names are constructed from
-.I outfile
-as described under the
-.B \-v
-and
-.B \-d
-switches.
-.TP
-.BI \-p " prefix"
-.br
-.ns
-.TP
-.BI \-\-name-prefix= prefix
-Rename the external symbols used in the parser so that they start with
-.I prefix
-instead of
-.BR yy .
-The precise list of symbols renamed is
-.BR yyparse ,
-.BR yylex ,
-.BR yyerror ,
-.BR yylval ,
-.BR yychar ,
-and
-.BR yydebug .
-.sp
-For example, if you use
-.BR "\-p c" ,
-the names become
-.BR cparse ,
-.BR clex ,
-and so on.
-.TP
-.B \-t
-.br
-.ns
-.TP
-.B \-\-debug
-In the parser file, define the macro
-.B YYDEBUG
-to 1 if it is not already defined,
-so that the debugging facilities are compiled.
-.TP
-.B \-v
-.br
-.ns
-.TP
-.B \-\-verbose
-Write an extra output file containing verbose descriptions of the
-parser states and what is done for each type of look-ahead token in
-that state.
-.sp
-This file also describes all the conflicts, both those resolved by
-operator precedence and the unresolved ones.
-.sp
-The file's name is made by removing
-.B .tab.c
-or
-.B .c
-from the parser output file name, and adding
-.B .output
-instead.
-.sp
-Therefore, if the input file is
-.BR foo.y ,
-then the parser file is called
-.B foo.tab.c
-by default.  As a consequence, the verbose
-output file is called
-.BR foo.output .
-.TP
-.B \-V
-.br
-.ns
-.TP
-.B \-\-version
-Print the version number of
-.I bison
-and exit.
-.TP
-.B \-h
-.br
-.ns
-.TP
-.B \-\-help
-Print a summary of the options to
-.I bison
-and exit.
-.TP
-.B \-y
-.br
-.ns
-.TP
-.B \-\-yacc
-.br
-.ns
-.TP
-.B \-\-fixed-output-files
-Equivalent to
-.BR "\-o y.tab.c" ;
-the parser output file is called
-.BR y.tab.c ,
-and the other outputs are called
-.B y.output
-and
-.BR y.tab.h .
-The purpose of this switch is to imitate
-.IR yacc 's
-output file name conventions.
-Thus, the following shell script can substitute for
-.I yacc
-and is often installed as
-.IR yacc :
-.sp
-.RS
-.ft B
-bison \-y "$@"
-.ft R
-.sp
-.RE
-.SH SEE ALSO
-.IR yacc (1)
-.br
-The
-.IR "Bison Reference Manual" ,
-included as the file
-.B bison.texinfo
-in the
-.I bison
-source distribution.
-.SH DIAGNOSTICS
-Self explanatory.
diff --git a/doc/bison.info b/doc/bison.info
deleted file mode 100644
index 7907515..0000000
--- a/doc/bison.info
+++ /dev/null
Binary files differ
diff --git a/doc/bison.texinfo b/doc/bison.texinfo
deleted file mode 100644
index 6c67b59..0000000
--- a/doc/bison.texinfo
+++ /dev/null
@@ -1,8715 +0,0 @@
-\input texinfo @c -*-texinfo-*-
-@comment %**start of header
-@setfilename bison.info
-@include version.texi
-@settitle Bison @value{VERSION}
-@setchapternewpage odd
-
-@finalout
-
-@c SMALL BOOK version
-@c This edition has been formatted so that you can format and print it in
-@c the smallbook format.
-@c @smallbook
-
-@c Set following if you want to document %default-prec and %no-default-prec.
-@c This feature is experimental and may change in future Bison versions.
-@c @set defaultprec
-
-@ifnotinfo
-@syncodeindex fn cp
-@syncodeindex vr cp
-@syncodeindex tp cp
-@end ifnotinfo
-@ifinfo
-@synindex fn cp
-@synindex vr cp
-@synindex tp cp
-@end ifinfo
-@comment %**end of header
-
-@copying
-
-This manual is for @acronym{GNU} Bison (version @value{VERSION},
-@value{UPDATED}), the @acronym{GNU} parser generator.
-
-Copyright @copyright{} 1988, 1989, 1990, 1991, 1992, 1993, 1995, 1998,
-1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-
-@quotation
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the @acronym{GNU} Free Documentation License,
-Version 1.2 or any later version published by the Free Software
-Foundation; with no Invariant Sections, with the Front-Cover texts
-being ``A @acronym{GNU} Manual,'' and with the Back-Cover Texts as in
-(a) below.  A copy of the license is included in the section entitled
-``@acronym{GNU} Free Documentation License.''
-
-(a) The @acronym{FSF}'s Back-Cover Text is: ``You have freedom to copy
-and modify this @acronym{GNU} Manual, like @acronym{GNU} software.
-Copies published by the Free Software Foundation raise funds for
-@acronym{GNU} development.''
-@end quotation
-@end copying
-
-@dircategory Software development
-@direntry
-* bison: (bison).       @acronym{GNU} parser generator (Yacc replacement).
-@end direntry
-
-@titlepage
-@title Bison
-@subtitle The Yacc-compatible Parser Generator
-@subtitle @value{UPDATED}, Bison Version @value{VERSION}
-
-@author by Charles Donnelly and Richard Stallman
-
-@page
-@vskip 0pt plus 1filll
-@insertcopying
-@sp 2
-Published by the Free Software Foundation @*
-51 Franklin Street, Fifth Floor @*
-Boston, MA  02110-1301  USA @*
-Printed copies are available from the Free Software Foundation.@*
-@acronym{ISBN} 1-882114-44-2
-@sp 2
-Cover art by Etienne Suvasa.
-@end titlepage
-
-@contents
-
-@ifnottex
-@node Top
-@top Bison
-@insertcopying
-@end ifnottex
-
-@menu
-* Introduction::
-* Conditions::
-* Copying::           The @acronym{GNU} General Public License says
-                        how you can copy and share Bison
-
-Tutorial sections:
-* Concepts::          Basic concepts for understanding Bison.
-* Examples::          Three simple explained examples of using Bison.
-
-Reference sections:
-* Grammar File::      Writing Bison declarations and rules.
-* Interface::         C-language interface to the parser function @code{yyparse}.
-* Algorithm::         How the Bison parser works at run-time.
-* Error Recovery::    Writing rules for error recovery.
-* Context Dependency::  What to do if your language syntax is too
-                        messy for Bison to handle straightforwardly.
-* Debugging::         Understanding or debugging Bison parsers.
-* Invocation::        How to run Bison (to produce the parser source file).
-* C++ Language Interface::  Creating C++ parser objects.
-* FAQ::               Frequently Asked Questions
-* Table of Symbols::  All the keywords of the Bison language are explained.
-* Glossary::          Basic concepts are explained.
-* Copying This Manual::  License for copying this manual.
-* Index::             Cross-references to the text.
-
-@detailmenu
- --- The Detailed Node Listing ---
-
-The Concepts of Bison
-
-* Language and Grammar::  Languages and context-free grammars,
-                            as mathematical ideas.
-* Grammar in Bison::  How we represent grammars for Bison's sake.
-* Semantic Values::   Each token or syntactic grouping can have
-                        a semantic value (the value of an integer,
-                        the name of an identifier, etc.).
-* Semantic Actions::  Each rule can have an action containing C code.
-* GLR Parsers::       Writing parsers for general context-free languages.
-* Locations Overview::    Tracking Locations.
-* Bison Parser::      What are Bison's input and output,
-                        how is the output used?
-* Stages::            Stages in writing and running Bison grammars.
-* Grammar Layout::    Overall structure of a Bison grammar file.
-
-Writing @acronym{GLR} Parsers
-
-* Simple GLR Parsers::      Using @acronym{GLR} parsers on unambiguous grammars.
-* Merging GLR Parses::      Using @acronym{GLR} parsers to resolve ambiguities.
-* GLR Semantic Actions::    Deferred semantic actions have special concerns.
-* Compiler Requirements::   @acronym{GLR} parsers require a modern C compiler.
-
-Examples
-
-* RPN Calc::          Reverse polish notation calculator;
-                        a first example with no operator precedence.
-* Infix Calc::        Infix (algebraic) notation calculator.
-                        Operator precedence is introduced.
-* Simple Error Recovery::  Continuing after syntax errors.
-* Location Tracking Calc:: Demonstrating the use of @@@var{n} and @@$.
-* Multi-function Calc::  Calculator with memory and trig functions.
-                           It uses multiple data-types for semantic values.
-* Exercises::         Ideas for improving the multi-function calculator.
-
-Reverse Polish Notation Calculator
-
-* Decls: Rpcalc Decls.  Prologue (declarations) for rpcalc.
-* Rules: Rpcalc Rules.  Grammar Rules for rpcalc, with explanation.
-* Lexer: Rpcalc Lexer.  The lexical analyzer.
-* Main: Rpcalc Main.    The controlling function.
-* Error: Rpcalc Error.  The error reporting function.
-* Gen: Rpcalc Gen.      Running Bison on the grammar file.
-* Comp: Rpcalc Compile. Run the C compiler on the output code.
-
-Grammar Rules for @code{rpcalc}
-
-* Rpcalc Input::
-* Rpcalc Line::
-* Rpcalc Expr::
-
-Location Tracking Calculator: @code{ltcalc}
-
-* Decls: Ltcalc Decls.  Bison and C declarations for ltcalc.
-* Rules: Ltcalc Rules.  Grammar rules for ltcalc, with explanations.
-* Lexer: Ltcalc Lexer.  The lexical analyzer.
-
-Multi-Function Calculator: @code{mfcalc}
-
-* Decl: Mfcalc Decl.      Bison declarations for multi-function calculator.
-* Rules: Mfcalc Rules.    Grammar rules for the calculator.
-* Symtab: Mfcalc Symtab.  Symbol table management subroutines.
-
-Bison Grammar Files
-
-* Grammar Outline::   Overall layout of the grammar file.
-* Symbols::           Terminal and nonterminal symbols.
-* Rules::             How to write grammar rules.
-* Recursion::         Writing recursive rules.
-* Semantics::         Semantic values and actions.
-* Locations::         Locations and actions.
-* Declarations::      All kinds of Bison declarations are described here.
-* Multiple Parsers::  Putting more than one Bison parser in one program.
-
-Outline of a Bison Grammar
-
-* Prologue::          Syntax and usage of the prologue.
-* Bison Declarations::  Syntax and usage of the Bison declarations section.
-* Grammar Rules::     Syntax and usage of the grammar rules section.
-* Epilogue::          Syntax and usage of the epilogue.
-
-Defining Language Semantics
-
-* Value Type::        Specifying one data type for all semantic values.
-* Multiple Types::    Specifying several alternative data types.
-* Actions::           An action is the semantic definition of a grammar rule.
-* Action Types::      Specifying data types for actions to operate on.
-* Mid-Rule Actions::  Most actions go at the end of a rule.
-                      This says when, why and how to use the exceptional
-                        action in the middle of a rule.
-
-Tracking Locations
-
-* Location Type::               Specifying a data type for locations.
-* Actions and Locations::       Using locations in actions.
-* Location Default Action::     Defining a general way to compute locations.
-
-Bison Declarations
-
-* Require Decl::      Requiring a Bison version.
-* Token Decl::        Declaring terminal symbols.
-* Precedence Decl::   Declaring terminals with precedence and associativity.
-* Union Decl::        Declaring the set of all semantic value types.
-* Type Decl::         Declaring the choice of type for a nonterminal symbol.
-* Initial Action Decl::  Code run before parsing starts.
-* Destructor Decl::   Declaring how symbols are freed.
-* Expect Decl::       Suppressing warnings about parsing conflicts.
-* Start Decl::        Specifying the start symbol.
-* Pure Decl::         Requesting a reentrant parser.
-* Decl Summary::      Table of all Bison declarations.
-
-Parser C-Language Interface
-
-* Parser Function::   How to call @code{yyparse} and what it returns.
-* Lexical::           You must supply a function @code{yylex}
-                        which reads tokens.
-* Error Reporting::   You must supply a function @code{yyerror}.
-* Action Features::   Special features for use in actions.
-* Internationalization::  How to let the parser speak in the user's
-                        native language.
-
-The Lexical Analyzer Function @code{yylex}
-
-* Calling Convention::  How @code{yyparse} calls @code{yylex}.
-* Token Values::      How @code{yylex} must return the semantic value
-                        of the token it has read.
-* Token Locations::   How @code{yylex} must return the text location
-                        (line number, etc.) of the token, if the
-                        actions want that.
-* Pure Calling::      How the calling convention differs
-                        in a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}).
-
-The Bison Parser Algorithm
-
-* Look-Ahead::        Parser looks one token ahead when deciding what to do.
-* Shift/Reduce::      Conflicts: when either shifting or reduction is valid.
-* Precedence::        Operator precedence works by resolving conflicts.
-* Contextual Precedence::  When an operator's precedence depends on context.
-* Parser States::     The parser is a finite-state-machine with stack.
-* Reduce/Reduce::     When two rules are applicable in the same situation.
-* Mystery Conflicts::  Reduce/reduce conflicts that look unjustified.
-* Generalized LR Parsing::  Parsing arbitrary context-free grammars.
-* Memory Management:: What happens when memory is exhausted.  How to avoid it.
-
-Operator Precedence
-
-* Why Precedence::    An example showing why precedence is needed.
-* Using Precedence::  How to specify precedence in Bison grammars.
-* Precedence Examples::  How these features are used in the previous example.
-* How Precedence::    How they work.
-
-Handling Context Dependencies
-
-* Semantic Tokens::   Token parsing can depend on the semantic context.
-* Lexical Tie-ins::   Token parsing can depend on the syntactic context.
-* Tie-in Recovery::   Lexical tie-ins have implications for how
-                        error recovery rules must be written.
-
-Debugging Your Parser
-
-* Understanding::     Understanding the structure of your parser.
-* Tracing::           Tracing the execution of your parser.
-
-Invoking Bison
-
-* Bison Options::     All the options described in detail,
-                        in alphabetical order by short options.
-* Option Cross Key::  Alphabetical list of long options.
-* Yacc Library::      Yacc-compatible @code{yylex} and @code{main}.
-
-C++ Language Interface
-
-* C++ Parsers::                 The interface to generate C++ parser classes
-* A Complete C++ Example::      Demonstrating their use
-
-C++ Parsers
-
-* C++ Bison Interface::         Asking for C++ parser generation
-* C++ Semantic Values::         %union vs. C++
-* C++ Location Values::         The position and location classes
-* C++ Parser Interface::        Instantiating and running the parser
-* C++ Scanner Interface::       Exchanges between yylex and parse
-
-A Complete C++ Example
-
-* Calc++ --- C++ Calculator::   The specifications
-* Calc++ Parsing Driver::       An active parsing context
-* Calc++ Parser::               A parser class
-* Calc++ Scanner::              A pure C++ Flex scanner
-* Calc++ Top Level::            Conducting the band
-
-Frequently Asked Questions
-
-* Memory Exhausted::           Breaking the Stack Limits
-* How Can I Reset the Parser:: @code{yyparse} Keeps some State
-* Strings are Destroyed::      @code{yylval} Loses Track of Strings
-* Implementing Gotos/Loops::   Control Flow in the Calculator
-* Multiple start-symbols::     Factoring closely related grammars
-* Secure?  Conform?::          Is Bison @acronym{POSIX} safe?
-* I can't build Bison::        Troubleshooting
-* Where can I find help?::     Troubleshouting
-* Bug Reports::                Troublereporting
-* Other Languages::            Parsers in Java and others
-* Beta Testing::               Experimenting development versions
-* Mailing Lists::              Meeting other Bison users
-
-Copying This Manual
-
-* GNU Free Documentation License::  License for copying this manual.
-
-@end detailmenu
-@end menu
-
-@node Introduction
-@unnumbered Introduction
-@cindex introduction
-
-@dfn{Bison} is a general-purpose parser generator that converts an
-annotated context-free grammar into an @acronym{LALR}(1) or
-@acronym{GLR} parser for that grammar.  Once you are proficient with
-Bison, you can use it to develop a wide range of language parsers, from those
-used in simple desk calculators to complex programming languages.
-
-Bison is upward compatible with Yacc: all properly-written Yacc grammars
-ought to work with Bison with no change.  Anyone familiar with Yacc
-should be able to use Bison with little trouble.  You need to be fluent in
-C or C++ programming in order to use Bison or to understand this manual.
-
-We begin with tutorial chapters that explain the basic concepts of using
-Bison and show three explained examples, each building on the last.  If you
-don't know Bison or Yacc, start by reading these chapters.  Reference
-chapters follow which describe specific aspects of Bison in detail.
-
-Bison was written primarily by Robert Corbett; Richard Stallman made it
-Yacc-compatible.  Wilfred Hansen of Carnegie Mellon University added
-multi-character string literals and other features.
-
-This edition corresponds to version @value{VERSION} of Bison.
-
-@node Conditions
-@unnumbered Conditions for Using Bison
-
-The distribution terms for Bison-generated parsers permit using the
-parsers in nonfree programs.  Before Bison version 2.2, these extra
-permissions applied only when Bison was generating @acronym{LALR}(1)
-parsers in C@.  And before Bison version 1.24, Bison-generated
-parsers could be used only in programs that were free software.
-
-The other @acronym{GNU} programming tools, such as the @acronym{GNU} C
-compiler, have never
-had such a requirement.  They could always be used for nonfree
-software.  The reason Bison was different was not due to a special
-policy decision; it resulted from applying the usual General Public
-License to all of the Bison source code.
-
-The output of the Bison utility---the Bison parser file---contains a
-verbatim copy of a sizable piece of Bison, which is the code for the
-parser's implementation.  (The actions from your grammar are inserted
-into this implementation at one point, but most of the rest of the
-implementation is not changed.)  When we applied the @acronym{GPL}
-terms to the skeleton code for the parser's implementation,
-the effect was to restrict the use of Bison output to free software.
-
-We didn't change the terms because of sympathy for people who want to
-make software proprietary.  @strong{Software should be free.}  But we
-concluded that limiting Bison's use to free software was doing little to
-encourage people to make other software free.  So we decided to make the
-practical conditions for using Bison match the practical conditions for
-using the other @acronym{GNU} tools.
-
-This exception applies when Bison is generating code for a parser.
-You can tell whether the exception applies to a Bison output file by
-inspecting the file for text beginning with ``As a special
-exception@dots{}''.  The text spells out the exact terms of the
-exception.
-
-@include gpl.texi
-
-@node Concepts
-@chapter The Concepts of Bison
-
-This chapter introduces many of the basic concepts without which the
-details of Bison will not make sense.  If you do not already know how to
-use Bison or Yacc, we suggest you start by reading this chapter carefully.
-
-@menu
-* Language and Grammar::  Languages and context-free grammars,
-                            as mathematical ideas.
-* Grammar in Bison::  How we represent grammars for Bison's sake.
-* Semantic Values::   Each token or syntactic grouping can have
-                        a semantic value (the value of an integer,
-                        the name of an identifier, etc.).
-* Semantic Actions::  Each rule can have an action containing C code.
-* GLR Parsers::       Writing parsers for general context-free languages.
-* Locations Overview::    Tracking Locations.
-* Bison Parser::      What are Bison's input and output,
-                        how is the output used?
-* Stages::            Stages in writing and running Bison grammars.
-* Grammar Layout::    Overall structure of a Bison grammar file.
-@end menu
-
-@node Language and Grammar
-@section Languages and Context-Free Grammars
-
-@cindex context-free grammar
-@cindex grammar, context-free
-In order for Bison to parse a language, it must be described by a
-@dfn{context-free grammar}.  This means that you specify one or more
-@dfn{syntactic groupings} and give rules for constructing them from their
-parts.  For example, in the C language, one kind of grouping is called an
-`expression'.  One rule for making an expression might be, ``An expression
-can be made of a minus sign and another expression''.  Another would be,
-``An expression can be an integer''.  As you can see, rules are often
-recursive, but there must be at least one rule which leads out of the
-recursion.
-
-@cindex @acronym{BNF}
-@cindex Backus-Naur form
-The most common formal system for presenting such rules for humans to read
-is @dfn{Backus-Naur Form} or ``@acronym{BNF}'', which was developed in
-order to specify the language Algol 60.  Any grammar expressed in
-@acronym{BNF} is a context-free grammar.  The input to Bison is
-essentially machine-readable @acronym{BNF}.
-
-@cindex @acronym{LALR}(1) grammars
-@cindex @acronym{LR}(1) grammars
-There are various important subclasses of context-free grammar.  Although it
-can handle almost all context-free grammars, Bison is optimized for what
-are called @acronym{LALR}(1) grammars.
-In brief, in these grammars, it must be possible to
-tell how to parse any portion of an input string with just a single
-token of look-ahead.  Strictly speaking, that is a description of an
-@acronym{LR}(1) grammar, and @acronym{LALR}(1) involves additional
-restrictions that are
-hard to explain simply; but it is rare in actual practice to find an
-@acronym{LR}(1) grammar that fails to be @acronym{LALR}(1).
-@xref{Mystery Conflicts, ,Mysterious Reduce/Reduce Conflicts}, for
-more information on this.
-
-@cindex @acronym{GLR} parsing
-@cindex generalized @acronym{LR} (@acronym{GLR}) parsing
-@cindex ambiguous grammars
-@cindex nondeterministic parsing
-
-Parsers for @acronym{LALR}(1) grammars are @dfn{deterministic}, meaning
-roughly that the next grammar rule to apply at any point in the input is
-uniquely determined by the preceding input and a fixed, finite portion
-(called a @dfn{look-ahead}) of the remaining input.  A context-free
-grammar can be @dfn{ambiguous}, meaning that there are multiple ways to
-apply the grammar rules to get the same inputs.  Even unambiguous
-grammars can be @dfn{nondeterministic}, meaning that no fixed
-look-ahead always suffices to determine the next grammar rule to apply.
-With the proper declarations, Bison is also able to parse these more
-general context-free grammars, using a technique known as @acronym{GLR}
-parsing (for Generalized @acronym{LR}).  Bison's @acronym{GLR} parsers
-are able to handle any context-free grammar for which the number of
-possible parses of any given string is finite.
-
-@cindex symbols (abstract)
-@cindex token
-@cindex syntactic grouping
-@cindex grouping, syntactic
-In the formal grammatical rules for a language, each kind of syntactic
-unit or grouping is named by a @dfn{symbol}.  Those which are built by
-grouping smaller constructs according to grammatical rules are called
-@dfn{nonterminal symbols}; those which can't be subdivided are called
-@dfn{terminal symbols} or @dfn{token types}.  We call a piece of input
-corresponding to a single terminal symbol a @dfn{token}, and a piece
-corresponding to a single nonterminal symbol a @dfn{grouping}.
-
-We can use the C language as an example of what symbols, terminal and
-nonterminal, mean.  The tokens of C are identifiers, constants (numeric
-and string), and the various keywords, arithmetic operators and
-punctuation marks.  So the terminal symbols of a grammar for C include
-`identifier', `number', `string', plus one symbol for each keyword,
-operator or punctuation mark: `if', `return', `const', `static', `int',
-`char', `plus-sign', `open-brace', `close-brace', `comma' and many more.
-(These tokens can be subdivided into characters, but that is a matter of
-lexicography, not grammar.)
-
-Here is a simple C function subdivided into tokens:
-
-@ifinfo
-@example
-int             /* @r{keyword `int'} */
-square (int x)  /* @r{identifier, open-paren, keyword `int',}
-                   @r{identifier, close-paren} */
-@{               /* @r{open-brace} */
-  return x * x; /* @r{keyword `return', identifier, asterisk,}
-                   @r{identifier, semicolon} */
-@}               /* @r{close-brace} */
-@end example
-@end ifinfo
-@ifnotinfo
-@example
-int             /* @r{keyword `int'} */
-square (int x)  /* @r{identifier, open-paren, keyword `int', identifier, close-paren} */
-@{               /* @r{open-brace} */
-  return x * x; /* @r{keyword `return', identifier, asterisk, identifier, semicolon} */
-@}               /* @r{close-brace} */
-@end example
-@end ifnotinfo
-
-The syntactic groupings of C include the expression, the statement, the
-declaration, and the function definition.  These are represented in the
-grammar of C by nonterminal symbols `expression', `statement',
-`declaration' and `function definition'.  The full grammar uses dozens of
-additional language constructs, each with its own nonterminal symbol, in
-order to express the meanings of these four.  The example above is a
-function definition; it contains one declaration, and one statement.  In
-the statement, each @samp{x} is an expression and so is @samp{x * x}.
-
-Each nonterminal symbol must have grammatical rules showing how it is made
-out of simpler constructs.  For example, one kind of C statement is the
-@code{return} statement; this would be described with a grammar rule which
-reads informally as follows:
-
-@quotation
-A `statement' can be made of a `return' keyword, an `expression' and a
-`semicolon'.
-@end quotation
-
-@noindent
-There would be many other rules for `statement', one for each kind of
-statement in C.
-
-@cindex start symbol
-One nonterminal symbol must be distinguished as the special one which
-defines a complete utterance in the language.  It is called the @dfn{start
-symbol}.  In a compiler, this means a complete input program.  In the C
-language, the nonterminal symbol `sequence of definitions and declarations'
-plays this role.
-
-For example, @samp{1 + 2} is a valid C expression---a valid part of a C
-program---but it is not valid as an @emph{entire} C program.  In the
-context-free grammar of C, this follows from the fact that `expression' is
-not the start symbol.
-
-The Bison parser reads a sequence of tokens as its input, and groups the
-tokens using the grammar rules.  If the input is valid, the end result is
-that the entire token sequence reduces to a single grouping whose symbol is
-the grammar's start symbol.  If we use a grammar for C, the entire input
-must be a `sequence of definitions and declarations'.  If not, the parser
-reports a syntax error.
-
-@node Grammar in Bison
-@section From Formal Rules to Bison Input
-@cindex Bison grammar
-@cindex grammar, Bison
-@cindex formal grammar
-
-A formal grammar is a mathematical construct.  To define the language
-for Bison, you must write a file expressing the grammar in Bison syntax:
-a @dfn{Bison grammar} file.  @xref{Grammar File, ,Bison Grammar Files}.
-
-A nonterminal symbol in the formal grammar is represented in Bison input
-as an identifier, like an identifier in C@.  By convention, it should be
-in lower case, such as @code{expr}, @code{stmt} or @code{declaration}.
-
-The Bison representation for a terminal symbol is also called a @dfn{token
-type}.  Token types as well can be represented as C-like identifiers.  By
-convention, these identifiers should be upper case to distinguish them from
-nonterminals: for example, @code{INTEGER}, @code{IDENTIFIER}, @code{IF} or
-@code{RETURN}.  A terminal symbol that stands for a particular keyword in
-the language should be named after that keyword converted to upper case.
-The terminal symbol @code{error} is reserved for error recovery.
-@xref{Symbols}.
-
-A terminal symbol can also be represented as a character literal, just like
-a C character constant.  You should do this whenever a token is just a
-single character (parenthesis, plus-sign, etc.): use that same character in
-a literal as the terminal symbol for that token.
-
-A third way to represent a terminal symbol is with a C string constant
-containing several characters.  @xref{Symbols}, for more information.
-
-The grammar rules also have an expression in Bison syntax.  For example,
-here is the Bison rule for a C @code{return} statement.  The semicolon in
-quotes is a literal character token, representing part of the C syntax for
-the statement; the naked semicolon, and the colon, are Bison punctuation
-used in every rule.
-
-@example
-stmt:   RETURN expr ';'
-        ;
-@end example
-
-@noindent
-@xref{Rules, ,Syntax of Grammar Rules}.
-
-@node Semantic Values
-@section Semantic Values
-@cindex semantic value
-@cindex value, semantic
-
-A formal grammar selects tokens only by their classifications: for example,
-if a rule mentions the terminal symbol `integer constant', it means that
-@emph{any} integer constant is grammatically valid in that position.  The
-precise value of the constant is irrelevant to how to parse the input: if
-@samp{x+4} is grammatical then @samp{x+1} or @samp{x+3989} is equally
-grammatical.
-
-But the precise value is very important for what the input means once it is
-parsed.  A compiler is useless if it fails to distinguish between 4, 1 and
-3989 as constants in the program!  Therefore, each token in a Bison grammar
-has both a token type and a @dfn{semantic value}.  @xref{Semantics,
-,Defining Language Semantics},
-for details.
-
-The token type is a terminal symbol defined in the grammar, such as
-@code{INTEGER}, @code{IDENTIFIER} or @code{','}.  It tells everything
-you need to know to decide where the token may validly appear and how to
-group it with other tokens.  The grammar rules know nothing about tokens
-except their types.
-
-The semantic value has all the rest of the information about the
-meaning of the token, such as the value of an integer, or the name of an
-identifier.  (A token such as @code{','} which is just punctuation doesn't
-need to have any semantic value.)
-
-For example, an input token might be classified as token type
-@code{INTEGER} and have the semantic value 4.  Another input token might
-have the same token type @code{INTEGER} but value 3989.  When a grammar
-rule says that @code{INTEGER} is allowed, either of these tokens is
-acceptable because each is an @code{INTEGER}.  When the parser accepts the
-token, it keeps track of the token's semantic value.
-
-Each grouping can also have a semantic value as well as its nonterminal
-symbol.  For example, in a calculator, an expression typically has a
-semantic value that is a number.  In a compiler for a programming
-language, an expression typically has a semantic value that is a tree
-structure describing the meaning of the expression.
-
-@node Semantic Actions
-@section Semantic Actions
-@cindex semantic actions
-@cindex actions, semantic
-
-In order to be useful, a program must do more than parse input; it must
-also produce some output based on the input.  In a Bison grammar, a grammar
-rule can have an @dfn{action} made up of C statements.  Each time the
-parser recognizes a match for that rule, the action is executed.
-@xref{Actions}.
-
-Most of the time, the purpose of an action is to compute the semantic value
-of the whole construct from the semantic values of its parts.  For example,
-suppose we have a rule which says an expression can be the sum of two
-expressions.  When the parser recognizes such a sum, each of the
-subexpressions has a semantic value which describes how it was built up.
-The action for this rule should create a similar sort of value for the
-newly recognized larger expression.
-
-For example, here is a rule that says an expression can be the sum of
-two subexpressions:
-
-@example
-expr: expr '+' expr   @{ $$ = $1 + $3; @}
-        ;
-@end example
-
-@noindent
-The action says how to produce the semantic value of the sum expression
-from the values of the two subexpressions.
-
-@node GLR Parsers
-@section Writing @acronym{GLR} Parsers
-@cindex @acronym{GLR} parsing
-@cindex generalized @acronym{LR} (@acronym{GLR}) parsing
-@findex %glr-parser
-@cindex conflicts
-@cindex shift/reduce conflicts
-@cindex reduce/reduce conflicts
-
-In some grammars, Bison's standard
-@acronym{LALR}(1) parsing algorithm cannot decide whether to apply a
-certain grammar rule at a given point.  That is, it may not be able to
-decide (on the basis of the input read so far) which of two possible
-reductions (applications of a grammar rule) applies, or whether to apply
-a reduction or read more of the input and apply a reduction later in the
-input.  These are known respectively as @dfn{reduce/reduce} conflicts
-(@pxref{Reduce/Reduce}), and @dfn{shift/reduce} conflicts
-(@pxref{Shift/Reduce}).
-
-To use a grammar that is not easily modified to be @acronym{LALR}(1), a
-more general parsing algorithm is sometimes necessary.  If you include
-@code{%glr-parser} among the Bison declarations in your file
-(@pxref{Grammar Outline}), the result is a Generalized @acronym{LR}
-(@acronym{GLR}) parser.  These parsers handle Bison grammars that
-contain no unresolved conflicts (i.e., after applying precedence
-declarations) identically to @acronym{LALR}(1) parsers.  However, when
-faced with unresolved shift/reduce and reduce/reduce conflicts,
-@acronym{GLR} parsers use the simple expedient of doing both,
-effectively cloning the parser to follow both possibilities.  Each of
-the resulting parsers can again split, so that at any given time, there
-can be any number of possible parses being explored.  The parsers
-proceed in lockstep; that is, all of them consume (shift) a given input
-symbol before any of them proceed to the next.  Each of the cloned
-parsers eventually meets one of two possible fates: either it runs into
-a parsing error, in which case it simply vanishes, or it merges with
-another parser, because the two of them have reduced the input to an
-identical set of symbols.
-
-During the time that there are multiple parsers, semantic actions are
-recorded, but not performed.  When a parser disappears, its recorded
-semantic actions disappear as well, and are never performed.  When a
-reduction makes two parsers identical, causing them to merge, Bison
-records both sets of semantic actions.  Whenever the last two parsers
-merge, reverting to the single-parser case, Bison resolves all the
-outstanding actions either by precedences given to the grammar rules
-involved, or by performing both actions, and then calling a designated
-user-defined function on the resulting values to produce an arbitrary
-merged result.
-
-@menu
-* Simple GLR Parsers::      Using @acronym{GLR} parsers on unambiguous grammars.
-* Merging GLR Parses::      Using @acronym{GLR} parsers to resolve ambiguities.
-* GLR Semantic Actions::    Deferred semantic actions have special concerns.
-* Compiler Requirements::   @acronym{GLR} parsers require a modern C compiler.
-@end menu
-
-@node Simple GLR Parsers
-@subsection Using @acronym{GLR} on Unambiguous Grammars
-@cindex @acronym{GLR} parsing, unambiguous grammars
-@cindex generalized @acronym{LR} (@acronym{GLR}) parsing, unambiguous grammars
-@findex %glr-parser
-@findex %expect-rr
-@cindex conflicts
-@cindex reduce/reduce conflicts
-@cindex shift/reduce conflicts
-
-In the simplest cases, you can use the @acronym{GLR} algorithm
-to parse grammars that are unambiguous, but fail to be @acronym{LALR}(1).
-Such grammars typically require more than one symbol of look-ahead,
-or (in rare cases) fall into the category of grammars in which the
-@acronym{LALR}(1) algorithm throws away too much information (they are in
-@acronym{LR}(1), but not @acronym{LALR}(1), @ref{Mystery Conflicts}).
-
-Consider a problem that
-arises in the declaration of enumerated and subrange types in the
-programming language Pascal.  Here are some examples:
-
-@example
-type subrange = lo .. hi;
-type enum = (a, b, c);
-@end example
-
-@noindent
-The original language standard allows only numeric
-literals and constant identifiers for the subrange bounds (@samp{lo}
-and @samp{hi}), but Extended Pascal (@acronym{ISO}/@acronym{IEC}
-10206) and many other
-Pascal implementations allow arbitrary expressions there.  This gives
-rise to the following situation, containing a superfluous pair of
-parentheses:
-
-@example
-type subrange = (a) .. b;
-@end example
-
-@noindent
-Compare this to the following declaration of an enumerated
-type with only one value:
-
-@example
-type enum = (a);
-@end example
-
-@noindent
-(These declarations are contrived, but they are syntactically
-valid, and more-complicated cases can come up in practical programs.)
-
-These two declarations look identical until the @samp{..} token.
-With normal @acronym{LALR}(1) one-token look-ahead it is not
-possible to decide between the two forms when the identifier
-@samp{a} is parsed.  It is, however, desirable
-for a parser to decide this, since in the latter case
-@samp{a} must become a new identifier to represent the enumeration
-value, while in the former case @samp{a} must be evaluated with its
-current meaning, which may be a constant or even a function call.
-
-You could parse @samp{(a)} as an ``unspecified identifier in parentheses'',
-to be resolved later, but this typically requires substantial
-contortions in both semantic actions and large parts of the
-grammar, where the parentheses are nested in the recursive rules for
-expressions.
-
-You might think of using the lexer to distinguish between the two
-forms by returning different tokens for currently defined and
-undefined identifiers.  But if these declarations occur in a local
-scope, and @samp{a} is defined in an outer scope, then both forms
-are possible---either locally redefining @samp{a}, or using the
-value of @samp{a} from the outer scope.  So this approach cannot
-work.
-
-A simple solution to this problem is to declare the parser to
-use the @acronym{GLR} algorithm.
-When the @acronym{GLR} parser reaches the critical state, it
-merely splits into two branches and pursues both syntax rules
-simultaneously.  Sooner or later, one of them runs into a parsing
-error.  If there is a @samp{..} token before the next
-@samp{;}, the rule for enumerated types fails since it cannot
-accept @samp{..} anywhere; otherwise, the subrange type rule
-fails since it requires a @samp{..} token.  So one of the branches
-fails silently, and the other one continues normally, performing
-all the intermediate actions that were postponed during the split.
-
-If the input is syntactically incorrect, both branches fail and the parser
-reports a syntax error as usual.
-
-The effect of all this is that the parser seems to ``guess'' the
-correct branch to take, or in other words, it seems to use more
-look-ahead than the underlying @acronym{LALR}(1) algorithm actually allows
-for.  In this example, @acronym{LALR}(2) would suffice, but also some cases
-that are not @acronym{LALR}(@math{k}) for any @math{k} can be handled this way.
-
-In general, a @acronym{GLR} parser can take quadratic or cubic worst-case time,
-and the current Bison parser even takes exponential time and space
-for some grammars.  In practice, this rarely happens, and for many
-grammars it is possible to prove that it cannot happen.
-The present example contains only one conflict between two
-rules, and the type-declaration context containing the conflict
-cannot be nested.  So the number of
-branches that can exist at any time is limited by the constant 2,
-and the parsing time is still linear.
-
-Here is a Bison grammar corresponding to the example above.  It
-parses a vastly simplified form of Pascal type declarations.
-
-@example
-%token TYPE DOTDOT ID
-
-@group
-%left '+' '-'
-%left '*' '/'
-@end group
-
-%%
-
-@group
-type_decl : TYPE ID '=' type ';'
-     ;
-@end group
-
-@group
-type : '(' id_list ')'
-     | expr DOTDOT expr
-     ;
-@end group
-
-@group
-id_list : ID
-     | id_list ',' ID
-     ;
-@end group
-
-@group
-expr : '(' expr ')'
-     | expr '+' expr
-     | expr '-' expr
-     | expr '*' expr
-     | expr '/' expr
-     | ID
-     ;
-@end group
-@end example
-
-When used as a normal @acronym{LALR}(1) grammar, Bison correctly complains
-about one reduce/reduce conflict.  In the conflicting situation the
-parser chooses one of the alternatives, arbitrarily the one
-declared first.  Therefore the following correct input is not
-recognized:
-
-@example
-type t = (a) .. b;
-@end example
-
-The parser can be turned into a @acronym{GLR} parser, while also telling Bison
-to be silent about the one known reduce/reduce conflict, by
-adding these two declarations to the Bison input file (before the first
-@samp{%%}):
-
-@example
-%glr-parser
-%expect-rr 1
-@end example
-
-@noindent
-No change in the grammar itself is required.  Now the
-parser recognizes all valid declarations, according to the
-limited syntax above, transparently.  In fact, the user does not even
-notice when the parser splits.
-
-So here we have a case where we can use the benefits of @acronym{GLR},
-almost without disadvantages.  Even in simple cases like this, however,
-there are at least two potential problems to beware.  First, always
-analyze the conflicts reported by Bison to make sure that @acronym{GLR}
-splitting is only done where it is intended.  A @acronym{GLR} parser
-splitting inadvertently may cause problems less obvious than an
-@acronym{LALR} parser statically choosing the wrong alternative in a
-conflict.  Second, consider interactions with the lexer (@pxref{Semantic
-Tokens}) with great care.  Since a split parser consumes tokens without
-performing any actions during the split, the lexer cannot obtain
-information via parser actions.  Some cases of lexer interactions can be
-eliminated by using @acronym{GLR} to shift the complications from the
-lexer to the parser.  You must check the remaining cases for
-correctness.
-
-In our example, it would be safe for the lexer to return tokens based on
-their current meanings in some symbol table, because no new symbols are
-defined in the middle of a type declaration.  Though it is possible for
-a parser to define the enumeration constants as they are parsed, before
-the type declaration is completed, it actually makes no difference since
-they cannot be used within the same enumerated type declaration.
-
-@node Merging GLR Parses
-@subsection Using @acronym{GLR} to Resolve Ambiguities
-@cindex @acronym{GLR} parsing, ambiguous grammars
-@cindex generalized @acronym{LR} (@acronym{GLR}) parsing, ambiguous grammars
-@findex %dprec
-@findex %merge
-@cindex conflicts
-@cindex reduce/reduce conflicts
-
-Let's consider an example, vastly simplified from a C++ grammar.
-
-@example
-%@{
-  #include <stdio.h>
-  #define YYSTYPE char const *
-  int yylex (void);
-  void yyerror (char const *);
-%@}
-
-%token TYPENAME ID
-
-%right '='
-%left '+'
-
-%glr-parser
-
-%%
-
-prog :
-     | prog stmt   @{ printf ("\n"); @}
-     ;
-
-stmt : expr ';'  %dprec 1
-     | decl      %dprec 2
-     ;
-
-expr : ID               @{ printf ("%s ", $$); @}
-     | TYPENAME '(' expr ')'
-                        @{ printf ("%s <cast> ", $1); @}
-     | expr '+' expr    @{ printf ("+ "); @}
-     | expr '=' expr    @{ printf ("= "); @}
-     ;
-
-decl : TYPENAME declarator ';'
-                        @{ printf ("%s <declare> ", $1); @}
-     | TYPENAME declarator '=' expr ';'
-                        @{ printf ("%s <init-declare> ", $1); @}
-     ;
-
-declarator : ID         @{ printf ("\"%s\" ", $1); @}
-     | '(' declarator ')'
-     ;
-@end example
-
-@noindent
-This models a problematic part of the C++ grammar---the ambiguity between
-certain declarations and statements.  For example,
-
-@example
-T (x) = y+z;
-@end example
-
-@noindent
-parses as either an @code{expr} or a @code{stmt}
-(assuming that @samp{T} is recognized as a @code{TYPENAME} and
-@samp{x} as an @code{ID}).
-Bison detects this as a reduce/reduce conflict between the rules
-@code{expr : ID} and @code{declarator : ID}, which it cannot resolve at the
-time it encounters @code{x} in the example above.  Since this is a
-@acronym{GLR} parser, it therefore splits the problem into two parses, one for
-each choice of resolving the reduce/reduce conflict.
-Unlike the example from the previous section (@pxref{Simple GLR Parsers}),
-however, neither of these parses ``dies,'' because the grammar as it stands is
-ambiguous.  One of the parsers eventually reduces @code{stmt : expr ';'} and
-the other reduces @code{stmt : decl}, after which both parsers are in an
-identical state: they've seen @samp{prog stmt} and have the same unprocessed
-input remaining.  We say that these parses have @dfn{merged.}
-
-At this point, the @acronym{GLR} parser requires a specification in the
-grammar of how to choose between the competing parses.
-In the example above, the two @code{%dprec}
-declarations specify that Bison is to give precedence
-to the parse that interprets the example as a
-@code{decl}, which implies that @code{x} is a declarator.
-The parser therefore prints
-
-@example
-"x" y z + T <init-declare>
-@end example
-
-The @code{%dprec} declarations only come into play when more than one
-parse survives.  Consider a different input string for this parser:
-
-@example
-T (x) + y;
-@end example
-
-@noindent
-This is another example of using @acronym{GLR} to parse an unambiguous
-construct, as shown in the previous section (@pxref{Simple GLR Parsers}).
-Here, there is no ambiguity (this cannot be parsed as a declaration).
-However, at the time the Bison parser encounters @code{x}, it does not
-have enough information to resolve the reduce/reduce conflict (again,
-between @code{x} as an @code{expr} or a @code{declarator}).  In this
-case, no precedence declaration is used.  Again, the parser splits
-into two, one assuming that @code{x} is an @code{expr}, and the other
-assuming @code{x} is a @code{declarator}.  The second of these parsers
-then vanishes when it sees @code{+}, and the parser prints
-
-@example
-x T <cast> y +
-@end example
-
-Suppose that instead of resolving the ambiguity, you wanted to see all
-the possibilities.  For this purpose, you must merge the semantic
-actions of the two possible parsers, rather than choosing one over the
-other.  To do so, you could change the declaration of @code{stmt} as
-follows:
-
-@example
-stmt : expr ';'  %merge <stmtMerge>
-     | decl      %merge <stmtMerge>
-     ;
-@end example
-
-@noindent
-and define the @code{stmtMerge} function as:
-
-@example
-static YYSTYPE
-stmtMerge (YYSTYPE x0, YYSTYPE x1)
-@{
-  printf ("<OR> ");
-  return "";
-@}
-@end example
-
-@noindent
-with an accompanying forward declaration
-in the C declarations at the beginning of the file:
-
-@example
-%@{
-  #define YYSTYPE char const *
-  static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);
-%@}
-@end example
-
-@noindent
-With these declarations, the resulting parser parses the first example
-as both an @code{expr} and a @code{decl}, and prints
-
-@example
-"x" y z + T <init-declare> x T <cast> y z + = <OR>
-@end example
-
-Bison requires that all of the
-productions that participate in any particular merge have identical
-@samp{%merge} clauses.  Otherwise, the ambiguity would be unresolvable,
-and the parser will report an error during any parse that results in
-the offending merge.
-
-@node GLR Semantic Actions
-@subsection GLR Semantic Actions
-
-@cindex deferred semantic actions
-By definition, a deferred semantic action is not performed at the same time as
-the associated reduction.
-This raises caveats for several Bison features you might use in a semantic
-action in a @acronym{GLR} parser.
-
-@vindex yychar
-@cindex @acronym{GLR} parsers and @code{yychar}
-@vindex yylval
-@cindex @acronym{GLR} parsers and @code{yylval}
-@vindex yylloc
-@cindex @acronym{GLR} parsers and @code{yylloc}
-In any semantic action, you can examine @code{yychar} to determine the type of
-the look-ahead token present at the time of the associated reduction.
-After checking that @code{yychar} is not set to @code{YYEMPTY} or @code{YYEOF},
-you can then examine @code{yylval} and @code{yylloc} to determine the
-look-ahead token's semantic value and location, if any.
-In a nondeferred semantic action, you can also modify any of these variables to
-influence syntax analysis.
-@xref{Look-Ahead, ,Look-Ahead Tokens}.
-
-@findex yyclearin
-@cindex @acronym{GLR} parsers and @code{yyclearin}
-In a deferred semantic action, it's too late to influence syntax analysis.
-In this case, @code{yychar}, @code{yylval}, and @code{yylloc} are set to
-shallow copies of the values they had at the time of the associated reduction.
-For this reason alone, modifying them is dangerous.
-Moreover, the result of modifying them is undefined and subject to change with
-future versions of Bison.
-For example, if a semantic action might be deferred, you should never write it
-to invoke @code{yyclearin} (@pxref{Action Features}) or to attempt to free
-memory referenced by @code{yylval}.
-
-@findex YYERROR
-@cindex @acronym{GLR} parsers and @code{YYERROR}
-Another Bison feature requiring special consideration is @code{YYERROR}
-(@pxref{Action Features}), which you can invoke in a semantic action to
-initiate error recovery.
-During deterministic @acronym{GLR} operation, the effect of @code{YYERROR} is
-the same as its effect in an @acronym{LALR}(1) parser.
-In a deferred semantic action, its effect is undefined.
-@c The effect is probably a syntax error at the split point.
-
-Also, see @ref{Location Default Action, ,Default Action for Locations}, which
-describes a special usage of @code{YYLLOC_DEFAULT} in @acronym{GLR} parsers.
-
-@node Compiler Requirements
-@subsection Considerations when Compiling @acronym{GLR} Parsers
-@cindex @code{inline}
-@cindex @acronym{GLR} parsers and @code{inline}
-
-The @acronym{GLR} parsers require a compiler for @acronym{ISO} C89 or
-later.  In addition, they use the @code{inline} keyword, which is not
-C89, but is C99 and is a common extension in pre-C99 compilers.  It is
-up to the user of these parsers to handle
-portability issues.  For instance, if using Autoconf and the Autoconf
-macro @code{AC_C_INLINE}, a mere
-
-@example
-%@{
-  #include <config.h>
-%@}
-@end example
-
-@noindent
-will suffice.  Otherwise, we suggest
-
-@example
-%@{
-  #if __STDC_VERSION__ < 199901 && ! defined __GNUC__ && ! defined inline
-   #define inline
-  #endif
-%@}
-@end example
-
-@node Locations Overview
-@section Locations
-@cindex location
-@cindex textual location
-@cindex location, textual
-
-Many applications, like interpreters or compilers, have to produce verbose
-and useful error messages.  To achieve this, one must be able to keep track of
-the @dfn{textual location}, or @dfn{location}, of each syntactic construct.
-Bison provides a mechanism for handling these locations.
-
-Each token has a semantic value.  In a similar fashion, each token has an
-associated location, but the type of locations is the same for all tokens and
-groupings.  Moreover, the output parser is equipped with a default data
-structure for storing locations (@pxref{Locations}, for more details).
-
-Like semantic values, locations can be reached in actions using a dedicated
-set of constructs.  In the example above, the location of the whole grouping
-is @code{@@$}, while the locations of the subexpressions are @code{@@1} and
-@code{@@3}.
-
-When a rule is matched, a default action is used to compute the semantic value
-of its left hand side (@pxref{Actions}).  In the same way, another default
-action is used for locations.  However, the action for locations is general
-enough for most cases, meaning there is usually no need to describe for each
-rule how @code{@@$} should be formed.  When building a new location for a given
-grouping, the default behavior of the output parser is to take the beginning
-of the first symbol, and the end of the last symbol.
-
-@node Bison Parser
-@section Bison Output: the Parser File
-@cindex Bison parser
-@cindex Bison utility
-@cindex lexical analyzer, purpose
-@cindex parser
-
-When you run Bison, you give it a Bison grammar file as input.  The output
-is a C source file that parses the language described by the grammar.
-This file is called a @dfn{Bison parser}.  Keep in mind that the Bison
-utility and the Bison parser are two distinct programs: the Bison utility
-is a program whose output is the Bison parser that becomes part of your
-program.
-
-The job of the Bison parser is to group tokens into groupings according to
-the grammar rules---for example, to build identifiers and operators into
-expressions.  As it does this, it runs the actions for the grammar rules it
-uses.
-
-The tokens come from a function called the @dfn{lexical analyzer} that
-you must supply in some fashion (such as by writing it in C).  The Bison
-parser calls the lexical analyzer each time it wants a new token.  It
-doesn't know what is ``inside'' the tokens (though their semantic values
-may reflect this).  Typically the lexical analyzer makes the tokens by
-parsing characters of text, but Bison does not depend on this.
-@xref{Lexical, ,The Lexical Analyzer Function @code{yylex}}.
-
-The Bison parser file is C code which defines a function named
-@code{yyparse} which implements that grammar.  This function does not make
-a complete C program: you must supply some additional functions.  One is
-the lexical analyzer.  Another is an error-reporting function which the
-parser calls to report an error.  In addition, a complete C program must
-start with a function called @code{main}; you have to provide this, and
-arrange for it to call @code{yyparse} or the parser will never run.
-@xref{Interface, ,Parser C-Language Interface}.
-
-Aside from the token type names and the symbols in the actions you
-write, all symbols defined in the Bison parser file itself
-begin with @samp{yy} or @samp{YY}.  This includes interface functions
-such as the lexical analyzer function @code{yylex}, the error reporting
-function @code{yyerror} and the parser function @code{yyparse} itself.
-This also includes numerous identifiers used for internal purposes.
-Therefore, you should avoid using C identifiers starting with @samp{yy}
-or @samp{YY} in the Bison grammar file except for the ones defined in
-this manual.  Also, you should avoid using the C identifiers
-@samp{malloc} and @samp{free} for anything other than their usual
-meanings.
-
-In some cases the Bison parser file includes system headers, and in
-those cases your code should respect the identifiers reserved by those
-headers.  On some non-@acronym{GNU} hosts, @code{<alloca.h>}, @code{<malloc.h>},
-@code{<stddef.h>}, and @code{<stdlib.h>} are included as needed to
-declare memory allocators and related types.  @code{<libintl.h>} is
-included if message translation is in use
-(@pxref{Internationalization}).  Other system headers may
-be included if you define @code{YYDEBUG} to a nonzero value
-(@pxref{Tracing, ,Tracing Your Parser}).
-
-@node Stages
-@section Stages in Using Bison
-@cindex stages in using Bison
-@cindex using Bison
-
-The actual language-design process using Bison, from grammar specification
-to a working compiler or interpreter, has these parts:
-
-@enumerate
-@item
-Formally specify the grammar in a form recognized by Bison
-(@pxref{Grammar File, ,Bison Grammar Files}).  For each grammatical rule
-in the language, describe the action that is to be taken when an
-instance of that rule is recognized.  The action is described by a
-sequence of C statements.
-
-@item
-Write a lexical analyzer to process input and pass tokens to the parser.
-The lexical analyzer may be written by hand in C (@pxref{Lexical, ,The
-Lexical Analyzer Function @code{yylex}}).  It could also be produced
-using Lex, but the use of Lex is not discussed in this manual.
-
-@item
-Write a controlling function that calls the Bison-produced parser.
-
-@item
-Write error-reporting routines.
-@end enumerate
-
-To turn this source code as written into a runnable program, you
-must follow these steps:
-
-@enumerate
-@item
-Run Bison on the grammar to produce the parser.
-
-@item
-Compile the code output by Bison, as well as any other source files.
-
-@item
-Link the object files to produce the finished product.
-@end enumerate
-
-@node Grammar Layout
-@section The Overall Layout of a Bison Grammar
-@cindex grammar file
-@cindex file format
-@cindex format of grammar file
-@cindex layout of Bison grammar
-
-The input file for the Bison utility is a @dfn{Bison grammar file}.  The
-general form of a Bison grammar file is as follows:
-
-@example
-%@{
-@var{Prologue}
-%@}
-
-@var{Bison declarations}
-
-%%
-@var{Grammar rules}
-%%
-@var{Epilogue}
-@end example
-
-@noindent
-The @samp{%%}, @samp{%@{} and @samp{%@}} are punctuation that appears
-in every Bison grammar file to separate the sections.
-
-The prologue may define types and variables used in the actions.  You can
-also use preprocessor commands to define macros used there, and use
-@code{#include} to include header files that do any of these things.
-You need to declare the lexical analyzer @code{yylex} and the error
-printer @code{yyerror} here, along with any other global identifiers
-used by the actions in the grammar rules.
-
-The Bison declarations declare the names of the terminal and nonterminal
-symbols, and may also describe operator precedence and the data types of
-semantic values of various symbols.
-
-The grammar rules define how to construct each nonterminal symbol from its
-parts.
-
-The epilogue can contain any code you want to use.  Often the
-definitions of functions declared in the prologue go here.  In a
-simple program, all the rest of the program can go here.
-
-@node Examples
-@chapter Examples
-@cindex simple examples
-@cindex examples, simple
-
-Now we show and explain three sample programs written using Bison: a
-reverse polish notation calculator, an algebraic (infix) notation
-calculator, and a multi-function calculator.  All three have been tested
-under BSD Unix 4.3; each produces a usable, though limited, interactive
-desk-top calculator.
-
-These examples are simple, but Bison grammars for real programming
-languages are written the same way.  You can copy these examples into a
-source file to try them.
-
-@menu
-* RPN Calc::          Reverse polish notation calculator;
-                        a first example with no operator precedence.
-* Infix Calc::        Infix (algebraic) notation calculator.
-                        Operator precedence is introduced.
-* Simple Error Recovery::  Continuing after syntax errors.
-* Location Tracking Calc:: Demonstrating the use of @@@var{n} and @@$.
-* Multi-function Calc::  Calculator with memory and trig functions.
-                           It uses multiple data-types for semantic values.
-* Exercises::         Ideas for improving the multi-function calculator.
-@end menu
-
-@node RPN Calc
-@section Reverse Polish Notation Calculator
-@cindex reverse polish notation
-@cindex polish notation calculator
-@cindex @code{rpcalc}
-@cindex calculator, simple
-
-The first example is that of a simple double-precision @dfn{reverse polish
-notation} calculator (a calculator using postfix operators).  This example
-provides a good starting point, since operator precedence is not an issue.
-The second example will illustrate how operator precedence is handled.
-
-The source code for this calculator is named @file{rpcalc.y}.  The
-@samp{.y} extension is a convention used for Bison input files.
-
-@menu
-* Decls: Rpcalc Decls.  Prologue (declarations) for rpcalc.
-* Rules: Rpcalc Rules.  Grammar Rules for rpcalc, with explanation.
-* Lexer: Rpcalc Lexer.  The lexical analyzer.
-* Main: Rpcalc Main.    The controlling function.
-* Error: Rpcalc Error.  The error reporting function.
-* Gen: Rpcalc Gen.      Running Bison on the grammar file.
-* Comp: Rpcalc Compile. Run the C compiler on the output code.
-@end menu
-
-@node Rpcalc Decls
-@subsection Declarations for @code{rpcalc}
-
-Here are the C and Bison declarations for the reverse polish notation
-calculator.  As in C, comments are placed between @samp{/*@dots{}*/}.
-
-@example
-/* Reverse polish notation calculator.  */
-
-%@{
-  #define YYSTYPE double
-  #include <math.h>
-  int yylex (void);
-  void yyerror (char const *);
-%@}
-
-%token NUM
-
-%% /* Grammar rules and actions follow.  */
-@end example
-
-The declarations section (@pxref{Prologue, , The prologue}) contains two
-preprocessor directives and two forward declarations.
-
-The @code{#define} directive defines the macro @code{YYSTYPE}, thus
-specifying the C data type for semantic values of both tokens and
-groupings (@pxref{Value Type, ,Data Types of Semantic Values}).  The
-Bison parser will use whatever type @code{YYSTYPE} is defined as; if you
-don't define it, @code{int} is the default.  Because we specify
-@code{double}, each token and each expression has an associated value,
-which is a floating point number.
-
-The @code{#include} directive is used to declare the exponentiation
-function @code{pow}.
-
-The forward declarations for @code{yylex} and @code{yyerror} are
-needed because the C language requires that functions be declared
-before they are used.  These functions will be defined in the
-epilogue, but the parser calls them so they must be declared in the
-prologue.
-
-The second section, Bison declarations, provides information to Bison
-about the token types (@pxref{Bison Declarations, ,The Bison
-Declarations Section}).  Each terminal symbol that is not a
-single-character literal must be declared here.  (Single-character
-literals normally don't need to be declared.)  In this example, all the
-arithmetic operators are designated by single-character literals, so the
-only terminal symbol that needs to be declared is @code{NUM}, the token
-type for numeric constants.
-
-@node Rpcalc Rules
-@subsection Grammar Rules for @code{rpcalc}
-
-Here are the grammar rules for the reverse polish notation calculator.
-
-@example
-input:    /* empty */
-        | input line
-;
-
-line:     '\n'
-        | exp '\n'      @{ printf ("\t%.10g\n", $1); @}
-;
-
-exp:      NUM           @{ $$ = $1;           @}
-        | exp exp '+'   @{ $$ = $1 + $2;      @}
-        | exp exp '-'   @{ $$ = $1 - $2;      @}
-        | exp exp '*'   @{ $$ = $1 * $2;      @}
-        | exp exp '/'   @{ $$ = $1 / $2;      @}
-         /* Exponentiation */
-        | exp exp '^'   @{ $$ = pow ($1, $2); @}
-         /* Unary minus    */
-        | exp 'n'       @{ $$ = -$1;          @}
-;
-%%
-@end example
-
-The groupings of the rpcalc ``language'' defined here are the expression
-(given the name @code{exp}), the line of input (@code{line}), and the
-complete input transcript (@code{input}).  Each of these nonterminal
-symbols has several alternate rules, joined by the vertical bar @samp{|}
-which is read as ``or''.  The following sections explain what these rules
-mean.
-
-The semantics of the language is determined by the actions taken when a
-grouping is recognized.  The actions are the C code that appears inside
-braces.  @xref{Actions}.
-
-You must specify these actions in C, but Bison provides the means for
-passing semantic values between the rules.  In each action, the
-pseudo-variable @code{$$} stands for the semantic value for the grouping
-that the rule is going to construct.  Assigning a value to @code{$$} is the
-main job of most actions.  The semantic values of the components of the
-rule are referred to as @code{$1}, @code{$2}, and so on.
-
-@menu
-* Rpcalc Input::
-* Rpcalc Line::
-* Rpcalc Expr::
-@end menu
-
-@node Rpcalc Input
-@subsubsection Explanation of @code{input}
-
-Consider the definition of @code{input}:
-
-@example
-input:    /* empty */
-        | input line
-;
-@end example
-
-This definition reads as follows: ``A complete input is either an empty
-string, or a complete input followed by an input line''.  Notice that
-``complete input'' is defined in terms of itself.  This definition is said
-to be @dfn{left recursive} since @code{input} appears always as the
-leftmost symbol in the sequence.  @xref{Recursion, ,Recursive Rules}.
-
-The first alternative is empty because there are no symbols between the
-colon and the first @samp{|}; this means that @code{input} can match an
-empty string of input (no tokens).  We write the rules this way because it
-is legitimate to type @kbd{Ctrl-d} right after you start the calculator.
-It's conventional to put an empty alternative first and write the comment
-@samp{/* empty */} in it.
-
-The second alternate rule (@code{input line}) handles all nontrivial input.
-It means, ``After reading any number of lines, read one more line if
-possible.''  The left recursion makes this rule into a loop.  Since the
-first alternative matches empty input, the loop can be executed zero or
-more times.
-
-The parser function @code{yyparse} continues to process input until a
-grammatical error is seen or the lexical analyzer says there are no more
-input tokens; we will arrange for the latter to happen at end-of-input.
-
-@node Rpcalc Line
-@subsubsection Explanation of @code{line}
-
-Now consider the definition of @code{line}:
-
-@example
-line:     '\n'
-        | exp '\n'  @{ printf ("\t%.10g\n", $1); @}
-;
-@end example
-
-The first alternative is a token which is a newline character; this means
-that rpcalc accepts a blank line (and ignores it, since there is no
-action).  The second alternative is an expression followed by a newline.
-This is the alternative that makes rpcalc useful.  The semantic value of
-the @code{exp} grouping is the value of @code{$1} because the @code{exp} in
-question is the first symbol in the alternative.  The action prints this
-value, which is the result of the computation the user asked for.
-
-This action is unusual because it does not assign a value to @code{$$}.  As
-a consequence, the semantic value associated with the @code{line} is
-uninitialized (its value will be unpredictable).  This would be a bug if
-that value were ever used, but we don't use it: once rpcalc has printed the
-value of the user's input line, that value is no longer needed.
-
-@node Rpcalc Expr
-@subsubsection Explanation of @code{expr}
-
-The @code{exp} grouping has several rules, one for each kind of expression.
-The first rule handles the simplest expressions: those that are just numbers.
-The second handles an addition-expression, which looks like two expressions
-followed by a plus-sign.  The third handles subtraction, and so on.
-
-@example
-exp:      NUM
-        | exp exp '+'     @{ $$ = $1 + $2;    @}
-        | exp exp '-'     @{ $$ = $1 - $2;    @}
-        @dots{}
-        ;
-@end example
-
-We have used @samp{|} to join all the rules for @code{exp}, but we could
-equally well have written them separately:
-
-@example
-exp:      NUM ;
-exp:      exp exp '+'     @{ $$ = $1 + $2;    @} ;
-exp:      exp exp '-'     @{ $$ = $1 - $2;    @} ;
-        @dots{}
-@end example
-
-Most of the rules have actions that compute the value of the expression in
-terms of the value of its parts.  For example, in the rule for addition,
-@code{$1} refers to the first component @code{exp} and @code{$2} refers to
-the second one.  The third component, @code{'+'}, has no meaningful
-associated semantic value, but if it had one you could refer to it as
-@code{$3}.  When @code{yyparse} recognizes a sum expression using this
-rule, the sum of the two subexpressions' values is produced as the value of
-the entire expression.  @xref{Actions}.
-
-You don't have to give an action for every rule.  When a rule has no
-action, Bison by default copies the value of @code{$1} into @code{$$}.
-This is what happens in the first rule (the one that uses @code{NUM}).
-
-The formatting shown here is the recommended convention, but Bison does
-not require it.  You can add or change white space as much as you wish.
-For example, this:
-
-@example
-exp   : NUM | exp exp '+' @{$$ = $1 + $2; @} | @dots{} ;
-@end example
-
-@noindent
-means the same thing as this:
-
-@example
-exp:      NUM
-        | exp exp '+'    @{ $$ = $1 + $2; @}
-        | @dots{}
-;
-@end example
-
-@noindent
-The latter, however, is much more readable.
-
-@node Rpcalc Lexer
-@subsection The @code{rpcalc} Lexical Analyzer
-@cindex writing a lexical analyzer
-@cindex lexical analyzer, writing
-
-The lexical analyzer's job is low-level parsing: converting characters
-or sequences of characters into tokens.  The Bison parser gets its
-tokens by calling the lexical analyzer.  @xref{Lexical, ,The Lexical
-Analyzer Function @code{yylex}}.
-
-Only a simple lexical analyzer is needed for the @acronym{RPN}
-calculator.  This
-lexical analyzer skips blanks and tabs, then reads in numbers as
-@code{double} and returns them as @code{NUM} tokens.  Any other character
-that isn't part of a number is a separate token.  Note that the token-code
-for such a single-character token is the character itself.
-
-The return value of the lexical analyzer function is a numeric code which
-represents a token type.  The same text used in Bison rules to stand for
-this token type is also a C expression for the numeric code for the type.
-This works in two ways.  If the token type is a character literal, then its
-numeric code is that of the character; you can use the same
-character literal in the lexical analyzer to express the number.  If the
-token type is an identifier, that identifier is defined by Bison as a C
-macro whose definition is the appropriate number.  In this example,
-therefore, @code{NUM} becomes a macro for @code{yylex} to use.
-
-The semantic value of the token (if it has one) is stored into the
-global variable @code{yylval}, which is where the Bison parser will look
-for it.  (The C data type of @code{yylval} is @code{YYSTYPE}, which was
-defined at the beginning of the grammar; @pxref{Rpcalc Decls,
-,Declarations for @code{rpcalc}}.)
-
-A token type code of zero is returned if the end-of-input is encountered.
-(Bison recognizes any nonpositive value as indicating end-of-input.)
-
-Here is the code for the lexical analyzer:
-
-@example
-@group
-/* The lexical analyzer returns a double floating point
-   number on the stack and the token NUM, or the numeric code
-   of the character read if not a number.  It skips all blanks
-   and tabs, and returns 0 for end-of-input.  */
-
-#include <ctype.h>
-@end group
-
-@group
-int
-yylex (void)
-@{
-  int c;
-
-  /* Skip white space.  */
-  while ((c = getchar ()) == ' ' || c == '\t')
-    ;
-@end group
-@group
-  /* Process numbers.  */
-  if (c == '.' || isdigit (c))
-    @{
-      ungetc (c, stdin);
-      scanf ("%lf", &yylval);
-      return NUM;
-    @}
-@end group
-@group
-  /* Return end-of-input.  */
-  if (c == EOF)
-    return 0;
-  /* Return a single char.  */
-  return c;
-@}
-@end group
-@end example
-
-@node Rpcalc Main
-@subsection The Controlling Function
-@cindex controlling function
-@cindex main function in simple example
-
-In keeping with the spirit of this example, the controlling function is
-kept to the bare minimum.  The only requirement is that it call
-@code{yyparse} to start the process of parsing.
-
-@example
-@group
-int
-main (void)
-@{
-  return yyparse ();
-@}
-@end group
-@end example
-
-@node Rpcalc Error
-@subsection The Error Reporting Routine
-@cindex error reporting routine
-
-When @code{yyparse} detects a syntax error, it calls the error reporting
-function @code{yyerror} to print an error message (usually but not
-always @code{"syntax error"}).  It is up to the programmer to supply
-@code{yyerror} (@pxref{Interface, ,Parser C-Language Interface}), so
-here is the definition we will use:
-
-@example
-@group
-#include <stdio.h>
-
-/* Called by yyparse on error.  */
-void
-yyerror (char const *s)
-@{
-  fprintf (stderr, "%s\n", s);
-@}
-@end group
-@end example
-
-After @code{yyerror} returns, the Bison parser may recover from the error
-and continue parsing if the grammar contains a suitable error rule
-(@pxref{Error Recovery}).  Otherwise, @code{yyparse} returns nonzero.  We
-have not written any error rules in this example, so any invalid input will
-cause the calculator program to exit.  This is not clean behavior for a
-real calculator, but it is adequate for the first example.
-
-@node Rpcalc Gen
-@subsection Running Bison to Make the Parser
-@cindex running Bison (introduction)
-
-Before running Bison to produce a parser, we need to decide how to
-arrange all the source code in one or more source files.  For such a
-simple example, the easiest thing is to put everything in one file.  The
-definitions of @code{yylex}, @code{yyerror} and @code{main} go at the
-end, in the epilogue of the file
-(@pxref{Grammar Layout, ,The Overall Layout of a Bison Grammar}).
-
-For a large project, you would probably have several source files, and use
-@code{make} to arrange to recompile them.
-
-With all the source in a single file, you use the following command to
-convert it into a parser file:
-
-@example
-bison @var{file}.y
-@end example
-
-@noindent
-In this example the file was called @file{rpcalc.y} (for ``Reverse Polish
-@sc{calc}ulator'').  Bison produces a file named @file{@var{file}.tab.c},
-removing the @samp{.y} from the original file name.  The file output by
-Bison contains the source code for @code{yyparse}.  The additional
-functions in the input file (@code{yylex}, @code{yyerror} and @code{main})
-are copied verbatim to the output.
-
-@node Rpcalc Compile
-@subsection Compiling the Parser File
-@cindex compiling the parser
-
-Here is how to compile and run the parser file:
-
-@example
-@group
-# @r{List files in current directory.}
-$ @kbd{ls}
-rpcalc.tab.c  rpcalc.y
-@end group
-
-@group
-# @r{Compile the Bison parser.}
-# @r{@samp{-lm} tells compiler to search math library for @code{pow}.}
-$ @kbd{cc -lm -o rpcalc rpcalc.tab.c}
-@end group
-
-@group
-# @r{List files again.}
-$ @kbd{ls}
-rpcalc  rpcalc.tab.c  rpcalc.y
-@end group
-@end example
-
-The file @file{rpcalc} now contains the executable code.  Here is an
-example session using @code{rpcalc}.
-
-@example
-$ @kbd{rpcalc}
-@kbd{4 9 +}
-13
-@kbd{3 7 + 3 4 5 *+-}
--13
-@kbd{3 7 + 3 4 5 * + - n}              @r{Note the unary minus, @samp{n}}
-13
-@kbd{5 6 / 4 n +}
--3.166666667
-@kbd{3 4 ^}                            @r{Exponentiation}
-81
-@kbd{^D}                               @r{End-of-file indicator}
-$
-@end example
-
-@node Infix Calc
-@section Infix Notation Calculator: @code{calc}
-@cindex infix notation calculator
-@cindex @code{calc}
-@cindex calculator, infix notation
-
-We now modify rpcalc to handle infix operators instead of postfix.  Infix
-notation involves the concept of operator precedence and the need for
-parentheses nested to arbitrary depth.  Here is the Bison code for
-@file{calc.y}, an infix desk-top calculator.
-
-@example
-/* Infix notation calculator.  */
-
-%@{
-  #define YYSTYPE double
-  #include <math.h>
-  #include <stdio.h>
-  int yylex (void);
-  void yyerror (char const *);
-%@}
-
-/* Bison declarations.  */
-%token NUM
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation */
-
-%% /* The grammar follows.  */
-input:    /* empty */
-        | input line
-;
-
-line:     '\n'
-        | exp '\n'  @{ printf ("\t%.10g\n", $1); @}
-;
-
-exp:      NUM                @{ $$ = $1;         @}
-        | exp '+' exp        @{ $$ = $1 + $3;    @}
-        | exp '-' exp        @{ $$ = $1 - $3;    @}
-        | exp '*' exp        @{ $$ = $1 * $3;    @}
-        | exp '/' exp        @{ $$ = $1 / $3;    @}
-        | '-' exp  %prec NEG @{ $$ = -$2;        @}
-        | exp '^' exp        @{ $$ = pow ($1, $3); @}
-        | '(' exp ')'        @{ $$ = $2;         @}
-;
-%%
-@end example
-
-@noindent
-The functions @code{yylex}, @code{yyerror} and @code{main} can be the
-same as before.
-
-There are two important new features shown in this code.
-
-In the second section (Bison declarations), @code{%left} declares token
-types and says they are left-associative operators.  The declarations
-@code{%left} and @code{%right} (right associativity) take the place of
-@code{%token} which is used to declare a token type name without
-associativity.  (These tokens are single-character literals, which
-ordinarily don't need to be declared.  We declare them here to specify
-the associativity.)
-
-Operator precedence is determined by the line ordering of the
-declarations; the higher the line number of the declaration (lower on
-the page or screen), the higher the precedence.  Hence, exponentiation
-has the highest precedence, unary minus (@code{NEG}) is next, followed
-by @samp{*} and @samp{/}, and so on.  @xref{Precedence, ,Operator
-Precedence}.
-
-The other important new feature is the @code{%prec} in the grammar
-section for the unary minus operator.  The @code{%prec} simply instructs
-Bison that the rule @samp{| '-' exp} has the same precedence as
-@code{NEG}---in this case the next-to-highest.  @xref{Contextual
-Precedence, ,Context-Dependent Precedence}.
-
-Here is a sample run of @file{calc.y}:
-
-@need 500
-@example
-$ @kbd{calc}
-@kbd{4 + 4.5 - (34/(8*3+-3))}
-6.880952381
-@kbd{-56 + 2}
--54
-@kbd{3 ^ 2}
-9
-@end example
-
-@node Simple Error Recovery
-@section Simple Error Recovery
-@cindex error recovery, simple
-
-Up to this point, this manual has not addressed the issue of @dfn{error
-recovery}---how to continue parsing after the parser detects a syntax
-error.  All we have handled is error reporting with @code{yyerror}.
-Recall that by default @code{yyparse} returns after calling
-@code{yyerror}.  This means that an erroneous input line causes the
-calculator program to exit.  Now we show how to rectify this deficiency.
-
-The Bison language itself includes the reserved word @code{error}, which
-may be included in the grammar rules.  In the example below it has
-been added to one of the alternatives for @code{line}:
-
-@example
-@group
-line:     '\n'
-        | exp '\n'   @{ printf ("\t%.10g\n", $1); @}
-        | error '\n' @{ yyerrok;                  @}
-;
-@end group
-@end example
-
-This addition to the grammar allows for simple error recovery in the
-event of a syntax error.  If an expression that cannot be evaluated is
-read, the error will be recognized by the third rule for @code{line},
-and parsing will continue.  (The @code{yyerror} function is still called
-upon to print its message as well.)  The action executes the statement
-@code{yyerrok}, a macro defined automatically by Bison; its meaning is
-that error recovery is complete (@pxref{Error Recovery}).  Note the
-difference between @code{yyerrok} and @code{yyerror}; neither one is a
-misprint.
-
-This form of error recovery deals with syntax errors.  There are other
-kinds of errors; for example, division by zero, which raises an exception
-signal that is normally fatal.  A real calculator program must handle this
-signal and use @code{longjmp} to return to @code{main} and resume parsing
-input lines; it would also have to discard the rest of the current line of
-input.  We won't discuss this issue further because it is not specific to
-Bison programs.
-
-@node Location Tracking Calc
-@section Location Tracking Calculator: @code{ltcalc}
-@cindex location tracking calculator
-@cindex @code{ltcalc}
-@cindex calculator, location tracking
-
-This example extends the infix notation calculator with location
-tracking.  This feature will be used to improve the error messages.  For
-the sake of clarity, this example is a simple integer calculator, since
-most of the work needed to use locations will be done in the lexical
-analyzer.
-
-@menu
-* Decls: Ltcalc Decls.  Bison and C declarations for ltcalc.
-* Rules: Ltcalc Rules.  Grammar rules for ltcalc, with explanations.
-* Lexer: Ltcalc Lexer.  The lexical analyzer.
-@end menu
-
-@node Ltcalc Decls
-@subsection Declarations for @code{ltcalc}
-
-The C and Bison declarations for the location tracking calculator are
-the same as the declarations for the infix notation calculator.
-
-@example
-/* Location tracking calculator.  */
-
-%@{
-  #define YYSTYPE int
-  #include <math.h>
-  int yylex (void);
-  void yyerror (char const *);
-%@}
-
-/* Bison declarations.  */
-%token NUM
-
-%left '-' '+'
-%left '*' '/'
-%left NEG
-%right '^'
-
-%% /* The grammar follows.  */
-@end example
-
-@noindent
-Note there are no declarations specific to locations.  Defining a data
-type for storing locations is not needed: we will use the type provided
-by default (@pxref{Location Type, ,Data Types of Locations}), which is a
-four member structure with the following integer fields:
-@code{first_line}, @code{first_column}, @code{last_line} and
-@code{last_column}.
-
-@node Ltcalc Rules
-@subsection Grammar Rules for @code{ltcalc}
-
-Whether handling locations or not has no effect on the syntax of your
-language.  Therefore, grammar rules for this example will be very close
-to those of the previous example: we will only modify them to benefit
-from the new information.
-
-Here, we will use locations to report divisions by zero, and locate the
-wrong expressions or subexpressions.
-
-@example
-@group
-input   : /* empty */
-        | input line
-;
-@end group
-
-@group
-line    : '\n'
-        | exp '\n' @{ printf ("%d\n", $1); @}
-;
-@end group
-
-@group
-exp     : NUM           @{ $$ = $1; @}
-        | exp '+' exp   @{ $$ = $1 + $3; @}
-        | exp '-' exp   @{ $$ = $1 - $3; @}
-        | exp '*' exp   @{ $$ = $1 * $3; @}
-@end group
-@group
-        | exp '/' exp
-            @{
-              if ($3)
-                $$ = $1 / $3;
-              else
-                @{
-                  $$ = 1;
-                  fprintf (stderr, "%d.%d-%d.%d: division by zero",
-                           @@3.first_line, @@3.first_column,
-                           @@3.last_line, @@3.last_column);
-                @}
-            @}
-@end group
-@group
-        | '-' exp %preg NEG     @{ $$ = -$2; @}
-        | exp '^' exp           @{ $$ = pow ($1, $3); @}
-        | '(' exp ')'           @{ $$ = $2; @}
-@end group
-@end example
-
-This code shows how to reach locations inside of semantic actions, by
-using the pseudo-variables @code{@@@var{n}} for rule components, and the
-pseudo-variable @code{@@$} for groupings.
-
-We don't need to assign a value to @code{@@$}: the output parser does it
-automatically.  By default, before executing the C code of each action,
-@code{@@$} is set to range from the beginning of @code{@@1} to the end
-of @code{@@@var{n}}, for a rule with @var{n} components.  This behavior
-can be redefined (@pxref{Location Default Action, , Default Action for
-Locations}), and for very specific rules, @code{@@$} can be computed by
-hand.
-
-@node Ltcalc Lexer
-@subsection The @code{ltcalc} Lexical Analyzer.
-
-Until now, we relied on Bison's defaults to enable location
-tracking.  The next step is to rewrite the lexical analyzer, and make it
-able to feed the parser with the token locations, as it already does for
-semantic values.
-
-To this end, we must take into account every single character of the
-input text, to avoid the computed locations of being fuzzy or wrong:
-
-@example
-@group
-int
-yylex (void)
-@{
-  int c;
-@end group
-
-@group
-  /* Skip white space.  */
-  while ((c = getchar ()) == ' ' || c == '\t')
-    ++yylloc.last_column;
-@end group
-
-@group
-  /* Step.  */
-  yylloc.first_line = yylloc.last_line;
-  yylloc.first_column = yylloc.last_column;
-@end group
-
-@group
-  /* Process numbers.  */
-  if (isdigit (c))
-    @{
-      yylval = c - '0';
-      ++yylloc.last_column;
-      while (isdigit (c = getchar ()))
-        @{
-          ++yylloc.last_column;
-          yylval = yylval * 10 + c - '0';
-        @}
-      ungetc (c, stdin);
-      return NUM;
-    @}
-@end group
-
-  /* Return end-of-input.  */
-  if (c == EOF)
-    return 0;
-
-  /* Return a single char, and update location.  */
-  if (c == '\n')
-    @{
-      ++yylloc.last_line;
-      yylloc.last_column = 0;
-    @}
-  else
-    ++yylloc.last_column;
-  return c;
-@}
-@end example
-
-Basically, the lexical analyzer performs the same processing as before:
-it skips blanks and tabs, and reads numbers or single-character tokens.
-In addition, it updates @code{yylloc}, the global variable (of type
-@code{YYLTYPE}) containing the token's location.
-
-Now, each time this function returns a token, the parser has its number
-as well as its semantic value, and its location in the text.  The last
-needed change is to initialize @code{yylloc}, for example in the
-controlling function:
-
-@example
-@group
-int
-main (void)
-@{
-  yylloc.first_line = yylloc.last_line = 1;
-  yylloc.first_column = yylloc.last_column = 0;
-  return yyparse ();
-@}
-@end group
-@end example
-
-Remember that computing locations is not a matter of syntax.  Every
-character must be associated to a location update, whether it is in
-valid input, in comments, in literal strings, and so on.
-
-@node Multi-function Calc
-@section Multi-Function Calculator: @code{mfcalc}
-@cindex multi-function calculator
-@cindex @code{mfcalc}
-@cindex calculator, multi-function
-
-Now that the basics of Bison have been discussed, it is time to move on to
-a more advanced problem.  The above calculators provided only five
-functions, @samp{+}, @samp{-}, @samp{*}, @samp{/} and @samp{^}.  It would
-be nice to have a calculator that provides other mathematical functions such
-as @code{sin}, @code{cos}, etc.
-
-It is easy to add new operators to the infix calculator as long as they are
-only single-character literals.  The lexical analyzer @code{yylex} passes
-back all nonnumeric characters as tokens, so new grammar rules suffice for
-adding a new operator.  But we want something more flexible: built-in
-functions whose syntax has this form:
-
-@example
-@var{function_name} (@var{argument})
-@end example
-
-@noindent
-At the same time, we will add memory to the calculator, by allowing you
-to create named variables, store values in them, and use them later.
-Here is a sample session with the multi-function calculator:
-
-@example
-$ @kbd{mfcalc}
-@kbd{pi = 3.141592653589}
-3.1415926536
-@kbd{sin(pi)}
-0.0000000000
-@kbd{alpha = beta1 = 2.3}
-2.3000000000
-@kbd{alpha}
-2.3000000000
-@kbd{ln(alpha)}
-0.8329091229
-@kbd{exp(ln(beta1))}
-2.3000000000
-$
-@end example
-
-Note that multiple assignment and nested function calls are permitted.
-
-@menu
-* Decl: Mfcalc Decl.      Bison declarations for multi-function calculator.
-* Rules: Mfcalc Rules.    Grammar rules for the calculator.
-* Symtab: Mfcalc Symtab.  Symbol table management subroutines.
-@end menu
-
-@node Mfcalc Decl
-@subsection Declarations for @code{mfcalc}
-
-Here are the C and Bison declarations for the multi-function calculator.
-
-@smallexample
-@group
-%@{
-  #include <math.h>  /* For math functions, cos(), sin(), etc.  */
-  #include "calc.h"  /* Contains definition of `symrec'.  */
-  int yylex (void);
-  void yyerror (char const *);
-%@}
-@end group
-@group
-%union @{
-  double    val;   /* For returning numbers.  */
-  symrec  *tptr;   /* For returning symbol-table pointers.  */
-@}
-@end group
-%token <val>  NUM        /* Simple double precision number.  */
-%token <tptr> VAR FNCT   /* Variable and Function.  */
-%type  <val>  exp
-
-@group
-%right '='
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation */
-@end group
-%% /* The grammar follows.  */
-@end smallexample
-
-The above grammar introduces only two new features of the Bison language.
-These features allow semantic values to have various data types
-(@pxref{Multiple Types, ,More Than One Value Type}).
-
-The @code{%union} declaration specifies the entire list of possible types;
-this is instead of defining @code{YYSTYPE}.  The allowable types are now
-double-floats (for @code{exp} and @code{NUM}) and pointers to entries in
-the symbol table.  @xref{Union Decl, ,The Collection of Value Types}.
-
-Since values can now have various types, it is necessary to associate a
-type with each grammar symbol whose semantic value is used.  These symbols
-are @code{NUM}, @code{VAR}, @code{FNCT}, and @code{exp}.  Their
-declarations are augmented with information about their data type (placed
-between angle brackets).
-
-The Bison construct @code{%type} is used for declaring nonterminal
-symbols, just as @code{%token} is used for declaring token types.  We
-have not used @code{%type} before because nonterminal symbols are
-normally declared implicitly by the rules that define them.  But
-@code{exp} must be declared explicitly so we can specify its value type.
-@xref{Type Decl, ,Nonterminal Symbols}.
-
-@node Mfcalc Rules
-@subsection Grammar Rules for @code{mfcalc}
-
-Here are the grammar rules for the multi-function calculator.
-Most of them are copied directly from @code{calc}; three rules,
-those which mention @code{VAR} or @code{FNCT}, are new.
-
-@smallexample
-@group
-input:   /* empty */
-        | input line
-;
-@end group
-
-@group
-line:
-          '\n'
-        | exp '\n'   @{ printf ("\t%.10g\n", $1); @}
-        | error '\n' @{ yyerrok;                  @}
-;
-@end group
-
-@group
-exp:      NUM                @{ $$ = $1;                         @}
-        | VAR                @{ $$ = $1->value.var;              @}
-        | VAR '=' exp        @{ $$ = $3; $1->value.var = $3;     @}
-        | FNCT '(' exp ')'   @{ $$ = (*($1->value.fnctptr))($3); @}
-        | exp '+' exp        @{ $$ = $1 + $3;                    @}
-        | exp '-' exp        @{ $$ = $1 - $3;                    @}
-        | exp '*' exp        @{ $$ = $1 * $3;                    @}
-        | exp '/' exp        @{ $$ = $1 / $3;                    @}
-        | '-' exp  %prec NEG @{ $$ = -$2;                        @}
-        | exp '^' exp        @{ $$ = pow ($1, $3);               @}
-        | '(' exp ')'        @{ $$ = $2;                         @}
-;
-@end group
-/* End of grammar.  */
-%%
-@end smallexample
-
-@node Mfcalc Symtab
-@subsection The @code{mfcalc} Symbol Table
-@cindex symbol table example
-
-The multi-function calculator requires a symbol table to keep track of the
-names and meanings of variables and functions.  This doesn't affect the
-grammar rules (except for the actions) or the Bison declarations, but it
-requires some additional C functions for support.
-
-The symbol table itself consists of a linked list of records.  Its
-definition, which is kept in the header @file{calc.h}, is as follows.  It
-provides for either functions or variables to be placed in the table.
-
-@smallexample
-@group
-/* Function type.  */
-typedef double (*func_t) (double);
-@end group
-
-@group
-/* Data type for links in the chain of symbols.  */
-struct symrec
-@{
-  char *name;  /* name of symbol */
-  int type;    /* type of symbol: either VAR or FNCT */
-  union
-  @{
-    double var;      /* value of a VAR */
-    func_t fnctptr;  /* value of a FNCT */
-  @} value;
-  struct symrec *next;  /* link field */
-@};
-@end group
-
-@group
-typedef struct symrec symrec;
-
-/* The symbol table: a chain of `struct symrec'.  */
-extern symrec *sym_table;
-
-symrec *putsym (char const *, int);
-symrec *getsym (char const *);
-@end group
-@end smallexample
-
-The new version of @code{main} includes a call to @code{init_table}, a
-function that initializes the symbol table.  Here it is, and
-@code{init_table} as well:
-
-@smallexample
-#include <stdio.h>
-
-@group
-/* Called by yyparse on error.  */
-void
-yyerror (char const *s)
-@{
-  printf ("%s\n", s);
-@}
-@end group
-
-@group
-struct init
-@{
-  char const *fname;
-  double (*fnct) (double);
-@};
-@end group
-
-@group
-struct init const arith_fncts[] =
-@{
-  "sin",  sin,
-  "cos",  cos,
-  "atan", atan,
-  "ln",   log,
-  "exp",  exp,
-  "sqrt", sqrt,
-  0, 0
-@};
-@end group
-
-@group
-/* The symbol table: a chain of `struct symrec'.  */
-symrec *sym_table;
-@end group
-
-@group
-/* Put arithmetic functions in table.  */
-void
-init_table (void)
-@{
-  int i;
-  symrec *ptr;
-  for (i = 0; arith_fncts[i].fname != 0; i++)
-    @{
-      ptr = putsym (arith_fncts[i].fname, FNCT);
-      ptr->value.fnctptr = arith_fncts[i].fnct;
-    @}
-@}
-@end group
-
-@group
-int
-main (void)
-@{
-  init_table ();
-  return yyparse ();
-@}
-@end group
-@end smallexample
-
-By simply editing the initialization list and adding the necessary include
-files, you can add additional functions to the calculator.
-
-Two important functions allow look-up and installation of symbols in the
-symbol table.  The function @code{putsym} is passed a name and the type
-(@code{VAR} or @code{FNCT}) of the object to be installed.  The object is
-linked to the front of the list, and a pointer to the object is returned.
-The function @code{getsym} is passed the name of the symbol to look up.  If
-found, a pointer to that symbol is returned; otherwise zero is returned.
-
-@smallexample
-symrec *
-putsym (char const *sym_name, int sym_type)
-@{
-  symrec *ptr;
-  ptr = (symrec *) malloc (sizeof (symrec));
-  ptr->name = (char *) malloc (strlen (sym_name) + 1);
-  strcpy (ptr->name,sym_name);
-  ptr->type = sym_type;
-  ptr->value.var = 0; /* Set value to 0 even if fctn.  */
-  ptr->next = (struct symrec *)sym_table;
-  sym_table = ptr;
-  return ptr;
-@}
-
-symrec *
-getsym (char const *sym_name)
-@{
-  symrec *ptr;
-  for (ptr = sym_table; ptr != (symrec *) 0;
-       ptr = (symrec *)ptr->next)
-    if (strcmp (ptr->name,sym_name) == 0)
-      return ptr;
-  return 0;
-@}
-@end smallexample
-
-The function @code{yylex} must now recognize variables, numeric values, and
-the single-character arithmetic operators.  Strings of alphanumeric
-characters with a leading letter are recognized as either variables or
-functions depending on what the symbol table says about them.
-
-The string is passed to @code{getsym} for look up in the symbol table.  If
-the name appears in the table, a pointer to its location and its type
-(@code{VAR} or @code{FNCT}) is returned to @code{yyparse}.  If it is not
-already in the table, then it is installed as a @code{VAR} using
-@code{putsym}.  Again, a pointer and its type (which must be @code{VAR}) is
-returned to @code{yyparse}.
-
-No change is needed in the handling of numeric values and arithmetic
-operators in @code{yylex}.
-
-@smallexample
-@group
-#include <ctype.h>
-@end group
-
-@group
-int
-yylex (void)
-@{
-  int c;
-
-  /* Ignore white space, get first nonwhite character.  */
-  while ((c = getchar ()) == ' ' || c == '\t');
-
-  if (c == EOF)
-    return 0;
-@end group
-
-@group
-  /* Char starts a number => parse the number.         */
-  if (c == '.' || isdigit (c))
-    @{
-      ungetc (c, stdin);
-      scanf ("%lf", &yylval.val);
-      return NUM;
-    @}
-@end group
-
-@group
-  /* Char starts an identifier => read the name.       */
-  if (isalpha (c))
-    @{
-      symrec *s;
-      static char *symbuf = 0;
-      static int length = 0;
-      int i;
-@end group
-
-@group
-      /* Initially make the buffer long enough
-         for a 40-character symbol name.  */
-      if (length == 0)
-        length = 40, symbuf = (char *)malloc (length + 1);
-
-      i = 0;
-      do
-@end group
-@group
-        @{
-          /* If buffer is full, make it bigger.        */
-          if (i == length)
-            @{
-              length *= 2;
-              symbuf = (char *) realloc (symbuf, length + 1);
-            @}
-          /* Add this character to the buffer.         */
-          symbuf[i++] = c;
-          /* Get another character.                    */
-          c = getchar ();
-        @}
-@end group
-@group
-      while (isalnum (c));
-
-      ungetc (c, stdin);
-      symbuf[i] = '\0';
-@end group
-
-@group
-      s = getsym (symbuf);
-      if (s == 0)
-        s = putsym (symbuf, VAR);
-      yylval.tptr = s;
-      return s->type;
-    @}
-
-  /* Any other character is a token by itself.        */
-  return c;
-@}
-@end group
-@end smallexample
-
-This program is both powerful and flexible.  You may easily add new
-functions, and it is a simple job to modify this code to install
-predefined variables such as @code{pi} or @code{e} as well.
-
-@node Exercises
-@section Exercises
-@cindex exercises
-
-@enumerate
-@item
-Add some new functions from @file{math.h} to the initialization list.
-
-@item
-Add another array that contains constants and their values.  Then
-modify @code{init_table} to add these constants to the symbol table.
-It will be easiest to give the constants type @code{VAR}.
-
-@item
-Make the program report an error if the user refers to an
-uninitialized variable in any way except to store a value in it.
-@end enumerate
-
-@node Grammar File
-@chapter Bison Grammar Files
-
-Bison takes as input a context-free grammar specification and produces a
-C-language function that recognizes correct instances of the grammar.
-
-The Bison grammar input file conventionally has a name ending in @samp{.y}.
-@xref{Invocation, ,Invoking Bison}.
-
-@menu
-* Grammar Outline::   Overall layout of the grammar file.
-* Symbols::           Terminal and nonterminal symbols.
-* Rules::             How to write grammar rules.
-* Recursion::         Writing recursive rules.
-* Semantics::         Semantic values and actions.
-* Locations::         Locations and actions.
-* Declarations::      All kinds of Bison declarations are described here.
-* Multiple Parsers::  Putting more than one Bison parser in one program.
-@end menu
-
-@node Grammar Outline
-@section Outline of a Bison Grammar
-
-A Bison grammar file has four main sections, shown here with the
-appropriate delimiters:
-
-@example
-%@{
-  @var{Prologue}
-%@}
-
-@var{Bison declarations}
-
-%%
-@var{Grammar rules}
-%%
-
-@var{Epilogue}
-@end example
-
-Comments enclosed in @samp{/* @dots{} */} may appear in any of the sections.
-As a @acronym{GNU} extension, @samp{//} introduces a comment that
-continues until end of line.
-
-@menu
-* Prologue::          Syntax and usage of the prologue.
-* Bison Declarations::  Syntax and usage of the Bison declarations section.
-* Grammar Rules::     Syntax and usage of the grammar rules section.
-* Epilogue::          Syntax and usage of the epilogue.
-@end menu
-
-@node Prologue
-@subsection The prologue
-@cindex declarations section
-@cindex Prologue
-@cindex declarations
-
-The @var{Prologue} section contains macro definitions and declarations
-of functions and variables that are used in the actions in the grammar
-rules.  These are copied to the beginning of the parser file so that
-they precede the definition of @code{yyparse}.  You can use
-@samp{#include} to get the declarations from a header file.  If you
-don't need any C declarations, you may omit the @samp{%@{} and
-@samp{%@}} delimiters that bracket this section.
-
-The @var{Prologue} section is terminated by the the first occurrence
-of @samp{%@}} that is outside a comment, a string literal, or a
-character constant.
-
-You may have more than one @var{Prologue} section, intermixed with the
-@var{Bison declarations}.  This allows you to have C and Bison
-declarations that refer to each other.  For example, the @code{%union}
-declaration may use types defined in a header file, and you may wish to
-prototype functions that take arguments of type @code{YYSTYPE}.  This
-can be done with two @var{Prologue} blocks, one before and one after the
-@code{%union} declaration.
-
-@smallexample
-%@{
-  #include <stdio.h>
-  #include "ptypes.h"
-%@}
-
-%union @{
-  long int n;
-  tree t;  /* @r{@code{tree} is defined in @file{ptypes.h}.} */
-@}
-
-%@{
-  static void print_token_value (FILE *, int, YYSTYPE);
-  #define YYPRINT(F, N, L) print_token_value (F, N, L)
-%@}
-
-@dots{}
-@end smallexample
-
-@node Bison Declarations
-@subsection The Bison Declarations Section
-@cindex Bison declarations (introduction)
-@cindex declarations, Bison (introduction)
-
-The @var{Bison declarations} section contains declarations that define
-terminal and nonterminal symbols, specify precedence, and so on.
-In some simple grammars you may not need any declarations.
-@xref{Declarations, ,Bison Declarations}.
-
-@node Grammar Rules
-@subsection The Grammar Rules Section
-@cindex grammar rules section
-@cindex rules section for grammar
-
-The @dfn{grammar rules} section contains one or more Bison grammar
-rules, and nothing else.  @xref{Rules, ,Syntax of Grammar Rules}.
-
-There must always be at least one grammar rule, and the first
-@samp{%%} (which precedes the grammar rules) may never be omitted even
-if it is the first thing in the file.
-
-@node Epilogue
-@subsection The epilogue
-@cindex additional C code section
-@cindex epilogue
-@cindex C code, section for additional
-
-The @var{Epilogue} is copied verbatim to the end of the parser file, just as
-the @var{Prologue} is copied to the beginning.  This is the most convenient
-place to put anything that you want to have in the parser file but which need
-not come before the definition of @code{yyparse}.  For example, the
-definitions of @code{yylex} and @code{yyerror} often go here.  Because
-C requires functions to be declared before being used, you often need
-to declare functions like @code{yylex} and @code{yyerror} in the Prologue,
-even if you define them in the Epilogue.
-@xref{Interface, ,Parser C-Language Interface}.
-
-If the last section is empty, you may omit the @samp{%%} that separates it
-from the grammar rules.
-
-The Bison parser itself contains many macros and identifiers whose names
-start with @samp{yy} or @samp{YY}, so it is a good idea to avoid using
-any such names (except those documented in this manual) in the epilogue
-of the grammar file.
-
-@node Symbols
-@section Symbols, Terminal and Nonterminal
-@cindex nonterminal symbol
-@cindex terminal symbol
-@cindex token type
-@cindex symbol
-
-@dfn{Symbols} in Bison grammars represent the grammatical classifications
-of the language.
-
-A @dfn{terminal symbol} (also known as a @dfn{token type}) represents a
-class of syntactically equivalent tokens.  You use the symbol in grammar
-rules to mean that a token in that class is allowed.  The symbol is
-represented in the Bison parser by a numeric code, and the @code{yylex}
-function returns a token type code to indicate what kind of token has
-been read.  You don't need to know what the code value is; you can use
-the symbol to stand for it.
-
-A @dfn{nonterminal symbol} stands for a class of syntactically
-equivalent groupings.  The symbol name is used in writing grammar rules.
-By convention, it should be all lower case.
-
-Symbol names can contain letters, digits (not at the beginning),
-underscores and periods.  Periods make sense only in nonterminals.
-
-There are three ways of writing terminal symbols in the grammar:
-
-@itemize @bullet
-@item
-A @dfn{named token type} is written with an identifier, like an
-identifier in C@.  By convention, it should be all upper case.  Each
-such name must be defined with a Bison declaration such as
-@code{%token}.  @xref{Token Decl, ,Token Type Names}.
-
-@item
-@cindex character token
-@cindex literal token
-@cindex single-character literal
-A @dfn{character token type} (or @dfn{literal character token}) is
-written in the grammar using the same syntax used in C for character
-constants; for example, @code{'+'} is a character token type.  A
-character token type doesn't need to be declared unless you need to
-specify its semantic value data type (@pxref{Value Type, ,Data Types of
-Semantic Values}), associativity, or precedence (@pxref{Precedence,
-,Operator Precedence}).
-
-By convention, a character token type is used only to represent a
-token that consists of that particular character.  Thus, the token
-type @code{'+'} is used to represent the character @samp{+} as a
-token.  Nothing enforces this convention, but if you depart from it,
-your program will confuse other readers.
-
-All the usual escape sequences used in character literals in C can be
-used in Bison as well, but you must not use the null character as a
-character literal because its numeric code, zero, signifies
-end-of-input (@pxref{Calling Convention, ,Calling Convention
-for @code{yylex}}).  Also, unlike standard C, trigraphs have no
-special meaning in Bison character literals, nor is backslash-newline
-allowed.
-
-@item
-@cindex string token
-@cindex literal string token
-@cindex multicharacter literal
-A @dfn{literal string token} is written like a C string constant; for
-example, @code{"<="} is a literal string token.  A literal string token
-doesn't need to be declared unless you need to specify its semantic
-value data type (@pxref{Value Type}), associativity, or precedence
-(@pxref{Precedence}).
-
-You can associate the literal string token with a symbolic name as an
-alias, using the @code{%token} declaration (@pxref{Token Decl, ,Token
-Declarations}).  If you don't do that, the lexical analyzer has to
-retrieve the token number for the literal string token from the
-@code{yytname} table (@pxref{Calling Convention}).
-
-@strong{Warning}: literal string tokens do not work in Yacc.
-
-By convention, a literal string token is used only to represent a token
-that consists of that particular string.  Thus, you should use the token
-type @code{"<="} to represent the string @samp{<=} as a token.  Bison
-does not enforce this convention, but if you depart from it, people who
-read your program will be confused.
-
-All the escape sequences used in string literals in C can be used in
-Bison as well, except that you must not use a null character within a
-string literal.  Also, unlike Standard C, trigraphs have no special
-meaning in Bison string literals, nor is backslash-newline allowed.  A
-literal string token must contain two or more characters; for a token
-containing just one character, use a character token (see above).
-@end itemize
-
-How you choose to write a terminal symbol has no effect on its
-grammatical meaning.  That depends only on where it appears in rules and
-on when the parser function returns that symbol.
-
-The value returned by @code{yylex} is always one of the terminal
-symbols, except that a zero or negative value signifies end-of-input.
-Whichever way you write the token type in the grammar rules, you write
-it the same way in the definition of @code{yylex}.  The numeric code
-for a character token type is simply the positive numeric code of the
-character, so @code{yylex} can use the identical value to generate the
-requisite code, though you may need to convert it to @code{unsigned
-char} to avoid sign-extension on hosts where @code{char} is signed.
-Each named token type becomes a C macro in
-the parser file, so @code{yylex} can use the name to stand for the code.
-(This is why periods don't make sense in terminal symbols.)
-@xref{Calling Convention, ,Calling Convention for @code{yylex}}.
-
-If @code{yylex} is defined in a separate file, you need to arrange for the
-token-type macro definitions to be available there.  Use the @samp{-d}
-option when you run Bison, so that it will write these macro definitions
-into a separate header file @file{@var{name}.tab.h} which you can include
-in the other source files that need it.  @xref{Invocation, ,Invoking Bison}.
-
-If you want to write a grammar that is portable to any Standard C
-host, you must use only nonnull character tokens taken from the basic
-execution character set of Standard C@.  This set consists of the ten
-digits, the 52 lower- and upper-case English letters, and the
-characters in the following C-language string:
-
-@example
-"\a\b\t\n\v\f\r !\"#%&'()*+,-./:;<=>?[\\]^_@{|@}~"
-@end example
-
-The @code{yylex} function and Bison must use a consistent character set
-and encoding for character tokens.  For example, if you run Bison in an
-@acronym{ASCII} environment, but then compile and run the resulting
-program in an environment that uses an incompatible character set like
-@acronym{EBCDIC}, the resulting program may not work because the tables
-generated by Bison will assume @acronym{ASCII} numeric values for
-character tokens.  It is standard practice for software distributions to
-contain C source files that were generated by Bison in an
-@acronym{ASCII} environment, so installers on platforms that are
-incompatible with @acronym{ASCII} must rebuild those files before
-compiling them.
-
-The symbol @code{error} is a terminal symbol reserved for error recovery
-(@pxref{Error Recovery}); you shouldn't use it for any other purpose.
-In particular, @code{yylex} should never return this value.  The default
-value of the error token is 256, unless you explicitly assigned 256 to
-one of your tokens with a @code{%token} declaration.
-
-@node Rules
-@section Syntax of Grammar Rules
-@cindex rule syntax
-@cindex grammar rule syntax
-@cindex syntax of grammar rules
-
-A Bison grammar rule has the following general form:
-
-@example
-@group
-@var{result}: @var{components}@dots{}
-        ;
-@end group
-@end example
-
-@noindent
-where @var{result} is the nonterminal symbol that this rule describes,
-and @var{components} are various terminal and nonterminal symbols that
-are put together by this rule (@pxref{Symbols}).
-
-For example,
-
-@example
-@group
-exp:      exp '+' exp
-        ;
-@end group
-@end example
-
-@noindent
-says that two groupings of type @code{exp}, with a @samp{+} token in between,
-can be combined into a larger grouping of type @code{exp}.
-
-White space in rules is significant only to separate symbols.  You can add
-extra white space as you wish.
-
-Scattered among the components can be @var{actions} that determine
-the semantics of the rule.  An action looks like this:
-
-@example
-@{@var{C statements}@}
-@end example
-
-@noindent
-@cindex braced code
-This is an example of @dfn{braced code}, that is, C code surrounded by
-braces, much like a compound statement in C@.  Braced code can contain
-any sequence of C tokens, so long as its braces are balanced.  Bison
-does not check the braced code for correctness directly; it merely
-copies the code to the output file, where the C compiler can check it.
-
-Within braced code, the balanced-brace count is not affected by braces
-within comments, string literals, or character constants, but it is
-affected by the C digraphs @samp{<%} and @samp{%>} that represent
-braces.  At the top level braced code must be terminated by @samp{@}}
-and not by a digraph.  Bison does not look for trigraphs, so if braced
-code uses trigraphs you should ensure that they do not affect the
-nesting of braces or the boundaries of comments, string literals, or
-character constants.
-
-Usually there is only one action and it follows the components.
-@xref{Actions}.
-
-@findex |
-Multiple rules for the same @var{result} can be written separately or can
-be joined with the vertical-bar character @samp{|} as follows:
-
-@example
-@group
-@var{result}:    @var{rule1-components}@dots{}
-        | @var{rule2-components}@dots{}
-        @dots{}
-        ;
-@end group
-@end example
-
-@noindent
-They are still considered distinct rules even when joined in this way.
-
-If @var{components} in a rule is empty, it means that @var{result} can
-match the empty string.  For example, here is how to define a
-comma-separated sequence of zero or more @code{exp} groupings:
-
-@example
-@group
-expseq:   /* empty */
-        | expseq1
-        ;
-@end group
-
-@group
-expseq1:  exp
-        | expseq1 ',' exp
-        ;
-@end group
-@end example
-
-@noindent
-It is customary to write a comment @samp{/* empty */} in each rule
-with no components.
-
-@node Recursion
-@section Recursive Rules
-@cindex recursive rule
-
-A rule is called @dfn{recursive} when its @var{result} nonterminal
-appears also on its right hand side.  Nearly all Bison grammars need to
-use recursion, because that is the only way to define a sequence of any
-number of a particular thing.  Consider this recursive definition of a
-comma-separated sequence of one or more expressions:
-
-@example
-@group
-expseq1:  exp
-        | expseq1 ',' exp
-        ;
-@end group
-@end example
-
-@cindex left recursion
-@cindex right recursion
-@noindent
-Since the recursive use of @code{expseq1} is the leftmost symbol in the
-right hand side, we call this @dfn{left recursion}.  By contrast, here
-the same construct is defined using @dfn{right recursion}:
-
-@example
-@group
-expseq1:  exp
-        | exp ',' expseq1
-        ;
-@end group
-@end example
-
-@noindent
-Any kind of sequence can be defined using either left recursion or right
-recursion, but you should always use left recursion, because it can
-parse a sequence of any number of elements with bounded stack space.
-Right recursion uses up space on the Bison stack in proportion to the
-number of elements in the sequence, because all the elements must be
-shifted onto the stack before the rule can be applied even once.
-@xref{Algorithm, ,The Bison Parser Algorithm}, for further explanation
-of this.
-
-@cindex mutual recursion
-@dfn{Indirect} or @dfn{mutual} recursion occurs when the result of the
-rule does not appear directly on its right hand side, but does appear
-in rules for other nonterminals which do appear on its right hand
-side.
-
-For example:
-
-@example
-@group
-expr:     primary
-        | primary '+' primary
-        ;
-@end group
-
-@group
-primary:  constant
-        | '(' expr ')'
-        ;
-@end group
-@end example
-
-@noindent
-defines two mutually-recursive nonterminals, since each refers to the
-other.
-
-@node Semantics
-@section Defining Language Semantics
-@cindex defining language semantics
-@cindex language semantics, defining
-
-The grammar rules for a language determine only the syntax.  The semantics
-are determined by the semantic values associated with various tokens and
-groupings, and by the actions taken when various groupings are recognized.
-
-For example, the calculator calculates properly because the value
-associated with each expression is the proper number; it adds properly
-because the action for the grouping @w{@samp{@var{x} + @var{y}}} is to add
-the numbers associated with @var{x} and @var{y}.
-
-@menu
-* Value Type::        Specifying one data type for all semantic values.
-* Multiple Types::    Specifying several alternative data types.
-* Actions::           An action is the semantic definition of a grammar rule.
-* Action Types::      Specifying data types for actions to operate on.
-* Mid-Rule Actions::  Most actions go at the end of a rule.
-                      This says when, why and how to use the exceptional
-                        action in the middle of a rule.
-@end menu
-
-@node Value Type
-@subsection Data Types of Semantic Values
-@cindex semantic value type
-@cindex value type, semantic
-@cindex data types of semantic values
-@cindex default data type
-
-In a simple program it may be sufficient to use the same data type for
-the semantic values of all language constructs.  This was true in the
-@acronym{RPN} and infix calculator examples (@pxref{RPN Calc, ,Reverse Polish
-Notation Calculator}).
-
-Bison's default is to use type @code{int} for all semantic values.  To
-specify some other type, define @code{YYSTYPE} as a macro, like this:
-
-@example
-#define YYSTYPE double
-@end example
-
-@noindent
-@code{YYSTYPE}'s replacement list should be a type name
-that does not contain parentheses or square brackets.
-This macro definition must go in the prologue of the grammar file
-(@pxref{Grammar Outline, ,Outline of a Bison Grammar}).
-
-@node Multiple Types
-@subsection More Than One Value Type
-
-In most programs, you will need different data types for different kinds
-of tokens and groupings.  For example, a numeric constant may need type
-@code{int} or @code{long int}, while a string constant needs type
-@code{char *}, and an identifier might need a pointer to an entry in the
-symbol table.
-
-To use more than one data type for semantic values in one parser, Bison
-requires you to do two things:
-
-@itemize @bullet
-@item
-Specify the entire collection of possible data types, with the
-@code{%union} Bison declaration (@pxref{Union Decl, ,The Collection of
-Value Types}).
-
-@item
-Choose one of those types for each symbol (terminal or nonterminal) for
-which semantic values are used.  This is done for tokens with the
-@code{%token} Bison declaration (@pxref{Token Decl, ,Token Type Names})
-and for groupings with the @code{%type} Bison declaration (@pxref{Type
-Decl, ,Nonterminal Symbols}).
-@end itemize
-
-@node Actions
-@subsection Actions
-@cindex action
-@vindex $$
-@vindex $@var{n}
-
-An action accompanies a syntactic rule and contains C code to be executed
-each time an instance of that rule is recognized.  The task of most actions
-is to compute a semantic value for the grouping built by the rule from the
-semantic values associated with tokens or smaller groupings.
-
-An action consists of braced code containing C statements, and can be
-placed at any position in the rule;
-it is executed at that position.  Most rules have just one action at the
-end of the rule, following all the components.  Actions in the middle of
-a rule are tricky and used only for special purposes (@pxref{Mid-Rule
-Actions, ,Actions in Mid-Rule}).
-
-The C code in an action can refer to the semantic values of the components
-matched by the rule with the construct @code{$@var{n}}, which stands for
-the value of the @var{n}th component.  The semantic value for the grouping
-being constructed is @code{$$}.  Bison translates both of these
-constructs into expressions of the appropriate type when it copies the
-actions into the parser file.  @code{$$} is translated to a modifiable
-lvalue, so it can be assigned to.
-
-Here is a typical example:
-
-@example
-@group
-exp:    @dots{}
-        | exp '+' exp
-            @{ $$ = $1 + $3; @}
-@end group
-@end example
-
-@noindent
-This rule constructs an @code{exp} from two smaller @code{exp} groupings
-connected by a plus-sign token.  In the action, @code{$1} and @code{$3}
-refer to the semantic values of the two component @code{exp} groupings,
-which are the first and third symbols on the right hand side of the rule.
-The sum is stored into @code{$$} so that it becomes the semantic value of
-the addition-expression just recognized by the rule.  If there were a
-useful semantic value associated with the @samp{+} token, it could be
-referred to as @code{$2}.
-
-Note that the vertical-bar character @samp{|} is really a rule
-separator, and actions are attached to a single rule.  This is a
-difference with tools like Flex, for which @samp{|} stands for either
-``or'', or ``the same action as that of the next rule''.  In the
-following example, the action is triggered only when @samp{b} is found:
-
-@example
-@group
-a-or-b: 'a'|'b'   @{ a_or_b_found = 1; @};
-@end group
-@end example
-
-@cindex default action
-If you don't specify an action for a rule, Bison supplies a default:
-@w{@code{$$ = $1}.}  Thus, the value of the first symbol in the rule
-becomes the value of the whole rule.  Of course, the default action is
-valid only if the two data types match.  There is no meaningful default
-action for an empty rule; every empty rule must have an explicit action
-unless the rule's value does not matter.
-
-@code{$@var{n}} with @var{n} zero or negative is allowed for reference
-to tokens and groupings on the stack @emph{before} those that match the
-current rule.  This is a very risky practice, and to use it reliably
-you must be certain of the context in which the rule is applied.  Here
-is a case in which you can use this reliably:
-
-@example
-@group
-foo:      expr bar '+' expr  @{ @dots{} @}
-        | expr bar '-' expr  @{ @dots{} @}
-        ;
-@end group
-
-@group
-bar:      /* empty */
-        @{ previous_expr = $0; @}
-        ;
-@end group
-@end example
-
-As long as @code{bar} is used only in the fashion shown here, @code{$0}
-always refers to the @code{expr} which precedes @code{bar} in the
-definition of @code{foo}.
-
-@vindex yylval
-It is also possible to access the semantic value of the look-ahead token, if
-any, from a semantic action.
-This semantic value is stored in @code{yylval}.
-@xref{Action Features, ,Special Features for Use in Actions}.
-
-@node Action Types
-@subsection Data Types of Values in Actions
-@cindex action data types
-@cindex data types in actions
-
-If you have chosen a single data type for semantic values, the @code{$$}
-and @code{$@var{n}} constructs always have that data type.
-
-If you have used @code{%union} to specify a variety of data types, then you
-must declare a choice among these types for each terminal or nonterminal
-symbol that can have a semantic value.  Then each time you use @code{$$} or
-@code{$@var{n}}, its data type is determined by which symbol it refers to
-in the rule.  In this example,
-
-@example
-@group
-exp:    @dots{}
-        | exp '+' exp
-            @{ $$ = $1 + $3; @}
-@end group
-@end example
-
-@noindent
-@code{$1} and @code{$3} refer to instances of @code{exp}, so they all
-have the data type declared for the nonterminal symbol @code{exp}.  If
-@code{$2} were used, it would have the data type declared for the
-terminal symbol @code{'+'}, whatever that might be.
-
-Alternatively, you can specify the data type when you refer to the value,
-by inserting @samp{<@var{type}>} after the @samp{$} at the beginning of the
-reference.  For example, if you have defined types as shown here:
-
-@example
-@group
-%union @{
-  int itype;
-  double dtype;
-@}
-@end group
-@end example
-
-@noindent
-then you can write @code{$<itype>1} to refer to the first subunit of the
-rule as an integer, or @code{$<dtype>1} to refer to it as a double.
-
-@node Mid-Rule Actions
-@subsection Actions in Mid-Rule
-@cindex actions in mid-rule
-@cindex mid-rule actions
-
-Occasionally it is useful to put an action in the middle of a rule.
-These actions are written just like usual end-of-rule actions, but they
-are executed before the parser even recognizes the following components.
-
-A mid-rule action may refer to the components preceding it using
-@code{$@var{n}}, but it may not refer to subsequent components because
-it is run before they are parsed.
-
-The mid-rule action itself counts as one of the components of the rule.
-This makes a difference when there is another action later in the same rule
-(and usually there is another at the end): you have to count the actions
-along with the symbols when working out which number @var{n} to use in
-@code{$@var{n}}.
-
-The mid-rule action can also have a semantic value.  The action can set
-its value with an assignment to @code{$$}, and actions later in the rule
-can refer to the value using @code{$@var{n}}.  Since there is no symbol
-to name the action, there is no way to declare a data type for the value
-in advance, so you must use the @samp{$<@dots{}>@var{n}} construct to
-specify a data type each time you refer to this value.
-
-There is no way to set the value of the entire rule with a mid-rule
-action, because assignments to @code{$$} do not have that effect.  The
-only way to set the value for the entire rule is with an ordinary action
-at the end of the rule.
-
-Here is an example from a hypothetical compiler, handling a @code{let}
-statement that looks like @samp{let (@var{variable}) @var{statement}} and
-serves to create a variable named @var{variable} temporarily for the
-duration of @var{statement}.  To parse this construct, we must put
-@var{variable} into the symbol table while @var{statement} is parsed, then
-remove it afterward.  Here is how it is done:
-
-@example
-@group
-stmt:   LET '(' var ')'
-                @{ $<context>$ = push_context ();
-                  declare_variable ($3); @}
-        stmt    @{ $$ = $6;
-                  pop_context ($<context>5); @}
-@end group
-@end example
-
-@noindent
-As soon as @samp{let (@var{variable})} has been recognized, the first
-action is run.  It saves a copy of the current semantic context (the
-list of accessible variables) as its semantic value, using alternative
-@code{context} in the data-type union.  Then it calls
-@code{declare_variable} to add the new variable to that list.  Once the
-first action is finished, the embedded statement @code{stmt} can be
-parsed.  Note that the mid-rule action is component number 5, so the
-@samp{stmt} is component number 6.
-
-After the embedded statement is parsed, its semantic value becomes the
-value of the entire @code{let}-statement.  Then the semantic value from the
-earlier action is used to restore the prior list of variables.  This
-removes the temporary @code{let}-variable from the list so that it won't
-appear to exist while the rest of the program is parsed.
-
-@findex %destructor
-@cindex discarded symbols, mid-rule actions
-@cindex error recovery, mid-rule actions
-In the above example, if the parser initiates error recovery (@pxref{Error
-Recovery}) while parsing the tokens in the embedded statement @code{stmt},
-it might discard the previous semantic context @code{$<context>5} without
-restoring it.
-Thus, @code{$<context>5} needs a destructor (@pxref{Destructor Decl, , Freeing
-Discarded Symbols}).
-However, Bison currently provides no means to declare a destructor for a
-mid-rule action's semantic value.
-
-One solution is to bury the mid-rule action inside a nonterminal symbol and to
-declare a destructor for that symbol:
-
-@example
-@group
-%type <context> let
-%destructor @{ pop_context ($$); @} let
-
-%%
-
-stmt:  let stmt
-               @{ $$ = $2;
-                 pop_context ($1); @}
-       ;
-
-let:   LET '(' var ')'
-               @{ $$ = push_context ();
-                 declare_variable ($3); @}
-       ;
-
-@end group
-@end example
-
-@noindent
-Note that the action is now at the end of its rule.
-Any mid-rule action can be converted to an end-of-rule action in this way, and
-this is what Bison actually does to implement mid-rule actions.
-
-Taking action before a rule is completely recognized often leads to
-conflicts since the parser must commit to a parse in order to execute the
-action.  For example, the following two rules, without mid-rule actions,
-can coexist in a working parser because the parser can shift the open-brace
-token and look at what follows before deciding whether there is a
-declaration or not:
-
-@example
-@group
-compound: '@{' declarations statements '@}'
-        | '@{' statements '@}'
-        ;
-@end group
-@end example
-
-@noindent
-But when we add a mid-rule action as follows, the rules become nonfunctional:
-
-@example
-@group
-compound: @{ prepare_for_local_variables (); @}
-          '@{' declarations statements '@}'
-@end group
-@group
-        | '@{' statements '@}'
-        ;
-@end group
-@end example
-
-@noindent
-Now the parser is forced to decide whether to run the mid-rule action
-when it has read no farther than the open-brace.  In other words, it
-must commit to using one rule or the other, without sufficient
-information to do it correctly.  (The open-brace token is what is called
-the @dfn{look-ahead} token at this time, since the parser is still
-deciding what to do about it.  @xref{Look-Ahead, ,Look-Ahead Tokens}.)
-
-You might think that you could correct the problem by putting identical
-actions into the two rules, like this:
-
-@example
-@group
-compound: @{ prepare_for_local_variables (); @}
-          '@{' declarations statements '@}'
-        | @{ prepare_for_local_variables (); @}
-          '@{' statements '@}'
-        ;
-@end group
-@end example
-
-@noindent
-But this does not help, because Bison does not realize that the two actions
-are identical.  (Bison never tries to understand the C code in an action.)
-
-If the grammar is such that a declaration can be distinguished from a
-statement by the first token (which is true in C), then one solution which
-does work is to put the action after the open-brace, like this:
-
-@example
-@group
-compound: '@{' @{ prepare_for_local_variables (); @}
-          declarations statements '@}'
-        | '@{' statements '@}'
-        ;
-@end group
-@end example
-
-@noindent
-Now the first token of the following declaration or statement,
-which would in any case tell Bison which rule to use, can still do so.
-
-Another solution is to bury the action inside a nonterminal symbol which
-serves as a subroutine:
-
-@example
-@group
-subroutine: /* empty */
-          @{ prepare_for_local_variables (); @}
-        ;
-
-@end group
-
-@group
-compound: subroutine
-          '@{' declarations statements '@}'
-        | subroutine
-          '@{' statements '@}'
-        ;
-@end group
-@end example
-
-@noindent
-Now Bison can execute the action in the rule for @code{subroutine} without
-deciding which rule for @code{compound} it will eventually use.
-
-@node Locations
-@section Tracking Locations
-@cindex location
-@cindex textual location
-@cindex location, textual
-
-Though grammar rules and semantic actions are enough to write a fully
-functional parser, it can be useful to process some additional information,
-especially symbol locations.
-
-The way locations are handled is defined by providing a data type, and
-actions to take when rules are matched.
-
-@menu
-* Location Type::               Specifying a data type for locations.
-* Actions and Locations::       Using locations in actions.
-* Location Default Action::     Defining a general way to compute locations.
-@end menu
-
-@node Location Type
-@subsection Data Type of Locations
-@cindex data type of locations
-@cindex default location type
-
-Defining a data type for locations is much simpler than for semantic values,
-since all tokens and groupings always use the same type.
-
-You can specify the type of locations by defining a macro called
-@code{YYLTYPE}, just as you can specify the semantic value type by
-defining @code{YYSTYPE} (@pxref{Value Type}).
-When @code{YYLTYPE} is not defined, Bison uses a default structure type with
-four members:
-
-@example
-typedef struct YYLTYPE
-@{
-  int first_line;
-  int first_column;
-  int last_line;
-  int last_column;
-@} YYLTYPE;
-@end example
-
-@node Actions and Locations
-@subsection Actions and Locations
-@cindex location actions
-@cindex actions, location
-@vindex @@$
-@vindex @@@var{n}
-
-Actions are not only useful for defining language semantics, but also for
-describing the behavior of the output parser with locations.
-
-The most obvious way for building locations of syntactic groupings is very
-similar to the way semantic values are computed.  In a given rule, several
-constructs can be used to access the locations of the elements being matched.
-The location of the @var{n}th component of the right hand side is
-@code{@@@var{n}}, while the location of the left hand side grouping is
-@code{@@$}.
-
-Here is a basic example using the default data type for locations:
-
-@example
-@group
-exp:    @dots{}
-        | exp '/' exp
-            @{
-              @@$.first_column = @@1.first_column;
-              @@$.first_line = @@1.first_line;
-              @@$.last_column = @@3.last_column;
-              @@$.last_line = @@3.last_line;
-              if ($3)
-                $$ = $1 / $3;
-              else
-                @{
-                  $$ = 1;
-                  fprintf (stderr,
-                           "Division by zero, l%d,c%d-l%d,c%d",
-                           @@3.first_line, @@3.first_column,
-                           @@3.last_line, @@3.last_column);
-                @}
-            @}
-@end group
-@end example
-
-As for semantic values, there is a default action for locations that is
-run each time a rule is matched.  It sets the beginning of @code{@@$} to the
-beginning of the first symbol, and the end of @code{@@$} to the end of the
-last symbol.
-
-With this default action, the location tracking can be fully automatic.  The
-example above simply rewrites this way:
-
-@example
-@group
-exp:    @dots{}
-        | exp '/' exp
-            @{
-              if ($3)
-                $$ = $1 / $3;
-              else
-                @{
-                  $$ = 1;
-                  fprintf (stderr,
-                           "Division by zero, l%d,c%d-l%d,c%d",
-                           @@3.first_line, @@3.first_column,
-                           @@3.last_line, @@3.last_column);
-                @}
-            @}
-@end group
-@end example
-
-@vindex yylloc
-It is also possible to access the location of the look-ahead token, if any,
-from a semantic action.
-This location is stored in @code{yylloc}.
-@xref{Action Features, ,Special Features for Use in Actions}.
-
-@node Location Default Action
-@subsection Default Action for Locations
-@vindex YYLLOC_DEFAULT
-@cindex @acronym{GLR} parsers and @code{YYLLOC_DEFAULT}
-
-Actually, actions are not the best place to compute locations.  Since
-locations are much more general than semantic values, there is room in
-the output parser to redefine the default action to take for each
-rule.  The @code{YYLLOC_DEFAULT} macro is invoked each time a rule is
-matched, before the associated action is run.  It is also invoked
-while processing a syntax error, to compute the error's location.
-Before reporting an unresolvable syntactic ambiguity, a @acronym{GLR}
-parser invokes @code{YYLLOC_DEFAULT} recursively to compute the location
-of that ambiguity.
-
-Most of the time, this macro is general enough to suppress location
-dedicated code from semantic actions.
-
-The @code{YYLLOC_DEFAULT} macro takes three parameters.  The first one is
-the location of the grouping (the result of the computation).  When a
-rule is matched, the second parameter identifies locations of
-all right hand side elements of the rule being matched, and the third
-parameter is the size of the rule's right hand side.
-When a @acronym{GLR} parser reports an ambiguity, which of multiple candidate
-right hand sides it passes to @code{YYLLOC_DEFAULT} is undefined.
-When processing a syntax error, the second parameter identifies locations
-of the symbols that were discarded during error processing, and the third
-parameter is the number of discarded symbols.
-
-By default, @code{YYLLOC_DEFAULT} is defined this way:
-
-@smallexample
-@group
-# define YYLLOC_DEFAULT(Current, Rhs, N)                                \
-    do                                                                  \
-      if (N)                                                            \
-        @{                                                               \
-          (Current).first_line   = YYRHSLOC(Rhs, 1).first_line;         \
-          (Current).first_column = YYRHSLOC(Rhs, 1).first_column;       \
-          (Current).last_line    = YYRHSLOC(Rhs, N).last_line;          \
-          (Current).last_column  = YYRHSLOC(Rhs, N).last_column;        \
-        @}                                                               \
-      else                                                              \
-        @{                                                               \
-          (Current).first_line   = (Current).last_line   =              \
-            YYRHSLOC(Rhs, 0).last_line;                                 \
-          (Current).first_column = (Current).last_column =              \
-            YYRHSLOC(Rhs, 0).last_column;                               \
-        @}                                                               \
-    while (0)
-@end group
-@end smallexample
-
-where @code{YYRHSLOC (rhs, k)} is the location of the @var{k}th symbol
-in @var{rhs} when @var{k} is positive, and the location of the symbol
-just before the reduction when @var{k} and @var{n} are both zero.
-
-When defining @code{YYLLOC_DEFAULT}, you should consider that:
-
-@itemize @bullet
-@item
-All arguments are free of side-effects.  However, only the first one (the
-result) should be modified by @code{YYLLOC_DEFAULT}.
-
-@item
-For consistency with semantic actions, valid indexes within the
-right hand side range from 1 to @var{n}.  When @var{n} is zero, only 0 is a
-valid index, and it refers to the symbol just before the reduction.
-During error processing @var{n} is always positive.
-
-@item
-Your macro should parenthesize its arguments, if need be, since the
-actual arguments may not be surrounded by parentheses.  Also, your
-macro should expand to something that can be used as a single
-statement when it is followed by a semicolon.
-@end itemize
-
-@node Declarations
-@section Bison Declarations
-@cindex declarations, Bison
-@cindex Bison declarations
-
-The @dfn{Bison declarations} section of a Bison grammar defines the symbols
-used in formulating the grammar and the data types of semantic values.
-@xref{Symbols}.
-
-All token type names (but not single-character literal tokens such as
-@code{'+'} and @code{'*'}) must be declared.  Nonterminal symbols must be
-declared if you need to specify which data type to use for the semantic
-value (@pxref{Multiple Types, ,More Than One Value Type}).
-
-The first rule in the file also specifies the start symbol, by default.
-If you want some other symbol to be the start symbol, you must declare
-it explicitly (@pxref{Language and Grammar, ,Languages and Context-Free
-Grammars}).
-
-@menu
-* Require Decl::      Requiring a Bison version.
-* Token Decl::        Declaring terminal symbols.
-* Precedence Decl::   Declaring terminals with precedence and associativity.
-* Union Decl::        Declaring the set of all semantic value types.
-* Type Decl::         Declaring the choice of type for a nonterminal symbol.
-* Initial Action Decl::  Code run before parsing starts.
-* Destructor Decl::   Declaring how symbols are freed.
-* Expect Decl::       Suppressing warnings about parsing conflicts.
-* Start Decl::        Specifying the start symbol.
-* Pure Decl::         Requesting a reentrant parser.
-* Decl Summary::      Table of all Bison declarations.
-@end menu
-
-@node Require Decl
-@subsection Require a Version of Bison
-@cindex version requirement
-@cindex requiring a version of Bison
-@findex %require
-
-You may require the minimum version of Bison to process the grammar.  If
-the requirement is not met, @command{bison} exits with an error (exit
-status 63).
-
-@example
-%require "@var{version}"
-@end example
-
-@node Token Decl
-@subsection Token Type Names
-@cindex declaring token type names
-@cindex token type names, declaring
-@cindex declaring literal string tokens
-@findex %token
-
-The basic way to declare a token type name (terminal symbol) is as follows:
-
-@example
-%token @var{name}
-@end example
-
-Bison will convert this into a @code{#define} directive in
-the parser, so that the function @code{yylex} (if it is in this file)
-can use the name @var{name} to stand for this token type's code.
-
-Alternatively, you can use @code{%left}, @code{%right}, or
-@code{%nonassoc} instead of @code{%token}, if you wish to specify
-associativity and precedence.  @xref{Precedence Decl, ,Operator
-Precedence}.
-
-You can explicitly specify the numeric code for a token type by appending
-a decimal or hexadecimal integer value in the field immediately
-following the token name:
-
-@example
-%token NUM 300
-%token XNUM 0x12d // a GNU extension
-@end example
-
-@noindent
-It is generally best, however, to let Bison choose the numeric codes for
-all token types.  Bison will automatically select codes that don't conflict
-with each other or with normal characters.
-
-In the event that the stack type is a union, you must augment the
-@code{%token} or other token declaration to include the data type
-alternative delimited by angle-brackets (@pxref{Multiple Types, ,More
-Than One Value Type}).
-
-For example:
-
-@example
-@group
-%union @{              /* define stack type */
-  double val;
-  symrec *tptr;
-@}
-%token <val> NUM      /* define token NUM and its type */
-@end group
-@end example
-
-You can associate a literal string token with a token type name by
-writing the literal string at the end of a @code{%token}
-declaration which declares the name.  For example:
-
-@example
-%token arrow "=>"
-@end example
-
-@noindent
-For example, a grammar for the C language might specify these names with
-equivalent literal string tokens:
-
-@example
-%token  <operator>  OR      "||"
-%token  <operator>  LE 134  "<="
-%left  OR  "<="
-@end example
-
-@noindent
-Once you equate the literal string and the token name, you can use them
-interchangeably in further declarations or the grammar rules.  The
-@code{yylex} function can use the token name or the literal string to
-obtain the token type code number (@pxref{Calling Convention}).
-
-@node Precedence Decl
-@subsection Operator Precedence
-@cindex precedence declarations
-@cindex declaring operator precedence
-@cindex operator precedence, declaring
-
-Use the @code{%left}, @code{%right} or @code{%nonassoc} declaration to
-declare a token and specify its precedence and associativity, all at
-once.  These are called @dfn{precedence declarations}.
-@xref{Precedence, ,Operator Precedence}, for general information on
-operator precedence.
-
-The syntax of a precedence declaration is the same as that of
-@code{%token}: either
-
-@example
-%left @var{symbols}@dots{}
-@end example
-
-@noindent
-or
-
-@example
-%left <@var{type}> @var{symbols}@dots{}
-@end example
-
-And indeed any of these declarations serves the purposes of @code{%token}.
-But in addition, they specify the associativity and relative precedence for
-all the @var{symbols}:
-
-@itemize @bullet
-@item
-The associativity of an operator @var{op} determines how repeated uses
-of the operator nest: whether @samp{@var{x} @var{op} @var{y} @var{op}
-@var{z}} is parsed by grouping @var{x} with @var{y} first or by
-grouping @var{y} with @var{z} first.  @code{%left} specifies
-left-associativity (grouping @var{x} with @var{y} first) and
-@code{%right} specifies right-associativity (grouping @var{y} with
-@var{z} first).  @code{%nonassoc} specifies no associativity, which
-means that @samp{@var{x} @var{op} @var{y} @var{op} @var{z}} is
-considered a syntax error.
-
-@item
-The precedence of an operator determines how it nests with other operators.
-All the tokens declared in a single precedence declaration have equal
-precedence and nest together according to their associativity.
-When two tokens declared in different precedence declarations associate,
-the one declared later has the higher precedence and is grouped first.
-@end itemize
-
-@node Union Decl
-@subsection The Collection of Value Types
-@cindex declaring value types
-@cindex value types, declaring
-@findex %union
-
-The @code{%union} declaration specifies the entire collection of
-possible data types for semantic values.  The keyword @code{%union} is
-followed by braced code containing the same thing that goes inside a
-@code{union} in C@.
-
-For example:
-
-@example
-@group
-%union @{
-  double val;
-  symrec *tptr;
-@}
-@end group
-@end example
-
-@noindent
-This says that the two alternative types are @code{double} and @code{symrec
-*}.  They are given names @code{val} and @code{tptr}; these names are used
-in the @code{%token} and @code{%type} declarations to pick one of the types
-for a terminal or nonterminal symbol (@pxref{Type Decl, ,Nonterminal Symbols}).
-
-As an extension to @acronym{POSIX}, a tag is allowed after the
-@code{union}.  For example:
-
-@example
-@group
-%union value @{
-  double val;
-  symrec *tptr;
-@}
-@end group
-@end example
-
-@noindent
-specifies the union tag @code{value}, so the corresponding C type is
-@code{union value}.  If you do not specify a tag, it defaults to
-@code{YYSTYPE}.
-
-As another extension to @acronym{POSIX}, you may specify multiple
-@code{%union} declarations; their contents are concatenated.  However,
-only the first @code{%union} declaration can specify a tag.
-
-Note that, unlike making a @code{union} declaration in C, you need not write
-a semicolon after the closing brace.
-
-@node Type Decl
-@subsection Nonterminal Symbols
-@cindex declaring value types, nonterminals
-@cindex value types, nonterminals, declaring
-@findex %type
-
-@noindent
-When you use @code{%union} to specify multiple value types, you must
-declare the value type of each nonterminal symbol for which values are
-used.  This is done with a @code{%type} declaration, like this:
-
-@example
-%type <@var{type}> @var{nonterminal}@dots{}
-@end example
-
-@noindent
-Here @var{nonterminal} is the name of a nonterminal symbol, and
-@var{type} is the name given in the @code{%union} to the alternative
-that you want (@pxref{Union Decl, ,The Collection of Value Types}).  You
-can give any number of nonterminal symbols in the same @code{%type}
-declaration, if they have the same value type.  Use spaces to separate
-the symbol names.
-
-You can also declare the value type of a terminal symbol.  To do this,
-use the same @code{<@var{type}>} construction in a declaration for the
-terminal symbol.  All kinds of token declarations allow
-@code{<@var{type}>}.
-
-@node Initial Action Decl
-@subsection Performing Actions before Parsing
-@findex %initial-action
-
-Sometimes your parser needs to perform some initializations before
-parsing.  The @code{%initial-action} directive allows for such arbitrary
-code.
-
-@deffn {Directive} %initial-action @{ @var{code} @}
-@findex %initial-action
-Declare that the braced @var{code} must be invoked before parsing each time
-@code{yyparse} is called.  The @var{code} may use @code{$$} and
-@code{@@$} --- initial value and location of the look-ahead --- and the
-@code{%parse-param}.
-@end deffn
-
-For instance, if your locations use a file name, you may use
-
-@example
-%parse-param @{ char const *file_name @};
-%initial-action
-@{
-  @@$.initialize (file_name);
-@};
-@end example
-
-
-@node Destructor Decl
-@subsection Freeing Discarded Symbols
-@cindex freeing discarded symbols
-@findex %destructor
-
-During error recovery (@pxref{Error Recovery}), symbols already pushed
-on the stack and tokens coming from the rest of the file are discarded
-until the parser falls on its feet.  If the parser runs out of memory,
-or if it returns via @code{YYABORT} or @code{YYACCEPT}, all the
-symbols on the stack must be discarded.  Even if the parser succeeds, it
-must discard the start symbol.
-
-When discarded symbols convey heap based information, this memory is
-lost.  While this behavior can be tolerable for batch parsers, such as
-in traditional compilers, it is unacceptable for programs like shells or
-protocol implementations that may parse and execute indefinitely.
-
-The @code{%destructor} directive defines code that is called when a
-symbol is automatically discarded.
-
-@deffn {Directive} %destructor @{ @var{code} @} @var{symbols}
-@findex %destructor
-Invoke the braced @var{code} whenever the parser discards one of the
-@var{symbols}.
-Within @var{code}, @code{$$} designates the semantic value associated
-with the discarded symbol.  The additional parser parameters are also
-available (@pxref{Parser Function, , The Parser Function
-@code{yyparse}}).
-@end deffn
-
-For instance:
-
-@smallexample
-%union
-@{
-  char *string;
-@}
-%token <string> STRING
-%type  <string> string
-%destructor @{ free ($$); @} STRING string
-@end smallexample
-
-@noindent
-guarantees that when a @code{STRING} or a @code{string} is discarded,
-its associated memory will be freed.
-
-@sp 1
-
-@cindex discarded symbols
-@dfn{Discarded symbols} are the following:
-
-@itemize
-@item
-stacked symbols popped during the first phase of error recovery,
-@item
-incoming terminals during the second phase of error recovery,
-@item
-the current look-ahead and the entire stack (except the current
-right-hand side symbols) when the parser returns immediately, and
-@item
-the start symbol, when the parser succeeds.
-@end itemize
-
-The parser can @dfn{return immediately} because of an explicit call to
-@code{YYABORT} or @code{YYACCEPT}, or failed error recovery, or memory
-exhaustion.
-
-Right-hand size symbols of a rule that explicitly triggers a syntax
-error via @code{YYERROR} are not discarded automatically.  As a rule
-of thumb, destructors are invoked only when user actions cannot manage
-the memory.
-
-@node Expect Decl
-@subsection Suppressing Conflict Warnings
-@cindex suppressing conflict warnings
-@cindex preventing warnings about conflicts
-@cindex warnings, preventing
-@cindex conflicts, suppressing warnings of
-@findex %expect
-@findex %expect-rr
-
-Bison normally warns if there are any conflicts in the grammar
-(@pxref{Shift/Reduce, ,Shift/Reduce Conflicts}), but most real grammars
-have harmless shift/reduce conflicts which are resolved in a predictable
-way and would be difficult to eliminate.  It is desirable to suppress
-the warning about these conflicts unless the number of conflicts
-changes.  You can do this with the @code{%expect} declaration.
-
-The declaration looks like this:
-
-@example
-%expect @var{n}
-@end example
-
-Here @var{n} is a decimal integer.  The declaration says there should
-be @var{n} shift/reduce conflicts and no reduce/reduce conflicts.
-Bison reports an error if the number of shift/reduce conflicts differs
-from @var{n}, or if there are any reduce/reduce conflicts.
-
-For normal @acronym{LALR}(1) parsers, reduce/reduce conflicts are more
-serious, and should be eliminated entirely.  Bison will always report
-reduce/reduce conflicts for these parsers.  With @acronym{GLR}
-parsers, however, both kinds of conflicts are routine; otherwise,
-there would be no need to use @acronym{GLR} parsing.  Therefore, it is
-also possible to specify an expected number of reduce/reduce conflicts
-in @acronym{GLR} parsers, using the declaration:
-
-@example
-%expect-rr @var{n}
-@end example
-
-In general, using @code{%expect} involves these steps:
-
-@itemize @bullet
-@item
-Compile your grammar without @code{%expect}.  Use the @samp{-v} option
-to get a verbose list of where the conflicts occur.  Bison will also
-print the number of conflicts.
-
-@item
-Check each of the conflicts to make sure that Bison's default
-resolution is what you really want.  If not, rewrite the grammar and
-go back to the beginning.
-
-@item
-Add an @code{%expect} declaration, copying the number @var{n} from the
-number which Bison printed.  With @acronym{GLR} parsers, add an
-@code{%expect-rr} declaration as well.
-@end itemize
-
-Now Bison will warn you if you introduce an unexpected conflict, but
-will keep silent otherwise.
-
-@node Start Decl
-@subsection The Start-Symbol
-@cindex declaring the start symbol
-@cindex start symbol, declaring
-@cindex default start symbol
-@findex %start
-
-Bison assumes by default that the start symbol for the grammar is the first
-nonterminal specified in the grammar specification section.  The programmer
-may override this restriction with the @code{%start} declaration as follows:
-
-@example
-%start @var{symbol}
-@end example
-
-@node Pure Decl
-@subsection A Pure (Reentrant) Parser
-@cindex reentrant parser
-@cindex pure parser
-@findex %pure-parser
-
-A @dfn{reentrant} program is one which does not alter in the course of
-execution; in other words, it consists entirely of @dfn{pure} (read-only)
-code.  Reentrancy is important whenever asynchronous execution is possible;
-for example, a nonreentrant program may not be safe to call from a signal
-handler.  In systems with multiple threads of control, a nonreentrant
-program must be called only within interlocks.
-
-Normally, Bison generates a parser which is not reentrant.  This is
-suitable for most uses, and it permits compatibility with Yacc.  (The
-standard Yacc interfaces are inherently nonreentrant, because they use
-statically allocated variables for communication with @code{yylex},
-including @code{yylval} and @code{yylloc}.)
-
-Alternatively, you can generate a pure, reentrant parser.  The Bison
-declaration @code{%pure-parser} says that you want the parser to be
-reentrant.  It looks like this:
-
-@example
-%pure-parser
-@end example
-
-The result is that the communication variables @code{yylval} and
-@code{yylloc} become local variables in @code{yyparse}, and a different
-calling convention is used for the lexical analyzer function
-@code{yylex}.  @xref{Pure Calling, ,Calling Conventions for Pure
-Parsers}, for the details of this.  The variable @code{yynerrs} also
-becomes local in @code{yyparse} (@pxref{Error Reporting, ,The Error
-Reporting Function @code{yyerror}}).  The convention for calling
-@code{yyparse} itself is unchanged.
-
-Whether the parser is pure has nothing to do with the grammar rules.
-You can generate either a pure parser or a nonreentrant parser from any
-valid grammar.
-
-@node Decl Summary
-@subsection Bison Declaration Summary
-@cindex Bison declaration summary
-@cindex declaration summary
-@cindex summary, Bison declaration
-
-Here is a summary of the declarations used to define a grammar:
-
-@deffn {Directive} %union
-Declare the collection of data types that semantic values may have
-(@pxref{Union Decl, ,The Collection of Value Types}).
-@end deffn
-
-@deffn {Directive} %token
-Declare a terminal symbol (token type name) with no precedence
-or associativity specified (@pxref{Token Decl, ,Token Type Names}).
-@end deffn
-
-@deffn {Directive} %right
-Declare a terminal symbol (token type name) that is right-associative
-(@pxref{Precedence Decl, ,Operator Precedence}).
-@end deffn
-
-@deffn {Directive} %left
-Declare a terminal symbol (token type name) that is left-associative
-(@pxref{Precedence Decl, ,Operator Precedence}).
-@end deffn
-
-@deffn {Directive} %nonassoc
-Declare a terminal symbol (token type name) that is nonassociative
-(@pxref{Precedence Decl, ,Operator Precedence}).
-Using it in a way that would be associative is a syntax error.
-@end deffn
-
-@ifset defaultprec
-@deffn {Directive} %default-prec
-Assign a precedence to rules lacking an explicit @code{%prec} modifier
-(@pxref{Contextual Precedence, ,Context-Dependent Precedence}).
-@end deffn
-@end ifset
-
-@deffn {Directive} %type
-Declare the type of semantic values for a nonterminal symbol
-(@pxref{Type Decl, ,Nonterminal Symbols}).
-@end deffn
-
-@deffn {Directive} %start
-Specify the grammar's start symbol (@pxref{Start Decl, ,The
-Start-Symbol}).
-@end deffn
-
-@deffn {Directive} %expect
-Declare the expected number of shift-reduce conflicts
-(@pxref{Expect Decl, ,Suppressing Conflict Warnings}).
-@end deffn
-
-
-@sp 1
-@noindent
-In order to change the behavior of @command{bison}, use the following
-directives:
-
-@deffn {Directive} %debug
-In the parser file, define the macro @code{YYDEBUG} to 1 if it is not
-already defined, so that the debugging facilities are compiled.
-@end deffn
-@xref{Tracing, ,Tracing Your Parser}.
-
-@deffn {Directive} %defines
-Write a header file containing macro definitions for the token type
-names defined in the grammar as well as a few other declarations.
-If the parser output file is named @file{@var{name}.c} then this file
-is named @file{@var{name}.h}.
-
-Unless @code{YYSTYPE} is already defined as a macro, the output header
-declares @code{YYSTYPE}.  Therefore, if you are using a @code{%union}
-(@pxref{Multiple Types, ,More Than One Value Type}) with components that
-require other definitions, or if you have defined a @code{YYSTYPE} macro
-(@pxref{Value Type, ,Data Types of Semantic Values}), you need to
-arrange for these definitions to be propagated to all modules, e.g., by
-putting them in a prerequisite header that is included both by your
-parser and by any other module that needs @code{YYSTYPE}.
-
-Unless your parser is pure, the output header declares @code{yylval}
-as an external variable.  @xref{Pure Decl, ,A Pure (Reentrant)
-Parser}.
-
-If you have also used locations, the output header declares
-@code{YYLTYPE} and @code{yylloc} using a protocol similar to that of
-@code{YYSTYPE} and @code{yylval}.  @xref{Locations, ,Tracking
-Locations}.
-
-This output file is normally essential if you wish to put the definition
-of @code{yylex} in a separate source file, because @code{yylex}
-typically needs to be able to refer to the above-mentioned declarations
-and to the token type codes.  @xref{Token Values, ,Semantic Values of
-Tokens}.
-@end deffn
-
-@deffn {Directive} %destructor
-Specify how the parser should reclaim the memory associated to
-discarded symbols.  @xref{Destructor Decl, , Freeing Discarded Symbols}.
-@end deffn
-
-@deffn {Directive} %file-prefix="@var{prefix}"
-Specify a prefix to use for all Bison output file names.  The names are
-chosen as if the input file were named @file{@var{prefix}.y}.
-@end deffn
-
-@deffn {Directive} %locations
-Generate the code processing the locations (@pxref{Action Features,
-,Special Features for Use in Actions}).  This mode is enabled as soon as
-the grammar uses the special @samp{@@@var{n}} tokens, but if your
-grammar does not use it, using @samp{%locations} allows for more
-accurate syntax error messages.
-@end deffn
-
-@deffn {Directive} %name-prefix="@var{prefix}"
-Rename the external symbols used in the parser so that they start with
-@var{prefix} instead of @samp{yy}.  The precise list of symbols renamed
-in C parsers
-is @code{yyparse}, @code{yylex}, @code{yyerror}, @code{yynerrs},
-@code{yylval}, @code{yychar}, @code{yydebug}, and
-(if locations are used) @code{yylloc}.  For example, if you use
-@samp{%name-prefix="c_"}, the names become @code{c_parse}, @code{c_lex},
-and so on.  In C++ parsers, it is only the surrounding namespace which is
-named @var{prefix} instead of @samp{yy}.
-@xref{Multiple Parsers, ,Multiple Parsers in the Same Program}.
-@end deffn
-
-@ifset defaultprec
-@deffn {Directive} %no-default-prec
-Do not assign a precedence to rules lacking an explicit @code{%prec}
-modifier (@pxref{Contextual Precedence, ,Context-Dependent
-Precedence}).
-@end deffn
-@end ifset
-
-@deffn {Directive} %no-parser
-Do not include any C code in the parser file; generate tables only.  The
-parser file contains just @code{#define} directives and static variable
-declarations.
-
-This option also tells Bison to write the C code for the grammar actions
-into a file named @file{@var{file}.act}, in the form of a
-brace-surrounded body fit for a @code{switch} statement.
-@end deffn
-
-@deffn {Directive} %no-lines
-Don't generate any @code{#line} preprocessor commands in the parser
-file.  Ordinarily Bison writes these commands in the parser file so that
-the C compiler and debuggers will associate errors and object code with
-your source file (the grammar file).  This directive causes them to
-associate errors with the parser file, treating it an independent source
-file in its own right.
-@end deffn
-
-@deffn {Directive} %output="@var{file}"
-Specify @var{file} for the parser file.
-@end deffn
-
-@deffn {Directive} %pure-parser
-Request a pure (reentrant) parser program (@pxref{Pure Decl, ,A Pure
-(Reentrant) Parser}).
-@end deffn
-
-@deffn {Directive} %require "@var{version}"
-Require version @var{version} or higher of Bison.  @xref{Require Decl, ,
-Require a Version of Bison}.
-@end deffn
-
-@deffn {Directive} %token-table
-Generate an array of token names in the parser file.  The name of the
-array is @code{yytname}; @code{yytname[@var{i}]} is the name of the
-token whose internal Bison token code number is @var{i}.  The first
-three elements of @code{yytname} correspond to the predefined tokens
-@code{"$end"},
-@code{"error"}, and @code{"$undefined"}; after these come the symbols
-defined in the grammar file.
-
-The name in the table includes all the characters needed to represent
-the token in Bison.  For single-character literals and literal
-strings, this includes the surrounding quoting characters and any
-escape sequences.  For example, the Bison single-character literal
-@code{'+'} corresponds to a three-character name, represented in C as
-@code{"'+'"}; and the Bison two-character literal string @code{"\\/"}
-corresponds to a five-character name, represented in C as
-@code{"\"\\\\/\""}.
-
-When you specify @code{%token-table}, Bison also generates macro
-definitions for macros @code{YYNTOKENS}, @code{YYNNTS}, and
-@code{YYNRULES}, and @code{YYNSTATES}:
-
-@table @code
-@item YYNTOKENS
-The highest token number, plus one.
-@item YYNNTS
-The number of nonterminal symbols.
-@item YYNRULES
-The number of grammar rules,
-@item YYNSTATES
-The number of parser states (@pxref{Parser States}).
-@end table
-@end deffn
-
-@deffn {Directive} %verbose
-Write an extra output file containing verbose descriptions of the
-parser states and what is done for each type of look-ahead token in
-that state.  @xref{Understanding, , Understanding Your Parser}, for more
-information.
-@end deffn
-
-@deffn {Directive} %yacc
-Pretend the option @option{--yacc} was given, i.e., imitate Yacc,
-including its naming conventions.  @xref{Bison Options}, for more.
-@end deffn
-
-
-@node Multiple Parsers
-@section Multiple Parsers in the Same Program
-
-Most programs that use Bison parse only one language and therefore contain
-only one Bison parser.  But what if you want to parse more than one
-language with the same program?  Then you need to avoid a name conflict
-between different definitions of @code{yyparse}, @code{yylval}, and so on.
-
-The easy way to do this is to use the option @samp{-p @var{prefix}}
-(@pxref{Invocation, ,Invoking Bison}).  This renames the interface
-functions and variables of the Bison parser to start with @var{prefix}
-instead of @samp{yy}.  You can use this to give each parser distinct
-names that do not conflict.
-
-The precise list of symbols renamed is @code{yyparse}, @code{yylex},
-@code{yyerror}, @code{yynerrs}, @code{yylval}, @code{yylloc},
-@code{yychar} and @code{yydebug}.  For example, if you use @samp{-p c},
-the names become @code{cparse}, @code{clex}, and so on.
-
-@strong{All the other variables and macros associated with Bison are not
-renamed.} These others are not global; there is no conflict if the same
-name is used in different parsers.  For example, @code{YYSTYPE} is not
-renamed, but defining this in different ways in different parsers causes
-no trouble (@pxref{Value Type, ,Data Types of Semantic Values}).
-
-The @samp{-p} option works by adding macro definitions to the beginning
-of the parser source file, defining @code{yyparse} as
-@code{@var{prefix}parse}, and so on.  This effectively substitutes one
-name for the other in the entire parser file.
-
-@node Interface
-@chapter Parser C-Language Interface
-@cindex C-language interface
-@cindex interface
-
-The Bison parser is actually a C function named @code{yyparse}.  Here we
-describe the interface conventions of @code{yyparse} and the other
-functions that it needs to use.
-
-Keep in mind that the parser uses many C identifiers starting with
-@samp{yy} and @samp{YY} for internal purposes.  If you use such an
-identifier (aside from those in this manual) in an action or in epilogue
-in the grammar file, you are likely to run into trouble.
-
-@menu
-* Parser Function::   How to call @code{yyparse} and what it returns.
-* Lexical::           You must supply a function @code{yylex}
-                        which reads tokens.
-* Error Reporting::   You must supply a function @code{yyerror}.
-* Action Features::   Special features for use in actions.
-* Internationalization::  How to let the parser speak in the user's
-                        native language.
-@end menu
-
-@node Parser Function
-@section The Parser Function @code{yyparse}
-@findex yyparse
-
-You call the function @code{yyparse} to cause parsing to occur.  This
-function reads tokens, executes actions, and ultimately returns when it
-encounters end-of-input or an unrecoverable syntax error.  You can also
-write an action which directs @code{yyparse} to return immediately
-without reading further.
-
-
-@deftypefun int yyparse (void)
-The value returned by @code{yyparse} is 0 if parsing was successful (return
-is due to end-of-input).
-
-The value is 1 if parsing failed because of invalid input, i.e., input
-that contains a syntax error or that causes @code{YYABORT} to be
-invoked.
-
-The value is 2 if parsing failed due to memory exhaustion.
-@end deftypefun
-
-In an action, you can cause immediate return from @code{yyparse} by using
-these macros:
-
-@defmac YYACCEPT
-@findex YYACCEPT
-Return immediately with value 0 (to report success).
-@end defmac
-
-@defmac YYABORT
-@findex YYABORT
-Return immediately with value 1 (to report failure).
-@end defmac
-
-If you use a reentrant parser, you can optionally pass additional
-parameter information to it in a reentrant way.  To do so, use the
-declaration @code{%parse-param}:
-
-@deffn {Directive} %parse-param @{@var{argument-declaration}@}
-@findex %parse-param
-Declare that an argument declared by the braced-code
-@var{argument-declaration} is an additional @code{yyparse} argument.
-The @var{argument-declaration} is used when declaring
-functions or prototypes.  The last identifier in
-@var{argument-declaration} must be the argument name.
-@end deffn
-
-Here's an example.  Write this in the parser:
-
-@example
-%parse-param @{int *nastiness@}
-%parse-param @{int *randomness@}
-@end example
-
-@noindent
-Then call the parser like this:
-
-@example
-@{
-  int nastiness, randomness;
-  @dots{}  /* @r{Store proper data in @code{nastiness} and @code{randomness}.}  */
-  value = yyparse (&nastiness, &randomness);
-  @dots{}
-@}
-@end example
-
-@noindent
-In the grammar actions, use expressions like this to refer to the data:
-
-@example
-exp: @dots{}    @{ @dots{}; *randomness += 1; @dots{} @}
-@end example
-
-
-@node Lexical
-@section The Lexical Analyzer Function @code{yylex}
-@findex yylex
-@cindex lexical analyzer
-
-The @dfn{lexical analyzer} function, @code{yylex}, recognizes tokens from
-the input stream and returns them to the parser.  Bison does not create
-this function automatically; you must write it so that @code{yyparse} can
-call it.  The function is sometimes referred to as a lexical scanner.
-
-In simple programs, @code{yylex} is often defined at the end of the Bison
-grammar file.  If @code{yylex} is defined in a separate source file, you
-need to arrange for the token-type macro definitions to be available there.
-To do this, use the @samp{-d} option when you run Bison, so that it will
-write these macro definitions into a separate header file
-@file{@var{name}.tab.h} which you can include in the other source files
-that need it.  @xref{Invocation, ,Invoking Bison}.
-
-@menu
-* Calling Convention::  How @code{yyparse} calls @code{yylex}.
-* Token Values::      How @code{yylex} must return the semantic value
-                        of the token it has read.
-* Token Locations::   How @code{yylex} must return the text location
-                        (line number, etc.) of the token, if the
-                        actions want that.
-* Pure Calling::      How the calling convention differs
-                        in a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}).
-@end menu
-
-@node Calling Convention
-@subsection Calling Convention for @code{yylex}
-
-The value that @code{yylex} returns must be the positive numeric code
-for the type of token it has just found; a zero or negative value
-signifies end-of-input.
-
-When a token is referred to in the grammar rules by a name, that name
-in the parser file becomes a C macro whose definition is the proper
-numeric code for that token type.  So @code{yylex} can use the name
-to indicate that type.  @xref{Symbols}.
-
-When a token is referred to in the grammar rules by a character literal,
-the numeric code for that character is also the code for the token type.
-So @code{yylex} can simply return that character code, possibly converted
-to @code{unsigned char} to avoid sign-extension.  The null character
-must not be used this way, because its code is zero and that
-signifies end-of-input.
-
-Here is an example showing these things:
-
-@example
-int
-yylex (void)
-@{
-  @dots{}
-  if (c == EOF)    /* Detect end-of-input.  */
-    return 0;
-  @dots{}
-  if (c == '+' || c == '-')
-    return c;      /* Assume token type for `+' is '+'.  */
-  @dots{}
-  return INT;      /* Return the type of the token.  */
-  @dots{}
-@}
-@end example
-
-@noindent
-This interface has been designed so that the output from the @code{lex}
-utility can be used without change as the definition of @code{yylex}.
-
-If the grammar uses literal string tokens, there are two ways that
-@code{yylex} can determine the token type codes for them:
-
-@itemize @bullet
-@item
-If the grammar defines symbolic token names as aliases for the
-literal string tokens, @code{yylex} can use these symbolic names like
-all others.  In this case, the use of the literal string tokens in
-the grammar file has no effect on @code{yylex}.
-
-@item
-@code{yylex} can find the multicharacter token in the @code{yytname}
-table.  The index of the token in the table is the token type's code.
-The name of a multicharacter token is recorded in @code{yytname} with a
-double-quote, the token's characters, and another double-quote.  The
-token's characters are escaped as necessary to be suitable as input
-to Bison.
-
-Here's code for looking up a multicharacter token in @code{yytname},
-assuming that the characters of the token are stored in
-@code{token_buffer}, and assuming that the token does not contain any
-characters like @samp{"} that require escaping.
-
-@smallexample
-for (i = 0; i < YYNTOKENS; i++)
-  @{
-    if (yytname[i] != 0
-        && yytname[i][0] == '"'
-        && ! strncmp (yytname[i] + 1, token_buffer,
-                      strlen (token_buffer))
-        && yytname[i][strlen (token_buffer) + 1] == '"'
-        && yytname[i][strlen (token_buffer) + 2] == 0)
-      break;
-  @}
-@end smallexample
-
-The @code{yytname} table is generated only if you use the
-@code{%token-table} declaration.  @xref{Decl Summary}.
-@end itemize
-
-@node Token Values
-@subsection Semantic Values of Tokens
-
-@vindex yylval
-In an ordinary (nonreentrant) parser, the semantic value of the token must
-be stored into the global variable @code{yylval}.  When you are using
-just one data type for semantic values, @code{yylval} has that type.
-Thus, if the type is @code{int} (the default), you might write this in
-@code{yylex}:
-
-@example
-@group
-  @dots{}
-  yylval = value;  /* Put value onto Bison stack.  */
-  return INT;      /* Return the type of the token.  */
-  @dots{}
-@end group
-@end example
-
-When you are using multiple data types, @code{yylval}'s type is a union
-made from the @code{%union} declaration (@pxref{Union Decl, ,The
-Collection of Value Types}).  So when you store a token's value, you
-must use the proper member of the union.  If the @code{%union}
-declaration looks like this:
-
-@example
-@group
-%union @{
-  int intval;
-  double val;
-  symrec *tptr;
-@}
-@end group
-@end example
-
-@noindent
-then the code in @code{yylex} might look like this:
-
-@example
-@group
-  @dots{}
-  yylval.intval = value; /* Put value onto Bison stack.  */
-  return INT;            /* Return the type of the token.  */
-  @dots{}
-@end group
-@end example
-
-@node Token Locations
-@subsection Textual Locations of Tokens
-
-@vindex yylloc
-If you are using the @samp{@@@var{n}}-feature (@pxref{Locations, ,
-Tracking Locations}) in actions to keep track of the textual locations
-of tokens and groupings, then you must provide this information in
-@code{yylex}.  The function @code{yyparse} expects to find the textual
-location of a token just parsed in the global variable @code{yylloc}.
-So @code{yylex} must store the proper data in that variable.
-
-By default, the value of @code{yylloc} is a structure and you need only
-initialize the members that are going to be used by the actions.  The
-four members are called @code{first_line}, @code{first_column},
-@code{last_line} and @code{last_column}.  Note that the use of this
-feature makes the parser noticeably slower.
-
-@tindex YYLTYPE
-The data type of @code{yylloc} has the name @code{YYLTYPE}.
-
-@node Pure Calling
-@subsection Calling Conventions for Pure Parsers
-
-When you use the Bison declaration @code{%pure-parser} to request a
-pure, reentrant parser, the global communication variables @code{yylval}
-and @code{yylloc} cannot be used.  (@xref{Pure Decl, ,A Pure (Reentrant)
-Parser}.)  In such parsers the two global variables are replaced by
-pointers passed as arguments to @code{yylex}.  You must declare them as
-shown here, and pass the information back by storing it through those
-pointers.
-
-@example
-int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-@{
-  @dots{}
-  *lvalp = value;  /* Put value onto Bison stack.  */
-  return INT;      /* Return the type of the token.  */
-  @dots{}
-@}
-@end example
-
-If the grammar file does not use the @samp{@@} constructs to refer to
-textual locations, then the type @code{YYLTYPE} will not be defined.  In
-this case, omit the second argument; @code{yylex} will be called with
-only one argument.
-
-
-If you wish to pass the additional parameter data to @code{yylex}, use
-@code{%lex-param} just like @code{%parse-param} (@pxref{Parser
-Function}).
-
-@deffn {Directive} lex-param @{@var{argument-declaration}@}
-@findex %lex-param
-Declare that the braced-code @var{argument-declaration} is an
-additional @code{yylex} argument declaration.
-@end deffn
-
-For instance:
-
-@example
-%parse-param @{int *nastiness@}
-%lex-param   @{int *nastiness@}
-%parse-param @{int *randomness@}
-@end example
-
-@noindent
-results in the following signature:
-
-@example
-int yylex   (int *nastiness);
-int yyparse (int *nastiness, int *randomness);
-@end example
-
-If @code{%pure-parser} is added:
-
-@example
-int yylex   (YYSTYPE *lvalp, int *nastiness);
-int yyparse (int *nastiness, int *randomness);
-@end example
-
-@noindent
-and finally, if both @code{%pure-parser} and @code{%locations} are used:
-
-@example
-int yylex   (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness);
-int yyparse (int *nastiness, int *randomness);
-@end example
-
-@node Error Reporting
-@section The Error Reporting Function @code{yyerror}
-@cindex error reporting function
-@findex yyerror
-@cindex parse error
-@cindex syntax error
-
-The Bison parser detects a @dfn{syntax error} or @dfn{parse error}
-whenever it reads a token which cannot satisfy any syntax rule.  An
-action in the grammar can also explicitly proclaim an error, using the
-macro @code{YYERROR} (@pxref{Action Features, ,Special Features for Use
-in Actions}).
-
-The Bison parser expects to report the error by calling an error
-reporting function named @code{yyerror}, which you must supply.  It is
-called by @code{yyparse} whenever a syntax error is found, and it
-receives one argument.  For a syntax error, the string is normally
-@w{@code{"syntax error"}}.
-
-@findex %error-verbose
-If you invoke the directive @code{%error-verbose} in the Bison
-declarations section (@pxref{Bison Declarations, ,The Bison Declarations
-Section}), then Bison provides a more verbose and specific error message
-string instead of just plain @w{@code{"syntax error"}}.
-
-The parser can detect one other kind of error: memory exhaustion.  This
-can happen when the input contains constructions that are very deeply
-nested.  It isn't likely you will encounter this, since the Bison
-parser normally extends its stack automatically up to a very large limit.  But
-if memory is exhausted, @code{yyparse} calls @code{yyerror} in the usual
-fashion, except that the argument string is @w{@code{"memory exhausted"}}.
-
-In some cases diagnostics like @w{@code{"syntax error"}} are
-translated automatically from English to some other language before
-they are passed to @code{yyerror}.  @xref{Internationalization}.
-
-The following definition suffices in simple programs:
-
-@example
-@group
-void
-yyerror (char const *s)
-@{
-@end group
-@group
-  fprintf (stderr, "%s\n", s);
-@}
-@end group
-@end example
-
-After @code{yyerror} returns to @code{yyparse}, the latter will attempt
-error recovery if you have written suitable error recovery grammar rules
-(@pxref{Error Recovery}).  If recovery is impossible, @code{yyparse} will
-immediately return 1.
-
-Obviously, in location tracking pure parsers, @code{yyerror} should have
-an access to the current location.
-This is indeed the case for the @acronym{GLR}
-parsers, but not for the Yacc parser, for historical reasons.  I.e., if
-@samp{%locations %pure-parser} is passed then the prototypes for
-@code{yyerror} are:
-
-@example
-void yyerror (char const *msg);                 /* Yacc parsers.  */
-void yyerror (YYLTYPE *locp, char const *msg);  /* GLR parsers.   */
-@end example
-
-If @samp{%parse-param @{int *nastiness@}} is used, then:
-
-@example
-void yyerror (int *nastiness, char const *msg);  /* Yacc parsers.  */
-void yyerror (int *nastiness, char const *msg);  /* GLR parsers.   */
-@end example
-
-Finally, @acronym{GLR} and Yacc parsers share the same @code{yyerror} calling
-convention for absolutely pure parsers, i.e., when the calling
-convention of @code{yylex} @emph{and} the calling convention of
-@code{%pure-parser} are pure.  I.e.:
-
-@example
-/* Location tracking.  */
-%locations
-/* Pure yylex.  */
-%pure-parser
-%lex-param   @{int *nastiness@}
-/* Pure yyparse.  */
-%parse-param @{int *nastiness@}
-%parse-param @{int *randomness@}
-@end example
-
-@noindent
-results in the following signatures for all the parser kinds:
-
-@example
-int yylex (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness);
-int yyparse (int *nastiness, int *randomness);
-void yyerror (YYLTYPE *locp,
-              int *nastiness, int *randomness,
-              char const *msg);
-@end example
-
-@noindent
-The prototypes are only indications of how the code produced by Bison
-uses @code{yyerror}.  Bison-generated code always ignores the returned
-value, so @code{yyerror} can return any type, including @code{void}.
-Also, @code{yyerror} can be a variadic function; that is why the
-message is always passed last.
-
-Traditionally @code{yyerror} returns an @code{int} that is always
-ignored, but this is purely for historical reasons, and @code{void} is
-preferable since it more accurately describes the return type for
-@code{yyerror}.
-
-@vindex yynerrs
-The variable @code{yynerrs} contains the number of syntax errors
-reported so far.  Normally this variable is global; but if you
-request a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser})
-then it is a local variable which only the actions can access.
-
-@node Action Features
-@section Special Features for Use in Actions
-@cindex summary, action features
-@cindex action features summary
-
-Here is a table of Bison constructs, variables and macros that
-are useful in actions.
-
-@deffn {Variable} $$
-Acts like a variable that contains the semantic value for the
-grouping made by the current rule.  @xref{Actions}.
-@end deffn
-
-@deffn {Variable} $@var{n}
-Acts like a variable that contains the semantic value for the
-@var{n}th component of the current rule.  @xref{Actions}.
-@end deffn
-
-@deffn {Variable} $<@var{typealt}>$
-Like @code{$$} but specifies alternative @var{typealt} in the union
-specified by the @code{%union} declaration.  @xref{Action Types, ,Data
-Types of Values in Actions}.
-@end deffn
-
-@deffn {Variable} $<@var{typealt}>@var{n}
-Like @code{$@var{n}} but specifies alternative @var{typealt} in the
-union specified by the @code{%union} declaration.
-@xref{Action Types, ,Data Types of Values in Actions}.
-@end deffn
-
-@deffn {Macro} YYABORT;
-Return immediately from @code{yyparse}, indicating failure.
-@xref{Parser Function, ,The Parser Function @code{yyparse}}.
-@end deffn
-
-@deffn {Macro} YYACCEPT;
-Return immediately from @code{yyparse}, indicating success.
-@xref{Parser Function, ,The Parser Function @code{yyparse}}.
-@end deffn
-
-@deffn {Macro} YYBACKUP (@var{token}, @var{value});
-@findex YYBACKUP
-Unshift a token.  This macro is allowed only for rules that reduce
-a single value, and only when there is no look-ahead token.
-It is also disallowed in @acronym{GLR} parsers.
-It installs a look-ahead token with token type @var{token} and
-semantic value @var{value}; then it discards the value that was
-going to be reduced by this rule.
-
-If the macro is used when it is not valid, such as when there is
-a look-ahead token already, then it reports a syntax error with
-a message @samp{cannot back up} and performs ordinary error
-recovery.
-
-In either case, the rest of the action is not executed.
-@end deffn
-
-@deffn {Macro} YYEMPTY
-@vindex YYEMPTY
-Value stored in @code{yychar} when there is no look-ahead token.
-@end deffn
-
-@deffn {Macro} YYEOF
-@vindex YYEOF
-Value stored in @code{yychar} when the look-ahead is the end of the input
-stream.
-@end deffn
-
-@deffn {Macro} YYERROR;
-@findex YYERROR
-Cause an immediate syntax error.  This statement initiates error
-recovery just as if the parser itself had detected an error; however, it
-does not call @code{yyerror}, and does not print any message.  If you
-want to print an error message, call @code{yyerror} explicitly before
-the @samp{YYERROR;} statement.  @xref{Error Recovery}.
-@end deffn
-
-@deffn {Macro} YYRECOVERING
-@findex YYRECOVERING
-The expression @code{YYRECOVERING ()} yields 1 when the parser
-is recovering from a syntax error, and 0 otherwise.
-@xref{Error Recovery}.
-@end deffn
-
-@deffn {Variable} yychar
-Variable containing either the look-ahead token, or @code{YYEOF} when the
-look-ahead is the end of the input stream, or @code{YYEMPTY} when no look-ahead
-has been performed so the next token is not yet known.
-Do not modify @code{yychar} in a deferred semantic action (@pxref{GLR Semantic
-Actions}).
-@xref{Look-Ahead, ,Look-Ahead Tokens}.
-@end deffn
-
-@deffn {Macro} yyclearin;
-Discard the current look-ahead token.  This is useful primarily in
-error rules.
-Do not invoke @code{yyclearin} in a deferred semantic action (@pxref{GLR
-Semantic Actions}).
-@xref{Error Recovery}.
-@end deffn
-
-@deffn {Macro} yyerrok;
-Resume generating error messages immediately for subsequent syntax
-errors.  This is useful primarily in error rules.
-@xref{Error Recovery}.
-@end deffn
-
-@deffn {Variable} yylloc
-Variable containing the look-ahead token location when @code{yychar} is not set
-to @code{YYEMPTY} or @code{YYEOF}.
-Do not modify @code{yylloc} in a deferred semantic action (@pxref{GLR Semantic
-Actions}).
-@xref{Actions and Locations, ,Actions and Locations}.
-@end deffn
-
-@deffn {Variable} yylval
-Variable containing the look-ahead token semantic value when @code{yychar} is
-not set to @code{YYEMPTY} or @code{YYEOF}.
-Do not modify @code{yylval} in a deferred semantic action (@pxref{GLR Semantic
-Actions}).
-@xref{Actions, ,Actions}.
-@end deffn
-
-@deffn {Value} @@$
-@findex @@$
-Acts like a structure variable containing information on the textual location
-of the grouping made by the current rule.  @xref{Locations, ,
-Tracking Locations}.
-
-@c Check if those paragraphs are still useful or not.
-
-@c @example
-@c struct @{
-@c   int first_line, last_line;
-@c   int first_column, last_column;
-@c @};
-@c @end example
-
-@c Thus, to get the starting line number of the third component, you would
-@c use @samp{@@3.first_line}.
-
-@c In order for the members of this structure to contain valid information,
-@c you must make @code{yylex} supply this information about each token.
-@c If you need only certain members, then @code{yylex} need only fill in
-@c those members.
-
-@c The use of this feature makes the parser noticeably slower.
-@end deffn
-
-@deffn {Value} @@@var{n}
-@findex @@@var{n}
-Acts like a structure variable containing information on the textual location
-of the @var{n}th component of the current rule.  @xref{Locations, ,
-Tracking Locations}.
-@end deffn
-
-@node Internationalization
-@section Parser Internationalization
-@cindex internationalization
-@cindex i18n
-@cindex NLS
-@cindex gettext
-@cindex bison-po
-
-A Bison-generated parser can print diagnostics, including error and
-tracing messages.  By default, they appear in English.  However, Bison
-also supports outputting diagnostics in the user's native language.  To
-make this work, the user should set the usual environment variables.
-@xref{Users, , The User's View, gettext, GNU @code{gettext} utilities}.
-For example, the shell command @samp{export LC_ALL=fr_CA.UTF-8} might
-set the user's locale to French Canadian using the @acronym{UTF}-8
-encoding.  The exact set of available locales depends on the user's
-installation.
-
-The maintainer of a package that uses a Bison-generated parser enables
-the internationalization of the parser's output through the following
-steps.  Here we assume a package that uses @acronym{GNU} Autoconf and
-@acronym{GNU} Automake.
-
-@enumerate
-@item
-@cindex bison-i18n.m4
-Into the directory containing the @acronym{GNU} Autoconf macros used
-by the package---often called @file{m4}---copy the
-@file{bison-i18n.m4} file installed by Bison under
-@samp{share/aclocal/bison-i18n.m4} in Bison's installation directory.
-For example:
-
-@example
-cp /usr/local/share/aclocal/bison-i18n.m4 m4/bison-i18n.m4
-@end example
-
-@item
-@findex BISON_I18N
-@vindex BISON_LOCALEDIR
-@vindex YYENABLE_NLS
-In the top-level @file{configure.ac}, after the @code{AM_GNU_GETTEXT}
-invocation, add an invocation of @code{BISON_I18N}.  This macro is
-defined in the file @file{bison-i18n.m4} that you copied earlier.  It
-causes @samp{configure} to find the value of the
-@code{BISON_LOCALEDIR} variable, and it defines the source-language
-symbol @code{YYENABLE_NLS} to enable translations in the
-Bison-generated parser.
-
-@item
-In the @code{main} function of your program, designate the directory
-containing Bison's runtime message catalog, through a call to
-@samp{bindtextdomain} with domain name @samp{bison-runtime}.
-For example:
-
-@example
-bindtextdomain ("bison-runtime", BISON_LOCALEDIR);
-@end example
-
-Typically this appears after any other call @code{bindtextdomain
-(PACKAGE, LOCALEDIR)} that your package already has.  Here we rely on
-@samp{BISON_LOCALEDIR} to be defined as a string through the
-@file{Makefile}.
-
-@item
-In the @file{Makefile.am} that controls the compilation of the @code{main}
-function, make @samp{BISON_LOCALEDIR} available as a C preprocessor macro,
-either in @samp{DEFS} or in @samp{AM_CPPFLAGS}.  For example:
-
-@example
-DEFS = @@DEFS@@ -DBISON_LOCALEDIR='"$(BISON_LOCALEDIR)"'
-@end example
-
-or:
-
-@example
-AM_CPPFLAGS = -DBISON_LOCALEDIR='"$(BISON_LOCALEDIR)"'
-@end example
-
-@item
-Finally, invoke the command @command{autoreconf} to generate the build
-infrastructure.
-@end enumerate
-
-
-@node Algorithm
-@chapter The Bison Parser Algorithm
-@cindex Bison parser algorithm
-@cindex algorithm of parser
-@cindex shifting
-@cindex reduction
-@cindex parser stack
-@cindex stack, parser
-
-As Bison reads tokens, it pushes them onto a stack along with their
-semantic values.  The stack is called the @dfn{parser stack}.  Pushing a
-token is traditionally called @dfn{shifting}.
-
-For example, suppose the infix calculator has read @samp{1 + 5 *}, with a
-@samp{3} to come.  The stack will have four elements, one for each token
-that was shifted.
-
-But the stack does not always have an element for each token read.  When
-the last @var{n} tokens and groupings shifted match the components of a
-grammar rule, they can be combined according to that rule.  This is called
-@dfn{reduction}.  Those tokens and groupings are replaced on the stack by a
-single grouping whose symbol is the result (left hand side) of that rule.
-Running the rule's action is part of the process of reduction, because this
-is what computes the semantic value of the resulting grouping.
-
-For example, if the infix calculator's parser stack contains this:
-
-@example
-1 + 5 * 3
-@end example
-
-@noindent
-and the next input token is a newline character, then the last three
-elements can be reduced to 15 via the rule:
-
-@example
-expr: expr '*' expr;
-@end example
-
-@noindent
-Then the stack contains just these three elements:
-
-@example
-1 + 15
-@end example
-
-@noindent
-At this point, another reduction can be made, resulting in the single value
-16.  Then the newline token can be shifted.
-
-The parser tries, by shifts and reductions, to reduce the entire input down
-to a single grouping whose symbol is the grammar's start-symbol
-(@pxref{Language and Grammar, ,Languages and Context-Free Grammars}).
-
-This kind of parser is known in the literature as a bottom-up parser.
-
-@menu
-* Look-Ahead::        Parser looks one token ahead when deciding what to do.
-* Shift/Reduce::      Conflicts: when either shifting or reduction is valid.
-* Precedence::        Operator precedence works by resolving conflicts.
-* Contextual Precedence::  When an operator's precedence depends on context.
-* Parser States::     The parser is a finite-state-machine with stack.
-* Reduce/Reduce::     When two rules are applicable in the same situation.
-* Mystery Conflicts::  Reduce/reduce conflicts that look unjustified.
-* Generalized LR Parsing::  Parsing arbitrary context-free grammars.
-* Memory Management:: What happens when memory is exhausted.  How to avoid it.
-@end menu
-
-@node Look-Ahead
-@section Look-Ahead Tokens
-@cindex look-ahead token
-
-The Bison parser does @emph{not} always reduce immediately as soon as the
-last @var{n} tokens and groupings match a rule.  This is because such a
-simple strategy is inadequate to handle most languages.  Instead, when a
-reduction is possible, the parser sometimes ``looks ahead'' at the next
-token in order to decide what to do.
-
-When a token is read, it is not immediately shifted; first it becomes the
-@dfn{look-ahead token}, which is not on the stack.  Now the parser can
-perform one or more reductions of tokens and groupings on the stack, while
-the look-ahead token remains off to the side.  When no more reductions
-should take place, the look-ahead token is shifted onto the stack.  This
-does not mean that all possible reductions have been done; depending on the
-token type of the look-ahead token, some rules may choose to delay their
-application.
-
-Here is a simple case where look-ahead is needed.  These three rules define
-expressions which contain binary addition operators and postfix unary
-factorial operators (@samp{!}), and allow parentheses for grouping.
-
-@example
-@group
-expr:     term '+' expr
-        | term
-        ;
-@end group
-
-@group
-term:     '(' expr ')'
-        | term '!'
-        | NUMBER
-        ;
-@end group
-@end example
-
-Suppose that the tokens @w{@samp{1 + 2}} have been read and shifted; what
-should be done?  If the following token is @samp{)}, then the first three
-tokens must be reduced to form an @code{expr}.  This is the only valid
-course, because shifting the @samp{)} would produce a sequence of symbols
-@w{@code{term ')'}}, and no rule allows this.
-
-If the following token is @samp{!}, then it must be shifted immediately so
-that @w{@samp{2 !}} can be reduced to make a @code{term}.  If instead the
-parser were to reduce before shifting, @w{@samp{1 + 2}} would become an
-@code{expr}.  It would then be impossible to shift the @samp{!} because
-doing so would produce on the stack the sequence of symbols @code{expr
-'!'}.  No rule allows that sequence.
-
-@vindex yychar
-@vindex yylval
-@vindex yylloc
-The look-ahead token is stored in the variable @code{yychar}.
-Its semantic value and location, if any, are stored in the variables
-@code{yylval} and @code{yylloc}.
-@xref{Action Features, ,Special Features for Use in Actions}.
-
-@node Shift/Reduce
-@section Shift/Reduce Conflicts
-@cindex conflicts
-@cindex shift/reduce conflicts
-@cindex dangling @code{else}
-@cindex @code{else}, dangling
-
-Suppose we are parsing a language which has if-then and if-then-else
-statements, with a pair of rules like this:
-
-@example
-@group
-if_stmt:
-          IF expr THEN stmt
-        | IF expr THEN stmt ELSE stmt
-        ;
-@end group
-@end example
-
-@noindent
-Here we assume that @code{IF}, @code{THEN} and @code{ELSE} are
-terminal symbols for specific keyword tokens.
-
-When the @code{ELSE} token is read and becomes the look-ahead token, the
-contents of the stack (assuming the input is valid) are just right for
-reduction by the first rule.  But it is also legitimate to shift the
-@code{ELSE}, because that would lead to eventual reduction by the second
-rule.
-
-This situation, where either a shift or a reduction would be valid, is
-called a @dfn{shift/reduce conflict}.  Bison is designed to resolve
-these conflicts by choosing to shift, unless otherwise directed by
-operator precedence declarations.  To see the reason for this, let's
-contrast it with the other alternative.
-
-Since the parser prefers to shift the @code{ELSE}, the result is to attach
-the else-clause to the innermost if-statement, making these two inputs
-equivalent:
-
-@example
-if x then if y then win (); else lose;
-
-if x then do; if y then win (); else lose; end;
-@end example
-
-But if the parser chose to reduce when possible rather than shift, the
-result would be to attach the else-clause to the outermost if-statement,
-making these two inputs equivalent:
-
-@example
-if x then if y then win (); else lose;
-
-if x then do; if y then win (); end; else lose;
-@end example
-
-The conflict exists because the grammar as written is ambiguous: either
-parsing of the simple nested if-statement is legitimate.  The established
-convention is that these ambiguities are resolved by attaching the
-else-clause to the innermost if-statement; this is what Bison accomplishes
-by choosing to shift rather than reduce.  (It would ideally be cleaner to
-write an unambiguous grammar, but that is very hard to do in this case.)
-This particular ambiguity was first encountered in the specifications of
-Algol 60 and is called the ``dangling @code{else}'' ambiguity.
-
-To avoid warnings from Bison about predictable, legitimate shift/reduce
-conflicts, use the @code{%expect @var{n}} declaration.  There will be no
-warning as long as the number of shift/reduce conflicts is exactly @var{n}.
-@xref{Expect Decl, ,Suppressing Conflict Warnings}.
-
-The definition of @code{if_stmt} above is solely to blame for the
-conflict, but the conflict does not actually appear without additional
-rules.  Here is a complete Bison input file that actually manifests the
-conflict:
-
-@example
-@group
-%token IF THEN ELSE variable
-%%
-@end group
-@group
-stmt:     expr
-        | if_stmt
-        ;
-@end group
-
-@group
-if_stmt:
-          IF expr THEN stmt
-        | IF expr THEN stmt ELSE stmt
-        ;
-@end group
-
-expr:     variable
-        ;
-@end example
-
-@node Precedence
-@section Operator Precedence
-@cindex operator precedence
-@cindex precedence of operators
-
-Another situation where shift/reduce conflicts appear is in arithmetic
-expressions.  Here shifting is not always the preferred resolution; the
-Bison declarations for operator precedence allow you to specify when to
-shift and when to reduce.
-
-@menu
-* Why Precedence::    An example showing why precedence is needed.
-* Using Precedence::  How to specify precedence in Bison grammars.
-* Precedence Examples::  How these features are used in the previous example.
-* How Precedence::    How they work.
-@end menu
-
-@node Why Precedence
-@subsection When Precedence is Needed
-
-Consider the following ambiguous grammar fragment (ambiguous because the
-input @w{@samp{1 - 2 * 3}} can be parsed in two different ways):
-
-@example
-@group
-expr:     expr '-' expr
-        | expr '*' expr
-        | expr '<' expr
-        | '(' expr ')'
-        @dots{}
-        ;
-@end group
-@end example
-
-@noindent
-Suppose the parser has seen the tokens @samp{1}, @samp{-} and @samp{2};
-should it reduce them via the rule for the subtraction operator?  It
-depends on the next token.  Of course, if the next token is @samp{)}, we
-must reduce; shifting is invalid because no single rule can reduce the
-token sequence @w{@samp{- 2 )}} or anything starting with that.  But if
-the next token is @samp{*} or @samp{<}, we have a choice: either
-shifting or reduction would allow the parse to complete, but with
-different results.
-
-To decide which one Bison should do, we must consider the results.  If
-the next operator token @var{op} is shifted, then it must be reduced
-first in order to permit another opportunity to reduce the difference.
-The result is (in effect) @w{@samp{1 - (2 @var{op} 3)}}.  On the other
-hand, if the subtraction is reduced before shifting @var{op}, the result
-is @w{@samp{(1 - 2) @var{op} 3}}.  Clearly, then, the choice of shift or
-reduce should depend on the relative precedence of the operators
-@samp{-} and @var{op}: @samp{*} should be shifted first, but not
-@samp{<}.
-
-@cindex associativity
-What about input such as @w{@samp{1 - 2 - 5}}; should this be
-@w{@samp{(1 - 2) - 5}} or should it be @w{@samp{1 - (2 - 5)}}?  For most
-operators we prefer the former, which is called @dfn{left association}.
-The latter alternative, @dfn{right association}, is desirable for
-assignment operators.  The choice of left or right association is a
-matter of whether the parser chooses to shift or reduce when the stack
-contains @w{@samp{1 - 2}} and the look-ahead token is @samp{-}: shifting
-makes right-associativity.
-
-@node Using Precedence
-@subsection Specifying Operator Precedence
-@findex %left
-@findex %right
-@findex %nonassoc
-
-Bison allows you to specify these choices with the operator precedence
-declarations @code{%left} and @code{%right}.  Each such declaration
-contains a list of tokens, which are operators whose precedence and
-associativity is being declared.  The @code{%left} declaration makes all
-those operators left-associative and the @code{%right} declaration makes
-them right-associative.  A third alternative is @code{%nonassoc}, which
-declares that it is a syntax error to find the same operator twice ``in a
-row''.
-
-The relative precedence of different operators is controlled by the
-order in which they are declared.  The first @code{%left} or
-@code{%right} declaration in the file declares the operators whose
-precedence is lowest, the next such declaration declares the operators
-whose precedence is a little higher, and so on.
-
-@node Precedence Examples
-@subsection Precedence Examples
-
-In our example, we would want the following declarations:
-
-@example
-%left '<'
-%left '-'
-%left '*'
-@end example
-
-In a more complete example, which supports other operators as well, we
-would declare them in groups of equal precedence.  For example, @code{'+'} is
-declared with @code{'-'}:
-
-@example
-%left '<' '>' '=' NE LE GE
-%left '+' '-'
-%left '*' '/'
-@end example
-
-@noindent
-(Here @code{NE} and so on stand for the operators for ``not equal''
-and so on.  We assume that these tokens are more than one character long
-and therefore are represented by names, not character literals.)
-
-@node How Precedence
-@subsection How Precedence Works
-
-The first effect of the precedence declarations is to assign precedence
-levels to the terminal symbols declared.  The second effect is to assign
-precedence levels to certain rules: each rule gets its precedence from
-the last terminal symbol mentioned in the components.  (You can also
-specify explicitly the precedence of a rule.  @xref{Contextual
-Precedence, ,Context-Dependent Precedence}.)
-
-Finally, the resolution of conflicts works by comparing the precedence
-of the rule being considered with that of the look-ahead token.  If the
-token's precedence is higher, the choice is to shift.  If the rule's
-precedence is higher, the choice is to reduce.  If they have equal
-precedence, the choice is made based on the associativity of that
-precedence level.  The verbose output file made by @samp{-v}
-(@pxref{Invocation, ,Invoking Bison}) says how each conflict was
-resolved.
-
-Not all rules and not all tokens have precedence.  If either the rule or
-the look-ahead token has no precedence, then the default is to shift.
-
-@node Contextual Precedence
-@section Context-Dependent Precedence
-@cindex context-dependent precedence
-@cindex unary operator precedence
-@cindex precedence, context-dependent
-@cindex precedence, unary operator
-@findex %prec
-
-Often the precedence of an operator depends on the context.  This sounds
-outlandish at first, but it is really very common.  For example, a minus
-sign typically has a very high precedence as a unary operator, and a
-somewhat lower precedence (lower than multiplication) as a binary operator.
-
-The Bison precedence declarations, @code{%left}, @code{%right} and
-@code{%nonassoc}, can only be used once for a given token; so a token has
-only one precedence declared in this way.  For context-dependent
-precedence, you need to use an additional mechanism: the @code{%prec}
-modifier for rules.
-
-The @code{%prec} modifier declares the precedence of a particular rule by
-specifying a terminal symbol whose precedence should be used for that rule.
-It's not necessary for that symbol to appear otherwise in the rule.  The
-modifier's syntax is:
-
-@example
-%prec @var{terminal-symbol}
-@end example
-
-@noindent
-and it is written after the components of the rule.  Its effect is to
-assign the rule the precedence of @var{terminal-symbol}, overriding
-the precedence that would be deduced for it in the ordinary way.  The
-altered rule precedence then affects how conflicts involving that rule
-are resolved (@pxref{Precedence, ,Operator Precedence}).
-
-Here is how @code{%prec} solves the problem of unary minus.  First, declare
-a precedence for a fictitious terminal symbol named @code{UMINUS}.  There
-are no tokens of this type, but the symbol serves to stand for its
-precedence:
-
-@example
-@dots{}
-%left '+' '-'
-%left '*'
-%left UMINUS
-@end example
-
-Now the precedence of @code{UMINUS} can be used in specific rules:
-
-@example
-@group
-exp:    @dots{}
-        | exp '-' exp
-        @dots{}
-        | '-' exp %prec UMINUS
-@end group
-@end example
-
-@ifset defaultprec
-If you forget to append @code{%prec UMINUS} to the rule for unary
-minus, Bison silently assumes that minus has its usual precedence.
-This kind of problem can be tricky to debug, since one typically
-discovers the mistake only by testing the code.
-
-The @code{%no-default-prec;} declaration makes it easier to discover
-this kind of problem systematically.  It causes rules that lack a
-@code{%prec} modifier to have no precedence, even if the last terminal
-symbol mentioned in their components has a declared precedence.
-
-If @code{%no-default-prec;} is in effect, you must specify @code{%prec}
-for all rules that participate in precedence conflict resolution.
-Then you will see any shift/reduce conflict until you tell Bison how
-to resolve it, either by changing your grammar or by adding an
-explicit precedence.  This will probably add declarations to the
-grammar, but it helps to protect against incorrect rule precedences.
-
-The effect of @code{%no-default-prec;} can be reversed by giving
-@code{%default-prec;}, which is the default.
-@end ifset
-
-@node Parser States
-@section Parser States
-@cindex finite-state machine
-@cindex parser state
-@cindex state (of parser)
-
-The function @code{yyparse} is implemented using a finite-state machine.
-The values pushed on the parser stack are not simply token type codes; they
-represent the entire sequence of terminal and nonterminal symbols at or
-near the top of the stack.  The current state collects all the information
-about previous input which is relevant to deciding what to do next.
-
-Each time a look-ahead token is read, the current parser state together
-with the type of look-ahead token are looked up in a table.  This table
-entry can say, ``Shift the look-ahead token.''  In this case, it also
-specifies the new parser state, which is pushed onto the top of the
-parser stack.  Or it can say, ``Reduce using rule number @var{n}.''
-This means that a certain number of tokens or groupings are taken off
-the top of the stack, and replaced by one grouping.  In other words,
-that number of states are popped from the stack, and one new state is
-pushed.
-
-There is one other alternative: the table can say that the look-ahead token
-is erroneous in the current state.  This causes error processing to begin
-(@pxref{Error Recovery}).
-
-@node Reduce/Reduce
-@section Reduce/Reduce Conflicts
-@cindex reduce/reduce conflict
-@cindex conflicts, reduce/reduce
-
-A reduce/reduce conflict occurs if there are two or more rules that apply
-to the same sequence of input.  This usually indicates a serious error
-in the grammar.
-
-For example, here is an erroneous attempt to define a sequence
-of zero or more @code{word} groupings.
-
-@example
-sequence: /* empty */
-                @{ printf ("empty sequence\n"); @}
-        | maybeword
-        | sequence word
-                @{ printf ("added word %s\n", $2); @}
-        ;
-
-maybeword: /* empty */
-                @{ printf ("empty maybeword\n"); @}
-        | word
-                @{ printf ("single word %s\n", $1); @}
-        ;
-@end example
-
-@noindent
-The error is an ambiguity: there is more than one way to parse a single
-@code{word} into a @code{sequence}.  It could be reduced to a
-@code{maybeword} and then into a @code{sequence} via the second rule.
-Alternatively, nothing-at-all could be reduced into a @code{sequence}
-via the first rule, and this could be combined with the @code{word}
-using the third rule for @code{sequence}.
-
-There is also more than one way to reduce nothing-at-all into a
-@code{sequence}.  This can be done directly via the first rule,
-or indirectly via @code{maybeword} and then the second rule.
-
-You might think that this is a distinction without a difference, because it
-does not change whether any particular input is valid or not.  But it does
-affect which actions are run.  One parsing order runs the second rule's
-action; the other runs the first rule's action and the third rule's action.
-In this example, the output of the program changes.
-
-Bison resolves a reduce/reduce conflict by choosing to use the rule that
-appears first in the grammar, but it is very risky to rely on this.  Every
-reduce/reduce conflict must be studied and usually eliminated.  Here is the
-proper way to define @code{sequence}:
-
-@example
-sequence: /* empty */
-                @{ printf ("empty sequence\n"); @}
-        | sequence word
-                @{ printf ("added word %s\n", $2); @}
-        ;
-@end example
-
-Here is another common error that yields a reduce/reduce conflict:
-
-@example
-sequence: /* empty */
-        | sequence words
-        | sequence redirects
-        ;
-
-words:    /* empty */
-        | words word
-        ;
-
-redirects:/* empty */
-        | redirects redirect
-        ;
-@end example
-
-@noindent
-The intention here is to define a sequence which can contain either
-@code{word} or @code{redirect} groupings.  The individual definitions of
-@code{sequence}, @code{words} and @code{redirects} are error-free, but the
-three together make a subtle ambiguity: even an empty input can be parsed
-in infinitely many ways!
-
-Consider: nothing-at-all could be a @code{words}.  Or it could be two
-@code{words} in a row, or three, or any number.  It could equally well be a
-@code{redirects}, or two, or any number.  Or it could be a @code{words}
-followed by three @code{redirects} and another @code{words}.  And so on.
-
-Here are two ways to correct these rules.  First, to make it a single level
-of sequence:
-
-@example
-sequence: /* empty */
-        | sequence word
-        | sequence redirect
-        ;
-@end example
-
-Second, to prevent either a @code{words} or a @code{redirects}
-from being empty:
-
-@example
-sequence: /* empty */
-        | sequence words
-        | sequence redirects
-        ;
-
-words:    word
-        | words word
-        ;
-
-redirects:redirect
-        | redirects redirect
-        ;
-@end example
-
-@node Mystery Conflicts
-@section Mysterious Reduce/Reduce Conflicts
-
-Sometimes reduce/reduce conflicts can occur that don't look warranted.
-Here is an example:
-
-@example
-@group
-%token ID
-
-%%
-def:    param_spec return_spec ','
-        ;
-param_spec:
-             type
-        |    name_list ':' type
-        ;
-@end group
-@group
-return_spec:
-             type
-        |    name ':' type
-        ;
-@end group
-@group
-type:        ID
-        ;
-@end group
-@group
-name:        ID
-        ;
-name_list:
-             name
-        |    name ',' name_list
-        ;
-@end group
-@end example
-
-It would seem that this grammar can be parsed with only a single token
-of look-ahead: when a @code{param_spec} is being read, an @code{ID} is
-a @code{name} if a comma or colon follows, or a @code{type} if another
-@code{ID} follows.  In other words, this grammar is @acronym{LR}(1).
-
-@cindex @acronym{LR}(1)
-@cindex @acronym{LALR}(1)
-However, Bison, like most parser generators, cannot actually handle all
-@acronym{LR}(1) grammars.  In this grammar, two contexts, that after
-an @code{ID}
-at the beginning of a @code{param_spec} and likewise at the beginning of
-a @code{return_spec}, are similar enough that Bison assumes they are the
-same.  They appear similar because the same set of rules would be
-active---the rule for reducing to a @code{name} and that for reducing to
-a @code{type}.  Bison is unable to determine at that stage of processing
-that the rules would require different look-ahead tokens in the two
-contexts, so it makes a single parser state for them both.  Combining
-the two contexts causes a conflict later.  In parser terminology, this
-occurrence means that the grammar is not @acronym{LALR}(1).
-
-In general, it is better to fix deficiencies than to document them.  But
-this particular deficiency is intrinsically hard to fix; parser
-generators that can handle @acronym{LR}(1) grammars are hard to write
-and tend to
-produce parsers that are very large.  In practice, Bison is more useful
-as it is now.
-
-When the problem arises, you can often fix it by identifying the two
-parser states that are being confused, and adding something to make them
-look distinct.  In the above example, adding one rule to
-@code{return_spec} as follows makes the problem go away:
-
-@example
-@group
-%token BOGUS
-@dots{}
-%%
-@dots{}
-return_spec:
-             type
-        |    name ':' type
-        /* This rule is never used.  */
-        |    ID BOGUS
-        ;
-@end group
-@end example
-
-This corrects the problem because it introduces the possibility of an
-additional active rule in the context after the @code{ID} at the beginning of
-@code{return_spec}.  This rule is not active in the corresponding context
-in a @code{param_spec}, so the two contexts receive distinct parser states.
-As long as the token @code{BOGUS} is never generated by @code{yylex},
-the added rule cannot alter the way actual input is parsed.
-
-In this particular example, there is another way to solve the problem:
-rewrite the rule for @code{return_spec} to use @code{ID} directly
-instead of via @code{name}.  This also causes the two confusing
-contexts to have different sets of active rules, because the one for
-@code{return_spec} activates the altered rule for @code{return_spec}
-rather than the one for @code{name}.
-
-@example
-param_spec:
-             type
-        |    name_list ':' type
-        ;
-return_spec:
-             type
-        |    ID ':' type
-        ;
-@end example
-
-For a more detailed exposition of @acronym{LALR}(1) parsers and parser
-generators, please see:
-Frank DeRemer and Thomas Pennello, Efficient Computation of
-@acronym{LALR}(1) Look-Ahead Sets, @cite{@acronym{ACM} Transactions on
-Programming Languages and Systems}, Vol.@: 4, No.@: 4 (October 1982),
-pp.@: 615--649 @uref{http://doi.acm.org/10.1145/69622.357187}.
-
-@node Generalized LR Parsing
-@section Generalized @acronym{LR} (@acronym{GLR}) Parsing
-@cindex @acronym{GLR} parsing
-@cindex generalized @acronym{LR} (@acronym{GLR}) parsing
-@cindex ambiguous grammars
-@cindex nondeterministic parsing
-
-Bison produces @emph{deterministic} parsers that choose uniquely
-when to reduce and which reduction to apply
-based on a summary of the preceding input and on one extra token of look-ahead.
-As a result, normal Bison handles a proper subset of the family of
-context-free languages.
-Ambiguous grammars, since they have strings with more than one possible
-sequence of reductions cannot have deterministic parsers in this sense.
-The same is true of languages that require more than one symbol of
-look-ahead, since the parser lacks the information necessary to make a
-decision at the point it must be made in a shift-reduce parser.
-Finally, as previously mentioned (@pxref{Mystery Conflicts}),
-there are languages where Bison's particular choice of how to
-summarize the input seen so far loses necessary information.
-
-When you use the @samp{%glr-parser} declaration in your grammar file,
-Bison generates a parser that uses a different algorithm, called
-Generalized @acronym{LR} (or @acronym{GLR}).  A Bison @acronym{GLR}
-parser uses the same basic
-algorithm for parsing as an ordinary Bison parser, but behaves
-differently in cases where there is a shift-reduce conflict that has not
-been resolved by precedence rules (@pxref{Precedence}) or a
-reduce-reduce conflict.  When a @acronym{GLR} parser encounters such a
-situation, it
-effectively @emph{splits} into a several parsers, one for each possible
-shift or reduction.  These parsers then proceed as usual, consuming
-tokens in lock-step.  Some of the stacks may encounter other conflicts
-and split further, with the result that instead of a sequence of states,
-a Bison @acronym{GLR} parsing stack is what is in effect a tree of states.
-
-In effect, each stack represents a guess as to what the proper parse
-is.  Additional input may indicate that a guess was wrong, in which case
-the appropriate stack silently disappears.  Otherwise, the semantics
-actions generated in each stack are saved, rather than being executed
-immediately.  When a stack disappears, its saved semantic actions never
-get executed.  When a reduction causes two stacks to become equivalent,
-their sets of semantic actions are both saved with the state that
-results from the reduction.  We say that two stacks are equivalent
-when they both represent the same sequence of states,
-and each pair of corresponding states represents a
-grammar symbol that produces the same segment of the input token
-stream.
-
-Whenever the parser makes a transition from having multiple
-states to having one, it reverts to the normal @acronym{LALR}(1) parsing
-algorithm, after resolving and executing the saved-up actions.
-At this transition, some of the states on the stack will have semantic
-values that are sets (actually multisets) of possible actions.  The
-parser tries to pick one of the actions by first finding one whose rule
-has the highest dynamic precedence, as set by the @samp{%dprec}
-declaration.  Otherwise, if the alternative actions are not ordered by
-precedence, but there the same merging function is declared for both
-rules by the @samp{%merge} declaration,
-Bison resolves and evaluates both and then calls the merge function on
-the result.  Otherwise, it reports an ambiguity.
-
-It is possible to use a data structure for the @acronym{GLR} parsing tree that
-permits the processing of any @acronym{LALR}(1) grammar in linear time (in the
-size of the input), any unambiguous (not necessarily
-@acronym{LALR}(1)) grammar in
-quadratic worst-case time, and any general (possibly ambiguous)
-context-free grammar in cubic worst-case time.  However, Bison currently
-uses a simpler data structure that requires time proportional to the
-length of the input times the maximum number of stacks required for any
-prefix of the input.  Thus, really ambiguous or nondeterministic
-grammars can require exponential time and space to process.  Such badly
-behaving examples, however, are not generally of practical interest.
-Usually, nondeterminism in a grammar is local---the parser is ``in
-doubt'' only for a few tokens at a time.  Therefore, the current data
-structure should generally be adequate.  On @acronym{LALR}(1) portions of a
-grammar, in particular, it is only slightly slower than with the default
-Bison parser.
-
-For a more detailed exposition of @acronym{GLR} parsers, please see: Elizabeth
-Scott, Adrian Johnstone and Shamsa Sadaf Hussain, Tomita-Style
-Generalised @acronym{LR} Parsers, Royal Holloway, University of
-London, Department of Computer Science, TR-00-12,
-@uref{http://www.cs.rhul.ac.uk/research/languages/publications/tomita_style_1.ps},
-(2000-12-24).
-
-@node Memory Management
-@section Memory Management, and How to Avoid Memory Exhaustion
-@cindex memory exhaustion
-@cindex memory management
-@cindex stack overflow
-@cindex parser stack overflow
-@cindex overflow of parser stack
-
-The Bison parser stack can run out of memory if too many tokens are shifted and
-not reduced.  When this happens, the parser function @code{yyparse}
-calls @code{yyerror} and then returns 2.
-
-Because Bison parsers have growing stacks, hitting the upper limit
-usually results from using a right recursion instead of a left
-recursion, @xref{Recursion, ,Recursive Rules}.
-
-@vindex YYMAXDEPTH
-By defining the macro @code{YYMAXDEPTH}, you can control how deep the
-parser stack can become before memory is exhausted.  Define the
-macro with a value that is an integer.  This value is the maximum number
-of tokens that can be shifted (and not reduced) before overflow.
-
-The stack space allowed is not necessarily allocated.  If you specify a
-large value for @code{YYMAXDEPTH}, the parser normally allocates a small
-stack at first, and then makes it bigger by stages as needed.  This
-increasing allocation happens automatically and silently.  Therefore,
-you do not need to make @code{YYMAXDEPTH} painfully small merely to save
-space for ordinary inputs that do not need much stack.
-
-However, do not allow @code{YYMAXDEPTH} to be a value so large that
-arithmetic overflow could occur when calculating the size of the stack
-space.  Also, do not allow @code{YYMAXDEPTH} to be less than
-@code{YYINITDEPTH}.
-
-@cindex default stack limit
-The default value of @code{YYMAXDEPTH}, if you do not define it, is
-10000.
-
-@vindex YYINITDEPTH
-You can control how much stack is allocated initially by defining the
-macro @code{YYINITDEPTH} to a positive integer.  For the C
-@acronym{LALR}(1) parser, this value must be a compile-time constant
-unless you are assuming C99 or some other target language or compiler
-that allows variable-length arrays.  The default is 200.
-
-Do not allow @code{YYINITDEPTH} to be greater than @code{YYMAXDEPTH}.
-
-@c FIXME: C++ output.
-Because of semantical differences between C and C++, the
-@acronym{LALR}(1) parsers in C produced by Bison cannot grow when compiled
-by C++ compilers.  In this precise case (compiling a C parser as C++) you are
-suggested to grow @code{YYINITDEPTH}.  The Bison maintainers hope to fix
-this deficiency in a future release.
-
-@node Error Recovery
-@chapter Error Recovery
-@cindex error recovery
-@cindex recovery from errors
-
-It is not usually acceptable to have a program terminate on a syntax
-error.  For example, a compiler should recover sufficiently to parse the
-rest of the input file and check it for errors; a calculator should accept
-another expression.
-
-In a simple interactive command parser where each input is one line, it may
-be sufficient to allow @code{yyparse} to return 1 on error and have the
-caller ignore the rest of the input line when that happens (and then call
-@code{yyparse} again).  But this is inadequate for a compiler, because it
-forgets all the syntactic context leading up to the error.  A syntax error
-deep within a function in the compiler input should not cause the compiler
-to treat the following line like the beginning of a source file.
-
-@findex error
-You can define how to recover from a syntax error by writing rules to
-recognize the special token @code{error}.  This is a terminal symbol that
-is always defined (you need not declare it) and reserved for error
-handling.  The Bison parser generates an @code{error} token whenever a
-syntax error happens; if you have provided a rule to recognize this token
-in the current context, the parse can continue.
-
-For example:
-
-@example
-stmnts:  /* empty string */
-        | stmnts '\n'
-        | stmnts exp '\n'
-        | stmnts error '\n'
-@end example
-
-The fourth rule in this example says that an error followed by a newline
-makes a valid addition to any @code{stmnts}.
-
-What happens if a syntax error occurs in the middle of an @code{exp}?  The
-error recovery rule, interpreted strictly, applies to the precise sequence
-of a @code{stmnts}, an @code{error} and a newline.  If an error occurs in
-the middle of an @code{exp}, there will probably be some additional tokens
-and subexpressions on the stack after the last @code{stmnts}, and there
-will be tokens to read before the next newline.  So the rule is not
-applicable in the ordinary way.
-
-But Bison can force the situation to fit the rule, by discarding part of
-the semantic context and part of the input.  First it discards states
-and objects from the stack until it gets back to a state in which the
-@code{error} token is acceptable.  (This means that the subexpressions
-already parsed are discarded, back to the last complete @code{stmnts}.)
-At this point the @code{error} token can be shifted.  Then, if the old
-look-ahead token is not acceptable to be shifted next, the parser reads
-tokens and discards them until it finds a token which is acceptable.  In
-this example, Bison reads and discards input until the next newline so
-that the fourth rule can apply.  Note that discarded symbols are
-possible sources of memory leaks, see @ref{Destructor Decl, , Freeing
-Discarded Symbols}, for a means to reclaim this memory.
-
-The choice of error rules in the grammar is a choice of strategies for
-error recovery.  A simple and useful strategy is simply to skip the rest of
-the current input line or current statement if an error is detected:
-
-@example
-stmnt: error ';'  /* On error, skip until ';' is read.  */
-@end example
-
-It is also useful to recover to the matching close-delimiter of an
-opening-delimiter that has already been parsed.  Otherwise the
-close-delimiter will probably appear to be unmatched, and generate another,
-spurious error message:
-
-@example
-primary:  '(' expr ')'
-        | '(' error ')'
-        @dots{}
-        ;
-@end example
-
-Error recovery strategies are necessarily guesses.  When they guess wrong,
-one syntax error often leads to another.  In the above example, the error
-recovery rule guesses that an error is due to bad input within one
-@code{stmnt}.  Suppose that instead a spurious semicolon is inserted in the
-middle of a valid @code{stmnt}.  After the error recovery rule recovers
-from the first error, another syntax error will be found straightaway,
-since the text following the spurious semicolon is also an invalid
-@code{stmnt}.
-
-To prevent an outpouring of error messages, the parser will output no error
-message for another syntax error that happens shortly after the first; only
-after three consecutive input tokens have been successfully shifted will
-error messages resume.
-
-Note that rules which accept the @code{error} token may have actions, just
-as any other rules can.
-
-@findex yyerrok
-You can make error messages resume immediately by using the macro
-@code{yyerrok} in an action.  If you do this in the error rule's action, no
-error messages will be suppressed.  This macro requires no arguments;
-@samp{yyerrok;} is a valid C statement.
-
-@findex yyclearin
-The previous look-ahead token is reanalyzed immediately after an error.  If
-this is unacceptable, then the macro @code{yyclearin} may be used to clear
-this token.  Write the statement @samp{yyclearin;} in the error rule's
-action.
-@xref{Action Features, ,Special Features for Use in Actions}.
-
-For example, suppose that on a syntax error, an error handling routine is
-called that advances the input stream to some point where parsing should
-once again commence.  The next symbol returned by the lexical scanner is
-probably correct.  The previous look-ahead token ought to be discarded
-with @samp{yyclearin;}.
-
-@vindex YYRECOVERING
-The expression @code{YYRECOVERING ()} yields 1 when the parser
-is recovering from a syntax error, and 0 otherwise.
-Syntax error diagnostics are suppressed while recovering from a syntax
-error.
-
-@node Context Dependency
-@chapter Handling Context Dependencies
-
-The Bison paradigm is to parse tokens first, then group them into larger
-syntactic units.  In many languages, the meaning of a token is affected by
-its context.  Although this violates the Bison paradigm, certain techniques
-(known as @dfn{kludges}) may enable you to write Bison parsers for such
-languages.
-
-@menu
-* Semantic Tokens::   Token parsing can depend on the semantic context.
-* Lexical Tie-ins::   Token parsing can depend on the syntactic context.
-* Tie-in Recovery::   Lexical tie-ins have implications for how
-                        error recovery rules must be written.
-@end menu
-
-(Actually, ``kludge'' means any technique that gets its job done but is
-neither clean nor robust.)
-
-@node Semantic Tokens
-@section Semantic Info in Token Types
-
-The C language has a context dependency: the way an identifier is used
-depends on what its current meaning is.  For example, consider this:
-
-@example
-foo (x);
-@end example
-
-This looks like a function call statement, but if @code{foo} is a typedef
-name, then this is actually a declaration of @code{x}.  How can a Bison
-parser for C decide how to parse this input?
-
-The method used in @acronym{GNU} C is to have two different token types,
-@code{IDENTIFIER} and @code{TYPENAME}.  When @code{yylex} finds an
-identifier, it looks up the current declaration of the identifier in order
-to decide which token type to return: @code{TYPENAME} if the identifier is
-declared as a typedef, @code{IDENTIFIER} otherwise.
-
-The grammar rules can then express the context dependency by the choice of
-token type to recognize.  @code{IDENTIFIER} is accepted as an expression,
-but @code{TYPENAME} is not.  @code{TYPENAME} can start a declaration, but
-@code{IDENTIFIER} cannot.  In contexts where the meaning of the identifier
-is @emph{not} significant, such as in declarations that can shadow a
-typedef name, either @code{TYPENAME} or @code{IDENTIFIER} is
-accepted---there is one rule for each of the two token types.
-
-This technique is simple to use if the decision of which kinds of
-identifiers to allow is made at a place close to where the identifier is
-parsed.  But in C this is not always so: C allows a declaration to
-redeclare a typedef name provided an explicit type has been specified
-earlier:
-
-@example
-typedef int foo, bar;
-int baz (void)
-@{
-  static bar (bar);      /* @r{redeclare @code{bar} as static variable} */
-  extern foo foo (foo);  /* @r{redeclare @code{foo} as function} */
-  return foo (bar);
-@}
-@end example
-
-Unfortunately, the name being declared is separated from the declaration
-construct itself by a complicated syntactic structure---the ``declarator''.
-
-As a result, part of the Bison parser for C needs to be duplicated, with
-all the nonterminal names changed: once for parsing a declaration in
-which a typedef name can be redefined, and once for parsing a
-declaration in which that can't be done.  Here is a part of the
-duplication, with actions omitted for brevity:
-
-@example
-initdcl:
-          declarator maybeasm '='
-          init
-        | declarator maybeasm
-        ;
-
-notype_initdcl:
-          notype_declarator maybeasm '='
-          init
-        | notype_declarator maybeasm
-        ;
-@end example
-
-@noindent
-Here @code{initdcl} can redeclare a typedef name, but @code{notype_initdcl}
-cannot.  The distinction between @code{declarator} and
-@code{notype_declarator} is the same sort of thing.
-
-There is some similarity between this technique and a lexical tie-in
-(described next), in that information which alters the lexical analysis is
-changed during parsing by other parts of the program.  The difference is
-here the information is global, and is used for other purposes in the
-program.  A true lexical tie-in has a special-purpose flag controlled by
-the syntactic context.
-
-@node Lexical Tie-ins
-@section Lexical Tie-ins
-@cindex lexical tie-in
-
-One way to handle context-dependency is the @dfn{lexical tie-in}: a flag
-which is set by Bison actions, whose purpose is to alter the way tokens are
-parsed.
-
-For example, suppose we have a language vaguely like C, but with a special
-construct @samp{hex (@var{hex-expr})}.  After the keyword @code{hex} comes
-an expression in parentheses in which all integers are hexadecimal.  In
-particular, the token @samp{a1b} must be treated as an integer rather than
-as an identifier if it appears in that context.  Here is how you can do it:
-
-@example
-@group
-%@{
-  int hexflag;
-  int yylex (void);
-  void yyerror (char const *);
-%@}
-%%
-@dots{}
-@end group
-@group
-expr:   IDENTIFIER
-        | constant
-        | HEX '('
-                @{ hexflag = 1; @}
-          expr ')'
-                @{ hexflag = 0;
-                   $$ = $4; @}
-        | expr '+' expr
-                @{ $$ = make_sum ($1, $3); @}
-        @dots{}
-        ;
-@end group
-
-@group
-constant:
-          INTEGER
-        | STRING
-        ;
-@end group
-@end example
-
-@noindent
-Here we assume that @code{yylex} looks at the value of @code{hexflag}; when
-it is nonzero, all integers are parsed in hexadecimal, and tokens starting
-with letters are parsed as integers if possible.
-
-The declaration of @code{hexflag} shown in the prologue of the parser file
-is needed to make it accessible to the actions (@pxref{Prologue, ,The Prologue}).
-You must also write the code in @code{yylex} to obey the flag.
-
-@node Tie-in Recovery
-@section Lexical Tie-ins and Error Recovery
-
-Lexical tie-ins make strict demands on any error recovery rules you have.
-@xref{Error Recovery}.
-
-The reason for this is that the purpose of an error recovery rule is to
-abort the parsing of one construct and resume in some larger construct.
-For example, in C-like languages, a typical error recovery rule is to skip
-tokens until the next semicolon, and then start a new statement, like this:
-
-@example
-stmt:   expr ';'
-        | IF '(' expr ')' stmt @{ @dots{} @}
-        @dots{}
-        error ';'
-                @{ hexflag = 0; @}
-        ;
-@end example
-
-If there is a syntax error in the middle of a @samp{hex (@var{expr})}
-construct, this error rule will apply, and then the action for the
-completed @samp{hex (@var{expr})} will never run.  So @code{hexflag} would
-remain set for the entire rest of the input, or until the next @code{hex}
-keyword, causing identifiers to be misinterpreted as integers.
-
-To avoid this problem the error recovery rule itself clears @code{hexflag}.
-
-There may also be an error recovery rule that works within expressions.
-For example, there could be a rule which applies within parentheses
-and skips to the close-parenthesis:
-
-@example
-@group
-expr:   @dots{}
-        | '(' expr ')'
-                @{ $$ = $2; @}
-        | '(' error ')'
-        @dots{}
-@end group
-@end example
-
-If this rule acts within the @code{hex} construct, it is not going to abort
-that construct (since it applies to an inner level of parentheses within
-the construct).  Therefore, it should not clear the flag: the rest of
-the @code{hex} construct should be parsed with the flag still in effect.
-
-What if there is an error recovery rule which might abort out of the
-@code{hex} construct or might not, depending on circumstances?  There is no
-way you can write the action to determine whether a @code{hex} construct is
-being aborted or not.  So if you are using a lexical tie-in, you had better
-make sure your error recovery rules are not of this kind.  Each rule must
-be such that you can be sure that it always will, or always won't, have to
-clear the flag.
-
-@c ================================================== Debugging Your Parser
-
-@node Debugging
-@chapter Debugging Your Parser
-
-Developing a parser can be a challenge, especially if you don't
-understand the algorithm (@pxref{Algorithm, ,The Bison Parser
-Algorithm}).  Even so, sometimes a detailed description of the automaton
-can help (@pxref{Understanding, , Understanding Your Parser}), or
-tracing the execution of the parser can give some insight on why it
-behaves improperly (@pxref{Tracing, , Tracing Your Parser}).
-
-@menu
-* Understanding::     Understanding the structure of your parser.
-* Tracing::           Tracing the execution of your parser.
-@end menu
-
-@node Understanding
-@section Understanding Your Parser
-
-As documented elsewhere (@pxref{Algorithm, ,The Bison Parser Algorithm})
-Bison parsers are @dfn{shift/reduce automata}.  In some cases (much more
-frequent than one would hope), looking at this automaton is required to
-tune or simply fix a parser.  Bison provides two different
-representation of it, either textually or graphically (as a @acronym{VCG}
-file).
-
-The textual file is generated when the options @option{--report} or
-@option{--verbose} are specified, see @xref{Invocation, , Invoking
-Bison}.  Its name is made by removing @samp{.tab.c} or @samp{.c} from
-the parser output file name, and adding @samp{.output} instead.
-Therefore, if the input file is @file{foo.y}, then the parser file is
-called @file{foo.tab.c} by default.  As a consequence, the verbose
-output file is called @file{foo.output}.
-
-The following grammar file, @file{calc.y}, will be used in the sequel:
-
-@example
-%token NUM STR
-%left '+' '-'
-%left '*'
-%%
-exp: exp '+' exp
-   | exp '-' exp
-   | exp '*' exp
-   | exp '/' exp
-   | NUM
-   ;
-useless: STR;
-%%
-@end example
-
-@command{bison} reports:
-
-@example
-calc.y: warning: 1 useless nonterminal and 1 useless rule
-calc.y:11.1-7: warning: useless nonterminal: useless
-calc.y:11.10-12: warning: useless rule: useless: STR
-calc.y: conflicts: 7 shift/reduce
-@end example
-
-When given @option{--report=state}, in addition to @file{calc.tab.c}, it
-creates a file @file{calc.output} with contents detailed below.  The
-order of the output and the exact presentation might vary, but the
-interpretation is the same.
-
-The first section includes details on conflicts that were solved thanks
-to precedence and/or associativity:
-
-@example
-Conflict in state 8 between rule 2 and token '+' resolved as reduce.
-Conflict in state 8 between rule 2 and token '-' resolved as reduce.
-Conflict in state 8 between rule 2 and token '*' resolved as shift.
-@exdent @dots{}
-@end example
-
-@noindent
-The next section lists states that still have conflicts.
-
-@example
-State 8 conflicts: 1 shift/reduce
-State 9 conflicts: 1 shift/reduce
-State 10 conflicts: 1 shift/reduce
-State 11 conflicts: 4 shift/reduce
-@end example
-
-@noindent
-@cindex token, useless
-@cindex useless token
-@cindex nonterminal, useless
-@cindex useless nonterminal
-@cindex rule, useless
-@cindex useless rule
-The next section reports useless tokens, nonterminal and rules.  Useless
-nonterminals and rules are removed in order to produce a smaller parser,
-but useless tokens are preserved, since they might be used by the
-scanner (note the difference between ``useless'' and ``not used''
-below):
-
-@example
-Useless nonterminals:
-   useless
-
-Terminals which are not used:
-   STR
-
-Useless rules:
-#6     useless: STR;
-@end example
-
-@noindent
-The next section reproduces the exact grammar that Bison used:
-
-@example
-Grammar
-
-  Number, Line, Rule
-    0   5 $accept -> exp $end
-    1   5 exp -> exp '+' exp
-    2   6 exp -> exp '-' exp
-    3   7 exp -> exp '*' exp
-    4   8 exp -> exp '/' exp
-    5   9 exp -> NUM
-@end example
-
-@noindent
-and reports the uses of the symbols:
-
-@example
-Terminals, with rules where they appear
-
-$end (0) 0
-'*' (42) 3
-'+' (43) 1
-'-' (45) 2
-'/' (47) 4
-error (256)
-NUM (258) 5
-
-Nonterminals, with rules where they appear
-
-$accept (8)
-    on left: 0
-exp (9)
-    on left: 1 2 3 4 5, on right: 0 1 2 3 4
-@end example
-
-@noindent
-@cindex item
-@cindex pointed rule
-@cindex rule, pointed
-Bison then proceeds onto the automaton itself, describing each state
-with it set of @dfn{items}, also known as @dfn{pointed rules}.  Each
-item is a production rule together with a point (marked by @samp{.})
-that the input cursor.
-
-@example
-state 0
-
-    $accept  ->  . exp $   (rule 0)
-
-    NUM         shift, and go to state 1
-
-    exp         go to state 2
-@end example
-
-This reads as follows: ``state 0 corresponds to being at the very
-beginning of the parsing, in the initial rule, right before the start
-symbol (here, @code{exp}).  When the parser returns to this state right
-after having reduced a rule that produced an @code{exp}, the control
-flow jumps to state 2.  If there is no such transition on a nonterminal
-symbol, and the look-ahead is a @code{NUM}, then this token is shifted on
-the parse stack, and the control flow jumps to state 1.  Any other
-look-ahead triggers a syntax error.''
-
-@cindex core, item set
-@cindex item set core
-@cindex kernel, item set
-@cindex item set core
-Even though the only active rule in state 0 seems to be rule 0, the
-report lists @code{NUM} as a look-ahead token because @code{NUM} can be
-at the beginning of any rule deriving an @code{exp}.  By default Bison
-reports the so-called @dfn{core} or @dfn{kernel} of the item set, but if
-you want to see more detail you can invoke @command{bison} with
-@option{--report=itemset} to list all the items, include those that can
-be derived:
-
-@example
-state 0
-
-    $accept  ->  . exp $   (rule 0)
-    exp  ->  . exp '+' exp   (rule 1)
-    exp  ->  . exp '-' exp   (rule 2)
-    exp  ->  . exp '*' exp   (rule 3)
-    exp  ->  . exp '/' exp   (rule 4)
-    exp  ->  . NUM   (rule 5)
-
-    NUM         shift, and go to state 1
-
-    exp         go to state 2
-@end example
-
-@noindent
-In the state 1...
-
-@example
-state 1
-
-    exp  ->  NUM .   (rule 5)
-
-    $default    reduce using rule 5 (exp)
-@end example
-
-@noindent
-the rule 5, @samp{exp: NUM;}, is completed.  Whatever the look-ahead token
-(@samp{$default}), the parser will reduce it.  If it was coming from
-state 0, then, after this reduction it will return to state 0, and will
-jump to state 2 (@samp{exp: go to state 2}).
-
-@example
-state 2
-
-    $accept  ->  exp . $   (rule 0)
-    exp  ->  exp . '+' exp   (rule 1)
-    exp  ->  exp . '-' exp   (rule 2)
-    exp  ->  exp . '*' exp   (rule 3)
-    exp  ->  exp . '/' exp   (rule 4)
-
-    $           shift, and go to state 3
-    '+'         shift, and go to state 4
-    '-'         shift, and go to state 5
-    '*'         shift, and go to state 6
-    '/'         shift, and go to state 7
-@end example
-
-@noindent
-In state 2, the automaton can only shift a symbol.  For instance,
-because of the item @samp{exp -> exp . '+' exp}, if the look-ahead if
-@samp{+}, it will be shifted on the parse stack, and the automaton
-control will jump to state 4, corresponding to the item @samp{exp -> exp
-'+' . exp}.  Since there is no default action, any other token than
-those listed above will trigger a syntax error.
-
-The state 3 is named the @dfn{final state}, or the @dfn{accepting
-state}:
-
-@example
-state 3
-
-    $accept  ->  exp $ .   (rule 0)
-
-    $default    accept
-@end example
-
-@noindent
-the initial rule is completed (the start symbol and the end
-of input were read), the parsing exits successfully.
-
-The interpretation of states 4 to 7 is straightforward, and is left to
-the reader.
-
-@example
-state 4
-
-    exp  ->  exp '+' . exp   (rule 1)
-
-    NUM         shift, and go to state 1
-
-    exp         go to state 8
-
-state 5
-
-    exp  ->  exp '-' . exp   (rule 2)
-
-    NUM         shift, and go to state 1
-
-    exp         go to state 9
-
-state 6
-
-    exp  ->  exp '*' . exp   (rule 3)
-
-    NUM         shift, and go to state 1
-
-    exp         go to state 10
-
-state 7
-
-    exp  ->  exp '/' . exp   (rule 4)
-
-    NUM         shift, and go to state 1
-
-    exp         go to state 11
-@end example
-
-As was announced in beginning of the report, @samp{State 8 conflicts:
-1 shift/reduce}:
-
-@example
-state 8
-
-    exp  ->  exp . '+' exp   (rule 1)
-    exp  ->  exp '+' exp .   (rule 1)
-    exp  ->  exp . '-' exp   (rule 2)
-    exp  ->  exp . '*' exp   (rule 3)
-    exp  ->  exp . '/' exp   (rule 4)
-
-    '*'         shift, and go to state 6
-    '/'         shift, and go to state 7
-
-    '/'         [reduce using rule 1 (exp)]
-    $default    reduce using rule 1 (exp)
-@end example
-
-Indeed, there are two actions associated to the look-ahead @samp{/}:
-either shifting (and going to state 7), or reducing rule 1.  The
-conflict means that either the grammar is ambiguous, or the parser lacks
-information to make the right decision.  Indeed the grammar is
-ambiguous, as, since we did not specify the precedence of @samp{/}, the
-sentence @samp{NUM + NUM / NUM} can be parsed as @samp{NUM + (NUM /
-NUM)}, which corresponds to shifting @samp{/}, or as @samp{(NUM + NUM) /
-NUM}, which corresponds to reducing rule 1.
-
-Because in @acronym{LALR}(1) parsing a single decision can be made, Bison
-arbitrarily chose to disable the reduction, see @ref{Shift/Reduce, ,
-Shift/Reduce Conflicts}.  Discarded actions are reported in between
-square brackets.
-
-Note that all the previous states had a single possible action: either
-shifting the next token and going to the corresponding state, or
-reducing a single rule.  In the other cases, i.e., when shifting
-@emph{and} reducing is possible or when @emph{several} reductions are
-possible, the look-ahead is required to select the action.  State 8 is
-one such state: if the look-ahead is @samp{*} or @samp{/} then the action
-is shifting, otherwise the action is reducing rule 1.  In other words,
-the first two items, corresponding to rule 1, are not eligible when the
-look-ahead token is @samp{*}, since we specified that @samp{*} has higher
-precedence than @samp{+}.  More generally, some items are eligible only
-with some set of possible look-ahead tokens.  When run with
-@option{--report=look-ahead}, Bison specifies these look-ahead tokens:
-
-@example
-state 8
-
-    exp  ->  exp . '+' exp  [$, '+', '-', '/']   (rule 1)
-    exp  ->  exp '+' exp .  [$, '+', '-', '/']   (rule 1)
-    exp  ->  exp . '-' exp   (rule 2)
-    exp  ->  exp . '*' exp   (rule 3)
-    exp  ->  exp . '/' exp   (rule 4)
-
-    '*'         shift, and go to state 6
-    '/'         shift, and go to state 7
-
-    '/'         [reduce using rule 1 (exp)]
-    $default    reduce using rule 1 (exp)
-@end example
-
-The remaining states are similar:
-
-@example
-state 9
-
-    exp  ->  exp . '+' exp   (rule 1)
-    exp  ->  exp . '-' exp   (rule 2)
-    exp  ->  exp '-' exp .   (rule 2)
-    exp  ->  exp . '*' exp   (rule 3)
-    exp  ->  exp . '/' exp   (rule 4)
-
-    '*'         shift, and go to state 6
-    '/'         shift, and go to state 7
-
-    '/'         [reduce using rule 2 (exp)]
-    $default    reduce using rule 2 (exp)
-
-state 10
-
-    exp  ->  exp . '+' exp   (rule 1)
-    exp  ->  exp . '-' exp   (rule 2)
-    exp  ->  exp . '*' exp   (rule 3)
-    exp  ->  exp '*' exp .   (rule 3)
-    exp  ->  exp . '/' exp   (rule 4)
-
-    '/'         shift, and go to state 7
-
-    '/'         [reduce using rule 3 (exp)]
-    $default    reduce using rule 3 (exp)
-
-state 11
-
-    exp  ->  exp . '+' exp   (rule 1)
-    exp  ->  exp . '-' exp   (rule 2)
-    exp  ->  exp . '*' exp   (rule 3)
-    exp  ->  exp . '/' exp   (rule 4)
-    exp  ->  exp '/' exp .   (rule 4)
-
-    '+'         shift, and go to state 4
-    '-'         shift, and go to state 5
-    '*'         shift, and go to state 6
-    '/'         shift, and go to state 7
-
-    '+'         [reduce using rule 4 (exp)]
-    '-'         [reduce using rule 4 (exp)]
-    '*'         [reduce using rule 4 (exp)]
-    '/'         [reduce using rule 4 (exp)]
-    $default    reduce using rule 4 (exp)
-@end example
-
-@noindent
-Observe that state 11 contains conflicts not only due to the lack of
-precedence of @samp{/} with respect to @samp{+}, @samp{-}, and
-@samp{*}, but also because the
-associativity of @samp{/} is not specified.
-
-
-@node Tracing
-@section Tracing Your Parser
-@findex yydebug
-@cindex debugging
-@cindex tracing the parser
-
-If a Bison grammar compiles properly but doesn't do what you want when it
-runs, the @code{yydebug} parser-trace feature can help you figure out why.
-
-There are several means to enable compilation of trace facilities:
-
-@table @asis
-@item the macro @code{YYDEBUG}
-@findex YYDEBUG
-Define the macro @code{YYDEBUG} to a nonzero value when you compile the
-parser.  This is compliant with @acronym{POSIX} Yacc.  You could use
-@samp{-DYYDEBUG=1} as a compiler option or you could put @samp{#define
-YYDEBUG 1} in the prologue of the grammar file (@pxref{Prologue, , The
-Prologue}).
-
-@item the option @option{-t}, @option{--debug}
-Use the @samp{-t} option when you run Bison (@pxref{Invocation,
-,Invoking Bison}).  This is @acronym{POSIX} compliant too.
-
-@item the directive @samp{%debug}
-@findex %debug
-Add the @code{%debug} directive (@pxref{Decl Summary, ,Bison
-Declaration Summary}).  This is a Bison extension, which will prove
-useful when Bison will output parsers for languages that don't use a
-preprocessor.  Unless @acronym{POSIX} and Yacc portability matter to
-you, this is
-the preferred solution.
-@end table
-
-We suggest that you always enable the debug option so that debugging is
-always possible.
-
-The trace facility outputs messages with macro calls of the form
-@code{YYFPRINTF (stderr, @var{format}, @var{args})} where
-@var{format} and @var{args} are the usual @code{printf} format and
-arguments.  If you define @code{YYDEBUG} to a nonzero value but do not
-define @code{YYFPRINTF}, @code{<stdio.h>} is automatically included
-and @code{YYPRINTF} is defined to @code{fprintf}.
-
-Once you have compiled the program with trace facilities, the way to
-request a trace is to store a nonzero value in the variable @code{yydebug}.
-You can do this by making the C code do it (in @code{main}, perhaps), or
-you can alter the value with a C debugger.
-
-Each step taken by the parser when @code{yydebug} is nonzero produces a
-line or two of trace information, written on @code{stderr}.  The trace
-messages tell you these things:
-
-@itemize @bullet
-@item
-Each time the parser calls @code{yylex}, what kind of token was read.
-
-@item
-Each time a token is shifted, the depth and complete contents of the
-state stack (@pxref{Parser States}).
-
-@item
-Each time a rule is reduced, which rule it is, and the complete contents
-of the state stack afterward.
-@end itemize
-
-To make sense of this information, it helps to refer to the listing file
-produced by the Bison @samp{-v} option (@pxref{Invocation, ,Invoking
-Bison}).  This file shows the meaning of each state in terms of
-positions in various rules, and also what each state will do with each
-possible input token.  As you read the successive trace messages, you
-can see that the parser is functioning according to its specification in
-the listing file.  Eventually you will arrive at the place where
-something undesirable happens, and you will see which parts of the
-grammar are to blame.
-
-The parser file is a C program and you can use C debuggers on it, but it's
-not easy to interpret what it is doing.  The parser function is a
-finite-state machine interpreter, and aside from the actions it executes
-the same code over and over.  Only the values of variables show where in
-the grammar it is working.
-
-@findex YYPRINT
-The debugging information normally gives the token type of each token
-read, but not its semantic value.  You can optionally define a macro
-named @code{YYPRINT} to provide a way to print the value.  If you define
-@code{YYPRINT}, it should take three arguments.  The parser will pass a
-standard I/O stream, the numeric code for the token type, and the token
-value (from @code{yylval}).
-
-Here is an example of @code{YYPRINT} suitable for the multi-function
-calculator (@pxref{Mfcalc Decl, ,Declarations for @code{mfcalc}}):
-
-@smallexample
-%@{
-  static void print_token_value (FILE *, int, YYSTYPE);
-  #define YYPRINT(file, type, value) print_token_value (file, type, value)
-%@}
-
-@dots{} %% @dots{} %% @dots{}
-
-static void
-print_token_value (FILE *file, int type, YYSTYPE value)
-@{
-  if (type == VAR)
-    fprintf (file, "%s", value.tptr->name);
-  else if (type == NUM)
-    fprintf (file, "%d", value.val);
-@}
-@end smallexample
-
-@c ================================================= Invoking Bison
-
-@node Invocation
-@chapter Invoking Bison
-@cindex invoking Bison
-@cindex Bison invocation
-@cindex options for invoking Bison
-
-The usual way to invoke Bison is as follows:
-
-@example
-bison @var{infile}
-@end example
-
-Here @var{infile} is the grammar file name, which usually ends in
-@samp{.y}.  The parser file's name is made by replacing the @samp{.y}
-with @samp{.tab.c} and removing any leading directory.  Thus, the
-@samp{bison foo.y} file name yields
-@file{foo.tab.c}, and the @samp{bison hack/foo.y} file name yields
-@file{foo.tab.c}.  It's also possible, in case you are writing
-C++ code instead of C in your grammar file, to name it @file{foo.ypp}
-or @file{foo.y++}.  Then, the output files will take an extension like
-the given one as input (respectively @file{foo.tab.cpp} and
-@file{foo.tab.c++}).
-This feature takes effect with all options that manipulate file names like
-@samp{-o} or @samp{-d}.
-
-For example :
-
-@example
-bison -d @var{infile.yxx}
-@end example
-@noindent
-will produce @file{infile.tab.cxx} and @file{infile.tab.hxx}, and
-
-@example
-bison -d -o @var{output.c++} @var{infile.y}
-@end example
-@noindent
-will produce @file{output.c++} and @file{outfile.h++}.
-
-For compatibility with @acronym{POSIX}, the standard Bison
-distribution also contains a shell script called @command{yacc} that
-invokes Bison with the @option{-y} option.
-
-@menu
-* Bison Options::     All the options described in detail,
-                        in alphabetical order by short options.
-* Option Cross Key::  Alphabetical list of long options.
-* Yacc Library::      Yacc-compatible @code{yylex} and @code{main}.
-@end menu
-
-@node Bison Options
-@section Bison Options
-
-Bison supports both traditional single-letter options and mnemonic long
-option names.  Long option names are indicated with @samp{--} instead of
-@samp{-}.  Abbreviations for option names are allowed as long as they
-are unique.  When a long option takes an argument, like
-@samp{--file-prefix}, connect the option name and the argument with
-@samp{=}.
-
-Here is a list of options that can be used with Bison, alphabetized by
-short option.  It is followed by a cross key alphabetized by long
-option.
-
-@c Please, keep this ordered as in `bison --help'.
-@noindent
-Operations modes:
-@table @option
-@item -h
-@itemx --help
-Print a summary of the command-line options to Bison and exit.
-
-@item -V
-@itemx --version
-Print the version number of Bison and exit.
-
-@item --print-localedir
-Print the name of the directory containing locale-dependent data.
-
-@item -y
-@itemx --yacc
-Act more like the traditional Yacc command.  This can cause
-different diagnostics to be generated, and may change behavior in
-other minor ways.  Most importantly, imitate Yacc's output
-file name conventions, so that the parser output file is called
-@file{y.tab.c}, and the other outputs are called @file{y.output} and
-@file{y.tab.h}.  Thus, the following shell script can substitute
-for Yacc, and the Bison distribution contains such a script for
-compatibility with @acronym{POSIX}:
-
-@example
-#! /bin/sh
-bison -y "$@@"
-@end example
-
-The @option{-y}/@option{--yacc} option is intended for use with
-traditional Yacc grammars.  If your grammar uses a Bison extension
-like @samp{%glr-parser}, Bison might not be Yacc-compatible even if
-this option is specified.
-
-@end table
-
-@noindent
-Tuning the parser:
-
-@table @option
-@item -S @var{file}
-@itemx --skeleton=@var{file}
-Specify the skeleton to use.  You probably don't need this option unless
-you are developing Bison.
-
-@item -t
-@itemx --debug
-In the parser file, define the macro @code{YYDEBUG} to 1 if it is not
-already defined, so that the debugging facilities are compiled.
-@xref{Tracing, ,Tracing Your Parser}.
-
-@item --locations
-Pretend that @code{%locations} was specified.  @xref{Decl Summary}.
-
-@item -p @var{prefix}
-@itemx --name-prefix=@var{prefix}
-Pretend that @code{%name-prefix="@var{prefix}"} was specified.
-@xref{Decl Summary}.
-
-@item -l
-@itemx --no-lines
-Don't put any @code{#line} preprocessor commands in the parser file.
-Ordinarily Bison puts them in the parser file so that the C compiler
-and debuggers will associate errors with your source file, the
-grammar file.  This option causes them to associate errors with the
-parser file, treating it as an independent source file in its own right.
-
-@item -n
-@itemx --no-parser
-Pretend that @code{%no-parser} was specified.  @xref{Decl Summary}.
-
-@item -k
-@itemx --token-table
-Pretend that @code{%token-table} was specified.  @xref{Decl Summary}.
-@end table
-
-@noindent
-Adjust the output:
-
-@table @option
-@item -d
-@itemx --defines
-Pretend that @code{%defines} was specified, i.e., write an extra output
-file containing macro definitions for the token type names defined in
-the grammar, as well as a few other declarations.  @xref{Decl Summary}.
-
-@item --defines=@var{defines-file}
-Same as above, but save in the file @var{defines-file}.
-
-@item -b @var{file-prefix}
-@itemx --file-prefix=@var{prefix}
-Pretend that @code{%file-prefix} was specified, i.e, specify prefix to use
-for all Bison output file names.  @xref{Decl Summary}.
-
-@item -r @var{things}
-@itemx --report=@var{things}
-Write an extra output file containing verbose description of the comma
-separated list of @var{things} among:
-
-@table @code
-@item state
-Description of the grammar, conflicts (resolved and unresolved), and
-@acronym{LALR} automaton.
-
-@item look-ahead
-Implies @code{state} and augments the description of the automaton with
-each rule's look-ahead set.
-
-@item itemset
-Implies @code{state} and augments the description of the automaton with
-the full set of items for each state, instead of its core only.
-@end table
-
-@item -v
-@itemx --verbose
-Pretend that @code{%verbose} was specified, i.e, write an extra output
-file containing verbose descriptions of the grammar and
-parser.  @xref{Decl Summary}.
-
-@item -o @var{file}
-@itemx --output=@var{file}
-Specify the @var{file} for the parser file.
-
-The other output files' names are constructed from @var{file} as
-described under the @samp{-v} and @samp{-d} options.
-
-@item -g
-Output a @acronym{VCG} definition of the @acronym{LALR}(1) grammar
-automaton computed by Bison.  If the grammar file is @file{foo.y}, the
-@acronym{VCG} output file will
-be @file{foo.vcg}.
-
-@item --graph=@var{graph-file}
-The behavior of @var{--graph} is the same than @samp{-g}.  The only
-difference is that it has an optional argument which is the name of
-the output graph file.
-@end table
-
-@node Option Cross Key
-@section Option Cross Key
-
-@c FIXME: How about putting the directives too?
-Here is a list of options, alphabetized by long option, to help you find
-the corresponding short option.
-
-@multitable {@option{--defines=@var{defines-file}}} {@option{-b @var{file-prefix}XXX}}
-@headitem Long Option @tab Short Option
-@item @option{--debug}                      @tab @option{-t}
-@item @option{--defines=@var{defines-file}} @tab @option{-d}
-@item @option{--file-prefix=@var{prefix}}   @tab @option{-b @var{file-prefix}}
-@item @option{--graph=@var{graph-file}}     @tab @option{-d}
-@item @option{--help}                       @tab @option{-h}
-@item @option{--name-prefix=@var{prefix}}   @tab @option{-p @var{name-prefix}}
-@item @option{--no-lines}                   @tab @option{-l}
-@item @option{--no-parser}                  @tab @option{-n}
-@item @option{--output=@var{outfile}}       @tab @option{-o @var{outfile}}
-@item @option{--print-localedir}            @tab
-@item @option{--token-table}                @tab @option{-k}
-@item @option{--verbose}                    @tab @option{-v}
-@item @option{--version}                    @tab @option{-V}
-@item @option{--yacc}                       @tab @option{-y}
-@end multitable
-
-@node Yacc Library
-@section Yacc Library
-
-The Yacc library contains default implementations of the
-@code{yyerror} and @code{main} functions.  These default
-implementations are normally not useful, but @acronym{POSIX} requires
-them.  To use the Yacc library, link your program with the
-@option{-ly} option.  Note that Bison's implementation of the Yacc
-library is distributed under the terms of the @acronym{GNU} General
-Public License (@pxref{Copying}).
-
-If you use the Yacc library's @code{yyerror} function, you should
-declare @code{yyerror} as follows:
-
-@example
-int yyerror (char const *);
-@end example
-
-Bison ignores the @code{int} value returned by this @code{yyerror}.
-If you use the Yacc library's @code{main} function, your
-@code{yyparse} function should have the following type signature:
-
-@example
-int yyparse (void);
-@end example
-
-@c ================================================= C++ Bison
-
-@node C++ Language Interface
-@chapter C++ Language Interface
-
-@menu
-* C++ Parsers::                 The interface to generate C++ parser classes
-* A Complete C++ Example::      Demonstrating their use
-@end menu
-
-@node C++ Parsers
-@section C++ Parsers
-
-@menu
-* C++ Bison Interface::         Asking for C++ parser generation
-* C++ Semantic Values::         %union vs. C++
-* C++ Location Values::         The position and location classes
-* C++ Parser Interface::        Instantiating and running the parser
-* C++ Scanner Interface::       Exchanges between yylex and parse
-@end menu
-
-@node C++ Bison Interface
-@subsection C++ Bison Interface
-@c - %skeleton "lalr1.cc"
-@c - Always pure
-@c - initial action
-
-The C++ parser @acronym{LALR}(1) skeleton is named @file{lalr1.cc}.  To
-select it, you may either pass the option @option{--skeleton=lalr1.cc}
-to Bison, or include the directive @samp{%skeleton "lalr1.cc"} in the
-grammar preamble.  When run, @command{bison} will create several
-entities in the @samp{yy} namespace.  Use the @samp{%name-prefix}
-directive to change the namespace name, see @ref{Decl Summary}.  The
-various classes are generated in the following files:
-
-@table @file
-@item position.hh
-@itemx location.hh
-The definition of the classes @code{position} and @code{location},
-used for location tracking.  @xref{C++ Location Values}.
-
-@item stack.hh
-An auxiliary class @code{stack} used by the parser.
-
-@item @var{file}.hh
-@itemx @var{file}.cc
-(Assuming the extension of the input file was @samp{.yy}.)  The
-declaration and implementation of the C++ parser class.  The basename
-and extension of these two files follow the same rules as with regular C
-parsers (@pxref{Invocation}).
-
-The header is @emph{mandatory}; you must either pass
-@option{-d}/@option{--defines} to @command{bison}, or use the
-@samp{%defines} directive.
-@end table
-
-All these files are documented using Doxygen; run @command{doxygen}
-for a complete and accurate documentation.
-
-@node C++ Semantic Values
-@subsection C++ Semantic Values
-@c - No objects in unions
-@c - YSTYPE
-@c - Printer and destructor
-
-The @code{%union} directive works as for C, see @ref{Union Decl, ,The
-Collection of Value Types}.  In particular it produces a genuine
-@code{union}@footnote{In the future techniques to allow complex types
-within pseudo-unions (similar to Boost variants) might be implemented to
-alleviate these issues.}, which have a few specific features in C++.
-@itemize @minus
-@item
-The type @code{YYSTYPE} is defined but its use is discouraged: rather
-you should refer to the parser's encapsulated type
-@code{yy::parser::semantic_type}.
-@item
-Non POD (Plain Old Data) types cannot be used.  C++ forbids any
-instance of classes with constructors in unions: only @emph{pointers}
-to such objects are allowed.
-@end itemize
-
-Because objects have to be stored via pointers, memory is not
-reclaimed automatically: using the @code{%destructor} directive is the
-only means to avoid leaks.  @xref{Destructor Decl, , Freeing Discarded
-Symbols}.
-
-
-@node C++ Location Values
-@subsection C++ Location Values
-@c - %locations
-@c - class Position
-@c - class Location
-@c - %define "filename_type" "const symbol::Symbol"
-
-When the directive @code{%locations} is used, the C++ parser supports
-location tracking, see @ref{Locations, , Locations Overview}.  Two
-auxiliary classes define a @code{position}, a single point in a file,
-and a @code{location}, a range composed of a pair of
-@code{position}s (possibly spanning several files).
-
-@deftypemethod {position} {std::string*} file
-The name of the file.  It will always be handled as a pointer, the
-parser will never duplicate nor deallocate it.  As an experimental
-feature you may change it to @samp{@var{type}*} using @samp{%define
-"filename_type" "@var{type}"}.
-@end deftypemethod
-
-@deftypemethod {position} {unsigned int} line
-The line, starting at 1.
-@end deftypemethod
-
-@deftypemethod {position} {unsigned int} lines (int @var{height} = 1)
-Advance by @var{height} lines, resetting the column number.
-@end deftypemethod
-
-@deftypemethod {position} {unsigned int} column
-The column, starting at 0.
-@end deftypemethod
-
-@deftypemethod {position} {unsigned int} columns (int @var{width} = 1)
-Advance by @var{width} columns, without changing the line number.
-@end deftypemethod
-
-@deftypemethod {position} {position&} operator+= (position& @var{pos}, int @var{width})
-@deftypemethodx {position} {position} operator+ (const position& @var{pos}, int @var{width})
-@deftypemethodx {position} {position&} operator-= (const position& @var{pos}, int @var{width})
-@deftypemethodx {position} {position} operator- (position& @var{pos}, int @var{width})
-Various forms of syntactic sugar for @code{columns}.
-@end deftypemethod
-
-@deftypemethod {position} {position} operator<< (std::ostream @var{o}, const position& @var{p})
-Report @var{p} on @var{o} like this:
-@samp{@var{file}:@var{line}.@var{column}}, or
-@samp{@var{line}.@var{column}} if @var{file} is null.
-@end deftypemethod
-
-@deftypemethod {location} {position} begin
-@deftypemethodx {location} {position} end
-The first, inclusive, position of the range, and the first beyond.
-@end deftypemethod
-
-@deftypemethod {location} {unsigned int} columns (int @var{width} = 1)
-@deftypemethodx {location} {unsigned int} lines (int @var{height} = 1)
-Advance the @code{end} position.
-@end deftypemethod
-
-@deftypemethod {location} {location} operator+ (const location& @var{begin}, const location& @var{end})
-@deftypemethodx {location} {location} operator+ (const location& @var{begin}, int @var{width})
-@deftypemethodx {location} {location} operator+= (const location& @var{loc}, int @var{width})
-Various forms of syntactic sugar.
-@end deftypemethod
-
-@deftypemethod {location} {void} step ()
-Move @code{begin} onto @code{end}.
-@end deftypemethod
-
-
-@node C++ Parser Interface
-@subsection C++ Parser Interface
-@c - define parser_class_name
-@c - Ctor
-@c - parse, error, set_debug_level, debug_level, set_debug_stream,
-@c   debug_stream.
-@c - Reporting errors
-
-The output files @file{@var{output}.hh} and @file{@var{output}.cc}
-declare and define the parser class in the namespace @code{yy}.  The
-class name defaults to @code{parser}, but may be changed using
-@samp{%define "parser_class_name" "@var{name}"}.  The interface of
-this class is detailed below.  It can be extended using the
-@code{%parse-param} feature: its semantics is slightly changed since
-it describes an additional member of the parser class, and an
-additional argument for its constructor.
-
-@defcv {Type} {parser} {semantic_value_type}
-@defcvx {Type} {parser} {location_value_type}
-The types for semantics value and locations.
-@end defcv
-
-@deftypemethod {parser} {} parser (@var{type1} @var{arg1}, ...)
-Build a new parser object.  There are no arguments by default, unless
-@samp{%parse-param @{@var{type1} @var{arg1}@}} was used.
-@end deftypemethod
-
-@deftypemethod {parser} {int} parse ()
-Run the syntactic analysis, and return 0 on success, 1 otherwise.
-@end deftypemethod
-
-@deftypemethod {parser} {std::ostream&} debug_stream ()
-@deftypemethodx {parser} {void} set_debug_stream (std::ostream& @var{o})
-Get or set the stream used for tracing the parsing.  It defaults to
-@code{std::cerr}.
-@end deftypemethod
-
-@deftypemethod {parser} {debug_level_type} debug_level ()
-@deftypemethodx {parser} {void} set_debug_level (debug_level @var{l})
-Get or set the tracing level.  Currently its value is either 0, no trace,
-or nonzero, full tracing.
-@end deftypemethod
-
-@deftypemethod {parser} {void} error (const location_type& @var{l}, const std::string& @var{m})
-The definition for this member function must be supplied by the user:
-the parser uses it to report a parser error occurring at @var{l},
-described by @var{m}.
-@end deftypemethod
-
-
-@node C++ Scanner Interface
-@subsection C++ Scanner Interface
-@c - prefix for yylex.
-@c - Pure interface to yylex
-@c - %lex-param
-
-The parser invokes the scanner by calling @code{yylex}.  Contrary to C
-parsers, C++ parsers are always pure: there is no point in using the
-@code{%pure-parser} directive.  Therefore the interface is as follows.
-
-@deftypemethod {parser} {int} yylex (semantic_value_type& @var{yylval}, location_type& @var{yylloc}, @var{type1} @var{arg1}, ...)
-Return the next token.  Its type is the return value, its semantic
-value and location being @var{yylval} and @var{yylloc}.  Invocations of
-@samp{%lex-param @{@var{type1} @var{arg1}@}} yield additional arguments.
-@end deftypemethod
-
-
-@node A Complete C++ Example
-@section A Complete C++ Example
-
-This section demonstrates the use of a C++ parser with a simple but
-complete example.  This example should be available on your system,
-ready to compile, in the directory @dfn{../bison/examples/calc++}.  It
-focuses on the use of Bison, therefore the design of the various C++
-classes is very naive: no accessors, no encapsulation of members etc.
-We will use a Lex scanner, and more precisely, a Flex scanner, to
-demonstrate the various interaction.  A hand written scanner is
-actually easier to interface with.
-
-@menu
-* Calc++ --- C++ Calculator::   The specifications
-* Calc++ Parsing Driver::       An active parsing context
-* Calc++ Parser::               A parser class
-* Calc++ Scanner::              A pure C++ Flex scanner
-* Calc++ Top Level::            Conducting the band
-@end menu
-
-@node Calc++ --- C++ Calculator
-@subsection Calc++ --- C++ Calculator
-
-Of course the grammar is dedicated to arithmetics, a single
-expression, possibly preceded by variable assignments.  An
-environment containing possibly predefined variables such as
-@code{one} and @code{two}, is exchanged with the parser.  An example
-of valid input follows.
-
-@example
-three := 3
-seven := one + two * three
-seven * seven
-@end example
-
-@node Calc++ Parsing Driver
-@subsection Calc++ Parsing Driver
-@c - An env
-@c - A place to store error messages
-@c - A place for the result
-
-To support a pure interface with the parser (and the scanner) the
-technique of the ``parsing context'' is convenient: a structure
-containing all the data to exchange.  Since, in addition to simply
-launch the parsing, there are several auxiliary tasks to execute (open
-the file for parsing, instantiate the parser etc.), we recommend
-transforming the simple parsing context structure into a fully blown
-@dfn{parsing driver} class.
-
-The declaration of this driver class, @file{calc++-driver.hh}, is as
-follows.  The first part includes the CPP guard and imports the
-required standard library components, and the declaration of the parser
-class.
-
-@comment file: calc++-driver.hh
-@example
-#ifndef CALCXX_DRIVER_HH
-# define CALCXX_DRIVER_HH
-# include <string>
-# include <map>
-# include "calc++-parser.hh"
-@end example
-
-
-@noindent
-Then comes the declaration of the scanning function.  Flex expects
-the signature of @code{yylex} to be defined in the macro
-@code{YY_DECL}, and the C++ parser expects it to be declared.  We can
-factor both as follows.
-
-@comment file: calc++-driver.hh
-@example
-// Announce to Flex the prototype we want for lexing function, ...
-# define YY_DECL					\
-  yy::calcxx_parser::token_type                         \
-  yylex (yy::calcxx_parser::semantic_type* yylval,      \
-         yy::calcxx_parser::location_type* yylloc,      \
-         calcxx_driver& driver)
-// ... and declare it for the parser's sake.
-YY_DECL;
-@end example
-
-@noindent
-The @code{calcxx_driver} class is then declared with its most obvious
-members.
-
-@comment file: calc++-driver.hh
-@example
-// Conducting the whole scanning and parsing of Calc++.
-class calcxx_driver
-@{
-public:
-  calcxx_driver ();
-  virtual ~calcxx_driver ();
-
-  std::map<std::string, int> variables;
-
-  int result;
-@end example
-
-@noindent
-To encapsulate the coordination with the Flex scanner, it is useful to
-have two members function to open and close the scanning phase.
-members.
-
-@comment file: calc++-driver.hh
-@example
-  // Handling the scanner.
-  void scan_begin ();
-  void scan_end ();
-  bool trace_scanning;
-@end example
-
-@noindent
-Similarly for the parser itself.
-
-@comment file: calc++-driver.hh
-@example
-  // Handling the parser.
-  void parse (const std::string& f);
-  std::string file;
-  bool trace_parsing;
-@end example
-
-@noindent
-To demonstrate pure handling of parse errors, instead of simply
-dumping them on the standard error output, we will pass them to the
-compiler driver using the following two member functions.  Finally, we
-close the class declaration and CPP guard.
-
-@comment file: calc++-driver.hh
-@example
-  // Error handling.
-  void error (const yy::location& l, const std::string& m);
-  void error (const std::string& m);
-@};
-#endif // ! CALCXX_DRIVER_HH
-@end example
-
-The implementation of the driver is straightforward.  The @code{parse}
-member function deserves some attention.  The @code{error} functions
-are simple stubs, they should actually register the located error
-messages and set error state.
-
-@comment file: calc++-driver.cc
-@example
-#include "calc++-driver.hh"
-#include "calc++-parser.hh"
-
-calcxx_driver::calcxx_driver ()
-  : trace_scanning (false), trace_parsing (false)
-@{
-  variables["one"] = 1;
-  variables["two"] = 2;
-@}
-
-calcxx_driver::~calcxx_driver ()
-@{
-@}
-
-void
-calcxx_driver::parse (const std::string &f)
-@{
-  file = f;
-  scan_begin ();
-  yy::calcxx_parser parser (*this);
-  parser.set_debug_level (trace_parsing);
-  parser.parse ();
-  scan_end ();
-@}
-
-void
-calcxx_driver::error (const yy::location& l, const std::string& m)
-@{
-  std::cerr << l << ": " << m << std::endl;
-@}
-
-void
-calcxx_driver::error (const std::string& m)
-@{
-  std::cerr << m << std::endl;
-@}
-@end example
-
-@node Calc++ Parser
-@subsection Calc++ Parser
-
-The parser definition file @file{calc++-parser.yy} starts by asking for
-the C++ LALR(1) skeleton, the creation of the parser header file, and
-specifies the name of the parser class.  Because the C++ skeleton
-changed several times, it is safer to require the version you designed
-the grammar for.
-
-@comment file: calc++-parser.yy
-@example
-%skeleton "lalr1.cc"                          /*  -*- C++ -*- */
-%require "2.1a"
-%defines
-%define "parser_class_name" "calcxx_parser"
-@end example
-
-@noindent
-Then come the declarations/inclusions needed to define the
-@code{%union}.  Because the parser uses the parsing driver and
-reciprocally, both cannot include the header of the other.  Because the
-driver's header needs detailed knowledge about the parser class (in
-particular its inner types), it is the parser's header which will simply
-use a forward declaration of the driver.
-
-@comment file: calc++-parser.yy
-@example
-%@{
-# include <string>
-class calcxx_driver;
-%@}
-@end example
-
-@noindent
-The driver is passed by reference to the parser and to the scanner.
-This provides a simple but effective pure interface, not relying on
-global variables.
-
-@comment file: calc++-parser.yy
-@example
-// The parsing context.
-%parse-param @{ calcxx_driver& driver @}
-%lex-param   @{ calcxx_driver& driver @}
-@end example
-
-@noindent
-Then we request the location tracking feature, and initialize the
-first location's file name.  Afterwards new locations are computed
-relatively to the previous locations: the file name will be
-automatically propagated.
-
-@comment file: calc++-parser.yy
-@example
-%locations
-%initial-action
-@{
-  // Initialize the initial location.
-  @@$.begin.filename = @@$.end.filename = &driver.file;
-@};
-@end example
-
-@noindent
-Use the two following directives to enable parser tracing and verbose
-error messages.
-
-@comment file: calc++-parser.yy
-@example
-%debug
-%error-verbose
-@end example
-
-@noindent
-Semantic values cannot use ``real'' objects, but only pointers to
-them.
-
-@comment file: calc++-parser.yy
-@example
-// Symbols.
-%union
-@{
-  int          ival;
-  std::string *sval;
-@};
-@end example
-
-@noindent
-The code between @samp{%@{} and @samp{%@}} after the introduction of the
-@samp{%union} is output in the @file{*.cc} file; it needs detailed
-knowledge about the driver.
-
-@comment file: calc++-parser.yy
-@example
-%@{
-# include "calc++-driver.hh"
-%@}
-@end example
-
-
-@noindent
-The token numbered as 0 corresponds to end of file; the following line
-allows for nicer error messages referring to ``end of file'' instead
-of ``$end''.  Similarly user friendly named are provided for each
-symbol.  Note that the tokens names are prefixed by @code{TOKEN_} to
-avoid name clashes.
-
-@comment file: calc++-parser.yy
-@example
-%token        END      0 "end of file"
-%token        ASSIGN     ":="
-%token <sval> IDENTIFIER "identifier"
-%token <ival> NUMBER     "number"
-%type  <ival> exp        "expression"
-@end example
-
-@noindent
-To enable memory deallocation during error recovery, use
-@code{%destructor}.
-
-@c FIXME: Document %printer, and mention that it takes a braced-code operand.
-@comment file: calc++-parser.yy
-@example
-%printer    @{ debug_stream () << *$$; @} "identifier"
-%destructor @{ delete $$; @} "identifier"
-
-%printer    @{ debug_stream () << $$; @} "number" "expression"
-@end example
-
-@noindent
-The grammar itself is straightforward.
-
-@comment file: calc++-parser.yy
-@example
-%%
-%start unit;
-unit: assignments exp  @{ driver.result = $2; @};
-
-assignments: assignments assignment @{@}
-           | /* Nothing.  */        @{@};
-
-assignment: "identifier" ":=" exp @{ driver.variables[*$1] = $3; @};
-
-%left '+' '-';
-%left '*' '/';
-exp: exp '+' exp   @{ $$ = $1 + $3; @}
-   | exp '-' exp   @{ $$ = $1 - $3; @}
-   | exp '*' exp   @{ $$ = $1 * $3; @}
-   | exp '/' exp   @{ $$ = $1 / $3; @}
-   | "identifier"  @{ $$ = driver.variables[*$1]; @}
-   | "number"      @{ $$ = $1; @};
-%%
-@end example
-
-@noindent
-Finally the @code{error} member function registers the errors to the
-driver.
-
-@comment file: calc++-parser.yy
-@example
-void
-yy::calcxx_parser::error (const yy::calcxx_parser::location_type& l,
-                          const std::string& m)
-@{
-  driver.error (l, m);
-@}
-@end example
-
-@node Calc++ Scanner
-@subsection Calc++ Scanner
-
-The Flex scanner first includes the driver declaration, then the
-parser's to get the set of defined tokens.
-
-@comment file: calc++-scanner.ll
-@example
-%@{                                            /* -*- C++ -*- */
-# include <cstdlib>
-# include <errno.h>
-# include <limits.h>
-# include <string>
-# include "calc++-driver.hh"
-# include "calc++-parser.hh"
-
-/* Work around an incompatibility in flex (at least versions
-   2.5.31 through 2.5.33): it generates code that does
-   not conform to C89.  See Debian bug 333231
-   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
-# undef yywrap
-# define yywrap() 1
-
-/* By default yylex returns int, we use token_type.
-   Unfortunately yyterminate by default returns 0, which is
-   not of token_type.  */
-#define yyterminate() return token::END
-%@}
-@end example
-
-@noindent
-Because there is no @code{#include}-like feature we don't need
-@code{yywrap}, we don't need @code{unput} either, and we parse an
-actual file, this is not an interactive session with the user.
-Finally we enable the scanner tracing features.
-
-@comment file: calc++-scanner.ll
-@example
-%option noyywrap nounput batch debug
-@end example
-
-@noindent
-Abbreviations allow for more readable rules.
-
-@comment file: calc++-scanner.ll
-@example
-id    [a-zA-Z][a-zA-Z_0-9]*
-int   [0-9]+
-blank [ \t]
-@end example
-
-@noindent
-The following paragraph suffices to track locations accurately.  Each
-time @code{yylex} is invoked, the begin position is moved onto the end
-position.  Then when a pattern is matched, the end position is
-advanced of its width.  In case it matched ends of lines, the end
-cursor is adjusted, and each time blanks are matched, the begin cursor
-is moved onto the end cursor to effectively ignore the blanks
-preceding tokens.  Comments would be treated equally.
-
-@comment file: calc++-scanner.ll
-@example
-%@{
-# define YY_USER_ACTION  yylloc->columns (yyleng);
-%@}
-%%
-%@{
-  yylloc->step ();
-%@}
-@{blank@}+   yylloc->step ();
-[\n]+      yylloc->lines (yyleng); yylloc->step ();
-@end example
-
-@noindent
-The rules are simple, just note the use of the driver to report errors.
-It is convenient to use a typedef to shorten
-@code{yy::calcxx_parser::token::identifier} into
-@code{token::identifier} for instance.
-
-@comment file: calc++-scanner.ll
-@example
-%@{
-  typedef yy::calcxx_parser::token token;
-%@}
-           /* Convert ints to the actual type of tokens.  */
-[-+*/]     return yy::calcxx_parser::token_type (yytext[0]);
-":="       return token::ASSIGN;
-@{int@}      @{
-  errno = 0;
-  long n = strtol (yytext, NULL, 10);
-  if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
-    driver.error (*yylloc, "integer is out of range");
-  yylval->ival = n;
-  return token::NUMBER;
-@}
-@{id@}       yylval->sval = new std::string (yytext); return token::IDENTIFIER;
-.          driver.error (*yylloc, "invalid character");
-%%
-@end example
-
-@noindent
-Finally, because the scanner related driver's member function depend
-on the scanner's data, it is simpler to implement them in this file.
-
-@comment file: calc++-scanner.ll
-@example
-void
-calcxx_driver::scan_begin ()
-@{
-  yy_flex_debug = trace_scanning;
-  if (!(yyin = fopen (file.c_str (), "r")))
-    error (std::string ("cannot open ") + file);
-@}
-
-void
-calcxx_driver::scan_end ()
-@{
-  fclose (yyin);
-@}
-@end example
-
-@node Calc++ Top Level
-@subsection Calc++ Top Level
-
-The top level file, @file{calc++.cc}, poses no problem.
-
-@comment file: calc++.cc
-@example
-#include <iostream>
-#include "calc++-driver.hh"
-
-int
-main (int argc, char *argv[])
-@{
-  calcxx_driver driver;
-  for (++argv; argv[0]; ++argv)
-    if (*argv == std::string ("-p"))
-      driver.trace_parsing = true;
-    else if (*argv == std::string ("-s"))
-      driver.trace_scanning = true;
-    else
-      @{
-	driver.parse (*argv);
-	std::cout << driver.result << std::endl;
-      @}
-@}
-@end example
-
-@c ================================================= FAQ
-
-@node FAQ
-@chapter Frequently Asked Questions
-@cindex frequently asked questions
-@cindex questions
-
-Several questions about Bison come up occasionally.  Here some of them
-are addressed.
-
-@menu
-* Memory Exhausted::            Breaking the Stack Limits
-* How Can I Reset the Parser::  @code{yyparse} Keeps some State
-* Strings are Destroyed::       @code{yylval} Loses Track of Strings
-* Implementing Gotos/Loops::    Control Flow in the Calculator
-* Multiple start-symbols::      Factoring closely related grammars
-* Secure?  Conform?::           Is Bison @acronym{POSIX} safe?
-* I can't build Bison::         Troubleshooting
-* Where can I find help?::      Troubleshouting
-* Bug Reports::                 Troublereporting
-* Other Languages::             Parsers in Java and others
-* Beta Testing::                Experimenting development versions
-* Mailing Lists::               Meeting other Bison users
-@end menu
-
-@node Memory Exhausted
-@section Memory Exhausted
-
-@display
-My parser returns with error with a @samp{memory exhausted}
-message.  What can I do?
-@end display
-
-This question is already addressed elsewhere, @xref{Recursion,
-,Recursive Rules}.
-
-@node How Can I Reset the Parser
-@section How Can I Reset the Parser
-
-The following phenomenon has several symptoms, resulting in the
-following typical questions:
-
-@display
-I invoke @code{yyparse} several times, and on correct input it works
-properly; but when a parse error is found, all the other calls fail
-too.  How can I reset the error flag of @code{yyparse}?
-@end display
-
-@noindent
-or
-
-@display
-My parser includes support for an @samp{#include}-like feature, in
-which case I run @code{yyparse} from @code{yyparse}.  This fails
-although I did specify I needed a @code{%pure-parser}.
-@end display
-
-These problems typically come not from Bison itself, but from
-Lex-generated scanners.  Because these scanners use large buffers for
-speed, they might not notice a change of input file.  As a
-demonstration, consider the following source file,
-@file{first-line.l}:
-
-@verbatim
-%{
-#include <stdio.h>
-#include <stdlib.h>
-%}
-%%
-.*\n    ECHO; return 1;
-%%
-int
-yyparse (char const *file)
-{
-  yyin = fopen (file, "r");
-  if (!yyin)
-    exit (2);
-  /* One token only.  */
-  yylex ();
-  if (fclose (yyin) != 0)
-    exit (3);
-  return 0;
-}
-
-int
-main (void)
-{
-  yyparse ("input");
-  yyparse ("input");
-  return 0;
-}
-@end verbatim
-
-@noindent
-If the file @file{input} contains
-
-@verbatim
-input:1: Hello,
-input:2: World!
-@end verbatim
-
-@noindent
-then instead of getting the first line twice, you get:
-
-@example
-$ @kbd{flex -ofirst-line.c first-line.l}
-$ @kbd{gcc  -ofirst-line   first-line.c -ll}
-$ @kbd{./first-line}
-input:1: Hello,
-input:2: World!
-@end example
-
-Therefore, whenever you change @code{yyin}, you must tell the
-Lex-generated scanner to discard its current buffer and switch to the
-new one.  This depends upon your implementation of Lex; see its
-documentation for more.  For Flex, it suffices to call
-@samp{YY_FLUSH_BUFFER} after each change to @code{yyin}.  If your
-Flex-generated scanner needs to read from several input streams to
-handle features like include files, you might consider using Flex
-functions like @samp{yy_switch_to_buffer} that manipulate multiple
-input buffers.
-
-If your Flex-generated scanner uses start conditions (@pxref{Start
-conditions, , Start conditions, flex, The Flex Manual}), you might
-also want to reset the scanner's state, i.e., go back to the initial
-start condition, through a call to @samp{BEGIN (0)}.
-
-@node Strings are Destroyed
-@section Strings are Destroyed
-
-@display
-My parser seems to destroy old strings, or maybe it loses track of
-them.  Instead of reporting @samp{"foo", "bar"}, it reports
-@samp{"bar", "bar"}, or even @samp{"foo\nbar", "bar"}.
-@end display
-
-This error is probably the single most frequent ``bug report'' sent to
-Bison lists, but is only concerned with a misunderstanding of the role
-of the scanner.  Consider the following Lex code:
-
-@verbatim
-%{
-#include <stdio.h>
-char *yylval = NULL;
-%}
-%%
-.*    yylval = yytext; return 1;
-\n    /* IGNORE */
-%%
-int
-main ()
-{
-  /* Similar to using $1, $2 in a Bison action.  */
-  char *fst = (yylex (), yylval);
-  char *snd = (yylex (), yylval);
-  printf ("\"%s\", \"%s\"\n", fst, snd);
-  return 0;
-}
-@end verbatim
-
-If you compile and run this code, you get:
-
-@example
-$ @kbd{flex -osplit-lines.c split-lines.l}
-$ @kbd{gcc  -osplit-lines   split-lines.c -ll}
-$ @kbd{printf 'one\ntwo\n' | ./split-lines}
-"one
-two", "two"
-@end example
-
-@noindent
-this is because @code{yytext} is a buffer provided for @emph{reading}
-in the action, but if you want to keep it, you have to duplicate it
-(e.g., using @code{strdup}).  Note that the output may depend on how
-your implementation of Lex handles @code{yytext}.  For instance, when
-given the Lex compatibility option @option{-l} (which triggers the
-option @samp{%array}) Flex generates a different behavior:
-
-@example
-$ @kbd{flex -l -osplit-lines.c split-lines.l}
-$ @kbd{gcc     -osplit-lines   split-lines.c -ll}
-$ @kbd{printf 'one\ntwo\n' | ./split-lines}
-"two", "two"
-@end example
-
-
-@node Implementing Gotos/Loops
-@section Implementing Gotos/Loops
-
-@display
-My simple calculator supports variables, assignments, and functions,
-but how can I implement gotos, or loops?
-@end display
-
-Although very pedagogical, the examples included in the document blur
-the distinction to make between the parser---whose job is to recover
-the structure of a text and to transmit it to subsequent modules of
-the program---and the processing (such as the execution) of this
-structure.  This works well with so called straight line programs,
-i.e., precisely those that have a straightforward execution model:
-execute simple instructions one after the others.
-
-@cindex abstract syntax tree
-@cindex @acronym{AST}
-If you want a richer model, you will probably need to use the parser
-to construct a tree that does represent the structure it has
-recovered; this tree is usually called the @dfn{abstract syntax tree},
-or @dfn{@acronym{AST}} for short.  Then, walking through this tree,
-traversing it in various ways, will enable treatments such as its
-execution or its translation, which will result in an interpreter or a
-compiler.
-
-This topic is way beyond the scope of this manual, and the reader is
-invited to consult the dedicated literature.
-
-
-@node Multiple start-symbols
-@section Multiple start-symbols
-
-@display
-I have several closely related grammars, and I would like to share their
-implementations.  In fact, I could use a single grammar but with
-multiple entry points.
-@end display
-
-Bison does not support multiple start-symbols, but there is a very
-simple means to simulate them.  If @code{foo} and @code{bar} are the two
-pseudo start-symbols, then introduce two new tokens, say
-@code{START_FOO} and @code{START_BAR}, and use them as switches from the
-real start-symbol:
-
-@example
-%token START_FOO START_BAR;
-%start start;
-start: START_FOO foo
-     | START_BAR bar;
-@end example
-
-These tokens prevents the introduction of new conflicts.  As far as the
-parser goes, that is all that is needed.
-
-Now the difficult part is ensuring that the scanner will send these
-tokens first.  If your scanner is hand-written, that should be
-straightforward.  If your scanner is generated by Lex, them there is
-simple means to do it: recall that anything between @samp{%@{ ... %@}}
-after the first @code{%%} is copied verbatim in the top of the generated
-@code{yylex} function.  Make sure a variable @code{start_token} is
-available in the scanner (e.g., a global variable or using
-@code{%lex-param} etc.), and use the following:
-
-@example
-  /* @r{Prologue.}  */
-%%
-%@{
-  if (start_token)
-    @{
-      int t = start_token;
-      start_token = 0;
-      return t;
-    @}
-%@}
-  /* @r{The rules.}  */
-@end example
-
-
-@node Secure?  Conform?
-@section Secure?  Conform?
-
-@display
-Is Bison secure?  Does it conform to POSIX?
-@end display
-
-If you're looking for a guarantee or certification, we don't provide it.
-However, Bison is intended to be a reliable program that conforms to the
-@acronym{POSIX} specification for Yacc.  If you run into problems,
-please send us a bug report.
-
-@node I can't build Bison
-@section I can't build Bison
-
-@display
-I can't build Bison because @command{make} complains that
-@code{msgfmt} is not found.
-What should I do?
-@end display
-
-Like most GNU packages with internationalization support, that feature
-is turned on by default.  If you have problems building in the @file{po}
-subdirectory, it indicates that your system's internationalization
-support is lacking.  You can re-configure Bison with
-@option{--disable-nls} to turn off this support, or you can install GNU
-gettext from @url{ftp://ftp.gnu.org/gnu/gettext/} and re-configure
-Bison.  See the file @file{ABOUT-NLS} for more information.
-
-
-@node Where can I find help?
-@section Where can I find help?
-
-@display
-I'm having trouble using Bison.  Where can I find help?
-@end display
-
-First, read this fine manual.  Beyond that, you can send mail to
-@email{help-bison@@gnu.org}.  This mailing list is intended to be
-populated with people who are willing to answer questions about using
-and installing Bison.  Please keep in mind that (most of) the people on
-the list have aspects of their lives which are not related to Bison (!),
-so you may not receive an answer to your question right away.  This can
-be frustrating, but please try not to honk them off; remember that any
-help they provide is purely voluntary and out of the kindness of their
-hearts.
-
-@node Bug Reports
-@section Bug Reports
-
-@display
-I found a bug.  What should I include in the bug report?
-@end display
-
-Before you send a bug report, make sure you are using the latest
-version.  Check @url{ftp://ftp.gnu.org/pub/gnu/bison/} or one of its
-mirrors.  Be sure to include the version number in your bug report.  If
-the bug is present in the latest version but not in a previous version,
-try to determine the most recent version which did not contain the bug.
-
-If the bug is parser-related, you should include the smallest grammar
-you can which demonstrates the bug.  The grammar file should also be
-complete (i.e., I should be able to run it through Bison without having
-to edit or add anything).  The smaller and simpler the grammar, the
-easier it will be to fix the bug.
-
-Include information about your compilation environment, including your
-operating system's name and version and your compiler's name and
-version.  If you have trouble compiling, you should also include a
-transcript of the build session, starting with the invocation of
-`configure'.  Depending on the nature of the bug, you may be asked to
-send additional files as well (such as `config.h' or `config.cache').
-
-Patches are most welcome, but not required.  That is, do not hesitate to
-send a bug report just because you can not provide a fix.
-
-Send bug reports to @email{bug-bison@@gnu.org}.
-
-@node Other Languages
-@section Other Languages
-
-@display
-Will Bison ever have C++ support?  How about Java or @var{insert your
-favorite language here}?
-@end display
-
-C++ support is there now, and is documented.  We'd love to add other
-languages; contributions are welcome.
-
-@node Beta Testing
-@section Beta Testing
-
-@display
-What is involved in being a beta tester?
-@end display
-
-It's not terribly involved.  Basically, you would download a test
-release, compile it, and use it to build and run a parser or two.  After
-that, you would submit either a bug report or a message saying that
-everything is okay.  It is important to report successes as well as
-failures because test releases eventually become mainstream releases,
-but only if they are adequately tested.  If no one tests, development is
-essentially halted.
-
-Beta testers are particularly needed for operating systems to which the
-developers do not have easy access.  They currently have easy access to
-recent GNU/Linux and Solaris versions.  Reports about other operating
-systems are especially welcome.
-
-@node Mailing Lists
-@section Mailing Lists
-
-@display
-How do I join the help-bison and bug-bison mailing lists?
-@end display
-
-See @url{http://lists.gnu.org/}.
-
-@c ================================================= Table of Symbols
-
-@node Table of Symbols
-@appendix Bison Symbols
-@cindex Bison symbols, table of
-@cindex symbols in Bison, table of
-
-@deffn {Variable} @@$
-In an action, the location of the left-hand side of the rule.
-@xref{Locations, , Locations Overview}.
-@end deffn
-
-@deffn {Variable} @@@var{n}
-In an action, the location of the @var{n}-th symbol of the right-hand
-side of the rule.  @xref{Locations, , Locations Overview}.
-@end deffn
-
-@deffn {Variable} $$
-In an action, the semantic value of the left-hand side of the rule.
-@xref{Actions}.
-@end deffn
-
-@deffn {Variable} $@var{n}
-In an action, the semantic value of the @var{n}-th symbol of the
-right-hand side of the rule.  @xref{Actions}.
-@end deffn
-
-@deffn {Delimiter} %%
-Delimiter used to separate the grammar rule section from the
-Bison declarations section or the epilogue.
-@xref{Grammar Layout, ,The Overall Layout of a Bison Grammar}.
-@end deffn
-
-@c Don't insert spaces, or check the DVI output.
-@deffn {Delimiter} %@{@var{code}%@}
-All code listed between @samp{%@{} and @samp{%@}} is copied directly to
-the output file uninterpreted.  Such code forms the prologue of the input
-file.  @xref{Grammar Outline, ,Outline of a Bison
-Grammar}.
-@end deffn
-
-@deffn {Construct} /*@dots{}*/
-Comment delimiters, as in C.
-@end deffn
-
-@deffn {Delimiter} :
-Separates a rule's result from its components.  @xref{Rules, ,Syntax of
-Grammar Rules}.
-@end deffn
-
-@deffn {Delimiter} ;
-Terminates a rule.  @xref{Rules, ,Syntax of Grammar Rules}.
-@end deffn
-
-@deffn {Delimiter} |
-Separates alternate rules for the same result nonterminal.
-@xref{Rules, ,Syntax of Grammar Rules}.
-@end deffn
-
-@deffn {Symbol} $accept
-The predefined nonterminal whose only rule is @samp{$accept: @var{start}
-$end}, where @var{start} is the start symbol.  @xref{Start Decl, , The
-Start-Symbol}.  It cannot be used in the grammar.
-@end deffn
-
-@deffn {Directive} %debug
-Equip the parser for debugging.  @xref{Decl Summary}.
-@end deffn
-
-@ifset defaultprec
-@deffn {Directive} %default-prec
-Assign a precedence to rules that lack an explicit @samp{%prec}
-modifier.  @xref{Contextual Precedence, ,Context-Dependent
-Precedence}.
-@end deffn
-@end ifset
-
-@deffn {Directive} %defines
-Bison declaration to create a header file meant for the scanner.
-@xref{Decl Summary}.
-@end deffn
-
-@deffn {Directive} %destructor
-Specify how the parser should reclaim the memory associated to
-discarded symbols.  @xref{Destructor Decl, , Freeing Discarded Symbols}.
-@end deffn
-
-@deffn {Directive} %dprec
-Bison declaration to assign a precedence to a rule that is used at parse
-time to resolve reduce/reduce conflicts.  @xref{GLR Parsers, ,Writing
-@acronym{GLR} Parsers}.
-@end deffn
-
-@deffn {Symbol} $end
-The predefined token marking the end of the token stream.  It cannot be
-used in the grammar.
-@end deffn
-
-@deffn {Symbol} error
-A token name reserved for error recovery.  This token may be used in
-grammar rules so as to allow the Bison parser to recognize an error in
-the grammar without halting the process.  In effect, a sentence
-containing an error may be recognized as valid.  On a syntax error, the
-token @code{error} becomes the current look-ahead token.  Actions
-corresponding to @code{error} are then executed, and the look-ahead
-token is reset to the token that originally caused the violation.
-@xref{Error Recovery}.
-@end deffn
-
-@deffn {Directive} %error-verbose
-Bison declaration to request verbose, specific error message strings
-when @code{yyerror} is called.
-@end deffn
-
-@deffn {Directive} %file-prefix="@var{prefix}"
-Bison declaration to set the prefix of the output files.  @xref{Decl
-Summary}.
-@end deffn
-
-@deffn {Directive} %glr-parser
-Bison declaration to produce a @acronym{GLR} parser.  @xref{GLR
-Parsers, ,Writing @acronym{GLR} Parsers}.
-@end deffn
-
-@deffn {Directive} %initial-action
-Run user code before parsing.  @xref{Initial Action Decl, , Performing Actions before Parsing}.
-@end deffn
-
-@deffn {Directive} %left
-Bison declaration to assign left associativity to token(s).
-@xref{Precedence Decl, ,Operator Precedence}.
-@end deffn
-
-@deffn {Directive} %lex-param @{@var{argument-declaration}@}
-Bison declaration to specifying an additional parameter that
-@code{yylex} should accept.  @xref{Pure Calling,, Calling Conventions
-for Pure Parsers}.
-@end deffn
-
-@deffn {Directive} %merge
-Bison declaration to assign a merging function to a rule.  If there is a
-reduce/reduce conflict with a rule having the same merging function, the
-function is applied to the two semantic values to get a single result.
-@xref{GLR Parsers, ,Writing @acronym{GLR} Parsers}.
-@end deffn
-
-@deffn {Directive} %name-prefix="@var{prefix}"
-Bison declaration to rename the external symbols.  @xref{Decl Summary}.
-@end deffn
-
-@ifset defaultprec
-@deffn {Directive} %no-default-prec
-Do not assign a precedence to rules that lack an explicit @samp{%prec}
-modifier.  @xref{Contextual Precedence, ,Context-Dependent
-Precedence}.
-@end deffn
-@end ifset
-
-@deffn {Directive} %no-lines
-Bison declaration to avoid generating @code{#line} directives in the
-parser file.  @xref{Decl Summary}.
-@end deffn
-
-@deffn {Directive} %nonassoc
-Bison declaration to assign nonassociativity to token(s).
-@xref{Precedence Decl, ,Operator Precedence}.
-@end deffn
-
-@deffn {Directive} %output="@var{file}"
-Bison declaration to set the name of the parser file.  @xref{Decl
-Summary}.
-@end deffn
-
-@deffn {Directive} %parse-param @{@var{argument-declaration}@}
-Bison declaration to specifying an additional parameter that
-@code{yyparse} should accept.  @xref{Parser Function,, The Parser
-Function @code{yyparse}}.
-@end deffn
-
-@deffn {Directive} %prec
-Bison declaration to assign a precedence to a specific rule.
-@xref{Contextual Precedence, ,Context-Dependent Precedence}.
-@end deffn
-
-@deffn {Directive} %pure-parser
-Bison declaration to request a pure (reentrant) parser.
-@xref{Pure Decl, ,A Pure (Reentrant) Parser}.
-@end deffn
-
-@deffn {Directive} %require "@var{version}"
-Require version @var{version} or higher of Bison.  @xref{Require Decl, ,
-Require a Version of Bison}.
-@end deffn
-
-@deffn {Directive} %right
-Bison declaration to assign right associativity to token(s).
-@xref{Precedence Decl, ,Operator Precedence}.
-@end deffn
-
-@deffn {Directive} %start
-Bison declaration to specify the start symbol.  @xref{Start Decl, ,The
-Start-Symbol}.
-@end deffn
-
-@deffn {Directive} %token
-Bison declaration to declare token(s) without specifying precedence.
-@xref{Token Decl, ,Token Type Names}.
-@end deffn
-
-@deffn {Directive} %token-table
-Bison declaration to include a token name table in the parser file.
-@xref{Decl Summary}.
-@end deffn
-
-@deffn {Directive} %type
-Bison declaration to declare nonterminals.  @xref{Type Decl,
-,Nonterminal Symbols}.
-@end deffn
-
-@deffn {Symbol} $undefined
-The predefined token onto which all undefined values returned by
-@code{yylex} are mapped.  It cannot be used in the grammar, rather, use
-@code{error}.
-@end deffn
-
-@deffn {Directive} %union
-Bison declaration to specify several possible data types for semantic
-values.  @xref{Union Decl, ,The Collection of Value Types}.
-@end deffn
-
-@deffn {Macro} YYABORT
-Macro to pretend that an unrecoverable syntax error has occurred, by
-making @code{yyparse} return 1 immediately.  The error reporting
-function @code{yyerror} is not called.  @xref{Parser Function, ,The
-Parser Function @code{yyparse}}.
-@end deffn
-
-@deffn {Macro} YYACCEPT
-Macro to pretend that a complete utterance of the language has been
-read, by making @code{yyparse} return 0 immediately.
-@xref{Parser Function, ,The Parser Function @code{yyparse}}.
-@end deffn
-
-@deffn {Macro} YYBACKUP
-Macro to discard a value from the parser stack and fake a look-ahead
-token.  @xref{Action Features, ,Special Features for Use in Actions}.
-@end deffn
-
-@deffn {Variable} yychar
-External integer variable that contains the integer value of the
-look-ahead token.  (In a pure parser, it is a local variable within
-@code{yyparse}.)  Error-recovery rule actions may examine this variable.
-@xref{Action Features, ,Special Features for Use in Actions}.
-@end deffn
-
-@deffn {Variable} yyclearin
-Macro used in error-recovery rule actions.  It clears the previous
-look-ahead token.  @xref{Error Recovery}.
-@end deffn
-
-@deffn {Macro} YYDEBUG
-Macro to define to equip the parser with tracing code.  @xref{Tracing,
-,Tracing Your Parser}.
-@end deffn
-
-@deffn {Variable} yydebug
-External integer variable set to zero by default.  If @code{yydebug}
-is given a nonzero value, the parser will output information on input
-symbols and parser action.  @xref{Tracing, ,Tracing Your Parser}.
-@end deffn
-
-@deffn {Macro} yyerrok
-Macro to cause parser to recover immediately to its normal mode
-after a syntax error.  @xref{Error Recovery}.
-@end deffn
-
-@deffn {Macro} YYERROR
-Macro to pretend that a syntax error has just been detected: call
-@code{yyerror} and then perform normal error recovery if possible
-(@pxref{Error Recovery}), or (if recovery is impossible) make
-@code{yyparse} return 1.  @xref{Error Recovery}.
-@end deffn
-
-@deffn {Function} yyerror
-User-supplied function to be called by @code{yyparse} on error.
-@xref{Error Reporting, ,The Error
-Reporting Function @code{yyerror}}.
-@end deffn
-
-@deffn {Macro} YYERROR_VERBOSE
-An obsolete macro that you define with @code{#define} in the prologue
-to request verbose, specific error message strings
-when @code{yyerror} is called.  It doesn't matter what definition you
-use for @code{YYERROR_VERBOSE}, just whether you define it.  Using
-@code{%error-verbose} is preferred.
-@end deffn
-
-@deffn {Macro} YYINITDEPTH
-Macro for specifying the initial size of the parser stack.
-@xref{Memory Management}.
-@end deffn
-
-@deffn {Function} yylex
-User-supplied lexical analyzer function, called with no arguments to get
-the next token.  @xref{Lexical, ,The Lexical Analyzer Function
-@code{yylex}}.
-@end deffn
-
-@deffn {Macro} YYLEX_PARAM
-An obsolete macro for specifying an extra argument (or list of extra
-arguments) for @code{yyparse} to pass to @code{yylex}.  The use of this
-macro is deprecated, and is supported only for Yacc like parsers.
-@xref{Pure Calling,, Calling Conventions for Pure Parsers}.
-@end deffn
-
-@deffn {Variable} yylloc
-External variable in which @code{yylex} should place the line and column
-numbers associated with a token.  (In a pure parser, it is a local
-variable within @code{yyparse}, and its address is passed to
-@code{yylex}.)
-You can ignore this variable if you don't use the @samp{@@} feature in the
-grammar actions.
-@xref{Token Locations, ,Textual Locations of Tokens}.
-In semantic actions, it stores the location of the look-ahead token.
-@xref{Actions and Locations, ,Actions and Locations}.
-@end deffn
-
-@deffn {Type} YYLTYPE
-Data type of @code{yylloc}; by default, a structure with four
-members.  @xref{Location Type, , Data Types of Locations}.
-@end deffn
-
-@deffn {Variable} yylval
-External variable in which @code{yylex} should place the semantic
-value associated with a token.  (In a pure parser, it is a local
-variable within @code{yyparse}, and its address is passed to
-@code{yylex}.)
-@xref{Token Values, ,Semantic Values of Tokens}.
-In semantic actions, it stores the semantic value of the look-ahead token.
-@xref{Actions, ,Actions}.
-@end deffn
-
-@deffn {Macro} YYMAXDEPTH
-Macro for specifying the maximum size of the parser stack.  @xref{Memory
-Management}.
-@end deffn
-
-@deffn {Variable} yynerrs
-Global variable which Bison increments each time it reports a syntax error.
-(In a pure parser, it is a local variable within @code{yyparse}.)
-@xref{Error Reporting, ,The Error Reporting Function @code{yyerror}}.
-@end deffn
-
-@deffn {Function} yyparse
-The parser function produced by Bison; call this function to start
-parsing.  @xref{Parser Function, ,The Parser Function @code{yyparse}}.
-@end deffn
-
-@deffn {Macro} YYPARSE_PARAM
-An obsolete macro for specifying the name of a parameter that
-@code{yyparse} should accept.  The use of this macro is deprecated, and
-is supported only for Yacc like parsers.  @xref{Pure Calling,, Calling
-Conventions for Pure Parsers}.
-@end deffn
-
-@deffn {Macro} YYRECOVERING
-The expression @code{YYRECOVERING ()} yields 1 when the parser
-is recovering from a syntax error, and 0 otherwise.
-@xref{Action Features, ,Special Features for Use in Actions}.
-@end deffn
-
-@deffn {Macro} YYSTACK_USE_ALLOCA
-Macro used to control the use of @code{alloca} when the C
-@acronym{LALR}(1) parser needs to extend its stacks.  If defined to 0,
-the parser will use @code{malloc} to extend its stacks.  If defined to
-1, the parser will use @code{alloca}.  Values other than 0 and 1 are
-reserved for future Bison extensions.  If not defined,
-@code{YYSTACK_USE_ALLOCA} defaults to 0.
-
-In the all-too-common case where your code may run on a host with a
-limited stack and with unreliable stack-overflow checking, you should
-set @code{YYMAXDEPTH} to a value that cannot possibly result in
-unchecked stack overflow on any of your target hosts when
-@code{alloca} is called.  You can inspect the code that Bison
-generates in order to determine the proper numeric values.  This will
-require some expertise in low-level implementation details.
-@end deffn
-
-@deffn {Type} YYSTYPE
-Data type of semantic values; @code{int} by default.
-@xref{Value Type, ,Data Types of Semantic Values}.
-@end deffn
-
-@node Glossary
-@appendix Glossary
-@cindex glossary
-
-@table @asis
-@item Backus-Naur Form (@acronym{BNF}; also called ``Backus Normal Form'')
-Formal method of specifying context-free grammars originally proposed
-by John Backus, and slightly improved by Peter Naur in his 1960-01-02
-committee document contributing to what became the Algol 60 report.
-@xref{Language and Grammar, ,Languages and Context-Free Grammars}.
-
-@item Context-free grammars
-Grammars specified as rules that can be applied regardless of context.
-Thus, if there is a rule which says that an integer can be used as an
-expression, integers are allowed @emph{anywhere} an expression is
-permitted.  @xref{Language and Grammar, ,Languages and Context-Free
-Grammars}.
-
-@item Dynamic allocation
-Allocation of memory that occurs during execution, rather than at
-compile time or on entry to a function.
-
-@item Empty string
-Analogous to the empty set in set theory, the empty string is a
-character string of length zero.
-
-@item Finite-state stack machine
-A ``machine'' that has discrete states in which it is said to exist at
-each instant in time.  As input to the machine is processed, the
-machine moves from state to state as specified by the logic of the
-machine.  In the case of the parser, the input is the language being
-parsed, and the states correspond to various stages in the grammar
-rules.  @xref{Algorithm, ,The Bison Parser Algorithm}.
-
-@item Generalized @acronym{LR} (@acronym{GLR})
-A parsing algorithm that can handle all context-free grammars, including those
-that are not @acronym{LALR}(1).  It resolves situations that Bison's
-usual @acronym{LALR}(1)
-algorithm cannot by effectively splitting off multiple parsers, trying all
-possible parsers, and discarding those that fail in the light of additional
-right context.  @xref{Generalized LR Parsing, ,Generalized
-@acronym{LR} Parsing}.
-
-@item Grouping
-A language construct that is (in general) grammatically divisible;
-for example, `expression' or `declaration' in C@.
-@xref{Language and Grammar, ,Languages and Context-Free Grammars}.
-
-@item Infix operator
-An arithmetic operator that is placed between the operands on which it
-performs some operation.
-
-@item Input stream
-A continuous flow of data between devices or programs.
-
-@item Language construct
-One of the typical usage schemas of the language.  For example, one of
-the constructs of the C language is the @code{if} statement.
-@xref{Language and Grammar, ,Languages and Context-Free Grammars}.
-
-@item Left associativity
-Operators having left associativity are analyzed from left to right:
-@samp{a+b+c} first computes @samp{a+b} and then combines with
-@samp{c}.  @xref{Precedence, ,Operator Precedence}.
-
-@item Left recursion
-A rule whose result symbol is also its first component symbol; for
-example, @samp{expseq1 : expseq1 ',' exp;}.  @xref{Recursion, ,Recursive
-Rules}.
-
-@item Left-to-right parsing
-Parsing a sentence of a language by analyzing it token by token from
-left to right.  @xref{Algorithm, ,The Bison Parser Algorithm}.
-
-@item Lexical analyzer (scanner)
-A function that reads an input stream and returns tokens one by one.
-@xref{Lexical, ,The Lexical Analyzer Function @code{yylex}}.
-
-@item Lexical tie-in
-A flag, set by actions in the grammar rules, which alters the way
-tokens are parsed.  @xref{Lexical Tie-ins}.
-
-@item Literal string token
-A token which consists of two or more fixed characters.  @xref{Symbols}.
-
-@item Look-ahead token
-A token already read but not yet shifted.  @xref{Look-Ahead, ,Look-Ahead
-Tokens}.
-
-@item @acronym{LALR}(1)
-The class of context-free grammars that Bison (like most other parser
-generators) can handle; a subset of @acronym{LR}(1).  @xref{Mystery
-Conflicts, ,Mysterious Reduce/Reduce Conflicts}.
-
-@item @acronym{LR}(1)
-The class of context-free grammars in which at most one token of
-look-ahead is needed to disambiguate the parsing of any piece of input.
-
-@item Nonterminal symbol
-A grammar symbol standing for a grammatical construct that can
-be expressed through rules in terms of smaller constructs; in other
-words, a construct that is not a token.  @xref{Symbols}.
-
-@item Parser
-A function that recognizes valid sentences of a language by analyzing
-the syntax structure of a set of tokens passed to it from a lexical
-analyzer.
-
-@item Postfix operator
-An arithmetic operator that is placed after the operands upon which it
-performs some operation.
-
-@item Reduction
-Replacing a string of nonterminals and/or terminals with a single
-nonterminal, according to a grammar rule.  @xref{Algorithm, ,The Bison
-Parser Algorithm}.
-
-@item Reentrant
-A reentrant subprogram is a subprogram which can be in invoked any
-number of times in parallel, without interference between the various
-invocations.  @xref{Pure Decl, ,A Pure (Reentrant) Parser}.
-
-@item Reverse polish notation
-A language in which all operators are postfix operators.
-
-@item Right recursion
-A rule whose result symbol is also its last component symbol; for
-example, @samp{expseq1: exp ',' expseq1;}.  @xref{Recursion, ,Recursive
-Rules}.
-
-@item Semantics
-In computer languages, the semantics are specified by the actions
-taken for each instance of the language, i.e., the meaning of
-each statement.  @xref{Semantics, ,Defining Language Semantics}.
-
-@item Shift
-A parser is said to shift when it makes the choice of analyzing
-further input from the stream rather than reducing immediately some
-already-recognized rule.  @xref{Algorithm, ,The Bison Parser Algorithm}.
-
-@item Single-character literal
-A single character that is recognized and interpreted as is.
-@xref{Grammar in Bison, ,From Formal Rules to Bison Input}.
-
-@item Start symbol
-The nonterminal symbol that stands for a complete valid utterance in
-the language being parsed.  The start symbol is usually listed as the
-first nonterminal symbol in a language specification.
-@xref{Start Decl, ,The Start-Symbol}.
-
-@item Symbol table
-A data structure where symbol names and associated data are stored
-during parsing to allow for recognition and use of existing
-information in repeated uses of a symbol.  @xref{Multi-function Calc}.
-
-@item Syntax error
-An error encountered during parsing of an input stream due to invalid
-syntax.  @xref{Error Recovery}.
-
-@item Token
-A basic, grammatically indivisible unit of a language.  The symbol
-that describes a token in the grammar is a terminal symbol.
-The input of the Bison parser is a stream of tokens which comes from
-the lexical analyzer.  @xref{Symbols}.
-
-@item Terminal symbol
-A grammar symbol that has no rules in the grammar and therefore is
-grammatically indivisible.  The piece of text it represents is a token.
-@xref{Language and Grammar, ,Languages and Context-Free Grammars}.
-@end table
-
-@node Copying This Manual
-@appendix Copying This Manual
-
-@menu
-* GNU Free Documentation License::  License for copying this manual.
-@end menu
-
-@include fdl.texi
-
-@node Index
-@unnumbered Index
-
-@printindex cp
-
-@bye
-
-@c LocalWords: texinfo setfilename settitle setchapternewpage finalout
-@c LocalWords: ifinfo smallbook shorttitlepage titlepage GPL FIXME iftex
-@c LocalWords: akim fn cp syncodeindex vr tp synindex dircategory direntry
-@c LocalWords: ifset vskip pt filll insertcopying sp ISBN Etienne Suvasa
-@c LocalWords: ifnottex yyparse detailmenu GLR RPN Calc var Decls Rpcalc
-@c LocalWords: rpcalc Lexer Gen Comp Expr ltcalc mfcalc Decl Symtab yylex
-@c LocalWords: yyerror pxref LR yylval cindex dfn LALR samp gpl BNF xref
-@c LocalWords: const int paren ifnotinfo AC noindent emph expr stmt findex
-@c LocalWords: glr YYSTYPE TYPENAME prog dprec printf decl init stmtMerge
-@c LocalWords: pre STDC GNUC endif yy YY alloca lf stddef stdlib YYDEBUG
-@c LocalWords: NUM exp subsubsection kbd Ctrl ctype EOF getchar isdigit
-@c LocalWords: ungetc stdin scanf sc calc ulator ls lm cc NEG prec yyerrok
-@c LocalWords: longjmp fprintf stderr preg yylloc YYLTYPE cos ln
-@c LocalWords: smallexample symrec val tptr FNCT fnctptr func struct sym
-@c LocalWords: fnct putsym getsym fname arith fncts atan ptr malloc sizeof
-@c LocalWords: strlen strcpy fctn strcmp isalpha symbuf realloc isalnum
-@c LocalWords: ptypes itype YYPRINT trigraphs yytname expseq vindex dtype
-@c LocalWords: Rhs YYRHSLOC LE nonassoc op deffn typeless typefull yynerrs
-@c LocalWords: yychar yydebug msg YYNTOKENS YYNNTS YYNRULES YYNSTATES
-@c LocalWords: cparse clex deftypefun NE defmac YYACCEPT YYABORT param
-@c LocalWords: strncmp intval tindex lvalp locp llocp typealt YYBACKUP
-@c LocalWords: YYEMPTY YYEOF YYRECOVERING yyclearin GE def UMINUS maybeword
-@c LocalWords: Johnstone Shamsa Sadaf Hussain Tomita TR uref YYMAXDEPTH
-@c LocalWords: YYINITDEPTH stmnts ref stmnt initdcl maybeasm VCG notype
-@c LocalWords: hexflag STR exdent itemset asis DYYDEBUG YYFPRINTF args
-@c LocalWords: YYPRINTF infile ypp yxx outfile itemx vcg tex leaderfill
-@c LocalWords: hbox hss hfill tt ly yyin fopen fclose ofirst gcc ll
-@c LocalWords: yyrestart nbar yytext fst snd osplit ntwo strdup AST
-@c LocalWords: YYSTACK DVI fdl printindex
diff --git a/doc/fdl.texi b/doc/fdl.texi
deleted file mode 100644
index fe78df8..0000000
--- a/doc/fdl.texi
+++ /dev/null
@@ -1,452 +0,0 @@
-
-@node GNU Free Documentation License
-@appendixsec GNU Free Documentation License
-
-@cindex FDL, GNU Free Documentation License
-@center Version 1.2, November 2002
-
-@display
-Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
-51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-@end display
-
-@enumerate 0
-@item
-PREAMBLE
-
-The purpose of this License is to make a manual, textbook, or other
-functional and useful document @dfn{free} in the sense of freedom: to
-assure everyone the effective freedom to copy and redistribute it,
-with or without modifying it, either commercially or noncommercially.
-Secondarily, this License preserves for the author and publisher a way
-to get credit for their work, while not being considered responsible
-for modifications made by others.
-
-This License is a kind of ``copyleft'', which means that derivative
-works of the document must themselves be free in the same sense.  It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.
-
-We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does.  But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book.  We recommend this License
-principally for works whose purpose is instruction or reference.
-
-@item
-APPLICABILITY AND DEFINITIONS
-
-This License applies to any manual or other work, in any medium, that
-contains a notice placed by the copyright holder saying it can be
-distributed under the terms of this License.  Such a notice grants a
-world-wide, royalty-free license, unlimited in duration, to use that
-work under the conditions stated herein.  The ``Document'', below,
-refers to any such manual or work.  Any member of the public is a
-licensee, and is addressed as ``you''.  You accept the license if you
-copy, modify or distribute the work in a way requiring permission
-under copyright law.
-
-A ``Modified Version'' of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.
-
-A ``Secondary Section'' is a named appendix or a front-matter section
-of the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document's overall
-subject (or to related matters) and contains nothing that could fall
-directly within that overall subject.  (Thus, if the Document is in
-part a textbook of mathematics, a Secondary Section may not explain
-any mathematics.)  The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.
-
-The ``Invariant Sections'' are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License.  If a
-section does not fit the above definition of Secondary then it is not
-allowed to be designated as Invariant.  The Document may contain zero
-Invariant Sections.  If the Document does not identify any Invariant
-Sections then there are none.
-
-The ``Cover Texts'' are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License.  A Front-Cover Text may
-be at most 5 words, and a Back-Cover Text may be at most 25 words.
-
-A ``Transparent'' copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, that is suitable for revising the document
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters.  A copy made in an otherwise Transparent file
-format whose markup, or absence of markup, has been arranged to thwart
-or discourage subsequent modification by readers is not Transparent.
-An image format is not Transparent if used for any substantial amount
-of text.  A copy that is not ``Transparent'' is called ``Opaque''.
-
-Examples of suitable formats for Transparent copies include plain
-@sc{ascii} without markup, Texinfo input format, La@TeX{} input
-format, @acronym{SGML} or @acronym{XML} using a publicly available
-@acronym{DTD}, and standard-conforming simple @acronym{HTML},
-PostScript or @acronym{PDF} designed for human modification.  Examples
-of transparent image formats include @acronym{PNG}, @acronym{XCF} and
-@acronym{JPG}.  Opaque formats include proprietary formats that can be
-read and edited only by proprietary word processors, @acronym{SGML} or
-@acronym{XML} for which the @acronym{DTD} and/or processing tools are
-not generally available, and the machine-generated @acronym{HTML},
-PostScript or @acronym{PDF} produced by some word processors for
-output purposes only.
-
-The ``Title Page'' means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page.  For works in
-formats which do not have any title page as such, ``Title Page'' means
-the text near the most prominent appearance of the work's title,
-preceding the beginning of the body of the text.
-
-A section ``Entitled XYZ'' means a named subunit of the Document whose
-title either is precisely XYZ or contains XYZ in parentheses following
-text that translates XYZ in another language.  (Here XYZ stands for a
-specific section name mentioned below, such as ``Acknowledgements'',
-``Dedications'', ``Endorsements'', or ``History''.)  To ``Preserve the Title''
-of such a section when you modify the Document means that it remains a
-section ``Entitled XYZ'' according to this definition.
-
-The Document may include Warranty Disclaimers next to the notice which
-states that this License applies to the Document.  These Warranty
-Disclaimers are considered to be included by reference in this
-License, but only as regards disclaiming warranties: any other
-implication that these Warranty Disclaimers may have is void and has
-no effect on the meaning of this License.
-
-@item
-VERBATIM COPYING
-
-You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License.  You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute.  However, you may accept
-compensation in exchange for copies.  If you distribute a large enough
-number of copies you must also follow the conditions in section 3.
-
-You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.
-
-@item
-COPYING IN QUANTITY
-
-If you publish printed copies (or copies in media that commonly have
-printed covers) of the Document, numbering more than 100, and the
-Document's license notice requires Cover Texts, you must enclose the
-copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover.  Both covers must also clearly and legibly identify
-you as the publisher of these copies.  The front cover must present
-the full title with all words of the title equally prominent and
-visible.  You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.
-
-If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.
-
-If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a computer-network location from which the general network-using
-public has access to download using public-standard network protocols
-a complete Transparent copy of the Document, free of added material.
-If you use the latter option, you must take reasonably prudent steps,
-when you begin distribution of Opaque copies in quantity, to ensure
-that this Transparent copy will remain thus accessible at the stated
-location until at least one year after the last time you distribute an
-Opaque copy (directly or through your agents or retailers) of that
-edition to the public.
-
-It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.
-
-@item
-MODIFICATIONS
-
-You may copy and distribute a Modified Version of the Document under
-the conditions of sections 2 and 3 above, provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it.  In addition, you must do these things in the Modified Version:
-
-@enumerate A
-@item
-Use in the Title Page (and on the covers, if any) a title distinct
-from that of the Document, and from those of previous versions
-(which should, if there were any, be listed in the History section
-of the Document).  You may use the same title as a previous version
-if the original publisher of that version gives permission.
-
-@item
-List on the Title Page, as authors, one or more persons or entities
-responsible for authorship of the modifications in the Modified
-Version, together with at least five of the principal authors of the
-Document (all of its principal authors, if it has fewer than five),
-unless they release you from this requirement.
-
-@item
-State on the Title page the name of the publisher of the
-Modified Version, as the publisher.
-
-@item
-Preserve all the copyright notices of the Document.
-
-@item
-Add an appropriate copyright notice for your modifications
-adjacent to the other copyright notices.
-
-@item
-Include, immediately after the copyright notices, a license notice
-giving the public permission to use the Modified Version under the
-terms of this License, in the form shown in the Addendum below.
-
-@item
-Preserve in that license notice the full lists of Invariant Sections
-and required Cover Texts given in the Document's license notice.
-
-@item
-Include an unaltered copy of this License.
-
-@item
-Preserve the section Entitled ``History'', Preserve its Title, and add
-to it an item stating at least the title, year, new authors, and
-publisher of the Modified Version as given on the Title Page.  If
-there is no section Entitled ``History'' in the Document, create one
-stating the title, year, authors, and publisher of the Document as
-given on its Title Page, then add an item describing the Modified
-Version as stated in the previous sentence.
-
-@item
-Preserve the network location, if any, given in the Document for
-public access to a Transparent copy of the Document, and likewise
-the network locations given in the Document for previous versions
-it was based on.  These may be placed in the ``History'' section.
-You may omit a network location for a work that was published at
-least four years before the Document itself, or if the original
-publisher of the version it refers to gives permission.
-
-@item
-For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
-the Title of the section, and preserve in the section all the
-substance and tone of each of the contributor acknowledgements and/or
-dedications given therein.
-
-@item
-Preserve all the Invariant Sections of the Document,
-unaltered in their text and in their titles.  Section numbers
-or the equivalent are not considered part of the section titles.
-
-@item
-Delete any section Entitled ``Endorsements''.  Such a section
-may not be included in the Modified Version.
-
-@item
-Do not retitle any existing section to be Entitled ``Endorsements'' or
-to conflict in title with any Invariant Section.
-
-@item
-Preserve any Warranty Disclaimers.
-@end enumerate
-
-If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant.  To do this, add their titles to the
-list of Invariant Sections in the Modified Version's license notice.
-These titles must be distinct from any other section titles.
-
-You may add a section Entitled ``Endorsements'', provided it contains
-nothing but endorsements of your Modified Version by various
-parties---for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.
-
-You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version.  Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity.  If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.
-
-The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.
-
-@item
-COMBINING DOCUMENTS
-
-You may combine the Document with other documents released under this
-License, under the terms defined in section 4 above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice, and that you preserve all their Warranty Disclaimers.
-
-The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy.  If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.
-
-In the combination, you must combine any sections Entitled ``History''
-in the various original documents, forming one section Entitled
-``History''; likewise combine any sections Entitled ``Acknowledgements'',
-and any sections Entitled ``Dedications''.  You must delete all
-sections Entitled ``Endorsements.''
-
-@item
-COLLECTIONS OF DOCUMENTS
-
-You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.
-
-You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.
-
-@item
-AGGREGATION WITH INDEPENDENT WORKS
-
-A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, is called an ``aggregate'' if the copyright
-resulting from the compilation is not used to limit the legal rights
-of the compilation's users beyond what the individual works permit.
-When the Document is included in an aggregate, this License does not
-apply to the other works in the aggregate which are not themselves
-derivative works of the Document.
-
-If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one half of
-the entire aggregate, the Document's Cover Texts may be placed on
-covers that bracket the Document within the aggregate, or the
-electronic equivalent of covers if the Document is in electronic form.
-Otherwise they must appear on printed covers that bracket the whole
-aggregate.
-
-@item
-TRANSLATION
-
-Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section 4.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections.  You may include a
-translation of this License, and all the license notices in the
-Document, and any Warranty Disclaimers, provided that you also include
-the original English version of this License and the original versions
-of those notices and disclaimers.  In case of a disagreement between
-the translation and the original version of this License or a notice
-or disclaimer, the original version will prevail.
-
-If a section in the Document is Entitled ``Acknowledgements'',
-``Dedications'', or ``History'', the requirement (section 4) to Preserve
-its Title (section 1) will typically require changing the actual
-title.
-
-@item
-TERMINATION
-
-You may not copy, modify, sublicense, or distribute the Document except
-as expressly provided for under this License.  Any other attempt to
-copy, modify, sublicense or distribute the Document is void, and will
-automatically terminate your rights under this License.  However,
-parties who have received copies, or rights, from you under this
-License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-@item
-FUTURE REVISIONS OF THIS LICENSE
-
-The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation 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.  See
-@uref{http://www.gnu.org/copyleft/}.
-
-Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License ``or any later version'' applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation.  If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation.
-@end enumerate
-
-@page
-@appendixsubsec ADDENDUM: How to use this License for your documents
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and
-license notices just after the title page:
-
-@smallexample
-@group
-  Copyright (C)  @var{year}  @var{your name}.
-  Permission is granted to copy, distribute and/or modify this document
-  under the terms of the GNU Free Documentation License, Version 1.2
-  or any later version published by the Free Software Foundation;
-  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
-  Texts.  A copy of the license is included in the section entitled ``GNU
-  Free Documentation License''.
-@end group
-@end smallexample
-
-If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
-replace the ``with...Texts.'' line with this:
-
-@smallexample
-@group
-    with the Invariant Sections being @var{list their titles}, with
-    the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
-    being @var{list}.
-@end group
-@end smallexample
-
-If you have Invariant Sections without Cover Texts, or some other
-combination of the three, merge those two alternatives to suit the
-situation.
-
-If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License,
-to permit their use in free software.
-
-@c Local Variables:
-@c ispell-local-pdict: "ispell-dict"
-@c End:
-
diff --git a/doc/gpl.texi b/doc/gpl.texi
deleted file mode 100644
index 9903fc8..0000000
--- a/doc/gpl.texi
+++ /dev/null
@@ -1,392 +0,0 @@
-@node Copying
-@unnumbered GNU GENERAL PUBLIC LICENSE
-@center Version 2, June 1991
-
-@c This file is intended to be included in another file.
-
-@display
-Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc.
-51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-@end display
-
-@unnumberedsec Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software---to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  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
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  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.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-@iftex
-@unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-@end iftex
-@ifinfo
-@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-@end ifinfo
-
-@enumerate 0
-@item
-This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The ``Program'', below,
-refers to any such program or work, and a ``work based on the Program''
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term ``modification''.)  Each licensee is addressed as ``you''.
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-@item
-You may copy and distribute 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 and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-@item
-You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-@enumerate a
-@item
-You must cause the modified files to carry prominent notices
-stating that you changed the files and the date of any change.
-
-@item
-You must cause any work that you distribute or publish, that in
-whole or in part contains or is derived from the Program or any
-part thereof, to be licensed as a whole at no charge to all third
-parties under the terms of this License.
-
-@item
-If the modified program normally reads commands interactively
-when run, you must cause it, when started running for such
-interactive use in the most ordinary way, to print or display an
-announcement including an appropriate copyright notice and a
-notice that there is no warranty (or else, saying that you provide
-a warranty) and that users may redistribute the program under
-these conditions, and telling the user how to view a copy of this
-License.  (Exception: if the Program itself is interactive but
-does not normally print such an announcement, your work based on
-the Program is not required to print an announcement.)
-@end enumerate
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-@item
-You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-@enumerate a
-@item
-Accompany it with the complete corresponding machine-readable
-source code, which must be distributed under the terms of Sections
-1 and 2 above on a medium customarily used for software interchange; or,
-
-@item
-Accompany it with a written offer, valid for at least three
-years, to give any third party, for a charge no more than your
-cost of physically performing source distribution, a complete
-machine-readable copy of the corresponding source code, to be
-distributed under the terms of Sections 1 and 2 above on a medium
-customarily used for software interchange; or,
-
-@item
-Accompany it with the information you received as to the offer
-to distribute corresponding source code.  (This alternative is
-allowed only for noncommercial distribution and only if you
-received the program in object code or executable form with such
-an offer, in accord with Subsection b above.)
-@end enumerate
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-@item
-You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-@item
-You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-@item
-Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-@item
-If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-@item
-If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-@item
-The Free Software Foundation may publish revised and/or new versions
-of the 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 a version number of this License which applies to it and ``any
-later version'', you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-@item
-If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-@iftex
-@heading NO WARRANTY
-@end iftex
-@ifinfo
-@center NO WARRANTY
-@end ifinfo
-
-@item
-BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE 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.
-@end enumerate
-
-@iftex
-@heading END OF TERMS AND CONDITIONS
-@end iftex
-@ifinfo
-@center END OF TERMS AND CONDITIONS
-@end ifinfo
-
-@page
-@unnumberedsec Appendix: 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
-convey the exclusion of warranty; and each file should have at least
-the ``copyright'' line and a pointer to where the full notice is found.
-
-@smallexample
-@var{one line to give the program's name and a brief idea of what it does.}
-Copyright (C) @var{yyyy}  @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 2 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, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-@end smallexample
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-@smallexample
-Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author}
-Gnomovision 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.
-@end smallexample
-
-The hypothetical commands @samp{show w} and @samp{show c} should show
-the appropriate parts of the General Public License.  Of course, the
-commands you use may be called something other than @samp{show w} and
-@samp{show c}; they could even be mouse-clicks or menu items---whatever
-suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a ``copyright disclaimer'' for the program, if
-necessary.  Here is a sample; alter the names:
-
-@example
-Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-`Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-@var{signature of Ty Coon}, 1 April 1989
-Ty Coon, President of Vice
-@end example
-
-This 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 Library General
-Public License instead of this License.
diff --git a/doc/refcard.tex b/doc/refcard.tex
deleted file mode 100644
index 3f2ec9b..0000000
--- a/doc/refcard.tex
+++ /dev/null
@@ -1,512 +0,0 @@
-% Bison Quick Reference
-
-%**start of header
-\newcount\columnsperpage
-
-% This file can be printed with 1 or 2 columns per page (see below).
-% Specify how many you want here.  Nothing else needs to be changed
-% unless you are maintaining the documentation.
-% For printing reference cards to use in books, specify one column
-% per page and reduce to 80%.
-% Note that if columnsperpage is set to 2, there will be a few overfull
-% boxes, but they are not serious. Just uncomment \finalout.
-
-\columnsperpage=1
-
-% comment out this line if you want page numbers to appear.
-\nopagenumbers
-
-\def\finalout{\overfullrule=0pt}
-%\finalout
-
-% Copyright (c) 1998, 2001  Free Software Foundation, Inc.
-%
-% This file is part of Bison.
-%
-% Bison is free software; you can redistribute them and/or modify them
-% 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.
-%
-% Bison 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 either Flex or Bison; see the file COPYING.  If not, write
-% to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-% Boston, MA 02110-1301, USA.
-%
-% This file is intended to be processed by plain TeX (TeX82).
-%
-% The final reference card has two columns:
-% This file can be used to produce it in any of three ways:
-% 1 column per page
-%    produces two separate pages, each of which needs to be reduced to 80%.
-%    This gives the best resolution.
-% 2 columns per page
-%    produces a single page.
-%    You will still need to cut and paste.
-% Which mode to use is controlled by setting \columnsperpage above.
-%
-% Authors:
-%  Brendan Kehoe
-%  UUCP: widener!brendan
-%  Internet: brendan@cs.widener.edu
-%
-%  Gavin Nicol
-%  Internet: nick@nsis.cl.co.jp
-%
-% This refcard format was created by Steve Gildea.
-%
-% Thanks to Paul Rubin, Bob Chassell, Len Tower, and Richard Mlynarik
-% for their many good ideas.
-
-% We only change the following to change the version numbers and
-% such.
-
-\def\bisonversion{1.31}                    % the bison version
-
-\def\refcardversion{0.5}                   % reference card version
-\def\month{November}                       % month
-\def\year{2001}                            % year
-\def\version{\month\ \year, Bison Refcard Version \refcardversion}
-
-% for copyright notices
-\def\small{\smallfont\textfont2=\smallsy\baselineskip=.8\baselineskip}
-\def\medium{\mediumfont\textfont2=\mediumsy\baselineskip=.8\baselineskip}
-
-\def\copyrightnotice{
-\vskip .15ex plus .25 fill
-\begingroup\medium
-\centerline{Copyright \copyright\ \year\ Free Software Foundation, Inc.}
-\vskip .2\baselineskip
-\centerline{\version}
-\vskip .2\baselineskip
-\centerline{designed by Brendan Kehoe and Gavin Nicol}
-\vskip .2\baselineskip
-\centerline{for Bison \bisonversion}
-
-Permission is granted to make and distribute copies of this card
-provided the copyright notice and this permission notice
-are preserved on all copies.
-\vskip .2\baselineskip
-For information, write to the:
-\vskip .2\baselineskip
-\centerline{Free Software Foundation, Inc.}
-\vskip .2\baselineskip
-\centerline{51 Franklin Street, Fifth Floor}
-\vskip .2\baselineskip
-\centerline{Boston, MA 02110-1301 USA}
-\endgroup}
-
-%%%% smallcopyrightnotice for two column printing on one page.
-\def\smallcopyrightnotice{
-\vskip .15ex plus .25 fill
-\begingroup\small
-\centerline{Copyright \copyright\ \year\ Free Software Foundation, Inc.}
-\vskip .2\baselineskip
-\centerline{\version}
-\vskip .2\baselineskip
-\centerline{designed by Brendan Kehoe and Gavin Nicol}
-\vskip .2\baselineskip
-\centerline{for Bison \bisonversion}
-
-Permission is granted to make and distribute copies of this card
-provided the copyright notice and this permission notice
-are preserved on all copies.
-\vskip .2\baselineskip
-For information, write to the:
-\vskip .2\baselineskip
-\centerline{Free Software Foundation, Inc.}
-\vskip .2\baselineskip
-\centerline{51 Franklin Street, Fifth Floor}
-\vskip .2\baselineskip
-\centerline{Boston, MA 02110-1301 USA}
-\endgroup}
-
-% make \bye not \outer so that the \def\bye in the \else clause below
-% can be scanned without complaint.
-\def\bye{\par\vfill\supereject\end}
-
-\newdimen\intercolumnskip
-\newbox\columna
-\newbox\columnb
-
-\def\ncolumns{\the\columnsperpage}
-
-\message{[\ncolumns\space
-  column\if 1\ncolumns\else s\fi\space per page]}
-
-\def\scaledmag#1{ scaled \magstep #1}
-
-% This multi-way format was designed by Stephen Gildea
-% October 1986.
-\if 1\ncolumns
-  \hsize 4in
-  \vsize 10in
-% We want output .3 inch *from top of paper edge*; i.e. -.7in from TeX default
-  \voffset -.7in % Comment out for xdvi viewing; include for printing.
-  \font\titlefont=\fontname\tenbf \scaledmag3
-  \font\headingfont=\fontname\tenbf \scaledmag2
-  \font\smallfont=cmr6
-  \font\smallsy=cmsy6
-  \font\mediumfont=cmr10
-  \font\mediumsy=cmsy10
-
-
-% two lines below commented out in Yet Another Attempt to eliminate
-% page numbers from the output.
-  \footline{\hss}
-% \footline{\hss\folio}
-  \def\makefootline{\baselineskip10pt\hsize6.5in\line{\the\footline}}
-\else
-  \hsize 3.2in
-  \vsize 7.95in
-  \hoffset -.75in
-  \voffset -.745in
-  \font\titlefont=cmbx10 \scaledmag2
-  \font\headingfont=cmbx10 \scaledmag1
-  \font\smallfont=cmr6
-  \font\smallsy=cmsy6
-  \font\eightrm=cmr8
-  \font\eightbf=cmbx8
-  \font\eightit=cmti8
-  \font\eighttt=cmtt8
-  \font\eightsy=cmsy8
-  \textfont0=\eightrm
-  \textfont2=\eightsy
-  \def\rm{\eightrm}
-  \def\bf{\eightbf}
-  \def\it{\eightit}
-  \def\tt{\eighttt}
-%%%% Reduce skip from .8 to .75 to permit printing on two pages.
-  \normalbaselineskip=.75\normalbaselineskip
-  \normallineskip=.75\normallineskip
-  \normallineskiplimit=.75\normallineskiplimit
-  \normalbaselines\rm           %make definitions take effect
-
-  \if 2\ncolumns
-    \let\maxcolumn=b
-    \footline{\hss\rm\folio\hss}
-    \def\makefootline{\vskip 2in \hsize=6.86in\line{\the\footline}}
-  \font\mediumfont=cmr10
-  \font\mediumsy=cmsy10
-
-% Leave 3 column code here in case size increases.
-  \else \if 3\ncolumns
-    \let\maxcolumn=c
-    \nopagenumbers
-  \font\mediumfont=cmr10
-  \font\mediumsy=cmsy10
-
-  \else
-    \errhelp{You must set \columnsperpage equal to 1, 2, or 3.}
-    \errmessage{Illegal number of columns per page}
-  \fi\fi
-
-  \intercolumnskip=.46in
-  \def\abc{a}
-  \output={%
-      % This next line is useful when designing the layout.
-      %\immediate\write16{Column \folio\abc\space starts with \firstmark}
-      \if \maxcolumn\abc \multicolumnformat \global\def\abc{a}
-      \else\if a\abc
-        \global\setbox\columna\columnbox \global\def\abc{b}
-        %% in case we never use \columnb (two-column mode)
-        \global\setbox\columnb\hbox to -\intercolumnskip{}
-      \else
-        \global\setbox\columnb\columnbox \global\def\abc{c}\fi\fi}
-  \def\multicolumnformat{\shipout\vbox{\makeheadline
-      \hbox{\box\columna\hskip\intercolumnskip
-        \box\columnb\hskip\intercolumnskip\columnbox}
-      \makefootline}\advancepageno}
-  \def\columnbox{\leftline{\pagebody}}
-
-  \def\bye{\par\vfill\supereject
-    \if a\abc \else\null\vfill\eject\fi
-    \if a\abc \else\null\vfill\eject\fi
-    \end}
-\fi
-
-% we won't be using math mode much, so redefine some of the characters
-% we might want to talk about
-\catcode`\^=12
-\catcode`\_=12
-
-\chardef\\=`\\
-\chardef\{=`\{
-\chardef\}=`\}
-
-\hyphenation{mini-buf-fer}
-
-\parindent 0pt
-% \parskip 1ex plus .5ex minus .5ex
-\parskip 0.5ex plus .25ex minus .25ex
-
-\outer\def\newcolumn{\vfill\eject}
-
-\outer\def\title#1{{\titlefont\centerline{#1}}\vskip 1ex plus .5ex}
-
-\outer\def\section#1{\par\filbreak
-  \vskip 1.5ex plus 1ex minus 1ex {\headingfont #1}\mark{#1}%
-  \vskip 1ex plus .5ex minus 0.75ex}
-
-\newdimen\keyindent
-
-\def\beginindentedkeys{\keyindent=1em}
-\def\endindentedkeys{\keyindent=0em}
-\endindentedkeys
-
-\def\paralign{\vskip\parskip\halign}
-
-\def\<#1>{$\langle${\rm #1}$\rangle$}
-
-\def\kbd#1{{\tt#1}\null}        %\null so not an abbrev even if period follows
-
-\def\beginexample{\par\leavevmode\begingroup
-  \obeylines\obeyspaces\parskip0pt\tt}
-{\obeyspaces\global\let =\ }
-\def\endexample{\endgroup}
-\def\begincexample{%
-  \par\leavevmode\begingroup%
-  \obeylines\obeyspaces%
-  % bpk--added indentation
-  \advance\leftskip.25truein
-%  \parskip0pt%
-  \tt}
-{\obeyspaces\global\let =\ }
-\def\endcexample{\endgroup}
-
-%%%%% Prime definition of key; redefined below to prevent overful hboxes
-
-\def\key#1#2{\leavevmode\hbox to \hsize
-  {\vtop {\hsize=.67\hsize \rightskip=1em #1}
-  \kbd{#2}\hfil}}
-
-\newbox\metaxbox
-\setbox\metaxbox\hbox{\kbd{M-x }}
-\newdimen\metaxwidth
-\metaxwidth=\wd\metaxbox
-
-\def\metax#1#2{\leavevmode\hbox to \hsize{\hbox to .75\hsize
-  {\hskip\keyindent\relax#1\hfil}%
-  \hskip -\metaxwidth minus 1fil
-  \kbd{#2}\hfil}}
-
-\def\threecol#1#2#3{\hskip\keyindent\relax#1\hfil&\kbd{#2}\quad
-  &\kbd{#3}\quad\cr}
-
-%**end of header
-
-%     ************
-%     **  BISON **
-%     ************
-
-\title{Bison Quick Reference}
-
-\section{Starting Bison}
-%***********************
-
-To use Bison, type: \kbd{bison {\it filename}}
-
-Options can be used as: \kbd{bison {\it options} {\it filename}}
-
-\section{Command Line Options}
-%*****************************
-
-\key{Display usage information.}                         {-h}
-\key{Display version information.}                       {-V}
-\key{Generate token and {\tt YYSTYPE} definitions.}      {-d}
-\key{Prepend a prefix to external symbols.}              {-p {\it prefix}}
-\key{Don't put {\tt \#line} directives in the parser.}   {-l}
-\key{Specify the output file.}                           {-o {\it filename}}
-\key{Debug or {\it trace} mode.}                      {-t}
-\key{Verbose description of the parser.}                 {-v}
-\key{Emulate {\tt yacc} (generate {\tt y.tab.*} files).} {-y}
-
-\vskip .10truein
-{\bf Note:} The token and {\tt YYSTYPE} definitions are generated
-to a file called {\tt y.tab.h} if the {\tt -y} option is used,
-otherwise it will have the format {\tt {\it name}.tab.h}, where
-{\it name} is the leading part of the parser definition filename.
-
-\section{Definitions}
-%********************
-
-\key{Declare a terminal symbol.}{\%token <{\it t\/}>
-      {\it n}}
-
-\key{Declare a terminal symbol, and define its association.}
-      {{\it association} <{\it t\/}> {\it n}}
-
-\vskip .2\baselineskip
-\key{Generate a reentrant (pure) parser.}
-      {\%pure_parser}
-
-\key{Define the union of all data types used in the parser.}
-      {\%union\{{\it field list}\} }
-
-\vskip .2\baselineskip
-\key{Tell {\tt bison} where to start parsing.}
-      {\%start {\it m}}
-
-\key{Tell {\tt bison} the data type of symbols.}
-      {\%type <{\it t\/}> {\it s1}\dots{\it sn}}
-
-\vskip .10truein
-
-In the above, {\it t} is a {\it type} defined in the {\tt \%union}
-definition,  {\it n} is a {\it terminal} symbol name, {\it m} is a
-{\it non-terminal} symbol name, and {\it association} can be one of
-{\tt \%left}, {\tt \%right}, or {\tt \%nonassoc}.
-
-\vskip .10truein
-
-The {\tt <{\it t\/}>} after {\tt \%token, \%left, \%right} and {\tt
-  \%nonassoc} is optional. Additionally, precedence may be overridden
-in the rules with {\tt \%prec} commands.
-
-\section{Parser Definition Files}
-%*********************************
-
-The general form for a parser definition is:
-
-\begincexample
-\{\%
-   /* Initial C code.  */
-\%\}
-
- {\it Token and type definitions}
-
-\%\%
-
-   Rule definition 1
-          \vdots
-   Rule definition {\it n}
-
-\%\%
-
-  /* Other C code.  */
-\endcexample
-
-
-% Decrease standard baselineskip for the second page
- \baselineskip = .9\baselineskip
-
-\section {Rule definitions}
-%**************************
-
-Rules take the form:
-
-\vskip -\baselineskip
-\beginexample
-     non-terminal : {\it statement} 1
-                  | {\it statement} 2
-                      \vdots
-                  | {\it statement n}
-                  ;
-\endexample
-
-Where {\it statements} can be either empty, or contain
-a mixture of C code (enclosed in {\tt \{...\}}), and the
-symbols that make up the non-terminal. For example:
-
-\vskip -\baselineskip
-\beginexample
-     expression : number '$+$' number \{ \$\$ $=$ \$1 $+$ \$3 \}
-                | number '$-$' number \{ \$\$ $=$ \$1 $-$ \$3 \}
-                | number '$/$' number \{ \$\$ $=$ \$1 $/$ \$3 \}
-                | number '$*$' number \{ \$\$ $=$ \$1 $*$ \$3 \}
-                ;
-\endexample
-
-For altering the precedence of a symbol use:
-\vskip -\baselineskip
-
-\beginexample
-     \%prec name
-\endexample
-
-For example:
-\vskip -\baselineskip
-\beginexample
-     foo : gnu bar gnu      \%prec bar
-         ;
-\endexample
-
-\section{Grammar Variables and Symbols}
-%**************************************
-
-\key{Recognize an error \& continue parsing.}{error}
-\key{Access data associated with a symbol.}  {\$\$, \$0\dots\${\it n}}
-\key{Access a field of the  data union.}    {\$\$.{\it t},
-                                     \$0.{\it t}\dots\${\it n}.{\it t}}
-\key{Access symbol's location.}             {@\$, @0\dots@{\it n}}
-\key{Access data's line location.}          {@{\it x}.{\it line\_spec}}
-\key{Access data's column location.}        {@{\it x}.{\it column\_spec}}
-
-
-\vskip .10truein
-%
-Where {\it t} is a type defined in the {\tt \%union}, {\it n} is a
-number, {\it x} is a number or \$, {\it line\_spec} one of {\tt
-  first_line} and {\tt last_line}, and {\it column\_spec} is specified
-as either {\tt first_column} or {\tt last_column}.
-
-\section {Variables and Types}
-%*****************************
-
-\key{Current look ahead token.}                {yychar}
-\key{Debug mode flag.}                         {yydebug}
-\key{Data associated with the current token.}  {yylval}
-\key{Source position of current token.}        {yylloc}
-\key{Number of errors encountered.}            {yynerrs}
-\key{Position information type.}               {YYLTYPE}
-\key{Data type associated with symbols.}       {YYSTYPE}
-
-\section {Functions}
-%*******************
-
-% Redefine to prevent overfull hboxes
-\def\key#1#2{\leavevmode\hbox to \hsize
-  {\vtop {\hsize=.625\hsize \rightskip=1em #1}
-  \kbd{#2}\hfil}}
-
-\key{User defined error handler.}         {int yyerror(char *)}
-\key{User defined lexical analyzer.}      {int yylex()}
-\key{The grammar parser.}                 {int yyparse()}
-
-% Return to previous size
-\def\key#1#2{\leavevmode\hbox to \hsize
-  {\vtop {\hsize=.67\hsize \rightskip=1em #1}
-  \kbd{#2}\hfil}}
-
-\section{Macros}
-%***************
-
-\key{Quit parsing immediately. Return 1.}           {YYABORT}
-\key{Quit parsing immediately. Return 0.}           {YYACCEPT}
-\key{Pretend a syntax error occurred.}              {YYERROR}
-\key{Value in {\tt yychar} if no look-ahead token.} {YYEMPTY}
-\key{Clear previous look ahead token.}              {yyclearin}
-\key{Recover normally from an error.}               {yyerrok}
-
-% **************
-% ** The end  **
-% **************
-
-\vskip \baselineskip
-\if 1\ncolumns
-\copyrightnotice
-\else
-\smallcopyrightnotice
-\fi
-
-\bye
-
-
-% Local variables:
-% compile-command: "tex refcard"
-% End:
diff --git a/doc/stamp-vti b/doc/stamp-vti
deleted file mode 100644
index e3b7603..0000000
--- a/doc/stamp-vti
+++ /dev/null
@@ -1,4 +0,0 @@
-@set UPDATED 30 May 2006
-@set UPDATED-MONTH May 2006
-@set EDITION 2.3
-@set VERSION 2.3
diff --git a/doc/version.texi b/doc/version.texi
deleted file mode 100644
index e3b7603..0000000
--- a/doc/version.texi
+++ /dev/null
@@ -1,4 +0,0 @@
-@set UPDATED 30 May 2006
-@set UPDATED-MONTH May 2006
-@set EDITION 2.3
-@set VERSION 2.3
diff --git a/examples/Makefile b/examples/Makefile
deleted file mode 100644
index 6450a83..0000000
--- a/examples/Makefile
+++ /dev/null
@@ -1,514 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# examples/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-
-srcdir = .
-top_srcdir = ..
-
-pkgdatadir = $(datadir)/bison
-pkglibdir = $(libdir)/bison
-pkgincludedir = $(includedir)/bison
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = /usr/bin/install -c
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-unknown-linux-gnu
-host_triplet = x86_64-unknown-linux-gnu
-subdir = examples
-DIST_COMMON = $(dist_noinst_SCRIPTS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-SCRIPTS = $(dist_noinst_SCRIPTS)
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-exec-recursive install-info-recursive \
-	install-recursive installcheck-recursive installdirs-recursive \
-	pdf-recursive ps-recursive uninstall-info-recursive \
-	uninstall-recursive
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = calc++
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run aclocal-1.9
-AMDEP_FALSE = #
-AMDEP_TRUE = 
-AMTAR = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run tar
-AUTOCONF = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoconf
-AUTOHEADER = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoheader
-AUTOM4TE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autom4te
-AUTOMAKE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run automake-1.9
-AWK = gawk
-BISON_CXX_WORKS = :
-BISON_CXX_WORKS_FALSE = #
-BISON_CXX_WORKS_TRUE = 
-BISON_LOCALEDIR = /usr/share/locale
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPP = gcc -E
-CPPFLAGS = 
-CXX = g++
-CXXDEPMODE = depmode=gcc3
-CXXFLAGS = -g -O2
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = grep -E
-EXEEXT = 
-GCC = yes
-GETOPT_H = 
-GMSGFMT = /usr/bin/msgfmt
-HAVE__BOOL = 1
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
-INTLLIBS = 
-INTL_MACOSX_LIBS = 
-LDFLAGS = 
-LEX = flex
-LEXLIB = -lfl
-LEX_OUTPUT_ROOT = lex.yy
-LIBICONV = -liconv
-LIBINTL = 
-LIBOBJS =  dirname$U.o exitfail$U.o hard-locale$U.o hash$U.o quote$U.o quotearg$U.o fopen-safer$U.o dup-safer$U.o fd-safer$U.o pipe-safer$U.o xmalloc$U.o
-LIBS = 
-LTLIBICONV = -liconv
-LTLIBINTL = 
-LTLIBOBJS =  dirname$U.lo exitfail$U.lo hard-locale$U.lo hash$U.lo quote$U.lo quotearg$U.lo fopen-safer$U.lo dup-safer$U.lo fd-safer$U.lo pipe-safer$U.lo xmalloc$U.lo
-M4 = /usr/bin/m4
-MAKEINFO = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run makeinfo
-MKINSTALLDIRS = $(top_builddir)/build-aux/mkinstalldirs
-MSGFMT = /usr/bin/msgfmt
-MSGMERGE = /usr/bin/msgmerge
-O0CFLAGS = -g 
-O0CXXFLAGS = -g 
-OBJEXT = o
-PACKAGE = bison
-PACKAGE_BUGREPORT = bug-bison@gnu.org
-PACKAGE_NAME = GNU Bison
-PACKAGE_STRING = GNU Bison 2.3
-PACKAGE_TARNAME = bison
-PACKAGE_VERSION = 2.3
-PATH_SEPARATOR = :
-POSUB = po
-RANLIB = ranlib
-SET_MAKE = 
-SHELL = /bin/sh
-STDBOOL_H = 
-STRIP = 
-UNISTD_H = 
-USE_NLS = yes
-VALGRIND = 
-VERSION = 2.3
-WARNING_CFLAGS = 
-WARNING_CXXFLAGS = 
-WERROR_CFLAGS = 
-XGETTEXT = /usr/bin/xgettext
-YACC = bison -y
-YACC_LIBRARY = liby.a
-YACC_SCRIPT = yacc
-ac_ct_CC = gcc
-ac_ct_CXX = g++
-ac_ct_RANLIB = ranlib
-ac_ct_STRIP = 
-aclocaldir = ${datadir}/aclocal
-am__fastdepCC_FALSE = #
-am__fastdepCC_TRUE = 
-am__fastdepCXX_FALSE = #
-am__fastdepCXX_TRUE = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = ${AMTAR} chof - "$$tardir"
-am__untar = ${AMTAR} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-unknown-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = unknown
-datadir = ${prefix}/share
-exec_prefix = ${prefix}
-host = x86_64-unknown-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = unknown
-includedir = ${prefix}/include
-infodir = ${prefix}/info
-install_sh = /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localstatedir = ${prefix}/var
-mandir = ${prefix}/man
-mkdir_p = mkdir -p --
-oldincludedir = /usr/include
-prefix = /home/phanna/src/bison
-program_transform_name = s,x,x,
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-sysconfdir = ${prefix}/etc
-target_alias = 
-SUBDIRS = calc++
-dist_noinst_SCRIPTS = extexi
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  examples/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  examples/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-uninstall-info-am:
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
-	@failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(mkdir_p) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(SCRIPTS)
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-recursive
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-info-am
-
-uninstall-info: uninstall-info-recursive
-
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
-	clean clean-generic clean-recursive ctags ctags-recursive \
-	distclean distclean-generic distclean-recursive distclean-tags \
-	distdir dvi dvi-am html html-am info info-am install \
-	install-am install-data install-data-am install-exec \
-	install-exec-am install-info install-info-am install-man \
-	install-strip installcheck installcheck-am installdirs \
-	installdirs-am maintainer-clean maintainer-clean-generic \
-	maintainer-clean-recursive mostlyclean mostlyclean-generic \
-	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/examples/Makefile.am b/examples/Makefile.am
deleted file mode 100644
index a51ba98..0000000
--- a/examples/Makefile.am
+++ /dev/null
@@ -1,23 +0,0 @@
-## Process this file with automake to produce Makefile.in -*-Makefile-*-
-## Copyright (C) 2005 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 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, write to the Free Software
-## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-## 02110-1301  USA
-
-if BISON_CXX_WORKS
-SUBDIRS = calc++
-endif
-
-dist_noinst_SCRIPTS = extexi
diff --git a/examples/Makefile.in b/examples/Makefile.in
deleted file mode 100644
index 5daa51c..0000000
--- a/examples/Makefile.in
+++ /dev/null
@@ -1,514 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = examples
-DIST_COMMON = $(dist_noinst_SCRIPTS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-SCRIPTS = $(dist_noinst_SCRIPTS)
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-exec-recursive install-info-recursive \
-	install-recursive installcheck-recursive installdirs-recursive \
-	pdf-recursive ps-recursive uninstall-info-recursive \
-	uninstall-recursive
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = calc++
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOM4TE = @AUTOM4TE@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BISON_CXX_WORKS = @BISON_CXX_WORKS@
-BISON_CXX_WORKS_FALSE = @BISON_CXX_WORKS_FALSE@
-BISON_CXX_WORKS_TRUE = @BISON_CXX_WORKS_TRUE@
-BISON_LOCALEDIR = @BISON_LOCALEDIR@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-GCC = @GCC@
-GETOPT_H = @GETOPT_H@
-GMSGFMT = @GMSGFMT@
-HAVE__BOOL = @HAVE__BOOL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTLLIBS = @INTLLIBS@
-INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
-LDFLAGS = @LDFLAGS@
-LEX = @LEX@
-LEXLIB = @LEXLIB@
-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
-LIBICONV = @LIBICONV@
-LIBINTL = @LIBINTL@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LTLIBICONV = @LTLIBICONV@
-LTLIBINTL = @LTLIBINTL@
-LTLIBOBJS = @LTLIBOBJS@
-M4 = @M4@
-MAKEINFO = @MAKEINFO@
-MKINSTALLDIRS = @MKINSTALLDIRS@
-MSGFMT = @MSGFMT@
-MSGMERGE = @MSGMERGE@
-O0CFLAGS = @O0CFLAGS@
-O0CXXFLAGS = @O0CXXFLAGS@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-POSUB = @POSUB@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STDBOOL_H = @STDBOOL_H@
-STRIP = @STRIP@
-UNISTD_H = @UNISTD_H@
-USE_NLS = @USE_NLS@
-VALGRIND = @VALGRIND@
-VERSION = @VERSION@
-WARNING_CFLAGS = @WARNING_CFLAGS@
-WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
-WERROR_CFLAGS = @WERROR_CFLAGS@
-XGETTEXT = @XGETTEXT@
-YACC = @YACC@
-YACC_LIBRARY = @YACC_LIBRARY@
-YACC_SCRIPT = @YACC_SCRIPT@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-aclocaldir = @aclocaldir@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-@BISON_CXX_WORKS_TRUE@SUBDIRS = calc++
-dist_noinst_SCRIPTS = extexi
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  examples/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  examples/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-uninstall-info-am:
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
-	@failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(mkdir_p) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(SCRIPTS)
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-recursive
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-info-am
-
-uninstall-info: uninstall-info-recursive
-
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
-	clean clean-generic clean-recursive ctags ctags-recursive \
-	distclean distclean-generic distclean-recursive distclean-tags \
-	distdir dvi dvi-am html html-am info info-am install \
-	install-am install-data install-data-am install-exec \
-	install-exec-am install-info install-info-am install-man \
-	install-strip installcheck installcheck-am installdirs \
-	installdirs-am maintainer-clean maintainer-clean-generic \
-	maintainer-clean-recursive mostlyclean mostlyclean-generic \
-	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/examples/extexi b/examples/extexi
deleted file mode 100644
index 56a50c8..0000000
--- a/examples/extexi
+++ /dev/null
@@ -1,138 +0,0 @@
-# Extract all examples from the manual source.            -*- AWK -*-
-
-# This file is part of GNU Bison
-# Copyright 1992, 2000, 2001, 2005, 2006 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 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, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-# 02111-1307  USA
-
-# This script is for use with any Awk that conforms to POSIX.
-# It was derived from a similar script tests/generate.awk in GNU m4.
-#
-# Usage: extexi input-file.texi ... -- [FILES to extract]
-BEGIN {
-  if (!output_dir)
-    output_dir = ".";
-  for (argc = 1; argc < ARGC; ++argc)
-    if (ARGV[argc] == "--")
-      break;
-  for (i = argc + 1; i < ARGC; ++i)
-    file_wanted[ARGV[i]] = 1;
-  ARGC = argc;
-}
-
-/^@node / {
-  if (seq > 0)
-    print "AT_CLEANUP";
-
-  split ($0, tmp, ",");
-  node = substr(tmp[1], 7);
-  seq = 0;
-}
-
-/^@comment file: / {
-  if (!file_wanted[$3])
-    message("ignoring " $3);
-  else
-    {
-      message("extracting " $3);
-      file = $3;
-    }
-}
-
-/^@example$/, /^@end example$/ {
-  if (!file)
-    next;
-
-  if ($0 ~ /^@example$/)
-    {
-      input = files_output[file] ? "\n" : "";
-
-      # FNR is starting at 0 instead of 1, and
-      # #line report the line number of the *next* line.
-      # => + 2.
-      # Note that recent Bison support it, but not Flex.
-      if (file ~ /\.[chy]*$/)
-	input = "#line " (FNR + 1) " \"" FILENAME "\"\n";
-      next;
-    }
-
-  if ($0 ~ /^@end example$/)
-    {
-      if (input == "")
-	fatal("no contents: " file);
-
-      input = normalize(input);
-      # No spurious end of line: use printf.
-      if (files_output[file])
-	# The parens around the output file seem to be required
-        # by awk on Mac OS X Tiger (darwin 8.4.6).
-        printf ("%s", input) >> (output_dir "/" file);
-      else
-	printf ("%s", input) > (output_dir "/" file);
-      close (output_dir "/" file);
-      files_output[file] = 1;
-
-      file = input = "";
-      next;
-    }
-
-  input = input $0 "\n";
-}
-
-
-# We have to handle CONTENTS line per line, since anchors in AWK are
-# referring to the whole string, not the lines.
-function normalize(contents,    i, lines, n, line, res) {
-  # Remove the Texinfo tags.
-  n = split (contents, lines, "\n");
-  # We don't want the last field which empty: it's behind the last \n.
-  for (i = 1; i < n; ++i)
-    {
-      line = lines[i];
-
-      # Whole line commands.
-      if (line ~ /^@(c |comment|dots|end (ignore|group)|ignore|group)/)
-	# Gperf accepts empty lines as valid input!!!
-	if (file ~ /\.gperf$/)
-	  continue;
-	else
-	  line = "";
-
-      gsub (/^@result\{\}/, "", line);
-      gsub (/^@error\{\}/,  "", line);
-      gsub ("@[{]", "{", line);
-      gsub ("@}", "}", line);
-      gsub ("@@", "@", line);
-      gsub ("@comment.*", "", line);
-
-      res = res line "\n";
-    }
-  return res;
-}
-
-
-function message(msg) {
-  if (! message_printed[msg])
-    {
-      print "extexi: " msg > "/dev/stderr";
-      message_printed[msg] = 1;
-    }
-}
-
-function fatal(msg) {
-  message(msg);
-  exit 1
-}
diff --git a/lib/Makefile b/lib/Makefile
deleted file mode 100644
index 25490d3..0000000
--- a/lib/Makefile
+++ /dev/null
@@ -1,623 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# lib/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-
-srcdir = .
-top_srcdir = ..
-
-pkgdatadir = $(datadir)/bison
-pkglibdir = $(libdir)/bison
-pkgincludedir = $(includedir)/bison
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = /usr/bin/install -c
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-unknown-linux-gnu
-host_triplet = x86_64-unknown-linux-gnu
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(srcdir)/gnulib.mk dirname.c dirname.h dup-safer.c error.c \
-	error.h exitfail.c exitfail.h fd-safer.c fopen-safer.c \
-	getopt.c getopt1.c hard-locale.c hard-locale.h hash.c hash.h \
-	malloc.c obstack.c obstack.h pipe-safer.c quote.c quote.h \
-	quotearg.c quotearg.h stdio--.h stdio-safer.h stpcpy.c \
-	strdup.c strdup.h strerror.c strndup.c strndup.h strnlen.c \
-	strnlen.h strtol.c strtoul.c strverscmp.c strverscmp.h \
-	unistd--.h unistd-safer.h unlocked-io.h xalloc.h xmalloc.c
-subdir = lib
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-am__installdirs = "$(DESTDIR)$(libdir)"
-libLIBRARIES_INSTALL = $(INSTALL_DATA)
-LIBRARIES = $(lib_LIBRARIES) $(noinst_LIBRARIES)
-AR = ar
-ARFLAGS = cru
-libbison_a_AR = $(AR) $(ARFLAGS)
-am__DEPENDENCIES_1 =  dirname$U.o exitfail$U.o hard-locale$U.o hash$U.o quote$U.o quotearg$U.o fopen-safer$U.o dup-safer$U.o fd-safer$U.o pipe-safer$U.o xmalloc$U.o
-am__objects_1 = abitset.$(OBJEXT) bitset.$(OBJEXT) \
-	bitset_stats.$(OBJEXT) bitsetv.$(OBJEXT) ebitset.$(OBJEXT) \
-	lbitset.$(OBJEXT) vbitset.$(OBJEXT)
-am__objects_2 = bitsetv-print.$(OBJEXT)
-am__objects_3 = timevar.$(OBJEXT)
-am__objects_4 = get-errno.$(OBJEXT) subpipe.$(OBJEXT) $(am__objects_1) \
-	$(am__objects_2) $(am__objects_3) argmatch.$(OBJEXT) \
-	basename.$(OBJEXT) stripslash.$(OBJEXT) mbswidth.$(OBJEXT) \
-	xalloc-die.$(OBJEXT) xstrndup.$(OBJEXT)
-am_libbison_a_OBJECTS = $(am__objects_4)
-libbison_a_OBJECTS = $(am_libbison_a_OBJECTS)
-liby_a_AR = $(AR) $(ARFLAGS)
-liby_a_LIBADD =
-am_liby_a_OBJECTS = main.$(OBJEXT) yyerror.$(OBJEXT)
-liby_a_OBJECTS = $(am_liby_a_OBJECTS)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
-am__depfiles_maybe = depfiles
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(libbison_a_SOURCES) $(liby_a_SOURCES)
-DIST_SOURCES = $(libbison_a_SOURCES) $(liby_a_SOURCES)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run aclocal-1.9
-AMDEP_FALSE = #
-AMDEP_TRUE = 
-AMTAR = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run tar
-AUTOCONF = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoconf
-AUTOHEADER = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoheader
-AUTOM4TE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autom4te
-AUTOMAKE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run automake-1.9
-AWK = gawk
-BISON_CXX_WORKS = :
-BISON_CXX_WORKS_FALSE = #
-BISON_CXX_WORKS_TRUE = 
-BISON_LOCALEDIR = /usr/share/locale
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPP = gcc -E
-CPPFLAGS = 
-CXX = g++
-CXXDEPMODE = depmode=gcc3
-CXXFLAGS = -g -O2
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = grep -E
-EXEEXT = 
-GCC = yes
-GETOPT_H = 
-GMSGFMT = /usr/bin/msgfmt
-HAVE__BOOL = 1
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
-INTLLIBS = 
-INTL_MACOSX_LIBS = 
-LDFLAGS = 
-LEX = flex
-LEXLIB = -lfl
-LEX_OUTPUT_ROOT = lex.yy
-LIBICONV = -liconv
-LIBINTL = 
-LIBOBJS =  dirname$U.o exitfail$U.o hard-locale$U.o hash$U.o quote$U.o quotearg$U.o fopen-safer$U.o dup-safer$U.o fd-safer$U.o pipe-safer$U.o xmalloc$U.o
-LIBS = 
-LTLIBICONV = -liconv
-LTLIBINTL = 
-LTLIBOBJS =  dirname$U.lo exitfail$U.lo hard-locale$U.lo hash$U.lo quote$U.lo quotearg$U.lo fopen-safer$U.lo dup-safer$U.lo fd-safer$U.lo pipe-safer$U.lo xmalloc$U.lo
-M4 = /usr/bin/m4
-MAKEINFO = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run makeinfo
-MKINSTALLDIRS = $(top_builddir)/build-aux/mkinstalldirs
-MSGFMT = /usr/bin/msgfmt
-MSGMERGE = /usr/bin/msgmerge
-O0CFLAGS = -g 
-O0CXXFLAGS = -g 
-OBJEXT = o
-PACKAGE = bison
-PACKAGE_BUGREPORT = bug-bison@gnu.org
-PACKAGE_NAME = GNU Bison
-PACKAGE_STRING = GNU Bison 2.3
-PACKAGE_TARNAME = bison
-PACKAGE_VERSION = 2.3
-PATH_SEPARATOR = :
-POSUB = po
-RANLIB = ranlib
-SET_MAKE = 
-SHELL = /bin/sh
-STDBOOL_H = 
-STRIP = 
-UNISTD_H = 
-USE_NLS = yes
-VALGRIND = 
-VERSION = 2.3
-WARNING_CFLAGS = 
-WARNING_CXXFLAGS = 
-WERROR_CFLAGS = 
-XGETTEXT = /usr/bin/xgettext
-YACC = bison -y
-YACC_LIBRARY = liby.a
-YACC_SCRIPT = yacc
-ac_ct_CC = gcc
-ac_ct_CXX = g++
-ac_ct_RANLIB = ranlib
-ac_ct_STRIP = 
-aclocaldir = ${datadir}/aclocal
-am__fastdepCC_FALSE = #
-am__fastdepCC_TRUE = 
-am__fastdepCXX_FALSE = #
-am__fastdepCXX_TRUE = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = ${AMTAR} chof - "$$tardir"
-am__untar = ${AMTAR} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-unknown-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = unknown
-datadir = ${prefix}/share
-exec_prefix = ${prefix}
-host = x86_64-unknown-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = unknown
-includedir = ${prefix}/include
-infodir = ${prefix}/info
-install_sh = /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localstatedir = ${prefix}/var
-mandir = ${prefix}/man
-mkdir_p = mkdir -p --
-oldincludedir = /usr/include
-prefix = /home/phanna/src/bison
-program_transform_name = s,x,x,
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-sysconfdir = ${prefix}/etc
-target_alias = 
-AM_CFLAGS = $(WARNING_CFLAGS)
-BUILT_SOURCES = $(GETOPT_H) $(STDBOOL_H) $(UNISTD_H)
-EXTRA_DIST = getopt_.h getopt_int.h stdbool_.h
-MOSTLYCLEANFILES = getopt.h getopt.h-t stdbool.h stdbool.h-t unistd.h
-lib_LIBRARIES = $(YACC_LIBRARY)
-EXTRA_LIBRARIES = liby.a
-noinst_LIBRARIES = libbison.a
-liby_a_SOURCES = main.c yyerror.c
-libbison_a_SOURCES = $(lib_SOURCES)
-
-# This file is generated automatically by "bootstrap".
-
-# This is for those projects which use "gettextize --intl" to put a source-code
-# copy of libintl into their package. In such projects, every Makefile.am needs
-# -I$(top_builddir)/intl, so that <libintl.h> can be found in this directory.
-# For the Makefile.ams in other directories it is the maintainer's
-# responsibility; for the one from gnulib we do it here.
-# This option has no effect when the user disables NLS (because then the intl
-# directory contains no libintl.h file) or when the project does not use
-# "gettextize --intl".
-# (commented out by bootstrap) AM_CPPFLAGS += -I$(top_builddir)/intl
-lib_SOURCES = get-errno.h get-errno.c subpipe.h subpipe.c \
-	$(bitsets_sources) $(additional_bitsets_sources) \
-	$(timevars_sources) argmatch.h argmatch.c basename.c \
-	stripslash.c exit.h gettext.h mbswidth.h mbswidth.c stpcpy.h \
-	verify.h xalloc-die.c xstrndup.h xstrndup.c
-
-# Implementation of bitsets
-bitsets_sources = \
-  abitset.c abitset.h bbitset.h bitset.c bitset.h bitset_stats.c	\
-  bitset_stats.h bitsetv.c bitsetv.h ebitset.c ebitset.h lbitset.c	\
-  lbitset.h libiberty.h vbitset.c vbitset.h
-
-
-# Additional bitset operations.
-additional_bitsets_sources = \
-	bitsetv-print.h bitsetv-print.c
-
-
-# timevars, stolen from GCC.
-timevars_sources = \
-	timevar.h timevar.c timevar.def
-
-libbison_a_LIBADD = $(LIBOBJS) $(ALLOCA)
-libbison_a_DEPENDENCIES = $(libbison_a_LIBADD)
-all: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/gnulib.mk $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  lib/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  lib/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-install-libLIBRARIES: $(lib_LIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
-	@list='$(lib_LIBRARIES)'; for p in $$list; do \
-	  if test -f $$p; then \
-	    f=$(am__strip_dir) \
-	    echo " $(libLIBRARIES_INSTALL) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
-	    $(libLIBRARIES_INSTALL) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
-	  else :; fi; \
-	done
-	@$(POST_INSTALL)
-	@list='$(lib_LIBRARIES)'; for p in $$list; do \
-	  if test -f $$p; then \
-	    p=$(am__strip_dir) \
-	    echo " $(RANLIB) '$(DESTDIR)$(libdir)/$$p'"; \
-	    $(RANLIB) "$(DESTDIR)$(libdir)/$$p"; \
-	  else :; fi; \
-	done
-
-uninstall-libLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LIBRARIES)'; for p in $$list; do \
-	  p=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(libdir)/$$p'"; \
-	  rm -f "$(DESTDIR)$(libdir)/$$p"; \
-	done
-
-clean-libLIBRARIES:
-	-test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES)
-
-clean-noinstLIBRARIES:
-	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
-libbison.a: $(libbison_a_OBJECTS) $(libbison_a_DEPENDENCIES) 
-	-rm -f libbison.a
-	$(libbison_a_AR) libbison.a $(libbison_a_OBJECTS) $(libbison_a_LIBADD)
-	$(RANLIB) libbison.a
-liby.a: $(liby_a_OBJECTS) $(liby_a_DEPENDENCIES) 
-	-rm -f liby.a
-	$(liby_a_AR) liby.a $(liby_a_OBJECTS) $(liby_a_LIBADD)
-	$(RANLIB) liby.a
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-include $(DEPDIR)/dirname.Po
-include $(DEPDIR)/dup-safer.Po
-include $(DEPDIR)/error.Po
-include $(DEPDIR)/exitfail.Po
-include $(DEPDIR)/fd-safer.Po
-include $(DEPDIR)/fopen-safer.Po
-include $(DEPDIR)/getopt.Po
-include $(DEPDIR)/getopt1.Po
-include $(DEPDIR)/hard-locale.Po
-include $(DEPDIR)/hash.Po
-include $(DEPDIR)/malloc.Po
-include $(DEPDIR)/obstack.Po
-include $(DEPDIR)/pipe-safer.Po
-include $(DEPDIR)/quote.Po
-include $(DEPDIR)/quotearg.Po
-include $(DEPDIR)/stpcpy.Po
-include $(DEPDIR)/strdup.Po
-include $(DEPDIR)/strerror.Po
-include $(DEPDIR)/strndup.Po
-include $(DEPDIR)/strnlen.Po
-include $(DEPDIR)/strtol.Po
-include $(DEPDIR)/strtoul.Po
-include $(DEPDIR)/strverscmp.Po
-include $(DEPDIR)/xmalloc.Po
-include ./$(DEPDIR)/abitset.Po
-include ./$(DEPDIR)/argmatch.Po
-include ./$(DEPDIR)/basename.Po
-include ./$(DEPDIR)/bitset.Po
-include ./$(DEPDIR)/bitset_stats.Po
-include ./$(DEPDIR)/bitsetv-print.Po
-include ./$(DEPDIR)/bitsetv.Po
-include ./$(DEPDIR)/ebitset.Po
-include ./$(DEPDIR)/get-errno.Po
-include ./$(DEPDIR)/lbitset.Po
-include ./$(DEPDIR)/main.Po
-include ./$(DEPDIR)/mbswidth.Po
-include ./$(DEPDIR)/stripslash.Po
-include ./$(DEPDIR)/subpipe.Po
-include ./$(DEPDIR)/timevar.Po
-include ./$(DEPDIR)/vbitset.Po
-include ./$(DEPDIR)/xalloc-die.Po
-include ./$(DEPDIR)/xstrndup.Po
-include ./$(DEPDIR)/yyerror.Po
-
-.c.o:
-	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
-	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-#	source='$<' object='$@' libtool=no \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(COMPILE) -c $<
-
-.c.obj:
-	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
-	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-#	source='$<' object='$@' libtool=no \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-uninstall-info-am:
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) check-am
-all-am: Makefile $(LIBRARIES)
-installdirs:
-	for dir in "$(DESTDIR)$(libdir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
-	done
-install: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-clean: clean-am
-
-clean-am: clean-generic clean-libLIBRARIES clean-noinstLIBRARIES \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf $(DEPDIR) ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am: install-libLIBRARIES
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -rf $(DEPDIR) ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am uninstall-libLIBRARIES
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libLIBRARIES clean-noinstLIBRARIES ctags distclean \
-	distclean-compile distclean-generic distclean-tags distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-exec install-exec-am \
-	install-info install-info-am install-libLIBRARIES install-man \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-info-am \
-	uninstall-libLIBRARIES
-
-
-# We need the following in order to create <getopt.h> when the system
-# doesn't have one that works with the given compiler.
-getopt.h: getopt_.h
-	cp $(srcdir)/getopt_.h $@-t
-	mv $@-t $@
-
-# We need the following in order to create <stdbool.h> when the system
-# doesn't have one that works.
-stdbool.h: stdbool_.h
-	sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool_.h > $@-t
-	mv $@-t $@
-
-# We need the following in order to create an empty placeholder for
-# <unistd.h> when the system doesn't have one.
-unistd.h:
-	echo '/* Empty placeholder for $@.  */' >$@
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/lib/Makefile.am b/lib/Makefile.am
deleted file mode 100644
index f4d783e..0000000
--- a/lib/Makefile.am
+++ /dev/null
@@ -1,53 +0,0 @@
-## Copyright (C) 2001, 2002, 2003, 2004 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 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, write to the Free Software
-## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-## 02110-1301  USA
-
-AM_CFLAGS = $(WARNING_CFLAGS)
-
-BUILT_SOURCES =
-EXTRA_DIST =
-MOSTLYCLEANFILES =
-
-lib_LIBRARIES = $(YACC_LIBRARY)
-EXTRA_LIBRARIES = liby.a
-noinst_LIBRARIES = libbison.a
-
-liby_a_SOURCES = main.c yyerror.c
-
-libbison_a_SOURCES = $(lib_SOURCES)
-lib_SOURCES = \
-  get-errno.h get-errno.c \
-  subpipe.h subpipe.c \
-  $(bitsets_sources) $(additional_bitsets_sources) $(timevars_sources)
-
-# Implementation of bitsets
-bitsets_sources = \
-  abitset.c abitset.h bbitset.h bitset.c bitset.h bitset_stats.c	\
-  bitset_stats.h bitsetv.c bitsetv.h ebitset.c ebitset.h lbitset.c	\
-  lbitset.h libiberty.h vbitset.c vbitset.h
-
-# Additional bitset operations.
-additional_bitsets_sources = \
-	bitsetv-print.h bitsetv-print.c
-
-# timevars, stolen from GCC.
-timevars_sources = \
-	timevar.h timevar.c timevar.def
-
-libbison_a_LIBADD = $(LIBOBJS) $(ALLOCA)
-libbison_a_DEPENDENCIES = $(libbison_a_LIBADD)
-
-include gnulib.mk
diff --git a/lib/Makefile.in b/lib/Makefile.in
deleted file mode 100644
index d3613e9..0000000
--- a/lib/Makefile.in
+++ /dev/null
@@ -1,623 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(srcdir)/gnulib.mk dirname.c dirname.h dup-safer.c error.c \
-	error.h exitfail.c exitfail.h fd-safer.c fopen-safer.c \
-	getopt.c getopt1.c hard-locale.c hard-locale.h hash.c hash.h \
-	malloc.c obstack.c obstack.h pipe-safer.c quote.c quote.h \
-	quotearg.c quotearg.h stdio--.h stdio-safer.h stpcpy.c \
-	strdup.c strdup.h strerror.c strndup.c strndup.h strnlen.c \
-	strnlen.h strtol.c strtoul.c strverscmp.c strverscmp.h \
-	unistd--.h unistd-safer.h unlocked-io.h xalloc.h xmalloc.c
-subdir = lib
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-am__installdirs = "$(DESTDIR)$(libdir)"
-libLIBRARIES_INSTALL = $(INSTALL_DATA)
-LIBRARIES = $(lib_LIBRARIES) $(noinst_LIBRARIES)
-AR = ar
-ARFLAGS = cru
-libbison_a_AR = $(AR) $(ARFLAGS)
-am__DEPENDENCIES_1 = @LIBOBJS@
-am__objects_1 = abitset.$(OBJEXT) bitset.$(OBJEXT) \
-	bitset_stats.$(OBJEXT) bitsetv.$(OBJEXT) ebitset.$(OBJEXT) \
-	lbitset.$(OBJEXT) vbitset.$(OBJEXT)
-am__objects_2 = bitsetv-print.$(OBJEXT)
-am__objects_3 = timevar.$(OBJEXT)
-am__objects_4 = get-errno.$(OBJEXT) subpipe.$(OBJEXT) $(am__objects_1) \
-	$(am__objects_2) $(am__objects_3) argmatch.$(OBJEXT) \
-	basename.$(OBJEXT) stripslash.$(OBJEXT) mbswidth.$(OBJEXT) \
-	xalloc-die.$(OBJEXT) xstrndup.$(OBJEXT)
-am_libbison_a_OBJECTS = $(am__objects_4)
-libbison_a_OBJECTS = $(am_libbison_a_OBJECTS)
-liby_a_AR = $(AR) $(ARFLAGS)
-liby_a_LIBADD =
-am_liby_a_OBJECTS = main.$(OBJEXT) yyerror.$(OBJEXT)
-liby_a_OBJECTS = $(am_liby_a_OBJECTS)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
-am__depfiles_maybe = depfiles
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(libbison_a_SOURCES) $(liby_a_SOURCES)
-DIST_SOURCES = $(libbison_a_SOURCES) $(liby_a_SOURCES)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOM4TE = @AUTOM4TE@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BISON_CXX_WORKS = @BISON_CXX_WORKS@
-BISON_CXX_WORKS_FALSE = @BISON_CXX_WORKS_FALSE@
-BISON_CXX_WORKS_TRUE = @BISON_CXX_WORKS_TRUE@
-BISON_LOCALEDIR = @BISON_LOCALEDIR@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-GCC = @GCC@
-GETOPT_H = @GETOPT_H@
-GMSGFMT = @GMSGFMT@
-HAVE__BOOL = @HAVE__BOOL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTLLIBS = @INTLLIBS@
-INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
-LDFLAGS = @LDFLAGS@
-LEX = @LEX@
-LEXLIB = @LEXLIB@
-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
-LIBICONV = @LIBICONV@
-LIBINTL = @LIBINTL@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LTLIBICONV = @LTLIBICONV@
-LTLIBINTL = @LTLIBINTL@
-LTLIBOBJS = @LTLIBOBJS@
-M4 = @M4@
-MAKEINFO = @MAKEINFO@
-MKINSTALLDIRS = @MKINSTALLDIRS@
-MSGFMT = @MSGFMT@
-MSGMERGE = @MSGMERGE@
-O0CFLAGS = @O0CFLAGS@
-O0CXXFLAGS = @O0CXXFLAGS@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-POSUB = @POSUB@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STDBOOL_H = @STDBOOL_H@
-STRIP = @STRIP@
-UNISTD_H = @UNISTD_H@
-USE_NLS = @USE_NLS@
-VALGRIND = @VALGRIND@
-VERSION = @VERSION@
-WARNING_CFLAGS = @WARNING_CFLAGS@
-WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
-WERROR_CFLAGS = @WERROR_CFLAGS@
-XGETTEXT = @XGETTEXT@
-YACC = @YACC@
-YACC_LIBRARY = @YACC_LIBRARY@
-YACC_SCRIPT = @YACC_SCRIPT@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-aclocaldir = @aclocaldir@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-AM_CFLAGS = $(WARNING_CFLAGS)
-BUILT_SOURCES = $(GETOPT_H) $(STDBOOL_H) $(UNISTD_H)
-EXTRA_DIST = getopt_.h getopt_int.h stdbool_.h
-MOSTLYCLEANFILES = getopt.h getopt.h-t stdbool.h stdbool.h-t unistd.h
-lib_LIBRARIES = $(YACC_LIBRARY)
-EXTRA_LIBRARIES = liby.a
-noinst_LIBRARIES = libbison.a
-liby_a_SOURCES = main.c yyerror.c
-libbison_a_SOURCES = $(lib_SOURCES)
-
-# This file is generated automatically by "bootstrap".
-
-# This is for those projects which use "gettextize --intl" to put a source-code
-# copy of libintl into their package. In such projects, every Makefile.am needs
-# -I$(top_builddir)/intl, so that <libintl.h> can be found in this directory.
-# For the Makefile.ams in other directories it is the maintainer's
-# responsibility; for the one from gnulib we do it here.
-# This option has no effect when the user disables NLS (because then the intl
-# directory contains no libintl.h file) or when the project does not use
-# "gettextize --intl".
-# (commented out by bootstrap) AM_CPPFLAGS += -I$(top_builddir)/intl
-lib_SOURCES = get-errno.h get-errno.c subpipe.h subpipe.c \
-	$(bitsets_sources) $(additional_bitsets_sources) \
-	$(timevars_sources) argmatch.h argmatch.c basename.c \
-	stripslash.c exit.h gettext.h mbswidth.h mbswidth.c stpcpy.h \
-	verify.h xalloc-die.c xstrndup.h xstrndup.c
-
-# Implementation of bitsets
-bitsets_sources = \
-  abitset.c abitset.h bbitset.h bitset.c bitset.h bitset_stats.c	\
-  bitset_stats.h bitsetv.c bitsetv.h ebitset.c ebitset.h lbitset.c	\
-  lbitset.h libiberty.h vbitset.c vbitset.h
-
-
-# Additional bitset operations.
-additional_bitsets_sources = \
-	bitsetv-print.h bitsetv-print.c
-
-
-# timevars, stolen from GCC.
-timevars_sources = \
-	timevar.h timevar.c timevar.def
-
-libbison_a_LIBADD = $(LIBOBJS) $(ALLOCA)
-libbison_a_DEPENDENCIES = $(libbison_a_LIBADD)
-all: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/gnulib.mk $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  lib/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  lib/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-install-libLIBRARIES: $(lib_LIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
-	@list='$(lib_LIBRARIES)'; for p in $$list; do \
-	  if test -f $$p; then \
-	    f=$(am__strip_dir) \
-	    echo " $(libLIBRARIES_INSTALL) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
-	    $(libLIBRARIES_INSTALL) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
-	  else :; fi; \
-	done
-	@$(POST_INSTALL)
-	@list='$(lib_LIBRARIES)'; for p in $$list; do \
-	  if test -f $$p; then \
-	    p=$(am__strip_dir) \
-	    echo " $(RANLIB) '$(DESTDIR)$(libdir)/$$p'"; \
-	    $(RANLIB) "$(DESTDIR)$(libdir)/$$p"; \
-	  else :; fi; \
-	done
-
-uninstall-libLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LIBRARIES)'; for p in $$list; do \
-	  p=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(libdir)/$$p'"; \
-	  rm -f "$(DESTDIR)$(libdir)/$$p"; \
-	done
-
-clean-libLIBRARIES:
-	-test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES)
-
-clean-noinstLIBRARIES:
-	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
-libbison.a: $(libbison_a_OBJECTS) $(libbison_a_DEPENDENCIES) 
-	-rm -f libbison.a
-	$(libbison_a_AR) libbison.a $(libbison_a_OBJECTS) $(libbison_a_LIBADD)
-	$(RANLIB) libbison.a
-liby.a: $(liby_a_OBJECTS) $(liby_a_DEPENDENCIES) 
-	-rm -f liby.a
-	$(liby_a_AR) liby.a $(liby_a_OBJECTS) $(liby_a_LIBADD)
-	$(RANLIB) liby.a
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/dirname.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/dup-safer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/error.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/exitfail.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/fd-safer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/fopen-safer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getopt.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getopt1.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/hard-locale.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/hash.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/malloc.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/obstack.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/pipe-safer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/quote.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/quotearg.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/stpcpy.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strdup.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strerror.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strndup.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strnlen.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtol.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtoul.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strverscmp.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/xmalloc.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/abitset.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argmatch.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basename.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitset.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitset_stats.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitsetv-print.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitsetv.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ebitset.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get-errno.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lbitset.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbswidth.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stripslash.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subpipe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timevar.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vbitset.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xalloc-die.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstrndup.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yyerror.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-uninstall-info-am:
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) check-am
-all-am: Makefile $(LIBRARIES)
-installdirs:
-	for dir in "$(DESTDIR)$(libdir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
-	done
-install: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-clean: clean-am
-
-clean-am: clean-generic clean-libLIBRARIES clean-noinstLIBRARIES \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf $(DEPDIR) ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am: install-libLIBRARIES
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -rf $(DEPDIR) ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am uninstall-libLIBRARIES
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libLIBRARIES clean-noinstLIBRARIES ctags distclean \
-	distclean-compile distclean-generic distclean-tags distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-exec install-exec-am \
-	install-info install-info-am install-libLIBRARIES install-man \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-info-am \
-	uninstall-libLIBRARIES
-
-
-# We need the following in order to create <getopt.h> when the system
-# doesn't have one that works with the given compiler.
-getopt.h: getopt_.h
-	cp $(srcdir)/getopt_.h $@-t
-	mv $@-t $@
-
-# We need the following in order to create <stdbool.h> when the system
-# doesn't have one that works.
-stdbool.h: stdbool_.h
-	sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool_.h > $@-t
-	mv $@-t $@
-
-# We need the following in order to create an empty placeholder for
-# <unistd.h> when the system doesn't have one.
-unistd.h:
-	echo '/* Empty placeholder for $@.  */' >$@
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/lib/abitset.c b/lib/abitset.c
deleted file mode 100644
index 17c0a4a..0000000
--- a/lib/abitset.c
+++ /dev/null
@@ -1,828 +0,0 @@
-/* Array bitsets.
-   Copyright (C) 2002, 2003, 2006 Free Software Foundation, Inc.
-   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
-
-   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 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, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "abitset.h"
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-/* This file implements fixed size bitsets stored as an array
-   of words.  Any unused bits in the last word must be zero.  */
-
-#define ABITSET_N_WORDS(N) (((N) + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS)
-#define ABITSET_WORDS(X) ((X)->a.words)
-
-
-static bitset_bindex
-abitset_resize (bitset src, bitset_bindex size)
-{
-    /* These bitsets have a fixed size.  */
-    if (BITSET_SIZE_ (src) != size)
-      abort ();
-
-    return size;
-}
-
-/* Find list of up to NUM bits set in BSET starting from and including
- *NEXT and store in array LIST.  Return with actual number of bits
- found and with *NEXT indicating where search stopped.  */
-static bitset_bindex
-abitset_small_list (bitset src, bitset_bindex *list,
-		    bitset_bindex num, bitset_bindex *next)
-{
-  bitset_bindex bitno;
-  bitset_bindex count;
-  bitset_windex size;
-  bitset_word word;
-
-  word = ABITSET_WORDS (src)[0];
-
-  /* Short circuit common case.  */
-  if (!word)
-    return 0;
-
-  size = BITSET_SIZE_ (src);
-  bitno = *next;
-  if (bitno >= size)
-    return 0;
-
-  word >>= bitno;
-
-  /* If num is 1, we could speed things up with a binary search
-     of the word of interest.  */
-
-  if (num >= BITSET_WORD_BITS)
-    {
-      for (count = 0; word; bitno++)
-	{
-	  if (word & 1)
-	    list[count++] = bitno;
-	  word >>= 1;
-	}
-    }
-  else
-    {
-      for (count = 0; word; bitno++)
-	{
-	  if (word & 1)
-	    {
-	      list[count++] = bitno;
-	      if (count >= num)
-		{
-		  bitno++;
-		  break;
-		}
-	    }
-	  word >>= 1;
-	}
-    }
-
-  *next = bitno;
-  return count;
-}
-
-
-/* Set bit BITNO in bitset DST.  */
-static void
-abitset_set (bitset dst ATTRIBUTE_UNUSED, bitset_bindex bitno ATTRIBUTE_UNUSED)
-{
-  /* This should never occur for abitsets since we should always hit
-     the cache.  It is likely someone is trying to access outside the
-     bounds of the bitset.  */
-  abort ();
-}
-
-
-/* Reset bit BITNO in bitset DST.  */
-static void
-abitset_reset (bitset dst ATTRIBUTE_UNUSED,
-	       bitset_bindex bitno ATTRIBUTE_UNUSED)
-{
-  /* This should never occur for abitsets since we should always hit
-     the cache.  It is likely someone is trying to access outside the
-     bounds of the bitset.  Since the bit is zero anyway, let it pass.  */
-}
-
-
-/* Test bit BITNO in bitset SRC.  */
-static bool
-abitset_test (bitset src ATTRIBUTE_UNUSED,
-	      bitset_bindex bitno ATTRIBUTE_UNUSED)
-{
-  /* This should never occur for abitsets since we should always
-     hit the cache.  */
-  return false;
-}
-
-
-/* Find list of up to NUM bits set in BSET in reverse order, starting
-   from and including NEXT and store in array LIST.  Return with
-   actual number of bits found and with *NEXT indicating where search
-   stopped.  */
-static bitset_bindex
-abitset_list_reverse (bitset src, bitset_bindex *list,
-		      bitset_bindex num, bitset_bindex *next)
-{
-  bitset_bindex bitno;
-  bitset_bindex rbitno;
-  bitset_bindex count;
-  bitset_windex windex;
-  unsigned int bitcnt;
-  bitset_bindex bitoff;
-  bitset_word *srcp = ABITSET_WORDS (src);
-  bitset_bindex n_bits = BITSET_SIZE_ (src);
-
-  rbitno = *next;
-
-  /* If num is 1, we could speed things up with a binary search
-     of the word of interest.  */
-
-  if (rbitno >= n_bits)
-    return 0;
-
-  count = 0;
-
-  bitno = n_bits - (rbitno + 1);
-
-  windex = bitno / BITSET_WORD_BITS;
-  bitcnt = bitno % BITSET_WORD_BITS;
-  bitoff = windex * BITSET_WORD_BITS;
-
-  do
-    {
-      bitset_word word;
-
-      word = srcp[windex] << (BITSET_WORD_BITS - 1 - bitcnt);
-      for (; word; bitcnt--)
-	{
-	  if (word & BITSET_MSB)
-	    {
-	      list[count++] = bitoff + bitcnt;
-	      if (count >= num)
-		{
-		  *next = n_bits - (bitoff + bitcnt);
-		  return count;
-		}
-	    }
-	  word <<= 1;
-	}
-      bitoff -= BITSET_WORD_BITS;
-      bitcnt = BITSET_WORD_BITS - 1;
-    }
-  while (windex--);
-
-  *next = n_bits - (bitoff + 1);
-  return count;
-}
-
-
-/* Find list of up to NUM bits set in BSET starting from and including
- *NEXT and store in array LIST.  Return with actual number of bits
- found and with *NEXT indicating where search stopped.  */
-static bitset_bindex
-abitset_list (bitset src, bitset_bindex *list,
-	      bitset_bindex num, bitset_bindex *next)
-{
-  bitset_bindex bitno;
-  bitset_bindex count;
-  bitset_windex windex;
-  bitset_bindex bitoff;
-  bitset_windex size = src->b.csize;
-  bitset_word *srcp = ABITSET_WORDS (src);
-  bitset_word word;
-
-  bitno = *next;
-
-  count = 0;
-  if (!bitno)
-    {
-      /* Many bitsets are zero, so make this common case fast.  */
-      for (windex = 0; windex < size && !srcp[windex]; windex++)
-	continue;
-      if (windex >= size)
-	return 0;
-
-      /* If num is 1, we could speed things up with a binary search
-	 of the current word.  */
-
-      bitoff = windex * BITSET_WORD_BITS;
-    }
-  else
-    {
-      if (bitno >= BITSET_SIZE_ (src))
-	return 0;
-
-      windex = bitno / BITSET_WORD_BITS;
-      bitno = bitno % BITSET_WORD_BITS;
-
-      if (bitno)
-	{
-	  /* Handle the case where we start within a word.
-	     Most often, this is executed with large bitsets
-	     with many set bits where we filled the array
-	     on the previous call to this function.  */
-
-	  bitoff = windex * BITSET_WORD_BITS;
-	  word = srcp[windex] >> bitno;
-	  for (bitno = bitoff + bitno; word; bitno++)
-	    {
-	      if (word & 1)
-		{
-		  list[count++] = bitno;
-		  if (count >= num)
-		    {
-		      *next = bitno + 1;
-		      return count;
-		    }
-		}
-	      word >>= 1;
-	    }
-	  windex++;
-	}
-      bitoff = windex * BITSET_WORD_BITS;
-    }
-
-  for (; windex < size; windex++, bitoff += BITSET_WORD_BITS)
-    {
-      if (!(word = srcp[windex]))
-	continue;
-
-      if ((count + BITSET_WORD_BITS) < num)
-	{
-	  for (bitno = bitoff; word; bitno++)
-	    {
-	      if (word & 1)
-		list[count++] = bitno;
-	      word >>= 1;
-	    }
-	}
-      else
-	{
-	  for (bitno = bitoff; word; bitno++)
-	    {
-	      if (word & 1)
-		{
-		  list[count++] = bitno;
-		  if (count >= num)
-		    {
-		      *next = bitno + 1;
-		      return count;
-		    }
-		}
-	      word >>= 1;
-	    }
-	}
-    }
-
-  *next = bitoff;
-  return count;
-}
-
-
-/* Ensure that any unused bits within the last word are clear.  */
-static inline void
-abitset_unused_clear (bitset dst)
-{
-  unsigned int last_bit;
-
-  last_bit = BITSET_SIZE_ (dst) % BITSET_WORD_BITS;
-  if (last_bit)
-    ABITSET_WORDS (dst)[dst->b.csize - 1] &=
-      ((bitset_word) 1 << last_bit) - 1;
-}
-
-
-static void
-abitset_ones (bitset dst)
-{
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  size_t bytes;
-
-  bytes = sizeof (bitset_word) * dst->b.csize;
-
-  memset (dstp, -1, bytes);
-  abitset_unused_clear (dst);
-}
-
-
-static void
-abitset_zero (bitset dst)
-{
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  size_t bytes;
-
-  bytes = sizeof (bitset_word) * dst->b.csize;
-
-  memset (dstp, 0, bytes);
-}
-
-
-static bool
-abitset_empty_p (bitset dst)
-{
-  bitset_windex i;
-  bitset_word *dstp = ABITSET_WORDS (dst);
-
-  for (i = 0; i < dst->b.csize; i++)
-    if (dstp[i])
-      return false;
-
-  return true;
-}
-
-
-static void
-abitset_copy1 (bitset dst, bitset src)
-{
-  bitset_word *srcp = ABITSET_WORDS (src);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  if (srcp == dstp)
-      return;
-  memcpy (dstp, srcp, sizeof (bitset_word) * size);
-}
-
-
-static void
-abitset_not (bitset dst, bitset src)
-{
-  bitset_windex i;
-  bitset_word *srcp = ABITSET_WORDS (src);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++)
-      *dstp++ = ~(*srcp++);
-  abitset_unused_clear (dst);
-}
-
-
-static bool
-abitset_equal_p (bitset dst, bitset src)
-{
-  bitset_windex i;
-  bitset_word *srcp = ABITSET_WORDS (src);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++)
-      if (*srcp++ != *dstp++)
-	  return false;
-  return true;
-}
-
-
-static bool
-abitset_subset_p (bitset dst, bitset src)
-{
-  bitset_windex i;
-  bitset_word *srcp = ABITSET_WORDS (src);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++, dstp++, srcp++)
-      if (*dstp != (*srcp | *dstp))
-	  return false;
-  return true;
-}
-
-
-static bool
-abitset_disjoint_p (bitset dst, bitset src)
-{
-  bitset_windex i;
-  bitset_word *srcp = ABITSET_WORDS (src);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++)
-      if (*srcp++ & *dstp++)
-	  return false;
-
-  return true;
-}
-
-
-static void
-abitset_and (bitset dst, bitset src1, bitset src2)
-{
-  bitset_windex i;
-  bitset_word *src1p = ABITSET_WORDS (src1);
-  bitset_word *src2p = ABITSET_WORDS (src2);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++)
-      *dstp++ = *src1p++ & *src2p++;
-}
-
-
-static bool
-abitset_and_cmp (bitset dst, bitset src1, bitset src2)
-{
-  bitset_windex i;
-  bool changed = false;
-  bitset_word *src1p = ABITSET_WORDS (src1);
-  bitset_word *src2p = ABITSET_WORDS (src2);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++, dstp++)
-    {
-      bitset_word tmp = *src1p++ & *src2p++;
-
-      if (*dstp != tmp)
-	{
-	  changed = true;
-	  *dstp = tmp;
-	}
-    }
-  return changed;
-}
-
-
-static void
-abitset_andn (bitset dst, bitset src1, bitset src2)
-{
-  bitset_windex i;
-  bitset_word *src1p = ABITSET_WORDS (src1);
-  bitset_word *src2p = ABITSET_WORDS (src2);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++)
-      *dstp++ = *src1p++ & ~(*src2p++);
-}
-
-
-static bool
-abitset_andn_cmp (bitset dst, bitset src1, bitset src2)
-{
-  bitset_windex i;
-  bool changed = false;
-  bitset_word *src1p = ABITSET_WORDS (src1);
-  bitset_word *src2p = ABITSET_WORDS (src2);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++, dstp++)
-    {
-      bitset_word tmp = *src1p++ & ~(*src2p++);
-
-      if (*dstp != tmp)
-	{
-	  changed = true;
-	  *dstp = tmp;
-	}
-    }
-  return changed;
-}
-
-
-static void
-abitset_or (bitset dst, bitset src1, bitset src2)
-{
-  bitset_windex i;
-  bitset_word *src1p = ABITSET_WORDS (src1);
-  bitset_word *src2p = ABITSET_WORDS (src2);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++)
-      *dstp++ = *src1p++ | *src2p++;
-}
-
-
-static bool
-abitset_or_cmp (bitset dst, bitset src1, bitset src2)
-{
-  bitset_windex i;
-  bool changed = false;
-  bitset_word *src1p = ABITSET_WORDS (src1);
-  bitset_word *src2p = ABITSET_WORDS (src2);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++, dstp++)
-    {
-      bitset_word tmp = *src1p++ | *src2p++;
-
-      if (*dstp != tmp)
-	{
-	  changed = true;
-	  *dstp = tmp;
-	}
-    }
-  return changed;
-}
-
-
-static void
-abitset_xor (bitset dst, bitset src1, bitset src2)
-{
-  bitset_windex i;
-  bitset_word *src1p = ABITSET_WORDS (src1);
-  bitset_word *src2p = ABITSET_WORDS (src2);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++)
-      *dstp++ = *src1p++ ^ *src2p++;
-}
-
-
-static bool
-abitset_xor_cmp (bitset dst, bitset src1, bitset src2)
-{
-  bitset_windex i;
-  bool changed = false;
-  bitset_word *src1p = ABITSET_WORDS (src1);
-  bitset_word *src2p = ABITSET_WORDS (src2);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++, dstp++)
-    {
-      bitset_word tmp = *src1p++ ^ *src2p++;
-
-      if (*dstp != tmp)
-	{
-	  changed = true;
-	  *dstp = tmp;
-	}
-    }
-  return changed;
-}
-
-
-static void
-abitset_and_or (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  bitset_windex i;
-  bitset_word *src1p = ABITSET_WORDS (src1);
-  bitset_word *src2p = ABITSET_WORDS (src2);
-  bitset_word *src3p = ABITSET_WORDS (src3);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++)
-      *dstp++ = (*src1p++ & *src2p++) | *src3p++;
-}
-
-
-static bool
-abitset_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  bitset_windex i;
-  bool changed = false;
-  bitset_word *src1p = ABITSET_WORDS (src1);
-  bitset_word *src2p = ABITSET_WORDS (src2);
-  bitset_word *src3p = ABITSET_WORDS (src3);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++, dstp++)
-    {
-      bitset_word tmp = (*src1p++ & *src2p++) | *src3p++;
-
-      if (*dstp != tmp)
-	{
-	  changed = true;
-	  *dstp = tmp;
-	}
-    }
-  return changed;
-}
-
-
-static void
-abitset_andn_or (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  bitset_windex i;
-  bitset_word *src1p = ABITSET_WORDS (src1);
-  bitset_word *src2p = ABITSET_WORDS (src2);
-  bitset_word *src3p = ABITSET_WORDS (src3);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++)
-      *dstp++ = (*src1p++ & ~(*src2p++)) | *src3p++;
-}
-
-
-static bool
-abitset_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  bitset_windex i;
-  bool changed = false;
-  bitset_word *src1p = ABITSET_WORDS (src1);
-  bitset_word *src2p = ABITSET_WORDS (src2);
-  bitset_word *src3p = ABITSET_WORDS (src3);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++, dstp++)
-    {
-      bitset_word tmp = (*src1p++ & ~(*src2p++)) | *src3p++;
-
-      if (*dstp != tmp)
-	{
-	  changed = true;
-	  *dstp = tmp;
-	}
-    }
-  return changed;
-}
-
-
-static void
-abitset_or_and (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  bitset_windex i;
-  bitset_word *src1p = ABITSET_WORDS (src1);
-  bitset_word *src2p = ABITSET_WORDS (src2);
-  bitset_word *src3p = ABITSET_WORDS (src3);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++)
-      *dstp++ = (*src1p++ | *src2p++) & *src3p++;
-}
-
-
-static bool
-abitset_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  bitset_windex i;
-  bool changed = false;
-  bitset_word *src1p = ABITSET_WORDS (src1);
-  bitset_word *src2p = ABITSET_WORDS (src2);
-  bitset_word *src3p = ABITSET_WORDS (src3);
-  bitset_word *dstp = ABITSET_WORDS (dst);
-  bitset_windex size = dst->b.csize;
-
-  for (i = 0; i < size; i++, dstp++)
-    {
-      bitset_word tmp = (*src1p++ | *src2p++) & *src3p++;
-
-      if (*dstp != tmp)
-	{
-	  changed = true;
-	  *dstp = tmp;
-	}
-    }
-  return changed;
-}
-
-
-static void
-abitset_copy (bitset dst, bitset src)
-{
-  if (BITSET_COMPATIBLE_ (dst, src))
-      abitset_copy1 (dst, src);
-  else
-      bitset_copy_ (dst, src);
-}
-
-
-/* Vector of operations for single word bitsets.  */
-struct bitset_vtable abitset_small_vtable = {
-  abitset_set,
-  abitset_reset,
-  bitset_toggle_,
-  abitset_test,
-  abitset_resize,
-  bitset_size_,
-  bitset_count_,
-  abitset_empty_p,
-  abitset_ones,
-  abitset_zero,
-  abitset_copy,
-  abitset_disjoint_p,
-  abitset_equal_p,
-  abitset_not,
-  abitset_subset_p,
-  abitset_and,
-  abitset_and_cmp,
-  abitset_andn,
-  abitset_andn_cmp,
-  abitset_or,
-  abitset_or_cmp,
-  abitset_xor,
-  abitset_xor_cmp,
-  abitset_and_or,
-  abitset_and_or_cmp,
-  abitset_andn_or,
-  abitset_andn_or_cmp,
-  abitset_or_and,
-  abitset_or_and_cmp,
-  abitset_small_list,
-  abitset_list_reverse,
-  NULL,
-  BITSET_ARRAY
-};
-
-
-/* Vector of operations for multiple word bitsets.  */
-struct bitset_vtable abitset_vtable = {
-  abitset_set,
-  abitset_reset,
-  bitset_toggle_,
-  abitset_test,
-  abitset_resize,
-  bitset_size_,
-  bitset_count_,
-  abitset_empty_p,
-  abitset_ones,
-  abitset_zero,
-  abitset_copy,
-  abitset_disjoint_p,
-  abitset_equal_p,
-  abitset_not,
-  abitset_subset_p,
-  abitset_and,
-  abitset_and_cmp,
-  abitset_andn,
-  abitset_andn_cmp,
-  abitset_or,
-  abitset_or_cmp,
-  abitset_xor,
-  abitset_xor_cmp,
-  abitset_and_or,
-  abitset_and_or_cmp,
-  abitset_andn_or,
-  abitset_andn_or_cmp,
-  abitset_or_and,
-  abitset_or_and_cmp,
-  abitset_list,
-  abitset_list_reverse,
-  NULL,
-  BITSET_ARRAY
-};
-
-
-size_t
-abitset_bytes (bitset_bindex n_bits)
-{
-  bitset_windex size;
-  size_t bytes;
-  size_t header_size = offsetof (union bitset_union, a.words);
-  struct bitset_align_struct { char a; union bitset_union b; };
-  size_t bitset_alignment = offsetof (struct bitset_align_struct, b);
-
-  size = ABITSET_N_WORDS (n_bits);
-  bytes = header_size + size * sizeof (bitset_word);
-
-  /* Align the size properly for a vector of abitset objects.  */
-  if (header_size % bitset_alignment != 0
-      || sizeof (bitset_word) % bitset_alignment != 0)
-    {
-      bytes += bitset_alignment - 1;
-      bytes -= bytes % bitset_alignment;
-    }
-
-  return bytes;
-}
-
-
-bitset
-abitset_init (bitset bset, bitset_bindex n_bits)
-{
-  bitset_windex size;
-
-  size = ABITSET_N_WORDS (n_bits);
-  BITSET_NBITS_ (bset) = n_bits;
-
-  /* Use optimized routines if bitset fits within a single word.
-     There is probably little merit if using caching since
-     the small bitset will always fit in the cache.  */
-  if (size == 1)
-    bset->b.vtable = &abitset_small_vtable;
-  else
-    bset->b.vtable = &abitset_vtable;
-
-  bset->b.cindex = 0;
-  bset->b.csize = size;
-  bset->b.cdata = ABITSET_WORDS (bset);
-  return bset;
-}
diff --git a/lib/abitset.h b/lib/abitset.h
deleted file mode 100644
index a22c919..0000000
--- a/lib/abitset.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Functions to support abitsets.
-   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
-   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
-
-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 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, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef _ABITSET_H
-#define _ABITSET_H
-
-#include "bitset.h"
-
-extern size_t abitset_bytes (bitset_bindex);
-
-extern bitset abitset_init (bitset, bitset_bindex);
-
-#endif
diff --git a/lib/argmatch.c b/lib/argmatch.c
deleted file mode 100644
index 36d5845..0000000
--- a/lib/argmatch.c
+++ /dev/null
@@ -1,281 +0,0 @@
-/* argmatch.c -- find a match for a string in an array
-
-   Copyright (C) 1990, 1998, 1999, 2001, 2002, 2003, 2004, 2005 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 David MacKenzie <djm@ai.mit.edu>
-   Modified by Akim Demaille <demaille@inf.enst.fr> */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-/* Specification.  */
-#include "argmatch.h"
-
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "gettext.h"
-#define _(msgid) gettext (msgid)
-
-#include "error.h"
-#include "exit.h"
-#include "quotearg.h"
-#include "quote.h"
-
-#if USE_UNLOCKED_IO
-# include "unlocked-io.h"
-#endif
-
-/* When reporting an invalid argument, show nonprinting characters
-   by using the quoting style ARGMATCH_QUOTING_STYLE.  Do not use
-   literal_quoting_style.  */
-#ifndef ARGMATCH_QUOTING_STYLE
-# define ARGMATCH_QUOTING_STYLE locale_quoting_style
-#endif
-
-/* Non failing version of argmatch call this function after failing. */
-#ifndef ARGMATCH_DIE
-# include "exitfail.h"
-# define ARGMATCH_DIE exit (exit_failure)
-#endif
-
-#ifdef ARGMATCH_DIE_DECL
-ARGMATCH_DIE_DECL;
-#endif
-
-static void
-__argmatch_die (void)
-{
-  ARGMATCH_DIE;
-}
-
-/* Used by XARGMATCH and XARGCASEMATCH.  See description in argmatch.h.
-   Default to __argmatch_die, but allow caller to change this at run-time. */
-argmatch_exit_fn argmatch_die = __argmatch_die;
-
-
-/* If ARG is an unambiguous match for an element of the
-   NULL-terminated array ARGLIST, return the index in ARGLIST
-   of the matched element, else -1 if it does not match any element
-   or -2 if it is ambiguous (is a prefix of more than one element).
-
-   If VALLIST is none null, use it to resolve ambiguities limited to
-   synonyms, i.e., for
-     "yes", "yop" -> 0
-     "no", "nope" -> 1
-   "y" is a valid argument, for `0', and "n" for `1'.  */
-
-ptrdiff_t
-argmatch (const char *arg, const char *const *arglist,
-	  const char *vallist, size_t valsize)
-{
-  size_t i;			/* Temporary index in ARGLIST.  */
-  size_t arglen;		/* Length of ARG.  */
-  ptrdiff_t matchind = -1;	/* Index of first nonexact match.  */
-  bool ambiguous = false;	/* If true, multiple nonexact match(es).  */
-
-  arglen = strlen (arg);
-
-  /* Test all elements for either exact match or abbreviated matches.  */
-  for (i = 0; arglist[i]; i++)
-    {
-      if (!strncmp (arglist[i], arg, arglen))
-	{
-	  if (strlen (arglist[i]) == arglen)
-	    /* Exact match found.  */
-	    return i;
-	  else if (matchind == -1)
-	    /* First nonexact match found.  */
-	    matchind = i;
-	  else
-	    {
-	      /* Second nonexact match found.  */
-	      if (vallist == NULL
-		  || memcmp (vallist + valsize * matchind,
-			     vallist + valsize * i, valsize))
-		{
-		  /* There is a real ambiguity, or we could not
-		     disambiguate. */
-		  ambiguous = true;
-		}
-	    }
-	}
-    }
-  if (ambiguous)
-    return -2;
-  else
-    return matchind;
-}
-
-/* Error reporting for argmatch.
-   CONTEXT is a description of the type of entity that was being matched.
-   VALUE is the invalid value that was given.
-   PROBLEM is the return value from argmatch.  */
-
-void
-argmatch_invalid (const char *context, const char *value, ptrdiff_t problem)
-{
-  char const *format = (problem == -1
-			? _("invalid argument %s for %s")
-			: _("ambiguous argument %s for %s"));
-
-  error (0, 0, format, quotearg_n_style (0, ARGMATCH_QUOTING_STYLE, value),
-	 quote_n (1, context));
-}
-
-/* List the valid arguments for argmatch.
-   ARGLIST is the same as in argmatch.
-   VALLIST is a pointer to an array of values.
-   VALSIZE is the size of the elements of VALLIST */
-void
-argmatch_valid (const char *const *arglist,
-		const char *vallist, size_t valsize)
-{
-  size_t i;
-  const char *last_val = NULL;
-
-  /* We try to put synonyms on the same line.  The assumption is that
-     synonyms follow each other */
-  fprintf (stderr, _("Valid arguments are:"));
-  for (i = 0; arglist[i]; i++)
-    if ((i == 0)
-	|| memcmp (last_val, vallist + valsize * i, valsize))
-      {
-	fprintf (stderr, "\n  - `%s'", arglist[i]);
-	last_val = vallist + valsize * i;
-      }
-    else
-      {
-	fprintf (stderr, ", `%s'", arglist[i]);
-      }
-  putc ('\n', stderr);
-}
-
-/* Never failing versions of the previous functions.
-
-   CONTEXT is the context for which argmatch is called (e.g.,
-   "--version-control", or "$VERSION_CONTROL" etc.).  Upon failure,
-   calls the (supposed never to return) function EXIT_FN. */
-
-ptrdiff_t
-__xargmatch_internal (const char *context,
-		      const char *arg, const char *const *arglist,
-		      const char *vallist, size_t valsize,
-		      argmatch_exit_fn exit_fn)
-{
-  ptrdiff_t res = argmatch (arg, arglist, vallist, valsize);
-  if (res >= 0)
-    /* Success. */
-    return res;
-
-  /* We failed.  Explain why. */
-  argmatch_invalid (context, arg, res);
-  argmatch_valid (arglist, vallist, valsize);
-  (*exit_fn) ();
-
-  return -1; /* To please the compilers. */
-}
-
-/* Look for VALUE in VALLIST, an array of objects of size VALSIZE and
-   return the first corresponding argument in ARGLIST */
-const char *
-argmatch_to_argument (const char *value,
-		      const char *const *arglist,
-		      const char *vallist, size_t valsize)
-{
-  size_t i;
-
-  for (i = 0; arglist[i]; i++)
-    if (!memcmp (value, vallist + valsize * i, valsize))
-      return arglist[i];
-  return NULL;
-}
-
-#ifdef TEST
-/*
- * Based on "getversion.c" by David MacKenzie <djm@gnu.ai.mit.edu>
- */
-char *program_name;
-
-/* When to make backup files.  */
-enum backup_type
-{
-  /* Never make backups.  */
-  no_backups,
-
-  /* Make simple backups of every file.  */
-  simple_backups,
-
-  /* Make numbered backups of files that already have numbered backups,
-     and simple backups of the others.  */
-  numbered_existing_backups,
-
-  /* Make numbered backups of every file.  */
-  numbered_backups
-};
-
-/* Two tables describing arguments (keys) and their corresponding
-   values */
-static const char *const backup_args[] =
-{
-  "no", "none", "off",
-  "simple", "never",
-  "existing", "nil",
-  "numbered", "t",
-  0
-};
-
-static const enum backup_type backup_vals[] =
-{
-  no_backups, no_backups, no_backups,
-  simple_backups, simple_backups,
-  numbered_existing_backups, numbered_existing_backups,
-  numbered_backups, numbered_backups
-};
-
-int
-main (int argc, const char *const *argv)
-{
-  const char *cp;
-  enum backup_type backup_type = no_backups;
-
-  program_name = (char *) argv[0];
-
-  if (argc > 2)
-    {
-      fprintf (stderr, "Usage: %s [VERSION_CONTROL]\n", program_name);
-      exit (1);
-    }
-
-  if ((cp = getenv ("VERSION_CONTROL")))
-    backup_type = XARGMATCH ("$VERSION_CONTROL", cp,
-			     backup_args, backup_vals);
-
-  if (argc == 2)
-    backup_type = XARGMATCH (program_name, argv[1],
-			     backup_args, backup_vals);
-
-  printf ("The version control is `%s'\n",
-	  ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals));
-
-  return 0;
-}
-#endif
diff --git a/lib/argmatch.h b/lib/argmatch.h
deleted file mode 100644
index f2dfe59..0000000
--- a/lib/argmatch.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/* argmatch.h -- definitions and prototypes for argmatch.c
-
-   Copyright (C) 1990, 1998, 1999, 2001, 2002, 2004, 2005 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 David MacKenzie <djm@ai.mit.edu>
-   Modified by Akim Demaille <demaille@inf.enst.fr> */
-
-#ifndef ARGMATCH_H_
-# define ARGMATCH_H_ 1
-
-# include <stddef.h>
-
-# include "verify.h"
-
-# define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
-
-/* Assert there are as many real arguments as there are values
-   (argument list ends with a NULL guard).  */
-
-# define ARGMATCH_VERIFY(Arglist, Vallist) \
-    verify (ARRAY_CARDINALITY (Arglist) == ARRAY_CARDINALITY (Vallist) + 1)
-
-/* Return the index of the element of ARGLIST (NULL terminated) that
-   matches with ARG.  If VALLIST is not NULL, then use it to resolve
-   false ambiguities (i.e., different matches of ARG but corresponding
-   to the same values in VALLIST).  */
-
-ptrdiff_t argmatch (char const *arg, char const *const *arglist,
-		    char const *vallist, size_t valsize);
-
-# define ARGMATCH(Arg, Arglist, Vallist) \
-  argmatch (Arg, Arglist, (char const *) (Vallist), sizeof *(Vallist))
-
-/* xargmatch calls this function when it fails.  This function should not
-   return.  By default, this is a function that calls ARGMATCH_DIE which
-   in turn defaults to `exit (exit_failure)'.  */
-typedef void (*argmatch_exit_fn) (void);
-extern argmatch_exit_fn argmatch_die;
-
-/* Report on stderr why argmatch failed.  Report correct values. */
-
-void argmatch_invalid (char const *context, char const *value,
-		       ptrdiff_t problem);
-
-/* Left for compatibility with the old name invalid_arg */
-
-# define invalid_arg(Context, Value, Problem) \
-  argmatch_invalid (Context, Value, Problem)
-
-
-
-/* Report on stderr the list of possible arguments.  */
-
-void argmatch_valid (char const *const *arglist,
-		     char const *vallist, size_t valsize);
-
-# define ARGMATCH_VALID(Arglist, Vallist) \
-  argmatch_valid (Arglist, (char const *) (Vallist), sizeof *(Vallist))
-
-
-
-/* Same as argmatch, but upon failure, reports a explanation on the
-   failure, and exits using the function EXIT_FN. */
-
-ptrdiff_t __xargmatch_internal (char const *context,
-				char const *arg, char const *const *arglist,
-				char const *vallist, size_t valsize,
-				argmatch_exit_fn exit_fn);
-
-/* Programmer friendly interface to __xargmatch_internal. */
-
-# define XARGMATCH(Context, Arg, Arglist, Vallist)		\
-  ((Vallist) [__xargmatch_internal (Context, Arg, Arglist,	\
-				    (char const *) (Vallist),	\
-				    sizeof *(Vallist),		\
-				    argmatch_die)])
-
-/* Convert a value into a corresponding argument. */
-
-char const *argmatch_to_argument (char const *value,
-				  char const *const *arglist,
-				  char const *vallist, size_t valsize);
-
-# define ARGMATCH_TO_ARGUMENT(Value, Arglist, Vallist)			\
-  argmatch_to_argument (Value, Arglist,					\
-			(char const *) (Vallist), sizeof *(Vallist))
-
-#endif /* ARGMATCH_H_ */
diff --git a/lib/basename.c b/lib/basename.c
deleted file mode 100644
index 5cc97cd..0000000
--- a/lib/basename.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* basename.c -- return the last element in a file name
-
-   Copyright (C) 1990, 1998, 1999, 2000, 2001, 2003, 2004, 2005 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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "dirname.h"
-#include <string.h>
-
-/* In general, we can't use the builtin `basename' function if available,
-   since it has different meanings in different environments.
-   In some environments the builtin `basename' modifies its argument.
-
-   Return the address of the last file name component of NAME.  If
-   NAME has no file name components because it is all slashes, return
-   NAME if it is empty, the address of its last slash otherwise.  */
-
-char *
-base_name (char const *name)
-{
-  char const *base = name + FILE_SYSTEM_PREFIX_LEN (name);
-  char const *p;
-
-  for (p = base; *p; p++)
-    {
-      if (ISSLASH (*p))
-	{
-	  /* Treat multiple adjacent slashes like a single slash.  */
-	  do p++;
-	  while (ISSLASH (*p));
-
-	  /* If the file name ends in slash, use the trailing slash as
-	     the basename if no non-slashes have been found.  */
-	  if (! *p)
-	    {
-	      if (ISSLASH (*base))
-		base = p - 1;
-	      break;
-	    }
-
-	  /* *P is a non-slash preceded by a slash.  */
-	  base = p;
-	}
-    }
-
-  return (char *) base;
-}
-
-/* Return the length of of the basename NAME.  Typically NAME is the
-   value returned by base_name.  Act like strlen (NAME), except omit
-   redundant trailing slashes.  */
-
-size_t
-base_len (char const *name)
-{
-  size_t len;
-
-  for (len = strlen (name);  1 < len && ISSLASH (name[len - 1]);  len--)
-    continue;
-
-  return len;
-}
diff --git a/lib/bbitset.h b/lib/bbitset.h
deleted file mode 100644
index 956fc5c..0000000
--- a/lib/bbitset.h
+++ /dev/null
@@ -1,302 +0,0 @@
-/* Base bitset stuff.
-   Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
-   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
-
-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 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, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef _BBITSET_H
-#define _BBITSET_H
-
-#include "libiberty.h"
-
-#include <stdbool.h>
-#include <limits.h>
-#include <stddef.h>
-
-/* Currently we support five flavours of bitsets:
-   BITSET_ARRAY:  Array of bits (fixed size, fast for dense bitsets).
-                  Memory for bit array and bitset structure allocated
-                  contiguously.
-   BITSET_LIST:   Linked list of arrays of bits (variable size, least storage
-		  for large very sparse sets).
-   BITSET_TABLE:  Expandable table of pointers to arrays of bits
-		  (variable size, less storage for large sparse sets).
-                  Faster than BITSET_LIST for random access.
-   BITSET_VARRAY: Variable array of bits (variable size, fast for
-                  dense bitsets).
-   BITSET_STATS:  Wrapper bitset for internal use only.  Used for gathering
-                  statistics and/or better run-time checking.
-*/
-enum bitset_type {BITSET_ARRAY, BITSET_LIST, BITSET_TABLE, BITSET_VARRAY,
-		  BITSET_TYPE_NUM, BITSET_STATS};
-#define BITSET_TYPE_NAMES {"abitset", "lbitset", "ebitset", "vbitset"}
-
-extern const char * const bitset_type_names[];
-
-enum bitset_alloc_type {BITSET_MALLOC, BITSET_OBALLOC};
-
-/* Data type used to store a word of bits.  */
-typedef unsigned long int bitset_word;
-#define BITSET_WORD_BITS ((unsigned int) (CHAR_BIT * sizeof (bitset_word)))
-
-/* Bit index.  In theory we might need a type wider than size_t, but
-   in practice we lose at most a factor of CHAR_BIT by going with
-   size_t, and that is good enough.  If this type is changed to be
-   wider than size_t, the code needs to be modified to check for
-   overflow when converting bit counts to byte or word counts.
-   The bit and word index types must be unsigned.  */
-typedef size_t bitset_bindex;
-
-/* Word index.  */
-typedef size_t bitset_windex;
-
-/* Maximum values for commonly-used unsigned types.  BITSET_SIZE_MAX
-   always equals SIZE_MAX, but some older systems lack SIZE_MAX.  */
-#define BITSET_BINDEX_MAX ((bitset_bindex) -1)
-
-/* Limit max word index to the maximum value of a signed integer
-   to simplify cache disabling.  */
-#define BITSET_WINDEX_MAX (((bitset_windex) -1) >> 1)
-#define BITSET_SIZE_MAX ((size_t) -1)
-
-#define BITSET_MSB ((bitset_word) 1 << (BITSET_WORD_BITS - 1))
-
-#define BITSET_LIST_SIZE 1024
-
-enum bitset_ops {BITSET_OP_ZERO, BITSET_OP_ONES,
-		 BITSET_OP_COPY, BITSET_OP_NOT,
-		 BITSET_OP_EMPTY_P, BITSET_OP_EQUAL_P,
-		 BITSET_OP_SUBSET_P, BITSET_OP_DISJOINT_P,
-		 BITSET_OP_AND, BITSET_OP_OR, BITSET_OP_XOR, BITSET_OP_ANDN,
-		 BITSET_OP_OR_AND, BITSET_OP_AND_OR, BITSET_OP_ANDN_OR};
-
-struct bbitset_struct
-{
-  const struct bitset_vtable *vtable;
-  bitset_windex cindex;		/* Cache word index.  */
-  bitset_windex csize;		/* Cache size in words.  */
-  bitset_word *cdata;		/* Cache data pointer.  */
-  bitset_bindex n_bits;		/* Number of bits.  */
-  /* Perhaps we could sacrifice another word to indicate
-     that the bitset is known to be zero, that a bit has been set
-     in the cache, and that a bit has been cleared in the cache.
-     This would speed up some of the searches but slightly slow down
-     bit set/reset operations of cached bits.  */
-};
-
-
-typedef union bitset_union *bitset;
-
-
-/* Private accessor macros to bitset structure.  */
-#define BITSET_VTABLE_(SRC) (SRC)->b.vtable
-#define BITSET_CINDEX_(SRC) (SRC)->b.cindex
-#define BITSET_CDATA_(SRC) (SRC)->b.cdata
-#define BITSET_CSIZE_(SRC) (SRC)->b.csize
-#define BITSET_NBITS_(SRC) (SRC)->b.n_bits
-
-
-/* The contents of this structure should be considered private.  */
-struct bitset_vtable
-{
-  void (*set) (bitset, bitset_bindex);
-  void (*reset) (bitset, bitset_bindex);
-  bool (*toggle) (bitset, bitset_bindex);
-  bool (*test) (bitset, bitset_bindex);
-  bitset_bindex (*resize) (bitset, bitset_bindex);
-  bitset_bindex (*size) (bitset);
-  bitset_bindex (*count) (bitset);
-
-  bool (*empty_p) (bitset);
-  void (*ones) (bitset);
-  void (*zero) (bitset);
-
-  void (*copy) (bitset, bitset);
-  bool (*disjoint_p) (bitset, bitset);
-  bool (*equal_p) (bitset, bitset);
-  void (*not_) (bitset, bitset);
-  bool (*subset_p) (bitset, bitset);
-
-  void (*and_) (bitset, bitset, bitset);
-  bool (*and_cmp) (bitset, bitset, bitset);
-  void (*andn) (bitset, bitset, bitset);
-  bool (*andn_cmp) (bitset, bitset, bitset);
-  void (*or_) (bitset, bitset, bitset);
-  bool (*or_cmp) (bitset, bitset, bitset);
-  void (*xor_) (bitset, bitset, bitset);
-  bool (*xor_cmp) (bitset, bitset, bitset);
-
-  void (*and_or) (bitset, bitset, bitset, bitset);
-  bool (*and_or_cmp) (bitset, bitset, bitset, bitset);
-  void (*andn_or) (bitset, bitset, bitset, bitset);
-  bool (*andn_or_cmp) (bitset, bitset, bitset, bitset);
-  void (*or_and) (bitset, bitset, bitset, bitset);
-  bool (*or_and_cmp) (bitset, bitset, bitset, bitset);
-
-  bitset_bindex (*list) (bitset, bitset_bindex *, bitset_bindex,
-			 bitset_bindex *);
-  bitset_bindex (*list_reverse) (bitset, bitset_bindex *, bitset_bindex,
-				 bitset_bindex *);
-  void (*free) (bitset);
-  enum bitset_type type;
-};
-
-#define BITSET_COMPATIBLE_(BSET1, BSET2) \
-((BSET1)->b.vtable == (BSET2)->b.vtable)
-
-#define BITSET_CHECK2_(DST, SRC) \
-if (!BITSET_COMPATIBLE_ (DST, SRC)) abort ();
-
-#define BITSET_CHECK3_(DST, SRC1, SRC2) \
-if (!BITSET_COMPATIBLE_ (DST, SRC1) \
-    || !BITSET_COMPATIBLE_ (DST, SRC2)) abort ();
-
-#define BITSET_CHECK4_(DST, SRC1, SRC2, SRC3) \
-if (!BITSET_COMPATIBLE_ (DST, SRC1) || !BITSET_COMPATIBLE_ (DST, SRC2) \
-    || !BITSET_COMPATIBLE_ (DST, SRC3)) abort ();
-
-
-/* Redefine number of bits in bitset DST.  */
-#define BITSET_RESIZE_(DST, SIZE) (DST)->b.vtable->resize (DST, SIZE)
-
-/* Return size in bits of bitset SRC.  */
-#define BITSET_SIZE_(SRC) (SRC)->b.vtable->size (SRC)
-
-/* Return number of bits set in bitset SRC.  */
-#define BITSET_COUNT_(SRC) (SRC)->b.vtable->count (SRC)
-
-/* Return type of bitset SRC.  */
-#define BITSET_TYPE_(DST) (DST)->b.vtable->type
-
-/* Set bit BITNO in bitset DST.  */
-#define BITSET_SET_(DST, BITNO) (DST)->b.vtable->set (DST, BITNO)
-
-/* Reset bit BITNO in bitset DST.  */
-#define BITSET_RESET_(DST, BITNO) (DST)->b.vtable->reset (DST, BITNO)
-
-/* Toggle bit BITNO in bitset DST.  */
-#define BITSET_TOGGLE_(DST, BITNO) (DST)->b.vtable->toggle (DST, BITNO)
-
-/* Return non-zero if bit BITNO in bitset SRC is set.  */
-#define BITSET_TEST_(SRC, BITNO) (SRC)->b.vtable->test (SRC, BITNO)
-
-/* Free bitset SRC.  */
-#define BITSET_FREE_(SRC)\
- ((SRC)->b.vtable->free ? (SRC)->b.vtable->free (SRC) :(void)0)
-
-
-/* Return SRC == 0.  */
-#define BITSET_EMPTY_P_(SRC) (SRC)->b.vtable->empty_p (SRC)
-
-/* DST = ~0.  */
-#define BITSET_ONES_(DST) (DST)->b.vtable->ones (DST)
-
-/* DST = 0.  */
-#define BITSET_ZERO_(DST) (DST)->b.vtable->zero (DST)
-
-
-
-/* DST = SRC.  */
-#define BITSET_COPY_(DST, SRC) (SRC)->b.vtable->copy (DST, SRC)
-
-/* Return DST & SRC == 0.  */
-#define BITSET_DISJOINT_P_(DST, SRC) (SRC)->b.vtable->disjoint_p (DST, SRC)
-
-/* Return DST == SRC.  */
-#define BITSET_EQUAL_P_(DST, SRC) (SRC)->b.vtable->equal_p (DST, SRC)
-
-/* DST = ~SRC.  */
-#define BITSET_NOT_(DST, SRC) (SRC)->b.vtable->not_ (DST, SRC)
-
-/* Return DST == DST | SRC.  */
-#define BITSET_SUBSET_P_(DST, SRC) (SRC)->b.vtable->subset_p (DST, SRC)
-
-
-/* DST = SRC1 & SRC2.  */
-#define BITSET_AND_(DST, SRC1, SRC2) (SRC1)->b.vtable->and_ (DST, SRC1, SRC2)
-#define BITSET_AND_CMP_(DST, SRC1, SRC2) (SRC1)->b.vtable->and_cmp (DST, SRC1, SRC2)
-
-/* DST = SRC1 & ~SRC2.  */
-#define BITSET_ANDN_(DST, SRC1, SRC2) (SRC1)->b.vtable->andn (DST, SRC1, SRC2)
-#define BITSET_ANDN_CMP_(DST, SRC1, SRC2) (SRC1)->b.vtable->andn_cmp (DST, SRC1, SRC2)
-
-/* DST = SRC1 | SRC2.  */
-#define BITSET_OR_(DST, SRC1, SRC2) (SRC1)->b.vtable->or_ (DST, SRC1, SRC2)
-#define BITSET_OR_CMP_(DST, SRC1, SRC2) (SRC1)->b.vtable->or_cmp (DST, SRC1, SRC2)
-
-/* DST = SRC1 ^ SRC2.  */
-#define BITSET_XOR_(DST, SRC1, SRC2) (SRC1)->b.vtable->xor_ (DST, SRC1, SRC2)
-#define BITSET_XOR_CMP_(DST, SRC1, SRC2) (SRC1)->b.vtable->xor_cmp (DST, SRC1, SRC2)
-
-
-
-/* DST = (SRC1 & SRC2) | SRC3.  Return non-zero if
-   DST != (SRC1 & SRC2) | SRC3.  */
-#define BITSET_AND_OR_(DST, SRC1, SRC2, SRC3) \
- (SRC1)->b.vtable->and_or (DST, SRC1, SRC2, SRC3)
-#define BITSET_AND_OR_CMP_(DST, SRC1, SRC2, SRC3) \
- (SRC1)->b.vtable->and_or_cmp (DST, SRC1, SRC2, SRC3)
-
-/* DST = (SRC1 & ~SRC2) | SRC3.  Return non-zero if
-   DST != (SRC1 & ~SRC2) | SRC3.  */
-#define BITSET_ANDN_OR_(DST, SRC1, SRC2, SRC3) \
- (SRC1)->b.vtable->andn_or (DST, SRC1, SRC2, SRC3)
-#define BITSET_ANDN_OR_CMP_(DST, SRC1, SRC2, SRC3) \
- (SRC1)->b.vtable->andn_or_cmp (DST, SRC1, SRC2, SRC3)
-
-/* DST = (SRC1 | SRC2) & SRC3.  Return non-zero if
-   DST != (SRC1 | SRC2) & SRC3.  */
-#define BITSET_OR_AND_(DST, SRC1, SRC2, SRC3) \
- (SRC1)->b.vtable->or_and (DST, SRC1, SRC2, SRC3)
-#define BITSET_OR_AND_CMP_(DST, SRC1, SRC2, SRC3) \
- (SRC1)->b.vtable->or_and_cmp (DST, SRC1, SRC2, SRC3)
-
-
-/* Find list of up to NUM bits set in BSET starting from and including
-   *NEXT.  Return with actual number of bits found and with *NEXT
-   indicating where search stopped.  */
-#define BITSET_LIST_(BSET, LIST, NUM, NEXT) \
- (BSET)->b.vtable->list (BSET, LIST, NUM, NEXT)
-
-/* Find reverse list of up to NUM bits set in BSET starting from and
-   including NEXT.  Return with actual number of bits found and with
-   *NEXT indicating where search stopped.  */
-#define BITSET_LIST_REVERSE_(BSET, LIST, NUM, NEXT) \
- (BSET)->b.vtable->list_reverse (BSET, LIST, NUM, NEXT)
-
-
-/* Private functions for bitset implementations.  */
-
-extern bool bitset_toggle_ (bitset, bitset_bindex);
-
-extern bitset_bindex bitset_count_ (bitset);
-
-extern bitset_bindex bitset_size_ (bitset);
-
-extern bool bitset_copy_ (bitset, bitset);
-
-extern void bitset_and_or_ (bitset, bitset, bitset, bitset);
-
-extern bool bitset_and_or_cmp_ (bitset, bitset, bitset, bitset);
-
-extern void bitset_andn_or_ (bitset, bitset, bitset, bitset);
-
-extern bool bitset_andn_or_cmp_ (bitset, bitset, bitset, bitset);
-
-extern void bitset_or_and_ (bitset, bitset, bitset, bitset);
-
-extern bool bitset_or_and_cmp_ (bitset, bitset, bitset, bitset);
-
-#endif /* _BBITSET_H  */
diff --git a/lib/bitset.c b/lib/bitset.c
deleted file mode 100644
index 2924567..0000000
--- a/lib/bitset.c
+++ /dev/null
@@ -1,505 +0,0 @@
-/* General bitsets.
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
-
-   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 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, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include "bitset.h"
-#include "abitset.h"
-#include "lbitset.h"
-#include "ebitset.h"
-#include "vbitset.h"
-#include "bitset_stats.h"
-#include "obstack.h"
-
-const char * const bitset_type_names[] = BITSET_TYPE_NAMES;
-
-
-/* Return number of bytes required to create a N_BIT bitset
-   of TYPE.  The bitset may grow to require more bytes than this.  */
-size_t
-bitset_bytes (enum bitset_type type, bitset_bindex n_bits)
-{
-  size_t bytes;
-
-  if (bitset_stats_enabled)
-    return bitset_stats_bytes ();
-
-  switch (type)
-    {
-    default:
-      abort ();
-
-    case BITSET_ARRAY:
-      bytes = abitset_bytes (n_bits);
-      break;
-
-    case BITSET_LIST:
-      bytes = lbitset_bytes (n_bits);
-      break;
-
-    case BITSET_TABLE:
-      bytes = ebitset_bytes (n_bits);
-      break;
-
-    case BITSET_VARRAY:
-      bytes = vbitset_bytes (n_bits);
-      break;
-    }
-
-  return bytes;
-}
-
-
-/* Initialise bitset BSET of TYPE for N_BITS.  */
-bitset
-bitset_init (bitset bset, bitset_bindex n_bits, enum bitset_type type)
-{
-  if (bitset_stats_enabled)
-    return bitset_stats_init (bset, n_bits, type);
-
-  switch (type)
-    {
-    default:
-      abort ();
-
-    case BITSET_ARRAY:
-      return abitset_init (bset, n_bits);
-
-    case BITSET_LIST:
-      return lbitset_init (bset, n_bits);
-
-    case BITSET_TABLE:
-      return ebitset_init (bset, n_bits);
-
-    case BITSET_VARRAY:
-      return vbitset_init (bset, n_bits);
-    }
-}
-
-
-/* Select a bitset type for a set of N_BITS and with attribute hints
-   specified by ATTR.  For variable size bitsets, N_BITS is only a
-   hint and may be zero.  */
-enum bitset_type
-bitset_type_choose (bitset_bindex n_bits ATTRIBUTE_UNUSED, unsigned int attr)
-{
-  /* Check attributes.  */
-  if (attr & BITSET_FIXED && attr & BITSET_VARIABLE)
-    abort ();
-  if (attr & BITSET_SPARSE && attr & BITSET_DENSE)
-    abort ();
-
-  /* Choose the type of bitset.  Note that sometimes we will be asked
-  for a zero length fixed size bitset.  */
-
-
-  /* If no attributes selected, choose a good compromise.  */
-  if (!attr)
-    return BITSET_VARRAY;
-
-  if (attr & BITSET_SPARSE)
-    return BITSET_LIST;
-
-  if (attr & BITSET_FIXED)
-    return BITSET_ARRAY;
-
-  if (attr & BITSET_GREEDY)
-    return BITSET_TABLE;
-
-  return BITSET_VARRAY;
-}
-
-
-/* Create a bitset of N_BITS of type TYPE.  */
-bitset
-bitset_alloc (bitset_bindex n_bits, enum bitset_type type)
-{
-  size_t bytes;
-  bitset bset;
-
-  bytes = bitset_bytes (type, n_bits);
-
-  bset = xcalloc (1, bytes);
-
-  /* The cache is disabled until some elements are allocated.  If we
-     have variable length arrays, then we may need to allocate a dummy
-     element.  */
-
-  return bitset_init (bset, n_bits, type);
-}
-
-
-/* Create a bitset of N_BITS of type TYPE.  */
-bitset
-bitset_obstack_alloc (struct obstack *bobstack,
-		      bitset_bindex n_bits, enum bitset_type type)
-{
-  size_t bytes;
-  bitset bset;
-
-  bytes = bitset_bytes (type, n_bits);
-
-  bset = obstack_alloc (bobstack, bytes);
-  memset (bset, 0, bytes);
-
-  return bitset_init (bset, n_bits, type);
-}
-
-
-/* Create a bitset of N_BITS and with attribute hints specified by
-   ATTR.  */
-bitset
-bitset_create (bitset_bindex n_bits, unsigned int attr)
-{
-  enum bitset_type type;
-
-  type = bitset_type_choose (n_bits, attr);
-
-  return bitset_alloc (n_bits, type);
-}
-
-
-/* Free bitset BSET.  */
-void
-bitset_free (bitset bset)
-{
-  BITSET_FREE_ (bset);
-  free (bset);
-}
-
-
-/* Free bitset BSET allocated on obstack.  */
-void
-bitset_obstack_free (bitset bset)
-{
-  BITSET_FREE_ (bset);
-}
-
-
-/* Return bitset type.  */
-enum bitset_type
-bitset_type_get (bitset bset)
-{
-   enum bitset_type type;
-
-   type = BITSET_TYPE_ (bset);
-   if (type != BITSET_STATS)
-      return type;
-
-   return bitset_stats_type_get (bset);
-}
-
-
-/* Return name of bitset type.  */
-const char *
-bitset_type_name_get (bitset bset)
-{
-  enum bitset_type type;
-
-  type = bitset_type_get (bset);
-
-  return bitset_type_names[type];
-}
-
-
-/* Find next bit set in SRC starting from and including BITNO.
-   Return BITSET_BINDEX_MAX if SRC empty.  */
-bitset_bindex
-bitset_next (bitset src, bitset_bindex bitno)
-{
-  bitset_bindex val;
-  bitset_bindex next = bitno;
-
-  if (!bitset_list (src, &val, 1, &next))
-    return BITSET_BINDEX_MAX;
-  return val;
-}
-
-
-/* Return true if both bitsets are of the same type and size.  */
-extern bool
-bitset_compatible_p (bitset bset1, bitset bset2)
-{
-    return BITSET_COMPATIBLE_ (bset1, bset2);
-}
-
-
-/* Find previous bit set in SRC starting from and including BITNO.
-   Return BITSET_BINDEX_MAX if SRC empty.  */
-bitset_bindex
-bitset_prev (bitset src, bitset_bindex bitno)
-{
-  bitset_bindex val;
-  bitset_bindex next = bitno;
-
-  if (!bitset_list_reverse (src, &val, 1, &next))
-    return BITSET_BINDEX_MAX;
-  return val;
-}
-
-
-/* Find first set bit.   */
-bitset_bindex
-bitset_first (bitset src)
-{
-  return bitset_next (src, 0);
-}
-
-
-/* Find last set bit.   */
-bitset_bindex
-bitset_last (bitset src)
-{
-  return bitset_prev (src, 0);
-}
-
-
-/* Is BITNO in SRC the only set bit?  */
-bool
-bitset_only_set_p (bitset src, bitset_bindex bitno)
-{
-  bitset_bindex val[2];
-  bitset_bindex next = 0;
-
-  if (bitset_list (src, val, 2, &next) != 1)
-    return false;
-  return val[0] == bitno;
-}
-
-
-/* Print contents of bitset BSET to FILE.   */
-static void
-bitset_print (FILE *file, bitset bset, bool verbose)
-{
-  unsigned int pos;
-  bitset_bindex i;
-  bitset_iterator iter;
-
-  if (verbose)
-    fprintf (file, "n_bits = %lu, set = {",
-	     (unsigned long int) bitset_size (bset));
-
-  pos = 30;
-  BITSET_FOR_EACH (iter, bset, i, 0)
-  {
-    if (pos > 70)
-      {
-	fprintf (file, "\n");
-	pos = 0;
-      }
-
-    fprintf (file, "%lu ", (unsigned long int) i);
-    pos += 1 + (i >= 10) + (i >= 100);
-  };
-
-  if (verbose)
-    fprintf (file, "}\n");
-}
-
-
-/* Dump bitset BSET to FILE.  */
-void
-bitset_dump (FILE *file, bitset bset)
-{
-  bitset_print (file, bset, false);
-}
-
-
-/* Release memory associated with bitsets.  */
-void
-bitset_release_memory (void)
-{
-  lbitset_release_memory ();
-  ebitset_release_memory ();
-}
-
-
-/* Toggle bit BITNO in bitset BSET and the new value of the bit.  */
-bool
-bitset_toggle_ (bitset bset, bitset_bindex bitno)
-{
-  /* This routine is for completeness.  It could be optimized if
-     required.  */
-  if (bitset_test (bset, bitno))
-    {
-      bitset_reset (bset, bitno);
-      return false;
-    }
-  else
-    {
-      bitset_set (bset, bitno);
-      return true;
-    }
-}
-
-
-/* Return number of bits in bitset SRC.  */
-bitset_bindex
-bitset_size_ (bitset src)
-{
-    return BITSET_NBITS_ (src);
-}
-
-
-/* Return number of bits set in bitset SRC.  */
-bitset_bindex
-bitset_count_ (bitset src)
-{
-  bitset_bindex list[BITSET_LIST_SIZE];
-  bitset_bindex next;
-  bitset_bindex num;
-  bitset_bindex count;
-
-  /* This could be greatly sped up by adding a count method for each
-     bitset implementation that uses a direct technique (based on
-     masks) for counting the number of bits set in a word.  */
-
-  next = 0;
-  for (count = 0; (num = bitset_list (src, list, BITSET_LIST_SIZE, &next));
-       count += num)
-    continue;
-
-  return count;
-}
-
-
-/* DST = SRC.  Return true if DST != SRC.
-   This is a fallback for the case where SRC and DST are different
-   bitset types.  */
-bool
-bitset_copy_ (bitset dst, bitset src)
-{
-  bitset_bindex i;
-  bitset_iterator iter;
-
-  /* Convert bitset types.  We assume that the DST bitset
-     is large enough to hold the SRC bitset.  */
-  bitset_zero (dst);
-  BITSET_FOR_EACH (iter, src, i, 0)
-  {
-     bitset_set (dst, i);
-  };
-
-  return true;
-}
-
-
-/* This is a fallback for implementations that do not support
-   four operand operations.  */
-static inline bool
-bitset_op4_cmp (bitset dst, bitset src1, bitset src2, bitset src3,
-		enum bitset_ops op)
-{
-  bool changed = false;
-  bool stats_enabled_save;
-  bitset tmp;
-
-  /* Create temporary bitset.  */
-  stats_enabled_save = bitset_stats_enabled;
-  bitset_stats_enabled = false;
-  tmp = bitset_alloc (0, bitset_type_get (dst));
-  bitset_stats_enabled = stats_enabled_save;
-
-  switch (op)
-    {
-    default:
-      abort ();
-
-    case BITSET_OP_OR_AND:
-      bitset_or (tmp, src1, src2);
-      changed = bitset_and_cmp (dst, src3, tmp);
-      break;
-
-    case BITSET_OP_AND_OR:
-      bitset_and (tmp, src1, src2);
-      changed = bitset_or_cmp (dst, src3, tmp);
-      break;
-
-    case BITSET_OP_ANDN_OR:
-      bitset_andn (tmp, src1, src2);
-      changed = bitset_or_cmp (dst, src3, tmp);
-      break;
-    }
-
-  bitset_free (tmp);
-  return changed;
-}
-
-
-/* DST = (SRC1 & SRC2) | SRC3.  */
-void
-bitset_and_or_ (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  bitset_and_or_cmp_ (dst, src1, src2, src3);
-}
-
-
-/* DST = (SRC1 & SRC2) | SRC3.  Return non-zero if
-   DST != (SRC1 & SRC2) | SRC3.  */
-bool
-bitset_and_or_cmp_ (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  return bitset_op4_cmp (dst, src1, src2, src3, BITSET_OP_AND_OR);
-}
-
-
-/* DST = (SRC1 & ~SRC2) | SRC3.  */
-void
-bitset_andn_or_ (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  bitset_andn_or_cmp_ (dst, src1, src2, src3);
-}
-
-
-/* DST = (SRC1 & ~SRC2) | SRC3.  Return non-zero if
-   DST != (SRC1 & ~SRC2) | SRC3.  */
-bool
-bitset_andn_or_cmp_ (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  return bitset_op4_cmp (dst, src1, src2, src3, BITSET_OP_ANDN_OR);
-}
-
-
-/* DST = (SRC1 | SRC2) & SRC3.  */
-void
-bitset_or_and_ (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  bitset_or_and_cmp_ (dst, src1, src2, src3);
-}
-
-
-/* DST = (SRC1 | SRC2) & SRC3.  Return non-zero if
-   DST != (SRC1 | SRC2) & SRC3.  */
-bool
-bitset_or_and_cmp_ (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  return bitset_op4_cmp (dst, src1, src2, src3, BITSET_OP_OR_AND);
-}
-
-
-/* Function to be called from debugger to print bitset.  */
-void
-debug_bitset (bitset bset)
-{
-  if (bset)
-    bitset_print (stderr, bset, true);
-}
diff --git a/lib/bitset.h b/lib/bitset.h
deleted file mode 100644
index 45c8818..0000000
--- a/lib/bitset.h
+++ /dev/null
@@ -1,392 +0,0 @@
-/* Generic bitsets.
-   Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
-   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
-
-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 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, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef _BITSET_H
-#define _BITSET_H
-
-/* This file is the public interface to the bitset abstract data type.
-   Only use the functions and macros defined in this file.  */
-
-#include "bbitset.h"
-#include "obstack.h"
-#include <stdio.h>
-
-#if USE_UNLOCKED_IO
-# include "unlocked-io.h"
-#endif
-
-/* Attributes used to select a bitset implementation.  */
-enum bitset_attr {BITSET_FIXED = 1,    /* Bitset size fixed.  */
-		  BITSET_VARIABLE = 2, /* Bitset size variable.  */
-		  BITSET_DENSE = 4,    /* Bitset dense.  */
-		  BITSET_SPARSE = 8,   /* Bitset sparse.  */
-		  BITSET_FRUGAL = 16,  /* Prefer most compact.  */
-		  BITSET_GREEDY = 32}; /* Prefer fastest at memory expense.  */
-
-typedef unsigned int bitset_attrs;
-
-/* The contents of the union should be considered to be private.
-   While I would like to make this union opaque, it needs to be
-   visible for the inline bit set/test functions, and for delegation
-   to the proper implementation.  */
-union bitset_union
-{
-  /* This must be the first member of every other structure that is a
-     member of this union.  */
-  struct bbitset_struct b;	        /* Base bitset data.  */
-
-  struct abitset_struct
-  {
-    struct bbitset_struct b;
-    bitset_word words[1];		/* The array of bits.  */
-  } a;
-
-  struct ebitset_struct
-  {
-    struct bbitset_struct b;
-    bitset_windex size;			/* Number of elements.  */
-    struct ebitset_elt_struct **elts;	/* Expanding array of ptrs to elts.  */
-  } e;
-
-  struct lbitset_struct
-  {
-    struct bbitset_struct b;
-    struct lbitset_elt_struct *head;	/* First element in linked list.  */
-    struct lbitset_elt_struct *tail;	/* Last element in linked list.  */
-  } l;
-
-  struct bitset_stats_struct
-  {
-    struct bbitset_struct b;
-    bitset bset;
-  } s;
-
-  struct vbitset_struct
-  {
-    struct bbitset_struct b;
-    bitset_windex size;			/* Allocated size of array.  */
-  } v;
-
-};
-
-
-/* The contents of this structure should be considered private.
-   It is used for iterating over set bits.  */
-typedef struct
-{
-  bitset_bindex list[BITSET_LIST_SIZE];
-  bitset_bindex next;
-  bitset_bindex num;
-  bitset_bindex i;
-} bitset_iterator;
-
-
-/* Return bytes required for bitset of desired type and size.  */
-extern size_t bitset_bytes (enum bitset_type, bitset_bindex);
-
-/* Initialise a bitset with desired type and size.  */
-extern bitset bitset_init (bitset, bitset_bindex, enum bitset_type);
-
-/* Select an implementation type based on the desired bitset size
-   and attributes.  */
-extern enum bitset_type bitset_type_choose (bitset_bindex, bitset_attrs);
-
-/* Create a bitset of desired type and size.  The bitset is zeroed.  */
-extern bitset bitset_alloc (bitset_bindex, enum bitset_type);
-
-/* Free bitset.  */
-extern void bitset_free (bitset);
-
-/* Create a bitset of desired type and size using an obstack.  The
-   bitset is zeroed.  */
-extern bitset bitset_obstack_alloc (struct obstack *bobstack,
-				    bitset_bindex, enum bitset_type);
-
-/* Free bitset allocated on obstack.  */
-extern void bitset_obstack_free (bitset);
-
-/* Create a bitset of desired size and attributes.  The bitset is zeroed.  */
-extern bitset bitset_create (bitset_bindex, bitset_attrs);
-
-/* Return bitset type.  */
-extern enum bitset_type bitset_type_get (bitset);
-
-/* Return bitset type name.  */
-extern const char *bitset_type_name_get (bitset);
-
-
-/* Set bit BITNO in bitset BSET.  */
-static inline void
-bitset_set (bitset bset, bitset_bindex bitno)
-{
-  bitset_windex windex = bitno / BITSET_WORD_BITS;
-  bitset_windex offset = windex - bset->b.cindex;
-
-  if (offset < bset->b.csize)
-    bset->b.cdata[offset] |= ((bitset_word) 1 << (bitno % BITSET_WORD_BITS));
-  else
-    BITSET_SET_ (bset, bitno);
-}
-
-
-/* Reset bit BITNO in bitset BSET.  */
-static inline void
-bitset_reset (bitset bset, bitset_bindex bitno)
-{
-  bitset_windex windex = bitno / BITSET_WORD_BITS;
-  bitset_windex offset = windex - bset->b.cindex;
-
-  if (offset < bset->b.csize)
-    bset->b.cdata[offset] &= ~((bitset_word) 1 << (bitno % BITSET_WORD_BITS));
-  else
-    BITSET_RESET_ (bset, bitno);
-}
-
-
-/* Test bit BITNO in bitset BSET.  */
-static inline bool
-bitset_test (bitset bset, bitset_bindex bitno)
-{
-  bitset_windex windex = bitno / BITSET_WORD_BITS;
-  bitset_windex offset = windex - bset->b.cindex;
-
-  if (offset < bset->b.csize)
-    return (bset->b.cdata[offset] >> (bitno % BITSET_WORD_BITS)) & 1;
-  else
-    return BITSET_TEST_ (bset, bitno);
-}
-
-
-/* Toggle bit BITNO in bitset BSET and return non-zero if now set.  */
-#define bitset_toggle(bset, bitno) BITSET_TOGGLE_ (bset, bitno)
-
-/* Return size in bits of bitset SRC.  */
-#define bitset_size(SRC) BITSET_SIZE_ (SRC)
-
-/* Change size of bitset.  */
-extern void bitset_resize (bitset, bitset_bindex);
-
-/* Return number of bits set in bitset SRC.  */
-#define bitset_count(SRC) BITSET_COUNT_ (SRC)
-
-
-/* Return SRC == 0.  */
-#define bitset_empty_p(SRC) BITSET_EMPTY_P_ (SRC)
-
-/* DST = ~0.  */
-#define bitset_ones(DST) BITSET_ONES_ (DST)
-
-/* DST = 0.  */
-#define bitset_zero(DST) BITSET_ZERO_ (DST)
-
-
-
-/* DST = SRC.  */
-#define bitset_copy(DST, SRC) BITSET_COPY_ (DST, SRC)
-
-/* Return DST & SRC == 0.  */
-#define bitset_disjoint_p(DST, SRC) BITSET_DISJOINT_P_ (DST, SRC)
-
-/* Return DST == SRC.  */
-#define bitset_equal_p(DST, SRC) BITSET_EQUAL_P_ (DST, SRC)
-
-/* DST = ~SRC.  */
-#define bitset_not(DST, SRC) BITSET_NOT_ (DST, SRC)
-
-/* Return DST == DST | SRC.  */
-#define bitset_subset_p(DST, SRC) BITSET_SUBSET_P_ (DST, SRC)
-
-
-
-/* DST = SRC1 & SRC2.  */
-#define bitset_and(DST, SRC1, SRC2) BITSET_AND_ (DST, SRC1, SRC2)
-
-/* DST = SRC1 & SRC2.  Return non-zero if DST != SRC1 & SRC2.  */
-#define bitset_and_cmp(DST, SRC1, SRC2) BITSET_AND_CMP_ (DST, SRC1, SRC2)
-
-/* DST = SRC1 & ~SRC2.  */
-#define bitset_andn(DST, SRC1, SRC2) BITSET_ANDN_ (DST, SRC1, SRC2)
-
-/* DST = SRC1 & ~SRC2.  Return non-zero if DST != SRC1 & ~SRC2.  */
-#define bitset_andn_cmp(DST, SRC1, SRC2) BITSET_ANDN_CMP_ (DST, SRC1, SRC2)
-
-/* DST = SRC1 | SRC2.  */
-#define bitset_or(DST, SRC1, SRC2) BITSET_OR_ (DST, SRC1, SRC2)
-
-/* DST = SRC1 | SRC2.  Return non-zero if DST != SRC1 | SRC2.  */
-#define bitset_or_cmp(DST, SRC1, SRC2) BITSET_OR_CMP_ (DST, SRC1, SRC2)
-
-/* DST = SRC1 ^ SRC2.  */
-#define bitset_xor(DST, SRC1, SRC2) BITSET_XOR_ (DST, SRC1, SRC2)
-
-/* DST = SRC1 ^ SRC2.  Return non-zero if DST != SRC1 ^ SRC2.  */
-#define bitset_xor_cmp(DST, SRC1, SRC2) BITSET_XOR_CMP_ (DST, SRC1, SRC2)
-
-
-
-/* DST = (SRC1 & SRC2) | SRC3.  */
-#define bitset_and_or(DST, SRC1, SRC2, SRC3) \
- BITSET_AND_OR_ (DST, SRC1, SRC2, SRC3)
-
-/* DST = (SRC1 & SRC2) | SRC3.  Return non-zero if
-   DST != (SRC1 & SRC2) | SRC3.  */
-#define bitset_and_or_cmp(DST, SRC1, SRC2, SRC3) \
- BITSET_AND_OR_CMP_ (DST, SRC1, SRC2, SRC3)
-
-/* DST = (SRC1 & ~SRC2) | SRC3.  */
-#define bitset_andn_or(DST, SRC1, SRC2, SRC3) \
- BITSET_ANDN_OR_ (DST, SRC1, SRC2, SRC3)
-
-/* DST = (SRC1 & ~SRC2) | SRC3.  Return non-zero if
-   DST != (SRC1 & ~SRC2) | SRC3.  */
-#define bitset_andn_or_cmp(DST, SRC1, SRC2, SRC3) \
- BITSET_ANDN_OR_CMP_ (DST, SRC1, SRC2, SRC3)
-
-/* DST = (SRC1 | SRC2) & SRC3.  */
-#define bitset_or_and(DST, SRC1, SRC2, SRC3)\
- BITSET_OR_AND_ (DST, SRC1, SRC2, SRC3)
-
-/* DST = (SRC1 | SRC2) & SRC3.  Return non-zero if
-   DST != (SRC1 | SRC2) & SRC3.  */
-#define bitset_or_and_cmp(DST, SRC1, SRC2, SRC3)\
- BITSET_OR_AND_CMP_ (DST, SRC1, SRC2, SRC3)
-
-/* Find list of up to NUM bits set in BSET starting from and including
-   *NEXT.  Return with actual number of bits found and with *NEXT
-   indicating where search stopped.  */
-#define bitset_list(BSET, LIST, NUM, NEXT) \
- BITSET_LIST_ (BSET, LIST, NUM, NEXT)
-
-/* Find reverse list of up to NUM bits set in BSET starting from and
-   including NEXT.  Return with actual number of bits found and with
-   *NEXT indicating where search stopped.  */
-#define bitset_list_reverse(BSET, LIST, NUM, NEXT) \
- BITSET_LIST_REVERSE_ (BSET, LIST, NUM, NEXT)
-
-/* Return true if both bitsets are of the same type and size.  */
-extern bool bitset_compatible_p (bitset bset1, bitset bset2);
-
-/* Find next set bit from the given bit index.  */
-extern bitset_bindex bitset_next (bitset, bitset_bindex);
-
-/* Find previous set bit from the given bit index.  */
-extern bitset_bindex bitset_prev (bitset, bitset_bindex);
-
-/* Find first set bit.  */
-extern bitset_bindex bitset_first (bitset);
-
-/* Find last set bit.  */
-extern bitset_bindex bitset_last (bitset);
-
-/* Return nonzero if this is the only set bit.  */
-extern bool bitset_only_set_p (bitset, bitset_bindex);
-
-/* Dump bitset.  */
-extern void bitset_dump (FILE *, bitset);
-
-/* Loop over all elements of BSET, starting with MIN, setting INDEX
-   to the index of each set bit.  For example, the following will print
-   the bits set in a bitset:
-
-   bitset_bindex i;
-   bitset_iterator iter;
-
-   BITSET_FOR_EACH (iter, src, i, 0)
-   {
-      printf ("%lu ", (unsigned long int) i);
-   };
-*/
-#define BITSET_FOR_EACH(ITER, BSET, INDEX, MIN)				      \
-  for (ITER.next = (MIN), ITER.num = BITSET_LIST_SIZE;			      \
-       (ITER.num == BITSET_LIST_SIZE)					      \
-       && (ITER.num = bitset_list (BSET, ITER.list,			      \
-				   BITSET_LIST_SIZE, &ITER.next));)	      \
-    for (ITER.i = 0;							      \
-	 ITER.i < ITER.num && ((INDEX) = ITER.list[ITER.i], 1);		      \
-	 ITER.i++)
-
-
-/* Loop over all elements of BSET, in reverse order starting with
-   MIN, setting INDEX to the index of each set bit.  For example, the
-   following will print the bits set in a bitset in reverse order:
-
-   bitset_bindex i;
-   bitset_iterator iter;
-
-   BITSET_FOR_EACH_REVERSE (iter, src, i, 0)
-   {
-      printf ("%lu ", (unsigned long int) i);
-   };
-*/
-#define BITSET_FOR_EACH_REVERSE(ITER, BSET, INDEX, MIN)			      \
-  for (ITER.next = (MIN), ITER.num = BITSET_LIST_SIZE;			      \
-       (ITER.num == BITSET_LIST_SIZE)					      \
-       && (ITER.num = bitset_list_reverse (BSET, ITER.list,		      \
-					   BITSET_LIST_SIZE, &ITER.next));)   \
-    for (ITER.i = 0;							      \
-	 ITER.i < ITER.num && ((INDEX) = ITER.list[ITER.i], 1);		      \
-	 ITER.i++)
-
-
-/* Define set operations in terms of logical operations.  */
-
-#define bitset_diff(DST, SRC1, SRC2) bitset_andn (DST, SRC1, SRC2)
-#define bitset_diff_cmp(DST, SRC1, SRC2) bitset_andn_cmp (DST, SRC1, SRC2)
-
-#define bitset_intersection(DST, SRC1, SRC2) bitset_and (DST, SRC1, SRC2)
-#define bitset_intersection_cmp(DST, SRC1, SRC2) bitset_and_cmp (DST, SRC1, SRC2)
-
-#define bitset_union(DST, SRC1, SRC2) bitset_or (DST, SRC1, SRC2)
-#define bitset_union_cmp(DST, SRC1, SRC2) bitset_or_cmp (DST, SRC1, SRC2)
-
-/* Symmetrical difference.  */
-#define bitset_symdiff(DST, SRC1, SRC2) bitset_xor (DST, SRC1, SRC2)
-#define bitset_symdiff_cmp(DST, SRC1, SRC2) bitset_xor_cmp (DST, SRC1, SRC2)
-
-/* Union of difference.  */
-#define bitset_diff_union(DST, SRC1, SRC2, SRC3) \
-  bitset_andn_or (DST, SRC1, SRC2, SRC3)
-#define bitset_diff_union_cmp(DST, SRC1, SRC2, SRC3) \
-  bitset_andn_or_cmp (DST, SRC1, SRC2, SRC3)
-
-
-/* Release any memory tied up with bitsets.  */
-extern void bitset_release_memory (void);
-
-/* Enable bitset stats gathering.  */
-extern void bitset_stats_enable (void);
-
-/* Disable bitset stats gathering.  */
-extern void bitset_stats_disable (void);
-
-/* Read bitset stats file of accummulated stats.  */
-void bitset_stats_read (const char *file_name);
-
-/* Write bitset stats file of accummulated stats.  */
-void bitset_stats_write (const char *file_name);
-
-/* Dump bitset stats.  */
-extern void bitset_stats_dump (FILE *);
-
-/* Function to debug bitset from debugger.  */
-extern void debug_bitset (bitset);
-
-/* Function to debug bitset stats from debugger.  */
-extern void debug_bitset_stats (void);
-
-#endif /* _BITSET_H  */
diff --git a/lib/bitset_stats.c b/lib/bitset_stats.c
deleted file mode 100644
index 7b7fb34..0000000
--- a/lib/bitset_stats.c
+++ /dev/null
@@ -1,730 +0,0 @@
-/* Bitset statistics.
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
-
-   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 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, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-/* This file is a wrapper bitset implementation for the other bitset
-   implementations.  It provides bitset compatibility checking and
-   statistics gathering without having to instrument the bitset
-   implementations.  When statistics gathering is enabled, the bitset
-   operations get vectored through here and we then call the appropriate
-   routines.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "bbitset.h"
-#include "abitset.h"
-#include "ebitset.h"
-#include "lbitset.h"
-#include "vbitset.h"
-#include "bitset_stats.h"
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "gettext.h"
-#define _(Msgid)  gettext (Msgid)
-
-/* Configuration macros.  */
-#define BITSET_STATS_FILE "bitset.dat"
-#define BITSET_LOG_COUNT_BINS 10
-#define BITSET_LOG_SIZE_BINS  16
-#define BITSET_DENSITY_BINS  20
-
-
-/* Accessor macros.  */
-#define BITSET_STATS_ALLOCS_INC(TYPE)			\
-    bitset_stats_info->types[(TYPE)].allocs++
-#define BITSET_STATS_FREES_INC(BSET)			\
-    bitset_stats_info->types[BITSET_TYPE_ (BSET)].frees++
-#define BITSET_STATS_SETS_INC(BSET)			\
-    bitset_stats_info->types[BITSET_TYPE_ (BSET)].sets++
-#define BITSET_STATS_CACHE_SETS_INC(BSET)		\
-    bitset_stats_info->types[BITSET_TYPE_ (BSET)].cache_sets++
-#define BITSET_STATS_RESETS_INC(BSET)			\
-    bitset_stats_info->types[BITSET_TYPE_ (BSET)].resets++
-#define BITSET_STATS_CACHE_RESETS_INC(BSET)		\
-    bitset_stats_info->types[BITSET_TYPE_ (BSET)].cache_resets++
-#define BITSET_STATS_TESTS_INC(BSET)			\
-    bitset_stats_info->types[BITSET_TYPE_ (BSET)].tests++
-#define BITSET_STATS_CACHE_TESTS_INC(BSET)		\
-    bitset_stats_info->types[BITSET_TYPE_ (BSET)].cache_tests++
-#define BITSET_STATS_LISTS_INC(BSET)			\
-    bitset_stats_info->types[BITSET_TYPE_ (BSET)].lists++
-#define BITSET_STATS_LIST_COUNTS_INC(BSET, I)		\
-    bitset_stats_info->types[BITSET_TYPE_ (BSET)].list_counts[(I)]++
-#define BITSET_STATS_LIST_SIZES_INC(BSET, I)		\
-    bitset_stats_info->types[BITSET_TYPE_ (BSET)].list_sizes[(I)]++
-#define BITSET_STATS_LIST_DENSITY_INC(BSET, I)		\
-    bitset_stats_info->types[BITSET_TYPE_ (BSET)].list_density[(I)]++
-
-
-struct bitset_type_info_struct
-{
-  unsigned int allocs;
-  unsigned int frees;
-  unsigned int lists;
-  unsigned int sets;
-  unsigned int cache_sets;
-  unsigned int resets;
-  unsigned int cache_resets;
-  unsigned int tests;
-  unsigned int cache_tests;
-  unsigned int list_counts[BITSET_LOG_COUNT_BINS];
-  unsigned int list_sizes[BITSET_LOG_SIZE_BINS];
-  unsigned int list_density[BITSET_DENSITY_BINS];
-};
-
-struct bitset_stats_info_struct
-{
-  unsigned int runs;
-  struct bitset_type_info_struct types[BITSET_TYPE_NUM];
-};
-
-
-struct bitset_stats_info_struct bitset_stats_info_data;
-struct bitset_stats_info_struct *bitset_stats_info;
-bool bitset_stats_enabled = false;
-
-
-/* Print a percentage histogram with message MSG to FILE.  */
-static void
-bitset_percent_histogram_print (FILE *file, const char *name, const char *msg,
-				unsigned int n_bins, unsigned int *bins)
-{
-  unsigned int i;
-  unsigned int total;
-
-  total = 0;
-  for (i = 0; i < n_bins; i++)
-    total += bins[i];
-
-  if (!total)
-    return;
-
-  fprintf (file, "%s %s", name, msg);
-  for (i = 0; i < n_bins; i++)
-    fprintf (file, "%.0f-%.0f%%\t%8u (%5.1f%%)\n",
-	     i * 100.0 / n_bins,
-	     (i + 1) * 100.0 / n_bins, bins[i],
-	     (100.0 * bins[i]) / total);
-}
-
-
-/* Print a log histogram with message MSG to FILE.  */
-static void
-bitset_log_histogram_print (FILE *file, const char *name, const char *msg,
-			    unsigned int n_bins, unsigned int *bins)
-{
-  unsigned int i;
-  unsigned int total;
-  unsigned int max_width;
-
-  total = 0;
-  for (i = 0; i < n_bins; i++)
-    total += bins[i];
-
-  if (!total)
-    return;
-
-  /* Determine number of useful bins.  */
-  for (i = n_bins; i > 3 && ! bins[i - 1]; i--)
-     continue;
-  n_bins = i;
-
-  /* 2 * ceil (log10 (2) * (N - 1)) + 1.  */
-  max_width = 2 * (unsigned int) (0.30103 * (n_bins - 1) + 0.9999) + 1;
-
-  fprintf (file, "%s %s", name, msg);
-  for (i = 0; i < 2; i++)
-    fprintf (file, "%*d\t%8u (%5.1f%%)\n",
-	     max_width, i, bins[i], 100.0 * bins[i] / total);
-
-  for (; i < n_bins; i++)
-    fprintf (file, "%*lu-%lu\t%8u (%5.1f%%)\n",
-	     max_width - ((unsigned int) (0.30103 * (i) + 0.9999) + 1),
-	     1UL << (i - 1),
-	     (1UL << i) - 1,
-	     bins[i],
-	     (100.0 * bins[i]) / total);
-}
-
-
-/* Print bitset statistics to FILE.  */
-static void
-bitset_stats_print_1 (FILE *file, const char *name,
-		      struct bitset_type_info_struct *stats)
-{
-  if (!stats)
-    return;
-
-  fprintf (file, "%s:\n", name);
-  fprintf (file, _("%u bitset_allocs, %u freed (%.2f%%).\n"),
-	   stats->allocs, stats->frees,
-	   stats->allocs ? 100.0 * stats->frees / stats->allocs : 0);
-  fprintf (file, _("%u bitset_sets, %u cached (%.2f%%)\n"),
-	   stats->sets, stats->cache_sets,
-	   stats->sets ? 100.0 * stats->cache_sets / stats->sets : 0);
-  fprintf (file, _("%u bitset_resets, %u cached (%.2f%%)\n"),
-	   stats->resets, stats->cache_resets,
-	   stats->resets ? 100.0 * stats->cache_resets / stats->resets : 0);
-  fprintf (file, _("%u bitset_tests, %u cached (%.2f%%)\n"),
-	   stats->tests, stats->cache_tests,
-	   stats->tests ? 100.0 * stats->cache_tests / stats->tests : 0);
-
-  fprintf (file, _("%u bitset_lists\n"), stats->lists);
-
-  bitset_log_histogram_print (file, name, _("count log histogram\n"),
-			      BITSET_LOG_COUNT_BINS, stats->list_counts);
-
-  bitset_log_histogram_print (file, name, _("size log histogram\n"),
-			      BITSET_LOG_SIZE_BINS, stats->list_sizes);
-
-  bitset_percent_histogram_print (file, name, _("density histogram\n"),
-				  BITSET_DENSITY_BINS, stats->list_density);
-}
-
-
-/* Print all bitset statistics to FILE.  */
-static void
-bitset_stats_print (FILE *file, bool verbose ATTRIBUTE_UNUSED)
-{
-  int i;
-
-  if (!bitset_stats_info)
-    return;
-
-  fprintf (file, _("Bitset statistics:\n\n"));
-
-  if (bitset_stats_info->runs > 1)
-    fprintf (file, _("Accumulated runs = %u\n"), bitset_stats_info->runs);
-
-  for (i = 0; i < BITSET_TYPE_NUM; i++)
-    bitset_stats_print_1 (file, bitset_type_names[i],
-			  &bitset_stats_info->types[i]);
-}
-
-
-/* Initialise bitset statistics logging.  */
-void
-bitset_stats_enable (void)
-{
-  if (!bitset_stats_info)
-    bitset_stats_info = &bitset_stats_info_data;
-  bitset_stats_enabled = true;
-}
-
-
-void
-bitset_stats_disable (void)
-{
-  bitset_stats_enabled = false;
-}
-
-
-/* Read bitset statistics file.  */
-void
-bitset_stats_read (const char *file_name)
-{
-  FILE *file;
-
-  if (!bitset_stats_info)
-    return;
-
-  if (!file_name)
-    file_name = BITSET_STATS_FILE;
-
-  file = fopen (file_name, "r");
-  if (file)
-    {
-      if (fread (&bitset_stats_info_data, sizeof (bitset_stats_info_data),
-		 1, file) != 1)
-	{
-	  if (ferror (file))
-	    perror (_("Could not read stats file."));
-	  else
-	    fprintf (stderr, _("Bad stats file size.\n"));
-	}
-      if (fclose (file) != 0)
-	perror (_("Could not read stats file."));
-    }
-  bitset_stats_info_data.runs++;
-}
-
-
-/* Write bitset statistics file.  */
-void
-bitset_stats_write (const char *file_name)
-{
-  FILE *file;
-
-  if (!bitset_stats_info)
-    return;
-
-  if (!file_name)
-    file_name = BITSET_STATS_FILE;
-
-  file = fopen (file_name, "w");
-  if (file)
-    {
-      if (fwrite (&bitset_stats_info_data, sizeof (bitset_stats_info_data),
-		  1, file) != 1)
-	perror (_("Could not write stats file."));
-      if (fclose (file) != 0)
-	perror (_("Could not write stats file."));
-    }
-  else
-    perror (_("Could not open stats file for writing."));
-}
-
-
-/* Dump bitset statistics to FILE.  */
-void
-bitset_stats_dump (FILE *file)
-{
-  bitset_stats_print (file, false);
-}
-
-
-/* Function to be called from debugger to print bitset stats.  */
-void
-debug_bitset_stats (void)
-{
-  bitset_stats_print (stderr, true);
-}
-
-
-static void
-bitset_stats_set (bitset dst, bitset_bindex bitno)
-{
-  bitset bset = dst->s.bset;
-  bitset_windex wordno = bitno / BITSET_WORD_BITS;
-  bitset_windex offset = wordno - bset->b.cindex;
-
-  BITSET_STATS_SETS_INC (bset);
-
-  if (offset < bset->b.csize)
-    {
-      bset->b.cdata[offset] |= (bitset_word) 1 << (bitno % BITSET_WORD_BITS);
-      BITSET_STATS_CACHE_SETS_INC (bset);
-    }
-  else
-    BITSET_SET_ (bset, bitno);
-}
-
-
-static void
-bitset_stats_reset (bitset dst, bitset_bindex bitno)
-{
-  bitset bset = dst->s.bset;
-  bitset_windex wordno = bitno / BITSET_WORD_BITS;
-  bitset_windex offset = wordno - bset->b.cindex;
-
-  BITSET_STATS_RESETS_INC (bset);
-
-  if (offset < bset->b.csize)
-    {
-      bset->b.cdata[offset] &=
-	~((bitset_word) 1 << (bitno % BITSET_WORD_BITS));
-      BITSET_STATS_CACHE_RESETS_INC (bset);
-    }
-  else
-    BITSET_RESET_ (bset, bitno);
-}
-
-
-static bool
-bitset_stats_toggle (bitset src, bitset_bindex bitno)
-{
-    return BITSET_TOGGLE_ (src->s.bset, bitno);
-}
-
-
-static bool
-bitset_stats_test (bitset src, bitset_bindex bitno)
-{
-  bitset bset = src->s.bset;
-  bitset_windex wordno = bitno / BITSET_WORD_BITS;
-  bitset_windex offset = wordno - bset->b.cindex;
-
-  BITSET_STATS_TESTS_INC (bset);
-
-  if (offset < bset->b.csize)
-    {
-      BITSET_STATS_CACHE_TESTS_INC (bset);
-      return (bset->b.cdata[offset] >> (bitno % BITSET_WORD_BITS)) & 1;
-    }
-  else
-    return BITSET_TEST_ (bset, bitno);
-}
-
-
-static bitset_bindex
-bitset_stats_resize (bitset src, bitset_bindex size)
-{
-    return BITSET_RESIZE_ (src->s.bset, size);
-}
-
-
-static bitset_bindex
-bitset_stats_size (bitset src)
-{
-  return BITSET_SIZE_ (src->s.bset);
-}
-
-
-static bitset_bindex
-bitset_stats_count (bitset src)
-{
-  return BITSET_COUNT_ (src->s.bset);
-}
-
-
-static bool
-bitset_stats_empty_p (bitset dst)
-{
-  return BITSET_EMPTY_P_ (dst->s.bset);
-}
-
-
-static void
-bitset_stats_ones (bitset dst)
-{
-  BITSET_ONES_ (dst->s.bset);
-}
-
-
-static void
-bitset_stats_zero (bitset dst)
-{
-  BITSET_ZERO_ (dst->s.bset);
-}
-
-
-static void
-bitset_stats_copy (bitset dst, bitset src)
-{
-  BITSET_CHECK2_ (dst, src);
-  BITSET_COPY_ (dst->s.bset, src->s.bset);
-}
-
-
-static bool
-bitset_stats_disjoint_p (bitset dst, bitset src)
-{
-  BITSET_CHECK2_ (dst, src);
-  return BITSET_DISJOINT_P_ (dst->s.bset, src->s.bset);
-}
-
-
-static bool
-bitset_stats_equal_p (bitset dst, bitset src)
-{
-  BITSET_CHECK2_ (dst, src);
-  return BITSET_EQUAL_P_ (dst->s.bset, src->s.bset);
-}
-
-
-static void
-bitset_stats_not (bitset dst, bitset src)
-{
-  BITSET_CHECK2_ (dst, src);
-  BITSET_NOT_ (dst->s.bset, src->s.bset);
-}
-
-
-static bool
-bitset_stats_subset_p (bitset dst, bitset src)
-{
-  BITSET_CHECK2_ (dst, src);
-  return BITSET_SUBSET_P_ (dst->s.bset, src->s.bset);
-}
-
-
-static void
-bitset_stats_and (bitset dst, bitset src1, bitset src2)
-{
-  BITSET_CHECK3_ (dst, src1, src2);
-  BITSET_AND_ (dst->s.bset, src1->s.bset, src2->s.bset);
-}
-
-
-static bool
-bitset_stats_and_cmp (bitset dst, bitset src1, bitset src2)
-{
-  BITSET_CHECK3_ (dst, src1, src2);
-  return BITSET_AND_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset);
-}
-
-
-static void
-bitset_stats_andn (bitset dst, bitset src1, bitset src2)
-{
-  BITSET_CHECK3_ (dst, src1, src2);
-  BITSET_ANDN_ (dst->s.bset, src1->s.bset, src2->s.bset);
-}
-
-
-static bool
-bitset_stats_andn_cmp (bitset dst, bitset src1, bitset src2)
-{
-  BITSET_CHECK3_ (dst, src1, src2);
-  return BITSET_ANDN_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset);
-}
-
-
-static void
-bitset_stats_or (bitset dst, bitset src1, bitset src2)
-{
-  BITSET_CHECK3_ (dst, src1, src2);
-  BITSET_OR_ (dst->s.bset, src1->s.bset, src2->s.bset);
-}
-
-
-static bool
-bitset_stats_or_cmp (bitset dst, bitset src1, bitset src2)
-{
-  BITSET_CHECK3_ (dst, src1, src2);
-  return BITSET_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset);
-}
-
-
-static void
-bitset_stats_xor (bitset dst, bitset src1, bitset src2)
-{
-  BITSET_CHECK3_ (dst, src1, src2);
-  BITSET_XOR_ (dst->s.bset, src1->s.bset, src2->s.bset);
-}
-
-
-static bool
-bitset_stats_xor_cmp (bitset dst, bitset src1, bitset src2)
-{
-  BITSET_CHECK3_ (dst, src1, src2);
-  return BITSET_XOR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset);
-}
-
-
-static void
-bitset_stats_and_or (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  BITSET_CHECK4_ (dst, src1, src2, src3);
-  BITSET_AND_OR_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
-}
-
-
-static bool
-bitset_stats_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  BITSET_CHECK4_ (dst, src1, src2, src3);
-  return BITSET_AND_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
-}
-
-
-static void
-bitset_stats_andn_or (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  BITSET_CHECK4_ (dst, src1, src2, src3);
-  BITSET_ANDN_OR_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
-}
-
-
-static bool
-bitset_stats_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  BITSET_CHECK4_ (dst, src1, src2, src3);
-  return BITSET_ANDN_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
-}
-
-
-static void
-bitset_stats_or_and (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  BITSET_CHECK4_ (dst, src1, src2, src3);
-  BITSET_OR_AND_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
-}
-
-
-static bool
-bitset_stats_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  BITSET_CHECK4_ (dst, src1, src2, src3);
-  return BITSET_OR_AND_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
-}
-
-
-static bitset_bindex
-bitset_stats_list (bitset bset, bitset_bindex *list,
-		   bitset_bindex num, bitset_bindex *next)
-{
-  bitset_bindex count;
-  bitset_bindex tmp;
-  bitset_bindex size;
-  bitset_bindex i;
-  enum bitset_type type;
-
-  count = BITSET_LIST_ (bset->s.bset, list, num, next);
-
-  type = BITSET_TYPE_ (bset->s.bset);
-  BITSET_STATS_LISTS_INC (bset->s.bset);
-
-  /* Log histogram of number of set bits.  */
-  for (i = 0, tmp = count; tmp; tmp >>= 1, i++)
-     continue;
-  if (i >= BITSET_LOG_COUNT_BINS)
-     i = BITSET_LOG_COUNT_BINS - 1;
-  BITSET_STATS_LIST_COUNTS_INC (bset->s.bset, i);
-
-  /* Log histogram of number of bits in set.  */
-  size = BITSET_SIZE_ (bset->s.bset);
-  for (i = 0, tmp = size; tmp; tmp >>= 1, i++)
-     continue;
-  if (i >= BITSET_LOG_SIZE_BINS)
-     i = BITSET_LOG_SIZE_BINS - 1;
-  BITSET_STATS_LIST_SIZES_INC (bset->s.bset, i);
-
-  /* Histogram of fraction of bits set.  */
-  i = size ? (count * BITSET_DENSITY_BINS) / size : 0;
-  if (i >= BITSET_DENSITY_BINS)
-     i = BITSET_DENSITY_BINS - 1;
-  BITSET_STATS_LIST_DENSITY_INC (bset->s.bset, i);
-  return count;
-}
-
-
-static bitset_bindex
-bitset_stats_list_reverse (bitset bset, bitset_bindex *list,
-			   bitset_bindex num, bitset_bindex *next)
-{
-  return BITSET_LIST_REVERSE_ (bset->s.bset, list, num, next);
-}
-
-
-static void
-bitset_stats_free (bitset bset)
-{
-  BITSET_STATS_FREES_INC (bset->s.bset);
-  BITSET_FREE_ (bset->s.bset);
-}
-
-
-struct bitset_vtable bitset_stats_vtable = {
-  bitset_stats_set,
-  bitset_stats_reset,
-  bitset_stats_toggle,
-  bitset_stats_test,
-  bitset_stats_resize,
-  bitset_stats_size,
-  bitset_stats_count,
-  bitset_stats_empty_p,
-  bitset_stats_ones,
-  bitset_stats_zero,
-  bitset_stats_copy,
-  bitset_stats_disjoint_p,
-  bitset_stats_equal_p,
-  bitset_stats_not,
-  bitset_stats_subset_p,
-  bitset_stats_and,
-  bitset_stats_and_cmp,
-  bitset_stats_andn,
-  bitset_stats_andn_cmp,
-  bitset_stats_or,
-  bitset_stats_or_cmp,
-  bitset_stats_xor,
-  bitset_stats_xor_cmp,
-  bitset_stats_and_or,
-  bitset_stats_and_or_cmp,
-  bitset_stats_andn_or,
-  bitset_stats_andn_or_cmp,
-  bitset_stats_or_and,
-  bitset_stats_or_and_cmp,
-  bitset_stats_list,
-  bitset_stats_list_reverse,
-  bitset_stats_free,
-  BITSET_STATS
-};
-
-
-/* Return enclosed bitset type.  */
-enum bitset_type
-bitset_stats_type_get (bitset bset)
-{
-   return BITSET_TYPE_ (bset->s.bset);
-}
-
-
-size_t
-bitset_stats_bytes (void)
-{
-  return sizeof (struct bitset_stats_struct);
-}
-
-
-bitset
-bitset_stats_init (bitset bset, bitset_bindex n_bits, enum bitset_type type)
-{
-  size_t bytes;
-  bitset sbset;
-
-  bset->b.vtable = &bitset_stats_vtable;
-
-  /* Disable cache.  */
-  bset->b.cindex = 0;
-  bset->b.csize = 0;
-  bset->b.cdata = 0;
-
-  BITSET_NBITS_ (bset) = n_bits;
-
-  /* Set up the actual bitset implementation that
-     we are a wrapper over.  */
-  switch (type)
-    {
-    default:
-      abort ();
-
-    case BITSET_ARRAY:
-      bytes = abitset_bytes (n_bits);
-      sbset = xcalloc (1, bytes);
-      abitset_init (sbset, n_bits);
-      break;
-
-    case BITSET_LIST:
-      bytes = lbitset_bytes (n_bits);
-      sbset = xcalloc (1, bytes);
-      lbitset_init (sbset, n_bits);
-      break;
-
-    case BITSET_TABLE:
-      bytes = ebitset_bytes (n_bits);
-      sbset = xcalloc (1, bytes);
-      ebitset_init (sbset, n_bits);
-      break;
-
-    case BITSET_VARRAY:
-      bytes = vbitset_bytes (n_bits);
-      sbset = xcalloc (1, bytes);
-      vbitset_init (sbset, n_bits);
-      break;
-    }
-
-  bset->s.bset = sbset;
-
-  BITSET_STATS_ALLOCS_INC (type);
-
-  return bset;
-}
diff --git a/lib/bitset_stats.h b/lib/bitset_stats.h
deleted file mode 100644
index 6378c5c..0000000
--- a/lib/bitset_stats.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Functions to support bitset statistics.
-   Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
-   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
-
-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 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, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef _BITSET_STATS_H
-#define _BITSET_STATS_H
-
-#include "bbitset.h"
-
-extern bool bitset_stats_enabled;
-
-extern enum bitset_type bitset_stats_type_get (bitset);
-
-extern size_t bitset_stats_bytes (void);
-
-extern bitset bitset_stats_init (bitset, bitset_bindex, enum bitset_type);
-
-#endif
diff --git a/lib/bitsetv-print.c b/lib/bitsetv-print.c
deleted file mode 100644
index 0083871..0000000
--- a/lib/bitsetv-print.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Bitset vectors.
-   Copyright (C) 2001, 2002, 2004, 2006 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 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, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <stdlib.h>
-#include "bitsetv-print.h"
-
-/*--------------------------------------------------------.
-| Display the MATRIX array of SIZE bitsets of size SIZE.  |
-`--------------------------------------------------------*/
-
-void
-bitsetv_matrix_dump (FILE * out, const char *title, bitsetv bset)
-{
-  bitset_bindex i, j;
-  bitset_bindex hsize = bitset_size (bset[0]);
-
-  /* Title. */
-  fprintf (out, "%s BEGIN\n", title);
-
-  /* Column numbers. */
-  fputs ("   ", out);
-  for (i = 0; i < hsize; ++i)
-    putc (i / 10 ? '0' + i / 10 : ' ', out);
-  putc ('\n', out);
-  fputs ("   ", out);
-  for (i = 0; i < hsize; ++i)
-    fprintf (out, "%d", (int) (i % 10));
-  putc ('\n', out);
-
-  /* Bar. */
-  fputs ("  .", out);
-  for (i = 0; i < hsize; ++i)
-    putc ('-', out);
-  fputs (".\n", out);
-
-  /* Contents. */
-  for (i = 0; bset[i]; ++i)
-    {
-      fprintf (out, "%2lu|", (unsigned long int) i);
-      for (j = 0; j < hsize; ++j)
-	fputs (bitset_test (bset[i], j) ? "1" : " ", out);
-      fputs ("|\n", out);
-    }
-
-  /* Bar. */
-  fputs ("  `", out);
-  for (i = 0; i < hsize; ++i)
-    putc ('-', out);
-  fputs ("'\n", out);
-
-  /* End title. */
-  fprintf (out, "%s END\n\n", title);
-}
diff --git a/lib/bitsetv-print.h b/lib/bitsetv-print.h
deleted file mode 100644
index e54be68..0000000
--- a/lib/bitsetv-print.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Bitset vectors.
-   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
-   Contributed by Akim Demaille (akim@freefriends.org).
-
-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 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, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef _BITSETV_PRINT_H
-#define _BITSETV_PRINT_H
-
-#include "bitsetv.h"
-
-/* Dump vector of bitsets as a matrix.  */
-extern void bitsetv_matrix_dump (FILE *, const char *, bitsetv);
-
-#endif  /* _BITSETV_H  */
diff --git a/lib/bitsetv.c b/lib/bitsetv.c
deleted file mode 100644
index ae79853..0000000
--- a/lib/bitsetv.c
+++ /dev/null
@@ -1,169 +0,0 @@
-/* Bitset vectors.
-   Copyright (C) 2001, 2002, 2004, 2005, 2006 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 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, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <stdlib.h>
-#include "bitsetv.h"
-
-
-/* Create a vector of N_VECS bitsets, each of N_BITS, and of
-   type TYPE.  */
-bitset *
-bitsetv_alloc (bitset_bindex n_vecs, bitset_bindex n_bits,
-	       enum bitset_type type)
-{
-  size_t vector_bytes;
-  size_t bytes;
-  bitset *bsetv;
-  bitset_bindex i;
-
-  /* Determine number of bytes for each set.  */
-  bytes = bitset_bytes (type, n_bits);
-
-  /* If size calculation overflows, memory is exhausted.  */
-  if (BITSET_SIZE_MAX / (sizeof (bitset) + bytes) <= n_vecs)
-    xalloc_die ();
-
-  /* Allocate vector table at head of bitset array.  */
-  vector_bytes = (n_vecs + 1) * sizeof (bitset) + bytes - 1;
-  vector_bytes -= vector_bytes % bytes;
-  bsetv = xcalloc (1, vector_bytes + bytes * n_vecs);
-
-  for (i = 0; i < n_vecs; i++)
-    {
-      bsetv[i] = (bitset) (void *) ((char *) bsetv + vector_bytes + i * bytes);
-
-      bitset_init (bsetv[i], n_bits, type);
-    }
-
-  /* Null terminate table.  */
-  bsetv[i] = 0;
-  return bsetv;
-}
-
-
-/* Create a vector of N_VECS bitsets, each of N_BITS, and with
-   attribute hints specified by ATTR.  */
-bitset *
-bitsetv_create (bitset_bindex n_vecs, bitset_bindex n_bits, unsigned int attr)
-{
-  enum bitset_type type;
-
-  type = bitset_type_choose (n_bits, attr);
-  return bitsetv_alloc (n_vecs, n_bits, type);
-}
-
-
-/* Free bitset vector BSETV.  */
-void
-bitsetv_free (bitsetv bsetv)
-{
-  bitset_bindex i;
-
-  for (i = 0; bsetv[i]; i++)
-      BITSET_FREE_ (bsetv[i]);
-  free (bsetv);
-}
-
-
-/* Zero a vector of bitsets.  */
-void
-bitsetv_zero (bitsetv bsetv)
-{
-  bitset_bindex i;
-
-  for (i = 0; bsetv[i]; i++)
-    bitset_zero (bsetv[i]);
-}
-
-
-/* Set a vector of bitsets to ones.  */
-void
-bitsetv_ones (bitsetv bsetv)
-{
-  bitset_bindex i;
-
-  for (i = 0; bsetv[i]; i++)
-    bitset_ones (bsetv[i]);
-}
-
-
-/* Given a vector BSETV of N bitsets of size N, modify its contents to
-   be the transitive closure of what was given.  */
-void
-bitsetv_transitive_closure (bitsetv bsetv)
-{
-  bitset_bindex i;
-  bitset_bindex j;
-
-  for (i = 0; bsetv[i]; i++)
-    for (j = 0; bsetv[j]; j++)
-      if (bitset_test (bsetv[j], i))
-	bitset_or (bsetv[j], bsetv[j], bsetv[i]);
-}
-
-
-/* Given a vector BSETV of N bitsets of size N, modify its contents to
-   be the reflexive transitive closure of what was given.  This is
-   the same as transitive closure but with all bits on the diagonal
-   of the bit matrix set.  */
-void
-bitsetv_reflexive_transitive_closure (bitsetv bsetv)
-{
-  bitset_bindex i;
-
-  bitsetv_transitive_closure (bsetv);
-  for (i = 0; bsetv[i]; i++)
-    bitset_set (bsetv[i], i);
-}
-
-
-/* Dump the contents of a bitset vector BSETV with N_VECS elements to
-   FILE.  */
-void
-bitsetv_dump (FILE *file, char const *title, char const *subtitle,
-	      bitsetv bsetv)
-{
-  bitset_windex i;
-
-  fprintf (file, "%s\n", title);
-  for (i = 0; bsetv[i]; i++)
-    {
-      fprintf (file, "%s %lu\n", subtitle, (unsigned long int) i);
-      bitset_dump (file, bsetv[i]);
-    }
-
-  fprintf (file, "\n");
-}
-
-
-void
-debug_bitsetv (bitsetv bsetv)
-{
-  bitset_windex i;
-
-  for (i = 0; bsetv[i]; i++)
-    {
-      fprintf (stderr, "%lu: ", (unsigned long int) i);
-      debug_bitset (bsetv[i]);
-    }
-
-  fprintf (stderr, "\n");
-}
diff --git a/lib/bitsetv.h b/lib/bitsetv.h
deleted file mode 100644
index 652f9e3..0000000
--- a/lib/bitsetv.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Bitset vectors.
-   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
-   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
-
-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 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, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef _BITSETV_H
-#define _BITSETV_H
-
-#include "bitset.h"
-
-typedef bitset * bitsetv;
-
-/* Create a vector of N_VECS bitsets, each of N_BITS, and of
-   type TYPE.  */
-extern bitsetv bitsetv_alloc (bitset_bindex, bitset_bindex, enum bitset_type);
-
-/* Create a vector of N_VECS bitsets, each of N_BITS, and with
-   attribute hints specified by ATTR.  */
-extern bitsetv bitsetv_create (bitset_bindex, bitset_bindex, unsigned int);
-
-/* Free vector of bitsets.  */
-extern void bitsetv_free (bitsetv);
-
-/* Zero vector of bitsets.  */
-extern void bitsetv_zero (bitsetv);
-
-/* Set vector of bitsets.  */
-extern void bitsetv_ones (bitsetv);
-
-/* Given a vector BSETV of N bitsets of size N, modify its contents to
-   be the transitive closure of what was given.  */
-extern void bitsetv_transitive_closure (bitsetv);
-
-/* Given a vector BSETV of N bitsets of size N, modify its contents to
-   be the reflexive transitive closure of what was given.  This is
-   the same as transitive closure but with all bits on the diagonal
-   of the bit matrix set.  */
-extern void bitsetv_reflexive_transitive_closure (bitsetv);
-
-/* Dump vector of bitsets.  */
-extern void bitsetv_dump (FILE *, const char *, const char *, bitsetv);
-
-/* Function to debug vector of bitsets from debugger.  */
-extern void debug_bitsetv (bitsetv);
-
-#endif  /* _BITSETV_H  */
diff --git a/lib/dirname.c b/lib/dirname.c
deleted file mode 100644
index e2b9d64..0000000
--- a/lib/dirname.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/* dirname.c -- return all but the last element in a file name
-
-   Copyright (C) 1990, 1998, 2000, 2001, 2003, 2004, 2005 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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "dirname.h"
-
-#include <string.h>
-#include "xalloc.h"
-
-/* Return the length of `dirname (FILE)', or zero if FILE is
-   in the working directory.  Works properly even if
-   there are trailing slashes (by effectively ignoring them).  */
-size_t
-dir_len (char const *file)
-{
-  size_t prefix_length = FILE_SYSTEM_PREFIX_LEN (file);
-  size_t length;
-
-  /* Strip the basename and any redundant slashes before it.  */
-  for (length = base_name (file) - file;  prefix_length < length;  length--)
-    if (! ISSLASH (file[length - 1]))
-      return length;
-
-  /* But don't strip the only slash from "/".  */
-  return prefix_length + ISSLASH (file[prefix_length]);
-}
-
-/* Return the leading directories part of FILE,
-   allocated with xmalloc.
-   Works properly even if there are trailing slashes
-   (by effectively ignoring them).  */
-
-char *
-dir_name (char const *file)
-{
-  size_t length = dir_len (file);
-  bool append_dot = (length == FILE_SYSTEM_PREFIX_LEN (file));
-  char *dir = xmalloc (length + append_dot + 1);
-  memcpy (dir, file, length);
-  if (append_dot)
-    dir[length++] = '.';
-  dir[length] = 0;
-  return dir;
-}
-
-#ifdef TEST_DIRNAME
-/*
-
-Run the test like this (expect no output):
-  gcc -DHAVE_CONFIG_H -DTEST_DIRNAME -I.. -O -Wall \
-     basename.c dirname.c xmalloc.c error.c
-  sed -n '/^BEGIN-DATA$/,/^END-DATA$/p' dirname.c|grep -v DATA|./a.out
-
-If it's been built on a DOS or Windows platforms, run another test like
-this (again, expect no output):
-  sed -n '/^BEGIN-DOS-DATA$/,/^END-DOS-DATA$/p' dirname.c|grep -v DATA|./a.out
-
-BEGIN-DATA
-foo//// .
-bar/foo//// bar
-foo/ .
-/ /
-. .
-a .
-END-DATA
-
-BEGIN-DOS-DATA
-c:///// c:/
-c:/ c:/
-c:/. c:/
-c:foo c:.
-c:foo/bar c:foo
-END-DOS-DATA
-
-*/
-
-# define MAX_BUFF_LEN 1024
-# include <stdio.h>
-
-char *program_name;
-
-int
-main (int argc, char *argv[])
-{
-  char buff[MAX_BUFF_LEN + 1];
-
-  program_name = argv[0];
-
-  buff[MAX_BUFF_LEN] = 0;
-  while (fgets (buff, MAX_BUFF_LEN, stdin) && buff[0])
-    {
-      char file[MAX_BUFF_LEN];
-      char expected_result[MAX_BUFF_LEN];
-      char const *result;
-      sscanf (buff, "%s %s", file, expected_result);
-      result = dir_name (file);
-      if (strcmp (result, expected_result))
-	printf ("%s: got %s, expected %s\n", file, result, expected_result);
-    }
-  return 0;
-}
-#endif
diff --git a/lib/dirname.h b/lib/dirname.h
deleted file mode 100644
index 1688ae8..0000000
--- a/lib/dirname.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*  Take file names apart into directory and base names.
-
-    Copyright (C) 1998, 2001, 2003, 2004, 2005 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.  */
-
-#ifndef DIRNAME_H_
-# define DIRNAME_H_ 1
-
-# include <stdbool.h>
-# include <stddef.h>
-
-# ifndef DIRECTORY_SEPARATOR
-#  define DIRECTORY_SEPARATOR '/'
-# endif
-
-# ifndef ISSLASH
-#  define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
-# endif
-
-# ifndef FILE_SYSTEM_PREFIX_LEN
-#  define FILE_SYSTEM_PREFIX_LEN(File_name) 0
-# endif
-
-# define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)])
-# define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F))
-
-char *base_name (char const *file);
-char *dir_name (char const *file);
-size_t base_len (char const *file);
-size_t dir_len (char const *file);
-
-bool strip_trailing_slashes (char *file);
-
-#endif /* not DIRNAME_H_ */
diff --git a/lib/dup-safer.c b/lib/dup-safer.c
deleted file mode 100644
index 8cbee70..0000000
--- a/lib/dup-safer.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Invoke dup, but avoid some glitches.
-   Copyright (C) 2001, 2004, 2005 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 Paul Eggert.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "unistd-safer.h"
-
-#include <fcntl.h>
-
-#include <unistd.h>
-#ifndef STDERR_FILENO
-# define STDERR_FILENO 2
-#endif
-
-/* Like dup, but do not return STDIN_FILENO, STDOUT_FILENO, or
-   STDERR_FILENO.  */
-
-int
-dup_safer (int fd)
-{
-#ifdef F_DUPFD
-  return fcntl (fd, F_DUPFD, STDERR_FILENO + 1);
-#else
-  /* fd_safer calls us back, but eventually the recursion unwinds and
-     does the right thing.  */
-  return fd_safer (dup (fd));
-#endif
-}
diff --git a/lib/ebitset.c b/lib/ebitset.c
deleted file mode 100644
index cedf0e2..0000000
--- a/lib/ebitset.c
+++ /dev/null
@@ -1,1366 +0,0 @@
-/* Functions to support expandable bitsets.
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
-
-   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 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, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "ebitset.h"
-#include "obstack.h"
-#include <stdlib.h>
-#include <string.h>
-
-/* This file implements expandable bitsets.  These bitsets can be of
-   arbitrary length and are more efficient than arrays of bits for
-   large sparse sets.
-
-   Empty elements are represented by a NULL pointer in the table of
-   element pointers.  An alternative is to point to a special zero
-   element.  Similarly, we could represent an all 1's element with
-   another special ones element pointer.
-
-   Bitsets are commonly empty so we need to ensure that this special
-   case is fast.  A zero bitset is indicated when cdata is 0.  This is
-   conservative since cdata may be non zero and the bitset may still
-   be zero.
-
-   The bitset cache can be disabled either by setting cindex to
-   BITSET_WINDEX_MAX or by setting csize to 0.  Here
-   we use the former approach since cindex needs to be updated whenever
-   cdata is changed.
-*/
-
-
-/* Number of words to use for each element.  */
-#define EBITSET_ELT_WORDS 2
-
-/* Number of bits stored in each element.  */
-#define EBITSET_ELT_BITS \
-  ((unsigned int) (EBITSET_ELT_WORDS * BITSET_WORD_BITS))
-
-/* Ebitset element.  We use an array of bits.  */
-typedef struct ebitset_elt_struct
-{
-  union
-  {
-    bitset_word words[EBITSET_ELT_WORDS];	/* Bits that are set.  */
-    struct ebitset_elt_struct *next;
-  }
-  u;
-}
-ebitset_elt;
-
-
-typedef ebitset_elt *ebitset_elts;
-
-
-/* Number of elements to initially allocate.  */
-
-#ifndef EBITSET_INITIAL_SIZE
-#define EBITSET_INITIAL_SIZE 2
-#endif
-
-
-enum ebitset_find_mode
-  { EBITSET_FIND, EBITSET_CREATE, EBITSET_SUBST };
-
-static ebitset_elt ebitset_zero_elts[1]; /* Elements of all zero bits.  */
-
-/* Obstack to allocate bitset elements from.  */
-static struct obstack ebitset_obstack;
-static bool ebitset_obstack_init = false;
-static ebitset_elt *ebitset_free_list;	/* Free list of bitset elements.  */
-
-#define EBITSET_N_ELTS(N) (((N) + EBITSET_ELT_BITS - 1) / EBITSET_ELT_BITS)
-#define EBITSET_ELTS(BSET) ((BSET)->e.elts)
-#define EBITSET_SIZE(BSET) EBITSET_N_ELTS (BITSET_NBITS_ (BSET))
-#define EBITSET_ASIZE(BSET) ((BSET)->e.size)
-
-#define EBITSET_NEXT(ELT) ((ELT)->u.next)
-#define EBITSET_WORDS(ELT) ((ELT)->u.words)
-
-/* Disable bitset cache and mark BSET as being zero.  */
-#define EBITSET_ZERO_SET(BSET) ((BSET)->b.cindex = BITSET_WINDEX_MAX, \
-	(BSET)->b.cdata = 0)
-
-#define EBITSET_CACHE_DISABLE(BSET)  ((BSET)->b.cindex = BITSET_WINDEX_MAX)
-
-/* Disable bitset cache and mark BSET as being possibly non-zero.  */
-#define EBITSET_NONZERO_SET(BSET) \
- (EBITSET_CACHE_DISABLE (BSET), (BSET)->b.cdata = (bitset_word *)~0)
-
-/* A conservative estimate of whether the bitset is zero.
-   This is non-zero only if we know for sure that the bitset is zero.  */
-#define EBITSET_ZERO_P(BSET) ((BSET)->b.cdata == 0)
-
-/* Enable cache to point to element with table index EINDEX.
-   The element must exist.  */
-#define EBITSET_CACHE_SET(BSET, EINDEX) \
- ((BSET)->b.cindex = (EINDEX) * EBITSET_ELT_WORDS, \
-  (BSET)->b.cdata = EBITSET_WORDS (EBITSET_ELTS (BSET) [EINDEX]))
-
-#undef min
-#undef max
-#define min(a, b) ((a) > (b) ? (b) : (a))
-#define max(a, b) ((a) > (b) ? (a) : (b))
-
-static bitset_bindex
-ebitset_resize (bitset src, bitset_bindex n_bits)
-{
-  bitset_windex oldsize;
-  bitset_windex newsize;
-
-  if (n_bits == BITSET_NBITS_ (src))
-    return n_bits;
-
-  oldsize = EBITSET_SIZE (src);
-  newsize = EBITSET_N_ELTS (n_bits);
-
-  if (oldsize < newsize)
-    {
-      bitset_windex size;
-
-      /* The bitset needs to grow.  If we already have enough memory
-	 allocated, then just zero what we need.  */
-      if (newsize > EBITSET_ASIZE (src))
-	{
-	  /* We need to allocate more memory.  When oldsize is
-	     non-zero this means that we are changing the size, so
-	     grow the bitset 25% larger than requested to reduce
-	     number of reallocations.  */
-
-	  if (oldsize == 0)
-	    size = newsize;
-	  else
-	    size = newsize + newsize / 4;
-
-	  EBITSET_ELTS (src)
-	    = realloc (EBITSET_ELTS (src), size * sizeof (ebitset_elt *));
-	  EBITSET_ASIZE (src) = size;
-	}
-
-      memset (EBITSET_ELTS (src) + oldsize, 0,
-	      (newsize - oldsize) * sizeof (ebitset_elt *));
-    }
-  else
-    {
-      /* The bitset needs to shrink.  There's no point deallocating
-	 the memory unless it is shrinking by a reasonable amount.  */
-      if ((oldsize - newsize) >= oldsize / 2)
-	{
-	  EBITSET_ELTS (src)
-	    = realloc (EBITSET_ELTS (src), newsize * sizeof (ebitset_elt *));
-	  EBITSET_ASIZE (src) = newsize;
-	}
-
-      /* Need to prune any excess bits.  FIXME.  */
-    }
-
-  BITSET_NBITS_ (src) = n_bits;
-  return n_bits;
-}
-
-
-/* Allocate a ebitset element.  The bits are not cleared.  */
-static inline ebitset_elt *
-ebitset_elt_alloc (void)
-{
-  ebitset_elt *elt;
-
-  if (ebitset_free_list != 0)
-    {
-      elt = ebitset_free_list;
-      ebitset_free_list = EBITSET_NEXT (elt);
-    }
-  else
-    {
-      if (!ebitset_obstack_init)
-	{
-	  ebitset_obstack_init = true;
-
-	  /* Let particular systems override the size of a chunk.  */
-
-#ifndef OBSTACK_CHUNK_SIZE
-#define OBSTACK_CHUNK_SIZE 0
-#endif
-
-	  /* Let them override the alloc and free routines too.  */
-
-#ifndef OBSTACK_CHUNK_ALLOC
-#define OBSTACK_CHUNK_ALLOC xmalloc
-#endif
-
-#ifndef OBSTACK_CHUNK_FREE
-#define OBSTACK_CHUNK_FREE free
-#endif
-
-#if ! defined __GNUC__ || __GNUC__ < 2
-#define __alignof__(type) 0
-#endif
-
-	  obstack_specify_allocation (&ebitset_obstack, OBSTACK_CHUNK_SIZE,
-				      __alignof__ (ebitset_elt),
-				      OBSTACK_CHUNK_ALLOC,
-				      OBSTACK_CHUNK_FREE);
-	}
-
-      /* Perhaps we should add a number of new elements to the free
-	 list.  */
-      elt = (ebitset_elt *) obstack_alloc (&ebitset_obstack,
-					   sizeof (ebitset_elt));
-    }
-
-  return elt;
-}
-
-
-/* Allocate a ebitset element.  The bits are cleared.  */
-static inline ebitset_elt *
-ebitset_elt_calloc (void)
-{
-  ebitset_elt *elt;
-
-  elt = ebitset_elt_alloc ();
-  memset (EBITSET_WORDS (elt), 0, sizeof (EBITSET_WORDS (elt)));
-  return elt;
-}
-
-
-static inline void
-ebitset_elt_free (ebitset_elt *elt)
-{
-  EBITSET_NEXT (elt) = ebitset_free_list;
-  ebitset_free_list = elt;
-}
-
-
-/* Remove element with index EINDEX from bitset BSET.  */
-static inline void
-ebitset_elt_remove (bitset bset, bitset_windex eindex)
-{
-  ebitset_elts *elts;
-  ebitset_elt *elt;
-
-  elts = EBITSET_ELTS (bset);
-
-  elt = elts[eindex];
-
-  elts[eindex] = 0;
-  ebitset_elt_free (elt);
-}
-
-
-/* Add ELT into elts at index EINDEX of bitset BSET.  */
-static inline void
-ebitset_elt_add (bitset bset, ebitset_elt *elt, bitset_windex eindex)
-{
-  ebitset_elts *elts;
-
-  elts = EBITSET_ELTS (bset);
-  /* Assume that the elts entry not allocated.  */
-  elts[eindex] = elt;
-}
-
-
-/* Are all bits in an element zero?  */
-static inline bool
-ebitset_elt_zero_p (ebitset_elt *elt)
-{
-  int i;
-
-  for (i = 0; i < EBITSET_ELT_WORDS; i++)
-    if (EBITSET_WORDS (elt)[i])
-      return false;
-
-  return true;
-}
-
-
-static ebitset_elt *
-ebitset_elt_find (bitset bset, bitset_bindex bindex,
-		  enum ebitset_find_mode mode)
-{
-  ebitset_elt *elt;
-  bitset_windex size;
-  bitset_windex eindex;
-  ebitset_elts *elts;
-
-  eindex = bindex / EBITSET_ELT_BITS;
-
-  elts = EBITSET_ELTS (bset);
-  size = EBITSET_SIZE (bset);
-
-  if (eindex < size)
-    {
-      if ((elt = elts[eindex]))
-	{
-	  if (EBITSET_WORDS (elt) == bset->b.cdata)
-	    return elt;
-
-	  EBITSET_CACHE_SET (bset, eindex);
-	  return elt;
-	}
-    }
-
-  /* The element could not be found.  */
-
-  switch (mode)
-    {
-    default:
-      abort ();
-
-    case EBITSET_FIND:
-      return 0;
-
-    case EBITSET_CREATE:
-      if (eindex >= size)
-	ebitset_resize (bset, bindex);
-
-      /* Create a new element.  */
-      elt = ebitset_elt_calloc ();
-      ebitset_elt_add (bset, elt, eindex);
-      EBITSET_CACHE_SET (bset, eindex);
-      return elt;
-
-    case EBITSET_SUBST:
-      return &ebitset_zero_elts[0];
-    }
-}
-
-
-/* Weed out the zero elements from the elts.  */
-static inline bitset_windex
-ebitset_weed (bitset bset)
-{
-  ebitset_elts *elts;
-  bitset_windex j;
-  bitset_windex count;
-
-  if (EBITSET_ZERO_P (bset))
-    return 0;
-
-  elts = EBITSET_ELTS (bset);
-  count = 0;
-  for (j = 0; j < EBITSET_SIZE (bset); j++)
-    {
-      ebitset_elt *elt = elts[j];
-
-      if (elt)
-	{
-	  if (ebitset_elt_zero_p (elt))
-	    {
-	      ebitset_elt_remove (bset, j);
-	      count++;
-	    }
-	}
-      else
-	count++;
-    }
-
-  count = j - count;
-  if (!count)
-    {
-      /* All the bits are zero.  We could shrink the elts.
-	 For now just mark BSET as known to be zero.  */
-      EBITSET_ZERO_SET (bset);
-    }
-  else
-    EBITSET_NONZERO_SET (bset);
-
-  return count;
-}
-
-
-/* Set all bits in the bitset to zero.  */
-static inline void
-ebitset_zero (bitset bset)
-{
-  ebitset_elts *elts;
-  bitset_windex j;
-
-  if (EBITSET_ZERO_P (bset))
-    return;
-
-  elts = EBITSET_ELTS (bset);
-  for (j = 0; j < EBITSET_SIZE (bset); j++)
-    {
-      ebitset_elt *elt = elts[j];
-
-      if (elt)
-	ebitset_elt_remove (bset, j);
-    }
-
-  /* All the bits are zero.  We could shrink the elts.
-     For now just mark BSET as known to be zero.  */
-  EBITSET_ZERO_SET (bset);
-}
-
-
-static inline bool
-ebitset_equal_p (bitset dst, bitset src)
-{
-  ebitset_elts *selts;
-  ebitset_elts *delts;
-  bitset_windex j;
-
-  if (src == dst)
-    return true;
-
-  ebitset_weed (dst);
-  ebitset_weed (src);
-
-  if (EBITSET_SIZE (src) != EBITSET_SIZE (dst))
-    return false;
-
-  selts = EBITSET_ELTS (src);
-  delts = EBITSET_ELTS (dst);
-
-  for (j = 0; j < EBITSET_SIZE (src); j++)
-    {
-      unsigned int i;
-      ebitset_elt *selt = selts[j];
-      ebitset_elt *delt = delts[j];
-
-      if (!selt && !delt)
-	continue;
-      if ((selt && !delt) || (!selt && delt))
-	return false;
-
-      for (i = 0; i < EBITSET_ELT_WORDS; i++)
-	if (EBITSET_WORDS (selt)[i] != EBITSET_WORDS (delt)[i])
-	  return false;
-    }
-  return true;
-}
-
-
-/* Copy bits from bitset SRC to bitset DST.  */
-static inline void
-ebitset_copy_ (bitset dst, bitset src)
-{
-  ebitset_elts *selts;
-  ebitset_elts *delts;
-  bitset_windex j;
-
-  if (src == dst)
-    return;
-
-  ebitset_zero (dst);
-
-  if (BITSET_NBITS_ (dst) != BITSET_NBITS_ (src))
-    ebitset_resize (dst, BITSET_NBITS_ (src));
-
-  selts = EBITSET_ELTS (src);
-  delts = EBITSET_ELTS (dst);
-  for (j = 0; j < EBITSET_SIZE (src); j++)
-    {
-      ebitset_elt *selt = selts[j];
-
-      if (selt)
-	{
-	  ebitset_elt *tmp;
-
-	  tmp = ebitset_elt_alloc ();
-	  delts[j] = tmp;
-	  memcpy (EBITSET_WORDS (tmp), EBITSET_WORDS (selt),
-		  sizeof (EBITSET_WORDS (selt)));
-	}
-    }
-  EBITSET_NONZERO_SET (dst);
-}
-
-
-/* Copy bits from bitset SRC to bitset DST.  Return true if
-   bitsets different.  */
-static inline bool
-ebitset_copy_cmp (bitset dst, bitset src)
-{
-  if (src == dst)
-    return false;
-
-  if (EBITSET_ZERO_P (dst))
-    {
-      ebitset_copy_ (dst, src);
-      return !EBITSET_ZERO_P (src);
-    }
-
-  if (ebitset_equal_p (dst, src))
-    return false;
-
-  ebitset_copy_ (dst, src);
-  return true;
-}
-
-
-/* Set bit BITNO in bitset DST.  */
-static void
-ebitset_set (bitset dst, bitset_bindex bitno)
-{
-  bitset_windex windex = bitno / BITSET_WORD_BITS;
-
-  ebitset_elt_find (dst, bitno, EBITSET_CREATE);
-
-  dst->b.cdata[windex - dst->b.cindex] |=
-    (bitset_word) 1 << (bitno % BITSET_WORD_BITS);
-}
-
-
-/* Reset bit BITNO in bitset DST.  */
-static void
-ebitset_reset (bitset dst, bitset_bindex bitno)
-{
-  bitset_windex windex = bitno / BITSET_WORD_BITS;
-
-  if (!ebitset_elt_find (dst, bitno, EBITSET_FIND))
-    return;
-
-  dst->b.cdata[windex - dst->b.cindex] &=
-    ~((bitset_word) 1 << (bitno % BITSET_WORD_BITS));
-
-  /* If all the data is zero, perhaps we should remove it now...
-     However, there is a good chance that the element will be needed
-     again soon.  */
-}
-
-
-/* Test bit BITNO in bitset SRC.  */
-static bool
-ebitset_test (bitset src, bitset_bindex bitno)
-{
-  bitset_windex windex = bitno / BITSET_WORD_BITS;
-
-  return (ebitset_elt_find (src, bitno, EBITSET_FIND)
-	  && ((src->b.cdata[windex - src->b.cindex]
-	       >> (bitno % BITSET_WORD_BITS))
-	      & 1));
-}
-
-
-static void
-ebitset_free (bitset bset)
-{
-  ebitset_zero (bset);
-  free (EBITSET_ELTS (bset));
-}
-
-
-/* Find list of up to NUM bits set in BSET starting from and including
- *NEXT and store in array LIST.  Return with actual number of bits
- found and with *NEXT indicating where search stopped.  */
-static bitset_bindex
-ebitset_list_reverse (bitset bset, bitset_bindex *list,
-		      bitset_bindex num, bitset_bindex *next)
-{
-  bitset_bindex n_bits;
-  bitset_bindex bitno;
-  bitset_bindex rbitno;
-  unsigned int bcount;
-  bitset_bindex boffset;
-  bitset_windex windex;
-  bitset_windex eindex;
-  bitset_windex woffset;
-  bitset_bindex count;
-  bitset_windex size;
-  ebitset_elts *elts;
-
-  if (EBITSET_ZERO_P (bset))
-    return 0;
-
-  size = EBITSET_SIZE (bset);
-  n_bits = size * EBITSET_ELT_BITS;
-  rbitno = *next;
-
-  if (rbitno >= n_bits)
-    return 0;
-
-  elts = EBITSET_ELTS (bset);
-
-  bitno = n_bits - (rbitno + 1);
-
-  windex = bitno / BITSET_WORD_BITS;
-  eindex = bitno / EBITSET_ELT_BITS;
-  woffset = windex - eindex * EBITSET_ELT_WORDS;
-
-  /* If num is 1, we could speed things up with a binary search
-     of the word of interest.  */
-
-  count = 0;
-  bcount = bitno % BITSET_WORD_BITS;
-  boffset = windex * BITSET_WORD_BITS;
-
-  do
-    {
-      ebitset_elt *elt;
-      bitset_word *srcp;
-
-      elt = elts[eindex];
-      if (elt)
-	{
-	  srcp = EBITSET_WORDS (elt);
-
-	  do
-	    {
-	      bitset_word word;
-
-	      word = srcp[woffset] << (BITSET_WORD_BITS - 1 - bcount);
-
-	      for (; word; bcount--)
-		{
-		  if (word & BITSET_MSB)
-		    {
-		      list[count++] = boffset + bcount;
-		      if (count >= num)
-			{
-			  *next = n_bits - (boffset + bcount);
-			  return count;
-			}
-		    }
-		  word <<= 1;
-		}
-	      boffset -= BITSET_WORD_BITS;
-	      bcount = BITSET_WORD_BITS - 1;
-	    }
-	  while (woffset--);
-	}
-
-      woffset = EBITSET_ELT_WORDS - 1;
-      boffset = eindex * EBITSET_ELT_BITS - BITSET_WORD_BITS;
-    }
-  while (eindex--);
-
-  *next = n_bits - (boffset + 1);
-  return count;
-}
-
-
-/* Find list of up to NUM bits set in BSET starting from and including
- *NEXT and store in array LIST.  Return with actual number of bits
- found and with *NEXT indicating where search stopped.  */
-static bitset_bindex
-ebitset_list (bitset bset, bitset_bindex *list,
-	      bitset_bindex num, bitset_bindex *next)
-{
-  bitset_bindex bitno;
-  bitset_windex windex;
-  bitset_windex eindex;
-  bitset_bindex count;
-  bitset_windex size;
-  ebitset_elt *elt;
-  bitset_word word;
-  ebitset_elts *elts;
-
-  if (EBITSET_ZERO_P (bset))
-    return 0;
-
-  bitno = *next;
-  count = 0;
-
-  elts = EBITSET_ELTS (bset);
-  size = EBITSET_SIZE (bset);
-  eindex = bitno / EBITSET_ELT_BITS;
-
-  if (bitno % EBITSET_ELT_BITS)
-    {
-      /* We need to start within an element.  This is not very common.  */
-
-      elt = elts[eindex];
-      if (elt)
-	{
-	  bitset_windex woffset;
-	  bitset_word *srcp = EBITSET_WORDS (elt);
-
-	  windex = bitno / BITSET_WORD_BITS;
-	  woffset = eindex * EBITSET_ELT_WORDS;
-
-	  for (; (windex - woffset) < EBITSET_ELT_WORDS; windex++)
-	    {
-	      word = srcp[windex - woffset] >> (bitno % BITSET_WORD_BITS);
-
-	      for (; word; bitno++)
-		{
-		  if (word & 1)
-		    {
-		      list[count++] = bitno;
-		      if (count >= num)
-			{
-			  *next = bitno + 1;
-			  return count;
-			}
-		    }
-		  word >>= 1;
-		}
-	      bitno = (windex + 1) * BITSET_WORD_BITS;
-	    }
-	}
-
-      /* Skip to next element.  */
-      eindex++;
-    }
-
-  /* If num is 1, we could speed things up with a binary search
-     of the word of interest.  */
-
-  for (; eindex < size; eindex++)
-    {
-      int i;
-      bitset_word *srcp;
-
-      elt = elts[eindex];
-      if (!elt)
-	continue;
-
-      srcp = EBITSET_WORDS (elt);
-      windex = eindex * EBITSET_ELT_WORDS;
-
-      if ((count + EBITSET_ELT_BITS) < num)
-	{
-	  /* The coast is clear, plant boot!  */
-
-#if EBITSET_ELT_WORDS == 2
-	  word = srcp[0];
-	  if (word)
-	    {
-	      if (!(word & 0xffff))
-		{
-		  word >>= 16;
-		  bitno += 16;
-		}
-	      if (!(word & 0xff))
-		{
-		  word >>= 8;
-		  bitno += 8;
-		}
-	      for (; word; bitno++)
-		{
-		  if (word & 1)
-		    list[count++] = bitno;
-		  word >>= 1;
-		}
-	    }
-	  windex++;
-	  bitno = windex * BITSET_WORD_BITS;
-
-	  word = srcp[1];
-	  if (word)
-	    {
-	      if (!(word & 0xffff))
-		{
-		  word >>= 16;
-		  bitno += 16;
-		}
-	      for (; word; bitno++)
-		{
-		  if (word & 1)
-		    list[count++] = bitno;
-		  word >>= 1;
-		}
-	    }
-	  windex++;
-	  bitno = windex * BITSET_WORD_BITS;
-#else
-	  for (i = 0; i < EBITSET_ELT_WORDS; i++, windex++)
-	    {
-	      bitno = windex * BITSET_WORD_BITS;
-
-	      word = srcp[i];
-	      if (word)
-		{
-		  if (!(word & 0xffff))
-		    {
-		      word >>= 16;
-		      bitno += 16;
-		    }
-		  if (!(word & 0xff))
-		    {
-		      word >>= 8;
-		      bitno += 8;
-		    }
-		  for (; word; bitno++)
-		    {
-		      if (word & 1)
-			list[count++] = bitno;
-		      word >>= 1;
-		    }
-		}
-	    }
-#endif
-	}
-      else
-	{
-	  /* Tread more carefully since we need to check
-	     if array overflows.  */
-
-	  for (i = 0; i < EBITSET_ELT_WORDS; i++, windex++)
-	    {
-	      bitno = windex * BITSET_WORD_BITS;
-
-	      for (word = srcp[i]; word; bitno++)
-		{
-		  if (word & 1)
-		    {
-		      list[count++] = bitno;
-		      if (count >= num)
-			{
-			  *next = bitno + 1;
-			  return count;
-			}
-		    }
-		  word >>= 1;
-		}
-	    }
-	}
-    }
-
-  *next = bitno;
-  return count;
-}
-
-
-/* Ensure that any unused bits within the last element are clear.  */
-static inline void
-ebitset_unused_clear (bitset dst)
-{
-  unsigned int last_bit;
-  bitset_bindex n_bits;
-
-  n_bits = BITSET_NBITS_ (dst);
-  last_bit = n_bits % EBITSET_ELT_BITS;
-
-  if (last_bit)
-    {
-      bitset_windex eindex;
-      ebitset_elts *elts;
-      ebitset_elt *elt;
-
-      elts = EBITSET_ELTS (dst);
-
-      eindex = n_bits / EBITSET_ELT_BITS;
-
-      elt = elts[eindex];
-      if (elt)
-	{
-	  bitset_windex windex;
-	  bitset_windex woffset;
-	  bitset_word *srcp = EBITSET_WORDS (elt);
-
-	  windex = n_bits / BITSET_WORD_BITS;
-	  woffset = eindex * EBITSET_ELT_WORDS;
-
-	  srcp[windex - woffset] &= ((bitset_word) 1 << last_bit) - 1;
-	  windex++;
-	  for (; (windex - woffset) < EBITSET_ELT_WORDS; windex++)
-	    srcp[windex - woffset] = 0;
-	}
-    }
-}
-
-
-static void
-ebitset_ones (bitset dst)
-{
-  bitset_windex j;
-  ebitset_elt *elt;
-
-  for (j = 0; j < EBITSET_SIZE (dst); j++)
-    {
-      /* Create new elements if they cannot be found.  Perhaps
-	 we should just add pointers to a ones element?  */
-      elt =
-	ebitset_elt_find (dst, j * EBITSET_ELT_BITS, EBITSET_CREATE);
-      memset (EBITSET_WORDS (elt), -1, sizeof (EBITSET_WORDS (elt)));
-    }
-  EBITSET_NONZERO_SET (dst);
-  ebitset_unused_clear (dst);
-}
-
-
-static bool
-ebitset_empty_p (bitset dst)
-{
-  ebitset_elts *elts;
-  bitset_windex j;
-
-  if (EBITSET_ZERO_P (dst))
-    return 1;
-
-  elts = EBITSET_ELTS (dst);
-  for (j = 0; j < EBITSET_SIZE (dst); j++)
-    {
-      ebitset_elt *elt = elts[j];
-
-      if (elt)
-	{
-	  if (!ebitset_elt_zero_p (elt))
-	    return 0;
-	  /* Do some weeding as we go.  */
-	  ebitset_elt_remove (dst, j);
-	}
-    }
-
-  /* All the bits are zero.  We could shrink the elts.
-     For now just mark DST as known to be zero.  */
-  EBITSET_ZERO_SET (dst);
-  return 1;
-}
-
-
-static void
-ebitset_not (bitset dst, bitset src)
-{
-  unsigned int i;
-  ebitset_elt *selt;
-  ebitset_elt *delt;
-  bitset_windex j;
-
-  ebitset_resize (dst, BITSET_NBITS_ (src));
-
-  for (j = 0; j < EBITSET_SIZE (src); j++)
-    {
-      /* Create new elements for dst if they cannot be found
-	 or substitute zero elements if src elements not found.  */
-      selt =
-	ebitset_elt_find (dst, j * EBITSET_ELT_BITS, EBITSET_SUBST);
-      delt =
-	ebitset_elt_find (dst, j * EBITSET_ELT_BITS, EBITSET_CREATE);
-
-      for (i = 0; i < EBITSET_ELT_WORDS; i++)
-	EBITSET_WORDS (delt)[i] = ~EBITSET_WORDS (selt)[i];
-    }
-  EBITSET_NONZERO_SET (dst);
-  ebitset_unused_clear (dst);
-}
-
-
-/* Is DST == DST | SRC?  */
-static bool
-ebitset_subset_p (bitset dst, bitset src)
-{
-  bitset_windex j;
-  ebitset_elts *selts;
-  ebitset_elts *delts;
-  bitset_windex ssize;
-  bitset_windex dsize;
-
-  selts = EBITSET_ELTS (src);
-  delts = EBITSET_ELTS (dst);
-
-  ssize = EBITSET_SIZE (src);
-  dsize = EBITSET_SIZE (dst);
-
-  for (j = 0; j < ssize; j++)
-    {
-      unsigned int i;
-      ebitset_elt *selt;
-      ebitset_elt *delt;
-
-      selt = j < ssize ? selts[j] : 0;
-      delt = j < dsize ? delts[j] : 0;
-
-      if (!selt && !delt)
-	continue;
-
-      if (!selt)
-	selt = &ebitset_zero_elts[0];
-      if (!delt)
-	delt = &ebitset_zero_elts[0];
-
-      for (i = 0; i < EBITSET_ELT_WORDS; i++)
-	if (EBITSET_WORDS (delt)[i]
-	    != (EBITSET_WORDS (selt)[i] | EBITSET_WORDS (delt)[i]))
-	  return false;
-    }
-  return true;
-}
-
-
-/* Is DST & SRC == 0?  */
-static bool
-ebitset_disjoint_p (bitset dst, bitset src)
-{
-  bitset_windex j;
-  ebitset_elts *selts;
-  ebitset_elts *delts;
-  bitset_windex ssize;
-  bitset_windex dsize;
-
-  selts = EBITSET_ELTS (src);
-  delts = EBITSET_ELTS (dst);
-
-  ssize = EBITSET_SIZE (src);
-  dsize = EBITSET_SIZE (dst);
-
-  for (j = 0; j < ssize; j++)
-    {
-      unsigned int i;
-      ebitset_elt *selt;
-      ebitset_elt *delt;
-
-      selt = j < ssize ? selts[j] : 0;
-      delt = j < dsize ? delts[j] : 0;
-
-      if (!selt || !delt)
-	continue;
-
-      for (i = 0; i < EBITSET_ELT_WORDS; i++)
-	if ((EBITSET_WORDS (selt)[i] & EBITSET_WORDS (delt)[i]))
-	  return false;
-    }
-  return true;
-}
-
-
-
-static bool
-ebitset_op3_cmp (bitset dst, bitset src1, bitset src2, enum bitset_ops op)
-{
-  bitset_windex ssize1;
-  bitset_windex ssize2;
-  bitset_windex dsize;
-  bitset_windex size;
-  ebitset_elts *selts1;
-  ebitset_elts *selts2;
-  ebitset_elts *delts;
-  bitset_word *srcp1;
-  bitset_word *srcp2;
-  bitset_word *dstp;
-  bool changed = false;
-  unsigned int i;
-  bitset_windex j;
-
-  ebitset_resize (dst, max (BITSET_NBITS_ (src1), BITSET_NBITS_ (src2)));
-
-  ssize1 = EBITSET_SIZE (src1);
-  ssize2 = EBITSET_SIZE (src2);
-  dsize = EBITSET_SIZE (dst);
-  size = ssize1;
-  if (size < ssize2)
-    size = ssize2;
-
-  selts1 = EBITSET_ELTS (src1);
-  selts2 = EBITSET_ELTS (src2);
-  delts = EBITSET_ELTS (dst);
-
-  for (j = 0; j < size; j++)
-    {
-      ebitset_elt *selt1;
-      ebitset_elt *selt2;
-      ebitset_elt *delt;
-
-      selt1 = j < ssize1 ? selts1[j] : 0;
-      selt2 = j < ssize2 ? selts2[j] : 0;
-      delt = j < dsize ? delts[j] : 0;
-
-      if (!selt1 && !selt2)
-	{
-	  if (delt)
-	    {
-	      changed = true;
-	      ebitset_elt_remove (dst, j);
-	    }
-	  continue;
-	}
-
-      if (!selt1)
-	selt1 = &ebitset_zero_elts[0];
-      if (!selt2)
-	selt2 = &ebitset_zero_elts[0];
-      if (!delt)
-	delt = ebitset_elt_calloc ();
-      else
-	delts[j] = 0;
-
-      srcp1 = EBITSET_WORDS (selt1);
-      srcp2 = EBITSET_WORDS (selt2);
-      dstp = EBITSET_WORDS (delt);
-      switch (op)
-	{
-	default:
-	  abort ();
-
-	case BITSET_OP_OR:
-	  for (i = 0; i < EBITSET_ELT_WORDS; i++, dstp++)
-	    {
-	      bitset_word tmp = *srcp1++ | *srcp2++;
-
-	      if (*dstp != tmp)
-		{
-		  changed = true;
-		  *dstp = tmp;
-		}
-	    }
-	  break;
-
-	case BITSET_OP_AND:
-	  for (i = 0; i < EBITSET_ELT_WORDS; i++, dstp++)
-	    {
-	      bitset_word tmp = *srcp1++ & *srcp2++;
-
-	      if (*dstp != tmp)
-		{
-		  changed = true;
-		  *dstp = tmp;
-		}
-	    }
-	  break;
-
-	case BITSET_OP_XOR:
-	  for (i = 0; i < EBITSET_ELT_WORDS; i++, dstp++)
-	    {
-	      bitset_word tmp = *srcp1++ ^ *srcp2++;
-
-	      if (*dstp != tmp)
-		{
-		  changed = true;
-		  *dstp = tmp;
-		}
-	    }
-	  break;
-
-	case BITSET_OP_ANDN:
-	  for (i = 0; i < EBITSET_ELT_WORDS; i++, dstp++)
-	    {
-	      bitset_word tmp = *srcp1++ & ~(*srcp2++);
-
-	      if (*dstp != tmp)
-		{
-		  changed = true;
-		  *dstp = tmp;
-		}
-	    }
-	  break;
-	}
-
-      if (!ebitset_elt_zero_p (delt))
-	{
-	  ebitset_elt_add (dst, delt, j);
-	}
-      else
-	{
-	  ebitset_elt_free (delt);
-	}
-    }
-
-  /* If we have elements of DST left over, free them all.  */
-  for (; j < dsize; j++)
-    {
-      ebitset_elt *delt;
-
-      changed = true;
-
-      delt = delts[j];
-
-      if (delt)
-	ebitset_elt_remove (dst, j);
-    }
-
-  EBITSET_NONZERO_SET (dst);
-  return changed;
-}
-
-
-static bool
-ebitset_and_cmp (bitset dst, bitset src1, bitset src2)
-{
-  bool changed;
-
-  if (EBITSET_ZERO_P (src2))
-    {
-      ebitset_weed (dst);
-      changed = EBITSET_ZERO_P (dst);
-      ebitset_zero (dst);
-      return changed;
-    }
-  else if (EBITSET_ZERO_P (src1))
-    {
-      ebitset_weed (dst);
-      changed = EBITSET_ZERO_P (dst);
-      ebitset_zero (dst);
-      return changed;
-    }
-  return ebitset_op3_cmp (dst, src1, src2, BITSET_OP_AND);
-}
-
-
-static void
-ebitset_and (bitset dst, bitset src1, bitset src2)
-{
-  ebitset_and_cmp (dst, src1, src2);
-}
-
-
-static bool
-ebitset_andn_cmp (bitset dst, bitset src1, bitset src2)
-{
-  bool changed;
-
-  if (EBITSET_ZERO_P (src2))
-    {
-      return ebitset_copy_cmp (dst, src1);
-    }
-  else if (EBITSET_ZERO_P (src1))
-    {
-      ebitset_weed (dst);
-      changed = EBITSET_ZERO_P (dst);
-      ebitset_zero (dst);
-      return changed;
-    }
-  return ebitset_op3_cmp (dst, src1, src2, BITSET_OP_ANDN);
-}
-
-
-static void
-ebitset_andn (bitset dst, bitset src1, bitset src2)
-{
-  ebitset_andn_cmp (dst, src1, src2);
-}
-
-
-static bool
-ebitset_or_cmp (bitset dst, bitset src1, bitset src2)
-{
-  if (EBITSET_ZERO_P (src2))
-    {
-      return ebitset_copy_cmp (dst, src1);
-    }
-  else if (EBITSET_ZERO_P (src1))
-    {
-      return ebitset_copy_cmp (dst, src2);
-    }
-  return ebitset_op3_cmp (dst, src1, src2, BITSET_OP_OR);
-}
-
-
-static void
-ebitset_or (bitset dst, bitset src1, bitset src2)
-{
-  ebitset_or_cmp (dst, src1, src2);
-}
-
-
-static bool
-ebitset_xor_cmp (bitset dst, bitset src1, bitset src2)
-{
-  if (EBITSET_ZERO_P (src2))
-    {
-      return ebitset_copy_cmp (dst, src1);
-    }
-  else if (EBITSET_ZERO_P (src1))
-    {
-      return ebitset_copy_cmp (dst, src2);
-    }
-  return ebitset_op3_cmp (dst, src1, src2, BITSET_OP_XOR);
-}
-
-
-static void
-ebitset_xor (bitset dst, bitset src1, bitset src2)
-{
-  ebitset_xor_cmp (dst, src1, src2);
-}
-
-
-static void
-ebitset_copy (bitset dst, bitset src)
-{
-  if (BITSET_COMPATIBLE_ (dst, src))
-      ebitset_copy_ (dst, src);
-  else
-      bitset_copy_ (dst, src);
-}
-
-
-/* Vector of operations for linked-list bitsets.  */
-struct bitset_vtable ebitset_vtable = {
-  ebitset_set,
-  ebitset_reset,
-  bitset_toggle_,
-  ebitset_test,
-  ebitset_resize,
-  bitset_size_,
-  bitset_count_,
-  ebitset_empty_p,
-  ebitset_ones,
-  ebitset_zero,
-  ebitset_copy,
-  ebitset_disjoint_p,
-  ebitset_equal_p,
-  ebitset_not,
-  ebitset_subset_p,
-  ebitset_and,
-  ebitset_and_cmp,
-  ebitset_andn,
-  ebitset_andn_cmp,
-  ebitset_or,
-  ebitset_or_cmp,
-  ebitset_xor,
-  ebitset_xor_cmp,
-  bitset_and_or_,
-  bitset_and_or_cmp_,
-  bitset_andn_or_,
-  bitset_andn_or_cmp_,
-  bitset_or_and_,
-  bitset_or_and_cmp_,
-  ebitset_list,
-  ebitset_list_reverse,
-  ebitset_free,
-  BITSET_TABLE
-};
-
-
-/* Return size of initial structure.  */
-size_t
-ebitset_bytes (bitset_bindex n_bits ATTRIBUTE_UNUSED)
-{
-  return sizeof (struct ebitset_struct);
-}
-
-
-/* Initialize a bitset.  */
-
-bitset
-ebitset_init (bitset bset, bitset_bindex n_bits)
-{
-  bitset_windex size;
-
-  bset->b.vtable = &ebitset_vtable;
-
-  bset->b.csize = EBITSET_ELT_WORDS;
-
-  EBITSET_ZERO_SET (bset);
-
-  size = n_bits ? (n_bits + EBITSET_ELT_BITS - 1) / EBITSET_ELT_BITS
-    : EBITSET_INITIAL_SIZE;
-
-  EBITSET_ASIZE (bset) = 0;
-  EBITSET_ELTS (bset) = 0;
-  ebitset_resize (bset, n_bits);
-
-  return bset;
-}
-
-
-void
-ebitset_release_memory (void)
-{
-  ebitset_free_list = 0;
-  if (ebitset_obstack_init)
-    {
-      ebitset_obstack_init = false;
-      obstack_free (&ebitset_obstack, NULL);
-    }
-}
diff --git a/lib/ebitset.h b/lib/ebitset.h
deleted file mode 100644
index dc60273..0000000
--- a/lib/ebitset.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Functions to support ebitsets.
-   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
-   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
-
-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 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, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef _EBITSET_H
-#define _EBITSET_H
-
-#include "bitset.h"
-
-extern size_t ebitset_bytes (bitset_bindex);
-
-extern bitset ebitset_init (bitset, bitset_bindex);
-
-extern void ebitset_release_memory (void);
-
-#endif
diff --git a/lib/error.c b/lib/error.c
deleted file mode 100644
index 45698be..0000000
--- a/lib/error.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/* Error handler for noninteractive utilities
-   Copyright (C) 1990-1998, 2000-2003, 2004 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 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 David MacKenzie <djm@gnu.ai.mit.edu>.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "error.h"
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#if !_LIBC && ENABLE_NLS
-# include "gettext.h"
-#endif
-
-#ifdef _LIBC
-# include <wchar.h>
-# define mbsrtowcs __mbsrtowcs
-#endif
-
-#if USE_UNLOCKED_IO
-# include "unlocked-io.h"
-#endif
-
-#ifndef _
-# define _(String) String
-#endif
-
-/* If NULL, error will flush stdout, then print on stderr the program
-   name, a colon and a space.  Otherwise, error will call this
-   function without parameters instead.  */
-void (*error_print_progname) (void);
-
-/* This variable is incremented each time `error' is called.  */
-unsigned int error_message_count;
-
-#ifdef _LIBC
-/* In the GNU C library, there is a predefined variable for this.  */
-
-# define program_name program_invocation_name
-# include <errno.h>
-# include <libio/libioP.h>
-
-/* In GNU libc we want do not want to use the common name `error' directly.
-   Instead make it a weak alias.  */
-extern void __error (int status, int errnum, const char *message, ...)
-     __attribute__ ((__format__ (__printf__, 3, 4)));
-extern void __error_at_line (int status, int errnum, const char *file_name,
-			     unsigned int line_number, const char *message,
-			     ...)
-     __attribute__ ((__format__ (__printf__, 5, 6)));;
-# define error __error
-# define error_at_line __error_at_line
-
-# include <libio/iolibio.h>
-# define fflush(s) INTUSE(_IO_fflush) (s)
-# undef putc
-# define putc(c, fp) INTUSE(_IO_putc) (c, fp)
-
-# include <bits/libc-lock.h>
-
-#else /* not _LIBC */
-
-# if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P
-#  ifndef HAVE_DECL_STRERROR_R
-"this configure-time declaration test was not run"
-#  endif
-char *strerror_r ();
-# endif
-
-# ifndef SIZE_MAX
-#  define SIZE_MAX ((size_t) -1)
-# endif
-
-/* The calling program should define program_name and set it to the
-   name of the executing program.  */
-extern char *program_name;
-
-# if HAVE_STRERROR_R || defined strerror_r
-#  define __strerror_r strerror_r
-# endif
-#endif	/* not _LIBC */
-
-static void
-print_errno_message (int errnum)
-{
-  char const *s = NULL;
-
-#if defined HAVE_STRERROR_R || _LIBC
-  char errbuf[1024];
-# if STRERROR_R_CHAR_P || _LIBC
-  s = __strerror_r (errnum, errbuf, sizeof errbuf);
-# else
-  if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0)
-    s = errbuf;
-# endif
-#endif
-
-#if !_LIBC
-  if (! s && ! (s = strerror (errnum)))
-    s = _("Unknown system error");
-#endif
-
-#if _LIBC
-  if (_IO_fwide (stderr, 0) > 0)
-    {
-      __fwprintf (stderr, L": %s", s);
-      return;
-    }
-#endif
-
-  fprintf (stderr, ": %s", s);
-}
-
-static void
-error_tail (int status, int errnum, const char *message, va_list args)
-{
-#if _LIBC
-  if (_IO_fwide (stderr, 0) > 0)
-    {
-# define ALLOCA_LIMIT 2000
-      size_t len = strlen (message) + 1;
-      const wchar_t *wmessage = L"out of memory";
-      wchar_t *wbuf = (len < ALLOCA_LIMIT
-		       ? alloca (len * sizeof *wbuf)
-		       : len <= SIZE_MAX / sizeof *wbuf
-		       ? malloc (len * sizeof *wbuf)
-		       : NULL);
-
-      if (wbuf)
-	{
-	  size_t res;
-	  mbstate_t st;
-	  const char *tmp = message;
-	  memset (&st, '\0', sizeof (st));
-	  res = mbsrtowcs (wbuf, &tmp, len, &st);
-	  wmessage = res == (size_t) -1 ? L"???" : wbuf;
-	}
-
-      __vfwprintf (stderr, wmessage, args);
-      if (! (len < ALLOCA_LIMIT))
-	free (wbuf);
-    }
-  else
-#endif
-    vfprintf (stderr, message, args);
-  va_end (args);
-
-  ++error_message_count;
-  if (errnum)
-    print_errno_message (errnum);
-#if _LIBC
-  if (_IO_fwide (stderr, 0) > 0)
-    putwc (L'\n', stderr);
-  else
-#endif
-    putc ('\n', stderr);
-  fflush (stderr);
-  if (status)
-    exit (status);
-}
-
-
-/* Print the program name and error message MESSAGE, which is a printf-style
-   format string with optional args.
-   If ERRNUM is nonzero, print its corresponding system error message.
-   Exit with status STATUS if it is nonzero.  */
-void
-error (int status, int errnum, const char *message, ...)
-{
-  va_list args;
-
-#if defined _LIBC && defined __libc_ptf_call
-  /* We do not want this call to be cut short by a thread
-     cancellation.  Therefore disable cancellation for now.  */
-  int state = PTHREAD_CANCEL_ENABLE;
-  __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
-		   0);
-#endif
-
-  fflush (stdout);
-#ifdef _LIBC
-  _IO_flockfile (stderr);
-#endif
-  if (error_print_progname)
-    (*error_print_progname) ();
-  else
-    {
-#if _LIBC
-      if (_IO_fwide (stderr, 0) > 0)
-	__fwprintf (stderr, L"%s: ", program_name);
-      else
-#endif
-	fprintf (stderr, "%s: ", program_name);
-    }
-
-  va_start (args, message);
-  error_tail (status, errnum, message, args);
-
-#ifdef _LIBC
-  _IO_funlockfile (stderr);
-# ifdef __libc_ptf_call
-  __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
-# endif
-#endif
-}
-
-/* Sometimes we want to have at most one error per line.  This
-   variable controls whether this mode is selected or not.  */
-int error_one_per_line;
-
-void
-error_at_line (int status, int errnum, const char *file_name,
-	       unsigned int line_number, const char *message, ...)
-{
-  va_list args;
-
-  if (error_one_per_line)
-    {
-      static const char *old_file_name;
-      static unsigned int old_line_number;
-
-      if (old_line_number == line_number
-	  && (file_name == old_file_name
-	      || strcmp (old_file_name, file_name) == 0))
-	/* Simply return and print nothing.  */
-	return;
-
-      old_file_name = file_name;
-      old_line_number = line_number;
-    }
-
-#if defined _LIBC && defined __libc_ptf_call
-  /* We do not want this call to be cut short by a thread
-     cancellation.  Therefore disable cancellation for now.  */
-  int state = PTHREAD_CANCEL_ENABLE;
-  __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
-		   0);
-#endif
-
-  fflush (stdout);
-#ifdef _LIBC
-  _IO_flockfile (stderr);
-#endif
-  if (error_print_progname)
-    (*error_print_progname) ();
-  else
-    {
-#if _LIBC
-      if (_IO_fwide (stderr, 0) > 0)
-	__fwprintf (stderr, L"%s: ", program_name);
-      else
-#endif
-	fprintf (stderr, "%s:", program_name);
-    }
-
-  if (file_name != NULL)
-    {
-#if _LIBC
-      if (_IO_fwide (stderr, 0) > 0)
-	__fwprintf (stderr, L"%s:%d: ", file_name, line_number);
-      else
-#endif
-	fprintf (stderr, "%s:%d: ", file_name, line_number);
-    }
-
-  va_start (args, message);
-  error_tail (status, errnum, message, args);
-
-#ifdef _LIBC
-  _IO_funlockfile (stderr);
-# ifdef __libc_ptf_call
-  __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
-# endif
-#endif
-}
-
-#ifdef _LIBC
-/* Make the weak alias.  */
-# undef error
-# undef error_at_line
-weak_alias (__error, error)
-weak_alias (__error_at_line, error_at_line)
-#endif
diff --git a/lib/error.h b/lib/error.h
deleted file mode 100644
index e5220a2..0000000
--- a/lib/error.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Declaration for error-reporting function
-   Copyright (C) 1995, 1996, 1997, 2003 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 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.  */
-
-#ifndef _ERROR_H
-#define _ERROR_H 1
-
-#ifndef __attribute__
-/* This feature is available in gcc versions 2.5 and later.  */
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
-#  define __attribute__(Spec) /* empty */
-# endif
-/* The __-protected variants of `format' and `printf' attributes
-   are accepted by gcc versions 2.6.4 (effectively 2.7) and later.  */
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
-#  define __format__ format
-#  define __printf__ printf
-# endif
-#endif
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-/* Print a message with `fprintf (stderr, FORMAT, ...)';
-   if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
-   If STATUS is nonzero, terminate the program with `exit (STATUS)'.  */
-
-extern void error (int __status, int __errnum, const char *__format, ...)
-     __attribute__ ((__format__ (__printf__, 3, 4)));
-
-extern void error_at_line (int __status, int __errnum, const char *__fname,
-			   unsigned int __lineno, const char *__format, ...)
-     __attribute__ ((__format__ (__printf__, 5, 6)));
-
-/* If NULL, error will flush stdout, then print on stderr the program
-   name, a colon and a space.  Otherwise, error will call this
-   function without parameters instead.  */
-extern void (*error_print_progname) (void);
-
-/* This variable is incremented each time `error' is called.  */
-extern unsigned int error_message_count;
-
-/* Sometimes we want to have at most one error per line.  This
-   variable controls whether this mode is selected or not.  */
-extern int error_one_per_line;
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif /* error.h */
diff --git a/lib/exit.h b/lib/exit.h
deleted file mode 100644
index 9dbfb7c..0000000
--- a/lib/exit.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* exit() function.
-   Copyright (C) 1995, 2001 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.  */
-
-#ifndef _EXIT_H
-#define _EXIT_H
-
-/* Get exit() declaration.  */
-#include <stdlib.h>
-
-/* Some systems do not define EXIT_*, even with STDC_HEADERS.  */
-#ifndef EXIT_SUCCESS
-# define EXIT_SUCCESS 0
-#endif
-#ifndef EXIT_FAILURE
-# define EXIT_FAILURE 1
-#endif
-
-#endif /* _EXIT_H */
diff --git a/lib/exitfail.c b/lib/exitfail.c
deleted file mode 100644
index 27d38c3..0000000
--- a/lib/exitfail.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Failure exit status
-
-   Copyright (C) 2002, 2003 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; see the file COPYING.
-   If not, write to the Free Software Foundation,
-   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "exitfail.h"
-#include "exit.h"
-
-int volatile exit_failure = EXIT_FAILURE;
diff --git a/lib/exitfail.h b/lib/exitfail.h
deleted file mode 100644
index e46cf9c..0000000
--- a/lib/exitfail.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Failure exit status
-
-   Copyright (C) 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 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; see the file COPYING.
-   If not, write to the Free Software Foundation,
-   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-extern int volatile exit_failure;
diff --git a/lib/fd-safer.c b/lib/fd-safer.c
deleted file mode 100644
index 5933bcb..0000000
--- a/lib/fd-safer.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Return a safer copy of a file descriptor.
-
-   Copyright (C) 2005 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 Paul Eggert.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "unistd-safer.h"
-
-#include <errno.h>
-
-#include <unistd.h>
-#ifndef STDIN_FILENO
-# define STDIN_FILENO 0
-#endif
-#ifndef STDERR_FILENO
-# define STDERR_FILENO 2
-#endif
-
-/* Return FD, unless FD would be a copy of standard input, output, or
-   error; in that case, return a duplicate of FD, closing FD.  On
-   failure to duplicate, close FD, set errno, and return -1.  Preserve
-   errno if FD is negative, so that the caller can always inspect
-   errno when the returned value is negative.
-
-   This function is usefully wrapped around functions that return file
-   descriptors, e.g., fd_safer (open ("file", O_RDONLY)).  */
-
-int
-fd_safer (int fd)
-{
-  if (STDIN_FILENO <= fd && fd <= STDERR_FILENO)
-    {
-      int f = dup_safer (fd);
-      int e = errno;
-      close (fd);
-      errno = e;
-      fd = f;
-    }
-
-  return fd;
-}
diff --git a/lib/fopen-safer.c b/lib/fopen-safer.c
deleted file mode 100644
index 4f2ffa1..0000000
--- a/lib/fopen-safer.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Invoke fopen, but avoid some glitches.
-   Copyright (C) 2001, 2004, 2005 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 Paul Eggert.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "stdio-safer.h"
-
-#include <errno.h>
-#include <unistd.h>
-#include "unistd-safer.h"
-
-#ifndef STDERR_FILENO
-# define STDERR_FILENO 2
-#endif
-
-/* Like fopen, but do not return stdin, stdout, or stderr.  */
-
-FILE *
-fopen_safer (char const *file, char const *mode)
-{
-  FILE *fp = fopen (file, mode);
-
-  if (fp)
-    {
-      int fd = fileno (fp);
-
-      if (0 <= fd && fd <= STDERR_FILENO)
-	{
-	  int f = dup_safer (fd);
-
-	  if (f < 0)
-	    {
-	      int e = errno;
-	      fclose (fp);
-	      errno = e;
-	      return NULL;
-	    }
-
-	  if (fclose (fp) != 0
-	      || ! (fp = fdopen (f, mode)))
-	    {
-	      int e = errno;
-	      close (f);
-	      errno = e;
-	      return NULL;
-	    }
-	}
-    }
-
-  return fp;
-}
diff --git a/lib/get-errno.c b/lib/get-errno.c
deleted file mode 100644
index 8e8ef58..0000000
--- a/lib/get-errno.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* get-errno.c - get and set errno.
-
-   Copyright (C) 2002, 2006 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 Paul Eggert.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <errno.h>
-
-#include "get-errno.h"
-
-/* Get and set errno.  A source file that needs to set or get errno,
-   but doesn't need to test for specific errno values, can use these
-   functions to avoid namespace pollution.  For example, a file that
-   defines EQUAL should not include <errno.h>, since <errno.h> might
-   define EQUAL; such a file can include <get-errno.h> instead.  */
-
-int
-get_errno (void)
-{
-  return errno;
-}
-
-void
-set_errno (int e)
-{
-  errno = e;
-}
diff --git a/lib/get-errno.h b/lib/get-errno.h
deleted file mode 100644
index d39a8dd..0000000
--- a/lib/get-errno.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* get-errno.h - get and set errno.
-
-   Copyright (C) 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 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.  */
-
-extern int get_errno (void);
-extern void set_errno (int);
diff --git a/lib/getopt.c b/lib/getopt.c
deleted file mode 100644
index 83bd6db..0000000
--- a/lib/getopt.c
+++ /dev/null
@@ -1,1191 +0,0 @@
-/* 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,98,99,2000,2001,2002,2003,2004,2006
-	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 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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "getopt.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifdef VMS
-# include <unixlib.h>
-#endif
-
-#ifdef _LIBC
-# include <libintl.h>
-#else
-# include "gettext.h"
-# define _(msgid) gettext (msgid)
-#endif
-
-#if defined _LIBC && defined USE_IN_LIBIO
-# include <wchar.h>
-#endif
-
-#ifndef attribute_hidden
-# define attribute_hidden
-#endif
-
-/* Unlike standard Unix `getopt', functions like `getopt_long'
-   let the user intersperse the options with the other arguments.
-
-   As `getopt_long' 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.
-
-   Using `getopt' or setting the environment variable POSIXLY_CORRECT
-   disables permutation.
-   Then the application's 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_int.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;
-
-/* 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;
-
-/* 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 = '?';
-
-/* Keep a global copy of all internal members of getopt_data.  */
-
-static struct _getopt_data getopt_data;
-
-
-#if defined HAVE_DECL_GETENV && !HAVE_DECL_GETENV
-extern char *getenv ();
-#endif
-
-#ifdef _LIBC
-/* Stored original parameters.
-   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).  */
-extern int __libc_argc;
-extern char **__libc_argv;
-
-/* Bash 2.0 gives us an environment variable containing flags
-   indicating ARGV elements that should not be considered arguments.  */
-
-# ifdef USE_NONOPTION_FLAGS
-/* Defined in getopt_init.c  */
-extern char *__getopt_nonoption_flags;
-# endif
-
-# ifdef USE_NONOPTION_FLAGS
-#  define SWAP_FLAGS(ch1, ch2) \
-  if (d->__nonoption_flags_len > 0)					      \
-    {									      \
-      char __tmp = __getopt_nonoption_flags[ch1];			      \
-      __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];	      \
-      __getopt_nonoption_flags[ch2] = __tmp;				      \
-    }
-# else
-#  define SWAP_FLAGS(ch1, ch2)
-# endif
-#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.  */
-
-static void
-exchange (char **argv, struct _getopt_data *d)
-{
-  int bottom = d->__first_nonopt;
-  int middle = d->__last_nonopt;
-  int top = d->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.  */
-
-#if defined _LIBC && defined USE_NONOPTION_FLAGS
-  /* 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 (d->__nonoption_flags_len > 0 && top >= d->__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)
-	d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0;
-      else
-	{
-	  memset (__mempcpy (new_str, __getopt_nonoption_flags,
-			     d->__nonoption_flags_max_len),
-		  '\0', top + 1 - d->__nonoption_flags_max_len);
-	  d->__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.  */
-
-  d->__first_nonopt += (d->optind - d->__last_nonopt);
-  d->__last_nonopt = d->optind;
-}
-
-/* Initialize the internal data when the first call is made.  */
-
-static const char *
-_getopt_initialize (int argc, char **argv, const char *optstring,
-		    int posixly_correct, struct _getopt_data *d)
-{
-  /* 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.  */
-
-  d->__first_nonopt = d->__last_nonopt = d->optind;
-
-  d->__nextchar = NULL;
-
-  d->__posixly_correct = posixly_correct || !!getenv ("POSIXLY_CORRECT");
-
-  /* Determine how to handle the ordering of options and nonoptions.  */
-
-  if (optstring[0] == '-')
-    {
-      d->__ordering = RETURN_IN_ORDER;
-      ++optstring;
-    }
-  else if (optstring[0] == '+')
-    {
-      d->__ordering = REQUIRE_ORDER;
-      ++optstring;
-    }
-  else if (d->__posixly_correct)
-    d->__ordering = REQUIRE_ORDER;
-  else
-    d->__ordering = PERMUTE;
-
-#if defined _LIBC && defined USE_NONOPTION_FLAGS
-  if (!d->__posixly_correct
-      && argc == __libc_argc && argv == __libc_argv)
-    {
-      if (d->__nonoption_flags_max_len == 0)
-	{
-	  if (__getopt_nonoption_flags == NULL
-	      || __getopt_nonoption_flags[0] == '\0')
-	    d->__nonoption_flags_max_len = -1;
-	  else
-	    {
-	      const char *orig_str = __getopt_nonoption_flags;
-	      int len = d->__nonoption_flags_max_len = strlen (orig_str);
-	      if (d->__nonoption_flags_max_len < argc)
-		d->__nonoption_flags_max_len = argc;
-	      __getopt_nonoption_flags =
-		(char *) malloc (d->__nonoption_flags_max_len);
-	      if (__getopt_nonoption_flags == NULL)
-		d->__nonoption_flags_max_len = -1;
-	      else
-		memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
-			'\0', d->__nonoption_flags_max_len - len);
-	    }
-	}
-      d->__nonoption_flags_len = d->__nonoption_flags_max_len;
-    }
-  else
-    d->__nonoption_flags_len = 0;
-#endif
-
-  return optstring;
-}
-
-/* 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.
-
-   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.
-
-   If POSIXLY_CORRECT is nonzero, behave as if the POSIXLY_CORRECT
-   environment variable were set.  */
-
-int
-_getopt_internal_r (int argc, char **argv, const char *optstring,
-		    const struct option *longopts, int *longind,
-		    int long_only, int posixly_correct, struct _getopt_data *d)
-{
-  int print_errors = d->opterr;
-  if (optstring[0] == ':')
-    print_errors = 0;
-
-  if (argc < 1)
-    return -1;
-
-  d->optarg = NULL;
-
-  if (d->optind == 0 || !d->__initialized)
-    {
-      if (d->optind == 0)
-	d->optind = 1;	/* Don't scan ARGV[0], the program name.  */
-      optstring = _getopt_initialize (argc, argv, optstring,
-				      posixly_correct, d);
-      d->__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.  */
-#if defined _LIBC && defined USE_NONOPTION_FLAGS
-# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \
-		      || (d->optind < d->__nonoption_flags_len		      \
-			  && __getopt_nonoption_flags[d->optind] == '1'))
-#else
-# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
-#endif
-
-  if (d->__nextchar == NULL || *d->__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 (d->__last_nonopt > d->optind)
-	d->__last_nonopt = d->optind;
-      if (d->__first_nonopt > d->optind)
-	d->__first_nonopt = d->optind;
-
-      if (d->__ordering == PERMUTE)
-	{
-	  /* If we have just processed some options following some non-options,
-	     exchange them so that the options come first.  */
-
-	  if (d->__first_nonopt != d->__last_nonopt
-	      && d->__last_nonopt != d->optind)
-	    exchange ((char **) argv, d);
-	  else if (d->__last_nonopt != d->optind)
-	    d->__first_nonopt = d->optind;
-
-	  /* Skip any additional non-options
-	     and extend the range of non-options previously skipped.  */
-
-	  while (d->optind < argc && NONOPTION_P)
-	    d->optind++;
-	  d->__last_nonopt = d->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 (d->optind != argc && !strcmp (argv[d->optind], "--"))
-	{
-	  d->optind++;
-
-	  if (d->__first_nonopt != d->__last_nonopt
-	      && d->__last_nonopt != d->optind)
-	    exchange ((char **) argv, d);
-	  else if (d->__first_nonopt == d->__last_nonopt)
-	    d->__first_nonopt = d->optind;
-	  d->__last_nonopt = argc;
-
-	  d->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 (d->optind == argc)
-	{
-	  /* Set the next-arg-index to point at the non-options
-	     that we previously skipped, so the caller will digest them.  */
-	  if (d->__first_nonopt != d->__last_nonopt)
-	    d->optind = d->__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 (d->__ordering == REQUIRE_ORDER)
-	    return -1;
-	  d->optarg = argv[d->optind++];
-	  return 1;
-	}
-
-      /* We have found another option-ARGV-element.
-	 Skip the initial punctuation.  */
-
-      d->__nextchar = (argv[d->optind] + 1
-		  + (longopts != NULL && argv[d->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[d->optind][1] == '-'
-	  || (long_only && (argv[d->optind][2]
-			    || !strchr (optstring, argv[d->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 = d->__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, d->__nextchar, nameend - d->__nextchar))
-	  {
-	    if ((unsigned int) (nameend - d->__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 if (long_only
-		     || pfound->has_arg != p->has_arg
-		     || pfound->flag != p->flag
-		     || pfound->val != p->val)
-	      /* Second or later nonexact match found.  */
-	      ambig = 1;
-	  }
-
-      if (ambig && !exact)
-	{
-	  if (print_errors)
-	    {
-#if defined _LIBC && defined USE_IN_LIBIO
-	      char *buf;
-
-	      if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"),
-			      argv[0], argv[d->optind]) >= 0)
-		{
-		  _IO_flockfile (stderr);
-
-		  int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
-		  ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
-
-		  __fxprintf (NULL, "%s", buf);
-
-		  ((_IO_FILE *) stderr)->_flags2 = old_flags2;
-		  _IO_funlockfile (stderr);
-
-		  free (buf);
-		}
-#else
-	      fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
-		       argv[0], argv[d->optind]);
-#endif
-	    }
-	  d->__nextchar += strlen (d->__nextchar);
-	  d->optind++;
-	  d->optopt = 0;
-	  return '?';
-	}
-
-      if (pfound != NULL)
-	{
-	  option_index = indfound;
-	  d->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)
-		d->optarg = nameend + 1;
-	      else
-		{
-		  if (print_errors)
-		    {
-#if defined _LIBC && defined USE_IN_LIBIO
-		      char *buf;
-		      int n;
-#endif
-
-		      if (argv[d->optind - 1][1] == '-')
-			{
-			  /* --option */
-#if defined _LIBC && defined USE_IN_LIBIO
-			  n = __asprintf (&buf, _("\
-%s: option `--%s' doesn't allow an argument\n"),
-					  argv[0], pfound->name);
-#else
-			  fprintf (stderr, _("\
-%s: option `--%s' doesn't allow an argument\n"),
-				   argv[0], pfound->name);
-#endif
-			}
-		      else
-			{
-			  /* +option or -option */
-#if defined _LIBC && defined USE_IN_LIBIO
-			  n = __asprintf (&buf, _("\
-%s: option `%c%s' doesn't allow an argument\n"),
-					  argv[0], argv[d->optind - 1][0],
-					  pfound->name);
-#else
-			  fprintf (stderr, _("\
-%s: option `%c%s' doesn't allow an argument\n"),
-				   argv[0], argv[d->optind - 1][0],
-				   pfound->name);
-#endif
-			}
-
-#if defined _LIBC && defined USE_IN_LIBIO
-		      if (n >= 0)
-			{
-			  _IO_flockfile (stderr);
-
-			  int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
-			  ((_IO_FILE *) stderr)->_flags2
-			    |= _IO_FLAGS2_NOTCANCEL;
-
-			  __fxprintf (NULL, "%s", buf);
-
-			  ((_IO_FILE *) stderr)->_flags2 = old_flags2;
-			  _IO_funlockfile (stderr);
-
-			  free (buf);
-			}
-#endif
-		    }
-
-		  d->__nextchar += strlen (d->__nextchar);
-
-		  d->optopt = pfound->val;
-		  return '?';
-		}
-	    }
-	  else if (pfound->has_arg == 1)
-	    {
-	      if (d->optind < argc)
-		d->optarg = argv[d->optind++];
-	      else
-		{
-		  if (print_errors)
-		    {
-#if defined _LIBC && defined USE_IN_LIBIO
-		      char *buf;
-
-		      if (__asprintf (&buf, _("\
-%s: option `%s' requires an argument\n"),
-				      argv[0], argv[d->optind - 1]) >= 0)
-			{
-			  _IO_flockfile (stderr);
-
-			  int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
-			  ((_IO_FILE *) stderr)->_flags2
-			    |= _IO_FLAGS2_NOTCANCEL;
-
-			  __fxprintf (NULL, "%s", buf);
-
-			  ((_IO_FILE *) stderr)->_flags2 = old_flags2;
-			  _IO_funlockfile (stderr);
-
-			  free (buf);
-			}
-#else
-		      fprintf (stderr,
-			       _("%s: option `%s' requires an argument\n"),
-			       argv[0], argv[d->optind - 1]);
-#endif
-		    }
-		  d->__nextchar += strlen (d->__nextchar);
-		  d->optopt = pfound->val;
-		  return optstring[0] == ':' ? ':' : '?';
-		}
-	    }
-	  d->__nextchar += strlen (d->__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[d->optind][1] == '-'
-	  || strchr (optstring, *d->__nextchar) == NULL)
-	{
-	  if (print_errors)
-	    {
-#if defined _LIBC && defined USE_IN_LIBIO
-	      char *buf;
-	      int n;
-#endif
-
-	      if (argv[d->optind][1] == '-')
-		{
-		  /* --option */
-#if defined _LIBC && defined USE_IN_LIBIO
-		  n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"),
-				  argv[0], d->__nextchar);
-#else
-		  fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
-			   argv[0], d->__nextchar);
-#endif
-		}
-	      else
-		{
-		  /* +option or -option */
-#if defined _LIBC && defined USE_IN_LIBIO
-		  n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"),
-				  argv[0], argv[d->optind][0], d->__nextchar);
-#else
-		  fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
-			   argv[0], argv[d->optind][0], d->__nextchar);
-#endif
-		}
-
-#if defined _LIBC && defined USE_IN_LIBIO
-	      if (n >= 0)
-		{
-		  _IO_flockfile (stderr);
-
-		  int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
-		  ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
-
-		  __fxprintf (NULL, "%s", buf);
-
-		  ((_IO_FILE *) stderr)->_flags2 = old_flags2;
-		  _IO_funlockfile (stderr);
-
-		  free (buf);
-		}
-#endif
-	    }
-	  d->__nextchar = (char *) "";
-	  d->optind++;
-	  d->optopt = 0;
-	  return '?';
-	}
-    }
-
-  /* Look at and handle the next short option-character.  */
-
-  {
-    char c = *d->__nextchar++;
-    char *temp = strchr (optstring, c);
-
-    /* Increment `optind' when we start to process its last character.  */
-    if (*d->__nextchar == '\0')
-      ++d->optind;
-
-    if (temp == NULL || c == ':')
-      {
-	if (print_errors)
-	  {
-#if defined _LIBC && defined USE_IN_LIBIO
-	      char *buf;
-	      int n;
-#endif
-
-	    if (d->__posixly_correct)
-	      {
-		/* 1003.2 specifies the format of this message.  */
-#if defined _LIBC && defined USE_IN_LIBIO
-		n = __asprintf (&buf, _("%s: illegal option -- %c\n"),
-				argv[0], c);
-#else
-		fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c);
-#endif
-	      }
-	    else
-	      {
-#if defined _LIBC && defined USE_IN_LIBIO
-		n = __asprintf (&buf, _("%s: invalid option -- %c\n"),
-				argv[0], c);
-#else
-		fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c);
-#endif
-	      }
-
-#if defined _LIBC && defined USE_IN_LIBIO
-	    if (n >= 0)
-	      {
-		_IO_flockfile (stderr);
-
-		int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
-		((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
-
-		__fxprintf (NULL, "%s", buf);
-
-		((_IO_FILE *) stderr)->_flags2 = old_flags2;
-		_IO_funlockfile (stderr);
-
-		free (buf);
-	      }
-#endif
-	  }
-	d->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 (*d->__nextchar != '\0')
-	  {
-	    d->optarg = d->__nextchar;
-	    /* If we end this ARGV-element by taking the rest as an arg,
-	       we must advance to the next element now.  */
-	    d->optind++;
-	  }
-	else if (d->optind == argc)
-	  {
-	    if (print_errors)
-	      {
-		/* 1003.2 specifies the format of this message.  */
-#if defined _LIBC && defined USE_IN_LIBIO
-		char *buf;
-
-		if (__asprintf (&buf,
-				_("%s: option requires an argument -- %c\n"),
-				argv[0], c) >= 0)
-		  {
-		    _IO_flockfile (stderr);
-
-		    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
-		    ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
-
-		    __fxprintf (NULL, "%s", buf);
-
-		    ((_IO_FILE *) stderr)->_flags2 = old_flags2;
-		    _IO_funlockfile (stderr);
-
-		    free (buf);
-		  }
-#else
-		fprintf (stderr, _("%s: option requires an argument -- %c\n"),
-			 argv[0], c);
-#endif
-	      }
-	    d->optopt = c;
-	    if (optstring[0] == ':')
-	      c = ':';
-	    else
-	      c = '?';
-	    return c;
-	  }
-	else
-	  /* We already incremented `d->optind' once;
-	     increment it again when taking next ARGV-elt as argument.  */
-	  d->optarg = argv[d->optind++];
-
-	/* optarg is now the argument, see if it's in the
-	   table of longopts.  */
-
-	for (d->__nextchar = nameend = d->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, d->__nextchar, nameend - d->__nextchar))
-	    {
-	      if ((unsigned int) (nameend - d->__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 (print_errors)
-	      {
-#if defined _LIBC && defined USE_IN_LIBIO
-		char *buf;
-
-		if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"),
-				argv[0], argv[d->optind]) >= 0)
-		  {
-		    _IO_flockfile (stderr);
-
-		    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
-		    ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
-
-		    __fxprintf (NULL, "%s", buf);
-
-		    ((_IO_FILE *) stderr)->_flags2 = old_flags2;
-		    _IO_funlockfile (stderr);
-
-		    free (buf);
-		  }
-#else
-		fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
-			 argv[0], argv[d->optind]);
-#endif
-	      }
-	    d->__nextchar += strlen (d->__nextchar);
-	    d->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)
-		  d->optarg = nameend + 1;
-		else
-		  {
-		    if (print_errors)
-		      {
-#if defined _LIBC && defined USE_IN_LIBIO
-			char *buf;
-
-			if (__asprintf (&buf, _("\
-%s: option `-W %s' doesn't allow an argument\n"),
-					argv[0], pfound->name) >= 0)
-			  {
-			    _IO_flockfile (stderr);
-
-			    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
-			    ((_IO_FILE *) stderr)->_flags2
-			      |= _IO_FLAGS2_NOTCANCEL;
-
-			    __fxprintf (NULL, "%s", buf);
-
-			    ((_IO_FILE *) stderr)->_flags2 = old_flags2;
-			    _IO_funlockfile (stderr);
-
-			    free (buf);
-			  }
-#else
-			fprintf (stderr, _("\
-%s: option `-W %s' doesn't allow an argument\n"),
-				 argv[0], pfound->name);
-#endif
-		      }
-
-		    d->__nextchar += strlen (d->__nextchar);
-		    return '?';
-		  }
-	      }
-	    else if (pfound->has_arg == 1)
-	      {
-		if (d->optind < argc)
-		  d->optarg = argv[d->optind++];
-		else
-		  {
-		    if (print_errors)
-		      {
-#if defined _LIBC && defined USE_IN_LIBIO
-			char *buf;
-
-			if (__asprintf (&buf, _("\
-%s: option `%s' requires an argument\n"),
-					argv[0], argv[d->optind - 1]) >= 0)
-			  {
-			    _IO_flockfile (stderr);
-
-			    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
-			    ((_IO_FILE *) stderr)->_flags2
-			      |= _IO_FLAGS2_NOTCANCEL;
-
-			    __fxprintf (NULL, "%s", buf);
-
-			    ((_IO_FILE *) stderr)->_flags2 = old_flags2;
-			    _IO_funlockfile (stderr);
-
-			    free (buf);
-			  }
-#else
-			fprintf (stderr,
-				 _("%s: option `%s' requires an argument\n"),
-				 argv[0], argv[d->optind - 1]);
-#endif
-		      }
-		    d->__nextchar += strlen (d->__nextchar);
-		    return optstring[0] == ':' ? ':' : '?';
-		  }
-	      }
-	    d->__nextchar += strlen (d->__nextchar);
-	    if (longind != NULL)
-	      *longind = option_index;
-	    if (pfound->flag)
-	      {
-		*(pfound->flag) = pfound->val;
-		return 0;
-	      }
-	    return pfound->val;
-	  }
-	  d->__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 (*d->__nextchar != '\0')
-	      {
-		d->optarg = d->__nextchar;
-		d->optind++;
-	      }
-	    else
-	      d->optarg = NULL;
-	    d->__nextchar = NULL;
-	  }
-	else
-	  {
-	    /* This is an option that requires an argument.  */
-	    if (*d->__nextchar != '\0')
-	      {
-		d->optarg = d->__nextchar;
-		/* If we end this ARGV-element by taking the rest as an arg,
-		   we must advance to the next element now.  */
-		d->optind++;
-	      }
-	    else if (d->optind == argc)
-	      {
-		if (print_errors)
-		  {
-		    /* 1003.2 specifies the format of this message.  */
-#if defined _LIBC && defined USE_IN_LIBIO
-		    char *buf;
-
-		    if (__asprintf (&buf, _("\
-%s: option requires an argument -- %c\n"),
-				    argv[0], c) >= 0)
-		      {
-			_IO_flockfile (stderr);
-
-			int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
-			((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
-
-			__fxprintf (NULL, "%s", buf);
-
-			((_IO_FILE *) stderr)->_flags2 = old_flags2;
-			_IO_funlockfile (stderr);
-
-			free (buf);
-		      }
-#else
-		    fprintf (stderr,
-			     _("%s: option requires an argument -- %c\n"),
-			     argv[0], c);
-#endif
-		  }
-		d->optopt = c;
-		if (optstring[0] == ':')
-		  c = ':';
-		else
-		  c = '?';
-	      }
-	    else
-	      /* We already incremented `optind' once;
-		 increment it again when taking next ARGV-elt as argument.  */
-	      d->optarg = argv[d->optind++];
-	    d->__nextchar = NULL;
-	  }
-      }
-    return c;
-  }
-}
-
-int
-_getopt_internal (int argc, char **argv, const char *optstring,
-		  const struct option *longopts, int *longind,
-		  int long_only, int posixly_correct)
-{
-  int result;
-
-  getopt_data.optind = optind;
-  getopt_data.opterr = opterr;
-
-  result = _getopt_internal_r (argc, argv, optstring, longopts, longind,
-			       long_only, posixly_correct, &getopt_data);
-
-  optind = getopt_data.optind;
-  optarg = getopt_data.optarg;
-  optopt = getopt_data.optopt;
-
-  return result;
-}
-
-/* glibc gets a LSB-compliant getopt.
-   Standalone applications get a POSIX-compliant getopt.  */
-#if _LIBC
-enum { POSIXLY_CORRECT = 0 };
-#else
-enum { POSIXLY_CORRECT = 1 };
-#endif
-
-int
-getopt (int argc, char *const *argv, const char *optstring)
-{
-  return _getopt_internal (argc, (char **) argv, optstring, NULL, NULL, 0,
-			   POSIXLY_CORRECT);
-}
-
-
-#ifdef TEST
-
-/* Compile with -DTEST to make an executable for use in testing
-   the above definition of `getopt'.  */
-
-int
-main (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/getopt1.c b/lib/getopt1.c
deleted file mode 100644
index 25d7926..0000000
--- a/lib/getopt1.c
+++ /dev/null
@@ -1,174 +0,0 @@
-/* getopt_long and getopt_long_only entry points for GNU getopt.
-   Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2004
-     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 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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#ifdef _LIBC
-# include <getopt.h>
-#else
-# include "getopt.h"
-#endif
-#include "getopt_int.h"
-
-#include <stdio.h>
-
-/* 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 (int argc, char *__getopt_argv_const *argv, const char *options,
-	     const struct option *long_options, int *opt_index)
-{
-  return _getopt_internal (argc, (char **) argv, options, long_options,
-			   opt_index, 0, 0);
-}
-
-int
-_getopt_long_r (int argc, char **argv, const char *options,
-		const struct option *long_options, int *opt_index,
-		struct _getopt_data *d)
-{
-  return _getopt_internal_r (argc, argv, options, long_options, opt_index,
-			     0, 0, d);
-}
-
-/* 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 (int argc, char *__getopt_argv_const *argv,
-		  const char *options,
-		  const struct option *long_options, int *opt_index)
-{
-  return _getopt_internal (argc, (char **) argv, options, long_options,
-			   opt_index, 1, 0);
-}
-
-int
-_getopt_long_only_r (int argc, char **argv, const char *options,
-		     const struct option *long_options, int *opt_index,
-		     struct _getopt_data *d)
-{
-  return _getopt_internal_r (argc, argv, options, long_options, opt_index,
-			     1, 0, d);
-}
-
-
-#ifdef TEST
-
-#include <stdio.h>
-
-int
-main (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/getopt_.h b/lib/getopt_.h
deleted file mode 100644
index 3c406e5..0000000
--- a/lib/getopt_.h
+++ /dev/null
@@ -1,225 +0,0 @@
-/* Declarations for getopt.
-   Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2005
-   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 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.  */
-
-#ifndef _GETOPT_H
-
-#ifndef __need_getopt
-# define _GETOPT_H 1
-#endif
-
-/* Standalone applications should #define __GETOPT_PREFIX to an
-   identifier that prefixes the external functions and variables
-   defined in this header.  When this happens, include the
-   headers that might declare getopt so that they will not cause
-   confusion if included after this file.  Then systematically rename
-   identifiers so that they do not collide with the system functions
-   and variables.  Renaming avoids problems with some compilers and
-   linkers.  */
-#if defined __GETOPT_PREFIX && !defined __need_getopt
-# include <stdlib.h>
-# include <stdio.h>
-# include <unistd.h>
-# undef __need_getopt
-# undef getopt
-# undef getopt_long
-# undef getopt_long_only
-# undef optarg
-# undef opterr
-# undef optind
-# undef optopt
-# define __GETOPT_CONCAT(x, y) x ## y
-# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y)
-# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y)
-# define getopt __GETOPT_ID (getopt)
-# define getopt_long __GETOPT_ID (getopt_long)
-# define getopt_long_only __GETOPT_ID (getopt_long_only)
-# define optarg __GETOPT_ID (optarg)
-# define opterr __GETOPT_ID (opterr)
-# define optind __GETOPT_ID (optind)
-# define optopt __GETOPT_ID (optopt)
-#endif
-
-/* Standalone applications get correct prototypes for getopt_long and
-   getopt_long_only; they declare "char **argv".  libc uses prototypes
-   with "char *const *argv" that are incorrect because getopt_long and
-   getopt_long_only can permute argv; this is required for backward
-   compatibility (e.g., for LSB 2.0.1).
-
-   This used to be `#if defined __GETOPT_PREFIX && !defined __need_getopt',
-   but it caused redefinition warnings if both unistd.h and getopt.h were
-   included, since unistd.h includes getopt.h having previously defined
-   __need_getopt.
-
-   The only place where __getopt_argv_const is used is in definitions
-   of getopt_long and getopt_long_only below, but these are visible
-   only if __need_getopt is not defined, so it is quite safe to rewrite
-   the conditional as follows:
-*/
-#if !defined __need_getopt
-# if defined __GETOPT_PREFIX
-#  define __getopt_argv_const /* empty */
-# else
-#  define __getopt_argv_const const
-# endif
-#endif
-
-/* If __GNU_LIBRARY__ is not already defined, either we are being used
-   standalone, or this is the first header included in the source file.
-   If we are being used with glibc, we need to include <features.h>, but
-   that does not exist if we are standalone.  So: if __GNU_LIBRARY__ is
-   not defined, include <ctype.h>, which will pull in <features.h> for us
-   if it's from glibc.  (Why ctype.h?  It's guaranteed to exist and it
-   doesn't flood the namespace with stuff the way some other headers do.)  */
-#if !defined __GNU_LIBRARY__
-# include <ctype.h>
-#endif
-
-#ifndef __THROW
-# ifndef __GNUC_PREREQ
-#  define __GNUC_PREREQ(maj, min) (0)
-# endif
-# if defined __cplusplus && __GNUC_PREREQ (2,8)
-#  define __THROW	throw ()
-# else
-#  define __THROW
-# endif
-#endif
-
-#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;
-
-#ifndef __need_getopt
-/* 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
-{
-  const char *name;
-  /* 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
-#endif	/* need getopt */
-
-
-/* Get definitions and prototypes for functions to process the
-   arguments in ARGV (ARGC of them, minus the program name) for
-   options given in OPTS.
-
-   Return the option character from OPTS just read.  Return -1 when
-   there are no more options.  For unrecognized options, or options
-   missing arguments, `optopt' is set to the option letter, and '?' is
-   returned.
-
-   The OPTS string is a list of characters which are recognized option
-   letters, optionally followed by colons, specifying that that letter
-   takes an argument, to be placed in `optarg'.
-
-   If a letter in OPTS is followed by two colons, its argument is
-   optional.  This behavior is specific to the GNU `getopt'.
-
-   The argument `--' causes premature termination of argument
-   scanning, explicitly telling `getopt' that there are no more
-   options.
-
-   If OPTS begins with `--', then non-option arguments are treated as
-   arguments to the option '\0'.  This behavior is specific to the GNU
-   `getopt'.  */
-
-extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
-       __THROW;
-
-#ifndef __need_getopt
-extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv,
-			const char *__shortopts,
-		        const struct option *__longopts, int *__longind)
-       __THROW;
-extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
-			     const char *__shortopts,
-		             const struct option *__longopts, int *__longind)
-       __THROW;
-
-#endif
-
-#ifdef	__cplusplus
-}
-#endif
-
-/* Make sure we later can get all the definitions and declarations.  */
-#undef __need_getopt
-
-#endif /* getopt.h */
diff --git a/lib/getopt_int.h b/lib/getopt_int.h
deleted file mode 100644
index 401579f..0000000
--- a/lib/getopt_int.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/* Internal declarations for getopt.
-   Copyright (C) 1989-1994,1996-1999,2001,2003,2004
-   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 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.  */
-
-#ifndef _GETOPT_INT_H
-#define _GETOPT_INT_H	1
-
-extern int _getopt_internal (int ___argc, char **___argv,
-			     const char *__shortopts,
-		             const struct option *__longopts, int *__longind,
-			     int __long_only, int __posixly_correct);
-
-
-/* Reentrant versions which can handle parsing multiple argument
-   vectors at the same time.  */
-
-/* Data type for reentrant functions.  */
-struct _getopt_data
-{
-  /* These have exactly the same meaning as the corresponding global
-     variables, except that they are used for the reentrant
-     versions of getopt.  */
-  int optind;
-  int opterr;
-  int optopt;
-  char *optarg;
-
-  /* Internal members.  */
-
-  /* True if the internal members have been initialized.  */
-  int __initialized;
-
-  /* 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.  */
-  char *__nextchar;
-
-  /* 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, or by calling getopt.
-
-     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.  */
-
-  enum
-    {
-      REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
-    } __ordering;
-
-  /* If the POSIXLY_CORRECT environment variable is set
-     or getopt was called.  */
-  int __posixly_correct;
-
-
-  /* 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.  */
-
-  int __first_nonopt;
-  int __last_nonopt;
-
-#if defined _LIBC && defined USE_NONOPTION_FLAGS
-  int __nonoption_flags_max_len;
-  int __nonoption_flags_len;
-# endif
-};
-
-/* The initializer is necessary to set OPTIND and OPTERR to their
-   default values and to clear the initialization flag.  */
-#define _GETOPT_DATA_INITIALIZER	{ 1, 1 }
-
-extern int _getopt_internal_r (int ___argc, char **___argv,
-			       const char *__shortopts,
-			       const struct option *__longopts, int *__longind,
-			       int __long_only, int __posixly_correct,
-			       struct _getopt_data *__data);
-
-extern int _getopt_long_r (int ___argc, char **___argv,
-			   const char *__shortopts,
-			   const struct option *__longopts, int *__longind,
-			   struct _getopt_data *__data);
-
-extern int _getopt_long_only_r (int ___argc, char **___argv,
-				const char *__shortopts,
-				const struct option *__longopts,
-				int *__longind,
-				struct _getopt_data *__data);
-
-#endif /* getopt_int.h */
diff --git a/lib/gettext.h b/lib/gettext.h
deleted file mode 100644
index 285cb31..0000000
--- a/lib/gettext.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Convenience header for conditional use of GNU <libintl.h>.
-   Copyright (C) 1995-1998, 2000-2002, 2004 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.  */
-
-#ifndef _LIBGETTEXT_H
-#define _LIBGETTEXT_H 1
-
-/* NLS can be disabled through the configure --disable-nls option.  */
-#if ENABLE_NLS
-
-/* Get declarations of GNU message catalog functions.  */
-# include <libintl.h>
-
-#else
-
-/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
-   chokes if dcgettext is defined as a macro.  So include it now, to make
-   later inclusions of <locale.h> a NOP.  We don't include <libintl.h>
-   as well because people using "gettext.h" will not include <libintl.h>,
-   and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
-   is OK.  */
-#if defined(__sun)
-# include <locale.h>
-#endif
-
-/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
-   <libintl.h>, which chokes if dcgettext is defined as a macro.  So include
-   it now, to make later inclusions of <libintl.h> a NOP.  */
-#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
-# include <cstdlib>
-# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H
-#  include <libintl.h>
-# endif
-#endif
-
-/* Disabled NLS.
-   The casts to 'const char *' serve the purpose of producing warnings
-   for invalid uses of the value returned from these functions.
-   On pre-ANSI systems without 'const', the config.h file is supposed to
-   contain "#define const".  */
-# define gettext(Msgid) ((const char *) (Msgid))
-# define dgettext(Domainname, Msgid) ((const char *) (Msgid))
-# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid))
-# define ngettext(Msgid1, Msgid2, N) \
-    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
-# define dngettext(Domainname, Msgid1, Msgid2, N) \
-    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
-# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
-    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
-# define textdomain(Domainname) ((const char *) (Domainname))
-# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
-# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset))
-
-#endif
-
-/* A pseudo function call that serves as a marker for the automated
-   extraction of messages, but does not call gettext().  The run-time
-   translation is done at a different place in the code.
-   The argument, String, should be a literal string.  Concatenated strings
-   and other string expressions won't work.
-   The macro's expansion is not parenthesized, so that it is suitable as
-   initializer for static 'char[]' or 'const char[]' variables.  */
-#define gettext_noop(String) String
-
-#endif /* _LIBGETTEXT_H */
diff --git a/lib/gnulib.mk b/lib/gnulib.mk
deleted file mode 100644
index 3e7b28d..0000000
--- a/lib/gnulib.mk
+++ /dev/null
@@ -1,78 +0,0 @@
-# This file is generated automatically by "bootstrap".
-lib_SOURCES += argmatch.h argmatch.c
-
-lib_SOURCES += basename.c stripslash.c
-
-
-lib_SOURCES += exit.h
-
-
-
-BUILT_SOURCES += $(GETOPT_H)
-EXTRA_DIST += getopt_.h getopt_int.h
-
-# We need the following in order to create <getopt.h> when the system
-# doesn't have one that works with the given compiler.
-getopt.h: getopt_.h
-	cp $(srcdir)/getopt_.h $@-t
-	mv $@-t $@
-MOSTLYCLEANFILES += getopt.h getopt.h-t
-
-# This is for those projects which use "gettextize --intl" to put a source-code
-# copy of libintl into their package. In such projects, every Makefile.am needs
-# -I$(top_builddir)/intl, so that <libintl.h> can be found in this directory.
-# For the Makefile.ams in other directories it is the maintainer's
-# responsibility; for the one from gnulib we do it here.
-# This option has no effect when the user disables NLS (because then the intl
-# directory contains no libintl.h file) or when the project does not use
-# "gettextize --intl".
-# (commented out by bootstrap) AM_CPPFLAGS += -I$(top_builddir)/intl
-
-lib_SOURCES += gettext.h
-
-
-
-
-
-lib_SOURCES += mbswidth.h mbswidth.c
-
-
-
-
-BUILT_SOURCES += $(STDBOOL_H)
-EXTRA_DIST += stdbool_.h
-
-# We need the following in order to create <stdbool.h> when the system
-# doesn't have one that works.
-stdbool.h: stdbool_.h
-	sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool_.h > $@-t
-	mv $@-t $@
-MOSTLYCLEANFILES += stdbool.h stdbool.h-t
-
-
-lib_SOURCES += stpcpy.h
-
-
-
-
-
-
-
-
-BUILT_SOURCES += $(UNISTD_H)
-
-# We need the following in order to create an empty placeholder for
-# <unistd.h> when the system doesn't have one.
-unistd.h:
-	echo '/* Empty placeholder for $@.  */' >$@
-MOSTLYCLEANFILES += unistd.h
-
-
-
-lib_SOURCES += verify.h
-
-
-lib_SOURCES += xalloc-die.c
-
-lib_SOURCES += xstrndup.h xstrndup.c
-
diff --git a/lib/hard-locale.c b/lib/hard-locale.c
deleted file mode 100644
index 98530fc..0000000
--- a/lib/hard-locale.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/* hard-locale.c -- Determine whether a locale is hard.
-
-   Copyright (C) 1997, 1998, 1999, 2002, 2003, 2004 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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "hard-locale.h"
-
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "strdup.h"
-
-#ifdef __GLIBC__
-# define GLIBC_VERSION __GLIBC__
-#else
-# define GLIBC_VERSION 0
-#endif
-
-/* Return true if the current CATEGORY locale is hard, i.e. if you
-   can't get away with assuming traditional C or POSIX behavior.  */
-bool
-hard_locale (int category)
-{
-  bool hard = true;
-  char const *p = setlocale (category, NULL);
-
-  if (p)
-    {
-      if (2 <= GLIBC_VERSION)
-	{
-	  if (strcmp (p, "C") == 0 || strcmp (p, "POSIX") == 0)
-	    hard = false;
-	}
-      else
-	{
-	  char *locale = strdup (p);
-	  if (locale)
-	    {
-	      /* Temporarily set the locale to the "C" and "POSIX" locales
-		 to find their names, so that we can determine whether one
-		 or the other is the caller's locale.  */
-	      if (((p = setlocale (category, "C"))
-		   && strcmp (p, locale) == 0)
-		  || ((p = setlocale (category, "POSIX"))
-		      && strcmp (p, locale) == 0))
-		hard = false;
-
-	      /* Restore the caller's locale.  */
-	      setlocale (category, locale);
-	      free (locale);
-	    }
-	}
-    }
-
-  return hard;
-}
diff --git a/lib/hard-locale.h b/lib/hard-locale.h
deleted file mode 100644
index c5cedc0..0000000
--- a/lib/hard-locale.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Determine whether a locale is hard.
-
-   Copyright (C) 1999, 2003, 2004 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.  */
-
-#ifndef HARD_LOCALE_H_
-# define HARD_LOCALE_H_ 1
-
-# include <stdbool.h>
-
-bool hard_locale (int);
-
-#endif /* HARD_LOCALE_H_ */
diff --git a/lib/hash.c b/lib/hash.c
deleted file mode 100644
index f85bd51..0000000
--- a/lib/hash.c
+++ /dev/null
@@ -1,1050 +0,0 @@
-/* hash - hashing table processing.
-
-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free
-   Software Foundation, Inc.
-
-   Written by Jim Meyering, 1992.
-
-   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.  */
-
-/* A generic hash table package.  */
-
-/* Define USE_OBSTACK to 1 if you want the allocator to use obstacks instead
-   of malloc.  If you change USE_OBSTACK, you have to recompile!  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "hash.h"
-#include "xalloc.h"
-
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#if USE_OBSTACK
-# include "obstack.h"
-# ifndef obstack_chunk_alloc
-#  define obstack_chunk_alloc malloc
-# endif
-# ifndef obstack_chunk_free
-#  define obstack_chunk_free free
-# endif
-#endif
-
-#ifndef SIZE_MAX
-# define SIZE_MAX ((size_t) -1)
-#endif
-
-struct hash_table
-  {
-    /* The array of buckets starts at BUCKET and extends to BUCKET_LIMIT-1,
-       for a possibility of N_BUCKETS.  Among those, N_BUCKETS_USED buckets
-       are not empty, there are N_ENTRIES active entries in the table.  */
-    struct hash_entry *bucket;
-    struct hash_entry const *bucket_limit;
-    size_t n_buckets;
-    size_t n_buckets_used;
-    size_t n_entries;
-
-    /* Tuning arguments, kept in a physicaly separate structure.  */
-    const Hash_tuning *tuning;
-
-    /* Three functions are given to `hash_initialize', see the documentation
-       block for this function.  In a word, HASHER randomizes a user entry
-       into a number up from 0 up to some maximum minus 1; COMPARATOR returns
-       true if two user entries compare equally; and DATA_FREER is the cleanup
-       function for a user entry.  */
-    Hash_hasher hasher;
-    Hash_comparator comparator;
-    Hash_data_freer data_freer;
-
-    /* A linked list of freed struct hash_entry structs.  */
-    struct hash_entry *free_entry_list;
-
-#if USE_OBSTACK
-    /* Whenever obstacks are used, it is possible to allocate all overflowed
-       entries into a single stack, so they all can be freed in a single
-       operation.  It is not clear if the speedup is worth the trouble.  */
-    struct obstack entry_stack;
-#endif
-  };
-
-/* A hash table contains many internal entries, each holding a pointer to
-   some user provided data (also called a user entry).  An entry indistinctly
-   refers to both the internal entry and its associated user entry.  A user
-   entry contents may be hashed by a randomization function (the hashing
-   function, or just `hasher' for short) into a number (or `slot') between 0
-   and the current table size.  At each slot position in the hash table,
-   starts a linked chain of entries for which the user data all hash to this
-   slot.  A bucket is the collection of all entries hashing to the same slot.
-
-   A good `hasher' function will distribute entries rather evenly in buckets.
-   In the ideal case, the length of each bucket is roughly the number of
-   entries divided by the table size.  Finding the slot for a data is usually
-   done in constant time by the `hasher', and the later finding of a precise
-   entry is linear in time with the size of the bucket.  Consequently, a
-   larger hash table size (that is, a larger number of buckets) is prone to
-   yielding shorter chains, *given* the `hasher' function behaves properly.
-
-   Long buckets slow down the lookup algorithm.  One might use big hash table
-   sizes in hope to reduce the average length of buckets, but this might
-   become inordinate, as unused slots in the hash table take some space.  The
-   best bet is to make sure you are using a good `hasher' function (beware
-   that those are not that easy to write! :-), and to use a table size
-   larger than the actual number of entries.  */
-
-/* If an insertion makes the ratio of nonempty buckets to table size larger
-   than the growth threshold (a number between 0.0 and 1.0), then increase
-   the table size by multiplying by the growth factor (a number greater than
-   1.0).  The growth threshold defaults to 0.8, and the growth factor
-   defaults to 1.414, meaning that the table will have doubled its size
-   every second time 80% of the buckets get used.  */
-#define DEFAULT_GROWTH_THRESHOLD 0.8
-#define DEFAULT_GROWTH_FACTOR 1.414
-
-/* If a deletion empties a bucket and causes the ratio of used buckets to
-   table size to become smaller than the shrink threshold (a number between
-   0.0 and 1.0), then shrink the table by multiplying by the shrink factor (a
-   number greater than the shrink threshold but smaller than 1.0).  The shrink
-   threshold and factor default to 0.0 and 1.0, meaning that the table never
-   shrinks.  */
-#define DEFAULT_SHRINK_THRESHOLD 0.0
-#define DEFAULT_SHRINK_FACTOR 1.0
-
-/* Use this to initialize or reset a TUNING structure to
-   some sensible values. */
-static const Hash_tuning default_tuning =
-  {
-    DEFAULT_SHRINK_THRESHOLD,
-    DEFAULT_SHRINK_FACTOR,
-    DEFAULT_GROWTH_THRESHOLD,
-    DEFAULT_GROWTH_FACTOR,
-    false
-  };
-
-/* Information and lookup.  */
-
-/* The following few functions provide information about the overall hash
-   table organization: the number of entries, number of buckets and maximum
-   length of buckets.  */
-
-/* Return the number of buckets in the hash table.  The table size, the total
-   number of buckets (used plus unused), or the maximum number of slots, are
-   the same quantity.  */
-
-size_t
-hash_get_n_buckets (const Hash_table *table)
-{
-  return table->n_buckets;
-}
-
-/* Return the number of slots in use (non-empty buckets).  */
-
-size_t
-hash_get_n_buckets_used (const Hash_table *table)
-{
-  return table->n_buckets_used;
-}
-
-/* Return the number of active entries.  */
-
-size_t
-hash_get_n_entries (const Hash_table *table)
-{
-  return table->n_entries;
-}
-
-/* Return the length of the longest chain (bucket).  */
-
-size_t
-hash_get_max_bucket_length (const Hash_table *table)
-{
-  struct hash_entry const *bucket;
-  size_t max_bucket_length = 0;
-
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    {
-      if (bucket->data)
-	{
-	  struct hash_entry const *cursor = bucket;
-	  size_t bucket_length = 1;
-
-	  while (cursor = cursor->next, cursor)
-	    bucket_length++;
-
-	  if (bucket_length > max_bucket_length)
-	    max_bucket_length = bucket_length;
-	}
-    }
-
-  return max_bucket_length;
-}
-
-/* Do a mild validation of a hash table, by traversing it and checking two
-   statistics.  */
-
-bool
-hash_table_ok (const Hash_table *table)
-{
-  struct hash_entry const *bucket;
-  size_t n_buckets_used = 0;
-  size_t n_entries = 0;
-
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    {
-      if (bucket->data)
-	{
-	  struct hash_entry const *cursor = bucket;
-
-	  /* Count bucket head.  */
-	  n_buckets_used++;
-	  n_entries++;
-
-	  /* Count bucket overflow.  */
-	  while (cursor = cursor->next, cursor)
-	    n_entries++;
-	}
-    }
-
-  if (n_buckets_used == table->n_buckets_used && n_entries == table->n_entries)
-    return true;
-
-  return false;
-}
-
-void
-hash_print_statistics (const Hash_table *table, FILE *stream)
-{
-  size_t n_entries = hash_get_n_entries (table);
-  size_t n_buckets = hash_get_n_buckets (table);
-  size_t n_buckets_used = hash_get_n_buckets_used (table);
-  size_t max_bucket_length = hash_get_max_bucket_length (table);
-
-  fprintf (stream, "# entries:         %lu\n", (unsigned long int) n_entries);
-  fprintf (stream, "# buckets:         %lu\n", (unsigned long int) n_buckets);
-  fprintf (stream, "# buckets used:    %lu (%.2f%%)\n",
-	   (unsigned long int) n_buckets_used,
-	   (100.0 * n_buckets_used) / n_buckets);
-  fprintf (stream, "max bucket length: %lu\n",
-	   (unsigned long int) max_bucket_length);
-}
-
-/* If ENTRY matches an entry already in the hash table, return the
-   entry from the table.  Otherwise, return NULL.  */
-
-void *
-hash_lookup (const Hash_table *table, const void *entry)
-{
-  struct hash_entry const *bucket
-    = table->bucket + table->hasher (entry, table->n_buckets);
-  struct hash_entry const *cursor;
-
-  if (! (bucket < table->bucket_limit))
-    abort ();
-
-  if (bucket->data == NULL)
-    return NULL;
-
-  for (cursor = bucket; cursor; cursor = cursor->next)
-    if (table->comparator (entry, cursor->data))
-      return cursor->data;
-
-  return NULL;
-}
-
-/* Walking.  */
-
-/* The functions in this page traverse the hash table and process the
-   contained entries.  For the traversal to work properly, the hash table
-   should not be resized nor modified while any particular entry is being
-   processed.  In particular, entries should not be added or removed.  */
-
-/* Return the first data in the table, or NULL if the table is empty.  */
-
-void *
-hash_get_first (const Hash_table *table)
-{
-  struct hash_entry const *bucket;
-
-  if (table->n_entries == 0)
-    return NULL;
-
-  for (bucket = table->bucket; ; bucket++)
-    if (! (bucket < table->bucket_limit))
-      abort ();
-    else if (bucket->data)
-      return bucket->data;
-}
-
-/* Return the user data for the entry following ENTRY, where ENTRY has been
-   returned by a previous call to either `hash_get_first' or `hash_get_next'.
-   Return NULL if there are no more entries.  */
-
-void *
-hash_get_next (const Hash_table *table, const void *entry)
-{
-  struct hash_entry const *bucket
-    = table->bucket + table->hasher (entry, table->n_buckets);
-  struct hash_entry const *cursor;
-
-  if (! (bucket < table->bucket_limit))
-    abort ();
-
-  /* Find next entry in the same bucket.  */
-  for (cursor = bucket; cursor; cursor = cursor->next)
-    if (cursor->data == entry && cursor->next)
-      return cursor->next->data;
-
-  /* Find first entry in any subsequent bucket.  */
-  while (++bucket < table->bucket_limit)
-    if (bucket->data)
-      return bucket->data;
-
-  /* None found.  */
-  return NULL;
-}
-
-/* Fill BUFFER with pointers to active user entries in the hash table, then
-   return the number of pointers copied.  Do not copy more than BUFFER_SIZE
-   pointers.  */
-
-size_t
-hash_get_entries (const Hash_table *table, void **buffer,
-		  size_t buffer_size)
-{
-  size_t counter = 0;
-  struct hash_entry const *bucket;
-  struct hash_entry const *cursor;
-
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    {
-      if (bucket->data)
-	{
-	  for (cursor = bucket; cursor; cursor = cursor->next)
-	    {
-	      if (counter >= buffer_size)
-		return counter;
-	      buffer[counter++] = cursor->data;
-	    }
-	}
-    }
-
-  return counter;
-}
-
-/* Call a PROCESSOR function for each entry of a hash table, and return the
-   number of entries for which the processor function returned success.  A
-   pointer to some PROCESSOR_DATA which will be made available to each call to
-   the processor function.  The PROCESSOR accepts two arguments: the first is
-   the user entry being walked into, the second is the value of PROCESSOR_DATA
-   as received.  The walking continue for as long as the PROCESSOR function
-   returns nonzero.  When it returns zero, the walking is interrupted.  */
-
-size_t
-hash_do_for_each (const Hash_table *table, Hash_processor processor,
-		  void *processor_data)
-{
-  size_t counter = 0;
-  struct hash_entry const *bucket;
-  struct hash_entry const *cursor;
-
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    {
-      if (bucket->data)
-	{
-	  for (cursor = bucket; cursor; cursor = cursor->next)
-	    {
-	      if (!(*processor) (cursor->data, processor_data))
-		return counter;
-	      counter++;
-	    }
-	}
-    }
-
-  return counter;
-}
-
-/* Allocation and clean-up.  */
-
-/* Return a hash index for a NUL-terminated STRING between 0 and N_BUCKETS-1.
-   This is a convenience routine for constructing other hashing functions.  */
-
-#if USE_DIFF_HASH
-
-/* About hashings, Paul Eggert writes to me (FP), on 1994-01-01: "Please see
-   B. J. McKenzie, R. Harries & T. Bell, Selecting a hashing algorithm,
-   Software--practice & experience 20, 2 (Feb 1990), 209-224.  Good hash
-   algorithms tend to be domain-specific, so what's good for [diffutils'] io.c
-   may not be good for your application."  */
-
-size_t
-hash_string (const char *string, size_t n_buckets)
-{
-# define ROTATE_LEFT(Value, Shift) \
-  ((Value) << (Shift) | (Value) >> ((sizeof (size_t) * CHAR_BIT) - (Shift)))
-# define HASH_ONE_CHAR(Value, Byte) \
-  ((Byte) + ROTATE_LEFT (Value, 7))
-
-  size_t value = 0;
-  unsigned char ch;
-
-  for (; (ch = *string); string++)
-    value = HASH_ONE_CHAR (value, ch);
-  return value % n_buckets;
-
-# undef ROTATE_LEFT
-# undef HASH_ONE_CHAR
-}
-
-#else /* not USE_DIFF_HASH */
-
-/* This one comes from `recode', and performs a bit better than the above as
-   per a few experiments.  It is inspired from a hashing routine found in the
-   very old Cyber `snoop', itself written in typical Greg Mansfield style.
-   (By the way, what happened to this excellent man?  Is he still alive?)  */
-
-size_t
-hash_string (const char *string, size_t n_buckets)
-{
-  size_t value = 0;
-  unsigned char ch;
-
-  for (; (ch = *string); string++)
-    value = (value * 31 + ch) % n_buckets;
-  return value;
-}
-
-#endif /* not USE_DIFF_HASH */
-
-/* Return true if CANDIDATE is a prime number.  CANDIDATE should be an odd
-   number at least equal to 11.  */
-
-static bool
-is_prime (size_t candidate)
-{
-  size_t divisor = 3;
-  size_t square = divisor * divisor;
-
-  while (square < candidate && (candidate % divisor))
-    {
-      divisor++;
-      square += 4 * divisor;
-      divisor++;
-    }
-
-  return (candidate % divisor ? true : false);
-}
-
-/* Round a given CANDIDATE number up to the nearest prime, and return that
-   prime.  Primes lower than 10 are merely skipped.  */
-
-static size_t
-next_prime (size_t candidate)
-{
-  /* Skip small primes.  */
-  if (candidate < 10)
-    candidate = 10;
-
-  /* Make it definitely odd.  */
-  candidate |= 1;
-
-  while (!is_prime (candidate))
-    candidate += 2;
-
-  return candidate;
-}
-
-void
-hash_reset_tuning (Hash_tuning *tuning)
-{
-  *tuning = default_tuning;
-}
-
-/* For the given hash TABLE, check the user supplied tuning structure for
-   reasonable values, and return true if there is no gross error with it.
-   Otherwise, definitively reset the TUNING field to some acceptable default
-   in the hash table (that is, the user loses the right of further modifying
-   tuning arguments), and return false.  */
-
-static bool
-check_tuning (Hash_table *table)
-{
-  const Hash_tuning *tuning = table->tuning;
-
-  /* Be a bit stricter than mathematics would require, so that
-     rounding errors in size calculations do not cause allocations to
-     fail to grow or shrink as they should.  The smallest allocation
-     is 11 (due to next_prime's algorithm), so an epsilon of 0.1
-     should be good enough.  */
-  float epsilon = 0.1f;
-
-  if (epsilon < tuning->growth_threshold
-      && tuning->growth_threshold < 1 - epsilon
-      && 1 + epsilon < tuning->growth_factor
-      && 0 <= tuning->shrink_threshold
-      && tuning->shrink_threshold + epsilon < tuning->shrink_factor
-      && tuning->shrink_factor <= 1
-      && tuning->shrink_threshold + epsilon < tuning->growth_threshold)
-    return true;
-
-  table->tuning = &default_tuning;
-  return false;
-}
-
-/* Allocate and return a new hash table, or NULL upon failure.  The initial
-   number of buckets is automatically selected so as to _guarantee_ that you
-   may insert at least CANDIDATE different user entries before any growth of
-   the hash table size occurs.  So, if have a reasonably tight a-priori upper
-   bound on the number of entries you intend to insert in the hash table, you
-   may save some table memory and insertion time, by specifying it here.  If
-   the IS_N_BUCKETS field of the TUNING structure is true, the CANDIDATE
-   argument has its meaning changed to the wanted number of buckets.
-
-   TUNING points to a structure of user-supplied values, in case some fine
-   tuning is wanted over the default behavior of the hasher.  If TUNING is
-   NULL, the default tuning parameters are used instead.
-
-   The user-supplied HASHER function should be provided.  It accepts two
-   arguments ENTRY and TABLE_SIZE.  It computes, by hashing ENTRY contents, a
-   slot number for that entry which should be in the range 0..TABLE_SIZE-1.
-   This slot number is then returned.
-
-   The user-supplied COMPARATOR function should be provided.  It accepts two
-   arguments pointing to user data, it then returns true for a pair of entries
-   that compare equal, or false otherwise.  This function is internally called
-   on entries which are already known to hash to the same bucket index.
-
-   The user-supplied DATA_FREER function, when not NULL, may be later called
-   with the user data as an argument, just before the entry containing the
-   data gets freed.  This happens from within `hash_free' or `hash_clear'.
-   You should specify this function only if you want these functions to free
-   all of your `data' data.  This is typically the case when your data is
-   simply an auxiliary struct that you have malloc'd to aggregate several
-   values.  */
-
-Hash_table *
-hash_initialize (size_t candidate, const Hash_tuning *tuning,
-		 Hash_hasher hasher, Hash_comparator comparator,
-		 Hash_data_freer data_freer)
-{
-  Hash_table *table;
-
-  if (hasher == NULL || comparator == NULL)
-    return NULL;
-
-  table = malloc (sizeof *table);
-  if (table == NULL)
-    return NULL;
-
-  if (!tuning)
-    tuning = &default_tuning;
-  table->tuning = tuning;
-  if (!check_tuning (table))
-    {
-      /* Fail if the tuning options are invalid.  This is the only occasion
-	 when the user gets some feedback about it.  Once the table is created,
-	 if the user provides invalid tuning options, we silently revert to
-	 using the defaults, and ignore further request to change the tuning
-	 options.  */
-      goto fail;
-    }
-
-  if (!tuning->is_n_buckets)
-    {
-      float new_candidate = candidate / tuning->growth_threshold;
-      if (SIZE_MAX <= new_candidate)
-	goto fail;
-      candidate = new_candidate;
-    }
-
-  if (xalloc_oversized (candidate, sizeof *table->bucket))
-    goto fail;
-  table->n_buckets = next_prime (candidate);
-  if (xalloc_oversized (table->n_buckets, sizeof *table->bucket))
-    goto fail;
-
-  table->bucket = calloc (table->n_buckets, sizeof *table->bucket);
-  table->bucket_limit = table->bucket + table->n_buckets;
-  table->n_buckets_used = 0;
-  table->n_entries = 0;
-
-  table->hasher = hasher;
-  table->comparator = comparator;
-  table->data_freer = data_freer;
-
-  table->free_entry_list = NULL;
-#if USE_OBSTACK
-  obstack_init (&table->entry_stack);
-#endif
-  return table;
-
- fail:
-  free (table);
-  return NULL;
-}
-
-/* Make all buckets empty, placing any chained entries on the free list.
-   Apply the user-specified function data_freer (if any) to the datas of any
-   affected entries.  */
-
-void
-hash_clear (Hash_table *table)
-{
-  struct hash_entry *bucket;
-
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    {
-      if (bucket->data)
-	{
-	  struct hash_entry *cursor;
-	  struct hash_entry *next;
-
-	  /* Free the bucket overflow.  */
-	  for (cursor = bucket->next; cursor; cursor = next)
-	    {
-	      if (table->data_freer)
-		(*table->data_freer) (cursor->data);
-	      cursor->data = NULL;
-
-	      next = cursor->next;
-	      /* Relinking is done one entry at a time, as it is to be expected
-		 that overflows are either rare or short.  */
-	      cursor->next = table->free_entry_list;
-	      table->free_entry_list = cursor;
-	    }
-
-	  /* Free the bucket head.  */
-	  if (table->data_freer)
-	    (*table->data_freer) (bucket->data);
-	  bucket->data = NULL;
-	  bucket->next = NULL;
-	}
-    }
-
-  table->n_buckets_used = 0;
-  table->n_entries = 0;
-}
-
-/* Reclaim all storage associated with a hash table.  If a data_freer
-   function has been supplied by the user when the hash table was created,
-   this function applies it to the data of each entry before freeing that
-   entry.  */
-
-void
-hash_free (Hash_table *table)
-{
-  struct hash_entry *bucket;
-  struct hash_entry *cursor;
-  struct hash_entry *next;
-
-  /* Call the user data_freer function.  */
-  if (table->data_freer && table->n_entries)
-    {
-      for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-	{
-	  if (bucket->data)
-	    {
-	      for (cursor = bucket; cursor; cursor = cursor->next)
-		{
-		  (*table->data_freer) (cursor->data);
-		}
-	    }
-	}
-    }
-
-#if USE_OBSTACK
-
-  obstack_free (&table->entry_stack, NULL);
-
-#else
-
-  /* Free all bucket overflowed entries.  */
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    {
-      for (cursor = bucket->next; cursor; cursor = next)
-	{
-	  next = cursor->next;
-	  free (cursor);
-	}
-    }
-
-  /* Also reclaim the internal list of previously freed entries.  */
-  for (cursor = table->free_entry_list; cursor; cursor = next)
-    {
-      next = cursor->next;
-      free (cursor);
-    }
-
-#endif
-
-  /* Free the remainder of the hash table structure.  */
-  free (table->bucket);
-  free (table);
-}
-
-/* Insertion and deletion.  */
-
-/* Get a new hash entry for a bucket overflow, possibly by reclying a
-   previously freed one.  If this is not possible, allocate a new one.  */
-
-static struct hash_entry *
-allocate_entry (Hash_table *table)
-{
-  struct hash_entry *new;
-
-  if (table->free_entry_list)
-    {
-      new = table->free_entry_list;
-      table->free_entry_list = new->next;
-    }
-  else
-    {
-#if USE_OBSTACK
-      new = obstack_alloc (&table->entry_stack, sizeof *new);
-#else
-      new = malloc (sizeof *new);
-#endif
-    }
-
-  return new;
-}
-
-/* Free a hash entry which was part of some bucket overflow,
-   saving it for later recycling.  */
-
-static void
-free_entry (Hash_table *table, struct hash_entry *entry)
-{
-  entry->data = NULL;
-  entry->next = table->free_entry_list;
-  table->free_entry_list = entry;
-}
-
-/* This private function is used to help with insertion and deletion.  When
-   ENTRY matches an entry in the table, return a pointer to the corresponding
-   user data and set *BUCKET_HEAD to the head of the selected bucket.
-   Otherwise, return NULL.  When DELETE is true and ENTRY matches an entry in
-   the table, unlink the matching entry.  */
-
-static void *
-hash_find_entry (Hash_table *table, const void *entry,
-		 struct hash_entry **bucket_head, bool delete)
-{
-  struct hash_entry *bucket
-    = table->bucket + table->hasher (entry, table->n_buckets);
-  struct hash_entry *cursor;
-
-  if (! (bucket < table->bucket_limit))
-    abort ();
-
-  *bucket_head = bucket;
-
-  /* Test for empty bucket.  */
-  if (bucket->data == NULL)
-    return NULL;
-
-  /* See if the entry is the first in the bucket.  */
-  if ((*table->comparator) (entry, bucket->data))
-    {
-      void *data = bucket->data;
-
-      if (delete)
-	{
-	  if (bucket->next)
-	    {
-	      struct hash_entry *next = bucket->next;
-
-	      /* Bump the first overflow entry into the bucket head, then save
-		 the previous first overflow entry for later recycling.  */
-	      *bucket = *next;
-	      free_entry (table, next);
-	    }
-	  else
-	    {
-	      bucket->data = NULL;
-	    }
-	}
-
-      return data;
-    }
-
-  /* Scan the bucket overflow.  */
-  for (cursor = bucket; cursor->next; cursor = cursor->next)
-    {
-      if ((*table->comparator) (entry, cursor->next->data))
-	{
-	  void *data = cursor->next->data;
-
-	  if (delete)
-	    {
-	      struct hash_entry *next = cursor->next;
-
-	      /* Unlink the entry to delete, then save the freed entry for later
-		 recycling.  */
-	      cursor->next = next->next;
-	      free_entry (table, next);
-	    }
-
-	  return data;
-	}
-    }
-
-  /* No entry found.  */
-  return NULL;
-}
-
-/* For an already existing hash table, change the number of buckets through
-   specifying CANDIDATE.  The contents of the hash table are preserved.  The
-   new number of buckets is automatically selected so as to _guarantee_ that
-   the table may receive at least CANDIDATE different user entries, including
-   those already in the table, before any other growth of the hash table size
-   occurs.  If TUNING->IS_N_BUCKETS is true, then CANDIDATE specifies the
-   exact number of buckets desired.  */
-
-bool
-hash_rehash (Hash_table *table, size_t candidate)
-{
-  Hash_table *new_table;
-  struct hash_entry *bucket;
-  struct hash_entry *cursor;
-  struct hash_entry *next;
-
-  new_table = hash_initialize (candidate, table->tuning, table->hasher,
-			       table->comparator, table->data_freer);
-  if (new_table == NULL)
-    return false;
-
-  /* Merely reuse the extra old space into the new table.  */
-#if USE_OBSTACK
-  obstack_free (&new_table->entry_stack, NULL);
-  new_table->entry_stack = table->entry_stack;
-#endif
-  new_table->free_entry_list = table->free_entry_list;
-
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    if (bucket->data)
-      for (cursor = bucket; cursor; cursor = next)
-	{
-	  void *data = cursor->data;
-	  struct hash_entry *new_bucket
-	    = (new_table->bucket
-	       + new_table->hasher (data, new_table->n_buckets));
-
-	  if (! (new_bucket < new_table->bucket_limit))
-	    abort ();
-
-	  next = cursor->next;
-
-	  if (new_bucket->data)
-	    {
-	      if (cursor == bucket)
-		{
-		  /* Allocate or recycle an entry, when moving from a bucket
-		     header into a bucket overflow.  */
-		  struct hash_entry *new_entry = allocate_entry (new_table);
-
-		  if (new_entry == NULL)
-		    return false;
-
-		  new_entry->data = data;
-		  new_entry->next = new_bucket->next;
-		  new_bucket->next = new_entry;
-		}
-	      else
-		{
-		  /* Merely relink an existing entry, when moving from a
-		     bucket overflow into a bucket overflow.  */
-		  cursor->next = new_bucket->next;
-		  new_bucket->next = cursor;
-		}
-	    }
-	  else
-	    {
-	      /* Free an existing entry, when moving from a bucket
-		 overflow into a bucket header.  Also take care of the
-		 simple case of moving from a bucket header into a bucket
-		 header.  */
-	      new_bucket->data = data;
-	      new_table->n_buckets_used++;
-	      if (cursor != bucket)
-		free_entry (new_table, cursor);
-	    }
-	}
-
-  free (table->bucket);
-  table->bucket = new_table->bucket;
-  table->bucket_limit = new_table->bucket_limit;
-  table->n_buckets = new_table->n_buckets;
-  table->n_buckets_used = new_table->n_buckets_used;
-  table->free_entry_list = new_table->free_entry_list;
-  /* table->n_entries already holds its value.  */
-#if USE_OBSTACK
-  table->entry_stack = new_table->entry_stack;
-#endif
-  free (new_table);
-
-  return true;
-}
-
-/* If ENTRY matches an entry already in the hash table, return the pointer
-   to the entry from the table.  Otherwise, insert ENTRY and return ENTRY.
-   Return NULL if the storage required for insertion cannot be allocated.  */
-
-void *
-hash_insert (Hash_table *table, const void *entry)
-{
-  void *data;
-  struct hash_entry *bucket;
-
-  /* The caller cannot insert a NULL entry.  */
-  if (! entry)
-    abort ();
-
-  /* If there's a matching entry already in the table, return that.  */
-  if ((data = hash_find_entry (table, entry, &bucket, false)) != NULL)
-    return data;
-
-  /* ENTRY is not matched, it should be inserted.  */
-
-  if (bucket->data)
-    {
-      struct hash_entry *new_entry = allocate_entry (table);
-
-      if (new_entry == NULL)
-	return NULL;
-
-      /* Add ENTRY in the overflow of the bucket.  */
-
-      new_entry->data = (void *) entry;
-      new_entry->next = bucket->next;
-      bucket->next = new_entry;
-      table->n_entries++;
-      return (void *) entry;
-    }
-
-  /* Add ENTRY right in the bucket head.  */
-
-  bucket->data = (void *) entry;
-  table->n_entries++;
-  table->n_buckets_used++;
-
-  /* If the growth threshold of the buckets in use has been reached, increase
-     the table size and rehash.  There's no point in checking the number of
-     entries:  if the hashing function is ill-conditioned, rehashing is not
-     likely to improve it.  */
-
-  if (table->n_buckets_used
-      > table->tuning->growth_threshold * table->n_buckets)
-    {
-      /* Check more fully, before starting real work.  If tuning arguments
-	 became invalid, the second check will rely on proper defaults.  */
-      check_tuning (table);
-      if (table->n_buckets_used
-	  > table->tuning->growth_threshold * table->n_buckets)
-	{
-	  const Hash_tuning *tuning = table->tuning;
-	  float candidate =
-	    (tuning->is_n_buckets
-	     ? (table->n_buckets * tuning->growth_factor)
-	     : (table->n_buckets * tuning->growth_factor
-		* tuning->growth_threshold));
-
-	  if (SIZE_MAX <= candidate)
-	    return NULL;
-
-	  /* If the rehash fails, arrange to return NULL.  */
-	  if (!hash_rehash (table, candidate))
-	    entry = NULL;
-	}
-    }
-
-  return (void *) entry;
-}
-
-/* If ENTRY is already in the table, remove it and return the just-deleted
-   data (the user may want to deallocate its storage).  If ENTRY is not in the
-   table, don't modify the table and return NULL.  */
-
-void *
-hash_delete (Hash_table *table, const void *entry)
-{
-  void *data;
-  struct hash_entry *bucket;
-
-  data = hash_find_entry (table, entry, &bucket, true);
-  if (!data)
-    return NULL;
-
-  table->n_entries--;
-  if (!bucket->data)
-    {
-      table->n_buckets_used--;
-
-      /* If the shrink threshold of the buckets in use has been reached,
-	 rehash into a smaller table.  */
-
-      if (table->n_buckets_used
-	  < table->tuning->shrink_threshold * table->n_buckets)
-	{
-	  /* Check more fully, before starting real work.  If tuning arguments
-	     became invalid, the second check will rely on proper defaults.  */
-	  check_tuning (table);
-	  if (table->n_buckets_used
-	      < table->tuning->shrink_threshold * table->n_buckets)
-	    {
-	      const Hash_tuning *tuning = table->tuning;
-	      size_t candidate =
-		(tuning->is_n_buckets
-		 ? table->n_buckets * tuning->shrink_factor
-		 : (table->n_buckets * tuning->shrink_factor
-		    * tuning->growth_threshold));
-
-	      hash_rehash (table, candidate);
-	    }
-	}
-    }
-
-  return data;
-}
-
-/* Testing.  */
-
-#if TESTING
-
-void
-hash_print (const Hash_table *table)
-{
-  struct hash_entry const *bucket;
-
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    {
-      struct hash_entry *cursor;
-
-      if (bucket)
-	printf ("%lu:\n", (unsigned long int) (bucket - table->bucket));
-
-      for (cursor = bucket; cursor; cursor = cursor->next)
-	{
-	  char const *s = cursor->data;
-	  /* FIXME */
-	  if (s)
-	    printf ("  %s\n", s);
-	}
-    }
-}
-
-#endif /* TESTING */
diff --git a/lib/hash.h b/lib/hash.h
deleted file mode 100644
index ab63a86..0000000
--- a/lib/hash.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* hash - hashing table processing.
-   Copyright (C) 1998, 1999, 2001, 2003 Free Software Foundation, Inc.
-   Written by Jim Meyering <meyering@ascend.com>, 1998.
-
-   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.  */
-
-/* A generic hash table package.  */
-
-/* Make sure USE_OBSTACK is defined to 1 if you want the allocator to use
-   obstacks instead of malloc, and recompile `hash.c' with same setting.  */
-
-#ifndef HASH_H_
-# define HASH_H_
-
-# include <stdio.h>
-# include <stdbool.h>
-
-typedef size_t (*Hash_hasher) (const void *, size_t);
-typedef bool (*Hash_comparator) (const void *, const void *);
-typedef void (*Hash_data_freer) (void *);
-typedef bool (*Hash_processor) (void *, void *);
-
-struct hash_entry
-  {
-    void *data;
-    struct hash_entry *next;
-  };
-
-struct hash_tuning
-  {
-    /* This structure is mainly used for `hash_initialize', see the block
-       documentation of `hash_reset_tuning' for more complete comments.  */
-
-    float shrink_threshold;	/* ratio of used buckets to trigger a shrink */
-    float shrink_factor;	/* ratio of new smaller size to original size */
-    float growth_threshold;	/* ratio of used buckets to trigger a growth */
-    float growth_factor;	/* ratio of new bigger size to original size */
-    bool is_n_buckets;		/* if CANDIDATE really means table size */
-  };
-
-typedef struct hash_tuning Hash_tuning;
-
-struct hash_table;
-
-typedef struct hash_table Hash_table;
-
-/* Information and lookup.  */
-size_t hash_get_n_buckets (const Hash_table *);
-size_t hash_get_n_buckets_used (const Hash_table *);
-size_t hash_get_n_entries (const Hash_table *);
-size_t hash_get_max_bucket_length (const Hash_table *);
-bool hash_table_ok (const Hash_table *);
-void hash_print_statistics (const Hash_table *, FILE *);
-void *hash_lookup (const Hash_table *, const void *);
-
-/* Walking.  */
-void *hash_get_first (const Hash_table *);
-void *hash_get_next (const Hash_table *, const void *);
-size_t hash_get_entries (const Hash_table *, void **, size_t);
-size_t hash_do_for_each (const Hash_table *, Hash_processor, void *);
-
-/* Allocation and clean-up.  */
-size_t hash_string (const char *, size_t);
-void hash_reset_tuning (Hash_tuning *);
-Hash_table *hash_initialize (size_t, const Hash_tuning *,
-			     Hash_hasher, Hash_comparator,
-			     Hash_data_freer);
-void hash_clear (Hash_table *);
-void hash_free (Hash_table *);
-
-/* Insertion and deletion.  */
-bool hash_rehash (Hash_table *, size_t);
-void *hash_insert (Hash_table *, const void *);
-void *hash_delete (Hash_table *, const void *);
-
-#endif
diff --git a/lib/lbitset.c b/lib/lbitset.c
deleted file mode 100644
index 7d47a05..0000000
--- a/lib/lbitset.c
+++ /dev/null
@@ -1,1405 +0,0 @@
-/* Functions to support link list bitsets.
-   Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
-   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
-
-   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 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, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "lbitset.h"
-#include "obstack.h"
-#include <stddef.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-/* This file implements linked-list bitsets.  These bitsets can be of
-   arbitrary length and are more efficient than arrays of bits for
-   large sparse sets.
-
-   Usually if all the bits in an element are zero we remove the element
-   from the list.  However, a side effect of the bit caching is that we
-   do not always notice when an element becomes zero.  Hence the
-   lbitset_weed function which removes zero elements.  */
-
-
-/* Number of words to use for each element.  The larger the value the
-   greater the size of the cache and the shorter the time to find a given bit
-   but the more memory wasted for sparse bitsets and the longer the time
-   to search for set bits.
-
-   The routines that dominate timing profiles are lbitset_elt_find
-   and lbitset_elt_link, especially when accessing the bits randomly.  */
-
-#define LBITSET_ELT_WORDS 2
-
-typedef bitset_word lbitset_word;
-
-#define LBITSET_WORD_BITS BITSET_WORD_BITS
-
-/* Number of bits stored in each element.  */
-#define LBITSET_ELT_BITS \
-  ((unsigned int) (LBITSET_ELT_WORDS * LBITSET_WORD_BITS))
-
-/* Lbitset element.   We use an array of bits for each element.
-   These are linked together in a doubly-linked list.  */
-typedef struct lbitset_elt_struct
-{
-  struct lbitset_elt_struct *next;	/* Next element.  */
-  struct lbitset_elt_struct *prev;	/* Previous element.  */
-  bitset_windex index;	/* bitno / BITSET_WORD_BITS.  */
-  bitset_word words[LBITSET_ELT_WORDS];	/* Bits that are set.  */
-}
-lbitset_elt;
-
-
-enum lbitset_find_mode
-  { LBITSET_FIND, LBITSET_CREATE, LBITSET_SUBST };
-
-static lbitset_elt lbitset_zero_elts[3]; /* Elements of all zero bits.  */
-
-/* Obstack to allocate bitset elements from.  */
-static struct obstack lbitset_obstack;
-static bool lbitset_obstack_init = false;
-static lbitset_elt *lbitset_free_list;	/* Free list of bitset elements.  */
-
-extern void debug_lbitset (bitset);
-
-#define LBITSET_CURRENT1(X) \
-  ((lbitset_elt *) (void *) ((char *) (X) - offsetof (lbitset_elt, words)))
-
-#define LBITSET_CURRENT(X) LBITSET_CURRENT1((X)->b.cdata)
-
-#define LBITSET_HEAD(X) ((X)->l.head)
-#define LBITSET_TAIL(X) ((X)->l.tail)
-
-/* Allocate a lbitset element.  The bits are not cleared.  */
-static inline lbitset_elt *
-lbitset_elt_alloc (void)
-{
-  lbitset_elt *elt;
-
-  if (lbitset_free_list != 0)
-    {
-      elt = lbitset_free_list;
-      lbitset_free_list = elt->next;
-    }
-  else
-    {
-      if (!lbitset_obstack_init)
-	{
-	  lbitset_obstack_init = true;
-
-	  /* Let particular systems override the size of a chunk.  */
-
-#ifndef OBSTACK_CHUNK_SIZE
-#define OBSTACK_CHUNK_SIZE 0
-#endif
-
-	  /* Let them override the alloc and free routines too.  */
-
-#ifndef OBSTACK_CHUNK_ALLOC
-#define OBSTACK_CHUNK_ALLOC xmalloc
-#endif
-
-#ifndef OBSTACK_CHUNK_FREE
-#define OBSTACK_CHUNK_FREE free
-#endif
-
-#if ! defined __GNUC__ || __GNUC__ < 2
-#define __alignof__(type) 0
-#endif
-
-	  obstack_specify_allocation (&lbitset_obstack, OBSTACK_CHUNK_SIZE,
-				      __alignof__ (lbitset_elt),
-				      OBSTACK_CHUNK_ALLOC,
-				      OBSTACK_CHUNK_FREE);
-	}
-
-      /* Perhaps we should add a number of new elements to the free
-	 list.  */
-      elt = (lbitset_elt *) obstack_alloc (&lbitset_obstack,
-					   sizeof (lbitset_elt));
-    }
-
-  return elt;
-}
-
-
-/* Allocate a lbitset element.  The bits are cleared.  */
-static inline lbitset_elt *
-lbitset_elt_calloc (void)
-{
-  lbitset_elt *elt;
-
-  elt = lbitset_elt_alloc ();
-  memset (elt->words, 0, sizeof (elt->words));
-  return elt;
-}
-
-
-static inline void
-lbitset_elt_free (lbitset_elt *elt)
-{
-  elt->next = lbitset_free_list;
-  lbitset_free_list = elt;
-}
-
-
-/* Unlink element ELT from bitset BSET.  */
-static inline void
-lbitset_elt_unlink (bitset bset, lbitset_elt *elt)
-{
-  lbitset_elt *next = elt->next;
-  lbitset_elt *prev = elt->prev;
-
-  if (prev)
-    prev->next = next;
-
-  if (next)
-    next->prev = prev;
-
-  if (LBITSET_HEAD (bset) == elt)
-    LBITSET_HEAD (bset) = next;
-  if (LBITSET_TAIL (bset) == elt)
-    LBITSET_TAIL (bset) = prev;
-
-  /* Update cache pointer.  Since the first thing we try is to insert
-     before current, make current the next entry in preference to the
-     previous.  */
-  if (LBITSET_CURRENT (bset) == elt)
-    {
-      if (next)
-	{
-	  bset->b.cdata = next->words;
-	  bset->b.cindex = next->index;
-	}
-      else if (prev)
-	{
-	  bset->b.cdata = prev->words;
-	  bset->b.cindex = prev->index;
-	}
-      else
-	{
-	  bset->b.csize = 0;
-	  bset->b.cdata = 0;
-	}
-    }
-
-  lbitset_elt_free (elt);
-}
-
-
-/* Cut the chain of bitset BSET before element ELT and free the
-   elements.  */
-static inline void
-lbitset_prune (bitset bset, lbitset_elt *elt)
-{
-  lbitset_elt *next;
-
-  if (!elt)
-    return;
-
-  if (elt->prev)
-    {
-      LBITSET_TAIL (bset) = elt->prev;
-      bset->b.cdata = elt->prev->words;
-      bset->b.cindex = elt->prev->index;
-      elt->prev->next = 0;
-    }
-  else
-    {
-      LBITSET_HEAD (bset) = 0;
-      LBITSET_TAIL (bset) = 0;
-      bset->b.cdata = 0;
-      bset->b.csize = 0;
-    }
-
-  for (; elt; elt = next)
-    {
-      next = elt->next;
-      lbitset_elt_free (elt);
-    }
-}
-
-
-/* Are all bits in an element zero?  */
-static inline bool
-lbitset_elt_zero_p (lbitset_elt *elt)
-{
-  int i;
-
-  for (i = 0; i < LBITSET_ELT_WORDS; i++)
-    if (elt->words[i])
-      return false;
-
-  return true;
-}
-
-
-/* Link the bitset element into the current bitset linked list.  */
-static inline void
-lbitset_elt_link (bitset bset, lbitset_elt *elt)
-{
-  bitset_windex windex = elt->index;
-  lbitset_elt *ptr;
-  lbitset_elt *current;
-
-  if (bset->b.csize)
-    current = LBITSET_CURRENT (bset);
-  else
-    current = LBITSET_HEAD (bset);
-
-  /* If this is the first and only element, add it in.  */
-  if (LBITSET_HEAD (bset) == 0)
-    {
-      elt->next = elt->prev = 0;
-      LBITSET_HEAD (bset) = elt;
-      LBITSET_TAIL (bset) = elt;
-    }
-
-  /* If this index is less than that of the current element, it goes
-     somewhere before the current element.  */
-  else if (windex < bset->b.cindex)
-    {
-      for (ptr = current;
-	   ptr->prev && ptr->prev->index > windex; ptr = ptr->prev)
-	continue;
-
-      if (ptr->prev)
-	ptr->prev->next = elt;
-      else
-	LBITSET_HEAD (bset) = elt;
-
-      elt->prev = ptr->prev;
-      elt->next = ptr;
-      ptr->prev = elt;
-    }
-
-  /* Otherwise, it must go somewhere after the current element.  */
-  else
-    {
-      for (ptr = current;
-	   ptr->next && ptr->next->index < windex; ptr = ptr->next)
-	continue;
-
-      if (ptr->next)
-	ptr->next->prev = elt;
-      else
-	LBITSET_TAIL (bset) = elt;
-
-      elt->next = ptr->next;
-      elt->prev = ptr;
-      ptr->next = elt;
-    }
-
-  /* Set up so this is the first element searched.  */
-  bset->b.cindex = windex;
-  bset->b.csize = LBITSET_ELT_WORDS;
-  bset->b.cdata = elt->words;
-}
-
-
-static lbitset_elt *
-lbitset_elt_find (bitset bset, bitset_windex windex,
-		  enum lbitset_find_mode mode)
-{
-  lbitset_elt *elt;
-  lbitset_elt *current;
-
-  if (bset->b.csize)
-    {
-      current = LBITSET_CURRENT (bset);
-      /* Check if element is the cached element.  */
-      if ((windex - bset->b.cindex) < bset->b.csize)
-	return current;
-    }
-  else
-    {
-      current = LBITSET_HEAD (bset);
-    }
-
-  if (current)
-    {
-      if (windex < bset->b.cindex)
-	{
-	  for (elt = current;
-	       elt->prev && elt->index > windex; elt = elt->prev)
-	    continue;
-	}
-      else
-	{
-	  for (elt = current;
-	       elt->next && (elt->index + LBITSET_ELT_WORDS - 1) < windex;
-	       elt = elt->next)
-	    continue;
-	}
-
-      /* ELT is the nearest to the one we want.  If it's not the one
-	 we want, the one we want does not exist.  */
-      if (elt && (windex - elt->index) < LBITSET_ELT_WORDS)
-	{
-	  bset->b.cindex = elt->index;
-	  bset->b.csize = LBITSET_ELT_WORDS;
-	  bset->b.cdata = elt->words;
-	  return elt;
-	}
-    }
-
-  switch (mode)
-    {
-    default:
-      abort ();
-
-    case LBITSET_FIND:
-      return 0;
-
-    case LBITSET_CREATE:
-      windex -= windex % LBITSET_ELT_WORDS;
-
-      elt = lbitset_elt_calloc ();
-      elt->index = windex;
-      lbitset_elt_link (bset, elt);
-      return elt;
-
-    case LBITSET_SUBST:
-      return &lbitset_zero_elts[0];
-    }
-}
-
-
-/* Weed out the zero elements from the list.  */
-static inline void
-lbitset_weed (bitset bset)
-{
-  lbitset_elt *elt;
-  lbitset_elt *next;
-
-  for (elt = LBITSET_HEAD (bset); elt; elt = next)
-    {
-      next = elt->next;
-      if (lbitset_elt_zero_p (elt))
-	lbitset_elt_unlink (bset, elt);
-    }
-}
-
-
-/* Set all bits in the bitset to zero.  */
-static void
-lbitset_zero (bitset bset)
-{
-  lbitset_elt *head;
-
-  head = LBITSET_HEAD (bset);
-  if (!head)
-    return;
-
-  /* Clear a bitset by freeing the linked list at the head element.  */
-  lbitset_prune (bset, head);
-}
-
-
-/* Is DST == SRC?  */
-static inline bool
-lbitset_equal_p (bitset dst, bitset src)
-{
-  lbitset_elt *selt;
-  lbitset_elt *delt;
-  int j;
-
-  if (src == dst)
-    return true;
-
-  lbitset_weed (src);
-  lbitset_weed (dst);
-  for (selt = LBITSET_HEAD (src), delt = LBITSET_HEAD (dst);
-       selt && delt; selt = selt->next, delt = delt->next)
-    {
-      if (selt->index != delt->index)
-	return false;
-
-      for (j = 0; j < LBITSET_ELT_WORDS; j++)
-	if (delt->words[j] != selt->words[j])
-	  return false;
-    }
-  return !selt && !delt;
-}
-
-
-/* Copy bits from bitset SRC to bitset DST.  */
-static inline void
-lbitset_copy (bitset dst, bitset src)
-{
-  lbitset_elt *elt;
-  lbitset_elt *head;
-  lbitset_elt *prev;
-  lbitset_elt *tmp;
-
-  if (src == dst)
-    return;
-
-  lbitset_zero (dst);
-
-  head = LBITSET_HEAD (src);
-  if (!head)
-    return;
-
-  prev = 0;
-  for (elt = head; elt; elt = elt->next)
-    {
-      tmp = lbitset_elt_alloc ();
-      tmp->index = elt->index;
-      tmp->prev = prev;
-      tmp->next = 0;
-      if (prev)
-	prev->next = tmp;
-      else
-	LBITSET_HEAD (dst) = tmp;
-      prev = tmp;
-
-      memcpy (tmp->words, elt->words, sizeof (elt->words));
-    }
-  LBITSET_TAIL (dst) = tmp;
-
-  dst->b.csize = LBITSET_ELT_WORDS;
-  dst->b.cdata = LBITSET_HEAD (dst)->words;
-  dst->b.cindex = LBITSET_HEAD (dst)->index;
-}
-
-
-/* Copy bits from bitset SRC to bitset DST.  Return true if
-   bitsets different.  */
-static inline bool
-lbitset_copy_cmp (bitset dst, bitset src)
-{
-  if (src == dst)
-    return false;
-
-  if (!LBITSET_HEAD (dst))
-    {
-      lbitset_copy (dst, src);
-      return LBITSET_HEAD (src) != 0;
-    }
-
-  if (lbitset_equal_p (dst, src))
-    return false;
-
-  lbitset_copy (dst, src);
-  return true;
-}
-
-
-static bitset_bindex
-lbitset_resize (bitset src, bitset_bindex size)
-{
-    BITSET_NBITS_ (src) = size;
-
-    /* Need to prune any excess bits.  FIXME.  */
-    return size;
-}
-
-/* Set bit BITNO in bitset DST.  */
-static void
-lbitset_set (bitset dst, bitset_bindex bitno)
-{
-  bitset_windex windex = bitno / BITSET_WORD_BITS;
-
-  lbitset_elt_find (dst, windex, LBITSET_CREATE);
-
-  dst->b.cdata[windex - dst->b.cindex] |=
-    (bitset_word) 1 << (bitno % BITSET_WORD_BITS);
-}
-
-
-/* Reset bit BITNO in bitset DST.  */
-static void
-lbitset_reset (bitset dst, bitset_bindex bitno)
-{
-  bitset_windex windex = bitno / BITSET_WORD_BITS;
-
-  if (!lbitset_elt_find (dst, windex, LBITSET_FIND))
-    return;
-
-  dst->b.cdata[windex - dst->b.cindex] &=
-    ~((bitset_word) 1 << (bitno % BITSET_WORD_BITS));
-
-  /* If all the data is zero, perhaps we should unlink it now...  */
-}
-
-
-/* Test bit BITNO in bitset SRC.  */
-static bool
-lbitset_test (bitset src, bitset_bindex bitno)
-{
-  bitset_windex windex = bitno / BITSET_WORD_BITS;
-
-  return (lbitset_elt_find (src, windex, LBITSET_FIND)
-	  && ((src->b.cdata[windex - src->b.cindex]
-	       >> (bitno % BITSET_WORD_BITS))
-	      & 1));
-}
-
-
-static void
-lbitset_free (bitset bset)
-{
-  lbitset_zero (bset);
-}
-
-
-/* Find list of up to NUM bits set in BSET starting from and including
- *NEXT and store in array LIST.  Return with actual number of bits
- found and with *NEXT indicating where search stopped.  */
-static bitset_bindex
-lbitset_list_reverse (bitset bset, bitset_bindex *list,
-		      bitset_bindex num, bitset_bindex *next)
-{
-  bitset_bindex rbitno;
-  bitset_bindex bitno;
-  unsigned int bcount;
-  bitset_bindex boffset;
-  bitset_windex windex;
-  bitset_bindex count;
-  lbitset_elt *elt;
-  bitset_word word;
-  bitset_bindex n_bits;
-
-  elt = LBITSET_TAIL (bset);
-  if (!elt)
-    return 0;
-
-  n_bits = (elt->index + LBITSET_ELT_WORDS) * BITSET_WORD_BITS;
-  rbitno = *next;
-
-  if (rbitno >= n_bits)
-    return 0;
-
-  bitno = n_bits - (rbitno + 1);
-
-  windex = bitno / BITSET_WORD_BITS;
-
-  /* Skip back to starting element.  */
-  for (; elt && elt->index > windex; elt = elt->prev)
-    continue;
-
-  if (!elt)
-    return 0;
-
-  if (windex >= elt->index + LBITSET_ELT_WORDS)
-    {
-      /* We are trying to start in no-mans land so start
-	 at end of current elt.  */
-      bcount = BITSET_WORD_BITS - 1;
-      windex = elt->index + LBITSET_ELT_WORDS - 1;
-    }
-  else
-    {
-      bcount = bitno % BITSET_WORD_BITS;
-    }
-
-  count = 0;
-  boffset = windex * BITSET_WORD_BITS;
-
-  /* If num is 1, we could speed things up with a binary search
-     of the word of interest.  */
-
-  while (elt)
-    {
-      bitset_word *srcp = elt->words;
-
-      for (; (windex - elt->index) < LBITSET_ELT_WORDS;
-	   windex--, boffset -= BITSET_WORD_BITS,
-	     bcount = BITSET_WORD_BITS - 1)
-	{
-	  word =
-	    srcp[windex - elt->index] << (BITSET_WORD_BITS - 1 - bcount);
-
-	  for (; word; bcount--)
-	    {
-	      if (word & BITSET_MSB)
-		{
-		  list[count++] = boffset + bcount;
-		  if (count >= num)
-		    {
-		      *next = n_bits - (boffset + bcount);
-		      return count;
-		    }
-		}
-	      word <<= 1;
-	    }
-	}
-
-      elt = elt->prev;
-      if (elt)
-	{
-	  windex = elt->index + LBITSET_ELT_WORDS - 1;
-	  boffset = windex * BITSET_WORD_BITS;
-	}
-    }
-
-  *next = n_bits - (boffset + 1);
-  return count;
-}
-
-
-/* Find list of up to NUM bits set in BSET starting from and including
- *NEXT and store in array LIST.  Return with actual number of bits
- found and with *NEXT indicating where search stopped.  */
-static bitset_bindex
-lbitset_list (bitset bset, bitset_bindex *list,
-	      bitset_bindex num, bitset_bindex *next)
-{
-  bitset_bindex bitno;
-  bitset_windex windex;
-  bitset_bindex count;
-  lbitset_elt *elt;
-  lbitset_elt *head;
-  bitset_word word;
-
-  head = LBITSET_HEAD (bset);
-  if (!head)
-    return 0;
-
-  bitno = *next;
-  count = 0;
-
-  if (!bitno)
-    {
-      /* This is the most common case.  */
-
-      /* Start with the first element.  */
-      elt = head;
-      windex = elt->index;
-      bitno = windex * BITSET_WORD_BITS;
-    }
-  else
-    {
-      windex = bitno / BITSET_WORD_BITS;
-
-      /* Skip to starting element.  */
-      for (elt = head;
-	   elt && (elt->index + LBITSET_ELT_WORDS - 1) < windex;
-	   elt = elt->next)
-	continue;
-
-      if (!elt)
-	return 0;
-
-      if (windex < elt->index)
-	{
-	  windex = elt->index;
-	  bitno = windex * BITSET_WORD_BITS;
-	}
-      else
-	{
-	  bitset_word *srcp = elt->words;
-
-	  /* We are starting within an element.  */
-
-	  for (; (windex - elt->index) < LBITSET_ELT_WORDS; windex++)
-	    {
-	      word = srcp[windex - elt->index] >> (bitno % BITSET_WORD_BITS);
-
-	      for (; word; bitno++)
-		{
-		  if (word & 1)
-		    {
-		      list[count++] = bitno;
-		      if (count >= num)
-			{
-			  *next = bitno + 1;
-			  return count;
-			}
-		    }
-		  word >>= 1;
-		}
-	      bitno = (windex + 1) * BITSET_WORD_BITS;
-	    }
-
-	  elt = elt->next;
-	  if (elt)
-	    {
-	      windex = elt->index;
-	      bitno = windex * BITSET_WORD_BITS;
-	    }
-	}
-    }
-
-
-  /* If num is 1, we could speed things up with a binary search
-     of the word of interest.  */
-
-  while (elt)
-    {
-      int i;
-      bitset_word *srcp = elt->words;
-
-      if ((count + LBITSET_ELT_BITS) < num)
-	{
-	  /* The coast is clear, plant boot!  */
-
-#if LBITSET_ELT_WORDS == 2
-	  word = srcp[0];
-	  if (word)
-	    {
-	      if (!(word & 0xffff))
-		{
-		  word >>= 16;
-		  bitno += 16;
-		}
-	      if (!(word & 0xff))
-		{
-		  word >>= 8;
-		  bitno += 8;
-		}
-	      for (; word; bitno++)
-		{
-		  if (word & 1)
-		    list[count++] = bitno;
-		  word >>= 1;
-		}
-	    }
-	  windex++;
-	  bitno = windex * BITSET_WORD_BITS;
-
-	  word = srcp[1];
-	  if (word)
-	    {
-	      if (!(word & 0xffff))
-		{
-		  word >>= 16;
-		  bitno += 16;
-		}
-	      for (; word; bitno++)
-		{
-		  if (word & 1)
-		    list[count++] = bitno;
-		  word >>= 1;
-		}
-	    }
-	  windex++;
-	  bitno = windex * BITSET_WORD_BITS;
-#else
-	  for (i = 0; i < LBITSET_ELT_WORDS; i++)
-	    {
-	      word = srcp[i];
-	      if (word)
-		{
-		  if (!(word & 0xffff))
-		    {
-		      word >>= 16;
-		      bitno += 16;
-		    }
-		  if (!(word & 0xff))
-		    {
-		      word >>= 8;
-		      bitno += 8;
-		    }
-		  for (; word; bitno++)
-		    {
-		      if (word & 1)
-			list[count++] = bitno;
-		      word >>= 1;
-		    }
-		}
-	      windex++;
-	      bitno = windex * BITSET_WORD_BITS;
-	    }
-#endif
-	}
-      else
-	{
-	  /* Tread more carefully since we need to check
-	     if array overflows.  */
-
-	  for (i = 0; i < LBITSET_ELT_WORDS; i++)
-	    {
-	      for (word = srcp[i]; word; bitno++)
-		{
-		  if (word & 1)
-		    {
-		      list[count++] = bitno;
-		      if (count >= num)
-			{
-			  *next = bitno + 1;
-			  return count;
-			}
-		    }
-		  word >>= 1;
-		}
-	      windex++;
-	      bitno = windex * BITSET_WORD_BITS;
-	    }
-	}
-
-      elt = elt->next;
-      if (elt)
-	{
-	  windex = elt->index;
-	  bitno = windex * BITSET_WORD_BITS;
-	}
-    }
-
-  *next = bitno;
-  return count;
-}
-
-
-static bool
-lbitset_empty_p (bitset dst)
-{
-  lbitset_elt *elt;
-  lbitset_elt *next;
-
-  for (elt = LBITSET_HEAD (dst); elt; elt = next)
-    {
-      next = elt->next;
-      if (!lbitset_elt_zero_p (elt))
-	return 0;
-      /* Weed as we go.  */
-      lbitset_elt_unlink (dst, elt);
-    }
-
-  return 1;
-}
-
-
-/* Ensure that any unused bits within the last element are clear.  */
-static inline void
-lbitset_unused_clear (bitset dst)
-{
-  unsigned int last_bit;
-  bitset_bindex n_bits;
-
-  n_bits = BITSET_SIZE_ (dst);
-  last_bit = n_bits % LBITSET_ELT_BITS;
-
-  if (last_bit)
-    {
-      lbitset_elt *elt;
-      bitset_windex windex;
-      bitset_word *srcp;
-
-      elt = LBITSET_TAIL (dst);
-      srcp = elt->words;
-      windex = n_bits / BITSET_WORD_BITS;
-
-      srcp[windex - elt->index] &= ((bitset_word) 1 << last_bit) - 1;
-      windex++;
-
-      for (; (windex - elt->index) < LBITSET_ELT_WORDS; windex++)
-	srcp[windex - elt->index] = 0;
-    }
-}
-
-
-static void
-lbitset_ones (bitset dst)
-{
-  bitset_windex i;
-  bitset_windex windex;
-  lbitset_elt *elt;
-
-  /* This is a decidedly unfriendly operation for a linked list
-      bitset!  It makes a sparse bitset become dense.  An alternative
-      is to have a flag that indicates that the bitset stores the
-      complement of what it indicates.  */
-
-  windex = (BITSET_SIZE_ (dst) + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS;
-
-  for (i = 0; i < windex; i += LBITSET_ELT_WORDS)
-    {
-      /* Create new elements if they cannot be found.  */
-      elt = lbitset_elt_find (dst, i, LBITSET_CREATE);
-      memset (elt->words, -1, sizeof (elt->words));
-    }
-
-  lbitset_unused_clear (dst);
-}
-
-
-static void
-lbitset_not (bitset dst, bitset src)
-{
-  lbitset_elt *elt;
-  lbitset_elt *selt;
-  lbitset_elt *delt;
-  bitset_windex i;
-  unsigned int j;
-  bitset_windex windex;
-
-  /* This is another unfriendly operation for a linked list
-     bitset!  */
-  elt = LBITSET_TAIL (dst);
-
-  windex = (BITSET_SIZE_ (dst) + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS;
-
-  for (i = 0; i < windex; i += LBITSET_ELT_WORDS)
-    {
-      /* Create new elements for dst if they cannot be found
-	 or substitute zero elements if src elements not found.  */
-      selt = lbitset_elt_find (src, i, LBITSET_SUBST);
-      delt = lbitset_elt_find (dst, i, LBITSET_CREATE);
-
-      for (j = 0; j < LBITSET_ELT_WORDS; j++)
-	delt->words[j] = ~selt->words[j];
-    }
-  lbitset_unused_clear (dst);
-  lbitset_weed (dst);
-  return;
-}
-
-
-/* Is DST == DST | SRC?  */
-static bool
-lbitset_subset_p (bitset dst, bitset src)
-{
-  lbitset_elt *selt;
-  lbitset_elt *delt;
-  unsigned int j;
-
-  for (selt = LBITSET_HEAD (src), delt = LBITSET_HEAD (dst);
-       selt || delt; selt = selt->next, delt = delt->next)
-    {
-      if (!selt)
-	selt = &lbitset_zero_elts[0];
-      else if (!delt)
-	delt = &lbitset_zero_elts[0];
-      else if (selt->index != delt->index)
-	{
-	  if (selt->index < delt->index)
-	    {
-	      lbitset_zero_elts[2].next = delt;
-	      delt = &lbitset_zero_elts[2];
-	    }
-	  else
-	    {
-	      lbitset_zero_elts[1].next = selt;
-	      selt = &lbitset_zero_elts[1];
-	    }
-	}
-
-      for (j = 0; j < LBITSET_ELT_WORDS; j++)
-	if (delt->words[j] != (selt->words[j] | delt->words[j]))
-	  return false;
-    }
-  return true;
-}
-
-
-/* Is DST & SRC == 0?  */
-static bool
-lbitset_disjoint_p (bitset dst, bitset src)
-{
-  lbitset_elt *selt;
-  lbitset_elt *delt;
-  unsigned int j;
-
-  for (selt = LBITSET_HEAD (src), delt = LBITSET_HEAD (dst);
-       selt && delt; selt = selt->next, delt = delt->next)
-    {
-      if (selt->index != delt->index)
-	{
-	  if (selt->index < delt->index)
-	    {
-	      lbitset_zero_elts[2].next = delt;
-	      delt = &lbitset_zero_elts[2];
-	    }
-	  else
-	    {
-	      lbitset_zero_elts[1].next = selt;
-	      selt = &lbitset_zero_elts[1];
-	    }
-	  /* Since the elements are different, there is no
-	     intersection of these elements.  */
-	  continue;
-	}
-
-      for (j = 0; j < LBITSET_ELT_WORDS; j++)
-	if (selt->words[j] & delt->words[j])
-	  return false;
-    }
-  return true;
-}
-
-
-static bool
-lbitset_op3_cmp (bitset dst, bitset src1, bitset src2, enum bitset_ops op)
-{
-  lbitset_elt *selt1 = LBITSET_HEAD (src1);
-  lbitset_elt *selt2 = LBITSET_HEAD (src2);
-  lbitset_elt *delt = LBITSET_HEAD (dst);
-  bitset_windex windex1;
-  bitset_windex windex2;
-  bitset_windex windex;
-  lbitset_elt *stmp1;
-  lbitset_elt *stmp2;
-  lbitset_elt *dtmp;
-  bitset_word *srcp1;
-  bitset_word *srcp2;
-  bitset_word *dstp;
-  bool changed = false;
-  unsigned int i;
-
-  LBITSET_HEAD (dst) = 0;
-  dst->b.csize = 0;
-
-  windex1 = (selt1) ? selt1->index : BITSET_WINDEX_MAX;
-  windex2 = (selt2) ? selt2->index : BITSET_WINDEX_MAX;
-
-  while (selt1 || selt2)
-    {
-      /* Figure out whether we need to substitute zero elements for
-	 missing links.  */
-      if (windex1 == windex2)
-	{
-	  windex = windex1;
-	  stmp1 = selt1;
-	  stmp2 = selt2;
-	  selt1 = selt1->next;
-	  windex1 = (selt1) ? selt1->index : BITSET_WINDEX_MAX;
-	  selt2 = selt2->next;
-	  windex2 = (selt2) ? selt2->index : BITSET_WINDEX_MAX;
-	}
-      else if (windex1 < windex2)
-	{
-	  windex = windex1;
-	  stmp1 = selt1;
-	  stmp2 = &lbitset_zero_elts[0];
-	  selt1 = selt1->next;
-	  windex1 = (selt1) ? selt1->index : BITSET_WINDEX_MAX;
-	}
-      else
-	{
-	  windex = windex2;
-	  stmp1 = &lbitset_zero_elts[0];
-	  stmp2 = selt2;
-	  selt2 = selt2->next;
-	  windex2 = (selt2) ? selt2->index : BITSET_WINDEX_MAX;
-	}
-
-      /* Find the appropriate element from DST.  Begin by discarding
-	 elements that we've skipped.  */
-      while (delt && delt->index < windex)
-	{
-	  changed = true;
-	  dtmp = delt;
-	  delt = delt->next;
-	  lbitset_elt_free (dtmp);
-	}
-      if (delt && delt->index == windex)
-	{
-	  dtmp = delt;
-	  delt = delt->next;
-	}
-      else
-	dtmp = lbitset_elt_calloc ();
-
-      /* Do the operation, and if any bits are set, link it into the
-	 linked list.  */
-      srcp1 = stmp1->words;
-      srcp2 = stmp2->words;
-      dstp = dtmp->words;
-      switch (op)
-	{
-	default:
-	  abort ();
-
-	case BITSET_OP_OR:
-	  for (i = 0; i < LBITSET_ELT_WORDS; i++, dstp++)
-	    {
-	      bitset_word tmp = *srcp1++ | *srcp2++;
-
-	      if (*dstp != tmp)
-		{
-		  changed = true;
-		  *dstp = tmp;
-		}
-	    }
-	  break;
-
-	case BITSET_OP_AND:
-	  for (i = 0; i < LBITSET_ELT_WORDS; i++, dstp++)
-	    {
-	      bitset_word tmp = *srcp1++ & *srcp2++;
-
-	      if (*dstp != tmp)
-		{
-		  changed = true;
-		  *dstp = tmp;
-		}
-	    }
-	  break;
-
-	case BITSET_OP_XOR:
-	  for (i = 0; i < LBITSET_ELT_WORDS; i++, dstp++)
-	    {
-	      bitset_word tmp = *srcp1++ ^ *srcp2++;
-
-	      if (*dstp != tmp)
-		{
-		  changed = true;
-		  *dstp = tmp;
-		}
-	    }
-	  break;
-
-	case BITSET_OP_ANDN:
-	  for (i = 0; i < LBITSET_ELT_WORDS; i++, dstp++)
-	    {
-	      bitset_word tmp = *srcp1++ & ~(*srcp2++);
-
-	      if (*dstp != tmp)
-		{
-		  changed = true;
-		  *dstp = tmp;
-		}
-	    }
-	  break;
-	}
-
-      if (!lbitset_elt_zero_p (dtmp))
-	{
-	  dtmp->index = windex;
-	  /* Perhaps this could be optimised...  */
-	  lbitset_elt_link (dst, dtmp);
-	}
-      else
-	{
-	  lbitset_elt_free (dtmp);
-	}
-    }
-
-  /* If we have elements of DST left over, free them all.  */
-  if (delt)
-    {
-      changed = true;
-      lbitset_prune (dst, delt);
-    }
-
-  return changed;
-}
-
-
-static bool
-lbitset_and_cmp (bitset dst, bitset src1, bitset src2)
-{
-  lbitset_elt *selt1 = LBITSET_HEAD (src1);
-  lbitset_elt *selt2 = LBITSET_HEAD (src2);
-  bool changed;
-
-  if (!selt2)
-    {
-      lbitset_weed (dst);
-      changed = !LBITSET_HEAD (dst);
-      lbitset_zero (dst);
-      return changed;
-    }
-  else if (!selt1)
-    {
-      lbitset_weed (dst);
-      changed = !LBITSET_HEAD (dst);
-      lbitset_zero (dst);
-      return changed;
-    }
-  return lbitset_op3_cmp (dst, src1, src2, BITSET_OP_AND);
-}
-
-
-static void
-lbitset_and (bitset dst, bitset src1, bitset src2)
-{
-  lbitset_and_cmp (dst, src1, src2);
-}
-
-
-static bool
-lbitset_andn_cmp (bitset dst, bitset src1, bitset src2)
-{
-  lbitset_elt *selt1 = LBITSET_HEAD (src1);
-  lbitset_elt *selt2 = LBITSET_HEAD (src2);
-  bool changed;
-
-  if (!selt2)
-    {
-      return lbitset_copy_cmp (dst, src1);
-    }
-  else if (!selt1)
-    {
-      lbitset_weed (dst);
-      changed = !LBITSET_HEAD (dst);
-      lbitset_zero (dst);
-      return changed;
-    }
-  return lbitset_op3_cmp (dst, src1, src2, BITSET_OP_ANDN);
-}
-
-
-static void
-lbitset_andn (bitset dst, bitset src1, bitset src2)
-{
-  lbitset_andn_cmp (dst, src1, src2);
-}
-
-
-static bool
-lbitset_or_cmp (bitset dst, bitset src1, bitset src2)
-{
-  lbitset_elt *selt1 = LBITSET_HEAD (src1);
-  lbitset_elt *selt2 = LBITSET_HEAD (src2);
-
-  if (!selt2)
-    {
-      return lbitset_copy_cmp (dst, src1);
-    }
-  else if (!selt1)
-    {
-      return lbitset_copy_cmp (dst, src2);
-    }
-  return lbitset_op3_cmp (dst, src1, src2, BITSET_OP_OR);
-}
-
-
-static void
-lbitset_or (bitset dst, bitset src1, bitset src2)
-{
-  lbitset_or_cmp (dst, src1, src2);
-}
-
-
-static bool
-lbitset_xor_cmp (bitset dst, bitset src1, bitset src2)
-{
-  lbitset_elt *selt1 = LBITSET_HEAD (src1);
-  lbitset_elt *selt2 = LBITSET_HEAD (src2);
-
-  if (!selt2)
-    {
-      return lbitset_copy_cmp (dst, src1);
-    }
-  else if (!selt1)
-    {
-      return lbitset_copy_cmp (dst, src2);
-    }
-  return lbitset_op3_cmp (dst, src1, src2, BITSET_OP_XOR);
-}
-
-
-static void
-lbitset_xor (bitset dst, bitset src1, bitset src2)
-{
-  lbitset_xor_cmp (dst, src1, src2);
-}
-
-
-
-/* Vector of operations for linked-list bitsets.  */
-struct bitset_vtable lbitset_vtable = {
-  lbitset_set,
-  lbitset_reset,
-  bitset_toggle_,
-  lbitset_test,
-  lbitset_resize,
-  bitset_size_,
-  bitset_count_,
-  lbitset_empty_p,
-  lbitset_ones,
-  lbitset_zero,
-  lbitset_copy,
-  lbitset_disjoint_p,
-  lbitset_equal_p,
-  lbitset_not,
-  lbitset_subset_p,
-  lbitset_and,
-  lbitset_and_cmp,
-  lbitset_andn,
-  lbitset_andn_cmp,
-  lbitset_or,
-  lbitset_or_cmp,
-  lbitset_xor,
-  lbitset_xor_cmp,
-  bitset_and_or_,
-  bitset_and_or_cmp_,
-  bitset_andn_or_,
-  bitset_andn_or_cmp_,
-  bitset_or_and_,
-  bitset_or_and_cmp_,
-  lbitset_list,
-  lbitset_list_reverse,
-  lbitset_free,
-  BITSET_LIST
-};
-
-
-/* Return size of initial structure.  */
-size_t
-lbitset_bytes (bitset_bindex n_bits ATTRIBUTE_UNUSED)
-{
-  return sizeof (struct lbitset_struct);
-}
-
-
-/* Initialize a bitset.  */
-bitset
-lbitset_init (bitset bset, bitset_bindex n_bits ATTRIBUTE_UNUSED)
-{
-  BITSET_NBITS_ (bset) = n_bits;
-  bset->b.vtable = &lbitset_vtable;
-  return bset;
-}
-
-
-void
-lbitset_release_memory (void)
-{
-  lbitset_free_list = 0;
-  if (lbitset_obstack_init)
-    {
-      lbitset_obstack_init = false;
-      obstack_free (&lbitset_obstack, NULL);
-    }
-}
-
-
-/* Function to be called from debugger to debug lbitset.  */
-void
-debug_lbitset (bitset bset)
-{
-  lbitset_elt *elt;
-  unsigned int i;
-
-  if (!bset)
-    return;
-
-  for (elt = LBITSET_HEAD (bset); elt; elt = elt->next)
-    {
-      fprintf (stderr, "Elt %lu\n", (unsigned long int) elt->index);
-      for (i = 0; i < LBITSET_ELT_WORDS; i++)
-	{
-	  unsigned int j;
-	  bitset_word word;
-
-	  word = elt->words[i];
-
-	  fprintf (stderr, "  Word %u:", i);
-	  for (j = 0; j < LBITSET_WORD_BITS; j++)
-	    if ((word & ((bitset_word) 1 << j)))
-	      fprintf (stderr, " %u", j);
-	  fprintf (stderr, "\n");
-	}
-    }
-}
diff --git a/lib/lbitset.h b/lib/lbitset.h
deleted file mode 100644
index aaad834..0000000
--- a/lib/lbitset.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Functions to support lbitsets.
-   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
-   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
-
-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 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, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef _LBITSET_H
-#define _LBITSET_H
-
-#include "bitset.h"
-
-extern size_t lbitset_bytes (bitset_bindex);
-
-extern bitset lbitset_init (bitset, bitset_bindex);
-
-extern void lbitset_release_memory (void);
-
-#endif
diff --git a/lib/libiberty.h b/lib/libiberty.h
deleted file mode 100644
index e8629e4..0000000
--- a/lib/libiberty.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Fake libiberty.h for Bison.
-   Copyright (C) 2002, 2003, 2004 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.  */
-
-
-/* Bison depends on libiberty's implementation of bitsets, which
-   requires a `libiberty.h' file.  This file provides the minimum
-   services.  */
-
-#ifndef BISON_LIBIBERTY_H_
-# define BISON_LIBIBERTY_H_ 1
-
-# ifndef __attribute__
-#  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
-#   define __attribute__(x)
-#  endif
-# endif
-
-# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
-
-# include "xalloc.h"
-
-#endif /* ! BISON_LIBIBERTY_H_ */
diff --git a/lib/main.c b/lib/main.c
deleted file mode 100644
index 98dedf9..0000000
--- a/lib/main.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Yacc library main function.
-
-   Copyright (C) 2002 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-
-#if HAVE_LOCALE_H
-# include <locale.h>
-#endif
-#if ! HAVE_SETLOCALE
-# define setlocale(Category, Locale)
-#endif
-
-int yyparse (void);
-
-int
-main (void)
-{
-  setlocale (LC_ALL, "");
-  return yyparse ();
-}
diff --git a/lib/malloc.c b/lib/malloc.c
deleted file mode 100644
index 58fa611..0000000
--- a/lib/malloc.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* malloc() function that is glibc compatible.
-   Copyright (C) 1997, 1998 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 Jim Meyering */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-#undef malloc
-
-#include <stdlib.h>
-
-/* Allocate an N-byte block of memory from the heap.
-   If N is zero, allocate a 1-byte block.  */
-
-void *
-rpl_malloc (size_t n)
-{
-  if (n == 0)
-    n = 1;
-  return malloc (n);
-}
diff --git a/lib/mbswidth.c b/lib/mbswidth.c
deleted file mode 100644
index c9e78d6..0000000
--- a/lib/mbswidth.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/* Determine the number of screen columns needed for a string.
-   Copyright (C) 2000-2005 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 Bruno Haible <haible@clisp.cons.org>.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-/* Specification.  */
-#include "mbswidth.h"
-
-/* Get MB_CUR_MAX.  */
-#include <stdlib.h>
-
-#include <string.h>
-
-/* Get isprint().  */
-#include <ctype.h>
-
-/* Get mbstate_t, mbrtowc(), mbsinit(), wcwidth().  */
-#if HAVE_WCHAR_H
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
-   <wchar.h>.  */
-# include <stdio.h>
-# include <time.h>
-# include <wchar.h>
-#endif
-
-/* Get iswprint(), iswcntrl().  */
-#if HAVE_WCTYPE_H
-# include <wctype.h>
-#endif
-#if !defined iswprint && !HAVE_ISWPRINT
-# define iswprint(wc) 1
-#endif
-#if !defined iswcntrl && !HAVE_ISWCNTRL
-# define iswcntrl(wc) 0
-#endif
-
-#ifndef mbsinit
-# if !HAVE_MBSINIT
-#  define mbsinit(ps) 1
-# endif
-#endif
-
-#ifndef HAVE_DECL_WCWIDTH
-"this configure-time declaration test was not run"
-#endif
-#if !HAVE_DECL_WCWIDTH
-int wcwidth ();
-#endif
-
-#ifndef wcwidth
-# if !HAVE_WCWIDTH
-/* wcwidth doesn't exist, so assume all printable characters have
-   width 1.  */
-#  define wcwidth(wc) ((wc) == 0 ? 0 : iswprint (wc) ? 1 : -1)
-# endif
-#endif
-
-/* Get ISPRINT.  */
-#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
-# define IN_CTYPE_DOMAIN(c) 1
-#else
-# define IN_CTYPE_DOMAIN(c) isascii(c)
-#endif
-/* Undefine to protect against the definition in wctype.h of Solaris 2.6.   */
-#undef ISPRINT
-#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c))
-#undef ISCNTRL
-#define ISCNTRL(c) (IN_CTYPE_DOMAIN (c) && iscntrl (c))
-
-/* Returns the number of columns needed to represent the multibyte
-   character string pointed to by STRING.  If a non-printable character
-   occurs, and MBSW_REJECT_UNPRINTABLE is specified, -1 is returned.
-   With flags = MBSW_REJECT_INVALID | MBSW_REJECT_UNPRINTABLE, this is
-   the multibyte analogue of the wcswidth function.
-   If STRING is not of length < INT_MAX / 2, integer overflow can occur.  */
-int
-mbswidth (const char *string, int flags)
-{
-  return mbsnwidth (string, strlen (string), flags);
-}
-
-/* Returns the number of columns needed to represent the multibyte
-   character string pointed to by STRING of length NBYTES.  If a
-   non-printable character occurs, and MBSW_REJECT_UNPRINTABLE is
-   specified, -1 is returned.
-   If NBYTES is not < INT_MAX / 2, integer overflow can occur.  */
-int
-mbsnwidth (const char *string, size_t nbytes, int flags)
-{
-  const char *p = string;
-  const char *plimit = p + nbytes;
-  int width;
-
-  width = 0;
-#if HAVE_MBRTOWC
-  if (MB_CUR_MAX > 1)
-    {
-      while (p < plimit)
-	switch (*p)
-	  {
-	    case ' ': case '!': case '"': case '#': case '%':
-	    case '&': case '\'': case '(': case ')': case '*':
-	    case '+': case ',': case '-': case '.': case '/':
-	    case '0': case '1': case '2': case '3': case '4':
-	    case '5': case '6': case '7': case '8': case '9':
-	    case ':': case ';': case '<': case '=': case '>':
-	    case '?':
-	    case 'A': case 'B': case 'C': case 'D': case 'E':
-	    case 'F': case 'G': case 'H': case 'I': case 'J':
-	    case 'K': case 'L': case 'M': case 'N': case 'O':
-	    case 'P': case 'Q': case 'R': case 'S': case 'T':
-	    case 'U': case 'V': case 'W': case 'X': case 'Y':
-	    case 'Z':
-	    case '[': case '\\': case ']': case '^': case '_':
-	    case 'a': case 'b': case 'c': case 'd': case 'e':
-	    case 'f': case 'g': case 'h': case 'i': case 'j':
-	    case 'k': case 'l': case 'm': case 'n': case 'o':
-	    case 'p': case 'q': case 'r': case 's': case 't':
-	    case 'u': case 'v': case 'w': case 'x': case 'y':
-	    case 'z': case '{': case '|': case '}': case '~':
-	      /* These characters are printable ASCII characters.  */
-	      p++;
-	      width++;
-	      break;
-	    default:
-	      /* If we have a multibyte sequence, scan it up to its end.  */
-	      {
-		mbstate_t mbstate;
-		memset (&mbstate, 0, sizeof mbstate);
-		do
-		  {
-		    wchar_t wc;
-		    size_t bytes;
-		    int w;
-
-		    bytes = mbrtowc (&wc, p, plimit - p, &mbstate);
-
-		    if (bytes == (size_t) -1)
-		      /* An invalid multibyte sequence was encountered.  */
-		      {
-			if (!(flags & MBSW_REJECT_INVALID))
-			  {
-			    p++;
-			    width++;
-			    break;
-			  }
-			else
-			  return -1;
-		      }
-
-		    if (bytes == (size_t) -2)
-		      /* An incomplete multibyte character at the end.  */
-		      {
-			if (!(flags & MBSW_REJECT_INVALID))
-			  {
-			    p = plimit;
-			    width++;
-			    break;
-			  }
-			else
-			  return -1;
-		      }
-
-		    if (bytes == 0)
-		      /* A null wide character was encountered.  */
-		      bytes = 1;
-
-		    w = wcwidth (wc);
-		    if (w >= 0)
-		      /* A printable multibyte character.  */
-		      width += w;
-		    else
-		      /* An unprintable multibyte character.  */
-		      if (!(flags & MBSW_REJECT_UNPRINTABLE))
-			width += (iswcntrl (wc) ? 0 : 1);
-		      else
-			return -1;
-
-		    p += bytes;
-		  }
-		while (! mbsinit (&mbstate));
-	      }
-	      break;
-	  }
-      return width;
-    }
-#endif
-
-  while (p < plimit)
-    {
-      unsigned char c = (unsigned char) *p++;
-
-      if (ISPRINT (c))
-	width++;
-      else if (!(flags & MBSW_REJECT_UNPRINTABLE))
-	width += (ISCNTRL (c) ? 0 : 1);
-      else
-	return -1;
-    }
-  return width;
-}
diff --git a/lib/mbswidth.h b/lib/mbswidth.h
deleted file mode 100644
index 1935e0a..0000000
--- a/lib/mbswidth.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Determine the number of screen columns needed for a string.
-   Copyright (C) 2000-2004 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.  */
-
-#include <stddef.h>
-
-/* Avoid a clash of our mbswidth() with a function of the same name defined
-   in UnixWare 7.1.1 <wchar.h>.  We need this #include before the #define
-   below.
-   However, we don't want to #include <wchar.h> on all platforms because
-   - Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-     <wchar.h>.
-   - BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
-     <wchar.h>.  */
-#if HAVE_DECL_MBSWIDTH_IN_WCHAR_H
-# include <wchar.h>
-#endif
-
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-
-/* Optional flags to influence mbswidth/mbsnwidth behavior.  */
-
-/* If this bit is set, return -1 upon finding an invalid or incomplete
-   character.  Otherwise, assume invalid characters have width 1.  */
-#define MBSW_REJECT_INVALID 1
-
-/* If this bit is set, return -1 upon finding a non-printable character.
-   Otherwise, assume unprintable characters have width 0 if they are
-   control characters and 1 otherwise.  */
-#define MBSW_REJECT_UNPRINTABLE	2
-
-
-/* Returns the number of screen columns needed for STRING.  */
-#define mbswidth gnu_mbswidth  /* avoid clash with UnixWare 7.1.1 function */
-extern int mbswidth (const char *string, int flags);
-
-/* Returns the number of screen columns needed for the NBYTES bytes
-   starting at BUF.  */
-extern int mbsnwidth (const char *buf, size_t nbytes, int flags);
-
-
-#ifdef	__cplusplus
-}
-#endif
diff --git a/lib/obstack.c b/lib/obstack.c
deleted file mode 100644
index 6df0611..0000000
--- a/lib/obstack.c
+++ /dev/null
@@ -1,440 +0,0 @@
-/* obstack.c - subroutines used implicitly by object stack macros
-
-   Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997,
-   1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#ifdef _LIBC
-# include <obstack.h>
-# include <shlib-compat.h>
-#else
-# include "obstack.h"
-#endif
-
-/* NOTE BEFORE MODIFYING THIS FILE: This version number must be
-   incremented whenever callers compiled using an old obstack.h can no
-   longer properly call the functions in this obstack.c.  */
-#define OBSTACK_INTERFACE_VERSION 1
-
-/* Comment out all this code if we are using the GNU C Library, and are not
-   actually compiling the library itself, and the installed library
-   supports the same library interface we do.  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.  */
-
-#include <stdio.h>		/* Random thing to get __GNU_LIBRARY__.  */
-#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
-# include <gnu-versions.h>
-# if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION
-#  define ELIDE_CODE
-# endif
-#endif
-
-#include <stddef.h>
-
-#ifndef ELIDE_CODE
-
-
-# if HAVE_INTTYPES_H
-#  include <inttypes.h>
-# endif
-# if HAVE_STDINT_H || defined _LIBC
-#  include <stdint.h>
-# endif
-
-/* Determine default alignment.  */
-union fooround
-{
-  uintmax_t i;
-  long double d;
-  void *p;
-};
-struct fooalign
-{
-  char c;
-  union fooround u;
-};
-/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
-   But in fact it might be less smart and round addresses to as much as
-   DEFAULT_ROUNDING.  So we prepare for it to do that.  */
-enum
-  {
-    DEFAULT_ALIGNMENT = offsetof (struct fooalign, u),
-    DEFAULT_ROUNDING = sizeof (union fooround)
-  };
-
-/* When we copy a long block of data, this is the unit to do it with.
-   On some machines, copying successive ints does not work;
-   in such a case, redefine COPYING_UNIT to `long' (if that works)
-   or `char' as a last resort.  */
-# ifndef COPYING_UNIT
-#  define COPYING_UNIT int
-# endif
-
-
-/* The functions allocating more room by calling `obstack_chunk_alloc'
-   jump to the handler pointed to by `obstack_alloc_failed_handler'.
-   This can be set to a user defined function which should either
-   abort gracefully or use longjump - but shouldn't return.  This
-   variable by default points to the internal function
-   `print_and_abort'.  */
-static void print_and_abort (void);
-void (*obstack_alloc_failed_handler) (void) = print_and_abort;
-
-/* Exit value used when `print_and_abort' is used.  */
-# include <stdlib.h>
-# ifdef _LIBC
-int obstack_exit_failure = EXIT_FAILURE;
-# else
-#  include "exitfail.h"
-#  define obstack_exit_failure exit_failure
-# endif
-
-# ifdef _LIBC
-#  if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
-/* A looong time ago (before 1994, anyway; we're not sure) this global variable
-   was used by non-GNU-C macros to avoid multiple evaluation.  The GNU C
-   library still exports it because somebody might use it.  */
-struct obstack *_obstack_compat;
-compat_symbol (libc, _obstack_compat, _obstack, GLIBC_2_0);
-#  endif
-# endif
-
-/* Define a macro that either calls functions with the traditional malloc/free
-   calling interface, or calls functions with the mmalloc/mfree interface
-   (that adds an extra first argument), based on the state of use_extra_arg.
-   For free, do not use ?:, since some compilers, like the MIPS compilers,
-   do not allow (expr) ? void : void.  */
-
-# define CALL_CHUNKFUN(h, size) \
-  (((h) -> use_extra_arg) \
-   ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
-   : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
-
-# define CALL_FREEFUN(h, old_chunk) \
-  do { \
-    if ((h) -> use_extra_arg) \
-      (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
-    else \
-      (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
-  } while (0)
-
-
-/* Initialize an obstack H for use.  Specify chunk size SIZE (0 means default).
-   Objects start on multiples of ALIGNMENT (0 means use default).
-   CHUNKFUN is the function to use to allocate chunks,
-   and FREEFUN the function to free them.
-
-   Return nonzero if successful, calls obstack_alloc_failed_handler if
-   allocation fails.  */
-
-int
-_obstack_begin (struct obstack *h,
-		int size, int alignment,
-		void *(*chunkfun) (long),
-		void (*freefun) (void *))
-{
-  register struct _obstack_chunk *chunk; /* points to new chunk */
-
-  if (alignment == 0)
-    alignment = DEFAULT_ALIGNMENT;
-  if (size == 0)
-    /* Default size is what GNU malloc can fit in a 4096-byte block.  */
-    {
-      /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
-	 Use the values for range checking, because if range checking is off,
-	 the extra bytes won't be missed terribly, but if range checking is on
-	 and we used a larger request, a whole extra 4096 bytes would be
-	 allocated.
-
-	 These number are irrelevant to the new GNU malloc.  I suspect it is
-	 less sensitive to the size of the request.  */
-      int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
-		    + 4 + DEFAULT_ROUNDING - 1)
-		   & ~(DEFAULT_ROUNDING - 1));
-      size = 4096 - extra;
-    }
-
-  h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun;
-  h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
-  h->chunk_size = size;
-  h->alignment_mask = alignment - 1;
-  h->use_extra_arg = 0;
-
-  chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
-  if (!chunk)
-    (*obstack_alloc_failed_handler) ();
-  h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents,
-					       alignment - 1);
-  h->chunk_limit = chunk->limit
-    = (char *) chunk + h->chunk_size;
-  chunk->prev = 0;
-  /* The initial chunk now contains no empty object.  */
-  h->maybe_empty_object = 0;
-  h->alloc_failed = 0;
-  return 1;
-}
-
-int
-_obstack_begin_1 (struct obstack *h, int size, int alignment,
-		  void *(*chunkfun) (void *, long),
-		  void (*freefun) (void *, void *),
-		  void *arg)
-{
-  register struct _obstack_chunk *chunk; /* points to new chunk */
-
-  if (alignment == 0)
-    alignment = DEFAULT_ALIGNMENT;
-  if (size == 0)
-    /* Default size is what GNU malloc can fit in a 4096-byte block.  */
-    {
-      /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
-	 Use the values for range checking, because if range checking is off,
-	 the extra bytes won't be missed terribly, but if range checking is on
-	 and we used a larger request, a whole extra 4096 bytes would be
-	 allocated.
-
-	 These number are irrelevant to the new GNU malloc.  I suspect it is
-	 less sensitive to the size of the request.  */
-      int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
-		    + 4 + DEFAULT_ROUNDING - 1)
-		   & ~(DEFAULT_ROUNDING - 1));
-      size = 4096 - extra;
-    }
-
-  h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
-  h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
-  h->chunk_size = size;
-  h->alignment_mask = alignment - 1;
-  h->extra_arg = arg;
-  h->use_extra_arg = 1;
-
-  chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
-  if (!chunk)
-    (*obstack_alloc_failed_handler) ();
-  h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents,
-					       alignment - 1);
-  h->chunk_limit = chunk->limit
-    = (char *) chunk + h->chunk_size;
-  chunk->prev = 0;
-  /* The initial chunk now contains no empty object.  */
-  h->maybe_empty_object = 0;
-  h->alloc_failed = 0;
-  return 1;
-}
-
-/* Allocate a new current chunk for the obstack *H
-   on the assumption that LENGTH bytes need to be added
-   to the current object, or a new object of length LENGTH allocated.
-   Copies any partial object from the end of the old chunk
-   to the beginning of the new one.  */
-
-void
-_obstack_newchunk (struct obstack *h, int length)
-{
-  register struct _obstack_chunk *old_chunk = h->chunk;
-  register struct _obstack_chunk *new_chunk;
-  register long	new_size;
-  register long obj_size = h->next_free - h->object_base;
-  register long i;
-  long already;
-  char *object_base;
-
-  /* Compute size for new chunk.  */
-  new_size = (obj_size + length) + (obj_size >> 3) + h->alignment_mask + 100;
-  if (new_size < h->chunk_size)
-    new_size = h->chunk_size;
-
-  /* Allocate and initialize the new chunk.  */
-  new_chunk = CALL_CHUNKFUN (h, new_size);
-  if (!new_chunk)
-    (*obstack_alloc_failed_handler) ();
-  h->chunk = new_chunk;
-  new_chunk->prev = old_chunk;
-  new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
-
-  /* Compute an aligned object_base in the new chunk */
-  object_base =
-    __PTR_ALIGN ((char *) new_chunk, new_chunk->contents, h->alignment_mask);
-
-  /* Move the existing object to the new chunk.
-     Word at a time is fast and is safe if the object
-     is sufficiently aligned.  */
-  if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT)
-    {
-      for (i = obj_size / sizeof (COPYING_UNIT) - 1;
-	   i >= 0; i--)
-	((COPYING_UNIT *)object_base)[i]
-	  = ((COPYING_UNIT *)h->object_base)[i];
-      /* We used to copy the odd few remaining bytes as one extra COPYING_UNIT,
-	 but that can cross a page boundary on a machine
-	 which does not do strict alignment for COPYING_UNITS.  */
-      already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT);
-    }
-  else
-    already = 0;
-  /* Copy remaining bytes one by one.  */
-  for (i = already; i < obj_size; i++)
-    object_base[i] = h->object_base[i];
-
-  /* If the object just copied was the only data in OLD_CHUNK,
-     free that chunk and remove it from the chain.
-     But not if that chunk might contain an empty object.  */
-  if (! h->maybe_empty_object
-      && (h->object_base
-	  == __PTR_ALIGN ((char *) old_chunk, old_chunk->contents,
-			  h->alignment_mask)))
-    {
-      new_chunk->prev = old_chunk->prev;
-      CALL_FREEFUN (h, old_chunk);
-    }
-
-  h->object_base = object_base;
-  h->next_free = h->object_base + obj_size;
-  /* The new chunk certainly contains no empty object yet.  */
-  h->maybe_empty_object = 0;
-}
-# ifdef _LIBC
-libc_hidden_def (_obstack_newchunk)
-# endif
-
-/* Return nonzero if object OBJ has been allocated from obstack H.
-   This is here for debugging.
-   If you use it in a program, you are probably losing.  */
-
-/* Suppress -Wmissing-prototypes warning.  We don't want to declare this in
-   obstack.h because it is just for debugging.  */
-int _obstack_allocated_p (struct obstack *h, void *obj);
-
-int
-_obstack_allocated_p (struct obstack *h, void *obj)
-{
-  register struct _obstack_chunk *lp;	/* below addr of any objects in this chunk */
-  register struct _obstack_chunk *plp;	/* point to previous chunk if any */
-
-  lp = (h)->chunk;
-  /* We use >= rather than > since the object cannot be exactly at
-     the beginning of the chunk but might be an empty object exactly
-     at the end of an adjacent chunk.  */
-  while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj))
-    {
-      plp = lp->prev;
-      lp = plp;
-    }
-  return lp != 0;
-}
-
-/* Free objects in obstack H, including OBJ and everything allocate
-   more recently than OBJ.  If OBJ is zero, free everything in H.  */
-
-# undef obstack_free
-
-void
-obstack_free (struct obstack *h, void *obj)
-{
-  register struct _obstack_chunk *lp;	/* below addr of any objects in this chunk */
-  register struct _obstack_chunk *plp;	/* point to previous chunk if any */
-
-  lp = h->chunk;
-  /* We use >= because there cannot be an object at the beginning of a chunk.
-     But there can be an empty object at that address
-     at the end of another chunk.  */
-  while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj))
-    {
-      plp = lp->prev;
-      CALL_FREEFUN (h, lp);
-      lp = plp;
-      /* If we switch chunks, we can't tell whether the new current
-	 chunk contains an empty object, so assume that it may.  */
-      h->maybe_empty_object = 1;
-    }
-  if (lp)
-    {
-      h->object_base = h->next_free = (char *) (obj);
-      h->chunk_limit = lp->limit;
-      h->chunk = lp;
-    }
-  else if (obj != 0)
-    /* obj is not in any of the chunks! */
-    abort ();
-}
-
-# ifdef _LIBC
-/* Older versions of libc used a function _obstack_free intended to be
-   called by non-GCC compilers.  */
-strong_alias (obstack_free, _obstack_free)
-# endif
-
-int
-_obstack_memory_used (struct obstack *h)
-{
-  register struct _obstack_chunk* lp;
-  register int nbytes = 0;
-
-  for (lp = h->chunk; lp != 0; lp = lp->prev)
-    {
-      nbytes += lp->limit - (char *) lp;
-    }
-  return nbytes;
-}
-
-/* Define the error handler.  */
-# ifdef _LIBC
-#  include <libintl.h>
-# else
-#  include "gettext.h"
-# endif
-# ifndef _
-#  define _(msgid) gettext (msgid)
-# endif
-
-# ifdef _LIBC
-#  include <libio/iolibio.h>
-# endif
-
-# ifndef __attribute__
-/* This feature is available in gcc versions 2.5 and later.  */
-#  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
-#   define __attribute__(Spec) /* empty */
-#  endif
-# endif
-
-static void
-__attribute__ ((noreturn))
-print_and_abort (void)
-{
-  /* Don't change any of these strings.  Yes, it would be possible to add
-     the newline to the string and use fputs or so.  But this must not
-     happen because the "memory exhausted" message appears in other places
-     like this and the translation should be reused instead of creating
-     a very similar string which requires a separate translation.  */
-# ifdef _LIBC
-  (void) __fxprintf (NULL, "%s\n", _("memory exhausted"));
-# else
-  fprintf (stderr, "%s\n", _("memory exhausted"));
-# endif
-  exit (obstack_exit_failure);
-}
-
-#endif	/* !ELIDE_CODE */
diff --git a/lib/obstack.h b/lib/obstack.h
deleted file mode 100644
index 95dd438..0000000
--- a/lib/obstack.h
+++ /dev/null
@@ -1,508 +0,0 @@
-/* obstack.h - object stack macros
-   Copyright (C) 1988-1994,1996-1999,2003,2004,2005
-	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 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.  */
-
-/* Summary:
-
-All the apparent functions defined here are macros. The idea
-is that you would use these pre-tested macros to solve a
-very specific set of problems, and they would run fast.
-Caution: no side-effects in arguments please!! They may be
-evaluated MANY times!!
-
-These macros operate a stack of objects.  Each object starts life
-small, and may grow to maturity.  (Consider building a word syllable
-by syllable.)  An object can move while it is growing.  Once it has
-been "finished" it never changes address again.  So the "top of the
-stack" is typically an immature growing object, while the rest of the
-stack is of mature, fixed size and fixed address objects.
-
-These routines grab large chunks of memory, using a function you
-supply, called `obstack_chunk_alloc'.  On occasion, they free chunks,
-by calling `obstack_chunk_free'.  You must define them and declare
-them before using any obstack macros.
-
-Each independent stack is represented by a `struct obstack'.
-Each of the obstack macros expects a pointer to such a structure
-as the first argument.
-
-One motivation for this package is the problem of growing char strings
-in symbol tables.  Unless you are "fascist pig with a read-only mind"
---Gosper's immortal quote from HAKMEM item 154, out of context--you
-would not like to put any arbitrary upper limit on the length of your
-symbols.
-
-In practice this often means you will build many short symbols and a
-few long symbols.  At the time you are reading a symbol you don't know
-how long it is.  One traditional method is to read a symbol into a
-buffer, realloc()ating the buffer every time you try to read a symbol
-that is longer than the buffer.  This is beaut, but you still will
-want to copy the symbol from the buffer to a more permanent
-symbol-table entry say about half the time.
-
-With obstacks, you can work differently.  Use one obstack for all symbol
-names.  As you read a symbol, grow the name in the obstack gradually.
-When the name is complete, finalize it.  Then, if the symbol exists already,
-free the newly read name.
-
-The way we do this is to take a large chunk, allocating memory from
-low addresses.  When you want to build a symbol in the chunk you just
-add chars above the current "high water mark" in the chunk.  When you
-have finished adding chars, because you got to the end of the symbol,
-you know how long the chars are, and you can create a new object.
-Mostly the chars will not burst over the highest address of the chunk,
-because you would typically expect a chunk to be (say) 100 times as
-long as an average object.
-
-In case that isn't clear, when we have enough chars to make up
-the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
-so we just point to it where it lies.  No moving of chars is
-needed and this is the second win: potentially long strings need
-never be explicitly shuffled. Once an object is formed, it does not
-change its address during its lifetime.
-
-When the chars burst over a chunk boundary, we allocate a larger
-chunk, and then copy the partly formed object from the end of the old
-chunk to the beginning of the new larger chunk.  We then carry on
-accreting characters to the end of the object as we normally would.
-
-A special macro is provided to add a single char at a time to a
-growing object.  This allows the use of register variables, which
-break the ordinary 'growth' macro.
-
-Summary:
-	We allocate large chunks.
-	We carve out one object at a time from the current chunk.
-	Once carved, an object never moves.
-	We are free to append data of any size to the currently
-	  growing object.
-	Exactly one object is growing in an obstack at any one time.
-	You can run one obstack per control block.
-	You may have as many control blocks as you dare.
-	Because of the way we do it, you can `unwind' an obstack
-	  back to a previous state. (You may remove objects much
-	  as you would with a stack.)
-*/
-
-
-/* Don't do the contents of this file more than once.  */
-
-#ifndef _OBSTACK_H
-#define _OBSTACK_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* We need the type of a pointer subtraction.  If __PTRDIFF_TYPE__ is
-   defined, as with GNU C, use that; that way we don't pollute the
-   namespace with <stddef.h>'s symbols.  Otherwise, include <stddef.h>
-   and use ptrdiff_t.  */
-
-#ifdef __PTRDIFF_TYPE__
-# define PTR_INT_TYPE __PTRDIFF_TYPE__
-#else
-# include <stddef.h>
-# define PTR_INT_TYPE ptrdiff_t
-#endif
-
-/* If B is the base of an object addressed by P, return the result of
-   aligning P to the next multiple of A + 1.  B and P must be of type
-   char *.  A + 1 must be a power of 2.  */
-
-#define __BPTR_ALIGN(B, P, A) ((B) + (((P) - (B) + (A)) & ~(A)))
-
-/* Similiar to _BPTR_ALIGN (B, P, A), except optimize the common case
-   where pointers can be converted to integers, aligned as integers,
-   and converted back again.  If PTR_INT_TYPE is narrower than a
-   pointer (e.g., the AS/400), play it safe and compute the alignment
-   relative to B.  Otherwise, use the faster strategy of computing the
-   alignment relative to 0.  */
-
-#define __PTR_ALIGN(B, P, A)						    \
-  __BPTR_ALIGN (sizeof (PTR_INT_TYPE) < sizeof (void *) ? (B) : (char *) 0, \
-		P, A)
-
-#include <string.h>
-
-struct _obstack_chunk		/* Lives at front of each chunk. */
-{
-  char  *limit;			/* 1 past end of this chunk */
-  struct _obstack_chunk *prev;	/* address of prior chunk or NULL */
-  char	contents[4];		/* objects begin here */
-};
-
-struct obstack		/* control current object in current chunk */
-{
-  long	chunk_size;		/* preferred size to allocate chunks in */
-  struct _obstack_chunk *chunk;	/* address of current struct obstack_chunk */
-  char	*object_base;		/* address of object we are building */
-  char	*next_free;		/* where to add next char to current object */
-  char	*chunk_limit;		/* address of char after current chunk */
-  union
-  {
-    PTR_INT_TYPE tempint;
-    void *tempptr;
-  } temp;			/* Temporary for some macros.  */
-  int   alignment_mask;		/* Mask of alignment for each object. */
-  /* These prototypes vary based on `use_extra_arg', and we use
-     casts to the prototypeless function type in all assignments,
-     but having prototypes here quiets -Wstrict-prototypes.  */
-  struct _obstack_chunk *(*chunkfun) (void *, long);
-  void (*freefun) (void *, struct _obstack_chunk *);
-  void *extra_arg;		/* first arg for chunk alloc/dealloc funcs */
-  unsigned use_extra_arg:1;	/* chunk alloc/dealloc funcs take extra arg */
-  unsigned maybe_empty_object:1;/* There is a possibility that the current
-				   chunk contains a zero-length object.  This
-				   prevents freeing the chunk if we allocate
-				   a bigger chunk to replace it. */
-  unsigned alloc_failed:1;	/* No longer used, as we now call the failed
-				   handler on error, but retained for binary
-				   compatibility.  */
-};
-
-/* Declare the external functions we use; they are in obstack.c.  */
-
-extern void _obstack_newchunk (struct obstack *, int);
-extern int _obstack_begin (struct obstack *, int, int,
-			    void *(*) (long), void (*) (void *));
-extern int _obstack_begin_1 (struct obstack *, int, int,
-			     void *(*) (void *, long),
-			     void (*) (void *, void *), void *);
-extern int _obstack_memory_used (struct obstack *);
-
-void obstack_free (struct obstack *obstack, void *block);
-
-
-/* Error handler called when `obstack_chunk_alloc' failed to allocate
-   more memory.  This can be set to a user defined function which
-   should either abort gracefully or use longjump - but shouldn't
-   return.  The default action is to print a message and abort.  */
-extern void (*obstack_alloc_failed_handler) (void);
-
-/* Exit value used when `print_and_abort' is used.  */
-extern int obstack_exit_failure;
-
-/* Pointer to beginning of object being allocated or to be allocated next.
-   Note that this might not be the final address of the object
-   because a new chunk might be needed to hold the final size.  */
-
-#define obstack_base(h) ((void *) (h)->object_base)
-
-/* Size for allocating ordinary chunks.  */
-
-#define obstack_chunk_size(h) ((h)->chunk_size)
-
-/* Pointer to next byte not yet allocated in current chunk.  */
-
-#define obstack_next_free(h)	((h)->next_free)
-
-/* Mask specifying low bits that should be clear in address of an object.  */
-
-#define obstack_alignment_mask(h) ((h)->alignment_mask)
-
-/* To prevent prototype warnings provide complete argument list.  */
-#define obstack_init(h)						\
-  _obstack_begin ((h), 0, 0,					\
-		  (void *(*) (long)) obstack_chunk_alloc,	\
-		  (void (*) (void *)) obstack_chunk_free)
-
-#define obstack_begin(h, size)					\
-  _obstack_begin ((h), (size), 0,				\
-		  (void *(*) (long)) obstack_chunk_alloc,	\
-		  (void (*) (void *)) obstack_chunk_free)
-
-#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun)  \
-  _obstack_begin ((h), (size), (alignment),				   \
-		  (void *(*) (long)) (chunkfun),			   \
-		  (void (*) (void *)) (freefun))
-
-#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
-  _obstack_begin_1 ((h), (size), (alignment),				\
-		    (void *(*) (void *, long)) (chunkfun),		\
-		    (void (*) (void *, void *)) (freefun), (arg))
-
-#define obstack_chunkfun(h, newchunkfun) \
-  ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
-
-#define obstack_freefun(h, newfreefun) \
-  ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
-
-#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = (achar))
-
-#define obstack_blank_fast(h,n) ((h)->next_free += (n))
-
-#define obstack_memory_used(h) _obstack_memory_used (h)
-
-#if defined __GNUC__ && defined __STDC__ && __STDC__
-/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
-   does not implement __extension__.  But that compiler doesn't define
-   __GNUC_MINOR__.  */
-# if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
-#  define __extension__
-# endif
-
-/* For GNU C, if not -traditional,
-   we can define these macros to compute all args only once
-   without using a global variable.
-   Also, we can avoid using the `temp' slot, to make faster code.  */
-
-# define obstack_object_size(OBSTACK)					\
-  __extension__								\
-  ({ struct obstack const *__o = (OBSTACK);				\
-     (unsigned) (__o->next_free - __o->object_base); })
-
-# define obstack_room(OBSTACK)						\
-  __extension__								\
-  ({ struct obstack const *__o = (OBSTACK);				\
-     (unsigned) (__o->chunk_limit - __o->next_free); })
-
-# define obstack_make_room(OBSTACK,length)				\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   int __len = (length);						\
-   if (__o->chunk_limit - __o->next_free < __len)			\
-     _obstack_newchunk (__o, __len);					\
-   (void) 0; })
-
-# define obstack_empty_p(OBSTACK)					\
-  __extension__								\
-  ({ struct obstack const *__o = (OBSTACK);				\
-     (__o->chunk->prev == 0						\
-      && __o->next_free == __PTR_ALIGN ((char *) __o->chunk,		\
-					__o->chunk->contents,		\
-					__o->alignment_mask)); })
-
-# define obstack_grow(OBSTACK,where,length)				\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   int __len = (length);						\
-   if (__o->next_free + __len > __o->chunk_limit)			\
-     _obstack_newchunk (__o, __len);					\
-   memcpy (__o->next_free, where, __len);				\
-   __o->next_free += __len;						\
-   (void) 0; })
-
-# define obstack_grow0(OBSTACK,where,length)				\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   int __len = (length);						\
-   if (__o->next_free + __len + 1 > __o->chunk_limit)			\
-     _obstack_newchunk (__o, __len + 1);				\
-   memcpy (__o->next_free, where, __len);				\
-   __o->next_free += __len;						\
-   *(__o->next_free)++ = 0;						\
-   (void) 0; })
-
-# define obstack_1grow(OBSTACK,datum)					\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   if (__o->next_free + 1 > __o->chunk_limit)				\
-     _obstack_newchunk (__o, 1);					\
-   obstack_1grow_fast (__o, datum);					\
-   (void) 0; })
-
-/* These assume that the obstack alignment is good enough for pointers
-   or ints, and that the data added so far to the current object
-   shares that much alignment.  */
-
-# define obstack_ptr_grow(OBSTACK,datum)				\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   if (__o->next_free + sizeof (void *) > __o->chunk_limit)		\
-     _obstack_newchunk (__o, sizeof (void *));				\
-   obstack_ptr_grow_fast (__o, datum); })				\
-
-# define obstack_int_grow(OBSTACK,datum)				\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   if (__o->next_free + sizeof (int) > __o->chunk_limit)		\
-     _obstack_newchunk (__o, sizeof (int));				\
-   obstack_int_grow_fast (__o, datum); })
-
-# define obstack_ptr_grow_fast(OBSTACK,aptr)				\
-__extension__								\
-({ struct obstack *__o1 = (OBSTACK);					\
-   *(const void **) __o1->next_free = (aptr);				\
-   __o1->next_free += sizeof (const void *);				\
-   (void) 0; })
-
-# define obstack_int_grow_fast(OBSTACK,aint)				\
-__extension__								\
-({ struct obstack *__o1 = (OBSTACK);					\
-   *(int *) __o1->next_free = (aint);					\
-   __o1->next_free += sizeof (int);					\
-   (void) 0; })
-
-# define obstack_blank(OBSTACK,length)					\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   int __len = (length);						\
-   if (__o->chunk_limit - __o->next_free < __len)			\
-     _obstack_newchunk (__o, __len);					\
-   obstack_blank_fast (__o, __len);					\
-   (void) 0; })
-
-# define obstack_alloc(OBSTACK,length)					\
-__extension__								\
-({ struct obstack *__h = (OBSTACK);					\
-   obstack_blank (__h, (length));					\
-   obstack_finish (__h); })
-
-# define obstack_copy(OBSTACK,where,length)				\
-__extension__								\
-({ struct obstack *__h = (OBSTACK);					\
-   obstack_grow (__h, (where), (length));				\
-   obstack_finish (__h); })
-
-# define obstack_copy0(OBSTACK,where,length)				\
-__extension__								\
-({ struct obstack *__h = (OBSTACK);					\
-   obstack_grow0 (__h, (where), (length));				\
-   obstack_finish (__h); })
-
-/* The local variable is named __o1 to avoid a name conflict
-   when obstack_blank is called.  */
-# define obstack_finish(OBSTACK)					\
-__extension__								\
-({ struct obstack *__o1 = (OBSTACK);					\
-   void *__value = (void *) __o1->object_base;				\
-   if (__o1->next_free == __value)					\
-     __o1->maybe_empty_object = 1;					\
-   __o1->next_free							\
-     = __PTR_ALIGN (__o1->object_base, __o1->next_free,			\
-		    __o1->alignment_mask);				\
-   if (__o1->next_free - (char *)__o1->chunk				\
-       > __o1->chunk_limit - (char *)__o1->chunk)			\
-     __o1->next_free = __o1->chunk_limit;				\
-   __o1->object_base = __o1->next_free;					\
-   __value; })
-
-# define obstack_free(OBSTACK, OBJ)					\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   void *__obj = (OBJ);							\
-   if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit)  \
-     __o->next_free = __o->object_base = (char *)__obj;			\
-   else (obstack_free) (__o, __obj); })
-
-#else /* not __GNUC__ or not __STDC__ */
-
-# define obstack_object_size(h) \
- (unsigned) ((h)->next_free - (h)->object_base)
-
-# define obstack_room(h)		\
- (unsigned) ((h)->chunk_limit - (h)->next_free)
-
-# define obstack_empty_p(h) \
- ((h)->chunk->prev == 0							\
-  && (h)->next_free == __PTR_ALIGN ((char *) (h)->chunk,		\
-				    (h)->chunk->contents,		\
-				    (h)->alignment_mask))
-
-/* Note that the call to _obstack_newchunk is enclosed in (..., 0)
-   so that we can avoid having void expressions
-   in the arms of the conditional expression.
-   Casting the third operand to void was tried before,
-   but some compilers won't accept it.  */
-
-# define obstack_make_room(h,length)					\
-( (h)->temp.tempint = (length),						\
-  (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit)		\
-   ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0))
-
-# define obstack_grow(h,where,length)					\
-( (h)->temp.tempint = (length),						\
-  (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit)		\
-   ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0),		\
-  memcpy ((h)->next_free, where, (h)->temp.tempint),			\
-  (h)->next_free += (h)->temp.tempint)
-
-# define obstack_grow0(h,where,length)					\
-( (h)->temp.tempint = (length),						\
-  (((h)->next_free + (h)->temp.tempint + 1 > (h)->chunk_limit)		\
-   ? (_obstack_newchunk ((h), (h)->temp.tempint + 1), 0) : 0),		\
-  memcpy ((h)->next_free, where, (h)->temp.tempint),			\
-  (h)->next_free += (h)->temp.tempint,					\
-  *((h)->next_free)++ = 0)
-
-# define obstack_1grow(h,datum)						\
-( (((h)->next_free + 1 > (h)->chunk_limit)				\
-   ? (_obstack_newchunk ((h), 1), 0) : 0),				\
-  obstack_1grow_fast (h, datum))
-
-# define obstack_ptr_grow(h,datum)					\
-( (((h)->next_free + sizeof (char *) > (h)->chunk_limit)		\
-   ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0),		\
-  obstack_ptr_grow_fast (h, datum))
-
-# define obstack_int_grow(h,datum)					\
-( (((h)->next_free + sizeof (int) > (h)->chunk_limit)			\
-   ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0),			\
-  obstack_int_grow_fast (h, datum))
-
-# define obstack_ptr_grow_fast(h,aptr)					\
-  (((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr))
-
-# define obstack_int_grow_fast(h,aint)					\
-  (((int *) ((h)->next_free += sizeof (int)))[-1] = (aint))
-
-# define obstack_blank(h,length)					\
-( (h)->temp.tempint = (length),						\
-  (((h)->chunk_limit - (h)->next_free < (h)->temp.tempint)		\
-   ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0),		\
-  obstack_blank_fast (h, (h)->temp.tempint))
-
-# define obstack_alloc(h,length)					\
- (obstack_blank ((h), (length)), obstack_finish ((h)))
-
-# define obstack_copy(h,where,length)					\
- (obstack_grow ((h), (where), (length)), obstack_finish ((h)))
-
-# define obstack_copy0(h,where,length)					\
- (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
-
-# define obstack_finish(h)						\
-( ((h)->next_free == (h)->object_base					\
-   ? (((h)->maybe_empty_object = 1), 0)					\
-   : 0),								\
-  (h)->temp.tempptr = (h)->object_base,					\
-  (h)->next_free							\
-    = __PTR_ALIGN ((h)->object_base, (h)->next_free,			\
-		   (h)->alignment_mask),				\
-  (((h)->next_free - (char *) (h)->chunk				\
-    > (h)->chunk_limit - (char *) (h)->chunk)				\
-   ? ((h)->next_free = (h)->chunk_limit) : 0),				\
-  (h)->object_base = (h)->next_free,					\
-  (h)->temp.tempptr)
-
-# define obstack_free(h,obj)						\
-( (h)->temp.tempint = (char *) (obj) - (char *) (h)->chunk,		\
-  ((((h)->temp.tempint > 0						\
-    && (h)->temp.tempint < (h)->chunk_limit - (char *) (h)->chunk))	\
-   ? (int) ((h)->next_free = (h)->object_base				\
-	    = (h)->temp.tempint + (char *) (h)->chunk)			\
-   : (((obstack_free) ((h), (h)->temp.tempint + (char *) (h)->chunk), 0), 0)))
-
-#endif /* not __GNUC__ or not __STDC__ */
-
-#ifdef __cplusplus
-}	/* C++ */
-#endif
-
-#endif /* obstack.h */
diff --git a/lib/pipe-safer.c b/lib/pipe-safer.c
deleted file mode 100644
index fb02d72..0000000
--- a/lib/pipe-safer.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Invoke pipe, but avoid some glitches.
-   Copyright (C) 2005 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 Jim Meyering.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "unistd-safer.h"
-
-#include <unistd.h>
-
-/* Like pipe, but ensure that neither of the file descriptors is
-   STDIN_FILENO, STDOUT_FILENO, or STDERR_FILENO.  */
-
-int
-pipe_safer (int fd[2])
-{
-  int fail = pipe (fd);
-  if (fail)
-    return fail;
-
-  {
-    int i;
-    for (i = 0; i < 2; i++)
-      {
-	int f = fd_safer (fd[i]);
-	if (f < 0)
-	  return -1;
-	fd[i] = f;
-      }
-  }
-
-  return 0;
-}
diff --git a/lib/quote.c b/lib/quote.c
deleted file mode 100644
index 16cc939..0000000
--- a/lib/quote.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* quote.c - quote arguments for output
-   Copyright (C) 1998, 1999, 2000, 2001, 2003 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 Paul Eggert <eggert@twinsun.com> */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "quotearg.h"
-#include "quote.h"
-
-/* Return an unambiguous printable representation of NAME,
-   allocated in slot N, suitable for diagnostics.  */
-char const *
-quote_n (int n, char const *name)
-{
-  return quotearg_n_style (n, locale_quoting_style, name);
-}
-
-/* Return an unambiguous printable representation of NAME,
-   suitable for diagnostics.  */
-char const *
-quote (char const *name)
-{
-  return quote_n (0, name);
-}
diff --git a/lib/quote.h b/lib/quote.h
deleted file mode 100644
index 5400ead..0000000
--- a/lib/quote.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* quote.h - prototypes for quote.c
-
-   Copyright (C) 1998, 1999, 2000, 2001, 2003 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.  */
-
-
-char const *quote_n (int n, char const *name);
-char const *quote (char const *name);
diff --git a/lib/quotearg.c b/lib/quotearg.c
deleted file mode 100644
index 113239f..0000000
--- a/lib/quotearg.c
+++ /dev/null
@@ -1,690 +0,0 @@
-/* quotearg.c - quote arguments for output
-
-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006 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 Paul Eggert <eggert@twinsun.com> */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "quotearg.h"
-
-#include "xalloc.h"
-
-#include <ctype.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "gettext.h"
-#define _(msgid) gettext (msgid)
-#define N_(msgid) msgid
-
-#if HAVE_WCHAR_H
-
-/* BSD/OS 4.1 wchar.h requires FILE and struct tm to be declared.  */
-# include <stdio.h>
-# include <time.h>
-
-# include <wchar.h>
-#endif
-
-#if !HAVE_MBRTOWC
-/* Disable multibyte processing entirely.  Since MB_CUR_MAX is 1, the
-   other macros are defined only for documentation and to satisfy C
-   syntax.  */
-# undef MB_CUR_MAX
-# define MB_CUR_MAX 1
-# define mbrtowc(pwc, s, n, ps) ((*(pwc) = *(s)) != 0)
-# define iswprint(wc) isprint ((unsigned char) (wc))
-# undef HAVE_MBSINIT
-#endif
-
-#if !defined mbsinit && !HAVE_MBSINIT
-# define mbsinit(ps) 1
-#endif
-
-#ifndef iswprint
-# if HAVE_WCTYPE_H
-#  include <wctype.h>
-# endif
-# if !defined iswprint && !HAVE_ISWPRINT
-#  define iswprint(wc) 1
-# endif
-#endif
-
-#ifndef SIZE_MAX
-# define SIZE_MAX ((size_t) -1)
-#endif
-
-#define INT_BITS (sizeof (int) * CHAR_BIT)
-
-struct quoting_options
-{
-  /* Basic quoting style.  */
-  enum quoting_style style;
-
-  /* Quote the characters indicated by this bit vector even if the
-     quoting style would not normally require them to be quoted.  */
-  unsigned int quote_these_too[(UCHAR_MAX / INT_BITS) + 1];
-};
-
-/* Names of quoting styles.  */
-char const *const quoting_style_args[] =
-{
-  "literal",
-  "shell",
-  "shell-always",
-  "c",
-  "escape",
-  "locale",
-  "clocale",
-  0
-};
-
-/* Correspondences to quoting style names.  */
-enum quoting_style const quoting_style_vals[] =
-{
-  literal_quoting_style,
-  shell_quoting_style,
-  shell_always_quoting_style,
-  c_quoting_style,
-  escape_quoting_style,
-  locale_quoting_style,
-  clocale_quoting_style
-};
-
-/* The default quoting options.  */
-static struct quoting_options default_quoting_options;
-
-/* Allocate a new set of quoting options, with contents initially identical
-   to O if O is not null, or to the default if O is null.
-   It is the caller's responsibility to free the result.  */
-struct quoting_options *
-clone_quoting_options (struct quoting_options *o)
-{
-  int e = errno;
-  struct quoting_options *p = xmalloc (sizeof *p);
-  *p = *(o ? o : &default_quoting_options);
-  errno = e;
-  return p;
-}
-
-/* Get the value of O's quoting style.  If O is null, use the default.  */
-enum quoting_style
-get_quoting_style (struct quoting_options *o)
-{
-  return (o ? o : &default_quoting_options)->style;
-}
-
-/* In O (or in the default if O is null),
-   set the value of the quoting style to S.  */
-void
-set_quoting_style (struct quoting_options *o, enum quoting_style s)
-{
-  (o ? o : &default_quoting_options)->style = s;
-}
-
-/* In O (or in the default if O is null),
-   set the value of the quoting options for character C to I.
-   Return the old value.  Currently, the only values defined for I are
-   0 (the default) and 1 (which means to quote the character even if
-   it would not otherwise be quoted).  */
-int
-set_char_quoting (struct quoting_options *o, char c, int i)
-{
-  unsigned char uc = c;
-  unsigned int *p =
-    (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
-  int shift = uc % INT_BITS;
-  int r = (*p >> shift) & 1;
-  *p ^= ((i & 1) ^ r) << shift;
-  return r;
-}
-
-/* MSGID approximates a quotation mark.  Return its translation if it
-   has one; otherwise, return either it or "\"", depending on S.  */
-static char const *
-gettext_quote (char const *msgid, enum quoting_style s)
-{
-  char const *translation = _(msgid);
-  if (translation == msgid && s == clocale_quoting_style)
-    translation = "\"";
-  return translation;
-}
-
-/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
-   argument ARG (of size ARGSIZE), using QUOTING_STYLE and the
-   non-quoting-style part of O to control quoting.
-   Terminate the output with a null character, and return the written
-   size of the output, not counting the terminating null.
-   If BUFFERSIZE is too small to store the output string, return the
-   value that would have been returned had BUFFERSIZE been large enough.
-   If ARGSIZE is SIZE_MAX, use the string length of the argument for ARGSIZE.
-
-   This function acts like quotearg_buffer (BUFFER, BUFFERSIZE, ARG,
-   ARGSIZE, O), except it uses QUOTING_STYLE instead of the quoting
-   style specified by O, and O may not be null.  */
-
-static size_t
-quotearg_buffer_restyled (char *buffer, size_t buffersize,
-			  char const *arg, size_t argsize,
-			  enum quoting_style quoting_style,
-			  struct quoting_options const *o)
-{
-  size_t i;
-  size_t len = 0;
-  char const *quote_string = 0;
-  size_t quote_string_len = 0;
-  bool backslash_escapes = false;
-  bool unibyte_locale = MB_CUR_MAX == 1;
-
-#define STORE(c) \
-    do \
-      { \
-	if (len < buffersize) \
-	  buffer[len] = (c); \
-	len++; \
-      } \
-    while (0)
-
-  switch (quoting_style)
-    {
-    case c_quoting_style:
-      STORE ('"');
-      backslash_escapes = true;
-      quote_string = "\"";
-      quote_string_len = 1;
-      break;
-
-    case escape_quoting_style:
-      backslash_escapes = true;
-      break;
-
-    case locale_quoting_style:
-    case clocale_quoting_style:
-      {
-	/* TRANSLATORS:
-	   Get translations for open and closing quotation marks.
-
-	   The message catalog should translate "`" to a left
-	   quotation mark suitable for the locale, and similarly for
-	   "'".  If the catalog has no translation,
-	   locale_quoting_style quotes `like this', and
-	   clocale_quoting_style quotes "like this".
-
-	   For example, an American English Unicode locale should
-	   translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
-	   should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
-	   MARK).  A British English Unicode locale should instead
-	   translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
-	   U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
-
-	   If you don't know what to put here, please see
-	   <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
-	   and use glyphs suitable for your language.  */
-
-	char const *left = gettext_quote (N_("`"), quoting_style);
-	char const *right = gettext_quote (N_("'"), quoting_style);
-	for (quote_string = left; *quote_string; quote_string++)
-	  STORE (*quote_string);
-	backslash_escapes = true;
-	quote_string = right;
-	quote_string_len = strlen (quote_string);
-      }
-      break;
-
-    case shell_always_quoting_style:
-      STORE ('\'');
-      quote_string = "'";
-      quote_string_len = 1;
-      break;
-
-    default:
-      break;
-    }
-
-  for (i = 0;  ! (argsize == SIZE_MAX ? arg[i] == '\0' : i == argsize);  i++)
-    {
-      unsigned char c;
-      unsigned char esc;
-
-      if (backslash_escapes
-	  && quote_string_len
-	  && i + quote_string_len <= argsize
-	  && memcmp (arg + i, quote_string, quote_string_len) == 0)
-	STORE ('\\');
-
-      c = arg[i];
-      switch (c)
-	{
-	case '\0':
-	  if (backslash_escapes)
-	    {
-	      STORE ('\\');
-	      STORE ('0');
-	      STORE ('0');
-	      c = '0';
-	    }
-	  break;
-
-	case '?':
-	  switch (quoting_style)
-	    {
-	    case shell_quoting_style:
-	      goto use_shell_always_quoting_style;
-
-	    case c_quoting_style:
-	      if (i + 2 < argsize && arg[i + 1] == '?')
-		switch (arg[i + 2])
-		  {
-		  case '!': case '\'':
-		  case '(': case ')': case '-': case '/':
-		  case '<': case '=': case '>':
-		    /* Escape the second '?' in what would otherwise be
-		       a trigraph.  */
-		    c = arg[i + 2];
-		    i += 2;
-		    STORE ('?');
-		    STORE ('\\');
-		    STORE ('?');
-		    break;
-
-		  default:
-		    break;
-		  }
-	      break;
-
-	    default:
-	      break;
-	    }
-	  break;
-
-	case '\a': esc = 'a'; goto c_escape;
-	case '\b': esc = 'b'; goto c_escape;
-	case '\f': esc = 'f'; goto c_escape;
-	case '\n': esc = 'n'; goto c_and_shell_escape;
-	case '\r': esc = 'r'; goto c_and_shell_escape;
-	case '\t': esc = 't'; goto c_and_shell_escape;
-	case '\v': esc = 'v'; goto c_escape;
-	case '\\': esc = c; goto c_and_shell_escape;
-
-	c_and_shell_escape:
-	  if (quoting_style == shell_quoting_style)
-	    goto use_shell_always_quoting_style;
-	c_escape:
-	  if (backslash_escapes)
-	    {
-	      c = esc;
-	      goto store_escape;
-	    }
-	  break;
-
-	case '{': case '}': /* sometimes special if isolated */
-	  if (! (argsize == SIZE_MAX ? arg[1] == '\0' : argsize == 1))
-	    break;
-	  /* Fall through.  */
-	case '#': case '~':
-	  if (i != 0)
-	    break;
-	  /* Fall through.  */
-	case ' ':
-	case '!': /* special in bash */
-	case '"': case '$': case '&':
-	case '(': case ')': case '*': case ';':
-	case '<':
-	case '=': /* sometimes special in 0th or (with "set -k") later args */
-	case '>': case '[':
-	case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
-	case '`': case '|':
-	  /* A shell special character.  In theory, '$' and '`' could
-	     be the first bytes of multibyte characters, which means
-	     we should check them with mbrtowc, but in practice this
-	     doesn't happen so it's not worth worrying about.  */
-	  if (quoting_style == shell_quoting_style)
-	    goto use_shell_always_quoting_style;
-	  break;
-
-	case '\'':
-	  switch (quoting_style)
-	    {
-	    case shell_quoting_style:
-	      goto use_shell_always_quoting_style;
-
-	    case shell_always_quoting_style:
-	      STORE ('\'');
-	      STORE ('\\');
-	      STORE ('\'');
-	      break;
-
-	    default:
-	      break;
-	    }
-	  break;
-
-	case '%': case '+': case ',': case '-': case '.': case '/':
-	case '0': case '1': case '2': case '3': case '4': case '5':
-	case '6': case '7': case '8': case '9': case ':':
-	case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
-	case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
-	case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
-	case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
-	case 'Y': case 'Z': case ']': case '_': case 'a': case 'b':
-	case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
-	case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
-	case 'o': case 'p': case 'q': case 'r': case 's': case 't':
-	case 'u': case 'v': case 'w': case 'x': case 'y': case 'z':
-	  /* These characters don't cause problems, no matter what the
-	     quoting style is.  They cannot start multibyte sequences.  */
-	  break;
-
-	default:
-	  /* If we have a multibyte sequence, copy it until we reach
-	     its end, find an error, or come back to the initial shift
-	     state.  For C-like styles, if the sequence has
-	     unprintable characters, escape the whole sequence, since
-	     we can't easily escape single characters within it.  */
-	  {
-	    /* Length of multibyte sequence found so far.  */
-	    size_t m;
-
-	    bool printable;
-
-	    if (unibyte_locale)
-	      {
-		m = 1;
-		printable = isprint (c) != 0;
-	      }
-	    else
-	      {
-		mbstate_t mbstate;
-		memset (&mbstate, 0, sizeof mbstate);
-
-		m = 0;
-		printable = true;
-		if (argsize == SIZE_MAX)
-		  argsize = strlen (arg);
-
-		do
-		  {
-		    wchar_t w;
-		    size_t bytes = mbrtowc (&w, &arg[i + m],
-					    argsize - (i + m), &mbstate);
-		    if (bytes == 0)
-		      break;
-		    else if (bytes == (size_t) -1)
-		      {
-			printable = false;
-			break;
-		      }
-		    else if (bytes == (size_t) -2)
-		      {
-			printable = false;
-			while (i + m < argsize && arg[i + m])
-			  m++;
-			break;
-		      }
-		    else
-		      {
-			/* Work around a bug with older shells that "see" a '\'
-			   that is really the 2nd byte of a multibyte character.
-			   In practice the problem is limited to ASCII
-			   chars >= '@' that are shell special chars.  */
-			if ('[' == 0x5b && quoting_style == shell_quoting_style)
-			  {
-			    size_t j;
-			    for (j = 1; j < bytes; j++)
-			      switch (arg[i + m + j])
-				{
-				case '[': case '\\': case '^':
-				case '`': case '|':
-				  goto use_shell_always_quoting_style;
-
-				default:
-				  break;
-				}
-			  }
-
-			if (! iswprint (w))
-			  printable = false;
-			m += bytes;
-		      }
-		  }
-		while (! mbsinit (&mbstate));
-	      }
-
-	    if (1 < m || (backslash_escapes && ! printable))
-	      {
-		/* Output a multibyte sequence, or an escaped
-		   unprintable unibyte character.  */
-		size_t ilim = i + m;
-
-		for (;;)
-		  {
-		    if (backslash_escapes && ! printable)
-		      {
-			STORE ('\\');
-			STORE ('0' + (c >> 6));
-			STORE ('0' + ((c >> 3) & 7));
-			c = '0' + (c & 7);
-		      }
-		    if (ilim <= i + 1)
-		      break;
-		    STORE (c);
-		    c = arg[++i];
-		  }
-
-		goto store_c;
-	      }
-	  }
-	}
-
-      if (! (backslash_escapes
-	     && o->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS))))
-	goto store_c;
-
-    store_escape:
-      STORE ('\\');
-
-    store_c:
-      STORE (c);
-    }
-
-  if (i == 0 && quoting_style == shell_quoting_style)
-    goto use_shell_always_quoting_style;
-
-  if (quote_string)
-    for (; *quote_string; quote_string++)
-      STORE (*quote_string);
-
-  if (len < buffersize)
-    buffer[len] = '\0';
-  return len;
-
- use_shell_always_quoting_style:
-  return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
-				   shell_always_quoting_style, o);
-}
-
-/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
-   argument ARG (of size ARGSIZE), using O to control quoting.
-   If O is null, use the default.
-   Terminate the output with a null character, and return the written
-   size of the output, not counting the terminating null.
-   If BUFFERSIZE is too small to store the output string, return the
-   value that would have been returned had BUFFERSIZE been large enough.
-   If ARGSIZE is SIZE_MAX, use the string length of the argument for
-   ARGSIZE.  */
-size_t
-quotearg_buffer (char *buffer, size_t buffersize,
-		 char const *arg, size_t argsize,
-		 struct quoting_options const *o)
-{
-  struct quoting_options const *p = o ? o : &default_quoting_options;
-  int e = errno;
-  size_t r = quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
-				       p->style, p);
-  errno = e;
-  return r;
-}
-
-/* Like quotearg_buffer (..., ARG, ARGSIZE, O), except return newly
-   allocated storage containing the quoted string.  */
-char *
-quotearg_alloc (char const *arg, size_t argsize,
-		struct quoting_options const *o)
-{
-  int e = errno;
-  size_t bufsize = quotearg_buffer (0, 0, arg, argsize, o) + 1;
-  char *buf = xmalloc (bufsize);
-  quotearg_buffer (buf, bufsize, arg, argsize, o);
-  errno = e;
-  return buf;
-}
-
-/* Use storage slot N to return a quoted version of argument ARG.
-   ARG is of size ARGSIZE, but if that is SIZE_MAX, ARG is a
-   null-terminated string.
-   OPTIONS specifies the quoting options.
-   The returned value points to static storage that can be
-   reused by the next call to this function with the same value of N.
-   N must be nonnegative.  N is deliberately declared with type "int"
-   to allow for future extensions (using negative values).  */
-static char *
-quotearg_n_options (int n, char const *arg, size_t argsize,
-		    struct quoting_options const *options)
-{
-  int e = errno;
-
-  /* Preallocate a slot 0 buffer, so that the caller can always quote
-     one small component of a "memory exhausted" message in slot 0.  */
-  static char slot0[256];
-  static unsigned int nslots = 1;
-  unsigned int n0 = n;
-  struct slotvec
-    {
-      size_t size;
-      char *val;
-    };
-  static struct slotvec slotvec0 = {sizeof slot0, slot0};
-  static struct slotvec *slotvec = &slotvec0;
-
-  if (n < 0)
-    abort ();
-
-  if (nslots <= n0)
-    {
-      /* FIXME: technically, the type of n1 should be `unsigned int',
-	 but that evokes an unsuppressible warning from gcc-4.0.1 and
-	 older.  If gcc ever provides an option to suppress that warning,
-	 revert to the original type, so that the test in xalloc_oversized
-	 is once again performed only at compile time.  */
-      size_t n1 = n0 + 1;
-
-      if (xalloc_oversized (n1, sizeof *slotvec))
-	xalloc_die ();
-
-      if (slotvec == &slotvec0)
-	{
-	  slotvec = xmalloc (sizeof *slotvec);
-	  *slotvec = slotvec0;
-	}
-      slotvec = xrealloc (slotvec, n1 * sizeof *slotvec);
-      memset (slotvec + nslots, 0, (n1 - nslots) * sizeof *slotvec);
-      nslots = n1;
-    }
-
-  {
-    size_t size = slotvec[n].size;
-    char *val = slotvec[n].val;
-    size_t qsize = quotearg_buffer (val, size, arg, argsize, options);
-
-    if (size <= qsize)
-      {
-	slotvec[n].size = size = qsize + 1;
-	if (val != slot0)
-	  free (val);
-	slotvec[n].val = val = xmalloc (size);
-	quotearg_buffer (val, size, arg, argsize, options);
-      }
-
-    errno = e;
-    return val;
-  }
-}
-
-char *
-quotearg_n (int n, char const *arg)
-{
-  return quotearg_n_options (n, arg, SIZE_MAX, &default_quoting_options);
-}
-
-char *
-quotearg (char const *arg)
-{
-  return quotearg_n (0, arg);
-}
-
-/* Return quoting options for STYLE, with no extra quoting.  */
-static struct quoting_options
-quoting_options_from_style (enum quoting_style style)
-{
-  struct quoting_options o;
-  o.style = style;
-  memset (o.quote_these_too, 0, sizeof o.quote_these_too);
-  return o;
-}
-
-char *
-quotearg_n_style (int n, enum quoting_style s, char const *arg)
-{
-  struct quoting_options const o = quoting_options_from_style (s);
-  return quotearg_n_options (n, arg, SIZE_MAX, &o);
-}
-
-char *
-quotearg_n_style_mem (int n, enum quoting_style s,
-		      char const *arg, size_t argsize)
-{
-  struct quoting_options const o = quoting_options_from_style (s);
-  return quotearg_n_options (n, arg, argsize, &o);
-}
-
-char *
-quotearg_style (enum quoting_style s, char const *arg)
-{
-  return quotearg_n_style (0, s, arg);
-}
-
-char *
-quotearg_char (char const *arg, char ch)
-{
-  struct quoting_options options;
-  options = default_quoting_options;
-  set_char_quoting (&options, ch, 1);
-  return quotearg_n_options (0, arg, SIZE_MAX, &options);
-}
-
-char *
-quotearg_colon (char const *arg)
-{
-  return quotearg_char (arg, ':');
-}
diff --git a/lib/quotearg.h b/lib/quotearg.h
deleted file mode 100644
index 24f26f7..0000000
--- a/lib/quotearg.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/* quotearg.h - quote arguments for output
-
-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 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 Paul Eggert <eggert@twinsun.com> */
-
-#ifndef QUOTEARG_H_
-# define QUOTEARG_H_ 1
-
-# include <stddef.h>
-
-/* Basic quoting styles.  */
-enum quoting_style
-  {
-    /* Output names as-is (ls --quoting-style=literal).  */
-    literal_quoting_style,
-
-    /* Quote names for the shell if they contain shell metacharacters
-       or would cause ambiguous output (ls --quoting-style=shell).  */
-    shell_quoting_style,
-
-    /* Quote names for the shell, even if they would normally not
-       require quoting (ls --quoting-style=shell-always).  */
-    shell_always_quoting_style,
-
-    /* Quote names as for a C language string (ls --quoting-style=c).  */
-    c_quoting_style,
-
-    /* Like c_quoting_style except omit the surrounding double-quote
-       characters (ls --quoting-style=escape).  */
-    escape_quoting_style,
-
-    /* Like clocale_quoting_style, but quote `like this' instead of
-       "like this" in the default C locale (ls --quoting-style=locale).  */
-    locale_quoting_style,
-
-    /* Like c_quoting_style except use quotation marks appropriate for
-       the locale (ls --quoting-style=clocale).  */
-    clocale_quoting_style
-  };
-
-/* For now, --quoting-style=literal is the default, but this may change.  */
-# ifndef DEFAULT_QUOTING_STYLE
-#  define DEFAULT_QUOTING_STYLE literal_quoting_style
-# endif
-
-/* Names of quoting styles and their corresponding values.  */
-extern char const *const quoting_style_args[];
-extern enum quoting_style const quoting_style_vals[];
-
-struct quoting_options;
-
-/* The functions listed below set and use a hidden variable
-   that contains the default quoting style options.  */
-
-/* Allocate a new set of quoting options, with contents initially identical
-   to O if O is not null, or to the default if O is null.
-   It is the caller's responsibility to free the result.  */
-struct quoting_options *clone_quoting_options (struct quoting_options *o);
-
-/* Get the value of O's quoting style.  If O is null, use the default.  */
-enum quoting_style get_quoting_style (struct quoting_options *o);
-
-/* In O (or in the default if O is null),
-   set the value of the quoting style to S.  */
-void set_quoting_style (struct quoting_options *o, enum quoting_style s);
-
-/* In O (or in the default if O is null),
-   set the value of the quoting options for character C to I.
-   Return the old value.  Currently, the only values defined for I are
-   0 (the default) and 1 (which means to quote the character even if
-   it would not otherwise be quoted).  */
-int set_char_quoting (struct quoting_options *o, char c, int i);
-
-/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
-   argument ARG (of size ARGSIZE), using O to control quoting.
-   If O is null, use the default.
-   Terminate the output with a null character, and return the written
-   size of the output, not counting the terminating null.
-   If BUFFERSIZE is too small to store the output string, return the
-   value that would have been returned had BUFFERSIZE been large enough.
-   If ARGSIZE is -1, use the string length of the argument for ARGSIZE.  */
-size_t quotearg_buffer (char *buffer, size_t buffersize,
-			char const *arg, size_t argsize,
-			struct quoting_options const *o);
-
-/* Like quotearg_buffer, except return the result in a newly allocated
-   buffer.  It is the caller's responsibility to free the result.  */
-char *quotearg_alloc (char const *arg, size_t argsize,
-		      struct quoting_options const *o);
-
-/* Use storage slot N to return a quoted version of the string ARG.
-   Use the default quoting options.
-   The returned value points to static storage that can be
-   reused by the next call to this function with the same value of N.
-   N must be nonnegative.  */
-char *quotearg_n (int n, char const *arg);
-
-/* Equivalent to quotearg_n (0, ARG).  */
-char *quotearg (char const *arg);
-
-/* Use style S and storage slot N to return a quoted version of the string ARG.
-   This is like quotearg_n (N, ARG), except that it uses S with no other
-   options to specify the quoting method.  */
-char *quotearg_n_style (int n, enum quoting_style s, char const *arg);
-
-/* Use style S and storage slot N to return a quoted version of the
-   argument ARG of size ARGSIZE.  This is like quotearg_n_style
-   (N, S, ARG), except it can quote null bytes.  */
-char *quotearg_n_style_mem (int n, enum quoting_style s,
-			    char const *arg, size_t argsize);
-
-/* Equivalent to quotearg_n_style (0, S, ARG).  */
-char *quotearg_style (enum quoting_style s, char const *arg);
-
-/* Like quotearg (ARG), except also quote any instances of CH.  */
-char *quotearg_char (char const *arg, char ch);
-
-/* Equivalent to quotearg_char (ARG, ':').  */
-char *quotearg_colon (char const *arg);
-
-#endif /* !QUOTEARG_H_ */
diff --git a/lib/stdbool_.h b/lib/stdbool_.h
deleted file mode 100644
index efa80ba..0000000
--- a/lib/stdbool_.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/* Copyright (C) 2001, 2002, 2003, 2006 Free Software Foundation, Inc.
-   Written by Bruno Haible <haible@clisp.cons.org>, 2001.
-
-   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.  */
-
-#ifndef _STDBOOL_H
-#define _STDBOOL_H
-
-/* ISO C 99 <stdbool.h> for platforms that lack it.  */
-
-/* Usage suggestions:
-
-   Programs that use <stdbool.h> should be aware of some limitations
-   and standards compliance issues.
-
-   Standards compliance:
-
-       - <stdbool.h> must be #included before 'bool', 'false', 'true'
-         can be used.
-
-       - You cannot assume that sizeof (bool) == 1.
-
-       - Programs should not undefine the macros bool, true, and false,
-         as C99 lists that as an "obsolescent feature".
-
-   Limitations of this substitute, when used in a C89 environment:
-
-       - <stdbool.h> must be #included before the '_Bool' type can be used.
-
-       - You cannot assume that _Bool is a typedef; it might be a macro.
-
-       - In C99, casts and automatic conversions to '_Bool' or 'bool' are
-         performed in such a way that every nonzero value gets converted
-         to 'true', and zero gets converted to 'false'.  This doesn't work
-         with this substitute.  With this substitute, only the values 0 and 1
-         give the expected result when converted to _Bool' or 'bool'.
-
-   Also, it is suggested that programs use 'bool' rather than '_Bool';
-   this isn't required, but 'bool' is more common.  */
-
-
-/* 7.16. Boolean type and values */
-
-/* BeOS <sys/socket.h> already #defines false 0, true 1.  We use the same
-   definitions below, but temporarily we have to #undef them.  */
-#ifdef __BEOS__
-# include <OS.h> /* defines bool but not _Bool */
-# undef false
-# undef true
-#endif
-
-/* For the sake of symbolic names in gdb, we define true and false as
-   enum constants, not only as macros.
-   It is tempting to write
-      typedef enum { false = 0, true = 1 } _Bool;
-   so that gdb prints values of type 'bool' symbolically. But if we do
-   this, values of type '_Bool' may promote to 'int' or 'unsigned int'
-   (see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int'
-   (see ISO C 99 6.3.1.1.(2)).  So we add a negative value to the
-   enum; this ensures that '_Bool' promotes to 'int'.  */
-#if defined __cplusplus || defined __BEOS__
-  /* A compiler known to have 'bool'.  */
-  /* If the compiler already has both 'bool' and '_Bool', we can assume they
-     are the same types.  */
-# if !@HAVE__BOOL@
-typedef bool _Bool;
-# endif
-#else
-# if !defined __GNUC__
-   /* If @HAVE__BOOL@:
-        Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when
-        the built-in _Bool type is used.  See
-          http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
-          http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
-          http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
-        Similar bugs are likely with other compilers as well; this file
-        wouldn't be used if <stdbool.h> was working.
-        So we override the _Bool type.
-      If !@HAVE__BOOL@:
-        Need to define _Bool ourselves. As 'signed char' or as an enum type?
-        Use of a typedef, with SunPRO C, leads to a stupid
-          "warning: _Bool is a keyword in ISO C99".
-        Use of an enum type, with IRIX cc, leads to a stupid
-          "warning(1185): enumerated type mixed with another type".
-        The only benefit of the enum type, debuggability, is not important
-        with these compilers.  So use 'signed char' and no typedef.  */
-#  define _Bool signed char
-enum { false = 0, true = 1 };
-# else
-   /* With this compiler, trust the _Bool type if the compiler has it.  */
-#  if !@HAVE__BOOL@
-typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
-#  endif
-# endif
-#endif
-#define bool _Bool
-
-/* The other macros must be usable in preprocessor directives.  */
-#define false 0
-#define true 1
-#define __bool_true_false_are_defined 1
-
-#endif /* _STDBOOL_H */
diff --git a/lib/stdio--.h b/lib/stdio--.h
deleted file mode 100644
index b2765fd..0000000
--- a/lib/stdio--.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Like stdio.h, but redefine some names to avoid glitches.
-
-   Copyright (C) 2005 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 Paul Eggert.  */
-
-#include <stdio.h>
-#include "stdio-safer.h"
-
-#undef fopen
-#define fopen fopen_safer
diff --git a/lib/stdio-safer.h b/lib/stdio-safer.h
deleted file mode 100644
index 0b9a9ab..0000000
--- a/lib/stdio-safer.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Invoke stdio functions, but avoid some glitches.
-
-   Copyright (C) 2001, 2003 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 Paul Eggert.  */
-
-#include <stdio.h>
-
-FILE *fopen_safer (char const *, char const *);
diff --git a/lib/stpcpy.c b/lib/stpcpy.c
deleted file mode 100644
index acda21a..0000000
--- a/lib/stpcpy.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* stpcpy.c -- copy a string and return pointer to end of new string
-   Copyright (C) 1992, 1995, 1997, 1998 Free Software Foundation, Inc.
-
-   NOTE: The canonical source of this file is maintained with the GNU C Library.
-   Bugs can be reported to bug-glibc@prep.ai.mit.edu.
-
-   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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <string.h>
-
-#undef __stpcpy
-#undef stpcpy
-
-#ifndef weak_alias
-# define __stpcpy stpcpy
-#endif
-
-/* Copy SRC to DEST, returning the address of the terminating '\0' in DEST.  */
-char *
-__stpcpy (char *dest, const char *src)
-{
-  register char *d = dest;
-  register const char *s = src;
-
-  do
-    *d++ = *s;
-  while (*s++ != '\0');
-
-  return d - 1;
-}
-#ifdef weak_alias
-weak_alias (__stpcpy, stpcpy)
-#endif
diff --git a/lib/stpcpy.h b/lib/stpcpy.h
deleted file mode 100644
index 53c4ce0..0000000
--- a/lib/stpcpy.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* String copying.
-   Copyright (C) 1995, 2001, 2003 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.  */
-
-#ifndef _STPCPY_H
-#define _STPCPY_H
-
-#if HAVE_STPCPY
-
-/* Get stpcpy() declaration.  */
-#include <string.h>
-
-#else
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Copy SRC to DST, returning the address of the terminating '\0' in DST.  */
-extern char *stpcpy (char *dst, const char *src);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
-#endif /* _STPCPY_H */
diff --git a/lib/strdup.c b/lib/strdup.c
deleted file mode 100644
index d6d0116..0000000
--- a/lib/strdup.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Copyright (C) 1991, 1996, 1997, 1998, 2002, 2003, 2004 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 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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#ifndef _LIBC
-/* Get specification.  */
-# include "strdup.h"
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#undef __strdup
-#undef strdup
-
-#ifndef weak_alias
-# define __strdup strdup
-#endif
-
-/* Duplicate S, returning an identical malloc'd string.  */
-char *
-__strdup (const char *s)
-{
-  size_t len = strlen (s) + 1;
-  void *new = malloc (len);
-
-  if (new == NULL)
-    return NULL;
-
-  return (char *) memcpy (new, s, len);
-}
-#ifdef libc_hidden_def
-libc_hidden_def (__strdup)
-#endif
-#ifdef weak_alias
-weak_alias (__strdup, strdup)
-#endif
diff --git a/lib/strdup.h b/lib/strdup.h
deleted file mode 100644
index a0d5fb9..0000000
--- a/lib/strdup.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* strdup.h -- duplicate a string
-   Copyright (C) 2004 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.  */
-
-#ifndef STRDUP_H_
-#define STRDUP_H_
-
-/* Get strdup declaration, if available.  */
-#include <string.h>
-
-#if defined HAVE_DECL_STRDUP && !HAVE_DECL_STRDUP && !defined strdup
-/* Duplicate S, returning an identical malloc'd string.  */
-extern char *strdup (const char *s);
-#endif
-
-#endif /* STRDUP_H_ */
diff --git a/lib/strerror.c b/lib/strerror.c
deleted file mode 100644
index 623821d..0000000
--- a/lib/strerror.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* strerror.c --- ANSI C compatible system error routine
-
-   Copyright (C) 1986, 1988, 1989, 1991, 2002, 2003 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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <limits.h>
-
-/* Don't include <stdio.h>, since it may or may not declare
-   sys_errlist and its declarations may collide with ours.  Just
-   declare the stuff that we need directly.  Standard hosted C89
-   implementations define strerror and they don't need this strerror
-   function, so take some liberties with the standard to cater to
-   ancient or limited freestanding implementations.  */
-int sprintf (char *, char const *, ...);
-extern int sys_nerr;
-extern char *sys_errlist[];
-
-char *
-strerror (int n)
-{
-  static char const fmt[] = "Unknown error (%d)";
-  static char mesg[sizeof fmt + sizeof n * CHAR_BIT / 3];
-
-  if (n < 0 || n >= sys_nerr)
-    {
-      sprintf (mesg, fmt, n);
-      return mesg;
-    }
-  else
-    return sys_errlist[n];
-}
diff --git a/lib/stripslash.c b/lib/stripslash.c
deleted file mode 100644
index 9b55da4..0000000
--- a/lib/stripslash.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* stripslash.c -- remove redundant trailing slashes from a file name
-
-   Copyright (C) 1990, 2001, 2003, 2004, 2005 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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "dirname.h"
-
-/* Remove trailing slashes from FILE.
-   Return true if a trailing slash was removed.
-   This is useful when using file name completion from a shell that
-   adds a "/" after directory names (such as tcsh and bash), because
-   the Unix rename and rmdir system calls return an "Invalid argument" error
-   when given a file that ends in "/" (except for the root directory).  */
-
-bool
-strip_trailing_slashes (char *file)
-{
-  char *base = base_name (file);
-  char *base_lim = base + base_len (base);
-  bool had_slash = (*base_lim != '\0');
-  *base_lim = '\0';
-  return had_slash;
-}
diff --git a/lib/strndup.c b/lib/strndup.c
deleted file mode 100644
index 2626373..0000000
--- a/lib/strndup.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2005, 2006 Free
-   Software Foundation, Inc.
-
-   NOTE: The canonical source of this file is maintained with the GNU C Library.
-   Bugs can be reported to bug-glibc@prep.ai.mit.edu.
-
-   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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-#if !_LIBC
-# include "strndup.h"
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#if !_LIBC
-# include "strnlen.h"
-# ifndef __strnlen
-#  define __strnlen strnlen
-# endif
-#endif
-
-#undef __strndup
-#if _LIBC
-# undef strndup
-#endif
-
-#ifndef weak_alias
-# define __strndup strndup
-#endif
-
-char *
-__strndup (s, n)
-     const char *s;
-     size_t n;
-{
-  size_t len = __strnlen (s, n);
-  char *new = malloc (len + 1);
-
-  if (new == NULL)
-    return NULL;
-
-  new[len] = '\0';
-  return memcpy (new, s, len);
-}
-#ifdef libc_hidden_def
-libc_hidden_def (__strndup)
-#endif
-#ifdef weak_alias
-weak_alias (__strndup, strndup)
-#endif
diff --git a/lib/strndup.h b/lib/strndup.h
deleted file mode 100644
index 8eae493..0000000
--- a/lib/strndup.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Duplicate a size-bounded string.
-   Copyright (C) 2003 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.  */
-
-#if HAVE_STRNDUP
-
-/* Get strndup() declaration.  */
-#include <string.h>
-
-#else
-
-#include <stddef.h>
-
-/* Return a newly allocated copy of at most N bytes of STRING.  */
-extern char *strndup (const char *string, size_t n);
-
-#endif
diff --git a/lib/strnlen.c b/lib/strnlen.c
deleted file mode 100644
index 09ba788..0000000
--- a/lib/strnlen.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Find the length of STRING, but scan at most MAXLEN characters.
-   Copyright (C) 2005, 2006 Free Software Foundation, Inc.
-   Written by Simon Josefsson.
-
-   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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "strnlen.h"
-
-/* Find the length of STRING, but scan at most MAXLEN characters.
-   If no '\0' terminator is found in that many characters, return MAXLEN.  */
-
-size_t
-strnlen (const char *string, size_t maxlen)
-{
-  const char *end = memchr (string, '\0', maxlen);
-  return end ? (size_t) (end - string) : maxlen;
-}
diff --git a/lib/strnlen.h b/lib/strnlen.h
deleted file mode 100644
index ba74dba..0000000
--- a/lib/strnlen.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Find the length of STRING, but scan at most MAXLEN characters.
-   Copyright (C) 2005 Free Software Foundation, Inc.
-   Written by Simon Josefsson.
-
-   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.  */
-
-#ifndef STRNLEN_H
-#define STRNLEN_H
-
-/* Get strnlen declaration, if available.  */
-#include <string.h>
-
-#if defined HAVE_DECL_STRNLEN && !HAVE_DECL_STRNLEN
-/* Find the length (number of bytes) of STRING, but scan at most
-   MAXLEN bytes.  If no '\0' terminator is found in that many bytes,
-   return MAXLEN.  */
-extern size_t strnlen(const char *string, size_t maxlen);
-#endif
-
-#endif /* STRNLEN_H */
diff --git a/lib/strtol.c b/lib/strtol.c
deleted file mode 100644
index 9bfbe3c..0000000
--- a/lib/strtol.c
+++ /dev/null
@@ -1,447 +0,0 @@
-/* Convert string representation of a number into an integer value.
-
-   Copyright (C) 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2003, 2005
-   Free Software Foundation, Inc.
-
-   NOTE: The canonical source of this file is maintained with the GNU C
-   Library.  Bugs can be reported to bug-glibc@gnu.org.
-
-   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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#ifdef _LIBC
-# define USE_NUMBER_GROUPING
-#endif
-
-#include <ctype.h>
-#include <errno.h>
-#ifndef errno
-extern int errno;
-#endif
-#ifndef __set_errno
-# define __set_errno(Val) errno = (Val)
-#endif
-
-#include <limits.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef USE_NUMBER_GROUPING
-# include "../locale/localeinfo.h"
-#endif
-
-/* Nonzero if we are defining `strtoul' or `strtoull', operating on
-   unsigned integers.  */
-#ifndef UNSIGNED
-# define UNSIGNED 0
-# define INT LONG int
-#else
-# define INT unsigned LONG int
-#endif
-
-/* Determine the name.  */
-#ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# if UNSIGNED
-#  ifdef USE_WIDE_CHAR
-#   ifdef QUAD
-#    define strtol __wcstoull_l
-#   else
-#    define strtol __wcstoul_l
-#   endif
-#  else
-#   ifdef QUAD
-#    define strtol __strtoull_l
-#   else
-#    define strtol __strtoul_l
-#   endif
-#  endif
-# else
-#  ifdef USE_WIDE_CHAR
-#   ifdef QUAD
-#    define strtol __wcstoll_l
-#   else
-#    define strtol __wcstol_l
-#   endif
-#  else
-#   ifdef QUAD
-#    define strtol __strtoll_l
-#   else
-#    define strtol __strtol_l
-#   endif
-#  endif
-# endif
-#else
-# if UNSIGNED
-#  ifdef USE_WIDE_CHAR
-#   ifdef QUAD
-#    define strtol wcstoull
-#   else
-#    define strtol wcstoul
-#   endif
-#  else
-#   ifdef QUAD
-#    define strtol strtoull
-#   else
-#    define strtol strtoul
-#   endif
-#  endif
-# else
-#  ifdef USE_WIDE_CHAR
-#   ifdef QUAD
-#    define strtol wcstoll
-#   else
-#    define strtol wcstol
-#   endif
-#  else
-#   ifdef QUAD
-#    define strtol strtoll
-#   endif
-#  endif
-# endif
-#endif
-
-/* If QUAD is defined, we are defining `strtoll' or `strtoull',
-   operating on `long long int's.  */
-#ifdef QUAD
-# define LONG long long
-# define STRTOL_LONG_MIN LONG_LONG_MIN
-# define STRTOL_LONG_MAX LONG_LONG_MAX
-# define STRTOL_ULONG_MAX ULONG_LONG_MAX
-
-/* The extra casts in the following macros work around compiler bugs,
-   e.g., in Cray C 5.0.3.0.  */
-
-/* True if negative values of the signed integer type T use two's
-   complement, ones' complement, or signed magnitude representation,
-   respectively.  Much GNU code assumes two's complement, but some
-   people like to be portable to all possible C hosts.  */
-# define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
-# define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
-# define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
-
-/* True if the arithmetic type T is signed.  */
-# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
-
-/* The maximum and minimum values for the integer type T.  These
-   macros have undefined behavior if T is signed and has padding bits.
-   If this is a problem for you, please let us know how to fix it for
-   your host.  */
-# define TYPE_MINIMUM(t) \
-   ((t) (! TYPE_SIGNED (t) \
-	 ? (t) 0 \
-	 : TYPE_SIGNED_MAGNITUDE (t) \
-	 ? ~ (t) 0 \
-	 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))
-# define TYPE_MAXIMUM(t) \
-   ((t) (! TYPE_SIGNED (t) \
-	 ? (t) -1 \
-	 : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
-
-# ifndef ULONG_LONG_MAX
-#  define ULONG_LONG_MAX TYPE_MAXIMUM (unsigned long long)
-# endif
-# ifndef LONG_LONG_MAX
-#  define LONG_LONG_MAX TYPE_MAXIMUM (long long int)
-# endif
-# ifndef LONG_LONG_MIN
-#  define LONG_LONG_MIN TYPE_MINIMUM (long long int)
-# endif
-
-# if __GNUC__ == 2 && __GNUC_MINOR__ < 7
-   /* Work around gcc bug with using this constant.  */
-   static const unsigned long long int maxquad = ULONG_LONG_MAX;
-#  undef STRTOL_ULONG_MAX
-#  define STRTOL_ULONG_MAX maxquad
-# endif
-#else
-# define LONG long
-# define STRTOL_LONG_MIN LONG_MIN
-# define STRTOL_LONG_MAX LONG_MAX
-# define STRTOL_ULONG_MAX ULONG_MAX
-#endif
-
-
-/* We use this code also for the extended locale handling where the
-   function gets as an additional argument the locale which has to be
-   used.  To access the values we have to redefine the _NL_CURRENT
-   macro.  */
-#ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# undef _NL_CURRENT
-# define _NL_CURRENT(category, item) \
-  (current->values[_NL_ITEM_INDEX (item)].string)
-# define LOCALE_PARAM , loc
-# define LOCALE_PARAM_PROTO , __locale_t loc
-#else
-# define LOCALE_PARAM
-# define LOCALE_PARAM_PROTO
-#endif
-
-#if defined _LIBC || defined HAVE_WCHAR_H
-# include <wchar.h>
-#endif
-
-#ifdef USE_WIDE_CHAR
-# include <wctype.h>
-# define L_(Ch) L##Ch
-# define UCHAR_TYPE wint_t
-# define STRING_TYPE wchar_t
-# ifdef USE_IN_EXTENDED_LOCALE_MODEL
-#  define ISSPACE(Ch) __iswspace_l ((Ch), loc)
-#  define ISALPHA(Ch) __iswalpha_l ((Ch), loc)
-#  define TOUPPER(Ch) __towupper_l ((Ch), loc)
-# else
-#  define ISSPACE(Ch) iswspace (Ch)
-#  define ISALPHA(Ch) iswalpha (Ch)
-#  define TOUPPER(Ch) towupper (Ch)
-# endif
-#else
-# if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII)
-#  define IN_CTYPE_DOMAIN(c) 1
-# else
-#  define IN_CTYPE_DOMAIN(c) isascii(c)
-# endif
-# define L_(Ch) Ch
-# define UCHAR_TYPE unsigned char
-# define STRING_TYPE char
-# ifdef USE_IN_EXTENDED_LOCALE_MODEL
-#  define ISSPACE(Ch) __isspace_l ((Ch), loc)
-#  define ISALPHA(Ch) __isalpha_l ((Ch), loc)
-#  define TOUPPER(Ch) __toupper_l ((Ch), loc)
-# else
-#  define ISSPACE(Ch) (IN_CTYPE_DOMAIN (Ch) && isspace (Ch))
-#  define ISALPHA(Ch) (IN_CTYPE_DOMAIN (Ch) && isalpha (Ch))
-#  define TOUPPER(Ch) (IN_CTYPE_DOMAIN (Ch) ? toupper (Ch) : (Ch))
-# endif
-#endif
-
-#define INTERNAL(X) INTERNAL1(X)
-#define INTERNAL1(X) __##X##_internal
-#define WEAKNAME(X) WEAKNAME1(X)
-
-#ifdef USE_NUMBER_GROUPING
-/* This file defines a function to check for correct grouping.  */
-# include "grouping.h"
-#endif
-
-
-
-/* Convert NPTR to an `unsigned long int' or `long int' in base BASE.
-   If BASE is 0 the base is determined by the presence of a leading
-   zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
-   If BASE is < 2 or > 36, it is reset to 10.
-   If ENDPTR is not NULL, a pointer to the character after the last
-   one converted is stored in *ENDPTR.  */
-
-INT
-INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
-		   int base, int group LOCALE_PARAM_PROTO)
-{
-  int negative;
-  register unsigned LONG int cutoff;
-  register unsigned int cutlim;
-  register unsigned LONG int i;
-  register const STRING_TYPE *s;
-  register UCHAR_TYPE c;
-  const STRING_TYPE *save, *end;
-  int overflow;
-
-#ifdef USE_NUMBER_GROUPING
-# ifdef USE_IN_EXTENDED_LOCALE_MODEL
-  struct locale_data *current = loc->__locales[LC_NUMERIC];
-# endif
-  /* The thousands character of the current locale.  */
-  wchar_t thousands = L'\0';
-  /* The numeric grouping specification of the current locale,
-     in the format described in <locale.h>.  */
-  const char *grouping;
-
-  if (group)
-    {
-      grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
-      if (*grouping <= 0 || *grouping == CHAR_MAX)
-	grouping = NULL;
-      else
-	{
-	  /* Figure out the thousands separator character.  */
-# if defined _LIBC || defined _HAVE_BTOWC
-	  thousands = __btowc (*_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP));
-	  if (thousands == WEOF)
-	    thousands = L'\0';
-# endif
-	  if (thousands == L'\0')
-	    grouping = NULL;
-	}
-    }
-  else
-    grouping = NULL;
-#endif
-
-  if (base < 0 || base == 1 || base > 36)
-    {
-      __set_errno (EINVAL);
-      return 0;
-    }
-
-  save = s = nptr;
-
-  /* Skip white space.  */
-  while (ISSPACE (*s))
-    ++s;
-  if (*s == L_('\0'))
-    goto noconv;
-
-  /* Check for a sign.  */
-  if (*s == L_('-'))
-    {
-      negative = 1;
-      ++s;
-    }
-  else if (*s == L_('+'))
-    {
-      negative = 0;
-      ++s;
-    }
-  else
-    negative = 0;
-
-  /* Recognize number prefix and if BASE is zero, figure it out ourselves.  */
-  if (*s == L_('0'))
-    {
-      if ((base == 0 || base == 16) && TOUPPER (s[1]) == L_('X'))
-	{
-	  s += 2;
-	  base = 16;
-	}
-      else if (base == 0)
-	base = 8;
-    }
-  else if (base == 0)
-    base = 10;
-
-  /* Save the pointer so we can check later if anything happened.  */
-  save = s;
-
-#ifdef USE_NUMBER_GROUPING
-  if (group)
-    {
-      /* Find the end of the digit string and check its grouping.  */
-      end = s;
-      for (c = *end; c != L_('\0'); c = *++end)
-	if ((wchar_t) c != thousands
-	    && ((wchar_t) c < L_('0') || (wchar_t) c > L_('9'))
-	    && (!ISALPHA (c) || (int) (TOUPPER (c) - L_('A') + 10) >= base))
-	  break;
-      if (*s == thousands)
-	end = s;
-      else
-	end = correctly_grouped_prefix (s, end, thousands, grouping);
-    }
-  else
-#endif
-    end = NULL;
-
-  cutoff = STRTOL_ULONG_MAX / (unsigned LONG int) base;
-  cutlim = STRTOL_ULONG_MAX % (unsigned LONG int) base;
-
-  overflow = 0;
-  i = 0;
-  for (c = *s; c != L_('\0'); c = *++s)
-    {
-      if (s == end)
-	break;
-      if (c >= L_('0') && c <= L_('9'))
-	c -= L_('0');
-      else if (ISALPHA (c))
-	c = TOUPPER (c) - L_('A') + 10;
-      else
-	break;
-      if ((int) c >= base)
-	break;
-      /* Check for overflow.  */
-      if (i > cutoff || (i == cutoff && c > cutlim))
-	overflow = 1;
-      else
-	{
-	  i *= (unsigned LONG int) base;
-	  i += c;
-	}
-    }
-
-  /* Check if anything actually happened.  */
-  if (s == save)
-    goto noconv;
-
-  /* Store in ENDPTR the address of one character
-     past the last character we converted.  */
-  if (endptr != NULL)
-    *endptr = (STRING_TYPE *) s;
-
-#if !UNSIGNED
-  /* Check for a value that is within the range of
-     `unsigned LONG int', but outside the range of `LONG int'.  */
-  if (overflow == 0
-      && i > (negative
-	      ? -((unsigned LONG int) (STRTOL_LONG_MIN + 1)) + 1
-	      : (unsigned LONG int) STRTOL_LONG_MAX))
-    overflow = 1;
-#endif
-
-  if (overflow)
-    {
-      __set_errno (ERANGE);
-#if UNSIGNED
-      return STRTOL_ULONG_MAX;
-#else
-      return negative ? STRTOL_LONG_MIN : STRTOL_LONG_MAX;
-#endif
-    }
-
-  /* Return the result of the appropriate sign.  */
-  return negative ? -i : i;
-
-noconv:
-  /* We must handle a special case here: the base is 0 or 16 and the
-     first two characters are '0' and 'x', but the rest are no
-     hexadecimal digits.  This is no error case.  We return 0 and
-     ENDPTR points to the `x`.  */
-  if (endptr != NULL)
-    {
-      if (save - nptr >= 2 && TOUPPER (save[-1]) == L_('X')
-	  && save[-2] == L_('0'))
-	*endptr = (STRING_TYPE *) &save[-1];
-      else
-	/*  There was no number to convert.  */
-	*endptr = (STRING_TYPE *) nptr;
-    }
-
-  return 0L;
-}
-
-/* External user entry point.  */
-
-
-INT
-#ifdef weak_function
-weak_function
-#endif
-strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr,
-	int base LOCALE_PARAM_PROTO)
-{
-  return INTERNAL (strtol) (nptr, endptr, base, 0 LOCALE_PARAM);
-}
diff --git a/lib/strtoul.c b/lib/strtoul.c
deleted file mode 100644
index 79ceed2..0000000
--- a/lib/strtoul.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Copyright (C) 1991, 1997 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 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.  */
-
-#define	UNSIGNED	1
-
-#include "strtol.c"
diff --git a/lib/strverscmp.c b/lib/strverscmp.c
deleted file mode 100644
index 6276bca..0000000
--- a/lib/strverscmp.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/* Compare strings while treating digits characters numerically.
-   Copyright (C) 1997, 2000, 2002, 2004 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Jean-François Bignolles <bignolle@ecoledoc.ibp.fr>, 1997.
-
-   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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <string.h>
-#include <ctype.h>
-
-/* states: S_N: normal, S_I: comparing integral part, S_F: comparing
-           fractional parts, S_Z: idem but with leading Zeroes only */
-#define S_N    0x0
-#define S_I    0x4
-#define S_F    0x8
-#define S_Z    0xC
-
-/* result_type: CMP: return diff; LEN: compare using len_diff/diff */
-#define CMP    2
-#define LEN    3
-
-
-/* ISDIGIT differs from isdigit, as follows:
-   - Its arg may be any int or unsigned int; it need not be an unsigned char.
-   - It's guaranteed to evaluate its argument exactly once.
-   - It's typically faster.
-   POSIX says that only '0' through '9' are digits.  Prefer ISDIGIT to
-   ISDIGIT_LOCALE unless it's important to use the locale's definition
-   of `digit' even when the host does not conform to POSIX.  */
-#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
-
-#undef __strverscmp
-#undef strverscmp
-
-#ifndef weak_alias
-# define __strverscmp strverscmp
-#endif
-
-/* Compare S1 and S2 as strings holding indices/version numbers,
-   returning less than, equal to or greater than zero if S1 is less than,
-   equal to or greater than S2 (for more info, see the texinfo doc).
-*/
-
-int
-__strverscmp (const char *s1, const char *s2)
-{
-  const unsigned char *p1 = (const unsigned char *) s1;
-  const unsigned char *p2 = (const unsigned char *) s2;
-  unsigned char c1, c2;
-  int state;
-  int diff;
-
-  /* Symbol(s)    0       [1-9]   others  (padding)
-     Transition   (10) 0  (01) d  (00) x  (11) -   */
-  static const unsigned int next_state[] =
-  {
-      /* state    x    d    0    - */
-      /* S_N */  S_N, S_I, S_Z, S_N,
-      /* S_I */  S_N, S_I, S_I, S_I,
-      /* S_F */  S_N, S_F, S_F, S_F,
-      /* S_Z */  S_N, S_F, S_Z, S_Z
-  };
-
-  static const int result_type[] =
-  {
-      /* state   x/x  x/d  x/0  x/-  d/x  d/d  d/0  d/-
-                 0/x  0/d  0/0  0/-  -/x  -/d  -/0  -/- */
-
-      /* S_N */  CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
-                 CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
-      /* S_I */  CMP, -1,  -1,  CMP,  1,  LEN, LEN, CMP,
-                  1,  LEN, LEN, CMP, CMP, CMP, CMP, CMP,
-      /* S_F */  CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
-                 CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
-      /* S_Z */  CMP,  1,   1,  CMP, -1,  CMP, CMP, CMP,
-                 -1,  CMP, CMP, CMP
-  };
-
-  if (p1 == p2)
-    return 0;
-
-  c1 = *p1++;
-  c2 = *p2++;
-  /* Hint: '0' is a digit too.  */
-  state = S_N | ((c1 == '0') + (ISDIGIT (c1) != 0));
-
-  while ((diff = c1 - c2) == 0 && c1 != '\0')
-    {
-      state = next_state[state];
-      c1 = *p1++;
-      c2 = *p2++;
-      state |= (c1 == '0') + (ISDIGIT (c1) != 0);
-    }
-
-  state = result_type[state << 2 | ((c2 == '0') + (ISDIGIT (c2) != 0))];
-
-  switch (state)
-    {
-    case CMP:
-      return diff;
-
-    case LEN:
-      while (ISDIGIT (*p1++))
-	if (!ISDIGIT (*p2++))
-	  return 1;
-
-      return ISDIGIT (*p2) ? -1 : diff;
-
-    default:
-      return state;
-    }
-}
-#ifdef weak_alias
-weak_alias (__strverscmp, strverscmp)
-#endif
diff --git a/lib/strverscmp.h b/lib/strverscmp.h
deleted file mode 100644
index 7edeac5..0000000
--- a/lib/strverscmp.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Compare strings while treating digits characters numerically.
-
-   Copyright (C) 1997, 2003 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.  */
-
-#ifndef STRVERSCMP_H_
-# define STRVERSCMP_H_
-
-int strverscmp (const char *, const char *);
-
-#endif /* not STRVERSCMP_H_ */
diff --git a/lib/subpipe.c b/lib/subpipe.c
deleted file mode 100644
index 646aa8e..0000000
--- a/lib/subpipe.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/* Subprocesses with pipes.
-
-   Copyright (C) 2002, 2004, 2005, 2006 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 Paul Eggert <eggert@twinsun.com>
-   and Florian Krohm <florian@edamail.fishkill.ibm.com>.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "subpipe.h"
-
-#include <errno.h>
-
-#include <signal.h>
-#if ! defined SIGCHLD && defined SIGCLD
-# define SIGCHLD SIGCLD
-#endif
-
-#include <stdlib.h>
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-#ifndef STDIN_FILENO
-# define STDIN_FILENO 0
-#endif
-#ifndef STDOUT_FILENO
-# define STDOUT_FILENO 1
-#endif
-#if ! HAVE_DUP2 && ! defined dup2
-# include <fcntl.h>
-# define dup2(f, t) (close (t), fcntl (f, F_DUPFD, t))
-#endif
-
-#if HAVE_SYS_WAIT_H
-# include <sys/wait.h>
-#endif
-#ifndef WEXITSTATUS
-# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
-#endif
-#ifndef WIFEXITED
-# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
-#endif
-
-#if HAVE_VFORK_H
-# include <vfork.h>
-#endif
-#if ! HAVE_WORKING_VFORK
-# define vfork fork
-#endif
-
-#include "error.h"
-#include "unistd-safer.h"
-
-#include "gettext.h"
-#define _(Msgid)  gettext (Msgid)
-
-#ifndef __attribute__
-/* This feature is available in gcc versions 2.5 and later.  */
-# if ! defined __GNUC__ || __GNUC__ < 2 || \
-(__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
-#  define __attribute__(Spec) /* empty */
-# endif
-#endif
-
-#ifndef ATTRIBUTE_UNUSED
-# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
-#endif
-
-
-/* Initialize this module.  */
-
-void
-init_subpipe (void)
-{
-#ifdef SIGCHLD
-  /* System V fork+wait does not work if SIGCHLD is ignored.  */
-  signal (SIGCHLD, SIG_DFL);
-#endif
-}
-
-
-/* Create a subprocess that is run as a filter.  ARGV is the
-   NULL-terminated argument vector for the subprocess.  Store read and
-   write file descriptors for communication with the subprocess into
-   FD[0] and FD[1]: input meant for the process can be written into
-   FD[0], and output from the process can be read from FD[1].  Return
-   the subprocess id.
-
-   To avoid deadlock, the invoker must not let incoming data pile up
-   in FD[1] while writing data to FD[0].  */
-
-pid_t
-create_subpipe (char const * const *argv, int fd[2])
-{
-  int pipe_fd[2];
-  int child_fd[2];
-  pid_t pid;
-
-  if (pipe (child_fd) != 0
-      || (child_fd[0] = fd_safer (child_fd[0])) < 0
-      || (fd[0] = fd_safer (child_fd[1])) < 0
-      || pipe (pipe_fd) != 0
-      || (fd[1] = fd_safer (pipe_fd[0])) < 0
-      || (child_fd[1] = fd_safer (pipe_fd[1])) < 0)
-    error (EXIT_FAILURE, errno,
-	   "pipe");
-
-  pid = vfork ();
-  if (pid < 0)
-    error (EXIT_FAILURE, errno,
-	   "fork");
-
-  if (! pid)
-    {
-      /* Child.  */
-      close (fd[0]);
-      close (fd[1]);
-      dup2 (child_fd[0], STDIN_FILENO);
-      close (child_fd[0]);
-      dup2 (child_fd[1], STDOUT_FILENO);
-      close (child_fd[1]);
-
-      /* The cast to (char **) rather than (char * const *) is needed
-	 for portability to older hosts with a nonstandard prototype
-	 for execvp.  */
-      execvp (argv[0], (char **) argv);
-
-      _exit (errno == ENOENT ? 127 : 126);
-    }
-
-  /* Parent.  */
-  close (child_fd[0]);
-  close (child_fd[1]);
-  return pid;
-}
-
-
-/* Wait for the subprocess to exit.  */
-
-void
-reap_subpipe (pid_t pid, char const *program)
-{
-#if HAVE_WAITPID || defined waitpid
-  int wstatus;
-  if (waitpid (pid, &wstatus, 0) < 0)
-    error (EXIT_FAILURE, errno,
-	   "waitpid");
-  else
-    {
-      int status = WIFEXITED (wstatus) ? WEXITSTATUS (wstatus) : -1;
-      if (status)
-	error (EXIT_FAILURE, 0,
-	       _(status == 126
-		 ? "subsidiary program `%s' could not be invoked"
-		 : status == 127
-		 ? "subsidiary program `%s' not found"
-		 : status < 0
-		 ? "subsidiary program `%s' failed"
-		 : "subsidiary program `%s' failed (exit status %d)"),
-	       program, status);
-    }
-#endif
-}
-
-void
-end_of_output_subpipe (pid_t pid ATTRIBUTE_UNUSED,
-		       int fd[2] ATTRIBUTE_UNUSED)
-{
-}
diff --git a/lib/subpipe.h b/lib/subpipe.h
deleted file mode 100644
index 1083d32..0000000
--- a/lib/subpipe.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Subprocesses with pipes.
-   Copyright (C) 2002, 2004, 2005 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 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, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-/* Written by Paul Eggert <eggert@twinsun.com>
-   and Florian Krohm <florian@edamail.fishkill.ibm.com>.  */
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-void init_subpipe (void);
-pid_t create_subpipe (char const * const *, int[2]);
-void end_of_output_subpipe (pid_t, int[2]);
-void reap_subpipe (pid_t, char const *);
diff --git a/lib/timevar.c b/lib/timevar.c
deleted file mode 100644
index d9b533c..0000000
--- a/lib/timevar.c
+++ /dev/null
@@ -1,565 +0,0 @@
-/* Timing variables for measuring compiler performance.
-   Copyright (C) 2000, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
-   Contributed by Alex Samuel <samuel@codesourcery.com>
-
-   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 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, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if IN_GCC
-
-#include "system.h"
-#include "intl.h"
-#include "rtl.h"
-
-#else
-
-/* This source file is taken from the GCC source code, with slight
-   modifications that are under control of the IN_GCC preprocessor
-   variable.  The !IN_GCC part of this file is specific to Bison.  */
-
-# include "../src/system.h"
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# endif
-int timevar_report = 0;
-
-#endif
-
-
-#ifdef HAVE_SYS_TIMES_H
-# include <sys/times.h>
-#endif
-#ifdef HAVE_SYS_RESOURCE_H
-#include <sys/resource.h>
-#endif
-
-#ifndef HAVE_CLOCK_T
-typedef int clock_t;
-#endif
-
-#ifndef HAVE_STRUCT_TMS
-struct tms
-{
-  clock_t tms_utime;
-  clock_t tms_stime;
-  clock_t tms_cutime;
-  clock_t tms_cstime;
-};
-#endif
-
-#if defined HAVE_DECL_GETRUSAGE && !HAVE_DECL_GETRUSAGE
-extern int getrusage (int, struct rusage *);
-#endif
-#if defined HAVE_DECL_TIMES && !HAVE_DECL_TIMES
-extern clock_t times (struct tms *);
-#endif
-#if defined HAVE_DECL_CLOCK && !HAVE_DECL_CLOCK
-extern clock_t clock (void);
-#endif
-
-#ifndef RUSAGE_SELF
-# define RUSAGE_SELF 0
-#endif
-
-/* Calculation of scale factor to convert ticks to microseconds.
-   We mustn't use CLOCKS_PER_SEC except with clock().  */
-#if HAVE_SYSCONF && defined _SC_CLK_TCK
-# define TICKS_PER_SECOND sysconf (_SC_CLK_TCK) /* POSIX 1003.1-1996 */
-#else
-# ifdef CLK_TCK
-#  define TICKS_PER_SECOND CLK_TCK /* POSIX 1003.1-1988; obsolescent */
-# else
-#  ifdef HZ
-#   define TICKS_PER_SECOND HZ  /* traditional UNIX */
-#  else
-#   define TICKS_PER_SECOND 100 /* often the correct value */
-#  endif
-# endif
-#endif
-
-/* Prefer times to getrusage to clock (each gives successively less
-   information).  */
-#ifdef HAVE_TIMES
-# define USE_TIMES
-# define HAVE_USER_TIME
-# define HAVE_SYS_TIME
-# define HAVE_WALL_TIME
-#else
-#ifdef HAVE_GETRUSAGE
-# define USE_GETRUSAGE
-# define HAVE_USER_TIME
-# define HAVE_SYS_TIME
-#else
-#ifdef HAVE_CLOCK
-# define USE_CLOCK
-# define HAVE_USER_TIME
-#endif
-#endif
-#endif
-
-/* libc is very likely to have snuck a call to sysconf() into one of
-   the underlying constants, and that can be very slow, so we have to
-   precompute them.  Whose wonderful idea was it to make all those
-   _constants_ variable at run time, anyway?  */
-#ifdef USE_TIMES
-static float ticks_to_msec;
-#define TICKS_TO_MSEC (1.0 / TICKS_PER_SECOND)
-#endif
-
-#ifdef USE_CLOCK
-static float clocks_to_msec;
-#define CLOCKS_TO_MSEC (1.0 / CLOCKS_PER_SEC)
-#endif
-
-#if IN_GCC
-#include "flags.h"
-#endif
-#include "timevar.h"
-
-/* See timevar.h for an explanation of timing variables.  */
-
-/* This macro evaluates to nonzero if timing variables are enabled.  */
-#define TIMEVAR_ENABLE (timevar_report)
-
-/* A timing variable.  */
-
-struct timevar_def
-{
-  /* Elapsed time for this variable.  */
-  struct timevar_time_def elapsed;
-
-  /* If this variable is timed independently of the timing stack,
-     using timevar_start, this contains the start time.  */
-  struct timevar_time_def start_time;
-
-  /* The name of this timing variable.  */
-  const char *name;
-
-  /* Non-zero if this timing variable is running as a standalone
-     timer.  */
-  unsigned standalone : 1;
-
-  /* Non-zero if this timing variable was ever started or pushed onto
-     the timing stack.  */
-  unsigned used : 1;
-};
-
-/* An element on the timing stack.  Elapsed time is attributed to the
-   topmost timing variable on the stack.  */
-
-struct timevar_stack_def
-{
-  /* The timing variable at this stack level.  */
-  struct timevar_def *timevar;
-
-  /* The next lower timing variable context in the stack.  */
-  struct timevar_stack_def *next;
-};
-
-/* Declared timing variables.  Constructed from the contents of
-   timevar.def.  */
-static struct timevar_def timevars[TIMEVAR_LAST];
-
-/* The top of the timing stack.  */
-static struct timevar_stack_def *stack;
-
-/* A list of unused (i.e. allocated and subsequently popped)
-   timevar_stack_def instances.  */
-static struct timevar_stack_def *unused_stack_instances;
-
-/* The time at which the topmost element on the timing stack was
-   pushed.  Time elapsed since then is attributed to the topmost
-   element.  */
-static struct timevar_time_def start_time;
-
-static void get_time (struct timevar_time_def *);
-static void timevar_accumulate (struct timevar_time_def *,
-				struct timevar_time_def *,
-				struct timevar_time_def *);
-
-/* Fill the current times into TIME.  The definition of this function
-   also defines any or all of the HAVE_USER_TIME, HAVE_SYS_TIME, and
-   HAVE_WALL_TIME macros.  */
-
-static void
-get_time (now)
-     struct timevar_time_def *now;
-{
-  now->user = 0;
-  now->sys  = 0;
-  now->wall = 0;
-
-  if (!TIMEVAR_ENABLE)
-    return;
-
-  {
-#ifdef USE_TIMES
-    struct tms tms;
-    now->wall = times (&tms)  * ticks_to_msec;
-#if IN_GCC
-    now->user = tms.tms_utime * ticks_to_msec;
-    now->sys  = tms.tms_stime * ticks_to_msec;
-#else
-    now->user = (tms.tms_utime + tms.tms_cutime) * ticks_to_msec;
-    now->sys  = (tms.tms_stime + tms.tms_cstime) * ticks_to_msec;
-#endif
-#endif
-#ifdef USE_GETRUSAGE
-    struct rusage rusage;
-#if IN_GCC
-    getrusage (RUSAGE_SELF, &rusage);
-#else
-    getrusage (RUSAGE_CHILDREN, &rusage);
-#endif
-    now->user = rusage.ru_utime.tv_sec + rusage.ru_utime.tv_usec * 1e-6;
-    now->sys  = rusage.ru_stime.tv_sec + rusage.ru_stime.tv_usec * 1e-6;
-#endif
-#ifdef USE_CLOCK
-    now->user = clock () * clocks_to_msec;
-#endif
-  }
-}
-
-/* Add the difference between STOP and START to TIMER.  */
-
-static void
-timevar_accumulate (timer, start, stop)
-     struct timevar_time_def *timer;
-     struct timevar_time_def *start;
-     struct timevar_time_def *stop;
-{
-  timer->user += stop->user - start->user;
-  timer->sys += stop->sys - start->sys;
-  timer->wall += stop->wall - start->wall;
-}
-
-/* Initialize timing variables.  */
-
-void
-init_timevar ()
-{
-  if (!TIMEVAR_ENABLE)
-    return;
-
-  /* Zero all elapsed times.  */
-  memset ((void *) timevars, 0, sizeof (timevars));
-
-  /* Initialize the names of timing variables.  */
-#define DEFTIMEVAR(identifier__, name__) \
-  timevars[identifier__].name = name__;
-#include "timevar.def"
-#undef DEFTIMEVAR
-
-#ifdef USE_TIMES
-  ticks_to_msec = TICKS_TO_MSEC;
-#endif
-#ifdef USE_CLOCK
-  clocks_to_msec = CLOCKS_TO_MSEC;
-#endif
-}
-
-/* Push TIMEVAR onto the timing stack.  No further elapsed time is
-   attributed to the previous topmost timing variable on the stack;
-   subsequent elapsed time is attributed to TIMEVAR, until it is
-   popped or another element is pushed on top.
-
-   TIMEVAR cannot be running as a standalone timer.  */
-
-void
-timevar_push (timevar)
-     timevar_id_t timevar;
-{
-  struct timevar_def *tv = &timevars[timevar];
-  struct timevar_stack_def *context;
-  struct timevar_time_def now;
-
-  if (!TIMEVAR_ENABLE)
-    return;
-
-  /* Mark this timing variable as used.  */
-  tv->used = 1;
-
-  /* Can't push a standalone timer.  */
-  if (tv->standalone)
-    abort ();
-
-  /* What time is it?  */
-  get_time (&now);
-
-  /* If the stack isn't empty, attribute the current elapsed time to
-     the old topmost element.  */
-  if (stack)
-    timevar_accumulate (&stack->timevar->elapsed, &start_time, &now);
-
-  /* Reset the start time; from now on, time is attributed to
-     TIMEVAR.  */
-  start_time = now;
-
-  /* See if we have a previously-allocated stack instance.  If so,
-     take it off the list.  If not, malloc a new one.  */
-  if (unused_stack_instances != NULL)
-    {
-      context = unused_stack_instances;
-      unused_stack_instances = unused_stack_instances->next;
-    }
-  else
-    context = (struct timevar_stack_def *)
-      xmalloc (sizeof (struct timevar_stack_def));
-
-  /* Fill it in and put it on the stack.  */
-  context->timevar = tv;
-  context->next = stack;
-  stack = context;
-}
-
-/* Pop the topmost timing variable element off the timing stack.  The
-   popped variable must be TIMEVAR.  Elapsed time since the that
-   element was pushed on, or since it was last exposed on top of the
-   stack when the element above it was popped off, is credited to that
-   timing variable.  */
-
-void
-timevar_pop (timevar)
-     timevar_id_t timevar;
-{
-  struct timevar_time_def now;
-  struct timevar_stack_def *popped = stack;
-
-  if (!TIMEVAR_ENABLE)
-    return;
-
-  if (&timevars[timevar] != stack->timevar)
-    abort ();
-
-  /* What time is it?  */
-  get_time (&now);
-
-  /* Attribute the elapsed time to the element we're popping.  */
-  timevar_accumulate (&popped->timevar->elapsed, &start_time, &now);
-
-  /* Reset the start time; from now on, time is attributed to the
-     element just exposed on the stack.  */
-  start_time = now;
-
-  /* Take the item off the stack.  */
-  stack = stack->next;
-
-  /* Don't delete the stack element; instead, add it to the list of
-     unused elements for later use.  */
-  popped->next = unused_stack_instances;
-  unused_stack_instances = popped;
-}
-
-/* Start timing TIMEVAR independently of the timing stack.  Elapsed
-   time until timevar_stop is called for the same timing variable is
-   attributed to TIMEVAR.  */
-
-void
-timevar_start (timevar)
-     timevar_id_t timevar;
-{
-  struct timevar_def *tv = &timevars[timevar];
-
-  if (!TIMEVAR_ENABLE)
-    return;
-
-  /* Mark this timing variable as used.  */
-  tv->used = 1;
-
-  /* Don't allow the same timing variable to be started more than
-     once.  */
-  if (tv->standalone)
-    abort ();
-  tv->standalone = 1;
-
-  get_time (&tv->start_time);
-}
-
-/* Stop timing TIMEVAR.  Time elapsed since timevar_start was called
-   is attributed to it.  */
-
-void
-timevar_stop (timevar)
-     timevar_id_t timevar;
-{
-  struct timevar_def *tv = &timevars[timevar];
-  struct timevar_time_def now;
-
-  if (!TIMEVAR_ENABLE)
-    return;
-
-  /* TIMEVAR must have been started via timevar_start.  */
-  if (!tv->standalone)
-    abort ();
-
-  get_time (&now);
-  timevar_accumulate (&tv->elapsed, &tv->start_time, &now);
-}
-
-/* Fill the elapsed time for TIMEVAR into ELAPSED.  Returns
-   update-to-date information even if TIMEVAR is currently running.  */
-
-void
-timevar_get (timevar, elapsed)
-     timevar_id_t timevar;
-     struct timevar_time_def *elapsed;
-{
-  struct timevar_def *tv = &timevars[timevar];
-  struct timevar_time_def now;
-
-  *elapsed = tv->elapsed;
-
-  /* Is TIMEVAR currently running as a standalone timer?  */
-  if (tv->standalone)
-    {
-      get_time (&now);
-      timevar_accumulate (elapsed, &tv->start_time, &now);
-    }
-  /* Or is TIMEVAR at the top of the timer stack?  */
-  else if (stack->timevar == tv)
-    {
-      get_time (&now);
-      timevar_accumulate (elapsed, &start_time, &now);
-    }
-}
-
-/* Summarize timing variables to FP.  The timing variable TV_TOTAL has
-   a special meaning -- it's considered to be the total elapsed time,
-   for normalizing the others, and is displayed last.  */
-
-void
-timevar_print (fp)
-     FILE *fp;
-{
-  /* Only print stuff if we have some sort of time information.  */
-#if defined HAVE_USER_TIME || defined HAVE_SYS_TIME || defined HAVE_WALL_TIME
-  unsigned int /* timevar_id_t */ id;
-  struct timevar_time_def *total = &timevars[TV_TOTAL].elapsed;
-  struct timevar_time_def now;
-
-  if (!TIMEVAR_ENABLE)
-    return;
-
-  /* Update timing information in case we're calling this from GDB.  */
-
-  if (fp == 0)
-    fp = stderr;
-
-  /* What time is it?  */
-  get_time (&now);
-
-  /* If the stack isn't empty, attribute the current elapsed time to
-     the old topmost element.  */
-  if (stack)
-    timevar_accumulate (&stack->timevar->elapsed, &start_time, &now);
-
-  /* Reset the start time; from now on, time is attributed to
-     TIMEVAR.  */
-  start_time = now;
-
-  fputs (_("\nExecution times (seconds)\n"), fp);
-  for (id = 0; id < (unsigned int) TIMEVAR_LAST; ++id)
-    {
-      struct timevar_def *tv = &timevars[(timevar_id_t) id];
-      const float tiny = 5e-3;
-
-      /* Don't print the total execution time here; that goes at the
-	 end.  */
-      if ((timevar_id_t) id == TV_TOTAL)
-	continue;
-
-      /* Don't print timing variables that were never used.  */
-      if (!tv->used)
-	continue;
-
-      /* Don't print timing variables if we're going to get a row of
-	 zeroes.  */
-      if (tv->elapsed.user < tiny
-	  && tv->elapsed.sys < tiny
-	  && tv->elapsed.wall < tiny)
-	continue;
-
-      /* The timing variable name.  */
-      fprintf (fp, " %-22s:", tv->name);
-
-#ifdef HAVE_USER_TIME
-      /* Print user-mode time for this process.  */
-      fprintf (fp, "%7.2f (%2.0f%%) usr",
-	       tv->elapsed.user,
-	       (total->user == 0 ? 0 : tv->elapsed.user / total->user) * 100);
-#endif /* HAVE_USER_TIME */
-
-#ifdef HAVE_SYS_TIME
-      /* Print system-mode time for this process.  */
-      fprintf (fp, "%7.2f (%2.0f%%) sys",
-	       tv->elapsed.sys,
-	       (total->sys == 0 ? 0 : tv->elapsed.sys / total->sys) * 100);
-#endif /* HAVE_SYS_TIME */
-
-#ifdef HAVE_WALL_TIME
-      /* Print wall clock time elapsed.  */
-      fprintf (fp, "%7.2f (%2.0f%%) wall",
-	       tv->elapsed.wall,
-	       (total->wall == 0 ? 0 : tv->elapsed.wall / total->wall) * 100);
-#endif /* HAVE_WALL_TIME */
-
-      putc ('\n', fp);
-    }
-
-  /* Print total time.  */
-  fputs (_(" TOTAL                 :"), fp);
-#ifdef HAVE_USER_TIME
-  fprintf (fp, "%7.2f          ", total->user);
-#endif
-#ifdef HAVE_SYS_TIME
-  fprintf (fp, "%7.2f          ", total->sys);
-#endif
-#ifdef HAVE_WALL_TIME
-  fprintf (fp, "%7.2f\n", total->wall);
-#endif
-
-#endif /* defined (HAVE_USER_TIME) || defined (HAVE_SYS_TIME)
-	  || defined (HAVE_WALL_TIME) */
-}
-
-/* Returns time (user + system) used so far by the compiler process,
-   in microseconds.  */
-
-long
-get_run_time ()
-{
-  struct timevar_time_def total_elapsed;
-  timevar_get (TV_TOTAL, &total_elapsed);
-  return total_elapsed.user + total_elapsed.sys;
-}
-
-/* Prints a message to stderr stating that time elapsed in STR is
-   TOTAL (given in microseconds).  */
-
-void
-print_time (str, total)
-     const char *str;
-     long total;
-{
-  long all_time = get_run_time ();
-  fprintf (stderr,
-	   _("time in %s: %ld.%06ld (%ld%%)\n"),
-	   str, total / 1000000, total % 1000000,
-	   all_time == 0 ? 0
-	   : (long) (((100.0 * (double) total) / (double) all_time) + .5));
-}
diff --git a/lib/timevar.def b/lib/timevar.def
deleted file mode 100644
index 04ac392..0000000
--- a/lib/timevar.def
+++ /dev/null
@@ -1,56 +0,0 @@
-/* This file contains the definitions for timing variables used to -*- C -*-
-   measure run-time performance of the compiler.
-   Copyright (C) 2002 Free Software Foundation, Inc.
-   Contributed by Akim Demaille <akim@freefriends.org>.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-/* This file contains timing variable definitions, used by timevar.h
-   and timevar.c.
-
-   Syntax:
-
-     DEFTIMEVAR (id, name)
-
-   where ID is the enumeral value used to identify the timing
-   variable, and NAME is a character string describing its purpose.  */
-
-/* The total execution time.  */
-DEFTIMEVAR (TV_TOTAL                 , "total time")
-
-/* Time spent in the reader.  */
-DEFTIMEVAR (TV_READER                , "reader")
-DEFTIMEVAR (TV_SCANNING              , "scanner")
-DEFTIMEVAR (TV_PARSING               , "parser")
-
-/* Time spent handling the grammar.  */
-DEFTIMEVAR (TV_REDUCE                , "reducing the grammar")
-DEFTIMEVAR (TV_SETS                  , "computing the sets")
-DEFTIMEVAR (TV_LR0                   , "LR(0)")
-DEFTIMEVAR (TV_LALR                  , "LALR(1)")
-DEFTIMEVAR (TV_CONFLICTS             , "conflicts")
-
-/* Time spent outputing results.  */
-DEFTIMEVAR (TV_REPORT                , "outputing report")
-DEFTIMEVAR (TV_GRAPH                 , "outputing graph")
-DEFTIMEVAR (TV_ACTIONS               , "parser action tables")
-DEFTIMEVAR (TV_PARSER                , "outputing parser")
-DEFTIMEVAR (TV_M4                    , "running m4")
-
-/* Time spent by freeing the memory :).  */
-DEFTIMEVAR (TV_FREE                  , "freeing")
diff --git a/lib/timevar.h b/lib/timevar.h
deleted file mode 100644
index bbeb402..0000000
--- a/lib/timevar.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Timing variables for measuring compiler performance.
-   Copyright (C) 2000, 2002, 2004 Free Software Foundation, Inc.
-   Contributed by Alex Samuel <samuel@codesourcery.com>
-
-   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 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, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef GCC_TIMEVAR_H
-#define GCC_TIMEVAR_H
-
-/* Timing variables are used to measure elapsed time in various
-   portions of the compiler.  Each measures elapsed user, system, and
-   wall-clock time, as appropriate to and supported by the host
-   system.
-
-   Timing variables are defined using the DEFTIMEVAR macro in
-   timevar.def.  Each has an enumeral identifier, used when referring
-   to the timing variable in code, and a character string name.
-
-   Timing variables can be used in two ways:
-
-     - On the timing stack, using timevar_push and timevar_pop.
-       Timing variables may be pushed onto the stack; elapsed time is
-       attributed to the topmost timing variable on the stack.  When
-       another variable is pushed on, the previous topmost variable is
-       `paused' until the pushed variable is popped back off.
-
-     - As a standalone timer, using timevar_start and timevar_stop.
-       All time elapsed between the two calls is attributed to the
-       variable.
-*/
-
-/* This structure stores the various varieties of time that can be
-   measured.  Times are stored in seconds.  The time may be an
-   absolute time or a time difference; in the former case, the time
-   base is undefined, except that the difference between two times
-   produces a valid time difference.  */
-
-struct timevar_time_def
-{
-  /* User time in this process.  */
-  float user;
-
-  /* System time (if applicable for this host platform) in this
-     process.  */
-  float sys;
-
-  /* Wall clock time.  */
-  float wall;
-};
-
-/* An enumeration of timing variable identifiers.  Constructed from
-   the contents of timevar.def.  */
-
-#define DEFTIMEVAR(identifier__, name__) \
-    identifier__,
-typedef enum
-{
-#include "timevar.def"
-  TIMEVAR_LAST
-}
-timevar_id_t;
-#undef DEFTIMEVAR
-
-extern void init_timevar (void);
-extern void timevar_push (timevar_id_t);
-extern void timevar_pop (timevar_id_t);
-extern void timevar_start (timevar_id_t);
-extern void timevar_stop (timevar_id_t);
-extern void timevar_get (timevar_id_t, struct timevar_time_def *);
-extern void timevar_print (FILE *);
-
-/* Provided for backward compatibility.  */
-extern long get_run_time (void);
-extern void print_time (const char *, long);
-
-extern int timevar_report;
-
-#endif /* ! GCC_TIMEVAR_H */
diff --git a/lib/unistd--.h b/lib/unistd--.h
deleted file mode 100644
index 1fe6ce8..0000000
--- a/lib/unistd--.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Like unistd.h, but redefine some names to avoid glitches.
-
-   Copyright (C) 2005 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 Paul Eggert.  */
-
-#include <unistd.h>
-#include "unistd-safer.h"
-
-#undef dup
-#define dup dup_safer
-
-#undef pipe
-#define pipe pipe_safer
diff --git a/lib/unistd-safer.h b/lib/unistd-safer.h
deleted file mode 100644
index f95999d..0000000
--- a/lib/unistd-safer.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Invoke unistd-like functions, but avoid some glitches.
-
-   Copyright (C) 2001, 2003, 2005 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 Paul Eggert.  */
-
-int dup_safer (int);
-int fd_safer (int);
-int pipe_safer (int[2]);
diff --git a/lib/unlocked-io.h b/lib/unlocked-io.h
deleted file mode 100644
index d009303..0000000
--- a/lib/unlocked-io.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/* Prefer faster, non-thread-safe stdio functions if available.
-
-   Copyright (C) 2001, 2002, 2003, 2004 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 Jim Meyering.  */
-
-#ifndef UNLOCKED_IO_H
-# define UNLOCKED_IO_H 1
-
-/* These are wrappers for functions/macros from the GNU C library, and
-   from other C libraries supporting POSIX's optional thread-safe functions.
-
-   The standard I/O functions are thread-safe.  These *_unlocked ones are
-   more efficient but not thread-safe.  That they're not thread-safe is
-   fine since all of the applications in this package are single threaded.
-
-   Also, some code that is shared with the GNU C library may invoke
-   the *_unlocked functions directly.  On hosts that lack those
-   functions, invoke the non-thread-safe versions instead.  */
-
-# include <stdio.h>
-
-# if HAVE_DECL_CLEARERR_UNLOCKED
-#  undef clearerr
-#  define clearerr(x) clearerr_unlocked (x)
-# else
-#  define clearerr_unlocked(x) clearerr (x)
-# endif
-
-# if HAVE_DECL_FEOF_UNLOCKED
-#  undef feof
-#  define feof(x) feof_unlocked (x)
-# else
-#  define feof_unlocked(x) feof (x)
-# endif
-
-# if HAVE_DECL_FERROR_UNLOCKED
-#  undef ferror
-#  define ferror(x) ferror_unlocked (x)
-# else
-#  define ferror_unlocked(x) ferror (x)
-# endif
-
-# if HAVE_DECL_FFLUSH_UNLOCKED
-#  undef fflush
-#  define fflush(x) fflush_unlocked (x)
-# else
-#  define fflush_unlocked(x) fflush (x)
-# endif
-
-# if HAVE_DECL_FGETS_UNLOCKED
-#  undef fgets
-#  define fgets(x,y,z) fgets_unlocked (x,y,z)
-# else
-#  define fgets_unlocked(x,y,z) fgets (x,y,z)
-# endif
-
-# if HAVE_DECL_FPUTC_UNLOCKED
-#  undef fputc
-#  define fputc(x,y) fputc_unlocked (x,y)
-# else
-#  define fputc_unlocked(x,y) fputc (x,y)
-# endif
-
-# if HAVE_DECL_FPUTS_UNLOCKED
-#  undef fputs
-#  define fputs(x,y) fputs_unlocked (x,y)
-# else
-#  define fputs_unlocked(x,y) fputs (x,y)
-# endif
-
-# if HAVE_DECL_FREAD_UNLOCKED
-#  undef fread
-#  define fread(w,x,y,z) fread_unlocked (w,x,y,z)
-# else
-#  define fread_unlocked(w,x,y,z) fread (w,x,y,z)
-# endif
-
-# if HAVE_DECL_FWRITE_UNLOCKED
-#  undef fwrite
-#  define fwrite(w,x,y,z) fwrite_unlocked (w,x,y,z)
-# else
-#  define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z)
-# endif
-
-# if HAVE_DECL_GETC_UNLOCKED
-#  undef getc
-#  define getc(x) getc_unlocked (x)
-# else
-#  define getc_unlocked(x) getc (x)
-# endif
-
-# if HAVE_DECL_GETCHAR_UNLOCKED
-#  undef getchar
-#  define getchar() getchar_unlocked ()
-# else
-#  define getchar_unlocked() getchar ()
-# endif
-
-# if HAVE_DECL_PUTC_UNLOCKED
-#  undef putc
-#  define putc(x,y) putc_unlocked (x,y)
-# else
-#  define putc_unlocked(x,y) putc (x,y)
-# endif
-
-# if HAVE_DECL_PUTCHAR_UNLOCKED
-#  undef putchar
-#  define putchar(x) putchar_unlocked (x)
-# else
-#  define putchar_unlocked(x) putchar (x)
-# endif
-
-# undef flockfile
-# define flockfile(x) ((void) 0)
-
-# undef ftrylockfile
-# define ftrylockfile(x) 0
-
-# undef funlockfile
-# define funlockfile(x) ((void) 0)
-
-#endif /* UNLOCKED_IO_H */
diff --git a/lib/vbitset.c b/lib/vbitset.c
deleted file mode 100644
index d0fe30f..0000000
--- a/lib/vbitset.c
+++ /dev/null
@@ -1,1140 +0,0 @@
-/* Variable array bitsets.
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
-
-   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 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, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "vbitset.h"
-#include <stdlib.h>
-#include <string.h>
-
-/* This file implements variable size bitsets stored as a variable
-   length array of words.  Any unused bits in the last word must be
-   zero.
-
-   Note that binary or ternary operations assume that each bitset operand
-   has the same size.
-*/
-
-static void vbitset_unused_clear (bitset);
-
-static void vbitset_set (bitset, bitset_bindex);
-static void vbitset_reset (bitset, bitset_bindex);
-static bool vbitset_test (bitset, bitset_bindex);
-static bitset_bindex vbitset_list (bitset, bitset_bindex *,
-				   bitset_bindex, bitset_bindex *);
-static bitset_bindex vbitset_list_reverse (bitset, bitset_bindex *,
-					   bitset_bindex, bitset_bindex *);
-
-#define VBITSET_N_WORDS(N) (((N) + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS)
-#define VBITSET_WORDS(X) ((X)->b.cdata)
-#define VBITSET_SIZE(X) ((X)->b.csize)
-#define VBITSET_ASIZE(X) ((X)->v.size)
-
-#undef min
-#undef max
-#define min(a, b) ((a) > (b) ? (b) : (a))
-#define max(a, b) ((a) > (b) ? (a) : (b))
-
-static bitset_bindex
-vbitset_resize (bitset src, bitset_bindex n_bits)
-{
-  bitset_windex oldsize;
-  bitset_windex newsize;
-
-  if (n_bits == BITSET_NBITS_ (src))
-    return n_bits;
-
-  oldsize = VBITSET_SIZE (src);
-  newsize = VBITSET_N_WORDS (n_bits);
-
-  if (oldsize < newsize)
-    {
-      bitset_windex size;
-
-      /* The bitset needs to grow.  If we already have enough memory
-	 allocated, then just zero what we need.  */
-      if (newsize > VBITSET_ASIZE (src))
-	{
-	  /* We need to allocate more memory.  When oldsize is
-	     non-zero this means that we are changing the size, so
-	     grow the bitset 25% larger than requested to reduce
-	     number of reallocations.  */
-
-	  if (oldsize == 0)
-	    size = newsize;
-	  else
-	    size = newsize + newsize / 4;
-
-	  VBITSET_WORDS (src)
-	    = realloc (VBITSET_WORDS (src), size * sizeof (bitset_word));
-	  VBITSET_ASIZE (src) = size;
-	}
-
-      memset (VBITSET_WORDS (src) + oldsize, 0,
-	      (newsize - oldsize) * sizeof (bitset_word));
-      VBITSET_SIZE (src) = newsize;
-    }
-  else
-    {
-      /* The bitset needs to shrink.  There's no point deallocating
-	 the memory unless it is shrinking by a reasonable amount.  */
-      if ((oldsize - newsize) >= oldsize / 2)
-	{
-	  VBITSET_WORDS (src)
-	    = realloc (VBITSET_WORDS (src), newsize * sizeof (bitset_word));
-	  VBITSET_ASIZE (src) = newsize;
-	}
-
-      /* Need to prune any excess bits.  FIXME.  */
-
-      VBITSET_SIZE (src) = newsize;
-    }
-
-  BITSET_NBITS_ (src) = n_bits;
-  return n_bits;
-}
-
-
-/* Set bit BITNO in bitset DST.  */
-static void
-vbitset_set (dst, bitno)
-     bitset dst;
-     bitset_bindex bitno;
-{
-  bitset_windex windex = bitno / BITSET_WORD_BITS;
-
-  /* Perhaps we should abort.  The user should explicitly call
-     bitset_resize since this will not catch the case when we set a
-     bit larger than the current size but smaller than the allocated
-     size.  */
-  vbitset_resize (dst, bitno);
-
-  dst->b.cdata[windex - dst->b.cindex] |=
-    (bitset_word) 1 << (bitno % BITSET_WORD_BITS);
-}
-
-
-/* Reset bit BITNO in bitset DST.  */
-static void
-vbitset_reset (dst, bitno)
-     bitset dst ATTRIBUTE_UNUSED;
-     bitset_bindex bitno ATTRIBUTE_UNUSED;
-{
-  /* We must be accessing outside the cache so the bit is
-     zero anyway.  */
-}
-
-
-/* Test bit BITNO in bitset SRC.  */
-static bool
-vbitset_test (src, bitno)
-     bitset src ATTRIBUTE_UNUSED;
-     bitset_bindex bitno ATTRIBUTE_UNUSED;
-{
-  /* We must be accessing outside the cache so the bit is
-     zero anyway.  */
-  return 0;
-}
-
-
-/* Find list of up to NUM bits set in BSET in reverse order, starting
-   from and including NEXT and store in array LIST.  Return with
-   actual number of bits found and with *NEXT indicating where search
-   stopped.  */
-static bitset_bindex
-vbitset_list_reverse (src, list, num, next)
-     bitset src;
-     bitset_bindex *list;
-     bitset_bindex num;
-     bitset_bindex *next;
-{
-  bitset_bindex bitno;
-  bitset_bindex rbitno;
-  bitset_bindex count;
-  bitset_windex windex;
-  unsigned int bitcnt;
-  bitset_bindex bitoff;
-  bitset_word *srcp = VBITSET_WORDS (src);
-  bitset_bindex n_bits = BITSET_SIZE_ (src);
-
-  rbitno = *next;
-
-  /* If num is 1, we could speed things up with a binary search
-     of the word of interest.  */
-
-  if (rbitno >= n_bits)
-    return 0;
-
-  count = 0;
-
-  bitno = n_bits - (rbitno + 1);
-
-  windex = bitno / BITSET_WORD_BITS;
-  bitcnt = bitno % BITSET_WORD_BITS;
-  bitoff = windex * BITSET_WORD_BITS;
-
-  do
-    {
-      bitset_word word;
-
-      word = srcp[windex] << (BITSET_WORD_BITS - 1 - bitcnt);
-      for (; word; bitcnt--)
-	{
-	  if (word & BITSET_MSB)
-	    {
-	      list[count++] = bitoff + bitcnt;
-	      if (count >= num)
-		{
-		  *next = n_bits - (bitoff + bitcnt);
-		  return count;
-		}
-	    }
-	  word <<= 1;
-	}
-      bitoff -= BITSET_WORD_BITS;
-      bitcnt = BITSET_WORD_BITS - 1;
-    }
-  while (windex--);
-
-  *next = n_bits - (bitoff + 1);
-  return count;
-}
-
-
-/* Find list of up to NUM bits set in BSET starting from and including
- *NEXT and store in array LIST.  Return with actual number of bits
- found and with *NEXT indicating where search stopped.  */
-static bitset_bindex
-vbitset_list (src, list, num, next)
-     bitset src;
-     bitset_bindex *list;
-     bitset_bindex num;
-     bitset_bindex *next;
-{
-  bitset_bindex bitno;
-  bitset_bindex count;
-  bitset_windex windex;
-  bitset_bindex bitoff;
-  bitset_windex size = VBITSET_SIZE (src);
-  bitset_word *srcp = VBITSET_WORDS (src);
-  bitset_word word;
-
-  bitno = *next;
-
-  count = 0;
-  if (!bitno)
-    {
-      /* Many bitsets are zero, so make this common case fast.  */
-      for (windex = 0; windex < size && !srcp[windex]; windex++)
-	continue;
-      if (windex >= size)
-	return 0;
-
-      /* If num is 1, we could speed things up with a binary search
-	 of the current word.  */
-
-      bitoff = windex * BITSET_WORD_BITS;
-    }
-  else
-    {
-      if (bitno >= BITSET_SIZE_ (src))
-	return 0;
-
-      windex = bitno / BITSET_WORD_BITS;
-      bitno = bitno % BITSET_WORD_BITS;
-
-      if (bitno)
-	{
-	  /* Handle the case where we start within a word.
-	     Most often, this is executed with large bitsets
-	     with many set bits where we filled the array
-	     on the previous call to this function.  */
-
-	  bitoff = windex * BITSET_WORD_BITS;
-	  word = srcp[windex] >> bitno;
-	  for (bitno = bitoff + bitno; word; bitno++)
-	    {
-	      if (word & 1)
-		{
-		  list[count++] = bitno;
-		  if (count >= num)
-		    {
-		      *next = bitno + 1;
-		      return count;
-		    }
-		}
-	      word >>= 1;
-	    }
-	  windex++;
-	}
-      bitoff = windex * BITSET_WORD_BITS;
-    }
-
-  for (; windex < size; windex++, bitoff += BITSET_WORD_BITS)
-    {
-      if (!(word = srcp[windex]))
-	continue;
-
-      if ((count + BITSET_WORD_BITS) < num)
-	{
-	  for (bitno = bitoff; word; bitno++)
-	    {
-	      if (word & 1)
-		list[count++] = bitno;
-	      word >>= 1;
-	    }
-	}
-      else
-	{
-	  for (bitno = bitoff; word; bitno++)
-	    {
-	      if (word & 1)
-		{
-		  list[count++] = bitno;
-		  if (count >= num)
-		    {
-		      *next = bitno + 1;
-		      return count;
-		    }
-		}
-	      word >>= 1;
-	    }
-	}
-    }
-
-  *next = bitoff;
-  return count;
-}
-
-
-/* Ensure that any unused bits within the last word are clear.  */
-static inline void
-vbitset_unused_clear (dst)
-     bitset dst;
-{
-  unsigned int last_bit;
-
-  last_bit = BITSET_SIZE_ (dst) % BITSET_WORD_BITS;
-  if (last_bit)
-    VBITSET_WORDS (dst)[VBITSET_SIZE (dst) - 1] &=
-      ((bitset_word) 1 << last_bit) - 1;
-}
-
-
-static void
-vbitset_ones (bitset dst)
-{
-  bitset_word *dstp = VBITSET_WORDS (dst);
-  unsigned int bytes;
-
-  bytes = sizeof (bitset_word) * VBITSET_SIZE (dst);
-
-  memset (dstp, -1, bytes);
-  vbitset_unused_clear (dst);
-}
-
-
-static void
-vbitset_zero (bitset dst)
-{
-  bitset_word *dstp = VBITSET_WORDS (dst);
-  unsigned int bytes;
-
-  bytes = sizeof (bitset_word) * VBITSET_SIZE (dst);
-
-  memset (dstp, 0, bytes);
-}
-
-
-static bool
-vbitset_empty_p (bitset dst)
-{
-  unsigned int i;
-  bitset_word *dstp = VBITSET_WORDS (dst);
-
-  for (i = 0; i < VBITSET_SIZE (dst); i++)
-    if (dstp[i])
-      return 0;
-
-  return 1;
-}
-
-
-static void
-vbitset_copy1 (bitset dst, bitset src)
-{
-  bitset_word *srcp;
-  bitset_word *dstp;
-  bitset_windex ssize;
-  bitset_windex dsize;
-
-  if (src == dst)
-      return;
-
-  vbitset_resize (dst, BITSET_SIZE_ (src));
-
-  srcp = VBITSET_WORDS (src);
-  dstp = VBITSET_WORDS (dst);
-  ssize = VBITSET_SIZE (src);
-  dsize = VBITSET_SIZE (dst);
-
-  memcpy (dstp, srcp, sizeof (bitset_word) * ssize);
-
-  memset (dstp + sizeof (bitset_word) * ssize, 0,
-	  sizeof (bitset_word) * (dsize - ssize));
-}
-
-
-static void
-vbitset_not (bitset dst, bitset src)
-{
-  unsigned int i;
-  bitset_word *srcp;
-  bitset_word *dstp;
-  bitset_windex ssize;
-  bitset_windex dsize;
-
-  vbitset_resize (dst, BITSET_SIZE_ (src));
-
-  srcp = VBITSET_WORDS (src);
-  dstp = VBITSET_WORDS (dst);
-  ssize = VBITSET_SIZE (src);
-  dsize = VBITSET_SIZE (dst);
-
-  for (i = 0; i < ssize; i++)
-      *dstp++ = ~(*srcp++);
-
-  vbitset_unused_clear (dst);
-  memset (dstp + sizeof (bitset_word) * ssize, 0,
-	  sizeof (bitset_word) * (dsize - ssize));
-}
-
-
-static bool
-vbitset_equal_p (bitset dst, bitset src)
-{
-  unsigned int i;
-  bitset_word *srcp = VBITSET_WORDS (src);
-  bitset_word *dstp = VBITSET_WORDS (dst);
-  bitset_windex ssize = VBITSET_SIZE (src);
-  bitset_windex dsize = VBITSET_SIZE (dst);
-
-  for (i = 0; i < min (ssize, dsize); i++)
-      if (*srcp++ != *dstp++)
-	  return 0;
-
-  if (ssize > dsize)
-    {
-      for (; i < ssize; i++)
-	if (*srcp++)
-	  return 0;
-    }
-  else
-    {
-      for (; i < dsize; i++)
-	if (*dstp++)
-	  return 0;
-    }
-
-  return 1;
-}
-
-
-static bool
-vbitset_subset_p (bitset dst, bitset src)
-{
-  unsigned int i;
-  bitset_word *srcp = VBITSET_WORDS (src);
-  bitset_word *dstp = VBITSET_WORDS (dst);
-  bitset_windex ssize = VBITSET_SIZE (src);
-  bitset_windex dsize = VBITSET_SIZE (dst);
-
-  for (i = 0; i < min (ssize, dsize); i++, dstp++, srcp++)
-      if (*dstp != (*srcp | *dstp))
-	  return 0;
-
-  if (ssize > dsize)
-    {
-      for (; i < ssize; i++)
-	if (*srcp++)
-	  return 0;
-    }
-
-  return 1;
-}
-
-
-static bool
-vbitset_disjoint_p (bitset dst, bitset src)
-{
-  unsigned int i;
-  bitset_word *srcp = VBITSET_WORDS (src);
-  bitset_word *dstp = VBITSET_WORDS (dst);
-  bitset_windex ssize = VBITSET_SIZE (src);
-  bitset_windex dsize = VBITSET_SIZE (dst);
-
-  for (i = 0; i < min (ssize, dsize); i++)
-      if (*srcp++ & *dstp++)
-	  return 0;
-
-  return 1;
-}
-
-
-static void
-vbitset_and (bitset dst, bitset src1, bitset src2)
-{
-  unsigned int i;
-  bitset_word *src1p;
-  bitset_word *src2p;
-  bitset_word *dstp;
-  bitset_windex ssize1;
-  bitset_windex ssize2;
-  bitset_windex dsize;
-
-  vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2)));
-
-  dsize = VBITSET_SIZE (dst);
-  ssize1 = VBITSET_SIZE (src1);
-  ssize2 = VBITSET_SIZE (src2);
-  dstp = VBITSET_WORDS (dst);
-  src1p = VBITSET_WORDS (src1);
-  src2p = VBITSET_WORDS (src2);
-
-  for (i = 0; i < min (ssize1, ssize2); i++)
-      *dstp++ = *src1p++ & *src2p++;
-
-  memset (dstp, 0, sizeof (bitset_word) * (dsize - min (ssize1, ssize2)));
-}
-
-
-static bool
-vbitset_and_cmp (bitset dst, bitset src1, bitset src2)
-{
-  unsigned int i;
-  int changed = 0;
-  bitset_word *src1p;
-  bitset_word *src2p;
-  bitset_word *dstp;
-  bitset_windex ssize1;
-  bitset_windex ssize2;
-  bitset_windex dsize;
-
-  vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2)));
-
-  dsize = VBITSET_SIZE (dst);
-  ssize1 = VBITSET_SIZE (src1);
-  ssize2 = VBITSET_SIZE (src2);
-  dstp = VBITSET_WORDS (dst);
-  src1p = VBITSET_WORDS (src1);
-  src2p = VBITSET_WORDS (src2);
-
-  for (i = 0; i < min (ssize1, ssize2); i++, dstp++)
-    {
-      bitset_word tmp = *src1p++ & *src2p++;
-
-      if (*dstp != tmp)
-	{
-	  changed = 1;
-	  *dstp = tmp;
-	}
-    }
-
-  if (ssize2 > ssize1)
-    {
-      src1p = src2p;
-      ssize1 = ssize2;
-    }
-
-  for (; i < ssize1; i++, dstp++)
-    {
-      if (*dstp != 0)
-	{
-	  changed = 1;
-	  *dstp = 0;
-	}
-    }
-
-  memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1));
-
-  return changed;
-}
-
-
-static void
-vbitset_andn (bitset dst, bitset src1, bitset src2)
-{
-  unsigned int i;
-  bitset_word *src1p;
-  bitset_word *src2p;
-  bitset_word *dstp;
-  bitset_windex ssize1;
-  bitset_windex ssize2;
-  bitset_windex dsize;
-
-  vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2)));
-
-  dsize = VBITSET_SIZE (dst);
-  ssize1 = VBITSET_SIZE (src1);
-  ssize2 = VBITSET_SIZE (src2);
-  dstp = VBITSET_WORDS (dst);
-  src1p = VBITSET_WORDS (src1);
-  src2p = VBITSET_WORDS (src2);
-
-  for (i = 0; i < min (ssize1, ssize2); i++)
-      *dstp++ = *src1p++ & ~(*src2p++);
-
-  if (ssize2 > ssize1)
-    {
-      for (; i < ssize2; i++)
-	*dstp++ = 0;
-
-      memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize2));
-    }
-  else
-    {
-      for (; i < ssize1; i++)
-	*dstp++ = *src1p++;
-
-      memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1));
-    }
-}
-
-
-static bool
-vbitset_andn_cmp (bitset dst, bitset src1, bitset src2)
-{
-  unsigned int i;
-  int changed = 0;
-  bitset_word *src1p;
-  bitset_word *src2p;
-  bitset_word *dstp;
-  bitset_windex ssize1;
-  bitset_windex ssize2;
-  bitset_windex dsize;
-
-  vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2)));
-
-  dsize = VBITSET_SIZE (dst);
-  ssize1 = VBITSET_SIZE (src1);
-  ssize2 = VBITSET_SIZE (src2);
-  dstp = VBITSET_WORDS (dst);
-  src1p = VBITSET_WORDS (src1);
-  src2p = VBITSET_WORDS (src2);
-
-  for (i = 0; i < min (ssize1, ssize2); i++, dstp++)
-    {
-      bitset_word tmp = *src1p++ & ~(*src2p++);
-
-      if (*dstp != tmp)
-	{
-	  changed = 1;
-	  *dstp = tmp;
-	}
-    }
-
-  if (ssize2 > ssize1)
-    {
-      for (; i < ssize2; i++, dstp++)
-	{
-	  if (*dstp != 0)
-	    {
-	      changed = 1;
-	      *dstp = 0;
-	    }
-	}
-
-      memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize2));
-    }
-  else
-    {
-      for (; i < ssize1; i++, dstp++)
-	{
-	  bitset_word tmp = *src1p++;
-
-	  if (*dstp != tmp)
-	    {
-	      changed = 1;
-	      *dstp = tmp;
-	    }
-	}
-
-      memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1));
-    }
-
-  return changed;
-}
-
-
-static void
-vbitset_or (bitset dst, bitset src1, bitset src2)
-{
-  unsigned int i;
-  bitset_word *src1p;
-  bitset_word *src2p;
-  bitset_word *dstp;
-  bitset_windex ssize1;
-  bitset_windex ssize2;
-  bitset_windex dsize;
-
-  vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2)));
-
-  dsize = VBITSET_SIZE (dst);
-  ssize1 = VBITSET_SIZE (src1);
-  ssize2 = VBITSET_SIZE (src2);
-  dstp = VBITSET_WORDS (dst);
-  src1p = VBITSET_WORDS (src1);
-  src2p = VBITSET_WORDS (src2);
-
-  for (i = 0; i < min (ssize1, ssize2); i++)
-      *dstp++ = *src1p++ | *src2p++;
-
-  if (ssize2 > ssize1)
-    {
-      src1p = src2p;
-      ssize1 = ssize2;
-    }
-
-  for (; i < ssize1; i++)
-    *dstp++ = *src1p++;
-
-  memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1));
-}
-
-
-static bool
-vbitset_or_cmp (bitset dst, bitset src1, bitset src2)
-{
-  unsigned int i;
-  int changed = 0;
-  bitset_word *src1p;
-  bitset_word *src2p;
-  bitset_word *dstp;
-  bitset_windex ssize1;
-  bitset_windex ssize2;
-  bitset_windex dsize;
-
-  vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2)));
-
-  dsize = VBITSET_SIZE (dst);
-  ssize1 = VBITSET_SIZE (src1);
-  ssize2 = VBITSET_SIZE (src2);
-  dstp = VBITSET_WORDS (dst);
-  src1p = VBITSET_WORDS (src1);
-  src2p = VBITSET_WORDS (src2);
-
-  for (i = 0; i < min (ssize1, ssize2); i++, dstp++)
-    {
-      bitset_word tmp = *src1p++ | *src2p++;
-
-      if (*dstp != tmp)
-	{
-	  changed = 1;
-	  *dstp = tmp;
-	}
-    }
-
-  if (ssize2 > ssize1)
-    {
-      src1p = src2p;
-      ssize1 = ssize2;
-    }
-
-  for (; i < ssize1; i++, dstp++)
-    {
-      bitset_word tmp = *src1p++;
-
-      if (*dstp != tmp)
-	{
-	  changed = 1;
-	  *dstp = tmp;
-	}
-    }
-
-  memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1));
-
-  return changed;
-}
-
-
-static void
-vbitset_xor (bitset dst, bitset src1, bitset src2)
-{
-  unsigned int i;
-  bitset_word *src1p;
-  bitset_word *src2p;
-  bitset_word *dstp;
-  bitset_windex ssize1;
-  bitset_windex ssize2;
-  bitset_windex dsize;
-
-  vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2)));
-
-  dsize = VBITSET_SIZE (dst);
-  ssize1 = VBITSET_SIZE (src1);
-  ssize2 = VBITSET_SIZE (src2);
-  dstp = VBITSET_WORDS (dst);
-  src1p = VBITSET_WORDS (src1);
-  src2p = VBITSET_WORDS (src2);
-
-  for (i = 0; i < min (ssize1, ssize2); i++)
-      *dstp++ = *src1p++ ^ *src2p++;
-
-  if (ssize2 > ssize1)
-    {
-      src1p = src2p;
-      ssize1 = ssize2;
-    }
-
-  for (; i < ssize1; i++)
-    *dstp++ = *src1p++;
-
-  memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1));
-}
-
-
-static bool
-vbitset_xor_cmp (bitset dst, bitset src1, bitset src2)
-{
-  unsigned int i;
-  int changed = 0;
-  bitset_word *src1p;
-  bitset_word *src2p;
-  bitset_word *dstp;
-  bitset_windex ssize1;
-  bitset_windex ssize2;
-  bitset_windex dsize;
-
-  vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2)));
-
-  dsize = VBITSET_SIZE (dst);
-  ssize1 = VBITSET_SIZE (src1);
-  ssize2 = VBITSET_SIZE (src2);
-  dstp = VBITSET_WORDS (dst);
-  src1p = VBITSET_WORDS (src1);
-  src2p = VBITSET_WORDS (src2);
-
-  for (i = 0; i < min (ssize1, ssize2); i++, dstp++)
-    {
-      bitset_word tmp = *src1p++ ^ *src2p++;
-
-      if (*dstp != tmp)
-	{
-	  changed = 1;
-	  *dstp = tmp;
-	}
-    }
-
-  if (ssize2 > ssize1)
-    {
-      src1p = src2p;
-      ssize1 = ssize2;
-    }
-
-  for (; i < ssize1; i++, dstp++)
-    {
-      bitset_word tmp = *src1p++;
-
-      if (*dstp != tmp)
-	{
-	  changed = 1;
-	  *dstp = tmp;
-	}
-    }
-
-  memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1));
-
-  return changed;
-}
-
-
-/* FIXME, these operations need fixing for different size
-   bitsets.  */
-
-static void
-vbitset_and_or (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  unsigned int i;
-  bitset_word *src1p;
-  bitset_word *src2p;
-  bitset_word *src3p;
-  bitset_word *dstp;
-  bitset_windex size;
-
-  if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2)
-      || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3))
-    {
-      bitset_and_or_ (dst, src1, src2, src3);
-      return;
-    }
-
-  vbitset_resize (dst, BITSET_NBITS_ (src1));
-
-  src1p = VBITSET_WORDS (src1);
-  src2p = VBITSET_WORDS (src2);
-  src3p = VBITSET_WORDS (src3);
-  dstp = VBITSET_WORDS (dst);
-  size = VBITSET_SIZE (dst);
-
-  for (i = 0; i < size; i++)
-      *dstp++ = (*src1p++ & *src2p++) | *src3p++;
-}
-
-
-static bool
-vbitset_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  unsigned int i;
-  int changed = 0;
-  bitset_word *src1p;
-  bitset_word *src2p;
-  bitset_word *src3p;
-  bitset_word *dstp;
-  bitset_windex size;
-
-  if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2)
-      || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3))
-    return bitset_and_or_cmp_ (dst, src1, src2, src3);
-
-  vbitset_resize (dst, BITSET_NBITS_ (src1));
-
-  src1p = VBITSET_WORDS (src1);
-  src2p = VBITSET_WORDS (src2);
-  src3p = VBITSET_WORDS (src3);
-  dstp = VBITSET_WORDS (dst);
-  size = VBITSET_SIZE (dst);
-
-  for (i = 0; i < size; i++, dstp++)
-    {
-      bitset_word tmp = (*src1p++ & *src2p++) | *src3p++;
-
-      if (*dstp != tmp)
-	{
-	  changed = 1;
-	  *dstp = tmp;
-	}
-    }
-  return changed;
-}
-
-
-static void
-vbitset_andn_or (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  unsigned int i;
-  bitset_word *src1p;
-  bitset_word *src2p;
-  bitset_word *src3p;
-  bitset_word *dstp;
-  bitset_windex size;
-
-  if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2)
-      || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3))
-    {
-      bitset_andn_or_ (dst, src1, src2, src3);
-      return;
-    }
-
-  vbitset_resize (dst, BITSET_NBITS_ (src1));
-
-  src1p = VBITSET_WORDS (src1);
-  src2p = VBITSET_WORDS (src2);
-  src3p = VBITSET_WORDS (src3);
-  dstp = VBITSET_WORDS (dst);
-  size = VBITSET_SIZE (dst);
-
-  for (i = 0; i < size; i++)
-      *dstp++ = (*src1p++ & ~(*src2p++)) | *src3p++;
-}
-
-
-static bool
-vbitset_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  unsigned int i;
-  int changed = 0;
-  bitset_word *src1p;
-  bitset_word *src2p;
-  bitset_word *src3p;
-  bitset_word *dstp;
-  bitset_windex size;
-
-  if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2)
-      || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3))
-    return bitset_andn_or_cmp_ (dst, src1, src2, src3);
-
-  vbitset_resize (dst, BITSET_NBITS_ (src1));
-
-  src1p = VBITSET_WORDS (src1);
-  src2p = VBITSET_WORDS (src2);
-  src3p = VBITSET_WORDS (src3);
-  dstp = VBITSET_WORDS (dst);
-  size = VBITSET_SIZE (dst);
-
-  for (i = 0; i < size; i++, dstp++)
-    {
-      bitset_word tmp = (*src1p++ & ~(*src2p++)) | *src3p++;
-
-      if (*dstp != tmp)
-	{
-	  changed = 1;
-	  *dstp = tmp;
-	}
-    }
-  return changed;
-}
-
-
-static void
-vbitset_or_and (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  unsigned int i;
-  bitset_word *src1p;
-  bitset_word *src2p;
-  bitset_word *src3p;
-  bitset_word *dstp;
-  bitset_windex size;
-
-  if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2)
-      || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3))
-    {
-      bitset_or_and_ (dst, src1, src2, src3);
-      return;
-    }
-
-  vbitset_resize (dst, BITSET_NBITS_ (src1));
-
-  src1p = VBITSET_WORDS (src1);
-  src2p = VBITSET_WORDS (src2);
-  src3p = VBITSET_WORDS (src3);
-  dstp = VBITSET_WORDS (dst);
-  size = VBITSET_SIZE (dst);
-
-  for (i = 0; i < size; i++)
-      *dstp++ = (*src1p++ | *src2p++) & *src3p++;
-}
-
-
-static bool
-vbitset_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
-{
-  unsigned int i;
-  int changed = 0;
-  bitset_word *src1p;
-  bitset_word *src2p;
-  bitset_word *src3p;
-  bitset_word *dstp;
-  bitset_windex size;
-
-  if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2)
-      || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3))
-    return bitset_or_and_cmp_ (dst, src1, src2, src3);
-
-  vbitset_resize (dst, BITSET_NBITS_ (src1));
-
-  src1p = VBITSET_WORDS (src1);
-  src2p = VBITSET_WORDS (src2);
-  src3p = VBITSET_WORDS (src3);
-  dstp = VBITSET_WORDS (dst);
-  size = VBITSET_SIZE (dst);
-
-  for (i = 0; i < size; i++, dstp++)
-    {
-      bitset_word tmp = (*src1p++ | *src2p++) & *src3p++;
-
-      if (*dstp != tmp)
-	{
-	  changed = 1;
-	  *dstp = tmp;
-	}
-    }
-  return changed;
-}
-
-
-static void
-vbitset_copy (bitset dst, bitset src)
-{
-  if (BITSET_COMPATIBLE_ (dst, src))
-      vbitset_copy1 (dst, src);
-  else
-      bitset_copy_ (dst, src);
-}
-
-
-/* Vector of operations for multiple word bitsets.  */
-struct bitset_vtable vbitset_vtable = {
-  vbitset_set,
-  vbitset_reset,
-  bitset_toggle_,
-  vbitset_test,
-  vbitset_resize,
-  bitset_size_,
-  bitset_count_,
-  vbitset_empty_p,
-  vbitset_ones,
-  vbitset_zero,
-  vbitset_copy,
-  vbitset_disjoint_p,
-  vbitset_equal_p,
-  vbitset_not,
-  vbitset_subset_p,
-  vbitset_and,
-  vbitset_and_cmp,
-  vbitset_andn,
-  vbitset_andn_cmp,
-  vbitset_or,
-  vbitset_or_cmp,
-  vbitset_xor,
-  vbitset_xor_cmp,
-  vbitset_and_or,
-  vbitset_and_or_cmp,
-  vbitset_andn_or,
-  vbitset_andn_or_cmp,
-  vbitset_or_and,
-  vbitset_or_and_cmp,
-  vbitset_list,
-  vbitset_list_reverse,
-  NULL,
-  BITSET_VARRAY
-};
-
-
-size_t
-vbitset_bytes (n_bits)
-     bitset_bindex n_bits ATTRIBUTE_UNUSED;
-{
-  return sizeof (struct vbitset_struct);
-}
-
-
-bitset
-vbitset_init (bset, n_bits)
-     bitset bset;
-     bitset_bindex n_bits;
-{
-  bset->b.vtable = &vbitset_vtable;
-
-  bset->b.cindex = 0;
-
-  VBITSET_SIZE (bset) = 0;
-  vbitset_resize (bset, n_bits);
-  return bset;
-}
diff --git a/lib/vbitset.h b/lib/vbitset.h
deleted file mode 100644
index bab011c..0000000
--- a/lib/vbitset.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Functions to support vbitsets.
-   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
-   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
-
-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 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, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef _VBITSET_H
-#define _VBITSET_H
-
-#include "bitset.h"
-
-extern size_t vbitset_bytes (bitset_bindex);
-
-extern bitset vbitset_init (bitset, bitset_bindex);
-
-#endif
diff --git a/lib/verify.h b/lib/verify.h
deleted file mode 100644
index d603b17..0000000
--- a/lib/verify.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/* Compile-time assert-like macros.
-
-   Copyright (C) 2005, 2006 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 Paul Eggert, Bruno Haible, and Jim Meyering.  */
-
-#ifndef VERIFY_H
-# define VERIFY_H 1
-
-/* Each of these macros verifies that its argument R is nonzero.  To
-   be portable, R should be an integer constant expression.  Unlike
-   assert (R), there is no run-time overhead.
-
-   There are two macros, since no single macro can be used in all
-   contexts in C.  verify_true (R) is for scalar contexts, including
-   integer constant expression contexts.  verify (R) is for declaration
-   contexts, e.g., the top level.
-
-   Symbols ending in "__" are private to this header.
-
-   The code below uses several ideas.
-
-   * The first step is ((R) ? 1 : -1).  Given an expression R, of
-     integral or boolean or floating-point type, this yields an
-     expression of integral type, whose value is later verified to be
-     constant and nonnegative.
-
-   * Next this expression W is wrapped in a type
-     struct verify_type__ { unsigned int verify_error_if_negative_size__: W; }.
-     If W is negative, this yields a compile-time error.  No compiler can
-     deal with a bit-field of negative size.
-
-     One might think that an array size check would have the same
-     effect, that is, that the type struct { unsigned int dummy[W]; }
-     would work as well.  However, inside a function, some compilers
-     (such as C++ compilers and GNU C) allow local parameters and
-     variables inside array size expressions.  With these compilers,
-     an array size check would not properly diagnose this misuse of
-     the verify macro:
-
-       void function (int n) { verify (n < 0); }
-
-   * For the verify macro, the struct verify_type__ will need to
-     somehow be embedded into a declaration.  To be portable, this
-     declaration must declare an object, a constant, a function, or a
-     typedef name.  If the declared entity uses the type directly,
-     such as in
-
-       struct dummy {...};
-       typedef struct {...} dummy;
-       extern struct {...} *dummy;
-       extern void dummy (struct {...} *);
-       extern struct {...} *dummy (void);
-
-     two uses of the verify macro would yield colliding declarations
-     if the entity names are not disambiguated.  A workaround is to
-     attach the current line number to the entity name:
-
-       #define GL_CONCAT0(x, y) x##y
-       #define GL_CONCAT(x, y) GL_CONCAT0 (x, y)
-       extern struct {...} * GL_CONCAT(dummy,__LINE__);
-
-     But this has the problem that two invocations of verify from
-     within the same macro would collide, since the __LINE__ value
-     would be the same for both invocations.
-
-     A solution is to use the sizeof operator.  It yields a number,
-     getting rid of the identity of the type.  Declarations like
-
-       extern int dummy [sizeof (struct {...})];
-       extern void dummy (int [sizeof (struct {...})]);
-       extern int (*dummy (void)) [sizeof (struct {...})];
-
-     can be repeated.
-
-   * Should the implementation use a named struct or an unnamed struct?
-     Which of the following alternatives can be used?
-
-       extern int dummy [sizeof (struct {...})];
-       extern int dummy [sizeof (struct verify_type__ {...})];
-       extern void dummy (int [sizeof (struct {...})]);
-       extern void dummy (int [sizeof (struct verify_type__ {...})]);
-       extern int (*dummy (void)) [sizeof (struct {...})];
-       extern int (*dummy (void)) [sizeof (struct verify_type__ {...})];
-
-     In the second and sixth case, the struct type is exported to the
-     outer scope; two such declarations therefore collide.  GCC warns
-     about the first, third, and fourth cases.  So the only remaining
-     possibility is the fifth case:
-
-       extern int (*dummy (void)) [sizeof (struct {...})];
-
-   * This implementation exploits the fact that GCC does not warn about
-     the last declaration mentioned above.  If a future version of GCC
-     introduces a warning for this, the problem could be worked around
-     by using code specialized to GCC, e.g.,:
-
-       #if 4 <= __GNUC__
-       # define verify(R) \
-	   extern int (* verify_function__ (void)) \
-		      [__builtin_constant_p (R) && (R) ? 1 : -1]
-       #endif
-
-   * In C++, any struct definition inside sizeof is invalid.
-     Use a template type to work around the problem.  */
-
-
-/* Verify requirement R at compile-time, as an integer constant expression.
-   Return 1.  */
-
-# ifdef __cplusplus
-template <int w>
-  struct verify_type__ { unsigned int verify_error_if_negative_size__: w; };
-#  define verify_true(R) \
-     (!!sizeof (verify_type__<(R) ? 1 : -1>))
-# else
-#  define verify_true(R) \
-     (!!sizeof \
-      (struct { unsigned int verify_error_if_negative_size__: (R) ? 1 : -1; }))
-# endif
-
-/* Verify requirement R at compile-time, as a declaration without a
-   trailing ';'.  */
-
-# define verify(R) extern int (* verify_function__ (void)) [verify_true (R)]
-
-#endif
diff --git a/lib/xalloc-die.c b/lib/xalloc-die.c
deleted file mode 100644
index 9b4a76c..0000000
--- a/lib/xalloc-die.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Report a memory allocation failure and exit.
-
-   Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2006 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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "xalloc.h"
-
-#include <stdlib.h>
-
-#include "error.h"
-#include "exitfail.h"
-
-#include "gettext.h"
-#define _(msgid) gettext (msgid)
-
-void
-xalloc_die (void)
-{
-  error (exit_failure, 0, "%s", _("memory exhausted"));
-
-  /* The `noreturn' cannot be given to error, since it may return if
-     its first argument is 0.  To help compilers understand the
-     xalloc_die does not return, call abort.  Also, the abort is a
-     safety feature if exit_failure is 0 (which shouldn't happen).  */
-  abort ();
-}
diff --git a/lib/xalloc.h b/lib/xalloc.h
deleted file mode 100644
index f80977e..0000000
--- a/lib/xalloc.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* xalloc.h -- malloc with out-of-memory checking
-
-   Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2003, 2004 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.  */
-
-#ifndef XALLOC_H_
-# define XALLOC_H_
-
-# include <stddef.h>
-
-
-# ifdef __cplusplus
-extern "C" {
-# endif
-
-
-# ifndef __attribute__
-#  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
-#   define __attribute__(x)
-#  endif
-# endif
-
-# ifndef ATTRIBUTE_NORETURN
-#  define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
-# endif
-
-/* This function is always triggered when memory is exhausted.
-   It must be defined by the application, either explicitly
-   or by using gnulib's xalloc-die module.  This is the
-   function to call when one wants the program to die because of a
-   memory allocation failure.  */
-extern void xalloc_die (void) ATTRIBUTE_NORETURN;
-
-void *xmalloc (size_t s);
-void *xnmalloc (size_t n, size_t s);
-void *xzalloc (size_t s);
-void *xcalloc (size_t n, size_t s);
-void *xrealloc (void *p, size_t s);
-void *xnrealloc (void *p, size_t n, size_t s);
-void *x2realloc (void *p, size_t *pn);
-void *x2nrealloc (void *p, size_t *pn, size_t s);
-void *xmemdup (void const *p, size_t s);
-char *xstrdup (char const *str);
-
-/* Return 1 if an array of N objects, each of size S, cannot exist due
-   to size arithmetic overflow.  S must be positive and N must be
-   nonnegative.  This is a macro, not an inline function, so that it
-   works correctly even when SIZE_MAX < N.
-
-   By gnulib convention, SIZE_MAX represents overflow in size
-   calculations, so the conservative dividend to use here is
-   SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value.
-   However, malloc (SIZE_MAX) fails on all known hosts where
-   sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for
-   exactly-SIZE_MAX allocations on such hosts; this avoids a test and
-   branch when S is known to be 1.  */
-# define xalloc_oversized(n, s) \
-    ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n))
-
-# ifdef __cplusplus
-}
-# endif
-
-
-#endif /* !XALLOC_H_ */
diff --git a/lib/xmalloc.c b/lib/xmalloc.c
deleted file mode 100644
index 687633c..0000000
--- a/lib/xmalloc.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/* xmalloc.c -- malloc with out of memory checking
-
-   Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2002, 2003, 2004, 2005 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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "xalloc.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#ifndef SIZE_MAX
-# define SIZE_MAX ((size_t) -1)
-#endif
-
-/* 1 if calloc is known to be compatible with GNU calloc.  This
-   matters if we are not also using the calloc module, which defines
-   HAVE_CALLOC and supports the GNU API even on non-GNU platforms.  */
-#if defined HAVE_CALLOC || defined __GLIBC__
-enum { HAVE_GNU_CALLOC = 1 };
-#else
-enum { HAVE_GNU_CALLOC = 0 };
-#endif
-
-/* Allocate an array of N objects, each with S bytes of memory,
-   dynamically, with error checking.  S must be nonzero.  */
-
-static inline void *
-xnmalloc_inline (size_t n, size_t s)
-{
-  void *p;
-  if (xalloc_oversized (n, s) || (! (p = malloc (n * s)) && n != 0))
-    xalloc_die ();
-  return p;
-}
-
-void *
-xnmalloc (size_t n, size_t s)
-{
-  return xnmalloc_inline (n, s);
-}
-
-/* Allocate N bytes of memory dynamically, with error checking.  */
-
-void *
-xmalloc (size_t n)
-{
-  return xnmalloc_inline (n, 1);
-}
-
-/* Change the size of an allocated block of memory P to an array of N
-   objects each of S bytes, with error checking.  S must be nonzero.  */
-
-static inline void *
-xnrealloc_inline (void *p, size_t n, size_t s)
-{
-  if (xalloc_oversized (n, s) || (! (p = realloc (p, n * s)) && n != 0))
-    xalloc_die ();
-  return p;
-}
-
-void *
-xnrealloc (void *p, size_t n, size_t s)
-{
-  return xnrealloc_inline (p, n, s);
-}
-
-/* Change the size of an allocated block of memory P to N bytes,
-   with error checking.  */
-
-void *
-xrealloc (void *p, size_t n)
-{
-  return xnrealloc_inline (p, n, 1);
-}
-
-
-/* If P is null, allocate a block of at least *PN such objects;
-   otherwise, reallocate P so that it contains more than *PN objects
-   each of S bytes.  *PN must be nonzero unless P is null, and S must
-   be nonzero.  Set *PN to the new number of objects, and return the
-   pointer to the new block.  *PN is never set to zero, and the
-   returned pointer is never null.
-
-   Repeated reallocations are guaranteed to make progress, either by
-   allocating an initial block with a nonzero size, or by allocating a
-   larger block.
-
-   In the following implementation, nonzero sizes are doubled so that
-   repeated reallocations have O(N log N) overall cost rather than
-   O(N**2) cost, but the specification for this function does not
-   guarantee that sizes are doubled.
-
-   Here is an example of use:
-
-     int *p = NULL;
-     size_t used = 0;
-     size_t allocated = 0;
-
-     void
-     append_int (int value)
-       {
-	 if (used == allocated)
-	   p = x2nrealloc (p, &allocated, sizeof *p);
-	 p[used++] = value;
-       }
-
-   This causes x2nrealloc to allocate a block of some nonzero size the
-   first time it is called.
-
-   To have finer-grained control over the initial size, set *PN to a
-   nonzero value before calling this function with P == NULL.  For
-   example:
-
-     int *p = NULL;
-     size_t used = 0;
-     size_t allocated = 0;
-     size_t allocated1 = 1000;
-
-     void
-     append_int (int value)
-       {
-	 if (used == allocated)
-	   {
-	     p = x2nrealloc (p, &allocated1, sizeof *p);
-	     allocated = allocated1;
-	   }
-	 p[used++] = value;
-       }
-
-   */
-
-static inline void *
-x2nrealloc_inline (void *p, size_t *pn, size_t s)
-{
-  size_t n = *pn;
-
-  if (! p)
-    {
-      if (! n)
-	{
-	  /* The approximate size to use for initial small allocation
-	     requests, when the invoking code specifies an old size of
-	     zero.  64 bytes is the largest "small" request for the
-	     GNU C library malloc.  */
-	  enum { DEFAULT_MXFAST = 64 };
-
-	  n = DEFAULT_MXFAST / s;
-	  n += !n;
-	}
-    }
-  else
-    {
-      if (SIZE_MAX / 2 / s < n)
-	xalloc_die ();
-      n *= 2;
-    }
-
-  *pn = n;
-  return xrealloc (p, n * s);
-}
-
-void *
-x2nrealloc (void *p, size_t *pn, size_t s)
-{
-  return x2nrealloc_inline (p, pn, s);
-}
-
-/* If P is null, allocate a block of at least *PN bytes; otherwise,
-   reallocate P so that it contains more than *PN bytes.  *PN must be
-   nonzero unless P is null.  Set *PN to the new block's size, and
-   return the pointer to the new block.  *PN is never set to zero, and
-   the returned pointer is never null.  */
-
-void *
-x2realloc (void *p, size_t *pn)
-{
-  return x2nrealloc_inline (p, pn, 1);
-}
-
-/* Allocate S bytes of zeroed memory dynamically, with error checking.
-   There's no need for xnzalloc (N, S), since it would be equivalent
-   to xcalloc (N, S).  */
-
-void *
-xzalloc (size_t s)
-{
-  return memset (xmalloc (s), 0, s);
-}
-
-/* Allocate zeroed memory for N elements of S bytes, with error
-   checking.  S must be nonzero.  */
-
-void *
-xcalloc (size_t n, size_t s)
-{
-  void *p;
-  /* Test for overflow, since some calloc implementations don't have
-     proper overflow checks.  But omit overflow and size-zero tests if
-     HAVE_GNU_CALLOC, since GNU calloc catches overflow and never
-     returns NULL if successful.  */
-  if ((! HAVE_GNU_CALLOC && xalloc_oversized (n, s))
-      || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0)))
-    xalloc_die ();
-  return p;
-}
-
-/* Clone an object P of size S, with error checking.  There's no need
-   for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any
-   need for an arithmetic overflow check.  */
-
-void *
-xmemdup (void const *p, size_t s)
-{
-  return memcpy (xmalloc (s), p, s);
-}
-
-/* Clone STRING.  */
-
-char *
-xstrdup (char const *string)
-{
-  return xmemdup (string, strlen (string) + 1);
-}
diff --git a/lib/xstrndup.c b/lib/xstrndup.c
deleted file mode 100644
index a62d4bd..0000000
--- a/lib/xstrndup.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Duplicate a bounded initial segment of a string, with out-of-memory
-   checking.
-   Copyright (C) 2003 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.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-/* Specification.  */
-#include "xstrndup.h"
-
-#include "strndup.h"
-#include "xalloc.h"
-
-/* Return a newly allocated copy of at most N bytes of STRING.
-   In other words, return a copy of the initial segment of length N of
-   STRING.  */
-char *
-xstrndup (const char *string, size_t n)
-{
-  char *s = strndup (string, n);
-  if (! s)
-    xalloc_die ();
-  return s;
-}
diff --git a/lib/xstrndup.h b/lib/xstrndup.h
deleted file mode 100644
index 88354cf..0000000
--- a/lib/xstrndup.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Duplicate a bounded initial segment of a string, with out-of-memory
-   checking.
-   Copyright (C) 2003 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.  */
-
-#include <stddef.h>
-
-/* Return a newly allocated copy of at most N bytes of STRING.
-   In other words, return a copy of the initial segment of length N of
-   STRING.  */
-extern char *xstrndup (const char *string, size_t n);
diff --git a/lib/yyerror.c b/lib/yyerror.c
deleted file mode 100644
index b4ce4ba..0000000
--- a/lib/yyerror.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Yacc library error-printing function.
-
-   Copyright (C) 2002 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <stdio.h>
-
-int yyerror (char const *);
-
-int
-yyerror (char const *message)
-{
-  return fprintf (stderr, "%s\n", message);
-}
diff --git a/m4/bison-i18n.m4 b/m4/bison-i18n.m4
deleted file mode 100644
index 2fe6c60..0000000
--- a/m4/bison-i18n.m4
+++ /dev/null
@@ -1,59 +0,0 @@
-# bison-i18n.m4 serial 1 (bison-2.1)
-dnl Copyright (C) 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Bruno Haible.
-
-dnl Support for internationalization of bison-generated parsers.
-
-dnl BISON_I18N
-dnl should be used in configure.ac, after AM_GNU_GETTEXT. If USE_NLS is yes, it
-dnl sets BISON_LOCALEDIR to indicate where to find the bison-runtime.mo files
-dnl and defines YYENABLE_NLS if there are bison-runtime.mo files at all.
-AC_DEFUN([BISON_I18N],
-[
-  if test -z "$USE_NLS"; then
-    echo "The BISON-I18N macro is used without being preceded by AM-GNU-GETTEXT." 1>&2
-    exit 1
-  fi
-  BISON_LOCALEDIR=
-  if test "$USE_NLS" = yes; then
-    dnl AC_PROG_YACC sets the YACC variable; other macros set the BISON variable.
-    if test -n "$YACC"; then
-      case "$YACC" in
-        *bison*)
-          if ($YACC --print-localedir) >/dev/null 2>&1; then
-            BISON_LOCALEDIR=`$YACC --print-localedir`
-          fi
-          ;;
-      esac
-    else
-      if test -n "$BISON"; then
-        if test "$BISON" != ":"; then
-          if ($BISON --print-localedir) >/dev/null 2>&1; then
-            BISON_LOCALEDIR=`$BISON --print-localedir`
-          fi
-        fi
-      fi
-    fi
-    AC_SUBST([BISON_LOCALEDIR])
-    if test -n "$BISON_LOCALEDIR"; then
-      USER_LINGUAS="${LINGUAS-%UNSET%}"
-      if test -n "$USER_LINGUAS"; then
-        BISON_USE_NLS=yes
-      else
-        BISON_USE_NLS=no
-      fi
-    else
-      BISON_USE_NLS=no
-    fi
-  else
-    BISON_USE_NLS=no
-  fi
-  if test $BISON_USE_NLS = yes; then
-    AC_DEFINE([YYENABLE_NLS], 1,
-      [Define to 1 to internationalize bison runtime messages.])
-  fi
-])
diff --git a/m4/c-working.m4 b/m4/c-working.m4
deleted file mode 100644
index ec74035..0000000
--- a/m4/c-working.m4
+++ /dev/null
@@ -1,29 +0,0 @@
-# Sanity test a C compiler.
-
-# Copyright (C) 2006 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 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
-
-# Written by Paul Eggert.
-
-AC_DEFUN([BISON_TEST_FOR_WORKING_C_COMPILER], [
-  AC_COMPILE_IFELSE(
-    [AC_LANG_PROGRAM(
-       [[#include <limits.h>
-	 int test_array[CHAR_BIT];]])],
-    [],
-    [AC_MSG_FAILURE([cannot compile a simple C program])])
-])
diff --git a/m4/cxx.m4 b/m4/cxx.m4
deleted file mode 100644
index bae5652..0000000
--- a/m4/cxx.m4
+++ /dev/null
@@ -1,62 +0,0 @@
-# -*- Autoconf -*-
-# Sanity-test a C++ compiler.
-#
-# Copyright (C) 2004, 2006 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 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
-
-# Written by Paul Eggert.
-
-AC_DEFUN([BISON_TEST_FOR_WORKING_CXX_COMPILER],
-[
- AC_CACHE_CHECK([whether $CXX builds executables that work],
-   bison_cv_cxx_works,
-   [AC_LANG_PUSH([C++])
-    bison_cv_cxx_works=no
-    AC_COMPILE_IFELSE(
-      [AC_LANG_PROGRAM(
-	 [#include <cstdlib>
-	  #include <iostream>
-	  #include <map>
-	  #include <string>
-	  using namespace std;],
-         [std::cerr << "";
-          cout << "";
-	  typedef std::pair<unsigned int, int> uipair;
-	  std::map<unsigned int, int> m;
-	  std::map<unsigned int, int>::iterator i;
-	  m.insert (uipair (4, -4));
-	  for (i = m.begin (); i != m.end (); ++i)
-	    if (i->first != 4)
-	      return 1;])],
-      [AS_IF([AC_TRY_COMMAND([$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD])],
-	 [AS_IF([test "$cross_compiling" = yes],
-	    [bison_cv_cxx_works=cross],
-	    [AS_IF([AC_TRY_COMMAND(./conftest$ac_exeext)],
-	       [bison_cv_cxx_works=yes])])])
-       rm -f conftest$ac_exeext])
-    AC_LANG_POP([C++])])
-
- case $bison_cv_cxx_works in
- yes)
-    BISON_CXX_WORKS=':';;
- no | cross)
-    BISON_CXX_WORKS='exit 77';;
- esac
-
- AC_SUBST([BISON_CXX_WORKS])
- AM_CONDITIONAL(BISON_CXX_WORKS, test $bison_cv_cxx_works = yes)
-])
diff --git a/m4/dirname.m4 b/m4/dirname.m4
deleted file mode 100644
index e36937d..0000000
--- a/m4/dirname.m4
+++ /dev/null
@@ -1,16 +0,0 @@
-# dirname.m4 serial 5
-dnl Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_DIRNAME],
-[
-  AC_LIBSOURCES([dirname.c, dirname.h])
-  AC_LIBOBJ([dirname])
-
-  dnl Prerequisites of lib/dirname.h.
-  AC_REQUIRE([gl_AC_DOS])
-
-  dnl No prerequisites of lib/basename.c, lib/dirname.c, lib/stripslash.c.
-])
diff --git a/m4/dmalloc.m4 b/m4/dmalloc.m4
deleted file mode 100644
index f724670..0000000
--- a/m4/dmalloc.m4
+++ /dev/null
@@ -1,22 +0,0 @@
-## ----------------------------------- ##
-## Check if --with-dmalloc was given.  ##
-## From Franc,ois Pinard               ##
-## ----------------------------------- ##
-
-# serial 1
-
-AC_DEFUN([AM_WITH_DMALLOC],
-[AC_MSG_CHECKING([if malloc debugging is wanted])
-AC_ARG_WITH(dmalloc,
-[  --with-dmalloc          use dmalloc, as in
-                          http://www.dmalloc.com/dmalloc.tar.gz],
-[if test "$withval" = yes; then
-  AC_MSG_RESULT(yes)
-  AC_DEFINE(WITH_DMALLOC,1,
-            [Define if using the dmalloc debugging malloc package])
-  LIBS="$LIBS -ldmalloc"
-  LDFLAGS="$LDFLAGS -g"
-else
-  AC_MSG_RESULT(no)
-fi], [AC_MSG_RESULT(no)])
-])
diff --git a/m4/dos.m4 b/m4/dos.m4
deleted file mode 100644
index 0713cf1..0000000
--- a/m4/dos.m4
+++ /dev/null
@@ -1,58 +0,0 @@
-#serial 9
-
-# Define some macros required for proper operation of code in lib/*.c
-# on MSDOS/Windows systems.
-
-# Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# From Jim Meyering.
-
-AC_DEFUN([gl_AC_DOS],
-  [
-    AC_CACHE_CHECK([whether system is Windows or MSDOS], [ac_cv_win_or_dos],
-      [
-        AC_TRY_COMPILE([],
-        [#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __CYGWIN__
-neither MSDOS nor Windows
-#endif],
-        [ac_cv_win_or_dos=yes],
-        [ac_cv_win_or_dos=no])
-      ])
-
-    if test x"$ac_cv_win_or_dos" = xyes; then
-      ac_fs_accepts_drive_letter_prefix=1
-      ac_fs_backslash_is_file_name_separator=1
-    else
-      ac_fs_accepts_drive_letter_prefix=0
-      ac_fs_backslash_is_file_name_separator=0
-    fi
-
-    AH_VERBATIM(FILE_SYSTEM_PREFIX_LEN,
-    [#if FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX
-# define FILE_SYSTEM_PREFIX_LEN(Filename) \
-  ((Filename)[0] && (Filename)[1] == ':' ? 2 : 0)
-#else
-# define FILE_SYSTEM_PREFIX_LEN(Filename) 0
-#endif])
-
-    AC_DEFINE_UNQUOTED([FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX],
-      $ac_fs_accepts_drive_letter_prefix,
-      [Define on systems for which file names may have a so-called
-       `drive letter' prefix, define this to compute the length of that
-       prefix, including the colon.])
-
-    AH_VERBATIM(ISSLASH,
-    [#if FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR
-# define ISSLASH(C) ((C) == '/' || (C) == '\\')
-#else
-# define ISSLASH(C) ((C) == '/')
-#endif])
-
-    AC_DEFINE_UNQUOTED([FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR],
-      $ac_fs_backslash_is_file_name_separator,
-      [Define if the backslash character may also serve as a file name
-       component separator.])
-  ])
diff --git a/m4/error.m4 b/m4/error.m4
deleted file mode 100644
index 7c7746e..0000000
--- a/m4/error.m4
+++ /dev/null
@@ -1,22 +0,0 @@
-#serial 11
-
-# Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2004 Free Software
-# Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_ERROR],
-[
-  AC_FUNC_ERROR_AT_LINE
-  dnl Note: AC_FUNC_ERROR_AT_LINE does AC_LIBSOURCES([error.h, error.c]).
-  gl_PREREQ_ERROR
-])
-
-# Prerequisites of lib/error.c.
-AC_DEFUN([gl_PREREQ_ERROR],
-[
-  AC_REQUIRE([AC_FUNC_STRERROR_R])
-  :
-])
diff --git a/m4/exitfail.m4 b/m4/exitfail.m4
deleted file mode 100644
index 5523676..0000000
--- a/m4/exitfail.m4
+++ /dev/null
@@ -1,14 +0,0 @@
-# exitfail.m4 serial 5
-dnl Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_EXITFAIL],
-[
-  AC_LIBSOURCES([exitfail.c, exitfail.h])
-  AC_LIBOBJ([exitfail])
-
-  dnl No prerequisites of lib/exitfail.c.
-  :
-])
diff --git a/m4/extensions.m4 b/m4/extensions.m4
deleted file mode 100644
index 4976079..0000000
--- a/m4/extensions.m4
+++ /dev/null
@@ -1,42 +0,0 @@
-# Enable extensions on systems that normally disable them.
-
-# Copyright (C) 2003, 2006 Free Software Foundation, Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This file is only needed in autoconf <= 2.59.  Newer versions of autoconf
-# have a macro AC_USE_SYSTEM_EXTENSIONS with identical semantics.
-
-# gl_USE_SYSTEM_EXTENSIONS
-# ------------------------
-# Enable extensions on systems that normally disable them,
-# typically due to standards-conformance issues.
-AC_DEFUN([gl_USE_SYSTEM_EXTENSIONS], [
-  AC_BEFORE([$0], [AC_COMPILE_IFELSE])
-  AC_BEFORE([$0], [AC_RUN_IFELSE])
-
-  AC_REQUIRE([AC_GNU_SOURCE])
-  AC_REQUIRE([AC_AIX])
-  AC_REQUIRE([AC_MINIX])
-
-  AH_VERBATIM([__EXTENSIONS__],
-[/* Enable extensions on Solaris.  */
-#ifndef __EXTENSIONS__
-# undef __EXTENSIONS__
-#endif
-#ifndef _POSIX_PTHREAD_SEMANTICS
-# undef _POSIX_PTHREAD_SEMANTICS
-#endif])
-  AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__],
-    [ac_cv_safe_to_define___extensions__],
-    [AC_COMPILE_IFELSE(
-       [AC_LANG_PROGRAM([
-	  #define __EXTENSIONS__ 1
-	  AC_INCLUDES_DEFAULT])],
-       [ac_cv_safe_to_define___extensions__=yes],
-       [ac_cv_safe_to_define___extensions__=no])])
-  test $ac_cv_safe_to_define___extensions__ = yes &&
-    AC_DEFINE([__EXTENSIONS__])
-  AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
-])
diff --git a/m4/getopt.m4 b/m4/getopt.m4
deleted file mode 100644
index e60b746..0000000
--- a/m4/getopt.m4
+++ /dev/null
@@ -1,83 +0,0 @@
-# getopt.m4 serial 12
-dnl Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-# The getopt module assume you want GNU getopt, with getopt_long etc,
-# rather than vanilla POSIX getopt.  This means your your code should
-# always include <getopt.h> for the getopt prototypes.
-
-AC_DEFUN([gl_GETOPT_SUBSTITUTE],
-[
-  AC_LIBOBJ([getopt])
-  AC_LIBOBJ([getopt1])
-  gl_GETOPT_SUBSTITUTE_HEADER
-  gl_PREREQ_GETOPT
-])
-
-AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER],
-[
-  GETOPT_H=getopt.h
-  AC_DEFINE([__GETOPT_PREFIX], [[rpl_]],
-    [Define to rpl_ if the getopt replacement functions and variables
-     should be used.])
-  AC_SUBST([GETOPT_H])
-])
-
-AC_DEFUN([gl_GETOPT_CHECK_HEADERS],
-[
-  if test -z "$GETOPT_H"; then
-    AC_CHECK_HEADERS([getopt.h], [], [GETOPT_H=getopt.h])
-  fi
-
-  if test -z "$GETOPT_H"; then
-    AC_CHECK_FUNCS([getopt_long_only], [], [GETOPT_H=getopt.h])
-  fi
-
-  dnl BSD getopt_long uses an incompatible method to reset option processing,
-  dnl and (as of 2004-10-15) mishandles optional option-arguments.
-  if test -z "$GETOPT_H"; then
-    AC_CHECK_DECL([optreset], [GETOPT_H=getopt.h], [], [#include <getopt.h>])
-  fi
-
-  dnl Solaris 10 getopt doesn't handle `+' as a leading character in an
-  dnl option string (as of 2005-05-05).
-  if test -z "$GETOPT_H"; then
-    AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_gnu_getopt],
-      [AC_RUN_IFELSE(
-	[AC_LANG_PROGRAM([#include <getopt.h>],
-	   [[
-	     char *myargv[3];
-	     myargv[0] = "conftest";
-	     myargv[1] = "-+";
-	     myargv[2] = 0;
-	     return getopt (2, myargv, "+a") != '?';
-	   ]])],
-	[gl_cv_func_gnu_getopt=yes],
-	[gl_cv_func_gnu_getopt=no],
-	[dnl cross compiling - pessimistically guess based on decls
-	 dnl Solaris 10 getopt doesn't handle `+' as a leading character in an
-	 dnl option string (as of 2005-05-05).
-	 AC_CHECK_DECL([getopt_clip],
-	   [gl_cv_func_gnu_getopt=no], [gl_cv_func_gnu_getopt=yes],
-	   [#include <getopt.h>])])])
-    if test "$gl_cv_func_gnu_getopt" = "no"; then
-      GETOPT_H=getopt.h
-    fi
-  fi
-])
-
-AC_DEFUN([gl_GETOPT_IFELSE],
-[
-  AC_REQUIRE([gl_GETOPT_CHECK_HEADERS])
-  AS_IF([test -n "$GETOPT_H"], [$1], [$2])
-])
-
-AC_DEFUN([gl_GETOPT], [gl_GETOPT_IFELSE([gl_GETOPT_SUBSTITUTE])])
-
-# Prerequisites of lib/getopt*.
-AC_DEFUN([gl_PREREQ_GETOPT],
-[
-  AC_CHECK_DECLS_ONCE([getenv])
-])
diff --git a/m4/gettext_gl.m4 b/m4/gettext_gl.m4
deleted file mode 100644
index 023f7bc..0000000
--- a/m4/gettext_gl.m4
+++ /dev/null
@@ -1,427 +0,0 @@
-# gettext.m4 serial 37 (gettext-0.14.4)
-dnl Copyright (C) 1995-2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-dnl
-dnl This file can can be used in projects which are not available under
-dnl the GNU General Public License or the GNU Library General Public
-dnl License but which still want to provide support for the GNU gettext
-dnl functionality.
-dnl Please note that the actual code of the GNU gettext library is covered
-dnl by the GNU Library General Public License, and the rest of the GNU
-dnl gettext package package is covered by the GNU General Public License.
-dnl They are *not* in the public domain.
-
-dnl Authors:
-dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
-dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
-
-dnl Macro to add for using GNU gettext.
-
-dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
-dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
-dnl    default (if it is not specified or empty) is 'no-libtool'.
-dnl    INTLSYMBOL should be 'external' for packages with no intl directory,
-dnl    and 'no-libtool' or 'use-libtool' for packages with an intl directory.
-dnl    If INTLSYMBOL is 'use-libtool', then a libtool library
-dnl    $(top_builddir)/intl/libintl.la will be created (shared and/or static,
-dnl    depending on --{enable,disable}-{shared,static} and on the presence of
-dnl    AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
-dnl    $(top_builddir)/intl/libintl.a will be created.
-dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
-dnl    implementations (in libc or libintl) without the ngettext() function
-dnl    will be ignored.  If NEEDSYMBOL is specified and is
-dnl    'need-formatstring-macros', then GNU gettext implementations that don't
-dnl    support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
-dnl INTLDIR is used to find the intl libraries.  If empty,
-dnl    the value `$(top_builddir)/intl/' is used.
-dnl
-dnl The result of the configuration is one of three cases:
-dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
-dnl    and used.
-dnl    Catalog format: GNU --> install in $(datadir)
-dnl    Catalog extension: .mo after installation, .gmo in source tree
-dnl 2) GNU gettext has been found in the system's C library.
-dnl    Catalog format: GNU --> install in $(datadir)
-dnl    Catalog extension: .mo after installation, .gmo in source tree
-dnl 3) No internationalization, always use English msgid.
-dnl    Catalog format: none
-dnl    Catalog extension: none
-dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
-dnl The use of .gmo is historical (it was needed to avoid overwriting the
-dnl GNU format catalogs when building on a platform with an X/Open gettext),
-dnl but we keep it in order not to force irrelevant filename changes on the
-dnl maintainers.
-dnl
-AC_DEFUN([AM_GNU_GETTEXT],
-[
-  dnl Argument checking.
-  ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
-    [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
-])])])])])
-  ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
-    [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
-])])])])
-  define([gt_included_intl], ifelse([$1], [external], [no], [yes]))
-  define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], []))
-
-  AC_REQUIRE([AM_PO_SUBDIRS])dnl
-  ifelse(gt_included_intl, yes, [
-    AC_REQUIRE([AM_INTL_SUBDIR])dnl
-  ])
-
-  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
-  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
-  AC_REQUIRE([AC_LIB_RPATH])
-
-  dnl Sometimes libintl requires libiconv, so first search for libiconv.
-  dnl Ideally we would do this search only after the
-  dnl      if test "$USE_NLS" = "yes"; then
-  dnl        if test "$gt_cv_func_gnugettext_libc" != "yes"; then
-  dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
-  dnl the configure script would need to contain the same shell code
-  dnl again, outside any 'if'. There are two solutions:
-  dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
-  dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
-  dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
-  dnl documented, we avoid it.
-  ifelse(gt_included_intl, yes, , [
-    AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
-  ])
-
-  dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation.
-  gt_INTL_MACOSX
-
-  dnl Set USE_NLS.
-  AM_NLS
-
-  ifelse(gt_included_intl, yes, [
-    BUILD_INCLUDED_LIBINTL=no
-    USE_INCLUDED_LIBINTL=no
-  ])
-  LIBINTL=
-  LTLIBINTL=
-  POSUB=
-
-  dnl If we use NLS figure out what method
-  if test "$USE_NLS" = "yes"; then
-    gt_use_preinstalled_gnugettext=no
-    ifelse(gt_included_intl, yes, [
-      AC_MSG_CHECKING([whether included gettext is requested])
-      AC_ARG_WITH(included-gettext,
-        [  --with-included-gettext use the GNU gettext library included here],
-        nls_cv_force_use_gnu_gettext=$withval,
-        nls_cv_force_use_gnu_gettext=no)
-      AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
-
-      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
-      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
-    ])
-        dnl User does not insist on using GNU NLS library.  Figure out what
-        dnl to use.  If GNU gettext is available we use this.  Else we have
-        dnl to fall back to GNU NLS library.
-
-        dnl Add a version number to the cache macros.
-        define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1)))
-        define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc])
-        define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl])
-
-        AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,
-         [AC_TRY_LINK([#include <libintl.h>
-]ifelse([$2], [need-formatstring-macros],
-[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
-#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
-#endif
-changequote(,)dnl
-typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
-changequote([,])dnl
-], [])[extern int _nl_msg_cat_cntr;
-extern int *_nl_domain_bindings;],
-            [bindtextdomain ("", "");
-return * gettext ("")]ifelse([$2], [need-ngettext], [ + * ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings],
-            gt_cv_func_gnugettext_libc=yes,
-            gt_cv_func_gnugettext_libc=no)])
-
-        if test "$gt_cv_func_gnugettext_libc" != "yes"; then
-          dnl Sometimes libintl requires libiconv, so first search for libiconv.
-          ifelse(gt_included_intl, yes, , [
-            AM_ICONV_LINK
-          ])
-          dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
-          dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
-          dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
-          dnl even if libiconv doesn't exist.
-          AC_LIB_LINKFLAGS_BODY([intl])
-          AC_CACHE_CHECK([for GNU gettext in libintl],
-            gt_cv_func_gnugettext_libintl,
-           [gt_save_CPPFLAGS="$CPPFLAGS"
-            CPPFLAGS="$CPPFLAGS $INCINTL"
-            gt_save_LIBS="$LIBS"
-            LIBS="$LIBS $LIBINTL"
-            dnl Now see whether libintl exists and does not depend on libiconv.
-            AC_TRY_LINK([#include <libintl.h>
-]ifelse([$2], [need-formatstring-macros],
-[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
-#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
-#endif
-changequote(,)dnl
-typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
-changequote([,])dnl
-], [])[extern int _nl_msg_cat_cntr;
-extern
-#ifdef __cplusplus
-"C"
-#endif
-const char *_nl_expand_alias (const char *);],
-              [bindtextdomain ("", "");
-return * gettext ("")]ifelse([$2], [need-ngettext], [ + * ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias ("")],
-              gt_cv_func_gnugettext_libintl=yes,
-              gt_cv_func_gnugettext_libintl=no)
-            dnl Now see whether libintl exists and depends on libiconv.
-            if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then
-              LIBS="$LIBS $LIBICONV"
-              AC_TRY_LINK([#include <libintl.h>
-]ifelse([$2], [need-formatstring-macros],
-[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
-#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
-#endif
-changequote(,)dnl
-typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
-changequote([,])dnl
-], [])[extern int _nl_msg_cat_cntr;
-extern
-#ifdef __cplusplus
-"C"
-#endif
-const char *_nl_expand_alias (const char *);],
-                [bindtextdomain ("", "");
-return * gettext ("")]ifelse([$2], [need-ngettext], [ + * ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias ("")],
-               [LIBINTL="$LIBINTL $LIBICONV"
-                LTLIBINTL="$LTLIBINTL $LTLIBICONV"
-                gt_cv_func_gnugettext_libintl=yes
-               ])
-            fi
-            CPPFLAGS="$gt_save_CPPFLAGS"
-            LIBS="$gt_save_LIBS"])
-        fi
-
-        dnl If an already present or preinstalled GNU gettext() is found,
-        dnl use it.  But if this macro is used in GNU gettext, and GNU
-        dnl gettext is already preinstalled in libintl, we update this
-        dnl libintl.  (Cf. the install rule in intl/Makefile.in.)
-        if test "$gt_cv_func_gnugettext_libc" = "yes" \
-           || { test "$gt_cv_func_gnugettext_libintl" = "yes" \
-                && test "$PACKAGE" != gettext-runtime \
-                && test "$PACKAGE" != gettext-tools; }; then
-          gt_use_preinstalled_gnugettext=yes
-        else
-          dnl Reset the values set by searching for libintl.
-          LIBINTL=
-          LTLIBINTL=
-          INCINTL=
-        fi
-
-    ifelse(gt_included_intl, yes, [
-        if test "$gt_use_preinstalled_gnugettext" != "yes"; then
-          dnl GNU gettext is not found in the C library.
-          dnl Fall back on included GNU gettext library.
-          nls_cv_use_gnu_gettext=yes
-        fi
-      fi
-
-      if test "$nls_cv_use_gnu_gettext" = "yes"; then
-        dnl Mark actions used to generate GNU NLS library.
-        BUILD_INCLUDED_LIBINTL=yes
-        USE_INCLUDED_LIBINTL=yes
-        LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV"
-        LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV"
-        LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
-      fi
-
-      CATOBJEXT=
-      if test "$gt_use_preinstalled_gnugettext" = "yes" \
-         || test "$nls_cv_use_gnu_gettext" = "yes"; then
-        dnl Mark actions to use GNU gettext tools.
-        CATOBJEXT=.gmo
-      fi
-    ])
-
-    if test -n "$INTL_MACOSX_LIBS"; then
-      if test "$gt_use_preinstalled_gnugettext" = "yes" \
-         || test "$nls_cv_use_gnu_gettext" = "yes"; then
-        dnl Some extra flags are needed during linking.
-        LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
-        LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
-      fi
-    fi
-
-    if test "$gt_use_preinstalled_gnugettext" = "yes" \
-       || test "$nls_cv_use_gnu_gettext" = "yes"; then
-      AC_DEFINE(ENABLE_NLS, 1,
-        [Define to 1 if translation of program messages to the user's native language
-   is requested.])
-    else
-      USE_NLS=no
-    fi
-  fi
-
-  AC_MSG_CHECKING([whether to use NLS])
-  AC_MSG_RESULT([$USE_NLS])
-  if test "$USE_NLS" = "yes"; then
-    AC_MSG_CHECKING([where the gettext function comes from])
-    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
-      if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
-        gt_source="external libintl"
-      else
-        gt_source="libc"
-      fi
-    else
-      gt_source="included intl directory"
-    fi
-    AC_MSG_RESULT([$gt_source])
-  fi
-
-  if test "$USE_NLS" = "yes"; then
-
-    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
-      if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
-        AC_MSG_CHECKING([how to link with libintl])
-        AC_MSG_RESULT([$LIBINTL])
-        AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
-      fi
-
-      dnl For backward compatibility. Some packages may be using this.
-      AC_DEFINE(HAVE_GETTEXT, 1,
-       [Define if the GNU gettext() function is already present or preinstalled.])
-      AC_DEFINE(HAVE_DCGETTEXT, 1,
-       [Define if the GNU dcgettext() function is already present or preinstalled.])
-    fi
-
-    dnl We need to process the po/ directory.
-    POSUB=po
-  fi
-
-  ifelse(gt_included_intl, yes, [
-    dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
-    dnl to 'yes' because some of the testsuite requires it.
-    if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
-      BUILD_INCLUDED_LIBINTL=yes
-    fi
-
-    dnl Make all variables we use known to autoconf.
-    AC_SUBST(BUILD_INCLUDED_LIBINTL)
-    AC_SUBST(USE_INCLUDED_LIBINTL)
-    AC_SUBST(CATOBJEXT)
-
-    dnl For backward compatibility. Some configure.ins may be using this.
-    nls_cv_header_intl=
-    nls_cv_header_libgt=
-
-    dnl For backward compatibility. Some Makefiles may be using this.
-    DATADIRNAME=share
-    AC_SUBST(DATADIRNAME)
-
-    dnl For backward compatibility. Some Makefiles may be using this.
-    INSTOBJEXT=.mo
-    AC_SUBST(INSTOBJEXT)
-
-    dnl For backward compatibility. Some Makefiles may be using this.
-    GENCAT=gencat
-    AC_SUBST(GENCAT)
-
-    dnl For backward compatibility. Some Makefiles may be using this.
-    INTLOBJS=
-    if test "$USE_INCLUDED_LIBINTL" = yes; then
-      INTLOBJS="\$(GETTOBJS)"
-    fi
-    AC_SUBST(INTLOBJS)
-
-    dnl Enable libtool support if the surrounding package wishes it.
-    INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
-    AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
-  ])
-
-  dnl For backward compatibility. Some Makefiles may be using this.
-  INTLLIBS="$LIBINTL"
-  AC_SUBST(INTLLIBS)
-
-  dnl Make all documented variables known to autoconf.
-  AC_SUBST(LIBINTL)
-  AC_SUBST(LTLIBINTL)
-  AC_SUBST(POSUB)
-])
-
-
-dnl Checks for all prerequisites of the intl subdirectory,
-dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS,
-dnl            USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL.
-    AC_DEFUN([AM_INTL_SUBDIR], [])
-
-
-dnl Checks for special options needed on MacOS X.
-dnl Defines INTL_MACOSX_LIBS.
-AC_DEFUN([gt_INTL_MACOSX],
-[
-  dnl Check for API introduced in MacOS X 10.2.
-  AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
-    gt_cv_func_CFPreferencesCopyAppValue,
-    [gt_save_CPPFLAGS="$CPPFLAGS"
-     CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/CoreFoundation.framework/Headers"
-     gt_save_LIBS="$LIBS"
-     LIBS="$LIBS -framework CoreFoundation"
-     AC_TRY_LINK([#include <CFPreferences.h>],
-       [CFPreferencesCopyAppValue(NULL, NULL)],
-       [gt_cv_func_CFPreferencesCopyAppValue=yes],
-       [gt_cv_func_CFPreferencesCopyAppValue=no])
-     CPPFLAGS="$gt_save_CPPFLAGS"
-     LIBS="$gt_save_LIBS"])
-  if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
-    AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], 1,
-      [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
-  fi
-  dnl Check for API introduced in MacOS X 10.3.
-  AC_CACHE_CHECK([for CFLocaleCopyCurrent], gt_cv_func_CFLocaleCopyCurrent,
-    [gt_save_CPPFLAGS="$CPPFLAGS"
-     CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/CoreFoundation.framework/Headers"
-     gt_save_LIBS="$LIBS"
-     LIBS="$LIBS -framework CoreFoundation"
-     AC_TRY_LINK([#include <CFLocale.h>], [CFLocaleCopyCurrent();],
-       [gt_cv_func_CFLocaleCopyCurrent=yes],
-       [gt_cv_func_CFLocaleCopyCurrent=no])
-     CPPFLAGS="$gt_save_CPPFLAGS"
-     LIBS="$gt_save_LIBS"])
-  if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
-    AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], 1,
-      [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
-  fi
-  INTL_MACOSX_LIBS=
-  if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
-    INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
-  fi
-  AC_SUBST([INTL_MACOSX_LIBS])
-])
-
-
-dnl gt_CHECK_DECL(FUNC, INCLUDES)
-dnl Check whether a function is declared.
-AC_DEFUN([gt_CHECK_DECL],
-[
-  AC_CACHE_CHECK([whether $1 is declared], ac_cv_have_decl_$1,
-    [AC_TRY_COMPILE([$2], [
-#ifndef $1
-  char *p = (char *) $1;
-#endif
-], ac_cv_have_decl_$1=yes, ac_cv_have_decl_$1=no)])
-  if test $ac_cv_have_decl_$1 = yes; then
-    gt_value=1
-  else
-    gt_value=0
-  fi
-  AC_DEFINE_UNQUOTED([HAVE_DECL_]translit($1, [a-z], [A-Z]), [$gt_value],
-    [Define to 1 if you have the declaration of `$1', and to 0 if you don't.])
-])
-
-
-dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
-AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
diff --git a/m4/gnulib.m4 b/m4/gnulib.m4
deleted file mode 100644
index 2acf101..0000000
--- a/m4/gnulib.m4
+++ /dev/null
@@ -1,66 +0,0 @@
-# This file is generated automatically by "bootstrap".
-AC_DEFUN([GNULIB_AUTOCONF_SNIPPET],[
-
-gl_DIRNAME
-
-gl_ERROR
-
-
-gl_EXITFAIL
-
-dnl gl_USE_SYSTEM_EXTENSIONS must be added quite early to configure.ac.
-
-gl_GETOPT
-
-AM_GNU_GETTEXT([external])
-AM_GNU_GETTEXT_VERSION([0.14.5])
-
-
-gl_HARD_LOCALE
-
-gl_HASH
-
-
-AC_FUNC_MALLOC
-
-gl_MBSWIDTH
-
-gl_OBSTACK
-
-gl_QUOTE
-
-gl_QUOTEARG
-
-AM_STDBOOL_H
-
-gl_STDIO_SAFER
-
-gl_FUNC_STPCPY
-
-gl_FUNC_STRDUP
-
-gl_FUNC_STRERROR
-
-gl_FUNC_STRNDUP
-
-gl_FUNC_STRNLEN
-
-gl_FUNC_STRTOL
-
-gl_FUNC_STRTOUL
-
-gl_FUNC_STRVERSCMP
-
-gl_HEADER_UNISTD
-
-gl_UNISTD_SAFER
-
-gl_FUNC_GLIBC_UNLOCKED_IO
-
-
-gl_XALLOC
-
-
-gl_XSTRNDUP
-
-])
diff --git a/m4/hard-locale.m4 b/m4/hard-locale.m4
deleted file mode 100644
index 640a755..0000000
--- a/m4/hard-locale.m4
+++ /dev/null
@@ -1,12 +0,0 @@
-# hard-locale.m4 serial 6
-dnl Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl No prerequisites of lib/hard-locale.c.
-AC_DEFUN([gl_HARD_LOCALE],
-[
-  AC_LIBSOURCES([hard-locale.c, hard-locale.h])
-  AC_LIBOBJ([hard-locale])
-])
diff --git a/m4/hash.m4 b/m4/hash.m4
deleted file mode 100644
index 948dd97..0000000
--- a/m4/hash.m4
+++ /dev/null
@@ -1,14 +0,0 @@
-# hash.m4 serial 5
-dnl Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_HASH],
-[
-  AC_LIBSOURCES([hash.c, hash.h])
-  AC_LIBOBJ([hash])
-
-  dnl Prerequisites of lib/hash.c.
-  AC_REQUIRE([AM_STDBOOL_H])
-])
diff --git a/m4/iconv.m4 b/m4/iconv.m4
deleted file mode 100644
index 654c415..0000000
--- a/m4/iconv.m4
+++ /dev/null
@@ -1,101 +0,0 @@
-# iconv.m4 serial AM4 (gettext-0.11.3)
-dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Bruno Haible.
-
-AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
-[
-  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
-  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
-  AC_REQUIRE([AC_LIB_RPATH])
-
-  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
-  dnl accordingly.
-  AC_LIB_LINKFLAGS_BODY([iconv])
-])
-
-AC_DEFUN([AM_ICONV_LINK],
-[
-  dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
-  dnl those with the standalone portable GNU libiconv installed).
-
-  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
-  dnl accordingly.
-  AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
-
-  dnl Add $INCICONV to CPPFLAGS before performing the following checks,
-  dnl because if the user has installed libiconv and not disabled its use
-  dnl via --without-libiconv-prefix, he wants to use it. The first
-  dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed.
-  am_save_CPPFLAGS="$CPPFLAGS"
-  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
-
-  AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [
-    am_cv_func_iconv="no, consider installing GNU libiconv"
-    am_cv_lib_iconv=no
-    AC_TRY_LINK([#include <stdlib.h>
-#include <iconv.h>],
-      [iconv_t cd = iconv_open("","");
-       iconv(cd,NULL,NULL,NULL,NULL);
-       iconv_close(cd);],
-      am_cv_func_iconv=yes)
-    if test "$am_cv_func_iconv" != yes; then
-      am_save_LIBS="$LIBS"
-      LIBS="$LIBS $LIBICONV"
-      AC_TRY_LINK([#include <stdlib.h>
-#include <iconv.h>],
-        [iconv_t cd = iconv_open("","");
-         iconv(cd,NULL,NULL,NULL,NULL);
-         iconv_close(cd);],
-        am_cv_lib_iconv=yes
-        am_cv_func_iconv=yes)
-      LIBS="$am_save_LIBS"
-    fi
-  ])
-  if test "$am_cv_func_iconv" = yes; then
-    AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
-  fi
-  if test "$am_cv_lib_iconv" = yes; then
-    AC_MSG_CHECKING([how to link with libiconv])
-    AC_MSG_RESULT([$LIBICONV])
-  else
-    dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
-    dnl either.
-    CPPFLAGS="$am_save_CPPFLAGS"
-    LIBICONV=
-    LTLIBICONV=
-  fi
-  AC_SUBST(LIBICONV)
-  AC_SUBST(LTLIBICONV)
-])
-
-AC_DEFUN([AM_ICONV],
-[
-  AM_ICONV_LINK
-  if test "$am_cv_func_iconv" = yes; then
-    AC_MSG_CHECKING([for iconv declaration])
-    AC_CACHE_VAL(am_cv_proto_iconv, [
-      AC_TRY_COMPILE([
-#include <stdlib.h>
-#include <iconv.h>
-extern
-#ifdef __cplusplus
-"C"
-#endif
-#if defined(__STDC__) || defined(__cplusplus)
-size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
-#else
-size_t iconv();
-#endif
-], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
-      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
-    am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
-    AC_MSG_RESULT([$]{ac_t:-
-         }[$]am_cv_proto_iconv)
-    AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
-      [Define as const if the declaration of iconv() needs const.])
-  fi
-])
diff --git a/m4/inttypes_h_gl.m4 b/m4/inttypes_h_gl.m4
deleted file mode 100644
index a5d075d..0000000
--- a/m4/inttypes_h_gl.m4
+++ /dev/null
@@ -1,26 +0,0 @@
-# inttypes_h.m4 serial 6
-dnl Copyright (C) 1997-2004 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Paul Eggert.
-
-# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
-# doesn't clash with <sys/types.h>, and declares uintmax_t.
-
-AC_DEFUN([gl_AC_HEADER_INTTYPES_H],
-[
-  AC_CACHE_CHECK([for inttypes.h], gl_cv_header_inttypes_h,
-  [AC_TRY_COMPILE(
-    [#include <sys/types.h>
-#include <inttypes.h>],
-    [uintmax_t i = (uintmax_t) -1;],
-    gl_cv_header_inttypes_h=yes,
-    gl_cv_header_inttypes_h=no)])
-  if test $gl_cv_header_inttypes_h = yes; then
-    AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1,
-      [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
-       and declares uintmax_t. ])
-  fi
-])
diff --git a/m4/lib-ld_gl.m4 b/m4/lib-ld_gl.m4
deleted file mode 100644
index 96c4e2c..0000000
--- a/m4/lib-ld_gl.m4
+++ /dev/null
@@ -1,110 +0,0 @@
-# lib-ld.m4 serial 3 (gettext-0.13)
-dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl Subroutines of libtool.m4,
-dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
-dnl with libtool.m4.
-
-dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
-AC_DEFUN([AC_LIB_PROG_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  acl_cv_prog_gnu_ld=yes ;;
-*)
-  acl_cv_prog_gnu_ld=no ;;
-esac])
-with_gnu_ld=$acl_cv_prog_gnu_ld
-])
-
-dnl From libtool-1.4. Sets the variable LD.
-AC_DEFUN([AC_LIB_PROG_LD],
-[AC_ARG_WITH(gnu-ld,
-[  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]],
-test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-# Prepare PATH_SEPARATOR.
-# 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
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by GCC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [[\\/]* | [A-Za-z]:[\\/]*)]
-      [re_direlt='/[^/][^/]*/\.\./']
-      # Canonicalize the path of ld
-      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
-      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(acl_cv_path_LD,
-[if test -z "$LD"; then
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      acl_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some GNU ld's only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break ;;
-      *)
-	test "$with_gnu_ld" != yes && break ;;
-      esac
-    fi
-  done
-  IFS="$ac_save_ifs"
-else
-  acl_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$acl_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT($LD)
-else
-  AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-AC_LIB_PROG_LD_GNU
-])
diff --git a/m4/lib-link.m4 b/m4/lib-link.m4
deleted file mode 100644
index 244a779..0000000
--- a/m4/lib-link.m4
+++ /dev/null
@@ -1,554 +0,0 @@
-# lib-link.m4 serial 7 (gettext-0.15)
-dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Bruno Haible.
-
-AC_PREREQ(2.50)
-
-dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
-dnl the libraries corresponding to explicit and implicit dependencies.
-dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
-dnl augments the CPPFLAGS variable.
-AC_DEFUN([AC_LIB_LINKFLAGS],
-[
-  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
-  AC_REQUIRE([AC_LIB_RPATH])
-  define([Name],[translit([$1],[./-], [___])])
-  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
-                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
-  AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
-    AC_LIB_LINKFLAGS_BODY([$1], [$2])
-    ac_cv_lib[]Name[]_libs="$LIB[]NAME"
-    ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
-    ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
-  ])
-  LIB[]NAME="$ac_cv_lib[]Name[]_libs"
-  LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
-  INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
-  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
-  AC_SUBST([LIB]NAME)
-  AC_SUBST([LTLIB]NAME)
-  dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
-  dnl results of this search when this library appears as a dependency.
-  HAVE_LIB[]NAME=yes
-  undefine([Name])
-  undefine([NAME])
-])
-
-dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
-dnl searches for libname and the libraries corresponding to explicit and
-dnl implicit dependencies, together with the specified include files and
-dnl the ability to compile and link the specified testcode. If found, it
-dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
-dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
-dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
-dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
-AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
-[
-  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
-  AC_REQUIRE([AC_LIB_RPATH])
-  define([Name],[translit([$1],[./-], [___])])
-  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
-                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
-
-  dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
-  dnl accordingly.
-  AC_LIB_LINKFLAGS_BODY([$1], [$2])
-
-  dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
-  dnl because if the user has installed lib[]Name and not disabled its use
-  dnl via --without-lib[]Name-prefix, he wants to use it.
-  ac_save_CPPFLAGS="$CPPFLAGS"
-  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
-
-  AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
-    ac_save_LIBS="$LIBS"
-    LIBS="$LIBS $LIB[]NAME"
-    AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
-    LIBS="$ac_save_LIBS"
-  ])
-  if test "$ac_cv_lib[]Name" = yes; then
-    HAVE_LIB[]NAME=yes
-    AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
-    AC_MSG_CHECKING([how to link with lib[]$1])
-    AC_MSG_RESULT([$LIB[]NAME])
-  else
-    HAVE_LIB[]NAME=no
-    dnl If $LIB[]NAME didn't lead to a usable library, we don't need
-    dnl $INC[]NAME either.
-    CPPFLAGS="$ac_save_CPPFLAGS"
-    LIB[]NAME=
-    LTLIB[]NAME=
-  fi
-  AC_SUBST([HAVE_LIB]NAME)
-  AC_SUBST([LIB]NAME)
-  AC_SUBST([LTLIB]NAME)
-  undefine([Name])
-  undefine([NAME])
-])
-
-dnl Determine the platform dependent parameters needed to use rpath:
-dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
-dnl hardcode_direct, hardcode_minus_L.
-AC_DEFUN([AC_LIB_RPATH],
-[
-  dnl Tell automake >= 1.10 to complain if config.rpath is missing.
-  m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
-  AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS
-  AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld
-  AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host
-  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
-  AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
-    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
-    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
-    . ./conftest.sh
-    rm -f ./conftest.sh
-    acl_cv_rpath=done
-  ])
-  wl="$acl_cv_wl"
-  libext="$acl_cv_libext"
-  shlibext="$acl_cv_shlibext"
-  hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
-  hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
-  hardcode_direct="$acl_cv_hardcode_direct"
-  hardcode_minus_L="$acl_cv_hardcode_minus_L"
-  dnl Determine whether the user wants rpath handling at all.
-  AC_ARG_ENABLE(rpath,
-    [  --disable-rpath         do not hardcode runtime library paths],
-    :, enable_rpath=yes)
-])
-
-dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
-dnl the libraries corresponding to explicit and implicit dependencies.
-dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
-AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
-[
-  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
-  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
-                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
-  dnl By default, look in $includedir and $libdir.
-  use_additional=yes
-  AC_LIB_WITH_FINAL_PREFIX([
-    eval additional_includedir=\"$includedir\"
-    eval additional_libdir=\"$libdir\"
-  ])
-  AC_LIB_ARG_WITH([lib$1-prefix],
-[  --with-lib$1-prefix[=DIR]  search for lib$1 in DIR/include and DIR/lib
-  --without-lib$1-prefix     don't search for lib$1 in includedir and libdir],
-[
-    if test "X$withval" = "Xno"; then
-      use_additional=no
-    else
-      if test "X$withval" = "X"; then
-        AC_LIB_WITH_FINAL_PREFIX([
-          eval additional_includedir=\"$includedir\"
-          eval additional_libdir=\"$libdir\"
-        ])
-      else
-        additional_includedir="$withval/include"
-        additional_libdir="$withval/$acl_libdirstem"
-      fi
-    fi
-])
-  dnl Search the library and its dependencies in $additional_libdir and
-  dnl $LDFLAGS. Using breadth-first-seach.
-  LIB[]NAME=
-  LTLIB[]NAME=
-  INC[]NAME=
-  rpathdirs=
-  ltrpathdirs=
-  names_already_handled=
-  names_next_round='$1 $2'
-  while test -n "$names_next_round"; do
-    names_this_round="$names_next_round"
-    names_next_round=
-    for name in $names_this_round; do
-      already_handled=
-      for n in $names_already_handled; do
-        if test "$n" = "$name"; then
-          already_handled=yes
-          break
-        fi
-      done
-      if test -z "$already_handled"; then
-        names_already_handled="$names_already_handled $name"
-        dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
-        dnl or AC_LIB_HAVE_LINKFLAGS call.
-        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
-        eval value=\"\$HAVE_LIB$uppername\"
-        if test -n "$value"; then
-          if test "$value" = yes; then
-            eval value=\"\$LIB$uppername\"
-            test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
-            eval value=\"\$LTLIB$uppername\"
-            test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
-          else
-            dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
-            dnl that this library doesn't exist. So just drop it.
-            :
-          fi
-        else
-          dnl Search the library lib$name in $additional_libdir and $LDFLAGS
-          dnl and the already constructed $LIBNAME/$LTLIBNAME.
-          found_dir=
-          found_la=
-          found_so=
-          found_a=
-          if test $use_additional = yes; then
-            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
-              found_dir="$additional_libdir"
-              found_so="$additional_libdir/lib$name.$shlibext"
-              if test -f "$additional_libdir/lib$name.la"; then
-                found_la="$additional_libdir/lib$name.la"
-              fi
-            else
-              if test -f "$additional_libdir/lib$name.$libext"; then
-                found_dir="$additional_libdir"
-                found_a="$additional_libdir/lib$name.$libext"
-                if test -f "$additional_libdir/lib$name.la"; then
-                  found_la="$additional_libdir/lib$name.la"
-                fi
-              fi
-            fi
-          fi
-          if test "X$found_dir" = "X"; then
-            for x in $LDFLAGS $LTLIB[]NAME; do
-              AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-              case "$x" in
-                -L*)
-                  dir=`echo "X$x" | sed -e 's/^X-L//'`
-                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
-                    found_dir="$dir"
-                    found_so="$dir/lib$name.$shlibext"
-                    if test -f "$dir/lib$name.la"; then
-                      found_la="$dir/lib$name.la"
-                    fi
-                  else
-                    if test -f "$dir/lib$name.$libext"; then
-                      found_dir="$dir"
-                      found_a="$dir/lib$name.$libext"
-                      if test -f "$dir/lib$name.la"; then
-                        found_la="$dir/lib$name.la"
-                      fi
-                    fi
-                  fi
-                  ;;
-              esac
-              if test "X$found_dir" != "X"; then
-                break
-              fi
-            done
-          fi
-          if test "X$found_dir" != "X"; then
-            dnl Found the library.
-            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
-            if test "X$found_so" != "X"; then
-              dnl Linking with a shared library. We attempt to hardcode its
-              dnl directory into the executable's runpath, unless it's the
-              dnl standard /usr/lib.
-              if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
-                dnl No hardcoding is needed.
-                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
-              else
-                dnl Use an explicit option to hardcode DIR into the resulting
-                dnl binary.
-                dnl Potentially add DIR to ltrpathdirs.
-                dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
-                haveit=
-                for x in $ltrpathdirs; do
-                  if test "X$x" = "X$found_dir"; then
-                    haveit=yes
-                    break
-                  fi
-                done
-                if test -z "$haveit"; then
-                  ltrpathdirs="$ltrpathdirs $found_dir"
-                fi
-                dnl The hardcoding into $LIBNAME is system dependent.
-                if test "$hardcode_direct" = yes; then
-                  dnl Using DIR/libNAME.so during linking hardcodes DIR into the
-                  dnl resulting binary.
-                  LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
-                else
-                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
-                    dnl Use an explicit option to hardcode DIR into the resulting
-                    dnl binary.
-                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
-                    dnl Potentially add DIR to rpathdirs.
-                    dnl The rpathdirs will be appended to $LIBNAME at the end.
-                    haveit=
-                    for x in $rpathdirs; do
-                      if test "X$x" = "X$found_dir"; then
-                        haveit=yes
-                        break
-                      fi
-                    done
-                    if test -z "$haveit"; then
-                      rpathdirs="$rpathdirs $found_dir"
-                    fi
-                  else
-                    dnl Rely on "-L$found_dir".
-                    dnl But don't add it if it's already contained in the LDFLAGS
-                    dnl or the already constructed $LIBNAME
-                    haveit=
-                    for x in $LDFLAGS $LIB[]NAME; do
-                      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-                      if test "X$x" = "X-L$found_dir"; then
-                        haveit=yes
-                        break
-                      fi
-                    done
-                    if test -z "$haveit"; then
-                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
-                    fi
-                    if test "$hardcode_minus_L" != no; then
-                      dnl FIXME: Not sure whether we should use
-                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
-                      dnl here.
-                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
-                    else
-                      dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
-                      dnl here, because this doesn't fit in flags passed to the
-                      dnl compiler. So give up. No hardcoding. This affects only
-                      dnl very old systems.
-                      dnl FIXME: Not sure whether we should use
-                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
-                      dnl here.
-                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
-                    fi
-                  fi
-                fi
-              fi
-            else
-              if test "X$found_a" != "X"; then
-                dnl Linking with a static library.
-                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
-              else
-                dnl We shouldn't come here, but anyway it's good to have a
-                dnl fallback.
-                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
-              fi
-            fi
-            dnl Assume the include files are nearby.
-            additional_includedir=
-            case "$found_dir" in
-              */$acl_libdirstem | */$acl_libdirstem/)
-                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
-                additional_includedir="$basedir/include"
-                ;;
-            esac
-            if test "X$additional_includedir" != "X"; then
-              dnl Potentially add $additional_includedir to $INCNAME.
-              dnl But don't add it
-              dnl   1. if it's the standard /usr/include,
-              dnl   2. if it's /usr/local/include and we are using GCC on Linux,
-              dnl   3. if it's already present in $CPPFLAGS or the already
-              dnl      constructed $INCNAME,
-              dnl   4. if it doesn't exist as a directory.
-              if test "X$additional_includedir" != "X/usr/include"; then
-                haveit=
-                if test "X$additional_includedir" = "X/usr/local/include"; then
-                  if test -n "$GCC"; then
-                    case $host_os in
-                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
-                    esac
-                  fi
-                fi
-                if test -z "$haveit"; then
-                  for x in $CPPFLAGS $INC[]NAME; do
-                    AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-                    if test "X$x" = "X-I$additional_includedir"; then
-                      haveit=yes
-                      break
-                    fi
-                  done
-                  if test -z "$haveit"; then
-                    if test -d "$additional_includedir"; then
-                      dnl Really add $additional_includedir to $INCNAME.
-                      INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
-                    fi
-                  fi
-                fi
-              fi
-            fi
-            dnl Look for dependencies.
-            if test -n "$found_la"; then
-              dnl Read the .la file. It defines the variables
-              dnl dlname, library_names, old_library, dependency_libs, current,
-              dnl age, revision, installed, dlopen, dlpreopen, libdir.
-              save_libdir="$libdir"
-              case "$found_la" in
-                */* | *\\*) . "$found_la" ;;
-                *) . "./$found_la" ;;
-              esac
-              libdir="$save_libdir"
-              dnl We use only dependency_libs.
-              for dep in $dependency_libs; do
-                case "$dep" in
-                  -L*)
-                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
-                    dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
-                    dnl But don't add it
-                    dnl   1. if it's the standard /usr/lib,
-                    dnl   2. if it's /usr/local/lib and we are using GCC on Linux,
-                    dnl   3. if it's already present in $LDFLAGS or the already
-                    dnl      constructed $LIBNAME,
-                    dnl   4. if it doesn't exist as a directory.
-                    if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
-                      haveit=
-                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
-                        if test -n "$GCC"; then
-                          case $host_os in
-                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
-                          esac
-                        fi
-                      fi
-                      if test -z "$haveit"; then
-                        haveit=
-                        for x in $LDFLAGS $LIB[]NAME; do
-                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-                          if test "X$x" = "X-L$additional_libdir"; then
-                            haveit=yes
-                            break
-                          fi
-                        done
-                        if test -z "$haveit"; then
-                          if test -d "$additional_libdir"; then
-                            dnl Really add $additional_libdir to $LIBNAME.
-                            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
-                          fi
-                        fi
-                        haveit=
-                        for x in $LDFLAGS $LTLIB[]NAME; do
-                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-                          if test "X$x" = "X-L$additional_libdir"; then
-                            haveit=yes
-                            break
-                          fi
-                        done
-                        if test -z "$haveit"; then
-                          if test -d "$additional_libdir"; then
-                            dnl Really add $additional_libdir to $LTLIBNAME.
-                            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
-                          fi
-                        fi
-                      fi
-                    fi
-                    ;;
-                  -R*)
-                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
-                    if test "$enable_rpath" != no; then
-                      dnl Potentially add DIR to rpathdirs.
-                      dnl The rpathdirs will be appended to $LIBNAME at the end.
-                      haveit=
-                      for x in $rpathdirs; do
-                        if test "X$x" = "X$dir"; then
-                          haveit=yes
-                          break
-                        fi
-                      done
-                      if test -z "$haveit"; then
-                        rpathdirs="$rpathdirs $dir"
-                      fi
-                      dnl Potentially add DIR to ltrpathdirs.
-                      dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
-                      haveit=
-                      for x in $ltrpathdirs; do
-                        if test "X$x" = "X$dir"; then
-                          haveit=yes
-                          break
-                        fi
-                      done
-                      if test -z "$haveit"; then
-                        ltrpathdirs="$ltrpathdirs $dir"
-                      fi
-                    fi
-                    ;;
-                  -l*)
-                    dnl Handle this in the next round.
-                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
-                    ;;
-                  *.la)
-                    dnl Handle this in the next round. Throw away the .la's
-                    dnl directory; it is already contained in a preceding -L
-                    dnl option.
-                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
-                    ;;
-                  *)
-                    dnl Most likely an immediate library name.
-                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
-                    LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
-                    ;;
-                esac
-              done
-            fi
-          else
-            dnl Didn't find the library; assume it is in the system directories
-            dnl known to the linker and runtime loader. (All the system
-            dnl directories known to the linker should also be known to the
-            dnl runtime loader, otherwise the system is severely misconfigured.)
-            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
-            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
-          fi
-        fi
-      fi
-    done
-  done
-  if test "X$rpathdirs" != "X"; then
-    if test -n "$hardcode_libdir_separator"; then
-      dnl Weird platform: only the last -rpath option counts, the user must
-      dnl pass all path elements in one option. We can arrange that for a
-      dnl single library, but not when more than one $LIBNAMEs are used.
-      alldirs=
-      for found_dir in $rpathdirs; do
-        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
-      done
-      dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
-      acl_save_libdir="$libdir"
-      libdir="$alldirs"
-      eval flag=\"$hardcode_libdir_flag_spec\"
-      libdir="$acl_save_libdir"
-      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
-    else
-      dnl The -rpath options are cumulative.
-      for found_dir in $rpathdirs; do
-        acl_save_libdir="$libdir"
-        libdir="$found_dir"
-        eval flag=\"$hardcode_libdir_flag_spec\"
-        libdir="$acl_save_libdir"
-        LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
-      done
-    fi
-  fi
-  if test "X$ltrpathdirs" != "X"; then
-    dnl When using libtool, the option that works for both libraries and
-    dnl executables is -R. The -R options are cumulative.
-    for found_dir in $ltrpathdirs; do
-      LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
-    done
-  fi
-])
-
-dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
-dnl unless already present in VAR.
-dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
-dnl contains two or three consecutive elements that belong together.
-AC_DEFUN([AC_LIB_APPENDTOVAR],
-[
-  for element in [$2]; do
-    haveit=
-    for x in $[$1]; do
-      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-      if test "X$x" = "X$element"; then
-        haveit=yes
-        break
-      fi
-    done
-    if test -z "$haveit"; then
-      [$1]="${[$1]}${[$1]:+ }$element"
-    fi
-  done
-])
diff --git a/m4/lib-prefix_gl.m4 b/m4/lib-prefix_gl.m4
deleted file mode 100644
index a8684e1..0000000
--- a/m4/lib-prefix_gl.m4
+++ /dev/null
@@ -1,185 +0,0 @@
-# lib-prefix.m4 serial 5 (gettext-0.15)
-dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Bruno Haible.
-
-dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
-dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
-dnl require excessive bracketing.
-ifdef([AC_HELP_STRING],
-[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
-[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
-
-dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
-dnl to access previously installed libraries. The basic assumption is that
-dnl a user will want packages to use other packages he previously installed
-dnl with the same --prefix option.
-dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
-dnl libraries, but is otherwise very convenient.
-AC_DEFUN([AC_LIB_PREFIX],
-[
-  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
-  AC_REQUIRE([AC_PROG_CC])
-  AC_REQUIRE([AC_CANONICAL_HOST])
-  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
-  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
-  dnl By default, look in $includedir and $libdir.
-  use_additional=yes
-  AC_LIB_WITH_FINAL_PREFIX([
-    eval additional_includedir=\"$includedir\"
-    eval additional_libdir=\"$libdir\"
-  ])
-  AC_LIB_ARG_WITH([lib-prefix],
-[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
-  --without-lib-prefix    don't search for libraries in includedir and libdir],
-[
-    if test "X$withval" = "Xno"; then
-      use_additional=no
-    else
-      if test "X$withval" = "X"; then
-        AC_LIB_WITH_FINAL_PREFIX([
-          eval additional_includedir=\"$includedir\"
-          eval additional_libdir=\"$libdir\"
-        ])
-      else
-        additional_includedir="$withval/include"
-        additional_libdir="$withval/$acl_libdirstem"
-      fi
-    fi
-])
-  if test $use_additional = yes; then
-    dnl Potentially add $additional_includedir to $CPPFLAGS.
-    dnl But don't add it
-    dnl   1. if it's the standard /usr/include,
-    dnl   2. if it's already present in $CPPFLAGS,
-    dnl   3. if it's /usr/local/include and we are using GCC on Linux,
-    dnl   4. if it doesn't exist as a directory.
-    if test "X$additional_includedir" != "X/usr/include"; then
-      haveit=
-      for x in $CPPFLAGS; do
-        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-        if test "X$x" = "X-I$additional_includedir"; then
-          haveit=yes
-          break
-        fi
-      done
-      if test -z "$haveit"; then
-        if test "X$additional_includedir" = "X/usr/local/include"; then
-          if test -n "$GCC"; then
-            case $host_os in
-              linux* | gnu* | k*bsd*-gnu) haveit=yes;;
-            esac
-          fi
-        fi
-        if test -z "$haveit"; then
-          if test -d "$additional_includedir"; then
-            dnl Really add $additional_includedir to $CPPFLAGS.
-            CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
-          fi
-        fi
-      fi
-    fi
-    dnl Potentially add $additional_libdir to $LDFLAGS.
-    dnl But don't add it
-    dnl   1. if it's the standard /usr/lib,
-    dnl   2. if it's already present in $LDFLAGS,
-    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
-    dnl   4. if it doesn't exist as a directory.
-    if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
-      haveit=
-      for x in $LDFLAGS; do
-        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-        if test "X$x" = "X-L$additional_libdir"; then
-          haveit=yes
-          break
-        fi
-      done
-      if test -z "$haveit"; then
-        if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
-          if test -n "$GCC"; then
-            case $host_os in
-              linux*) haveit=yes;;
-            esac
-          fi
-        fi
-        if test -z "$haveit"; then
-          if test -d "$additional_libdir"; then
-            dnl Really add $additional_libdir to $LDFLAGS.
-            LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
-          fi
-        fi
-      fi
-    fi
-  fi
-])
-
-dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
-dnl acl_final_exec_prefix, containing the values to which $prefix and
-dnl $exec_prefix will expand at the end of the configure script.
-AC_DEFUN([AC_LIB_PREPARE_PREFIX],
-[
-  dnl Unfortunately, prefix and exec_prefix get only finally determined
-  dnl at the end of configure.
-  if test "X$prefix" = "XNONE"; then
-    acl_final_prefix="$ac_default_prefix"
-  else
-    acl_final_prefix="$prefix"
-  fi
-  if test "X$exec_prefix" = "XNONE"; then
-    acl_final_exec_prefix='${prefix}'
-  else
-    acl_final_exec_prefix="$exec_prefix"
-  fi
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
-  prefix="$acl_save_prefix"
-])
-
-dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
-dnl variables prefix and exec_prefix bound to the values they will have
-dnl at the end of the configure script.
-AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
-[
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  $1
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-])
-
-dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing
-dnl the basename of the libdir, either "lib" or "lib64".
-AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
-[
-  dnl There is no formal standard regarding lib and lib64. The current
-  dnl practice is that on a system supporting 32-bit and 64-bit instruction
-  dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit
-  dnl libraries go under $prefix/lib. We determine the compiler's default
-  dnl mode by looking at the compiler's library search path. If at least
-  dnl of its elements ends in /lib64 or points to a directory whose absolute
-  dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the
-  dnl default, namely "lib".
-  acl_libdirstem=lib
-  searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
-  if test -n "$searchpath"; then
-    acl_save_IFS="${IFS= 	}"; IFS=":"
-    for searchdir in $searchpath; do
-      if test -d "$searchdir"; then
-        case "$searchdir" in
-          */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
-          *) searchdir=`cd "$searchdir" && pwd`
-             case "$searchdir" in
-               */lib64 ) acl_libdirstem=lib64 ;;
-             esac ;;
-        esac
-      fi
-    done
-    IFS="$acl_save_IFS"
-  fi
-])
diff --git a/m4/m4.m4 b/m4/m4.m4
deleted file mode 100644
index 7d8b394..0000000
--- a/m4/m4.m4
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 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.
-
-# BISON_PROG_GNU_M4
-# -----------------
-# Check for GNU m4, at least 1.3 (supports frozen files).
-AC_DEFUN([BISON_PROG_GNU_M4],
-[AC_PATH_PROGS(M4, gm4 gnum4 m4, m4)
-AC_CACHE_CHECK(whether m4 supports frozen files, ac_cv_prog_gnu_m4,
-[ac_cv_prog_gnu_m4=no
-if test x"$M4" != x; then
-  case `$M4 --help < /dev/null 2>&1` in
-    *reload-state*) ac_cv_prog_gnu_m4=yes ;;
-  esac
-fi])])
diff --git a/m4/mbrtowc.m4 b/m4/mbrtowc.m4
deleted file mode 100644
index a3bd911..0000000
--- a/m4/mbrtowc.m4
+++ /dev/null
@@ -1,31 +0,0 @@
-# mbrtowc.m4 serial 8
-dnl Copyright (C) 2001-2002, 2004-2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Paul Eggert
-
-dnl This file can be removed, and gl_FUNC_MBRTOWC replaced with
-dnl AC_FUNC_MBRTOWC, when autoconf 2.60 can be assumed everywhere.
-
-AC_DEFUN([gl_FUNC_MBRTOWC],
-[
-  dnl Same as AC_FUNC_MBRTOWC in autoconf-2.60.
-  AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared],
-    gl_cv_func_mbrtowc,
-    [AC_LINK_IFELSE(
-       [AC_LANG_PROGRAM(
-            [[#include <wchar.h>]],
-            [[wchar_t wc;
-              char const s[] = "";
-              size_t n = 1;
-              mbstate_t state;
-              return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));]])],
-       gl_cv_func_mbrtowc=yes,
-       gl_cv_func_mbrtowc=no)])
-  if test $gl_cv_func_mbrtowc = yes; then
-    AC_DEFINE([HAVE_MBRTOWC], 1,
-      [Define to 1 if mbrtowc and mbstate_t are properly declared.])
-  fi
-])
diff --git a/m4/mbstate_t.m4 b/m4/mbstate_t.m4
deleted file mode 100644
index df2a275..0000000
--- a/m4/mbstate_t.m4
+++ /dev/null
@@ -1,30 +0,0 @@
-# mbstate_t.m4 serial 9
-dnl Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-# From Paul Eggert.
-
-# BeOS 5 has <wchar.h> but does not define mbstate_t,
-# so you can't declare an object of that type.
-# Check for this incompatibility with Standard C.
-
-# AC_TYPE_MBSTATE_T
-# -----------------
-AC_DEFUN([AC_TYPE_MBSTATE_T],
-  [AC_CACHE_CHECK([for mbstate_t], ac_cv_type_mbstate_t,
-     [AC_COMPILE_IFELSE(
-	[AC_LANG_PROGRAM(
-	   [AC_INCLUDES_DEFAULT
-#	    include <wchar.h>],
-	   [mbstate_t x; return sizeof x;])],
-	[ac_cv_type_mbstate_t=yes],
-	[ac_cv_type_mbstate_t=no])])
-   if test $ac_cv_type_mbstate_t = yes; then
-     AC_DEFINE([HAVE_MBSTATE_T], 1,
-	       [Define to 1 if <wchar.h> declares mbstate_t.])
-   else
-     AC_DEFINE([mbstate_t], int,
-	       [Define to a type if <wchar.h> does not define.])
-   fi])
diff --git a/m4/mbswidth.m4 b/m4/mbswidth.m4
deleted file mode 100644
index 878e531..0000000
--- a/m4/mbswidth.m4
+++ /dev/null
@@ -1,59 +0,0 @@
-# mbswidth.m4 serial 11
-dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl autoconf tests required for use of mbswidth.c
-dnl From Bruno Haible.
-
-AC_DEFUN([gl_MBSWIDTH],
-[
-  AC_CHECK_HEADERS_ONCE(wchar.h wctype.h)
-  AC_CHECK_FUNCS_ONCE(isascii iswprint mbsinit)
-  AC_CHECK_FUNCS(iswcntrl wcwidth)
-  gl_FUNC_MBRTOWC
-
-  AC_CACHE_CHECK([whether wcwidth is declared], ac_cv_have_decl_wcwidth,
-    [AC_TRY_COMPILE([
-/* AIX 3.2.5 declares wcwidth in <string.h>. */
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-#if HAVE_WCHAR_H
-# include <wchar.h>
-#endif
-], [
-#ifndef wcwidth
-  char *p = (char *) wcwidth;
-#endif
-], ac_cv_have_decl_wcwidth=yes, ac_cv_have_decl_wcwidth=no)])
-  if test $ac_cv_have_decl_wcwidth = yes; then
-    ac_val=1
-  else
-    ac_val=0
-  fi
-  AC_DEFINE_UNQUOTED(HAVE_DECL_WCWIDTH, $ac_val,
-    [Define to 1 if you have the declaration of wcwidth(), and to 0 otherwise.])
-
-  dnl UnixWare 7.1.1 <wchar.h> has a declaration of a function mbswidth()
-  dnl that clashes with ours.
-  AC_CACHE_CHECK([whether mbswidth is declared in <wchar.h>],
-    ac_cv_have_decl_mbswidth,
-    [AC_TRY_COMPILE([
-#if HAVE_WCHAR_H
-# include <wchar.h>
-#endif
-], [
-  char *p = (char *) mbswidth;
-], ac_cv_have_decl_mbswidth=yes, ac_cv_have_decl_mbswidth=no)])
-  if test $ac_cv_have_decl_mbswidth = yes; then
-    ac_val=1
-  else
-    ac_val=0
-  fi
-  AC_DEFINE_UNQUOTED(HAVE_DECL_MBSWIDTH_IN_WCHAR_H, $ac_val,
-    [Define to 1 if you have a declaration of mbswidth() in <wchar.h>, and to 0 otherwise.])
-
-  AC_TYPE_MBSTATE_T
-])
diff --git a/m4/nls.m4 b/m4/nls.m4
deleted file mode 100644
index 2082c3b..0000000
--- a/m4/nls.m4
+++ /dev/null
@@ -1,51 +0,0 @@
-# nls.m4 serial 2 (gettext-0.14.3)
-dnl Copyright (C) 1995-2003, 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-dnl
-dnl This file can can be used in projects which are not available under
-dnl the GNU General Public License or the GNU Library General Public
-dnl License but which still want to provide support for the GNU gettext
-dnl functionality.
-dnl Please note that the actual code of the GNU gettext library is covered
-dnl by the GNU Library General Public License, and the rest of the GNU
-dnl gettext package package is covered by the GNU General Public License.
-dnl They are *not* in the public domain.
-
-dnl Authors:
-dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
-dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
-
-AC_PREREQ(2.50)
-
-AC_DEFUN([AM_NLS],
-[
-  AC_MSG_CHECKING([whether NLS is requested])
-  dnl Default is enabled NLS
-  AC_ARG_ENABLE(nls,
-    [  --disable-nls           do not use Native Language Support],
-    USE_NLS=$enableval, USE_NLS=yes)
-  AC_MSG_RESULT($USE_NLS)
-  AC_SUBST(USE_NLS)
-])
-
-AC_DEFUN([AM_MKINSTALLDIRS],
-[
-  dnl Tell automake >= 1.10 to complain if mkinstalldirs is missing.
-  m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([mkinstalldirs])])
-  dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
-  dnl find the mkinstalldirs script in another subdir but $(top_srcdir).
-  dnl Try to locate it.
-  MKINSTALLDIRS=
-  if test -n "$ac_aux_dir"; then
-    case "$ac_aux_dir" in
-      /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;;
-      *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;;
-    esac
-  fi
-  if test -z "$MKINSTALLDIRS"; then
-    MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
-  fi
-  AC_SUBST(MKINSTALLDIRS)
-])
diff --git a/m4/obstack.m4 b/m4/obstack.m4
deleted file mode 100644
index ea60f7f..0000000
--- a/m4/obstack.m4
+++ /dev/null
@@ -1,23 +0,0 @@
-# obstack.m4 serial 4
-dnl Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_OBSTACK],
-[
-  AC_FUNC_OBSTACK
-  dnl Note: AC_FUNC_OBSTACK does AC_LIBSOURCES([obstack.h, obstack.c]).
-  if test $ac_cv_func_obstack = no; then
-    gl_PREREQ_OBSTACK
-  fi
-])
-
-# Prerequisites of lib/obstack.c.
-AC_DEFUN([gl_PREREQ_OBSTACK],
-[
-  AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
-  AC_REQUIRE([gl_AC_HEADER_STDINT_H])
-  AC_REQUIRE([gl_AC_TYPE_UINTMAX_T])
-  :
-])
diff --git a/m4/onceonly.m4 b/m4/onceonly.m4
deleted file mode 100644
index 14d3c0b..0000000
--- a/m4/onceonly.m4
+++ /dev/null
@@ -1,86 +0,0 @@
-# onceonly_2_57.m4 serial 3
-dnl Copyright (C) 2002-2003, 2005 Free Software Foundation, Inc.
-dnl This file is free software, distributed under the terms of the GNU
-dnl General Public License.  As a special exception to the GNU General
-dnl Public License, this file may be distributed as part of a program
-dnl that contains a configuration script generated by Autoconf, under
-dnl the same distribution terms as the rest of that program.
-
-dnl This file defines some "once only" variants of standard autoconf macros.
-dnl   AC_CHECK_HEADERS_ONCE         like  AC_CHECK_HEADERS
-dnl   AC_CHECK_FUNCS_ONCE           like  AC_CHECK_FUNCS
-dnl   AC_CHECK_DECLS_ONCE           like  AC_CHECK_DECLS
-dnl   AC_REQUIRE([AC_HEADER_STDC])  like  AC_HEADER_STDC
-dnl The advantage is that the check for each of the headers/functions/decls
-dnl will be put only once into the 'configure' file. It keeps the size of
-dnl the 'configure' file down, and avoids redundant output when 'configure'
-dnl is run.
-dnl The drawback is that the checks cannot be conditionalized. If you write
-dnl   if some_condition; then gl_CHECK_HEADERS(stdlib.h); fi
-dnl inside an AC_DEFUNed function, the gl_CHECK_HEADERS macro call expands to
-dnl empty, and the check will be inserted before the body of the AC_DEFUNed
-dnl function.
-
-dnl This is like onceonly.m4, except that it uses diversions to named sections
-dnl DEFAULTS and INIT_PREPARE in order to check all requested headers at once,
-dnl thus reducing the size of 'configure'. Works with autoconf-2.57. The
-dnl size reduction is ca. 9%.
-
-dnl Autoconf version 2.57 or newer is recommended.
-AC_PREREQ(2.57)
-
-# AC_CHECK_HEADERS_ONCE(HEADER1 HEADER2 ...) is a once-only variant of
-# AC_CHECK_HEADERS(HEADER1 HEADER2 ...).
-AC_DEFUN([AC_CHECK_HEADERS_ONCE], [
-  :
-  AC_FOREACH([gl_HEADER_NAME], [$1], [
-    AC_DEFUN([gl_CHECK_HEADER_]m4_quote(translit(gl_HEADER_NAME,
-                                                 [./-], [___])), [
-      m4_divert_text([INIT_PREPARE],
-        [gl_header_list="$gl_header_list gl_HEADER_NAME"])
-      gl_HEADERS_EXPANSION
-      AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_HEADER_NAME])),
-        [Define to 1 if you have the <]m4_defn([gl_HEADER_NAME])[> header file.])
-    ])
-    AC_REQUIRE([gl_CHECK_HEADER_]m4_quote(translit(gl_HEADER_NAME,
-                                                   [./-], [___])))
-  ])
-])
-m4_define([gl_HEADERS_EXPANSION], [
-  m4_divert_text([DEFAULTS], [gl_header_list=])
-  AC_CHECK_HEADERS([$gl_header_list])
-  m4_define([gl_HEADERS_EXPANSION], [])
-])
-
-# AC_CHECK_FUNCS_ONCE(FUNC1 FUNC2 ...) is a once-only variant of
-# AC_CHECK_FUNCS(FUNC1 FUNC2 ...).
-AC_DEFUN([AC_CHECK_FUNCS_ONCE], [
-  :
-  AC_FOREACH([gl_FUNC_NAME], [$1], [
-    AC_DEFUN([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME]), [
-      m4_divert_text([INIT_PREPARE],
-        [gl_func_list="$gl_func_list gl_FUNC_NAME"])
-      gl_FUNCS_EXPANSION
-      AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_FUNC_NAME])),
-        [Define to 1 if you have the `]m4_defn([gl_FUNC_NAME])[' function.])
-    ])
-    AC_REQUIRE([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME]))
-  ])
-])
-m4_define([gl_FUNCS_EXPANSION], [
-  m4_divert_text([DEFAULTS], [gl_func_list=])
-  AC_CHECK_FUNCS([$gl_func_list])
-  m4_define([gl_FUNCS_EXPANSION], [])
-])
-
-# AC_CHECK_DECLS_ONCE(DECL1 DECL2 ...) is a once-only variant of
-# AC_CHECK_DECLS(DECL1, DECL2, ...).
-AC_DEFUN([AC_CHECK_DECLS_ONCE], [
-  :
-  AC_FOREACH([gl_DECL_NAME], [$1], [
-    AC_DEFUN([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME]), [
-      AC_CHECK_DECLS(m4_defn([gl_DECL_NAME]))
-    ])
-    AC_REQUIRE([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME]))
-  ])
-])
diff --git a/m4/po_gl.m4 b/m4/po_gl.m4
deleted file mode 100644
index f2795ee..0000000
--- a/m4/po_gl.m4
+++ /dev/null
@@ -1,429 +0,0 @@
-# po.m4 serial 7 (gettext-0.14.3)
-dnl Copyright (C) 1995-2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-dnl
-dnl This file can can be used in projects which are not available under
-dnl the GNU General Public License or the GNU Library General Public
-dnl License but which still want to provide support for the GNU gettext
-dnl functionality.
-dnl Please note that the actual code of the GNU gettext library is covered
-dnl by the GNU Library General Public License, and the rest of the GNU
-dnl gettext package package is covered by the GNU General Public License.
-dnl They are *not* in the public domain.
-
-dnl Authors:
-dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
-dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
-
-AC_PREREQ(2.50)
-
-dnl Checks for all prerequisites of the po subdirectory.
-AC_DEFUN([AM_PO_SUBDIRS],
-[
-  AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-  AC_REQUIRE([AC_PROG_INSTALL])dnl
-  AC_REQUIRE([AM_MKINSTALLDIRS])dnl
-  AC_REQUIRE([AM_NLS])dnl
-
-  dnl Perform the following tests also if --disable-nls has been given,
-  dnl because they are needed for "make dist" to work.
-
-  dnl Search for GNU msgfmt in the PATH.
-  dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
-  dnl The second test excludes FreeBSD msgfmt.
-  AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
-    [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
-     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
-    :)
-  AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
-
-  dnl Search for GNU xgettext 0.12 or newer in the PATH.
-  dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
-  dnl The second test excludes FreeBSD xgettext.
-  AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
-    [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
-     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
-    :)
-  dnl Remove leftover from FreeBSD xgettext call.
-  rm -f messages.po
-
-  dnl Search for GNU msgmerge 0.11 or newer in the PATH.
-  AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
-    [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :)
-
-  dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
-  dnl Test whether we really found GNU msgfmt.
-  if test "$GMSGFMT" != ":"; then
-    dnl If it is no GNU msgfmt we define it as : so that the
-    dnl Makefiles still can work.
-    if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
-       (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
-      : ;
-    else
-      GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
-      AC_MSG_RESULT(
-        [found $GMSGFMT program is not GNU msgfmt; ignore it])
-      GMSGFMT=":"
-    fi
-  fi
-
-  dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
-  dnl Test whether we really found GNU xgettext.
-  if test "$XGETTEXT" != ":"; then
-    dnl If it is no GNU xgettext we define it as : so that the
-    dnl Makefiles still can work.
-    if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
-       (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
-      : ;
-    else
-      AC_MSG_RESULT(
-        [found xgettext program is not GNU xgettext; ignore it])
-      XGETTEXT=":"
-    fi
-    dnl Remove leftover from FreeBSD xgettext call.
-    rm -f messages.po
-  fi
-
-  AC_OUTPUT_COMMANDS([
-    for ac_file in $CONFIG_FILES; do
-      # Support "outfile[:infile[:infile...]]"
-      case "$ac_file" in
-        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
-      esac
-      # PO directories have a Makefile.in generated from Makefile.in.in.
-      case "$ac_file" in */Makefile.in)
-        # Adjust a relative srcdir.
-        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
-        ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
-        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
-        # In autoconf-2.13 it is called $ac_given_srcdir.
-        # In autoconf-2.50 it is called $srcdir.
-        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
-        case "$ac_given_srcdir" in
-          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
-          /*) top_srcdir="$ac_given_srcdir" ;;
-          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
-        esac
-        # Treat a directory as a PO directory if and only if it has a
-        # POTFILES.in file. This allows packages to have multiple PO
-        # directories under different names or in different locations.
-        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
-          rm -f "$ac_dir/POTFILES"
-          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
-          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ 	]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
-          POMAKEFILEDEPS="POTFILES.in"
-          # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
-          # on $ac_dir but don't depend on user-specified configuration
-          # parameters.
-          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
-            # The LINGUAS file contains the set of available languages.
-            if test -n "$OBSOLETE_ALL_LINGUAS"; then
-              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
-            fi
-            ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
-            # Hide the ALL_LINGUAS assigment from automake.
-            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
-            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
-          else
-            # The set of available languages was given in configure.in.
-            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
-          fi
-          # Compute POFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
-          # Compute UPDATEPOFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
-          # Compute DUMMYPOFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
-          # Compute GMOFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
-          case "$ac_given_srcdir" in
-            .) srcdirpre= ;;
-            *) srcdirpre='$(srcdir)/' ;;
-          esac
-          POFILES=
-          UPDATEPOFILES=
-          DUMMYPOFILES=
-          GMOFILES=
-          for lang in $ALL_LINGUAS; do
-            POFILES="$POFILES $srcdirpre$lang.po"
-            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
-            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
-            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
-          done
-          # CATALOGS depends on both $ac_dir and the user's LINGUAS
-          # environment variable.
-          INST_LINGUAS=
-          if test -n "$ALL_LINGUAS"; then
-            for presentlang in $ALL_LINGUAS; do
-              useit=no
-              if test "%UNSET%" != "$LINGUAS"; then
-                desiredlanguages="$LINGUAS"
-              else
-                desiredlanguages="$ALL_LINGUAS"
-              fi
-              for desiredlang in $desiredlanguages; do
-                # Use the presentlang catalog if desiredlang is
-                #   a. equal to presentlang, or
-                #   b. a variant of presentlang (because in this case,
-                #      presentlang can be used as a fallback for messages
-                #      which are not translated in the desiredlang catalog).
-                case "$desiredlang" in
-                  "$presentlang"*) useit=yes;;
-                esac
-              done
-              if test $useit = yes; then
-                INST_LINGUAS="$INST_LINGUAS $presentlang"
-              fi
-            done
-          fi
-          CATALOGS=
-          if test -n "$INST_LINGUAS"; then
-            for lang in $INST_LINGUAS; do
-              CATALOGS="$CATALOGS $lang.gmo"
-            done
-          fi
-          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
-          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
-          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
-            if test -f "$f"; then
-              case "$f" in
-                *.orig | *.bak | *~) ;;
-                *) cat "$f" >> "$ac_dir/Makefile" ;;
-              esac
-            fi
-          done
-        fi
-        ;;
-      esac
-    done],
-   [# Capture the value of obsolete ALL_LINGUAS because we need it to compute
-    # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
-    # from automake.
-    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
-    # Capture the value of LINGUAS because we need it to compute CATALOGS.
-    LINGUAS="${LINGUAS-%UNSET%}"
-   ])
-])
-
-dnl Postprocesses a Makefile in a directory containing PO files.
-AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
-[
-  # When this code is run, in config.status, two variables have already been
-  # set:
-  # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in,
-  # - LINGUAS is the value of the environment variable LINGUAS at configure
-  #   time.
-
-changequote(,)dnl
-  # Adjust a relative srcdir.
-  ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
-  ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
-  ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
-  # In autoconf-2.13 it is called $ac_given_srcdir.
-  # In autoconf-2.50 it is called $srcdir.
-  test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
-  case "$ac_given_srcdir" in
-    .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
-    /*) top_srcdir="$ac_given_srcdir" ;;
-    *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
-  esac
-
-  # Find a way to echo strings without interpreting backslash.
-  if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
-    gt_echo='echo'
-  else
-    if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
-      gt_echo='printf %s\n'
-    else
-      echo_func () {
-        cat <<EOT
-$*
-EOT
-      }
-      gt_echo='echo_func'
-    fi
-  fi
-
-  # A sed script that extracts the value of VARIABLE from a Makefile.
-  sed_x_variable='
-# Test if the hold space is empty.
-x
-s/P/P/
-x
-ta
-# Yes it was empty. Look if we have the expected variable definition.
-/^[	 ]*VARIABLE[	 ]*=/{
-  # Seen the first line of the variable definition.
-  s/^[	 ]*VARIABLE[	 ]*=//
-  ba
-}
-bd
-:a
-# Here we are processing a line from the variable definition.
-# Remove comment, more precisely replace it with a space.
-s/#.*$/ /
-# See if the line ends in a backslash.
-tb
-:b
-s/\\$//
-# Print the line, without the trailing backslash.
-p
-tc
-# There was no trailing backslash. The end of the variable definition is
-# reached. Clear the hold space.
-s/^.*$//
-x
-bd
-:c
-# A trailing backslash means that the variable definition continues in the
-# next line. Put a nonempty string into the hold space to indicate this.
-s/^.*$/P/
-x
-:d
-'
-changequote([,])dnl
-
-  # Set POTFILES to the value of the Makefile variable POTFILES.
-  sed_x_POTFILES="`$gt_echo \"$sed_x_variable\" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`"
-  POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
-  # Compute POTFILES_DEPS as
-  #   $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
-  POTFILES_DEPS=
-  for file in $POTFILES; do
-    POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
-  done
-  POMAKEFILEDEPS=""
-
-  if test -n "$OBSOLETE_ALL_LINGUAS"; then
-    test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
-  fi
-  if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
-    # The LINGUAS file contains the set of available languages.
-    ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
-    POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
-  else
-    # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
-    sed_x_LINGUAS="`$gt_echo \"$sed_x_variable\" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`"
-    ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
-  fi
-  # Hide the ALL_LINGUAS assigment from automake.
-  eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
-  # Compute POFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
-  # Compute UPDATEPOFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
-  # Compute DUMMYPOFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
-  # Compute GMOFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
-  # Compute PROPERTIESFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties)
-  # Compute CLASSFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class)
-  # Compute QMFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
-  # Compute MSGFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
-  # Compute RESOURCESDLLFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
-  case "$ac_given_srcdir" in
-    .) srcdirpre= ;;
-    *) srcdirpre='$(srcdir)/' ;;
-  esac
-  POFILES=
-  UPDATEPOFILES=
-  DUMMYPOFILES=
-  GMOFILES=
-  PROPERTIESFILES=
-  CLASSFILES=
-  QMFILES=
-  MSGFILES=
-  RESOURCESDLLFILES=
-  for lang in $ALL_LINGUAS; do
-    POFILES="$POFILES $srcdirpre$lang.po"
-    UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
-    DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
-    GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
-    PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties"
-    CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class"
-    QMFILES="$QMFILES $srcdirpre$lang.qm"
-    frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
-    MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
-    frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
-    RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
-  done
-  # CATALOGS depends on both $ac_dir and the user's LINGUAS
-  # environment variable.
-  INST_LINGUAS=
-  if test -n "$ALL_LINGUAS"; then
-    for presentlang in $ALL_LINGUAS; do
-      useit=no
-      if test "%UNSET%" != "$LINGUAS"; then
-        desiredlanguages="$LINGUAS"
-      else
-        desiredlanguages="$ALL_LINGUAS"
-      fi
-      for desiredlang in $desiredlanguages; do
-        # Use the presentlang catalog if desiredlang is
-        #   a. equal to presentlang, or
-        #   b. a variant of presentlang (because in this case,
-        #      presentlang can be used as a fallback for messages
-        #      which are not translated in the desiredlang catalog).
-        case "$desiredlang" in
-          "$presentlang"*) useit=yes;;
-        esac
-      done
-      if test $useit = yes; then
-        INST_LINGUAS="$INST_LINGUAS $presentlang"
-      fi
-    done
-  fi
-  CATALOGS=
-  JAVACATALOGS=
-  QTCATALOGS=
-  TCLCATALOGS=
-  CSHARPCATALOGS=
-  if test -n "$INST_LINGUAS"; then
-    for lang in $INST_LINGUAS; do
-      CATALOGS="$CATALOGS $lang.gmo"
-      JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
-      QTCATALOGS="$QTCATALOGS $lang.qm"
-      frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
-      TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
-      frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
-      CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
-    done
-  fi
-
-  sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
-  if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
-    # Add dependencies that cannot be formulated as a simple suffix rule.
-    for lang in $ALL_LINGUAS; do
-      frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
-      cat >> "$ac_file.tmp" <<EOF
-$frobbedlang.msg: $lang.po
-	@echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
-	\$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
-EOF
-    done
-  fi
-  if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then
-    # Add dependencies that cannot be formulated as a simple suffix rule.
-    for lang in $ALL_LINGUAS; do
-      frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
-      cat >> "$ac_file.tmp" <<EOF
-$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
-	@echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
-	\$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
-EOF
-    done
-  fi
-  if test -n "$POMAKEFILEDEPS"; then
-    cat >> "$ac_file.tmp" <<EOF
-Makefile: $POMAKEFILEDEPS
-EOF
-  fi
-  mv "$ac_file.tmp" "$ac_file"
-])
diff --git a/m4/progtest.m4 b/m4/progtest.m4
deleted file mode 100644
index a56365c..0000000
--- a/m4/progtest.m4
+++ /dev/null
@@ -1,92 +0,0 @@
-# progtest.m4 serial 4 (gettext-0.14.2)
-dnl Copyright (C) 1996-2003, 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-dnl
-dnl This file can can be used in projects which are not available under
-dnl the GNU General Public License or the GNU Library General Public
-dnl License but which still want to provide support for the GNU gettext
-dnl functionality.
-dnl Please note that the actual code of the GNU gettext library is covered
-dnl by the GNU Library General Public License, and the rest of the GNU
-dnl gettext package package is covered by the GNU General Public License.
-dnl They are *not* in the public domain.
-
-dnl Authors:
-dnl   Ulrich Drepper <drepper@cygnus.com>, 1996.
-
-AC_PREREQ(2.50)
-
-# Search path for a program which passes the given test.
-
-dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
-dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
-AC_DEFUN([AM_PATH_PROG_WITH_TEST],
-[
-# Prepare PATH_SEPARATOR.
-# 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
-
-# Find out how to test for executable files. Don't use a zero-byte file,
-# as systems may use methods other than mode bits to determine executability.
-cat >conf$$.file <<_ASEOF
-#! /bin/sh
-exit 0
-_ASEOF
-chmod +x conf$$.file
-if test -x conf$$.file >/dev/null 2>&1; then
-  ac_executable_p="test -x"
-else
-  ac_executable_p="test -f"
-fi
-rm -f conf$$.file
-
-# Extract the first word of "$2", so it can be a program name with args.
-set dummy $2; ac_word=[$]2
-AC_MSG_CHECKING([for $ac_word])
-AC_CACHE_VAL(ac_cv_path_$1,
-[case "[$]$1" in
-  [[\\/]]* | ?:[[\\/]]*)
-    ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
-    ;;
-  *)
-    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in ifelse([$5], , $PATH, [$5]); do
-      IFS="$ac_save_IFS"
-      test -z "$ac_dir" && ac_dir=.
-      for ac_exec_ext in '' $ac_executable_extensions; do
-        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
-          echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD
-          if [$3]; then
-            ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
-            break 2
-          fi
-        fi
-      done
-    done
-    IFS="$ac_save_IFS"
-dnl If no 4th arg is given, leave the cache variable unset,
-dnl so AC_PATH_PROGS will keep looking.
-ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
-])dnl
-    ;;
-esac])dnl
-$1="$ac_cv_path_$1"
-if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
-  AC_MSG_RESULT([$]$1)
-else
-  AC_MSG_RESULT(no)
-fi
-AC_SUBST($1)dnl
-])
diff --git a/m4/quote.m4 b/m4/quote.m4
deleted file mode 100644
index ca66b53..0000000
--- a/m4/quote.m4
+++ /dev/null
@@ -1,14 +0,0 @@
-# quote.m4 serial 4
-dnl Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_QUOTE],
-[
-  AC_LIBSOURCES([quote.c, quote.h])
-  AC_LIBOBJ([quote])
-
-  dnl Prerequisites of lib/quote.c.
-  dnl (none)
-])
diff --git a/m4/quotearg.m4 b/m4/quotearg.m4
deleted file mode 100644
index 98ae133..0000000
--- a/m4/quotearg.m4
+++ /dev/null
@@ -1,17 +0,0 @@
-# quotearg.m4 serial 4
-dnl Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_QUOTEARG],
-[
-  AC_LIBSOURCES([quotearg.c, quotearg.h])
-  AC_LIBOBJ([quotearg])
-
-  dnl Prerequisites of lib/quotearg.c.
-  AC_CHECK_HEADERS_ONCE(wchar.h wctype.h)
-  AC_CHECK_FUNCS_ONCE(iswprint mbsinit)
-  AC_TYPE_MBSTATE_T
-  gl_FUNC_MBRTOWC
-])
diff --git a/m4/stdbool.m4 b/m4/stdbool.m4
deleted file mode 100644
index 2204ecd..0000000
--- a/m4/stdbool.m4
+++ /dev/null
@@ -1,115 +0,0 @@
-# Check for stdbool.h that conforms to C99.
-
-dnl Copyright (C) 2002-2006 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-# Prepare for substituting <stdbool.h> if it is not supported.
-
-AC_DEFUN([AM_STDBOOL_H],
-[
-  AC_REQUIRE([AC_HEADER_STDBOOL])
-
-  # Define two additional variables used in the Makefile substitution.
-
-  if test "$ac_cv_header_stdbool_h" = yes; then
-    STDBOOL_H=''
-  else
-    STDBOOL_H='stdbool.h'
-  fi
-  AC_SUBST([STDBOOL_H])
-
-  if test "$ac_cv_type__Bool" = yes; then
-    HAVE__BOOL=1
-  else
-    HAVE__BOOL=0
-  fi
-  AC_SUBST([HAVE__BOOL])
-])
-
-# AM_STDBOOL_H will be renamed to gl_STDBOOL_H in the future.
-AC_DEFUN([gl_STDBOOL_H], [AM_STDBOOL_H])
-
-# This macro is only needed in autoconf <= 2.59.  Newer versions of autoconf
-# have this macro built-in.
-
-AC_DEFUN([AC_HEADER_STDBOOL],
-  [AC_CACHE_CHECK([for stdbool.h that conforms to C99],
-     [ac_cv_header_stdbool_h],
-     [AC_TRY_COMPILE(
-	[
-	  #include <stdbool.h>
-	  #ifndef bool
-	   "error: bool is not defined"
-	  #endif
-	  #ifndef false
-	   "error: false is not defined"
-	  #endif
-	  #if false
-	   "error: false is not 0"
-	  #endif
-	  #ifndef true
-	   "error: true is not defined"
-	  #endif
-	  #if true != 1
-	   "error: true is not 1"
-	  #endif
-	  #ifndef __bool_true_false_are_defined
-	   "error: __bool_true_false_are_defined is not defined"
-	  #endif
-
-	  struct s { _Bool s: 1; _Bool t; } s;
-
-	  char a[true == 1 ? 1 : -1];
-	  char b[false == 0 ? 1 : -1];
-	  char c[__bool_true_false_are_defined == 1 ? 1 : -1];
-	  char d[(bool) 0.5 == true ? 1 : -1];
-	  bool e = &s;
-	  char f[(_Bool) 0.0 == false ? 1 : -1];
-	  char g[true];
-	  char h[sizeof (_Bool)];
-	  char i[sizeof s.t];
-	  enum { j = false, k = true, l = false * true, m = true * 256 };
-	  _Bool n[m];
-	  char o[sizeof n == m * sizeof n[0] ? 1 : -1];
-	  char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
-	  #if defined __xlc__ || defined __GNUC__
-	   /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0
-	      reported by James Lemley on 2005-10-05; see
-	      http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
-	      This test is not quite right, since xlc is allowed to
-	      reject this program, as the initializer for xlcbug is
-	      not one of the forms that C requires support for.
-	      However, doing the test right would require a run-time
-	      test, and that would make cross-compilation harder.
-	      Let us hope that IBM fixes the xlc bug, and also adds
-	      support for this kind of constant expression.  In the
-	      meantime, this test will reject xlc, which is OK, since
-	      our stdbool.h substitute should suffice.  We also test
-	      this with GCC, where it should work, to detect more
-	      quickly whether someone messes up the test in the
-	      future.  */
-	   char digs[] = "0123456789";
-	   int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1);
-	  #endif
-	  /* Catch a bug in an HP-UX C compiler.  See
-	     http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
-	     http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
-	   */
-	  _Bool q = true;
-	  _Bool *pq = &q;
-	],
-	[
-	  *pq |= q;
-	  *pq |= ! q;
-	  /* Refer to every declared value, to avoid compiler optimizations.  */
-	  return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
-		  + !m + !n + !o + !p + !q + !pq);
-	],
-	[ac_cv_header_stdbool_h=yes],
-	[ac_cv_header_stdbool_h=no])])
-   AC_CHECK_TYPES([_Bool])
-   if test $ac_cv_header_stdbool_h = yes; then
-     AC_DEFINE(HAVE_STDBOOL_H, 1, [Define to 1 if stdbool.h conforms to C99.])
-   fi])
diff --git a/m4/stdint_h_gl.m4 b/m4/stdint_h_gl.m4
deleted file mode 100644
index 3355f35..0000000
--- a/m4/stdint_h_gl.m4
+++ /dev/null
@@ -1,26 +0,0 @@
-# stdint_h.m4 serial 5
-dnl Copyright (C) 1997-2004 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Paul Eggert.
-
-# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
-# doesn't clash with <sys/types.h>, and declares uintmax_t.
-
-AC_DEFUN([gl_AC_HEADER_STDINT_H],
-[
-  AC_CACHE_CHECK([for stdint.h], gl_cv_header_stdint_h,
-  [AC_TRY_COMPILE(
-    [#include <sys/types.h>
-#include <stdint.h>],
-    [uintmax_t i = (uintmax_t) -1;],
-    gl_cv_header_stdint_h=yes,
-    gl_cv_header_stdint_h=no)])
-  if test $gl_cv_header_stdint_h = yes; then
-    AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1,
-      [Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
-       and declares uintmax_t. ])
-  fi
-])
diff --git a/m4/stdio-safer.m4 b/m4/stdio-safer.m4
deleted file mode 100644
index cb60acb..0000000
--- a/m4/stdio-safer.m4
+++ /dev/null
@@ -1,11 +0,0 @@
-#serial 5
-dnl Copyright (C) 2002, 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_STDIO_SAFER],
-[
-  AC_LIBSOURCES([fopen-safer.c, stdio-safer.h, stdio--.h])
-  AC_LIBOBJ([fopen-safer])
-])
diff --git a/m4/stpcpy.m4 b/m4/stpcpy.m4
deleted file mode 100644
index ce8d92f..0000000
--- a/m4/stpcpy.m4
+++ /dev/null
@@ -1,22 +0,0 @@
-# stpcpy.m4 serial 1
-dnl Copyright (C) 2002 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_FUNC_STPCPY],
-[
-  dnl Persuade glibc <string.h> to declare stpcpy().
-  AC_REQUIRE([AC_GNU_SOURCE])
-
-  AC_REPLACE_FUNCS(stpcpy)
-  if test $ac_cv_func_stpcpy = no; then
-    gl_PREREQ_STPCPY
-  fi
-])
-
-# Prerequisites of lib/stpcpy.c.
-AC_DEFUN([gl_PREREQ_STPCPY], [
-  :
-])
-
diff --git a/m4/strdup.m4 b/m4/strdup.m4
deleted file mode 100644
index 42325ab..0000000
--- a/m4/strdup.m4
+++ /dev/null
@@ -1,17 +0,0 @@
-# strdup.m4 serial 6
-dnl Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_FUNC_STRDUP],
-[
-  AC_LIBSOURCES([strdup.c, strdup.h])
-
-  AC_REPLACE_FUNCS(strdup)
-  AC_CHECK_DECLS_ONCE(strdup)
-  gl_PREREQ_STRDUP
-])
-
-# Prerequisites of lib/strdup.c.
-AC_DEFUN([gl_PREREQ_STRDUP], [:])
diff --git a/m4/strerror.m4 b/m4/strerror.m4
deleted file mode 100644
index 32bc7ed..0000000
--- a/m4/strerror.m4
+++ /dev/null
@@ -1,18 +0,0 @@
-# strerror.m4 serial 2
-dnl Copyright (C) 2002 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_FUNC_STRERROR],
-[
-  AC_REPLACE_FUNCS(strerror)
-  if test $ac_cv_func_strerror = no; then
-    gl_PREREQ_STRERROR
-  fi
-])
-
-# Prerequisites of lib/strerror.c.
-AC_DEFUN([gl_PREREQ_STRERROR], [
-  :
-])
diff --git a/m4/strndup.m4 b/m4/strndup.m4
deleted file mode 100644
index 48b15cc..0000000
--- a/m4/strndup.m4
+++ /dev/null
@@ -1,49 +0,0 @@
-# strndup.m4 serial 6
-dnl Copyright (C) 2002-2003, 2005-2006 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_FUNC_STRNDUP],
-[
-  AC_LIBSOURCES([strndup.c, strndup.h])
-
-  dnl Persuade glibc <string.h> to declare strndup().
-  AC_REQUIRE([AC_GNU_SOURCE])
-
-  AC_CHECK_DECLS_ONCE([strndup])
-
-  # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'.
-  AC_CACHE_CHECK([for working strndup], gl_cv_func_strndup,
-    [AC_RUN_IFELSE([
-       AC_LANG_PROGRAM([#include <string.h>], [[
-#ifndef HAVE_DECL_STRNDUP
-  extern char *strndup (const char *, size_t);
-#endif
-  char *s;
-  s = strndup ("some longer string", 15);
-  free (s);
-  s = strndup ("shorter string", 13);
-  return s[13] != '\0';]])],
-       [gl_cv_func_strndup=yes],
-       [gl_cv_func_strndup=no],
-       [AC_EGREP_CPP([too risky], [
-#ifdef _AIX
-            too risky
-#endif
-          ],
-          [gl_cv_func_strndup=no],
-          [gl_cv_func_strndup=yes])])])
-  if test $gl_cv_func_strndup = yes; then
-    AC_DEFINE([HAVE_STRNDUP], 1,
-      [Define if you have the strndup() function and it works.])
-  else
-    AC_LIBOBJ([strndup])
-    AC_DEFINE(strndup, rpl_strndup,
-      [Define to rpl_strndup if the replacement function should be used,])
-    gl_PREREQ_STRNDUP
-  fi
-])
-
-# Prerequisites of lib/strndup.c.
-AC_DEFUN([gl_PREREQ_STRNDUP], [:])
diff --git a/m4/strnlen.m4 b/m4/strnlen.m4
deleted file mode 100644
index 67964c8..0000000
--- a/m4/strnlen.m4
+++ /dev/null
@@ -1,29 +0,0 @@
-# strnlen.m4 serial 5
-dnl Copyright (C) 2002-2003, 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_FUNC_STRNLEN],
-[
-  AC_LIBSOURCES([strnlen.c, strnlen.h])
-
-  dnl Persuade glibc <string.h> to declare strnlen().
-  AC_REQUIRE([AC_GNU_SOURCE])
-
-  AC_FUNC_STRNLEN
-  if test $ac_cv_func_strnlen_working = no; then
-    # This is necessary because automake-1.6.1 doens't understand
-    # that the above use of AC_FUNC_STRNLEN means we may have to use
-    # lib/strnlen.c.
-    #AC_LIBOBJ(strnlen)
-    AC_DEFINE(strnlen, rpl_strnlen,
-      [Define to rpl_strnlen if the replacement function should be used.])
-    gl_PREREQ_STRNLEN
-  fi
-])
-
-# Prerequisites of lib/strnlen.c.
-AC_DEFUN([gl_PREREQ_STRNLEN], [
-  AC_CHECK_DECLS_ONCE(strnlen)
-])
diff --git a/m4/strtol.m4 b/m4/strtol.m4
deleted file mode 100644
index b9308ed..0000000
--- a/m4/strtol.m4
+++ /dev/null
@@ -1,19 +0,0 @@
-# strtol.m4 serial 3
-dnl Copyright (C) 2002, 2003 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_FUNC_STRTOL],
-[
-  AC_REPLACE_FUNCS(strtol)
-  if test $ac_cv_func_strtol = no; then
-    gl_PREREQ_STRTOL
-  fi
-])
-
-# Prerequisites of lib/strtol.c.
-AC_DEFUN([gl_PREREQ_STRTOL], [
-  AC_REQUIRE([AC_HEADER_STDC])
-  AC_CHECK_FUNCS_ONCE(isascii)
-])
diff --git a/m4/strtoul.m4 b/m4/strtoul.m4
deleted file mode 100644
index 512cd09..0000000
--- a/m4/strtoul.m4
+++ /dev/null
@@ -1,18 +0,0 @@
-# strtoul.m4 serial 2
-dnl Copyright (C) 2002 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_FUNC_STRTOUL],
-[
-  AC_REPLACE_FUNCS(strtoul)
-  if test $ac_cv_func_strtoul = no; then
-    gl_PREREQ_STRTOUL
-  fi
-])
-
-# Prerequisites of lib/strtoul.c.
-AC_DEFUN([gl_PREREQ_STRTOUL], [
-  gl_PREREQ_STRTOL
-])
diff --git a/m4/strverscmp.m4 b/m4/strverscmp.m4
deleted file mode 100644
index 46e178b..0000000
--- a/m4/strverscmp.m4
+++ /dev/null
@@ -1,23 +0,0 @@
-# strverscmp.m4 serial 3
-dnl Copyright (C) 2002, 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_FUNC_STRVERSCMP],
-[
-  AC_LIBSOURCES([strverscmp.c, strverscmp.h])
-
-  dnl Persuade glibc <string.h> to declare strverscmp().
-  AC_REQUIRE([AC_GNU_SOURCE])
-
-  AC_REPLACE_FUNCS(strverscmp)
-  if test $ac_cv_func_strverscmp = no; then
-    gl_PREREQ_STRVERSCMP
-  fi
-])
-
-# Prerequisites of lib/strverscmp.c.
-AC_DEFUN([gl_PREREQ_STRVERSCMP], [
-  :
-])
diff --git a/m4/subpipe.m4 b/m4/subpipe.m4
deleted file mode 100644
index dbf909c..0000000
--- a/m4/subpipe.m4
+++ /dev/null
@@ -1,29 +0,0 @@
-# -*- Autoconf -*-
-# Checks required to run `subpipe'.
-#
-# Copyright (C) 2002, 2003, 2005 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 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
-
-# Written by Paul Eggert <eggert@twinsun.com>.
-
-AC_DEFUN([BISON_PREREQ_SUBPIPE],
-[
- AC_TYPE_PID_T
- AC_HEADER_SYS_WAIT
- AC_CHECK_FUNCS(dup2 waitpid)
- AC_FUNC_FORK
-])
diff --git a/m4/timevar.m4 b/m4/timevar.m4
deleted file mode 100644
index 2704a91..0000000
--- a/m4/timevar.m4
+++ /dev/null
@@ -1,61 +0,0 @@
-# -*- Autoconf -*-
-# Checks required to run `timevar', a time tracker.
-#
-# Copyright (C) 2002, 2003 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 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
-
-# serial 2
-
-AC_DEFUN([BISON_PREREQ_TIMEVAR],
-[AC_CHECK_HEADERS([sys/time.h sys/times.h])
- AC_CHECK_HEADERS([sys/resource.h],,,
-   [$ac_includes_default
-#if HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
-#ifdef HAVE_SYS_TIMES_H
-# include <sys/times.h>
-#endif
-])
-AC_CHECK_FUNCS([times])
-
-AC_CHECK_DECLS([getrusage, times, clock, sysconf], [], [],
-[$ac_includes_default
-#if HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
-#if HAVE_SYS_TIMES_H
-# include <sys/times.h>
-#endif
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-])
-
-AC_CHECK_TYPES([clock_t, struct tms], [], [],
-[$ac_includes_default
-#if HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
-#if HAVE_SYS_TIMES_H
-# include <sys/times.h>
-#endif
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-])
-])
diff --git a/m4/uintmax_t_gl.m4 b/m4/uintmax_t_gl.m4
deleted file mode 100644
index bf83ed7..0000000
--- a/m4/uintmax_t_gl.m4
+++ /dev/null
@@ -1,30 +0,0 @@
-# uintmax_t.m4 serial 9
-dnl Copyright (C) 1997-2004 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Paul Eggert.
-
-AC_PREREQ(2.13)
-
-# Define uintmax_t to 'unsigned long' or 'unsigned long long'
-# if it is not already defined in <stdint.h> or <inttypes.h>.
-
-AC_DEFUN([gl_AC_TYPE_UINTMAX_T],
-[
-  AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
-  AC_REQUIRE([gl_AC_HEADER_STDINT_H])
-  if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
-    AC_REQUIRE([gl_AC_TYPE_UNSIGNED_LONG_LONG])
-    test $ac_cv_type_unsigned_long_long = yes \
-      && ac_type='unsigned long long' \
-      || ac_type='unsigned long'
-    AC_DEFINE_UNQUOTED(uintmax_t, $ac_type,
-      [Define to unsigned long or unsigned long long
-       if <stdint.h> and <inttypes.h> don't define.])
-  else
-    AC_DEFINE(HAVE_UINTMAX_T, 1,
-      [Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.])
-  fi
-])
diff --git a/m4/ulonglong_gl.m4 b/m4/ulonglong_gl.m4
deleted file mode 100644
index dee10cc..0000000
--- a/m4/ulonglong_gl.m4
+++ /dev/null
@@ -1,23 +0,0 @@
-# ulonglong.m4 serial 4
-dnl Copyright (C) 1999-2004 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Paul Eggert.
-
-# Define HAVE_UNSIGNED_LONG_LONG if 'unsigned long long' works.
-
-AC_DEFUN([gl_AC_TYPE_UNSIGNED_LONG_LONG],
-[
-  AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long,
-  [AC_TRY_LINK([unsigned long long ull = 1ULL; int i = 63;],
-    [unsigned long long ullmax = (unsigned long long) -1;
-     return ull << i | ull >> i | ullmax / ull | ullmax % ull;],
-    ac_cv_type_unsigned_long_long=yes,
-    ac_cv_type_unsigned_long_long=no)])
-  if test $ac_cv_type_unsigned_long_long = yes; then
-    AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1,
-      [Define if you have the 'unsigned long long' type.])
-  fi
-])
diff --git a/m4/unistd-safer.m4 b/m4/unistd-safer.m4
deleted file mode 100644
index 6fbe4c6..0000000
--- a/m4/unistd-safer.m4
+++ /dev/null
@@ -1,13 +0,0 @@
-#serial 7
-dnl Copyright (C) 2002, 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_UNISTD_SAFER],
-[
-  AC_LIBSOURCES([dup-safer.c, fd-safer.c, pipe-safer.c, unistd-safer.h, unistd--.h])
-  AC_LIBOBJ([dup-safer])
-  AC_LIBOBJ([fd-safer])
-  AC_LIBOBJ([pipe-safer])
-])
diff --git a/m4/unistd_h.m4 b/m4/unistd_h.m4
deleted file mode 100644
index 9c77f9b..0000000
--- a/m4/unistd_h.m4
+++ /dev/null
@@ -1,18 +0,0 @@
-# unistd_h.m4 serial 2
-dnl Copyright (C) 2006 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl Written by Simon Josefsson
-
-AC_DEFUN([gl_HEADER_UNISTD],
-[
-  dnl Prerequisites of lib/unistd.h.
-  AC_CHECK_HEADERS([unistd.h], [
-    UNISTD_H=''
-  ], [
-    UNISTD_H='unistd.h'
-  ])
-  AC_SUBST(UNISTD_H)
-])
diff --git a/m4/unlocked-io.m4 b/m4/unlocked-io.m4
deleted file mode 100644
index f58e960..0000000
--- a/m4/unlocked-io.m4
+++ /dev/null
@@ -1,44 +0,0 @@
-# unlocked-io.m4 serial 13
-
-# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-dnl From Jim Meyering.
-dnl
-dnl See if the glibc *_unlocked I/O macros or functions are available.
-dnl Use only those *_unlocked macros or functions that are declared
-dnl (because some of them were declared in Solaris 2.5.1 but were removed
-dnl in Solaris 2.6, whereas we want binaries built on Solaris 2.5.1 to run
-dnl on Solaris 2.6).
-
-AC_DEFUN([gl_FUNC_GLIBC_UNLOCKED_IO],
-[
-  AC_LIBSOURCES([unlocked-io.h])
-
-  AC_DEFINE([USE_UNLOCKED_IO], 1,
-    [Define to 1 if you want getc etc. to use unlocked I/O if available.
-     Unlocked I/O can improve performance in unithreaded apps,
-     but it is not safe for multithreaded apps.])
-
-  dnl Persuade glibc and Solaris <stdio.h> to declare
-  dnl fgets_unlocked(), fputs_unlocked() etc.
-  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
-
-  AC_CHECK_DECLS_ONCE([clearerr_unlocked])
-  AC_CHECK_DECLS_ONCE([feof_unlocked])
-  AC_CHECK_DECLS_ONCE([ferror_unlocked])
-  AC_CHECK_DECLS_ONCE([fflush_unlocked])
-  AC_CHECK_DECLS_ONCE([fgets_unlocked])
-  AC_CHECK_DECLS_ONCE([fputc_unlocked])
-  AC_CHECK_DECLS_ONCE([fputs_unlocked])
-  AC_CHECK_DECLS_ONCE([fread_unlocked])
-  AC_CHECK_DECLS_ONCE([fwrite_unlocked])
-  AC_CHECK_DECLS_ONCE([getc_unlocked])
-  AC_CHECK_DECLS_ONCE([getchar_unlocked])
-  AC_CHECK_DECLS_ONCE([putc_unlocked])
-  AC_CHECK_DECLS_ONCE([putchar_unlocked])
-])
diff --git a/m4/warning.m4 b/m4/warning.m4
deleted file mode 100644
index fe39bec..0000000
--- a/m4/warning.m4
+++ /dev/null
@@ -1,32 +0,0 @@
-# Finding valid warning flags for the C Compiler.           -*-Autoconf-*-
-#
-# Copyright (C) 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 2 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
-
-# serial 1
-
-AC_DEFUN([BISON_WARNING],
-[AC_MSG_CHECKING(whether compiler accepts $1)
-AC_SUBST(WARNING_CFLAGS)
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS $1"
-AC_TRY_COMPILE(,
-[int x;],
-WARNING_CFLAGS="$WARNING_CFLAGS $1"
-AC_MSG_RESULT(yes),
-AC_MSG_RESULT(no))
-CFLAGS="$ac_save_CFLAGS"])
diff --git a/m4/xalloc.m4 b/m4/xalloc.m4
deleted file mode 100644
index c0847dd..0000000
--- a/m4/xalloc.m4
+++ /dev/null
@@ -1,25 +0,0 @@
-# xalloc.m4 serial 12
-dnl Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_XALLOC],
-[
-  AC_LIBSOURCES([xmalloc.c, xalloc.h])
-  AC_LIBOBJ([xmalloc])
-
-  gl_PREREQ_XALLOC
-  gl_PREREQ_XMALLOC
-])
-
-# Prerequisites of lib/xalloc.h.
-AC_DEFUN([gl_PREREQ_XALLOC], [
-  :
-])
-
-# Prerequisites of lib/xmalloc.c.
-AC_DEFUN([gl_PREREQ_XMALLOC], [
-  AC_REQUIRE([AC_C_INLINE])
-  :
-])
diff --git a/m4/xstrndup.m4 b/m4/xstrndup.m4
deleted file mode 100644
index 8a30ab1..0000000
--- a/m4/xstrndup.m4
+++ /dev/null
@@ -1,15 +0,0 @@
-# xstrndup.m4 serial 2
-dnl Copyright (C) 2003 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_XSTRNDUP],
-[
-  gl_PREREQ_XSTRNDUP
-])
-
-# Prerequisites of lib/xstrndup.c.
-AC_DEFUN([gl_PREREQ_XSTRNDUP], [
-  :
-])
diff --git a/src/LR0.c b/src/LR0.c
deleted file mode 100644
index 259b891..0000000
--- a/src/LR0.c
+++ /dev/null
@@ -1,377 +0,0 @@
-/* Generate the nondeterministic finite state machine for Bison.
-
-   Copyright (C) 1984, 1986, 1989, 2000, 2001, 2002, 2004, 2005 Free
-   Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-
-/* See comments in state.h for the data structures that represent it.
-   The entry point is generate_states.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <bitset.h>
-#include <quotearg.h>
-
-#include "LR0.h"
-#include "closure.h"
-#include "complain.h"
-#include "getargs.h"
-#include "gram.h"
-#include "gram.h"
-#include "lalr.h"
-#include "reader.h"
-#include "reduce.h"
-#include "state.h"
-#include "symtab.h"
-
-typedef struct state_list
-{
-  struct state_list *next;
-  state *state;
-} state_list;
-
-static state_list *first_state = NULL;
-static state_list *last_state = NULL;
-
-
-/*------------------------------------------------------------------.
-| A state was just discovered from another state.  Queue it for     |
-| later examination, in order to find its transitions.  Return it.  |
-`------------------------------------------------------------------*/
-
-static state *
-state_list_append (symbol_number sym, size_t core_size, item_number *core)
-{
-  state_list *node = xmalloc (sizeof *node);
-  state *s = state_new (sym, core_size, core);
-
-  if (trace_flag & trace_automaton)
-    fprintf (stderr, "state_list_append (state = %d, symbol = %d (%s))\n",
-	     nstates, sym, symbols[sym]->tag);
-
-  node->next = NULL;
-  node->state = s;
-
-  if (!first_state)
-    first_state = node;
-  if (last_state)
-    last_state->next = node;
-  last_state = node;
-
-  return s;
-}
-
-static int nshifts;
-static symbol_number *shift_symbol;
-
-static rule **redset;
-static state **shiftset;
-
-static item_number **kernel_base;
-static int *kernel_size;
-static item_number *kernel_items;
-
-
-static void
-allocate_itemsets (void)
-{
-  symbol_number i;
-  rule_number r;
-  item_number *rhsp;
-
-  /* Count the number of occurrences of all the symbols in RITEMS.
-     Note that useless productions (hence useless nonterminals) are
-     browsed too, hence we need to allocate room for _all_ the
-     symbols.  */
-  size_t count = 0;
-  size_t *symbol_count = xcalloc (nsyms + nuseless_nonterminals,
-				  sizeof *symbol_count);
-
-  for (r = 0; r < nrules; ++r)
-    for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
-      {
-	count++;
-	symbol_count[*rhsp]++;
-      }
-
-  /* See comments before new_itemsets.  All the vectors of items
-     live inside KERNEL_ITEMS.  The number of active items after
-     some symbol S cannot be more than the number of times that S
-     appears as an item, which is SYMBOL_COUNT[S].
-     We allocate that much space for each symbol.  */
-
-  kernel_base = xnmalloc (nsyms, sizeof *kernel_base);
-  kernel_items = xnmalloc (count, sizeof *kernel_items);
-
-  count = 0;
-  for (i = 0; i < nsyms; i++)
-    {
-      kernel_base[i] = kernel_items + count;
-      count += symbol_count[i];
-    }
-
-  free (symbol_count);
-  kernel_size = xnmalloc (nsyms, sizeof *kernel_size);
-}
-
-
-static void
-allocate_storage (void)
-{
-  allocate_itemsets ();
-
-  shiftset = xnmalloc (nsyms, sizeof *shiftset);
-  redset = xnmalloc (nrules, sizeof *redset);
-  state_hash_new ();
-  shift_symbol = xnmalloc (nsyms, sizeof *shift_symbol);
-}
-
-
-static void
-free_storage (void)
-{
-  free (shift_symbol);
-  free (redset);
-  free (shiftset);
-  free (kernel_base);
-  free (kernel_size);
-  free (kernel_items);
-  state_hash_free ();
-}
-
-
-
-
-/*---------------------------------------------------------------.
-| Find which symbols can be shifted in S, and for each one       |
-| record which items would be active after that shift.  Uses the |
-| contents of itemset.                                           |
-|                                                                |
-| shift_symbol is set to a vector of the symbols that can be     |
-| shifted.  For each symbol in the grammar, kernel_base[symbol]  |
-| points to a vector of item numbers activated if that symbol is |
-| shifted, and kernel_size[symbol] is their numbers.             |
-`---------------------------------------------------------------*/
-
-static void
-new_itemsets (state *s)
-{
-  size_t i;
-
-  if (trace_flag & trace_automaton)
-    fprintf (stderr, "Entering new_itemsets, state = %d\n", s->number);
-
-  memset (kernel_size, 0, nsyms * sizeof *kernel_size);
-
-  nshifts = 0;
-
-  for (i = 0; i < nritemset; ++i)
-    if (ritem[itemset[i]] >= 0)
-      {
-	symbol_number sym = item_number_as_symbol_number (ritem[itemset[i]]);
-	if (!kernel_size[sym])
-	  {
-	    shift_symbol[nshifts] = sym;
-	    nshifts++;
-	  }
-
-	kernel_base[sym][kernel_size[sym]] = itemset[i] + 1;
-	kernel_size[sym]++;
-      }
-}
-
-
-
-/*--------------------------------------------------------------.
-| Find the state we would get to (from the current state) by    |
-| shifting SYM.  Create a new state if no equivalent one exists |
-| already.  Used by append_states.                              |
-`--------------------------------------------------------------*/
-
-static state *
-get_state (symbol_number sym, size_t core_size, item_number *core)
-{
-  state *s;
-
-  if (trace_flag & trace_automaton)
-    fprintf (stderr, "Entering get_state, symbol = %d (%s)\n",
-	     sym, symbols[sym]->tag);
-
-  s = state_hash_lookup (core_size, core);
-  if (!s)
-    s = state_list_append (sym, core_size, core);
-
-  if (trace_flag & trace_automaton)
-    fprintf (stderr, "Exiting get_state => %d\n", s->number);
-
-  return s;
-}
-
-/*---------------------------------------------------------------.
-| Use the information computed by new_itemsets to find the state |
-| numbers reached by each shift transition from S.		 |
-|                                                                |
-| SHIFTSET is set up as a vector of those states.                |
-`---------------------------------------------------------------*/
-
-static void
-append_states (state *s)
-{
-  int i;
-
-  if (trace_flag & trace_automaton)
-    fprintf (stderr, "Entering append_states, state = %d\n", s->number);
-
-  /* First sort shift_symbol into increasing order.  */
-
-  for (i = 1; i < nshifts; i++)
-    {
-      symbol_number sym = shift_symbol[i];
-      int j;
-      for (j = i; 0 < j && sym < shift_symbol[j - 1]; j--)
-	shift_symbol[j] = shift_symbol[j - 1];
-      shift_symbol[j] = sym;
-    }
-
-  for (i = 0; i < nshifts; i++)
-    {
-      symbol_number sym = shift_symbol[i];
-      shiftset[i] = get_state (sym, kernel_size[sym], kernel_base[sym]);
-    }
-}
-
-
-/*----------------------------------------------------------------.
-| Find which rules can be used for reduction transitions from the |
-| current state and make a reductions structure for the state to  |
-| record their rule numbers.                                      |
-`----------------------------------------------------------------*/
-
-static void
-save_reductions (state *s)
-{
-  int count = 0;
-  size_t i;
-
-  /* Find and count the active items that represent ends of rules. */
-  for (i = 0; i < nritemset; ++i)
-    {
-      item_number item = ritem[itemset[i]];
-      if (item_number_is_rule_number (item))
-	{
-	  rule_number r = item_number_as_rule_number (item);
-	  redset[count++] = &rules[r];
-	  if (r == 0)
-	    {
-	      /* This is "reduce 0", i.e., accept. */
-	      assert (!final_state);
-	      final_state = s;
-	    }
-	}
-    }
-
-  /* Make a reductions structure and copy the data into it.  */
-  state_reductions_set (s, count, redset);
-}
-
-
-/*---------------.
-| Build STATES.  |
-`---------------*/
-
-static void
-set_states (void)
-{
-  states = xcalloc (nstates, sizeof *states);
-
-  while (first_state)
-    {
-      state_list *this = first_state;
-
-      /* Pessimization, but simplification of the code: make sure all
-	 the states have valid transitions and reductions members,
-	 even if reduced to 0.  It is too soon for errs, which are
-	 computed later, but set_conflicts.  */
-      state *s = this->state;
-      if (!s->transitions)
-	state_transitions_set (s, 0, 0);
-      if (!s->reductions)
-	state_reductions_set (s, 0, 0);
-
-      states[s->number] = s;
-
-      first_state = this->next;
-      free (this);
-    }
-  first_state = NULL;
-  last_state = NULL;
-}
-
-
-/*-------------------------------------------------------------------.
-| Compute the nondeterministic finite state machine (see state.h for |
-| details) from the grammar.                                         |
-`-------------------------------------------------------------------*/
-
-void
-generate_states (void)
-{
-  item_number initial_core = 0;
-  state_list *list = NULL;
-  allocate_storage ();
-  new_closure (nritems);
-
-  /* Create the initial state.  The 0 at the lhs is the index of the
-     item of this initial rule.  */
-  state_list_append (0, 1, &initial_core);
-
-  /* States are queued when they are created; process them all.  */
-  for (list = first_state; list; list = list->next)
-    {
-      state *s = list->state;
-      if (trace_flag & trace_automaton)
-	fprintf (stderr, "Processing state %d (reached by %s)\n",
-		 s->number,
-		 symbols[s->accessing_symbol]->tag);
-      /* Set up ruleset and itemset for the transitions out of this
-         state.  ruleset gets a 1 bit for each rule that could reduce
-         now.  itemset gets a vector of all the items that could be
-         accepted next.  */
-      closure (s->items, s->nitems);
-      /* Record the reductions allowed out of this state.  */
-      save_reductions (s);
-      /* Find the itemsets of the states that shifts can reach.  */
-      new_itemsets (s);
-      /* Find or create the core structures for those states.  */
-      append_states (s);
-
-      /* Create the shifts structures for the shifts to those states,
-	 now that the state numbers transitioning to are known.  */
-      state_transitions_set (s, nshifts, shiftset);
-    }
-
-  /* discard various storage */
-  free_closure ();
-  free_storage ();
-
-  /* Set up STATES. */
-  set_states ();
-}
diff --git a/src/LR0.h b/src/LR0.h
deleted file mode 100644
index 6004538..0000000
--- a/src/LR0.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Generate the nondeterministic finite state machine for bison,
-   Copyright 1984, 1986, 1989, 2000, 2001, 2002  Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef LR0_H_
-# define LR0_H_
-
-# include "state.h"
-
-void generate_states (void);
-
-#endif /* !LR0_H_ */
diff --git a/src/Makefile b/src/Makefile
deleted file mode 100644
index eeb1d5b..0000000
--- a/src/Makefile
+++ /dev/null
@@ -1,655 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# src/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-
-
-srcdir = .
-top_srcdir = ..
-
-pkgdatadir = $(datadir)/bison
-pkglibdir = $(libdir)/bison
-pkgincludedir = $(includedir)/bison
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = /usr/bin/install -c
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-unknown-linux-gnu
-host_triplet = x86_64-unknown-linux-gnu
-bin_PROGRAMS = bison$(EXEEXT)
-subdir = src
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in parse-gram.c \
-	scan-gram.c scan-skel.c
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"
-binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-PROGRAMS = $(bin_PROGRAMS)
-am_bison_OBJECTS = LR0.$(OBJEXT) assoc.$(OBJEXT) closure.$(OBJEXT) \
-	complain.$(OBJEXT) conflicts.$(OBJEXT) derives.$(OBJEXT) \
-	files.$(OBJEXT) getargs.$(OBJEXT) gram.$(OBJEXT) \
-	lalr.$(OBJEXT) location.$(OBJEXT) main.$(OBJEXT) \
-	muscle_tab.$(OBJEXT) nullable.$(OBJEXT) output.$(OBJEXT) \
-	parse-gram.$(OBJEXT) print.$(OBJEXT) print_graph.$(OBJEXT) \
-	reader.$(OBJEXT) reduce.$(OBJEXT) relation.$(OBJEXT) \
-	scan-gram-c.$(OBJEXT) scan-skel-c.$(OBJEXT) state.$(OBJEXT) \
-	symlist.$(OBJEXT) symtab.$(OBJEXT) tables.$(OBJEXT) \
-	uniqstr.$(OBJEXT) vcg.$(OBJEXT)
-bison_OBJECTS = $(am_bison_OBJECTS)
-bison_LDADD = $(LDADD)
-am__DEPENDENCIES_1 =
-bison_DEPENDENCIES = ../lib/libbison.a $(am__DEPENDENCIES_1)
-binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
-SCRIPTS = $(bin_SCRIPTS)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
-am__depfiles_maybe = depfiles
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS)
-YLWRAP = $(top_srcdir)/build-aux/ylwrap
-YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS)
-SOURCES = $(bison_SOURCES) $(EXTRA_bison_SOURCES)
-DIST_SOURCES = $(bison_SOURCES) $(EXTRA_bison_SOURCES)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run aclocal-1.9
-AMDEP_FALSE = #
-AMDEP_TRUE = 
-AMTAR = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run tar
-AUTOCONF = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoconf
-AUTOHEADER = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoheader
-AUTOM4TE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autom4te
-AUTOMAKE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run automake-1.9
-AWK = gawk
-BISON_CXX_WORKS = :
-BISON_CXX_WORKS_FALSE = #
-BISON_CXX_WORKS_TRUE = 
-BISON_LOCALEDIR = /usr/share/locale
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPP = gcc -E
-CPPFLAGS = 
-CXX = g++
-CXXDEPMODE = depmode=gcc3
-CXXFLAGS = -g -O2
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H -DPKGDATADIR=\"$(pkgdatadir)\" \
-	-DLOCALEDIR=\"$(datadir)/locale\"
-DEPDIR = .deps
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = grep -E
-EXEEXT = 
-GCC = yes
-GETOPT_H = 
-GMSGFMT = /usr/bin/msgfmt
-HAVE__BOOL = 1
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
-INTLLIBS = 
-INTL_MACOSX_LIBS = 
-LDFLAGS = 
-LEX = flex
-LEXLIB = -lfl
-LEX_OUTPUT_ROOT = lex.yy
-LIBICONV = -liconv
-LIBINTL = 
-LIBOBJS =  dirname$U.o exitfail$U.o hard-locale$U.o hash$U.o quote$U.o quotearg$U.o fopen-safer$U.o dup-safer$U.o fd-safer$U.o pipe-safer$U.o xmalloc$U.o
-LIBS = 
-LTLIBICONV = -liconv
-LTLIBINTL = 
-LTLIBOBJS =  dirname$U.lo exitfail$U.lo hard-locale$U.lo hash$U.lo quote$U.lo quotearg$U.lo fopen-safer$U.lo dup-safer$U.lo fd-safer$U.lo pipe-safer$U.lo xmalloc$U.lo
-M4 = /usr/bin/m4
-MAKEINFO = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run makeinfo
-MKINSTALLDIRS = $(top_builddir)/build-aux/mkinstalldirs
-MSGFMT = /usr/bin/msgfmt
-MSGMERGE = /usr/bin/msgmerge
-O0CFLAGS = -g 
-O0CXXFLAGS = -g 
-OBJEXT = o
-PACKAGE = bison
-PACKAGE_BUGREPORT = bug-bison@gnu.org
-PACKAGE_NAME = GNU Bison
-PACKAGE_STRING = GNU Bison 2.3
-PACKAGE_TARNAME = bison
-PACKAGE_VERSION = 2.3
-PATH_SEPARATOR = :
-POSUB = po
-RANLIB = ranlib
-SET_MAKE = 
-SHELL = /bin/sh
-STDBOOL_H = 
-STRIP = 
-UNISTD_H = 
-USE_NLS = yes
-VALGRIND = 
-VERSION = 2.3
-WARNING_CFLAGS = 
-WARNING_CXXFLAGS = 
-WERROR_CFLAGS = 
-XGETTEXT = /usr/bin/xgettext
-
-# Use our own Bison to build the parser.  Of course, you ought to
-# keep a sane version of Bison nearby...
-YACC = ../tests/bison -y
-YACC_LIBRARY = liby.a
-YACC_SCRIPT = yacc
-ac_ct_CC = gcc
-ac_ct_CXX = g++
-ac_ct_RANLIB = ranlib
-ac_ct_STRIP = 
-aclocaldir = ${datadir}/aclocal
-am__fastdepCC_FALSE = #
-am__fastdepCC_TRUE = 
-am__fastdepCXX_FALSE = #
-am__fastdepCXX_TRUE = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = ${AMTAR} chof - "$$tardir"
-am__untar = ${AMTAR} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-unknown-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = unknown
-datadir = ${prefix}/share
-exec_prefix = ${prefix}
-host = x86_64-unknown-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = unknown
-includedir = ${prefix}/include
-infodir = ${prefix}/info
-install_sh = /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localstatedir = ${prefix}/var
-mandir = ${prefix}/man
-mkdir_p = mkdir -p --
-oldincludedir = /usr/include
-prefix = /home/phanna/src/bison
-program_transform_name = s,x,x,
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-sysconfdir = ${prefix}/etc
-target_alias = 
-AM_CFLAGS = $(WARNING_CFLAGS) $(WERROR_CFLAGS)
-AM_CPPFLAGS = -I$(top_srcdir)/lib -I../lib
-AM_YFLAGS = "-dv"
-LDADD = ../lib/libbison.a $(LIBINTL)
-bin_SCRIPTS = $(YACC_SCRIPT)
-EXTRA_SCRIPTS = yacc
-bison_SOURCES = \
-	LR0.c LR0.h				  \
-	assoc.c assoc.h				  \
-	closure.c closure.h			  \
-	complain.c complain.h			  \
-	conflicts.c conflicts.h			  \
-	derives.c derives.h			  \
-	files.c files.h				  \
-	getargs.c getargs.h			  \
-	gram.c gram.h				  \
-	lalr.h lalr.c				  \
-	location.c location.h			  \
-	main.c					  \
-	muscle_tab.c muscle_tab.h		  \
-	nullable.c nullable.h			  \
-	output.c output.h			  \
-	parse-gram.h parse-gram.y		  \
-	print.c print.h				  \
-	print_graph.c print_graph.h		  \
-	reader.c reader.h			  \
-	reduce.c reduce.h			  \
-	relation.c relation.h			  \
-	scan-gram-c.c				  \
-	scan-skel-c.c scan-skel.h		  \
-	state.c state.h				  \
-	symlist.c symlist.h			  \
-	symtab.c symtab.h			  \
-	system.h				  \
-	tables.h tables.c			  \
-	uniqstr.c uniqstr.h			  \
-	vcg.c vcg.h				  \
-	vcg_defaults.h
-
-EXTRA_bison_SOURCES = scan-skel.l scan-gram.l
-BUILT_SOURCES = scan-skel.c scan-gram.c parse-gram.c parse-gram.h
-MOSTLYCLEANFILES = yacc
-all: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .l .o .obj .y
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-install-binPROGRAMS: $(bin_PROGRAMS)
-	@$(NORMAL_INSTALL)
-	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
-	@list='$(bin_PROGRAMS)'; for p in $$list; do \
-	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-	  if test -f $$p \
-	  ; then \
-	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	   $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
-	  else :; fi; \
-	done
-
-uninstall-binPROGRAMS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(bin_PROGRAMS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
-	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
-	done
-
-clean-binPROGRAMS:
-	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
-bison$(EXEEXT): $(bison_OBJECTS) $(bison_DEPENDENCIES) 
-	@rm -f bison$(EXEEXT)
-	$(LINK) $(bison_LDFLAGS) $(bison_OBJECTS) $(bison_LDADD) $(LIBS)
-install-binSCRIPTS: $(bin_SCRIPTS)
-	@$(NORMAL_INSTALL)
-	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	    $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \
-	  else :; fi; \
-	done
-
-uninstall-binSCRIPTS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
-	done
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-include ./$(DEPDIR)/LR0.Po
-include ./$(DEPDIR)/assoc.Po
-include ./$(DEPDIR)/closure.Po
-include ./$(DEPDIR)/complain.Po
-include ./$(DEPDIR)/conflicts.Po
-include ./$(DEPDIR)/derives.Po
-include ./$(DEPDIR)/files.Po
-include ./$(DEPDIR)/getargs.Po
-include ./$(DEPDIR)/gram.Po
-include ./$(DEPDIR)/lalr.Po
-include ./$(DEPDIR)/location.Po
-include ./$(DEPDIR)/main.Po
-include ./$(DEPDIR)/muscle_tab.Po
-include ./$(DEPDIR)/nullable.Po
-include ./$(DEPDIR)/output.Po
-include ./$(DEPDIR)/parse-gram.Po
-include ./$(DEPDIR)/print.Po
-include ./$(DEPDIR)/print_graph.Po
-include ./$(DEPDIR)/reader.Po
-include ./$(DEPDIR)/reduce.Po
-include ./$(DEPDIR)/relation.Po
-include ./$(DEPDIR)/scan-gram-c.Po
-include ./$(DEPDIR)/scan-gram.Po
-include ./$(DEPDIR)/scan-skel-c.Po
-include ./$(DEPDIR)/scan-skel.Po
-include ./$(DEPDIR)/state.Po
-include ./$(DEPDIR)/symlist.Po
-include ./$(DEPDIR)/symtab.Po
-include ./$(DEPDIR)/tables.Po
-include ./$(DEPDIR)/uniqstr.Po
-include ./$(DEPDIR)/vcg.Po
-
-.c.o:
-	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
-	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-#	source='$<' object='$@' libtool=no \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(COMPILE) -c $<
-
-.c.obj:
-	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
-	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-#	source='$<' object='$@' libtool=no \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.l.c:
-	$(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE)
-
-.y.c:
-	$(YACCCOMPILE) $<
-	if test -f y.tab.h; then \
-	  to=`echo "$*_H" | sed \
-                -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
-                -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \
-	  sed -e "/^#/!b" -e "s/Y_TAB_H/$$to/g" -e "s|y\.tab\.h|$*.h|" \
-            y.tab.h >$*.ht; \
-	  rm -f y.tab.h; \
-	  if cmp -s $*.ht $*.h; then \
-	    rm -f $*.ht ;\
-	  else \
-	    mv $*.ht $*.h; \
-	  fi; \
-	fi
-	if test -f y.output; then \
-	  mv y.output $*.output; \
-	fi
-	sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@
-	rm -f y.tab.c
-uninstall-info-am:
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) check-am
-all-am: Makefile $(PROGRAMS) $(SCRIPTS)
-installdirs:
-	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
-	done
-install: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-rm -f parse-gram.c
-	-rm -f scan-gram.c
-	-rm -f scan-skel.c
-	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-clean: clean-am
-
-clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am: install-binPROGRAMS install-binSCRIPTS
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
-	uninstall-info-am
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
-	clean-generic ctags distclean distclean-compile \
-	distclean-generic distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-binPROGRAMS \
-	install-binSCRIPTS install-data install-data-am install-exec \
-	install-exec-am install-info install-info-am install-man \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-binPROGRAMS \
-	uninstall-binSCRIPTS uninstall-info-am
-
-
-yacc:
-	echo '#! /bin/sh' >$@
-	echo 'exec $(bindir)/bison -y "$$@"' >>$@
-	chmod a+x $@
-
-echo:
-	echo $(bison_SOURCES) $(noinst_HEADERS)
-
-# The following rule is not designed to be portable,
-# and relies on tools that not everyone has.
-
-# Most functions in src/*.c should have static scope.
-# Any that don't must be marked with `extern', but `main'
-# and `usage' are exceptions.  They're always extern, but
-# don't need to be marked.
-#
-# The second nm|grep checks for file-scope variables with `extern' scope.
-sc_tight_scope: $(all_programs)
-	@t=exceptions-$$$$;						\
-	trap 's=$$?; rm -f $$t; exit $$s' 0 1 2 13 15;			\
-	( printf '^main$$\n^usage$$\n';					\
-	  grep -h -A1 '^extern .*[^;]$$' $(SOURCES)			\
-	    | grep -vE '^(extern |--)' |sed 's/^/^/;s/ .*/$$/' ) > $$t;	\
-	if nm -e *.$(OBJEXT)						\
-	    | sed -n 's/.* T //p'					\
-	    | grep -Ev -f $$t; then					\
-	  echo 'the above functions should have static scope' 1>&2;	\
-	  exit 1;							\
-	fi;								\
-	( printf '^program_name$$\n';					\
-	  sed -n 's/^extern .*[* ]\([a-zA-Z_][a-zA-Z_0-9]*\);$$/^\1$$/p' \
-	    $$(ls $(SOURCES) | grep '\.h$$') /dev/null) > $$t;		\
-	if nm -e *.$(OBJEXT)						\
-	    | sed -n 's/.* [BD] //p'					\
-	    | grep -Ev -f $$t; then					\
-	  echo 'the above variables should have static scope' 1>&2;	\
-	  exit 1;							\
-	fi
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/src/Makefile.am b/src/Makefile.am
deleted file mode 100644
index c973e9e..0000000
--- a/src/Makefile.am
+++ /dev/null
@@ -1,110 +0,0 @@
-## Copyright (C) 2001, 2002, 2003, 2004, 2005 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 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, write to the Free Software
-## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-## 02110-1301  USA
-
-DEFS += -DPKGDATADIR=\"$(pkgdatadir)\" -DLOCALEDIR=\"$(datadir)/locale\"
-
-AM_CFLAGS = $(WARNING_CFLAGS) $(WERROR_CFLAGS)
-AM_CPPFLAGS = -I$(top_srcdir)/lib -I../lib
-AM_YFLAGS = "-dv"
-
-LDADD = ../lib/libbison.a $(LIBINTL)
-
-# Use our own Bison to build the parser.  Of course, you ought to
-# keep a sane version of Bison nearby...
-YACC = ../tests/bison -y
-
-bin_PROGRAMS = bison
-bin_SCRIPTS = $(YACC_SCRIPT)
-EXTRA_SCRIPTS = yacc
-
-bison_SOURCES =					  \
-	LR0.c LR0.h				  \
-	assoc.c assoc.h				  \
-	closure.c closure.h			  \
-	complain.c complain.h			  \
-	conflicts.c conflicts.h			  \
-	derives.c derives.h			  \
-	files.c files.h				  \
-	getargs.c getargs.h			  \
-	gram.c gram.h				  \
-	lalr.h lalr.c				  \
-	location.c location.h			  \
-	main.c					  \
-	muscle_tab.c muscle_tab.h		  \
-	nullable.c nullable.h			  \
-	output.c output.h			  \
-	parse-gram.h parse-gram.y		  \
-	print.c print.h				  \
-	print_graph.c print_graph.h		  \
-	reader.c reader.h			  \
-	reduce.c reduce.h			  \
-	relation.c relation.h			  \
-	scan-gram-c.c				  \
-	scan-skel-c.c scan-skel.h		  \
-	state.c state.h				  \
-	symlist.c symlist.h			  \
-	symtab.c symtab.h			  \
-	system.h				  \
-	tables.h tables.c			  \
-	uniqstr.c uniqstr.h			  \
-	vcg.c vcg.h				  \
-	vcg_defaults.h
-
-EXTRA_bison_SOURCES = scan-skel.l scan-gram.l
-
-BUILT_SOURCES = scan-skel.c scan-gram.c parse-gram.c parse-gram.h
-
-MOSTLYCLEANFILES = yacc
-
-yacc:
-	echo '#! /bin/sh' >$@
-	echo 'exec $(bindir)/bison -y "$$@"' >>$@
-	chmod a+x $@
-
-echo:
-	echo $(bison_SOURCES) $(noinst_HEADERS)
-
-# The following rule is not designed to be portable,
-# and relies on tools that not everyone has.
-
-# Most functions in src/*.c should have static scope.
-# Any that don't must be marked with `extern', but `main'
-# and `usage' are exceptions.  They're always extern, but
-# don't need to be marked.
-#
-# The second nm|grep checks for file-scope variables with `extern' scope.
-sc_tight_scope: $(all_programs)
-	@t=exceptions-$$$$;						\
-	trap 's=$$?; rm -f $$t; exit $$s' 0 1 2 13 15;			\
-	( printf '^main$$\n^usage$$\n';					\
-	  grep -h -A1 '^extern .*[^;]$$' $(SOURCES)			\
-	    | grep -vE '^(extern |--)' |sed 's/^/^/;s/ .*/$$/' ) > $$t;	\
-	if nm -e *.$(OBJEXT)						\
-	    | sed -n 's/.* T //p'					\
-	    | grep -Ev -f $$t; then					\
-	  echo 'the above functions should have static scope' 1>&2;	\
-	  exit 1;							\
-	fi;								\
-	( printf '^program_name$$\n';					\
-	  sed -n 's/^extern .*[* ]\([a-zA-Z_][a-zA-Z_0-9]*\);$$/^\1$$/p' \
-	    $$(ls $(SOURCES) | grep '\.h$$') /dev/null) > $$t;		\
-	if nm -e *.$(OBJEXT)						\
-	    | sed -n 's/.* [BD] //p'					\
-	    | grep -Ev -f $$t; then					\
-	  echo 'the above variables should have static scope' 1>&2;	\
-	  exit 1;							\
-	fi
diff --git a/src/Makefile.in b/src/Makefile.in
deleted file mode 100644
index 7de9081..0000000
--- a/src/Makefile.in
+++ /dev/null
@@ -1,655 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-bin_PROGRAMS = bison$(EXEEXT)
-subdir = src
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in parse-gram.c \
-	scan-gram.c scan-skel.c
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"
-binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-PROGRAMS = $(bin_PROGRAMS)
-am_bison_OBJECTS = LR0.$(OBJEXT) assoc.$(OBJEXT) closure.$(OBJEXT) \
-	complain.$(OBJEXT) conflicts.$(OBJEXT) derives.$(OBJEXT) \
-	files.$(OBJEXT) getargs.$(OBJEXT) gram.$(OBJEXT) \
-	lalr.$(OBJEXT) location.$(OBJEXT) main.$(OBJEXT) \
-	muscle_tab.$(OBJEXT) nullable.$(OBJEXT) output.$(OBJEXT) \
-	parse-gram.$(OBJEXT) print.$(OBJEXT) print_graph.$(OBJEXT) \
-	reader.$(OBJEXT) reduce.$(OBJEXT) relation.$(OBJEXT) \
-	scan-gram-c.$(OBJEXT) scan-skel-c.$(OBJEXT) state.$(OBJEXT) \
-	symlist.$(OBJEXT) symtab.$(OBJEXT) tables.$(OBJEXT) \
-	uniqstr.$(OBJEXT) vcg.$(OBJEXT)
-bison_OBJECTS = $(am_bison_OBJECTS)
-bison_LDADD = $(LDADD)
-am__DEPENDENCIES_1 =
-bison_DEPENDENCIES = ../lib/libbison.a $(am__DEPENDENCIES_1)
-binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
-SCRIPTS = $(bin_SCRIPTS)
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
-am__depfiles_maybe = depfiles
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS)
-YLWRAP = $(top_srcdir)/build-aux/ylwrap
-YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS)
-SOURCES = $(bison_SOURCES) $(EXTRA_bison_SOURCES)
-DIST_SOURCES = $(bison_SOURCES) $(EXTRA_bison_SOURCES)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOM4TE = @AUTOM4TE@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BISON_CXX_WORKS = @BISON_CXX_WORKS@
-BISON_CXX_WORKS_FALSE = @BISON_CXX_WORKS_FALSE@
-BISON_CXX_WORKS_TRUE = @BISON_CXX_WORKS_TRUE@
-BISON_LOCALEDIR = @BISON_LOCALEDIR@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@ -DPKGDATADIR=\"$(pkgdatadir)\" \
-	-DLOCALEDIR=\"$(datadir)/locale\"
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-GCC = @GCC@
-GETOPT_H = @GETOPT_H@
-GMSGFMT = @GMSGFMT@
-HAVE__BOOL = @HAVE__BOOL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTLLIBS = @INTLLIBS@
-INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
-LDFLAGS = @LDFLAGS@
-LEX = @LEX@
-LEXLIB = @LEXLIB@
-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
-LIBICONV = @LIBICONV@
-LIBINTL = @LIBINTL@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LTLIBICONV = @LTLIBICONV@
-LTLIBINTL = @LTLIBINTL@
-LTLIBOBJS = @LTLIBOBJS@
-M4 = @M4@
-MAKEINFO = @MAKEINFO@
-MKINSTALLDIRS = @MKINSTALLDIRS@
-MSGFMT = @MSGFMT@
-MSGMERGE = @MSGMERGE@
-O0CFLAGS = @O0CFLAGS@
-O0CXXFLAGS = @O0CXXFLAGS@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-POSUB = @POSUB@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STDBOOL_H = @STDBOOL_H@
-STRIP = @STRIP@
-UNISTD_H = @UNISTD_H@
-USE_NLS = @USE_NLS@
-VALGRIND = @VALGRIND@
-VERSION = @VERSION@
-WARNING_CFLAGS = @WARNING_CFLAGS@
-WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
-WERROR_CFLAGS = @WERROR_CFLAGS@
-XGETTEXT = @XGETTEXT@
-
-# Use our own Bison to build the parser.  Of course, you ought to
-# keep a sane version of Bison nearby...
-YACC = ../tests/bison -y
-YACC_LIBRARY = @YACC_LIBRARY@
-YACC_SCRIPT = @YACC_SCRIPT@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-aclocaldir = @aclocaldir@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-AM_CFLAGS = $(WARNING_CFLAGS) $(WERROR_CFLAGS)
-AM_CPPFLAGS = -I$(top_srcdir)/lib -I../lib
-AM_YFLAGS = "-dv"
-LDADD = ../lib/libbison.a $(LIBINTL)
-bin_SCRIPTS = $(YACC_SCRIPT)
-EXTRA_SCRIPTS = yacc
-bison_SOURCES = \
-	LR0.c LR0.h				  \
-	assoc.c assoc.h				  \
-	closure.c closure.h			  \
-	complain.c complain.h			  \
-	conflicts.c conflicts.h			  \
-	derives.c derives.h			  \
-	files.c files.h				  \
-	getargs.c getargs.h			  \
-	gram.c gram.h				  \
-	lalr.h lalr.c				  \
-	location.c location.h			  \
-	main.c					  \
-	muscle_tab.c muscle_tab.h		  \
-	nullable.c nullable.h			  \
-	output.c output.h			  \
-	parse-gram.h parse-gram.y		  \
-	print.c print.h				  \
-	print_graph.c print_graph.h		  \
-	reader.c reader.h			  \
-	reduce.c reduce.h			  \
-	relation.c relation.h			  \
-	scan-gram-c.c				  \
-	scan-skel-c.c scan-skel.h		  \
-	state.c state.h				  \
-	symlist.c symlist.h			  \
-	symtab.c symtab.h			  \
-	system.h				  \
-	tables.h tables.c			  \
-	uniqstr.c uniqstr.h			  \
-	vcg.c vcg.h				  \
-	vcg_defaults.h
-
-EXTRA_bison_SOURCES = scan-skel.l scan-gram.l
-BUILT_SOURCES = scan-skel.c scan-gram.c parse-gram.c parse-gram.h
-MOSTLYCLEANFILES = yacc
-all: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .l .o .obj .y
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-install-binPROGRAMS: $(bin_PROGRAMS)
-	@$(NORMAL_INSTALL)
-	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
-	@list='$(bin_PROGRAMS)'; for p in $$list; do \
-	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-	  if test -f $$p \
-	  ; then \
-	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	   $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
-	  else :; fi; \
-	done
-
-uninstall-binPROGRAMS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(bin_PROGRAMS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
-	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
-	done
-
-clean-binPROGRAMS:
-	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
-bison$(EXEEXT): $(bison_OBJECTS) $(bison_DEPENDENCIES) 
-	@rm -f bison$(EXEEXT)
-	$(LINK) $(bison_LDFLAGS) $(bison_OBJECTS) $(bison_LDADD) $(LIBS)
-install-binSCRIPTS: $(bin_SCRIPTS)
-	@$(NORMAL_INSTALL)
-	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	    $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \
-	  else :; fi; \
-	done
-
-uninstall-binSCRIPTS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
-	done
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LR0.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assoc.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/closure.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complain.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conflicts.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/derives.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/files.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getargs.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gram.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lalr.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/location.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/muscle_tab.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nullable.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/output.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-gram.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print_graph.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reader.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reduce.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relation.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scan-gram-c.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scan-gram.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scan-skel-c.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scan-skel.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/state.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symlist.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symtab.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tables.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uniqstr.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcg.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.l.c:
-	$(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE)
-
-.y.c:
-	$(YACCCOMPILE) $<
-	if test -f y.tab.h; then \
-	  to=`echo "$*_H" | sed \
-                -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
-                -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \
-	  sed -e "/^#/!b" -e "s/Y_TAB_H/$$to/g" -e "s|y\.tab\.h|$*.h|" \
-            y.tab.h >$*.ht; \
-	  rm -f y.tab.h; \
-	  if cmp -s $*.ht $*.h; then \
-	    rm -f $*.ht ;\
-	  else \
-	    mv $*.ht $*.h; \
-	  fi; \
-	fi
-	if test -f y.output; then \
-	  mv y.output $*.output; \
-	fi
-	sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@
-	rm -f y.tab.c
-uninstall-info-am:
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) check-am
-all-am: Makefile $(PROGRAMS) $(SCRIPTS)
-installdirs:
-	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
-	done
-install: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-rm -f parse-gram.c
-	-rm -f scan-gram.c
-	-rm -f scan-skel.c
-	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-clean: clean-am
-
-clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am: install-binPROGRAMS install-binSCRIPTS
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
-	uninstall-info-am
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
-	clean-generic ctags distclean distclean-compile \
-	distclean-generic distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-binPROGRAMS \
-	install-binSCRIPTS install-data install-data-am install-exec \
-	install-exec-am install-info install-info-am install-man \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-binPROGRAMS \
-	uninstall-binSCRIPTS uninstall-info-am
-
-
-yacc:
-	echo '#! /bin/sh' >$@
-	echo 'exec $(bindir)/bison -y "$$@"' >>$@
-	chmod a+x $@
-
-echo:
-	echo $(bison_SOURCES) $(noinst_HEADERS)
-
-# The following rule is not designed to be portable,
-# and relies on tools that not everyone has.
-
-# Most functions in src/*.c should have static scope.
-# Any that don't must be marked with `extern', but `main'
-# and `usage' are exceptions.  They're always extern, but
-# don't need to be marked.
-#
-# The second nm|grep checks for file-scope variables with `extern' scope.
-sc_tight_scope: $(all_programs)
-	@t=exceptions-$$$$;						\
-	trap 's=$$?; rm -f $$t; exit $$s' 0 1 2 13 15;			\
-	( printf '^main$$\n^usage$$\n';					\
-	  grep -h -A1 '^extern .*[^;]$$' $(SOURCES)			\
-	    | grep -vE '^(extern |--)' |sed 's/^/^/;s/ .*/$$/' ) > $$t;	\
-	if nm -e *.$(OBJEXT)						\
-	    | sed -n 's/.* T //p'					\
-	    | grep -Ev -f $$t; then					\
-	  echo 'the above functions should have static scope' 1>&2;	\
-	  exit 1;							\
-	fi;								\
-	( printf '^program_name$$\n';					\
-	  sed -n 's/^extern .*[* ]\([a-zA-Z_][a-zA-Z_0-9]*\);$$/^\1$$/p' \
-	    $$(ls $(SOURCES) | grep '\.h$$') /dev/null) > $$t;		\
-	if nm -e *.$(OBJEXT)						\
-	    | sed -n 's/.* [BD] //p'					\
-	    | grep -Ev -f $$t; then					\
-	  echo 'the above variables should have static scope' 1>&2;	\
-	  exit 1;							\
-	fi
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/src/assoc.c b/src/assoc.c
deleted file mode 100644
index 6f9a3b5..0000000
--- a/src/assoc.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Associativity information.
-   Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include "assoc.h"
-
-
-const char *
-assoc_to_string (assoc a)
-{
-  switch (a)
-    {
-    default:
-      abort ();
-
-    case undef_assoc:
-      return "undefined associativity";
-
-    case right_assoc:
-      return "%right";
-
-    case left_assoc:
-      return "%left";
-
-    case non_assoc:
-      return "%nonassoc";
-    }
-}
diff --git a/src/assoc.h b/src/assoc.h
deleted file mode 100644
index 778a451..0000000
--- a/src/assoc.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Associativity information.
-   Copyright (C) 2002, 2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef ASSOC_H_
-# define ASSOC_H_
-
-/* Associativity values for tokens and rules.  */
-typedef enum
-{
-  undef_assoc,
-  right_assoc,
-  left_assoc,
-  non_assoc
-} assoc;
-
-char const *assoc_to_string (assoc a);
-
-#endif /* !ASSOC_H_ */
diff --git a/src/closure.c b/src/closure.c
deleted file mode 100644
index 001b831..0000000
--- a/src/closure.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/* Closures for Bison
-
-   Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005 Free
-   Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <bitset.h>
-#include <bitsetv-print.h>
-#include <bitsetv.h>
-#include <quotearg.h>
-
-#include "closure.h"
-#include "derives.h"
-#include "getargs.h"
-#include "gram.h"
-#include "reader.h"
-#include "symtab.h"
-
-/* NITEMSET is the size of the array ITEMSET.  */
-item_number *itemset;
-size_t nritemset;
-
-static bitset ruleset;
-
-/* internal data.  See comments before set_fderives and set_firsts.  */
-static bitsetv fderives = NULL;
-static bitsetv firsts = NULL;
-
-/* Retrieve the FDERIVES/FIRSTS sets of the nonterminals numbered Var.  */
-#define FDERIVES(Var)   fderives[(Var) - ntokens]
-#define   FIRSTS(Var)   firsts[(Var) - ntokens]
-
-
-/*-----------------.
-| Debugging code.  |
-`-----------------*/
-
-static void
-print_closure (char const *title, item_number *array, size_t size)
-{
-  size_t i;
-  fprintf (stderr, "Closure: %s\n", title);
-  for (i = 0; i < size; ++i)
-    {
-      item_number *rp;
-      fprintf (stderr, "  %2d: .", array[i]);
-      for (rp = &ritem[array[i]]; *rp >= 0; ++rp)
-	fprintf (stderr, " %s", symbols[*rp]->tag);
-      fprintf (stderr, "  (rule %d)\n", -*rp - 1);
-    }
-  fputs ("\n\n", stderr);
-}
-
-
-static void
-print_firsts (void)
-{
-  symbol_number i, j;
-
-  fprintf (stderr, "FIRSTS\n");
-  for (i = ntokens; i < nsyms; i++)
-    {
-      bitset_iterator iter;
-      fprintf (stderr, "\t%s firsts\n", symbols[i]->tag);
-      BITSET_FOR_EACH (iter, FIRSTS (i), j, 0)
-	{
-	  fprintf (stderr, "\t\t%s\n",
-		   symbols[j + ntokens]->tag);
-	}
-    }
-  fprintf (stderr, "\n\n");
-}
-
-
-static void
-print_fderives (void)
-{
-  int i;
-  rule_number r;
-
-  fprintf (stderr, "FDERIVES\n");
-  for (i = ntokens; i < nsyms; i++)
-    {
-      bitset_iterator iter;
-      fprintf (stderr, "\t%s derives\n", symbols[i]->tag);
-      BITSET_FOR_EACH (iter, FDERIVES (i), r, 0)
-	{
-	  fprintf (stderr, "\t\t%3d ", r);
-	  rule_rhs_print (&rules[r], stderr);
-	}
-    }
-  fprintf (stderr, "\n\n");
-}
-
-/*------------------------------------------------------------------.
-| Set FIRSTS to be an NVARS array of NVARS bitsets indicating which |
-| items can represent the beginning of the input corresponding to   |
-| which other items.                                                |
-|                                                                   |
-| For example, if some rule expands symbol 5 into the sequence of   |
-| symbols 8 3 20, the symbol 8 can be the beginning of the data for |
-| symbol 5, so the bit [8 - ntokens] in first[5 - ntokens] (= FIRST |
-| (5)) is set.                                                      |
-`------------------------------------------------------------------*/
-
-static void
-set_firsts (void)
-{
-  symbol_number i, j;
-
-  firsts = bitsetv_create (nvars, nvars, BITSET_FIXED);
-
-  for (i = ntokens; i < nsyms; i++)
-    for (j = 0; derives[i - ntokens][j]; ++j)
-      {
-	item_number sym = derives[i - ntokens][j]->rhs[0];
-	if (ISVAR (sym))
-	  bitset_set (FIRSTS (i), sym - ntokens);
-      }
-
-  if (trace_flag & trace_sets)
-    bitsetv_matrix_dump (stderr, "RTC: Firsts Input", firsts);
-  bitsetv_reflexive_transitive_closure (firsts);
-  if (trace_flag & trace_sets)
-    bitsetv_matrix_dump (stderr, "RTC: Firsts Output", firsts);
-
-  if (trace_flag & trace_sets)
-    print_firsts ();
-}
-
-/*-------------------------------------------------------------------.
-| Set FDERIVES to an NVARS by NRULES matrix of bits indicating which |
-| rules can help derive the beginning of the data for each           |
-| nonterminal.                                                       |
-|                                                                    |
-| For example, if symbol 5 can be derived as the sequence of symbols |
-| 8 3 20, and one of the rules for deriving symbol 8 is rule 4, then |
-| the [5 - NTOKENS, 4] bit in FDERIVES is set.                       |
-`-------------------------------------------------------------------*/
-
-static void
-set_fderives (void)
-{
-  symbol_number i, j;
-  rule_number k;
-
-  fderives = bitsetv_create (nvars, nrules, BITSET_FIXED);
-
-  set_firsts ();
-
-  for (i = ntokens; i < nsyms; ++i)
-    for (j = ntokens; j < nsyms; ++j)
-      if (bitset_test (FIRSTS (i), j - ntokens))
-	for (k = 0; derives[j - ntokens][k]; ++k)
-	  bitset_set (FDERIVES (i), derives[j - ntokens][k]->number);
-
-  if (trace_flag & trace_sets)
-    print_fderives ();
-
-  bitsetv_free (firsts);
-}
-
-
-
-void
-new_closure (unsigned int n)
-{
-  itemset = xnmalloc (n, sizeof *itemset);
-
-  ruleset = bitset_create (nrules, BITSET_FIXED);
-
-  set_fderives ();
-}
-
-
-
-void
-closure (item_number *core, size_t n)
-{
-  /* Index over CORE. */
-  size_t c;
-
-  /* A bit index over RULESET. */
-  rule_number ruleno;
-
-  bitset_iterator iter;
-
-  if (trace_flag & trace_sets)
-    print_closure ("input", core, n);
-
-  bitset_zero (ruleset);
-
-  for (c = 0; c < n; ++c)
-    if (ISVAR (ritem[core[c]]))
-      bitset_or (ruleset, ruleset, FDERIVES (ritem[core[c]]));
-
-  nritemset = 0;
-  c = 0;
-  BITSET_FOR_EACH (iter, ruleset, ruleno, 0)
-    {
-      item_number itemno = rules[ruleno].rhs - ritem;
-      while (c < n && core[c] < itemno)
-	{
-	  itemset[nritemset] = core[c];
-	  nritemset++;
-	  c++;
-	}
-      itemset[nritemset] = itemno;
-      nritemset++;
-    };
-
-  while (c < n)
-    {
-      itemset[nritemset] = core[c];
-      nritemset++;
-      c++;
-    }
-
-  if (trace_flag & trace_sets)
-    print_closure ("output", itemset, nritemset);
-}
-
-
-void
-free_closure (void)
-{
-  free (itemset);
-  bitset_free (ruleset);
-  bitsetv_free (fderives);
-}
diff --git a/src/closure.h b/src/closure.h
deleted file mode 100644
index a2582e8..0000000
--- a/src/closure.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Subroutines for bison
-
-   Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software
-   Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
-
-#ifndef CLOSURE_H_
-# define CLOSURE_H_
-
-# include "gram.h"
-
-/* Allocates the itemset and ruleset vectors, and precomputes useful
-   data so that closure can be called.  n is the number of elements to
-   allocate for itemset.  */
-
-void new_closure (unsigned int n);
-
-
-/* Given the kernel (aka core) of a state (a vector of item numbers
-   ITEMS, of length N), set up RULESET and ITEMSET to indicate what
-   rules could be run and which items could be accepted when those
-   items are the active ones.
-
-   RULESET contains a bit for each rule.  CLOSURE sets the bits for
-   all rules which could potentially describe the next input to be
-   read.
-
-   ITEMSET is a vector of item numbers; NITEMSET is its size
-   (actually, points to just beyond the end of the part of it that is
-   significant).  CLOSURE places there the indices of all items which
-   represent units of input that could arrive next.  */
-
-void closure (item_number *items, size_t n);
-
-
-/* Frees ITEMSET, RULESET and internal data.  */
-
-void free_closure (void);
-
-extern item_number *itemset;
-extern size_t nritemset;
-
-#endif /* !CLOSURE_H_ */
diff --git a/src/complain.c b/src/complain.c
deleted file mode 100644
index 927dbb6..0000000
--- a/src/complain.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/* Declaration for error-reporting function for Bison.
-
-   Copyright (C) 2000, 2001, 2002, 2004, 2005 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.  */
-
-/* Based on error.c and error.h,
-   written by David MacKenzie <djm@gnu.ai.mit.edu>.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <stdarg.h>
-
-#include "complain.h"
-#include "files.h"
-
-/* The calling program should define program_name and set it to the
-   name of the executing program.  */
-extern char *program_name;
-
-/* This variable is set each time `warn' is called.  */
-bool warning_issued;
-
-/* This variable is set each time `complain' is called.  */
-bool complaint_issued;
-
-
-/*--------------------------------.
-| Report a warning, and proceed.  |
-`--------------------------------*/
-
-void
-warn_at (location loc, const char *message, ...)
-{
-  va_list args;
-
-  location_print (stderr, loc);
-  fputs (": ", stderr);
-  fputs (_("warning: "), stderr);
-
-  va_start (args, message);
-  vfprintf (stderr, message, args);
-  va_end (args);
-
-  warning_issued = true;
-  putc ('\n', stderr);
-}
-
-void
-warn (const char *message, ...)
-{
-  va_list args;
-
-  fprintf (stderr, "%s: %s", current_file ? current_file : program_name, _("warning: "));
-
-  va_start (args, message);
-  vfprintf (stderr, message, args);
-  va_end (args);
-
-  warning_issued = true;
-  putc ('\n', stderr);
-}
-
-/*-----------------------------------------------------------.
-| An error has occurred, but we can proceed, and die later.  |
-`-----------------------------------------------------------*/
-
-void
-complain_at (location loc, const char *message, ...)
-{
-  va_list args;
-
-  location_print (stderr, loc);
-  fputs (": ", stderr);
-
-  va_start (args, message);
-  vfprintf (stderr, message, args);
-  va_end (args);
-
-  complaint_issued = true;
-  putc ('\n', stderr);
-}
-
-void
-complain (const char *message, ...)
-{
-  va_list args;
-
-  fprintf (stderr, "%s: ", current_file ? current_file : program_name);
-
-  va_start (args, message);
-  vfprintf (stderr, message, args);
-  va_end (args);
-
-  complaint_issued = true;
-  putc ('\n', stderr);
-}
-
-/*-------------------------------------------------.
-| A severe error has occurred, we cannot proceed.  |
-`-------------------------------------------------*/
-
-void
-fatal_at (location loc, const char *message, ...)
-{
-  va_list args;
-
-  location_print (stderr, loc);
-  fputs (": ", stderr);
-  fputs (_("fatal error: "), stderr);
-
-  va_start (args, message);
-  vfprintf (stderr, message, args);
-  va_end (args);
-  putc ('\n', stderr);
-  exit (EXIT_FAILURE);
-}
-
-void
-fatal (const char *message, ...)
-{
-  va_list args;
-
-  fprintf (stderr, "%s: ", current_file ? current_file : program_name);
-
-  fputs (_("fatal error: "), stderr);
-
-  va_start (args, message);
-  vfprintf (stderr, message, args);
-  va_end (args);
-  putc ('\n', stderr);
-  exit (EXIT_FAILURE);
-}
diff --git a/src/complain.h b/src/complain.h
deleted file mode 100644
index 9ae334a..0000000
--- a/src/complain.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Declaration for error-reporting function for Bison.
-   Copyright (C) 2000, 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 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.  */
-
-#ifndef COMPLAIN_H_
-# define COMPLAIN_H_ 1
-
-# include "location.h"
-
-# ifdef	__cplusplus
-extern "C" {
-# endif
-
-/* Informative messages, but we proceed.  */
-
-void warn (char const *format, ...)
-  __attribute__ ((__format__ (__printf__, 1, 2)));
-
-void warn_at (location loc, char const *format, ...)
-  __attribute__ ((__format__ (__printf__, 2, 3)));
-
-/* Something bad happened, but let's continue and die later.  */
-
-void complain (char const *format, ...)
-  __attribute__ ((__format__ (__printf__, 1, 2)));
-
-void complain_at (location loc, char const *format, ...)
-  __attribute__ ((__format__ (__printf__, 2, 3)));
-
-/* Something bad happened, and let's die now.  */
-
-void fatal (char const *format, ...)
-  __attribute__ ((__noreturn__, __format__ (__printf__, 1, 2)));
-
-void fatal_at (location loc, char const *format, ...)
-  __attribute__ ((__noreturn__, __format__ (__printf__, 2, 3)));
-
-/* This variable is set each time `warn' is called.  */
-extern bool warning_issued;
-
-/* This variable is set each time `complain' is called.  */
-extern bool complaint_issued;
-
-# ifdef	__cplusplus
-}
-# endif
-
-#endif /* !COMPLAIN_H_ */
diff --git a/src/conflicts.c b/src/conflicts.c
deleted file mode 100644
index 13121f6..0000000
--- a/src/conflicts.c
+++ /dev/null
@@ -1,535 +0,0 @@
-/* Find and resolve or report look-ahead conflicts for bison,
-
-   Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-   Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <bitset.h>
-
-#include "LR0.h"
-#include "complain.h"
-#include "conflicts.h"
-#include "files.h"
-#include "getargs.h"
-#include "gram.h"
-#include "lalr.h"
-#include "reader.h"
-#include "state.h"
-#include "symtab.h"
-
-/* -1 stands for not specified. */
-int expected_sr_conflicts = -1;
-int expected_rr_conflicts = -1;
-static char *conflicts;
-static struct obstack solved_conflicts_obstack;
-
-static bitset shift_set;
-static bitset look_ahead_set;
-
-
-
-enum conflict_resolution
-  {
-    shift_resolution,
-    reduce_resolution,
-    left_resolution,
-    right_resolution,
-    nonassoc_resolution
-  };
-
-
-/*----------------------------------------------------------------.
-| Explain how an SR conflict between TOKEN and RULE was resolved: |
-| RESOLUTION.                                                     |
-`----------------------------------------------------------------*/
-
-static inline void
-log_resolution (rule *r, symbol_number token,
-		enum conflict_resolution resolution)
-{
-  if (report_flag & report_solved_conflicts)
-    {
-      /* The description of the resolution. */
-      switch (resolution)
-	{
-	case shift_resolution:
-	case right_resolution:
-	  obstack_fgrow2 (&solved_conflicts_obstack,
-			  _("\
-    Conflict between rule %d and token %s resolved as shift"),
-			  r->number,
-			  symbols[token]->tag);
-	  break;
-	case reduce_resolution:
-	case left_resolution:
-	  obstack_fgrow2 (&solved_conflicts_obstack,
-			  _("\
-    Conflict between rule %d and token %s resolved as reduce"),
-			  r->number,
-			  symbols[token]->tag);
-	  break;
-	case nonassoc_resolution:
-	  obstack_fgrow2 (&solved_conflicts_obstack,
-			  _("\
-    Conflict between rule %d and token %s resolved as an error"),
-			  r->number,
-			  symbols[token]->tag);
-	  break;
-	}
-
-      /* The reason. */
-      switch (resolution)
-	{
-	case shift_resolution:
-	  obstack_fgrow2 (&solved_conflicts_obstack,
-			  " (%s < %s)",
-			  r->prec->tag,
-			  symbols[token]->tag);
-	  break;
-
-	case reduce_resolution:
-	  obstack_fgrow2 (&solved_conflicts_obstack,
-			  " (%s < %s)",
-			  symbols[token]->tag,
-			  r->prec->tag);
-	  break;
-
-	case left_resolution:
-	  obstack_fgrow1 (&solved_conflicts_obstack,
-			  " (%%left %s)",
-			  symbols[token]->tag);
-	  break;
-
-	case right_resolution:
-	  obstack_fgrow1 (&solved_conflicts_obstack,
-			  " (%%right %s)",
-			  symbols[token]->tag);
-	  break;
-	case nonassoc_resolution:
-	  obstack_fgrow1 (&solved_conflicts_obstack,
-			  " (%%nonassoc %s)",
-			  symbols[token]->tag);
-	  break;
-	}
-      obstack_sgrow (&solved_conflicts_obstack, ".\n");
-    }
-}
-
-
-/*------------------------------------------------------------------.
-| Turn off the shift recorded for the specified token in the        |
-| specified state.  Used when we resolve a shift-reduce conflict in |
-| favor of the reduction.                                           |
-`------------------------------------------------------------------*/
-
-static void
-flush_shift (state *s, int token)
-{
-  transitions *trans = s->transitions;
-  int i;
-
-  bitset_reset (look_ahead_set, token);
-  for (i = 0; i < trans->num; i++)
-    if (!TRANSITION_IS_DISABLED (trans, i)
-	&& TRANSITION_SYMBOL (trans, i) == token)
-      TRANSITION_DISABLE (trans, i);
-}
-
-
-/*--------------------------------------------------------------------.
-| Turn off the reduce recorded for the specified token for the        |
-| specified look-ahead.  Used when we resolve a shift-reduce conflict |
-| in favor of the shift.                                              |
-`--------------------------------------------------------------------*/
-
-static void
-flush_reduce (bitset look_ahead_tokens, int token)
-{
-  bitset_reset (look_ahead_tokens, token);
-}
-
-
-/*------------------------------------------------------------------.
-| Attempt to resolve shift-reduce conflict for one rule by means of |
-| precedence declarations.  It has already been checked that the    |
-| rule has a precedence.  A conflict is resolved by modifying the   |
-| shift or reduce tables so that there is no longer a conflict.     |
-|                                                                   |
-| RULENO is the number of the look-ahead bitset to consider.      |
-|                                                                   |
-| ERRORS can be used to store discovered explicit errors.           |
-`------------------------------------------------------------------*/
-
-static void
-resolve_sr_conflict (state *s, int ruleno, symbol **errors)
-{
-  symbol_number i;
-  reductions *reds = s->reductions;
-  /* Find the rule to reduce by to get precedence of reduction.  */
-  rule *redrule = reds->rules[ruleno];
-  int redprec = redrule->prec->prec;
-  bitset look_ahead_tokens = reds->look_ahead_tokens[ruleno];
-  int nerrs = 0;
-
-  for (i = 0; i < ntokens; i++)
-    if (bitset_test (look_ahead_tokens, i)
-	&& bitset_test (look_ahead_set, i)
-	&& symbols[i]->prec)
-      {
-	/* Shift-reduce conflict occurs for token number i
-	   and it has a precedence.
-	   The precedence of shifting is that of token i.  */
-	if (symbols[i]->prec < redprec)
-	  {
-	    log_resolution (redrule, i, reduce_resolution);
-	    flush_shift (s, i);
-	  }
-	else if (symbols[i]->prec > redprec)
-	  {
-	    log_resolution (redrule, i, shift_resolution);
-	    flush_reduce (look_ahead_tokens, i);
-	  }
-	else
-	  /* Matching precedence levels.
-	     For left association, keep only the reduction.
-	     For right association, keep only the shift.
-	     For nonassociation, keep neither.  */
-
-	  switch (symbols[i]->assoc)
-	    {
-	    default:
-	      abort ();
-
-	    case right_assoc:
-	      log_resolution (redrule, i, right_resolution);
-	      flush_reduce (look_ahead_tokens, i);
-	      break;
-
-	    case left_assoc:
-	      log_resolution (redrule, i, left_resolution);
-	      flush_shift (s, i);
-	      break;
-
-	    case non_assoc:
-	      log_resolution (redrule, i, nonassoc_resolution);
-	      flush_shift (s, i);
-	      flush_reduce (look_ahead_tokens, i);
-	      /* Record an explicit error for this token.  */
-	      errors[nerrs++] = symbols[i];
-	      break;
-	    }
-      }
-
-  if (nerrs)
-    {
-      /* Some tokens have been explicitly made errors.  Allocate a
-	 permanent errs structure for this state, to record them.  */
-      state_errs_set (s, nerrs, errors);
-    }
-
-  if (obstack_object_size (&solved_conflicts_obstack))
-    {
-      obstack_1grow (&solved_conflicts_obstack, '\0');
-      s->solved_conflicts = obstack_finish (&solved_conflicts_obstack);
-    }
-}
-
-
-/*-------------------------------------------------------------------.
-| Solve the S/R conflicts of state S using the                       |
-| precedence/associativity, and flag it inconsistent if it still has |
-| conflicts.  ERRORS can be used as storage to compute the list of   |
-| look-ahead tokens on which S raises a syntax error (%nonassoc).    |
-`-------------------------------------------------------------------*/
-
-static void
-set_conflicts (state *s, symbol **errors)
-{
-  int i;
-  transitions *trans = s->transitions;
-  reductions *reds = s->reductions;
-
-  if (s->consistent)
-    return;
-
-  bitset_zero (look_ahead_set);
-
-  FOR_EACH_SHIFT (trans, i)
-    bitset_set (look_ahead_set, TRANSITION_SYMBOL (trans, i));
-
-  /* Loop over all rules which require look-ahead in this state.  First
-     check for shift-reduce conflict, and try to resolve using
-     precedence.  */
-  for (i = 0; i < reds->num; ++i)
-    if (reds->rules[i]->prec && reds->rules[i]->prec->prec
-	&& !bitset_disjoint_p (reds->look_ahead_tokens[i], look_ahead_set))
-      resolve_sr_conflict (s, i, errors);
-
-  /* Loop over all rules which require look-ahead in this state.  Check
-     for conflicts not resolved above.  */
-  for (i = 0; i < reds->num; ++i)
-    {
-      if (!bitset_disjoint_p (reds->look_ahead_tokens[i], look_ahead_set))
-	conflicts[s->number] = 1;
-
-      bitset_or (look_ahead_set, look_ahead_set, reds->look_ahead_tokens[i]);
-    }
-}
-
-
-/*----------------------------------------------------------------.
-| Solve all the S/R conflicts using the precedence/associativity, |
-| and flag as inconsistent the states that still have conflicts.  |
-`----------------------------------------------------------------*/
-
-void
-conflicts_solve (void)
-{
-  state_number i;
-  /* List of look-ahead tokens on which we explicitly raise a syntax error.  */
-  symbol **errors = xnmalloc (ntokens + 1, sizeof *errors);
-
-  conflicts = xcalloc (nstates, sizeof *conflicts);
-  shift_set = bitset_create (ntokens, BITSET_FIXED);
-  look_ahead_set = bitset_create (ntokens, BITSET_FIXED);
-  obstack_init (&solved_conflicts_obstack);
-
-  for (i = 0; i < nstates; i++)
-    {
-      set_conflicts (states[i], errors);
-
-      /* For uniformity of the code, make sure all the states have a valid
-	 `errs' member.  */
-      if (!states[i]->errs)
-	states[i]->errs = errs_new (0, 0);
-    }
-
-  free (errors);
-}
-
-
-/*---------------------------------------------.
-| Count the number of shift/reduce conflicts.  |
-`---------------------------------------------*/
-
-static int
-count_sr_conflicts (state *s)
-{
-  int i;
-  int src_count = 0;
-  transitions *trans = s->transitions;
-  reductions *reds = s->reductions;
-
-  if (!trans)
-    return 0;
-
-  bitset_zero (look_ahead_set);
-  bitset_zero (shift_set);
-
-  FOR_EACH_SHIFT (trans, i)
-    bitset_set (shift_set, TRANSITION_SYMBOL (trans, i));
-
-  for (i = 0; i < reds->num; ++i)
-    bitset_or (look_ahead_set, look_ahead_set, reds->look_ahead_tokens[i]);
-
-  bitset_and (look_ahead_set, look_ahead_set, shift_set);
-
-  src_count = bitset_count (look_ahead_set);
-
-  return src_count;
-}
-
-
-/*----------------------------------------------------------------.
-| Count the number of reduce/reduce conflicts.  If ONE_PER_TOKEN, |
-| count one conflict for each token that has any reduce/reduce    |
-| conflicts.  Otherwise, count one conflict for each pair of      |
-| conflicting reductions.                                         |
-+`----------------------------------------------------------------*/
-
-static int
-count_rr_conflicts (state *s, bool one_per_token)
-{
-  int i;
-  reductions *reds = s->reductions;
-  int rrc_count = 0;
-
-  for (i = 0; i < ntokens; i++)
-    {
-      int count = 0;
-      int j;
-      for (j = 0; j < reds->num; ++j)
-	if (bitset_test (reds->look_ahead_tokens[j], i))
-	  count++;
-
-      if (count >= 2)
-	rrc_count += one_per_token ? 1 : count-1;
-    }
-
-  return rrc_count;
-}
-
-
-/*--------------------------------------------------------.
-| Report the number of conflicts, using the Yacc format.  |
-`--------------------------------------------------------*/
-
-static void
-conflict_report (FILE *out, int src_num, int rrc_num)
-{
-  if (src_num && rrc_num)
-    fprintf (out, _("conflicts: %d shift/reduce, %d reduce/reduce\n"),
-	     src_num, rrc_num);
-  else if (src_num)
-    fprintf (out, _("conflicts: %d shift/reduce\n"), src_num);
-  else if (rrc_num)
-    fprintf (out, _("conflicts: %d reduce/reduce\n"), rrc_num);
-}
-
-
-/*-----------------------------------------------------------.
-| Output the detailed description of states with conflicts.  |
-`-----------------------------------------------------------*/
-
-void
-conflicts_output (FILE *out)
-{
-  bool printed_sth = false;
-  state_number i;
-  for (i = 0; i < nstates; i++)
-    {
-      state *s = states[i];
-      if (conflicts[i])
-	{
-	  fprintf (out, _("State %d "), i);
-	  conflict_report (out, count_sr_conflicts (s),
-			   count_rr_conflicts (s, true));
-	  printed_sth = true;
-	}
-    }
-  if (printed_sth)
-    fputs ("\n\n", out);
-}
-
-/*--------------------------------------------------------.
-| Total the number of S/R and R/R conflicts.  Unlike the  |
-| code in conflicts_output, however, count EACH pair of   |
-| reductions for the same state and look-ahead as one     |
-| conflict.						  |
-`--------------------------------------------------------*/
-
-int
-conflicts_total_count (void)
-{
-  state_number i;
-  int count;
-
-  /* Conflicts by state.  */
-  count = 0;
-  for (i = 0; i < nstates; i++)
-    if (conflicts[i])
-      {
-	count += count_sr_conflicts (states[i]);
-	count += count_rr_conflicts (states[i], false);
-      }
-  return count;
-}
-
-
-/*------------------------------------------.
-| Reporting the total number of conflicts.  |
-`------------------------------------------*/
-
-void
-conflicts_print (void)
-{
-  /* Is the number of SR conflicts OK?  Either EXPECTED_CONFLICTS is
-     not set, and then we want 0 SR, or else it is specified, in which
-     case we want equality.  */
-  bool src_ok;
-  bool rrc_ok;
-
-  int src_total = 0;
-  int rrc_total = 0;
-  int src_expected;
-  int rrc_expected;
-
-  /* Conflicts by state.  */
-  {
-    state_number i;
-
-    for (i = 0; i < nstates; i++)
-      if (conflicts[i])
-	{
-	  src_total += count_sr_conflicts (states[i]);
-	  rrc_total += count_rr_conflicts (states[i], true);
-	}
-  }
-
-  if (! glr_parser && rrc_total > 0 && expected_rr_conflicts != -1)
-    {
-      warn (_("%%expect-rr applies only to GLR parsers"));
-      expected_rr_conflicts = -1;
-    }
-
-  src_expected = expected_sr_conflicts == -1 ? 0 : expected_sr_conflicts;
-  rrc_expected = expected_rr_conflicts == -1 ? 0 : expected_rr_conflicts;
-  src_ok = src_total == src_expected;
-  rrc_ok = rrc_total == rrc_expected;
-
-  /* If there are as many RR conflicts and SR conflicts as
-     expected, then there is nothing to report.  */
-  if (rrc_ok & src_ok)
-    return;
-
-  /* Report the total number of conflicts on STDERR.  */
-  if (src_total | rrc_total)
-    {
-      if (! yacc_flag)
-	fprintf (stderr, "%s: ", current_file);
-      conflict_report (stderr, src_total, rrc_total);
-    }
-
-  if (expected_sr_conflicts != -1 || expected_rr_conflicts != -1)
-    {
-      if (! src_ok)
-	complain (ngettext ("expected %d shift/reduce conflict",
-			    "expected %d shift/reduce conflicts",
-			    src_expected),
-		  src_expected);
-      if (! rrc_ok)
-	complain (ngettext ("expected %d reduce/reduce conflict",
-			    "expected %d reduce/reduce conflicts",
-			    rrc_expected),
-		  rrc_expected);
-    }
-}
-
-
-void
-conflicts_free (void)
-{
-  free (conflicts);
-  bitset_free (shift_set);
-  bitset_free (look_ahead_set);
-  obstack_free (&solved_conflicts_obstack, NULL);
-}
diff --git a/src/conflicts.h b/src/conflicts.h
deleted file mode 100644
index 4389e5e..0000000
--- a/src/conflicts.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Find and resolve or report look-ahead conflicts for bison,
-   Copyright (C) 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
-
-#ifndef CONFLICTS_H_
-# define CONFLICTS_H_
-# include "state.h"
-
-void conflicts_solve (void);
-void conflicts_print (void);
-int conflicts_total_count (void);
-void conflicts_output (FILE *out);
-void conflicts_free (void);
-
-/* Were there conflicts? */
-extern int expected_sr_conflicts;
-extern int expected_rr_conflicts;
-#endif /* !CONFLICTS_H_ */
diff --git a/src/derives.c b/src/derives.c
deleted file mode 100644
index 2e4ff31..0000000
--- a/src/derives.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/* Match rules with nonterminals for bison,
-
-   Copyright (C) 1984, 1989, 2000, 2001, 2002, 2003, 2005 Free
-   Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include "getargs.h"
-
-#include "derives.h"
-#include "gram.h"
-#include "reader.h"
-#include "symtab.h"
-
-/* Linked list of rule numbers.  */
-typedef struct rule_list
-{
-  struct rule_list *next;
-  rule *value;
-} rule_list;
-
-rule ***derives;
-
-static void
-print_derives (void)
-{
-  int i;
-
-  fputs ("DERIVES\n", stderr);
-
-  for (i = ntokens; i < nsyms; i++)
-    {
-      rule **rp;
-      fprintf (stderr, "\t%s derives\n", symbols[i]->tag);
-      for (rp = derives[i - ntokens]; *rp; ++rp)
-	{
-	  fprintf (stderr, "\t\t%3d ", (*rp)->user_number);
-	  rule_rhs_print (*rp, stderr);
-	}
-    }
-
-  fputs ("\n\n", stderr);
-}
-
-
-void
-derives_compute (void)
-{
-  symbol_number i;
-  rule_number r;
-  rule **q;
-
-  /* DSET[NTERM - NTOKENS] -- A linked list of the numbers of the rules
-     whose LHS is NTERM.  */
-  rule_list **dset = xcalloc (nvars, sizeof *dset);
-
-  /* DELTS[RULE] -- There are NRULES rule number to attach to nterms.
-     Instead of performing NRULES allocations for each, have an array
-     indexed by rule numbers.  */
-  rule_list *delts = xnmalloc (nrules, sizeof *delts);
-
-  for (r = nrules - 1; r >= 0; --r)
-    {
-      symbol_number lhs = rules[r].lhs->number;
-      rule_list *p = &delts[r];
-      /* A new LHS is found.  */
-      p->next = dset[lhs - ntokens];
-      p->value = &rules[r];
-      dset[lhs - ntokens] = p;
-    }
-
-  /* DSET contains what we need under the form of a linked list.  Make
-     it a single array.  */
-
-  derives = xnmalloc (nvars, sizeof *derives);
-  q = xnmalloc (nvars + nrules, sizeof *q);
-
-  for (i = ntokens; i < nsyms; i++)
-    {
-      rule_list *p = dset[i - ntokens];
-      derives[i - ntokens] = q;
-      while (p)
-	{
-	  *q++ = p->value;
-	  p = p->next;
-	}
-      *q++ = NULL;
-    }
-
-  if (trace_flag & trace_sets)
-    print_derives ();
-
-  free (dset);
-  free (delts);
-}
-
-
-void
-derives_free (void)
-{
-  free (derives[0]);
-  free (derives);
-}
diff --git a/src/derives.h b/src/derives.h
deleted file mode 100644
index 9a45dc9..0000000
--- a/src/derives.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Match rules with nonterminals for bison,
-
-   Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software
-   Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef DERIVES_H_
-# define DERIVES_H_
-
-# include "gram.h"
-
-/* DERIVES[SYMBOL - NTOKENS] points to a vector of the rules that
-   SYMBOL derives, terminated with NULL.  */
-extern rule ***derives;
-
-/* Compute DERIVES.  */
-
-void derives_compute (void);
-void derives_free (void);
-
-#endif /* !DERIVES_H_ */
diff --git a/src/files.c b/src/files.c
deleted file mode 100644
index f3bb0f9..0000000
--- a/src/files.c
+++ /dev/null
@@ -1,340 +0,0 @@
-/* Open and close files for Bison.
-
-   Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004, 2005
-   Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <error.h>
-#include <get-errno.h>
-#include <quote.h>
-#include <xstrndup.h>
-
-#include "complain.h"
-#include "dirname.h"
-#include "files.h"
-#include "getargs.h"
-#include "gram.h"
-#include "stdio-safer.h"
-
-struct obstack pre_prologue_obstack;
-struct obstack post_prologue_obstack;
-
-/* Initializing some values below (such SPEC_NAME_PREFIX to `yy') is
-   tempting, but don't do that: for the time being our handling of the
-   %directive vs --option leaves precedence to the options by deciding
-   that if a %directive sets a variable which is really set (i.e., not
-   NULL), then the %directive is ignored.  As a result, %name-prefix,
-   for instance, will not be honored.  */
-
-char const *spec_outfile = NULL;       /* for -o. */
-char const *spec_file_prefix = NULL;   /* for -b. */
-char const *spec_name_prefix = NULL;   /* for -p. */
-char const *spec_verbose_file = NULL;  /* for --verbose. */
-char const *spec_graph_file = NULL;    /* for -g. */
-char const *spec_defines_file = NULL;  /* for --defines. */
-char const *parser_file_name;
-
-uniqstr grammar_file = NULL;
-uniqstr current_file = NULL;
-
-/* If --output=dir/foo.c was specified,
-   DIR_PREFIX is `dir/' and ALL_BUT_EXT and ALL_BUT_TAB_EXT are `dir/foo'.
-
-   If --output=dir/foo.tab.c was specified, DIR_PREFIX is `dir/',
-   ALL_BUT_EXT is `dir/foo.tab', and ALL_BUT_TAB_EXT is `dir/foo'.
-
-   If --output was not specified but --file-prefix=dir/foo was specified,
-   ALL_BUT_EXT = `foo.tab' and ALL_BUT_TAB_EXT = `foo'.
-
-   If neither --output nor --file was specified but the input grammar
-   is name dir/foo.y, ALL_BUT_EXT and ALL_BUT_TAB_EXT are `foo'.
-
-   If neither --output nor --file was specified, DIR_PREFIX is the
-   empty string (meaning the current directory); otherwise it is
-   `dir/'.  */
-
-static char const *all_but_ext;
-static char const *all_but_tab_ext;
-char const *dir_prefix;
-
-/* C source file extension (the parser source).  */
-static char const *src_extension = NULL;
-/* Header file extension (if option ``-d'' is specified).  */
-static char const *header_extension = NULL;
-
-/*-----------------------------------------------------------------.
-| Return a newly allocated string composed of the concatenation of |
-| STR1, and STR2.                                                  |
-`-----------------------------------------------------------------*/
-
-static char *
-concat2 (char const *str1, char const *str2)
-{
-  size_t len = strlen (str1) + strlen (str2);
-  char *res = xmalloc (len + 1);
-  char *cp;
-  cp = stpcpy (res, str1);
-  cp = stpcpy (cp, str2);
-  return res;
-}
-
-/*-----------------------------------------------------------------.
-| Try to open file NAME with mode MODE, and print an error message |
-| if fails.                                                        |
-`-----------------------------------------------------------------*/
-
-FILE *
-xfopen (const char *name, const char *mode)
-{
-  FILE *ptr;
-
-  ptr = fopen_safer (name, mode);
-  if (!ptr)
-    error (EXIT_FAILURE, get_errno (), _("cannot open file `%s'"), name);
-
-  return ptr;
-}
-
-/*-------------------------------------------------------------.
-| Try to close file PTR, and print an error message if fails.  |
-`-------------------------------------------------------------*/
-
-void
-xfclose (FILE *ptr)
-{
-  if (ptr == NULL)
-    return;
-
-  if (ferror (ptr))
-    error (EXIT_FAILURE, 0, _("I/O error"));
-
-  if (fclose (ptr) != 0)
-    error (EXIT_FAILURE, get_errno (), _("cannot close file"));
-}
-
-
-/*------------------------------------------------------------------.
-| Compute ALL_BUT_EXT, ALL_BUT_TAB_EXT and output files extensions. |
-`------------------------------------------------------------------*/
-
-/* Replace all characters FROM by TO in the string IN.
-   and returns a new allocated string.  */
-static char *
-tr (const char *in, char from, char to)
-{
-  char *temp;
-  char *out = xmalloc (strlen (in) + 1);
-
-  for (temp = out; *in; in++, out++)
-    if (*in == from)
-      *out = to;
-    else
-      *out = *in;
-  *out = 0;
-  return (temp);
-}
-
-/* Compute extensions from the grammar file extension.  */
-static void
-compute_exts_from_gf (const char *ext)
-{
-  src_extension = tr (ext, 'y', 'c');
-  src_extension = tr (src_extension, 'Y', 'C');
-  header_extension = tr (ext, 'y', 'h');
-  header_extension = tr (header_extension, 'Y', 'H');
-}
-
-/* Compute extensions from the given c source file extension.  */
-static void
-compute_exts_from_src (const char *ext)
-{
-  /* We use this function when the user specifies `-o' or `--output',
-     so the extenions must be computed unconditionally from the file name
-     given by this option.  */
-  src_extension = xstrdup (ext);
-  header_extension = tr (ext, 'c', 'h');
-  header_extension = tr (header_extension, 'C', 'H');
-}
-
-
-/* Decompose FILE_NAME in four parts: *BASE, *TAB, and *EXT, the fourth
-   part, (the directory) is ranging from FILE_NAME to the char before
-   *BASE, so we don't need an additional parameter.
-
-   *EXT points to the last period in the basename, or NULL if none.
-
-   If there is no *EXT, *TAB is NULL.  Otherwise, *TAB points to
-   `.tab' or `_tab' if present right before *EXT, or is NULL. *TAB
-   cannot be equal to *BASE.
-
-   None are allocated, they are simply pointers to parts of FILE_NAME.
-   Examples:
-
-   '/tmp/foo.tab.c' -> *BASE = 'foo.tab.c', *TAB = '.tab.c', *EXT =
-   '.c'
-
-   'foo.c' -> *BASE = 'foo.c', *TAB = NULL, *EXT = '.c'
-
-   'tab.c' -> *BASE = 'tab.c', *TAB = NULL, *EXT = '.c'
-
-   '.tab.c' -> *BASE = '.tab.c', *TAB = NULL, *EXT = '.c'
-
-   'foo.tab' -> *BASE = 'foo.tab', *TAB = NULL, *EXT = '.tab'
-
-   'foo_tab' -> *BASE = 'foo_tab', *TAB = NULL, *EXT = NULL
-
-   'foo' -> *BASE = 'foo', *TAB = NULL, *EXT = NULL.  */
-
-static void
-file_name_split (const char *file_name,
-		 const char **base, const char **tab, const char **ext)
-{
-  *base = base_name (file_name);
-
-  /* Look for the extension, i.e., look for the last dot. */
-  *ext = strrchr (*base, '.');
-  *tab = NULL;
-
-  /* If there is an extension, check if there is a `.tab' part right
-     before.  */
-  if (*ext)
-    {
-      size_t baselen = *ext - *base;
-      size_t dottablen = 4;
-      if (dottablen < baselen
-	  && (strncmp (*ext - dottablen, ".tab", dottablen) == 0
-	      || strncmp (*ext - dottablen, "_tab", dottablen) == 0))
-	*tab = *ext - dottablen;
-    }
-}
-
-
-static void
-compute_file_name_parts (void)
-{
-  const char *base, *tab, *ext;
-
-  /* Compute ALL_BUT_EXT and ALL_BUT_TAB_EXT from SPEC_OUTFILE
-     or GRAMMAR_FILE.
-
-     The precise -o name will be used for FTABLE.  For other output
-     files, remove the ".c" or ".tab.c" suffix.  */
-  if (spec_outfile)
-    {
-      file_name_split (spec_outfile, &base, &tab, &ext);
-      dir_prefix = xstrndup (spec_outfile, base - spec_outfile);
-
-      /* ALL_BUT_EXT goes up the EXT, excluding it. */
-      all_but_ext =
-	xstrndup (spec_outfile,
-		  (strlen (spec_outfile) - (ext ? strlen (ext) : 0)));
-
-      /* ALL_BUT_TAB_EXT goes up to TAB, excluding it.  */
-      all_but_tab_ext =
-	xstrndup (spec_outfile,
-		  (strlen (spec_outfile)
-		   - (tab ? strlen (tab) : (ext ? strlen (ext) : 0))));
-
-      if (ext)
-	compute_exts_from_src (ext);
-    }
-  else
-    {
-      file_name_split (grammar_file, &base, &tab, &ext);
-
-      if (spec_file_prefix)
-	{
-	  /* If --file-prefix=foo was specified, ALL_BUT_TAB_EXT = `foo'.  */
-	  dir_prefix = xstrndup (grammar_file, base - grammar_file);
-	  all_but_tab_ext = xstrdup (spec_file_prefix);
-	}
-      else if (yacc_flag)
-	{
-	  /* If --yacc, then the output is `y.tab.c'.  */
-	  dir_prefix = "";
-	  all_but_tab_ext = "y";
-	}
-      else
-	{
-	  /* Otherwise, ALL_BUT_TAB_EXT is computed from the input
-	     grammar: `foo/bar.yy' => `bar'.  */
-	  dir_prefix = "";
-	  all_but_tab_ext =
-	    xstrndup (base, (strlen (base) - (ext ? strlen (ext) : 0)));
-	}
-
-      all_but_ext = concat2 (all_but_tab_ext, TAB_EXT);
-
-      /* Compute the extensions from the grammar file name.  */
-      if (ext && !yacc_flag)
-	compute_exts_from_gf (ext);
-    }
-}
-
-
-/* Compute the output file names.  Warn if we detect conflicting
-   outputs to the same file.  */
-
-void
-compute_output_file_names (void)
-{
-  char const *name[4];
-  int i;
-  int j;
-  int names = 0;
-
-  compute_file_name_parts ();
-
-  /* If not yet done. */
-  if (!src_extension)
-    src_extension = ".c";
-  if (!header_extension)
-    header_extension = ".h";
-
-  name[names++] = parser_file_name =
-    spec_outfile ? spec_outfile : concat2 (all_but_ext, src_extension);
-
-  if (defines_flag)
-    {
-      if (! spec_defines_file)
-	spec_defines_file = concat2 (all_but_ext, header_extension);
-      name[names++] = spec_defines_file;
-    }
-
-  if (graph_flag)
-    {
-      if (! spec_graph_file)
-	spec_graph_file = concat2 (all_but_tab_ext, ".vcg");
-      name[names++] = spec_graph_file;
-    }
-
-  if (report_flag)
-    {
-      spec_verbose_file = concat2 (all_but_tab_ext, OUTPUT_EXT);
-      name[names++] = spec_verbose_file;
-    }
-
-  for (j = 0; j < names; j++)
-    for (i = 0; i < j; i++)
-      if (strcmp (name[i], name[j]) == 0)
-	warn (_("conflicting outputs to file %s"), quote (name[i]));
-}
diff --git a/src/files.h b/src/files.h
deleted file mode 100644
index ba9fec2..0000000
--- a/src/files.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* File names and variables for bison,
-   Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef FILES_H_
-# define FILES_H_
-
-# include "uniqstr.h"
-
-/* File name specified with -o for the output file, or 0 if no -o.  */
-extern char const *spec_outfile;
-
-/* File name for the parser (i.e., the one above, or its default.) */
-extern char const *parser_file_name;
-
-/* Symbol prefix specified with -p, or 0 if no -p.  */
-extern const char *spec_name_prefix;
-
-/* File name prefix specified with -b, or 0 if no -b.  */
-extern char const *spec_file_prefix;
-
-/* --verbose. */
-extern char const *spec_verbose_file;
-
-/* File name specified for the output VCG graph.  */
-extern char const *spec_graph_file;
-
-/* File name specified with --defines.  */
-extern char const *spec_defines_file;
-
-/* Directory prefix of output file names.  */
-extern char const *dir_prefix;
-
-
-/* If semantic parser, output a .h file that defines YYSTYPE... */
-extern struct obstack pre_prologue_obstack;
-extern struct obstack post_prologue_obstack;
-
-/* The file name as given on the command line.
-   Not named "input_file" because Flex uses this name for an argument,
-   and therefore GCC warns about a name clash. */
-extern uniqstr grammar_file;
-
-/* The current file name.  Might change with %include, or with #line.  */
-extern uniqstr current_file;
-
-void compute_output_file_names (void);
-
-FILE *xfopen (const char *name, const char *mode);
-void xfclose (FILE *ptr);
-
-#endif /* !FILES_H_ */
diff --git a/src/getargs.c b/src/getargs.c
deleted file mode 100644
index 13b0d32..0000000
--- a/src/getargs.c
+++ /dev/null
@@ -1,460 +0,0 @@
-/* Parse command line arguments for Bison.
-
-   Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004,
-   2005, 2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <argmatch.h>
-#include <error.h>
-
-/* Hack to get <getopt.h> to declare getopt with a prototype.  */
-#if lint && ! defined __GNU_LIBRARY__
-# define __GNU_LIBRARY__
-# define HACK_FOR___GNU_LIBRARY___PROTOTYPE 1
-#endif
-
-#include <getopt.h>
-
-#ifdef HACK_FOR___GNU_LIBRARY___PROTOTYPE
-# undef __GNU_LIBRARY__
-# undef HACK_FOR___GNU_LIBRARY___PROTOTYPE
-#endif
-
-#include "complain.h"
-#include "files.h"
-#include "getargs.h"
-#include "uniqstr.h"
-
-bool debug_flag;
-bool defines_flag;
-bool graph_flag;
-bool locations_flag;
-bool no_lines_flag;
-bool no_parser_flag;
-bool token_table_flag;
-bool yacc_flag;	/* for -y */
-
-bool error_verbose = false;
-
-bool nondeterministic_parser = false;
-bool glr_parser = false;
-bool pure_parser = false;
-
-int report_flag = report_none;
-int trace_flag = trace_none;
-
-const char *skeleton = NULL;
-const char *include = NULL;
-
-extern char *program_name;
-
-
-/*---------------------.
-| --trace's handling.  |
-`---------------------*/
-
-static const char * const trace_args[] =
-{
-  /* In a series of synonyms, present the most meaningful first, so
-     that argmatch_valid be more readable.  */
-  "none       - no report",
-  "scan       - grammar scanner traces",
-  "parse      - grammar parser traces",
-  "automaton  - contruction of the automaton",
-  "bitsets    - use of bitsets",
-  "grammar    - reading, reducing of the grammar",
-  "resource   - memory consumption (where available)",
-  "sets       - grammar sets: firsts, nullable etc.",
-  "tools      - m4 invocation",
-  "m4         - m4 traces",
-  "skeleton   - skeleton postprocessing",
-  "time       - time consumption",
-  "all        - all of the above",
-  0
-};
-
-static const int trace_types[] =
-{
-  trace_none,
-  trace_scan,
-  trace_parse,
-  trace_automaton,
-  trace_bitsets,
-  trace_grammar,
-  trace_resource,
-  trace_sets,
-  trace_tools,
-  trace_m4,
-  trace_skeleton,
-  trace_time,
-  trace_all
-};
-
-ARGMATCH_VERIFY (trace_args, trace_types);
-
-static void
-trace_argmatch (char *args)
-{
-  if (args)
-    {
-      args = strtok (args, ",");
-      do
-	{
-	  int trace = XARGMATCH ("--trace", args,
-				 trace_args, trace_types);
-	  if (trace == trace_none)
-	    trace_flag = trace_none;
-	  else
-	    trace_flag |= trace;
-	}
-      while ((args = strtok (NULL, ",")));
-    }
-  else
-    trace_flag = trace_all;
-}
-
-
-/*----------------------.
-| --report's handling.  |
-`----------------------*/
-
-static const char * const report_args[] =
-{
-  /* In a series of synonyms, present the most meaningful first, so
-     that argmatch_valid be more readable.  */
-  "none",
-  "state", "states",
-  "itemset", "itemsets",
-  "look-ahead", "lookahead", "lookaheads",
-  "solved",
-  "all",
-  0
-};
-
-static const int report_types[] =
-{
-  report_none,
-  report_states, report_states,
-  report_states | report_itemsets, report_states | report_itemsets,
-  report_states | report_look_ahead_tokens,
-  report_states | report_look_ahead_tokens,
-  report_states | report_look_ahead_tokens,
-  report_states | report_solved_conflicts,
-  report_all
-};
-
-ARGMATCH_VERIFY (report_args, report_types);
-
-static void
-report_argmatch (char *args)
-{
-  args = strtok (args, ",");
-  do
-    {
-      int report = XARGMATCH ("--report", args,
-			      report_args, report_types);
-      if (report == report_none)
-	report_flag = report_none;
-      else
-	report_flag |= report;
-    }
-  while ((args = strtok (NULL, ",")));
-}
-
-
-/*-------------------------------------------.
-| Display the help message and exit STATUS.  |
-`-------------------------------------------*/
-
-static void usage (int) ATTRIBUTE_NORETURN;
-
-static void
-usage (int status)
-{
-  if (status != 0)
-    fprintf (stderr, _("Try `%s --help' for more information.\n"),
-	     program_name);
-  else
-    {
-      /* Some efforts were made to ease the translators' task, please
-	 continue.  */
-      fputs (_("\
-GNU bison generates parsers for LALR(1) grammars.\n"), stdout);
-      putc ('\n', stdout);
-
-      fprintf (stdout, _("\
-Usage: %s [OPTION]... FILE\n"), program_name);
-      putc ('\n', stdout);
-
-      fputs (_("\
-If a long option shows an argument as mandatory, then it is mandatory\n\
-for the equivalent short option also.  Similarly for optional arguments.\n"),
-	     stdout);
-      putc ('\n', stdout);
-
-      fputs (_("\
-Operation modes:\n\
-  -h, --help                 display this help and exit\n\
-  -V, --version              output version information and exit\n\
-      --print-localedir      output directory containing locale-dependent data\n\
-  -y, --yacc                 emulate POSIX yacc\n"), stdout);
-      putc ('\n', stdout);
-
-      fputs (_("\
-Parser:\n\
-  -S, --skeleton=FILE        specify the skeleton to use\n\
-  -t, --debug                instrument the parser for debugging\n\
-      --locations            enable locations computation\n\
-  -p, --name-prefix=PREFIX   prepend PREFIX to the external symbols\n\
-  -l, --no-lines             don't generate `#line' directives\n\
-  -n, --no-parser            generate the tables only\n\
-  -k, --token-table          include a table of token names\n\
-"), stdout);
-      putc ('\n', stdout);
-
-      fputs (_("\
-Output:\n\
-  -d, --defines              also produce a header file\n\
-  -r, --report=THINGS        also produce details on the automaton\n\
-  -v, --verbose              same as `--report=state'\n\
-  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n\
-  -o, --output=FILE          leave output to FILE\n\
-  -g, --graph                also produce a VCG description of the automaton\n\
-"), stdout);
-      putc ('\n', stdout);
-
-      fputs (_("\
-THINGS is a list of comma separated words that can include:\n\
-  `state'        describe the states\n\
-  `itemset'      complete the core item sets with their closure\n\
-  `look-ahead'   explicitly associate look-ahead tokens to items\n\
-  `solved'       describe shift/reduce conflicts solving\n\
-  `all'          include all the above information\n\
-  `none'         disable the report\n\
-"), stdout);
-      putc ('\n', stdout);
-
-      fputs (_("\
-Report bugs to <bug-bison@gnu.org>.\n"), stdout);
-    }
-
-  exit (status);
-}
-
-
-/*------------------------------.
-| Display the version message.  |
-`------------------------------*/
-
-static void
-version (void)
-{
-  /* Some efforts were made to ease the translators' task, please
-     continue.  */
-  printf (_("bison (GNU Bison) %s"), VERSION);
-  putc ('\n', stdout);
-  fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
-  putc ('\n', stdout);
-
-  fprintf (stdout,
-	   _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2006);
-
-  fputs (_("\
-This is free software; see the source for copying conditions.  There is NO\n\
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"),
-	 stdout);
-}
-
-
-/*----------------------.
-| Process the options.  |
-`----------------------*/
-
-/* Shorts options.  */
-static char const short_options[] = "yvegdhr:ltknVo:b:p:S:T::";
-
-/* Values for long options that do not have single-letter equivalents.  */
-enum
-{
-  LOCATIONS_OPTION = CHAR_MAX + 1,
-  PRINT_LOCALEDIR_OPTION
-};
-
-static struct option const long_options[] =
-{
-  /* Operation modes. */
-  { "help",            no_argument,	0,   'h' },
-  { "version",         no_argument,	0,   'V' },
-  { "print-localedir", no_argument,	0,   PRINT_LOCALEDIR_OPTION },
-
-  /* Parser. */
-  { "name-prefix",   required_argument,	  0,   'p' },
-  { "include",       required_argument,   0,   'I' },
-
-  /* Output. */
-  { "file-prefix", required_argument,	0,   'b' },
-  { "output",	   required_argument,	0,   'o' },
-  { "output-file", required_argument,	0,   'o' },
-  { "graph",	   optional_argument,	0,   'g' },
-  { "report",	   required_argument,   0,   'r' },
-  { "verbose",	   no_argument,	        0,   'v' },
-
-  /* Hidden. */
-  { "trace",         optional_argument,   0,     'T' },
-
-  /* Output.  */
-  { "defines",     optional_argument,   0,   'd' },
-
-  /* Operation modes.  */
-  { "fixed-output-files", no_argument,  0,   'y' },
-  { "yacc",	          no_argument,  0,   'y' },
-
-  /* Parser.  */
-  { "debug",	      no_argument,               0,   't' },
-  { "locations",      no_argument,		 0, LOCATIONS_OPTION },
-  { "no-lines",       no_argument,               0,   'l' },
-  { "no-parser",      no_argument,               0,   'n' },
-  { "raw",            no_argument,               0,     0 },
-  { "skeleton",       required_argument,         0,   'S' },
-  { "token-table",    no_argument,               0,   'k' },
-
-  {0, 0, 0, 0}
-};
-
-/* Under DOS, there is no difference on the case.  This can be
-   troublesome when looking for `.tab' etc.  */
-#ifdef MSDOS
-# define AS_FILE_NAME(File) (strlwr (File), (File))
-#else
-# define AS_FILE_NAME(File) (File)
-#endif
-
-void
-getargs (int argc, char *argv[])
-{
-  int c;
-
-  while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
-	 != -1)
-    switch (c)
-      {
-      case 0:
-	/* Certain long options cause getopt_long to return 0.  */
-	break;
-
-      case 'y':
-	yacc_flag = true;
-	break;
-
-      case 'h':
-	usage (EXIT_SUCCESS);
-
-      case 'V':
-	version ();
-	exit (EXIT_SUCCESS);
-
-      case PRINT_LOCALEDIR_OPTION:
-	printf ("%s\n", LOCALEDIR);
-	exit (EXIT_SUCCESS);
-
-      case 'g':
-	/* Here, the -g and --graph=FILE options are differentiated.  */
-	graph_flag = true;
-	if (optarg)
-	  spec_graph_file = AS_FILE_NAME (optarg);
-	break;
-
-      case 'v':
-	report_flag |= report_states;
-	break;
-
-      case 'S':
-	skeleton = AS_FILE_NAME (optarg);
-	break;
-
-      case 'I':
-	include = AS_FILE_NAME (optarg);
-	break;
-
-      case 'd':
-	/* Here, the -d and --defines options are differentiated.  */
-	defines_flag = true;
-	if (optarg)
-	  spec_defines_file = AS_FILE_NAME (optarg);
-	break;
-
-      case 'l':
-	no_lines_flag = true;
-	break;
-
-      case LOCATIONS_OPTION:
-	locations_flag = true;
-	break;
-
-      case 'k':
-	token_table_flag = true;
-	break;
-
-      case 'n':
-	no_parser_flag = true;
-	break;
-
-      case 't':
-	debug_flag = true;
-	break;
-
-      case 'o':
-	spec_outfile = AS_FILE_NAME (optarg);
-	break;
-
-      case 'b':
-	spec_file_prefix = AS_FILE_NAME (optarg);
-	break;
-
-      case 'p':
-	spec_name_prefix = optarg;
-	break;
-
-      case 'r':
-	report_argmatch (optarg);
-	break;
-
-      case 'T':
-	trace_argmatch (optarg);
-	break;
-
-      default:
-	usage (EXIT_FAILURE);
-      }
-
-  if (argc - optind != 1)
-    {
-      if (argc - optind < 1)
-	error (0, 0, _("missing operand after `%s'"), argv[argc - 1]);
-      else
-	error (0, 0, _("extra operand `%s'"), argv[optind + 1]);
-      usage (EXIT_FAILURE);
-    }
-
-  current_file = grammar_file = uniqstr_new (argv[optind]);
-}
diff --git a/src/getargs.h b/src/getargs.h
deleted file mode 100644
index 816eb95..0000000
--- a/src/getargs.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Parse command line arguments for bison.
-   Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-   Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
-
-#ifndef GETARGS_H_
-# define GETARGS_H_
-
-/* flags set by % directives */
-
-/* for -S */
-extern char const *skeleton;
-
-/* for -I */
-extern char const *include;
-
-extern bool debug_flag;			/* for -t */
-extern bool defines_flag;		/* for -d */
-extern bool graph_flag;			/* for -g */
-extern bool locations_flag;
-extern bool no_lines_flag;		/* for -l */
-extern bool no_parser_flag;		/* for -n */
-extern bool token_table_flag;		/* for -k */
-extern bool yacc_flag;			/* for -y */
-
-extern bool error_verbose;
-
-
-/* GLR_PARSER is true if the input file says to use the GLR
-   (Generalized LR) parser, and to output some additional information
-   used by the GLR algorithm.  */
-
-extern bool glr_parser;
-
-/* PURE_PARSER is true if should generate a parser that is all pure
-   and reentrant.  */
-
-extern bool pure_parser;
-
-/* NONDETERMINISTIC_PARSER is true iff conflicts are accepted.  This
-   is used by the GLR parser, and might be used in BackTracking
-   parsers too.  */
-
-extern bool nondeterministic_parser;
-
-/* --trace.  */
-enum trace
-  {
-    trace_none      = 0,
-    trace_scan      = 1 << 0,
-    trace_parse     = 1 << 1,
-    trace_resource  = 1 << 2,
-    trace_sets      = 1 << 3,
-    trace_bitsets   = 1 << 4,
-    trace_tools     = 1 << 5,
-    trace_automaton = 1 << 6,
-    trace_grammar   = 1 << 7,
-    trace_time      = 1 << 8,
-    trace_skeleton  = 1 << 9,
-    trace_m4        = 1 << 10,
-    trace_all       = ~0
-  };
-extern int trace_flag;
-
-/* --report.  */
-enum report
-  {
-    report_none             = 0,
-    report_states           = 1 << 0,
-    report_itemsets         = 1 << 1,
-    report_look_ahead_tokens= 1 << 2,
-    report_solved_conflicts = 1 << 3,
-    report_all              = ~0
-  };
-extern int report_flag;
-
-void getargs (int argc, char *argv[]);
-
-#endif /* !GETARGS_H_ */
diff --git a/src/gram.c b/src/gram.c
deleted file mode 100644
index 28666b0..0000000
--- a/src/gram.c
+++ /dev/null
@@ -1,335 +0,0 @@
-/* Allocate input grammar variables for Bison.
-
-   Copyright (C) 1984, 1986, 1989, 2001, 2002, 2003, 2005, 2006 Free
-   Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <quotearg.h>
-
-#include "gram.h"
-#include "reader.h"
-#include "reduce.h"
-#include "symtab.h"
-
-/* Comments for these variables are in gram.h.  */
-
-item_number *ritem = NULL;
-unsigned int nritems = 0;
-
-rule *rules = NULL;
-rule_number nrules = 0;
-
-symbol **symbols = NULL;
-int nsyms = 0;
-int ntokens = 1;
-int nvars = 0;
-
-symbol_number *token_translations = NULL;
-
-int max_user_token_number = 256;
-
-/*--------------------------------------------------------------.
-| Return true IFF the rule has a `number' smaller than NRULES.  |
-`--------------------------------------------------------------*/
-
-bool
-rule_useful_p (rule *r)
-{
-  return r->number < nrules;
-}
-
-
-/*-------------------------------------------------------------.
-| Return true IFF the rule has a `number' higher than NRULES.  |
-`-------------------------------------------------------------*/
-
-bool
-rule_useless_p (rule *r)
-{
-  return !rule_useful_p (r);
-}
-
-
-/*--------------------------------------------------------------------.
-| Return true IFF the rule is not flagged as useful *and* is useful.  |
-| In other words, it was discarded because of conflicts.              |
-`--------------------------------------------------------------------*/
-
-bool
-rule_never_reduced_p (rule *r)
-{
-  return !r->useful && rule_useful_p (r);
-}
-
-
-/*----------------------------------------------------------------.
-| Print this RULE's number and lhs on OUT.  If a PREVIOUS_LHS was |
-| already displayed (by a previous call for another rule), avoid  |
-| useless repetitions.                                            |
-`----------------------------------------------------------------*/
-
-void
-rule_lhs_print (rule *r, symbol *previous_lhs, FILE *out)
-{
-  fprintf (out, "  %3d ", r->number);
-  if (previous_lhs != r->lhs)
-    {
-      fprintf (out, "%s:", r->lhs->tag);
-    }
-  else
-    {
-      int n;
-      for (n = strlen (previous_lhs->tag); n > 0; --n)
-	fputc (' ', out);
-      fputc ('|', out);
-    }
-}
-
-
-/*--------------------------------------.
-| Return the number of symbols in RHS.  |
-`--------------------------------------*/
-
-int
-rule_rhs_length (rule *r)
-{
-  int res = 0;
-  item_number *rhsp;
-  for (rhsp = r->rhs; *rhsp >= 0; ++rhsp)
-    ++res;
-  return res;
-}
-
-
-/*-------------------------------.
-| Print this rule's RHS on OUT.  |
-`-------------------------------*/
-
-void
-rule_rhs_print (rule *r, FILE *out)
-{
-  if (*r->rhs >= 0)
-    {
-      item_number *rp;
-      for (rp = r->rhs; *rp >= 0; rp++)
-	fprintf (out, " %s", symbols[*rp]->tag);
-      fputc ('\n', out);
-    }
-  else
-    {
-      fprintf (out, " /* %s */\n", _("empty"));
-    }
-}
-
-
-/*-------------------------.
-| Print this rule on OUT.  |
-`-------------------------*/
-
-void
-rule_print (rule *r, FILE *out)
-{
-  fprintf (out, "%s:", r->lhs->tag);
-  rule_rhs_print (r, out);
-}
-
-
-/*------------------------.
-| Dump RITEM for traces.  |
-`------------------------*/
-
-void
-ritem_print (FILE *out)
-{
-  unsigned int i;
-  fputs ("RITEM\n", out);
-  for (i = 0; i < nritems; ++i)
-    if (ritem[i] >= 0)
-      fprintf (out, "  %s", symbols[ritem[i]]->tag);
-    else
-      fprintf (out, "  (rule %d)\n", item_number_as_rule_number (ritem[i]));
-  fputs ("\n\n", out);
-}
-
-
-/*------------------------------------------.
-| Return the size of the longest rule RHS.  |
-`------------------------------------------*/
-
-size_t
-ritem_longest_rhs (void)
-{
-  int max = 0;
-  rule_number r;
-
-  for (r = 0; r < nrules; ++r)
-    {
-      int length = rule_rhs_length (&rules[r]);
-      if (length > max)
-	max = length;
-    }
-
-  return max;
-}
-
-
-/*-----------------------------------------------------------------.
-| Print the grammar's rules that match FILTER on OUT under TITLE.  |
-`-----------------------------------------------------------------*/
-
-void
-grammar_rules_partial_print (FILE *out, const char *title,
-			     rule_filter filter)
-{
-  rule_number r;
-  bool first = true;
-  symbol *previous_lhs = NULL;
-
-  /* rule # : LHS -> RHS */
-  for (r = 0; r < nrules + nuseless_productions; r++)
-    {
-      if (filter && !filter (&rules[r]))
-	continue;
-      if (first)
-	fprintf (out, "%s\n\n", title);
-      else if (previous_lhs && previous_lhs != rules[r].lhs)
-	fputc ('\n', out);
-      first = false;
-      rule_lhs_print (&rules[r], previous_lhs, out);
-      rule_rhs_print (&rules[r], out);
-      previous_lhs = rules[r].lhs;
-    }
-  if (!first)
-    fputs ("\n\n", out);
-}
-
-
-/*------------------------------------------.
-| Print the grammar's useful rules on OUT.  |
-`------------------------------------------*/
-
-void
-grammar_rules_print (FILE *out)
-{
-  grammar_rules_partial_print (out, _("Grammar"), rule_useful_p);
-}
-
-
-/*-------------------.
-| Dump the grammar.  |
-`-------------------*/
-
-void
-grammar_dump (FILE *out, const char *title)
-{
-  fprintf (out, "%s\n\n", title);
-  fprintf (out,
-	   "ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nritems = %d\n\n",
-	   ntokens, nvars, nsyms, nrules, nritems);
-
-
-  fprintf (out, "Variables\n---------\n\n");
-  {
-    symbol_number i;
-    fprintf (out, "Value  Sprec  Sassoc  Tag\n");
-
-    for (i = ntokens; i < nsyms; i++)
-      fprintf (out, "%5d  %5d   %5d  %s\n",
-	       i,
-	       symbols[i]->prec, symbols[i]->assoc,
-	       symbols[i]->tag);
-    fprintf (out, "\n\n");
-  }
-
-  fprintf (out, "Rules\n-----\n\n");
-  {
-    rule_number i;
-    fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n");
-    for (i = 0; i < nrules + nuseless_productions; i++)
-      {
-	rule *rule_i = &rules[i];
-	item_number *rp = NULL;
-	unsigned int rhs_itemno = rule_i->rhs - ritem;
-	unsigned int rhs_count = 0;
-	/* Find the last RHS index in ritems. */
-	for (rp = rule_i->rhs; *rp >= 0; ++rp)
-	  ++rhs_count;
-	fprintf (out, "%3d (%2d, %2d, %2d, %2u-%2u)   %2d ->",
-		 i,
-		 rule_i->prec ? rule_i->prec->prec : 0,
-		 rule_i->prec ? rule_i->prec->assoc : 0,
-		 rule_i->useful,
-		 rhs_itemno,
-		 rhs_itemno + rhs_count - 1,
-		 rule_i->lhs->number);
-	/* Dumped the RHS. */
-	for (rp = rule_i->rhs; *rp >= 0; rp++)
-	  fprintf (out, " %3d", *rp);
-	fprintf (out, "  [%d]\n", item_number_as_rule_number (*rp));
-      }
-  }
-  fprintf (out, "\n\n");
-
-  fprintf (out, "Rules interpreted\n-----------------\n\n");
-  {
-    rule_number r;
-    for (r = 0; r < nrules + nuseless_productions; r++)
-      {
-	fprintf (out, "%-5d  ", r);
-	rule_print (&rules[r], out);
-      }
-  }
-  fprintf (out, "\n\n");
-}
-
-
-/*------------------------------------------------------------------.
-| Report on STDERR the rules that are not flagged USEFUL, using the |
-| MESSAGE (which can be `useless rule' when invoked after grammar   |
-| reduction, or `never reduced' after conflicts were taken into     |
-| account).                                                         |
-`------------------------------------------------------------------*/
-
-void
-grammar_rules_never_reduced_report (const char *message)
-{
-  rule_number r;
-  for (r = 0; r < nrules ; ++r)
-    if (!rules[r].useful)
-      {
-	location_print (stderr, rules[r].location);
-	fprintf (stderr, ": %s: %s: ", _("warning"), message);
-	rule_print (&rules[r], stderr);
-      }
-}
-
-void
-grammar_free (void)
-{
-  if (ritem)
-    free (ritem - 1);
-  free (rules);
-  free (token_translations);
-  /* Free the symbol table data structure.  */
-  symbols_free ();
-  free_merger_functions ();
-}
diff --git a/src/gram.h b/src/gram.h
deleted file mode 100644
index b8f316a..0000000
--- a/src/gram.h
+++ /dev/null
@@ -1,271 +0,0 @@
-/* Data definitions for internal representation of Bison's input.
-
-   Copyright (C) 1984, 1986, 1989, 1992, 2001, 2002, 2003, 2004, 2005
-   Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef GRAM_H_
-# define GRAM_H_
-
-/* Representation of the grammar rules:
-
-   NTOKENS is the number of tokens, and NVARS is the number of
-   variables (nonterminals).  NSYMS is the total number, ntokens +
-   nvars.
-
-   Each symbol (either token or variable) receives a symbol number.
-   Numbers 0 to NTOKENS - 1 are for tokens, and NTOKENS to NSYMS - 1
-   are for variables.  Symbol number zero is the end-of-input token.
-   This token is counted in ntokens.  The true number of token values
-   assigned is NTOKENS reduced by one for each alias declaration.
-
-   The rules receive rule numbers 1 to NRULES in the order they are
-   written.  More precisely Bison augments the grammar with the
-   initial rule, `$accept: START-SYMBOL $end', which is numbered 1,
-   all the user rules are 2, 3 etc.  Each time a rule number is
-   presented to the user, we subtract 1, so *displayed* rule numbers
-   are 0, 1, 2...
-
-   Internally, we cannot use the number 0 for a rule because for
-   instance RITEM stores both symbol (the RHS) and rule numbers: the
-   symbols are shorts >= 0, and rule number are stored negative.
-   Therefore 0 cannot be used, since it would be both the rule number
-   0, and the token $end).
-
-   Actions are accessed via the rule number.
-
-   The rules themselves are described by several arrays: amongst which
-   RITEM, and RULES.
-
-   RULES is an array of rules, whose members are:
-
-   RULES[R].lhs -- the symbol of the left hand side of rule R.
-
-   RULES[R].rhs -- the index in RITEM of the beginning of the portion
-   for rule R.
-
-   RULES[R].prec -- the symbol providing the precedence level of R.
-
-   RULES[R].precsym -- the symbol attached (via %prec) to give its
-   precedence to R.  Of course, if set, it is equal to `prec', but we
-   need to distinguish one from the other when reducing: a symbol used
-   in a %prec is not useless.
-
-   RULES[R].assoc -- the associativity of R.
-
-   RULES[R].dprec -- the dynamic precedence level of R (for GLR
-   parsing).
-
-   RULES[R].merger -- index of merging function for R (for GLR
-   parsing).
-
-   RULES[R].line -- the line where R was defined.
-
-   RULES[R].useful -- true iff the rule is used (i.e., false if thrown
-   away by reduce).
-
-   The right hand side is stored as symbol numbers in a portion of
-   RITEM.
-
-   The length of the portion is one greater than the number of symbols
-   in the rule's right hand side.  The last element in the portion
-   contains minus R, which identifies it as the end of a portion and
-   says which rule it is for.
-
-   The portions of RITEM come in order of increasing rule number.
-   NRITEMS is the total length of RITEM.  Each element of RITEM is
-   called an "item" and its index in RITEM is an item number.
-
-   Item numbers are used in the finite state machine to represent
-   places that parsing can get to.
-
-   SYMBOLS[I]->prec records the precedence level of each symbol.
-
-   Precedence levels are assigned in increasing order starting with 1
-   so that numerically higher precedence values mean tighter binding
-   as they ought to.  Zero as a symbol or rule's precedence means none
-   is assigned.
-
-   Associativities are recorded similarly in SYMBOLS[I]->assoc.  */
-
-# include "location.h"
-# include "symtab.h"
-
-# define ISTOKEN(i)	((i) < ntokens)
-# define ISVAR(i)	((i) >= ntokens)
-
-extern int nsyms;
-extern int ntokens;
-extern int nvars;
-
-typedef int item_number;
-extern item_number *ritem;
-extern unsigned int nritems;
-
-/* There is weird relationship between OT1H item_number and OTOH
-   symbol_number and rule_number: we store the latter in
-   item_number.  symbol_number values are stored as-is, while
-   the negation of (rule_number + 1) is stored.
-
-   Therefore, a symbol_number must be a valid item_number, and we
-   sometimes have to perform the converse transformation.  */
-
-static inline item_number
-symbol_number_as_item_number (symbol_number sym)
-{
-  return sym;
-}
-
-static inline symbol_number
-item_number_as_symbol_number (item_number i)
-{
-  return i;
-}
-
-static inline bool
-item_number_is_symbol_number (item_number i)
-{
-  return i >= 0;
-}
-
-/* Rule numbers.  */
-typedef int rule_number;
-extern rule_number nrules;
-
-static inline item_number
-rule_number_as_item_number (rule_number r)
-{
-  return -1 - r;
-}
-
-static inline rule_number
-item_number_as_rule_number (item_number i)
-{
-  return -1 - i;
-}
-
-static inline bool
-item_number_is_rule_number (item_number i)
-{
-  return i < 0;
-}
-
-/*--------.
-| Rules.  |
-`--------*/
-
-typedef struct
-{
-  /* The number of the rule in the source.  It is usually the index in
-     RULES too, except if there are useless rules.  */
-  rule_number user_number;
-
-  /* The index in RULES.  Usually the rule number in the source,
-     except if some rules are useless.  */
-  rule_number number;
-
-  symbol *lhs;
-  item_number *rhs;
-
-  /* This symbol provides both the associativity, and the precedence. */
-  symbol *prec;
-
-  int dprec;
-  int merger;
-
-  /* This symbol was attached to the rule via %prec. */
-  symbol *precsym;
-
-  location location;
-  bool useful;
-
-  const char *action;
-  location action_location;
-} rule;
-
-extern rule *rules;
-
-/* A function that selects a rule.  */
-typedef bool (*rule_filter) (rule *);
-
-/* Return true IFF the rule has a `number' smaller than NRULES.  */
-bool rule_useful_p (rule *r);
-
-/* Return true IFF the rule has a `number' higher than NRULES.  */
-bool rule_useless_p (rule *r);
-
-/* Return true IFF the rule is not flagged as useful *and* is useful.
-   In other words, it was discarded because of conflicts.  */
-bool rule_never_reduced_p (rule *r);
-
-/* Print this rule's number and lhs on OUT.  If a PREVIOUS_LHS was
-   already displayed (by a previous call for another rule), avoid
-   useless repetitions.  */
-void rule_lhs_print (rule *r, symbol *previous_lhs, FILE *out);
-
-/* Return the length of the RHS.  */
-int rule_rhs_length (rule *r);
-
-/* Print this rule's RHS on OUT.  */
-void rule_rhs_print (rule *r, FILE *out);
-
-/* Print this rule on OUT.  */
-void rule_print (rule *r, FILE *out);
-
-
-
-
-/* Table of the symbols, indexed by the symbol number. */
-extern symbol **symbols;
-
-/* TOKEN_TRANSLATION -- a table indexed by a token number as returned
-   by the user's yylex routine, it yields the internal token number
-   used by the parser and throughout bison.  */
-extern symbol_number *token_translations;
-extern int max_user_token_number;
-
-
-
-/* Dump RITEM for traces. */
-void ritem_print (FILE *out);
-
-/* Return the size of the longest rule RHS.  */
-size_t ritem_longest_rhs (void);
-
-/* Print the grammar's rules numbers from BEGIN (inclusive) to END
-   (exclusive) on OUT under TITLE.  */
-void grammar_rules_partial_print (FILE *out, const char *title,
-				  rule_filter filter);
-
-/* Print the grammar's rules on OUT.  */
-void grammar_rules_print (FILE *out);
-
-/* Dump the grammar. */
-void grammar_dump (FILE *out, const char *title);
-
-/* Report on STDERR the rules that are not flagged USEFUL, using the
-   MESSAGE (which can be `useless rule' when invoked after grammar
-   reduction, or `never reduced' after conflicts were taken into
-   account).  */
-void grammar_rules_never_reduced_report (const char *message);
-
-/* Free the packed grammar. */
-void grammar_free (void);
-
-#endif /* !GRAM_H_ */
diff --git a/src/lalr.c b/src/lalr.c
deleted file mode 100644
index 65c55ab..0000000
--- a/src/lalr.c
+++ /dev/null
@@ -1,463 +0,0 @@
-/* Compute look-ahead criteria for Bison.
-
-   Copyright (C) 1984, 1986, 1989, 2000, 2001, 2002, 2003, 2004, 2005,
-   2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-
-/* Compute how to make the finite state machine deterministic; find
-   which rules need look-ahead in each state, and which look-ahead
-   tokens they accept.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <bitset.h>
-#include <bitsetv.h>
-#include <quotearg.h>
-
-#include "LR0.h"
-#include "complain.h"
-#include "derives.h"
-#include "getargs.h"
-#include "gram.h"
-#include "lalr.h"
-#include "nullable.h"
-#include "reader.h"
-#include "relation.h"
-#include "symtab.h"
-
-goto_number *goto_map;
-static goto_number ngotos;
-state_number *from_state;
-state_number *to_state;
-
-/* Linked list of goto numbers.  */
-typedef struct goto_list
-{
-  struct goto_list *next;
-  goto_number value;
-} goto_list;
-
-
-/* LA is a LR by NTOKENS matrix of bits.  LA[l, i] is 1 if the rule
-   LArule[l] is applicable in the appropriate state when the next
-   token is symbol i.  If LA[l, i] and LA[l, j] are both 1 for i != j,
-   it is a conflict.  */
-
-static bitsetv LA = NULL;
-size_t nLA;
-
-
-/* And for the famous F variable, which name is so descriptive that a
-   comment is hardly needed.  <grin>.  */
-static bitsetv F = NULL;
-
-static goto_number **includes;
-static goto_list **lookback;
-
-
-
-
-static void
-set_goto_map (void)
-{
-  state_number s;
-  goto_number *temp_map;
-
-  goto_map = xcalloc (nvars + 1, sizeof *goto_map);
-  temp_map = xnmalloc (nvars + 1, sizeof *temp_map);
-
-  ngotos = 0;
-  for (s = 0; s < nstates; ++s)
-    {
-      transitions *sp = states[s]->transitions;
-      int i;
-      for (i = sp->num - 1; i >= 0 && TRANSITION_IS_GOTO (sp, i); --i)
-	{
-	  ngotos++;
-
-	  /* Abort if (ngotos + 1) would overflow.  */
-	  assert (ngotos != GOTO_NUMBER_MAXIMUM);
-
-	  goto_map[TRANSITION_SYMBOL (sp, i) - ntokens]++;
-	}
-    }
-
-  {
-    goto_number k = 0;
-    int i;
-    for (i = ntokens; i < nsyms; i++)
-      {
-	temp_map[i - ntokens] = k;
-	k += goto_map[i - ntokens];
-      }
-
-    for (i = ntokens; i < nsyms; i++)
-      goto_map[i - ntokens] = temp_map[i - ntokens];
-
-    goto_map[nsyms - ntokens] = ngotos;
-    temp_map[nsyms - ntokens] = ngotos;
-  }
-
-  from_state = xcalloc (ngotos, sizeof *from_state);
-  to_state = xcalloc (ngotos, sizeof *to_state);
-
-  for (s = 0; s < nstates; ++s)
-    {
-      transitions *sp = states[s]->transitions;
-      int i;
-      for (i = sp->num - 1; i >= 0 && TRANSITION_IS_GOTO (sp, i); --i)
-	{
-	  goto_number k = temp_map[TRANSITION_SYMBOL (sp, i) - ntokens]++;
-	  from_state[k] = s;
-	  to_state[k] = sp->states[i]->number;
-	}
-    }
-
-  free (temp_map);
-}
-
-
-
-/*----------------------------------------------------------.
-| Map a state/symbol pair into its numeric representation.  |
-`----------------------------------------------------------*/
-
-static goto_number
-map_goto (state_number s0, symbol_number sym)
-{
-  goto_number high;
-  goto_number low;
-  goto_number middle;
-  state_number s;
-
-  low = goto_map[sym - ntokens];
-  high = goto_map[sym - ntokens + 1] - 1;
-
-  for (;;)
-    {
-      assert (low <= high);
-      middle = (low + high) / 2;
-      s = from_state[middle];
-      if (s == s0)
-	return middle;
-      else if (s < s0)
-	low = middle + 1;
-      else
-	high = middle - 1;
-    }
-}
-
-
-static void
-initialize_F (void)
-{
-  goto_number **reads = xnmalloc (ngotos, sizeof *reads);
-  goto_number *edge = xnmalloc (ngotos + 1, sizeof *edge);
-  goto_number nedges = 0;
-
-  goto_number i;
-
-  F = bitsetv_create (ngotos, ntokens, BITSET_FIXED);
-
-  for (i = 0; i < ngotos; i++)
-    {
-      state_number stateno = to_state[i];
-      transitions *sp = states[stateno]->transitions;
-
-      int j;
-      FOR_EACH_SHIFT (sp, j)
-	bitset_set (F[i], TRANSITION_SYMBOL (sp, j));
-
-      for (; j < sp->num; j++)
-	{
-	  symbol_number sym = TRANSITION_SYMBOL (sp, j);
-	  if (nullable[sym - ntokens])
-	    edge[nedges++] = map_goto (stateno, sym);
-	}
-
-      if (nedges == 0)
-	reads[i] = NULL;
-      else
-	{
-	  reads[i] = xnmalloc (nedges + 1, sizeof reads[i][0]);
-	  memcpy (reads[i], edge, nedges * sizeof edge[0]);
-	  reads[i][nedges] = END_NODE;
-	  nedges = 0;
-	}
-    }
-
-  relation_digraph (reads, ngotos, &F);
-
-  for (i = 0; i < ngotos; i++)
-    free (reads[i]);
-
-  free (reads);
-  free (edge);
-}
-
-
-static void
-add_lookback_edge (state *s, rule *r, goto_number gotono)
-{
-  int ri = state_reduction_find (s, r);
-  goto_list *sp = xmalloc (sizeof *sp);
-  sp->next = lookback[(s->reductions->look_ahead_tokens - LA) + ri];
-  sp->value = gotono;
-  lookback[(s->reductions->look_ahead_tokens - LA) + ri] = sp;
-}
-
-
-
-static void
-build_relations (void)
-{
-  goto_number *edge = xnmalloc (ngotos + 1, sizeof *edge);
-  state_number *states1 = xnmalloc (ritem_longest_rhs () + 1, sizeof *states1);
-  goto_number i;
-
-  includes = xnmalloc (ngotos, sizeof *includes);
-
-  for (i = 0; i < ngotos; i++)
-    {
-      int nedges = 0;
-      symbol_number symbol1 = states[to_state[i]]->accessing_symbol;
-      rule **rulep;
-
-      for (rulep = derives[symbol1 - ntokens]; *rulep; rulep++)
-	{
-	  bool done;
-	  int length = 1;
-	  item_number const *rp;
-	  state *s = states[from_state[i]];
-	  states1[0] = s->number;
-
-	  for (rp = (*rulep)->rhs; ! item_number_is_rule_number (*rp); rp++)
-	    {
-	      s = transitions_to (s->transitions,
-				  item_number_as_symbol_number (*rp));
-	      states1[length++] = s->number;
-	    }
-
-	  if (!s->consistent)
-	    add_lookback_edge (s, *rulep, i);
-
-	  length--;
-	  done = false;
-	  while (!done)
-	    {
-	      done = true;
-	      /* Each rhs ends in an item number, and there is a
-		 sentinel before the first rhs, so it is safe to
-		 decrement RP here.  */
-	      rp--;
-	      if (ISVAR (*rp))
-		{
-		  /* Downcasting from item_number to symbol_number.  */
-		  edge[nedges++] = map_goto (states1[--length],
-					     item_number_as_symbol_number (*rp));
-		  if (nullable[*rp - ntokens])
-		    done = false;
-		}
-	    }
-	}
-
-      if (nedges == 0)
-	includes[i] = NULL;
-      else
-	{
-	  int j;
-	  includes[i] = xnmalloc (nedges + 1, sizeof includes[i][0]);
-	  for (j = 0; j < nedges; j++)
-	    includes[i][j] = edge[j];
-	  includes[i][nedges] = END_NODE;
-	}
-    }
-
-  free (edge);
-  free (states1);
-
-  relation_transpose (&includes, ngotos);
-}
-
-
-
-static void
-compute_FOLLOWS (void)
-{
-  goto_number i;
-
-  relation_digraph (includes, ngotos, &F);
-
-  for (i = 0; i < ngotos; i++)
-    free (includes[i]);
-
-  free (includes);
-}
-
-
-static void
-compute_look_ahead_tokens (void)
-{
-  size_t i;
-  goto_list *sp;
-
-  for (i = 0; i < nLA; i++)
-    for (sp = lookback[i]; sp; sp = sp->next)
-      bitset_or (LA[i], LA[i], F[sp->value]);
-
-  /* Free LOOKBACK. */
-  for (i = 0; i < nLA; i++)
-    LIST_FREE (goto_list, lookback[i]);
-
-  free (lookback);
-  bitsetv_free (F);
-}
-
-
-/*-----------------------------------------------------.
-| Count the number of look-ahead tokens required for S |
-| (N_LOOK_AHEAD_TOKENS member).                        |
-`-----------------------------------------------------*/
-
-static int
-state_look_ahead_tokens_count (state *s)
-{
-  int k;
-  int n_look_ahead_tokens = 0;
-  reductions *rp = s->reductions;
-  transitions *sp = s->transitions;
-
-  /* We need a look-ahead either to distinguish different
-     reductions (i.e., there are two or more), or to distinguish a
-     reduction from a shift.  Otherwise, it is straightforward,
-     and the state is `consistent'.  */
-  if (rp->num > 1
-      || (rp->num == 1 && sp->num &&
-	  !TRANSITION_IS_DISABLED (sp, 0) && TRANSITION_IS_SHIFT (sp, 0)))
-    n_look_ahead_tokens += rp->num;
-  else
-    s->consistent = 1;
-
-  for (k = 0; k < sp->num; k++)
-    if (!TRANSITION_IS_DISABLED (sp, k) && TRANSITION_IS_ERROR (sp, k))
-      {
-	s->consistent = 0;
-	break;
-      }
-
-  return n_look_ahead_tokens;
-}
-
-
-/*-----------------------------------------------------.
-| Compute LA, NLA, and the look_ahead_tokens members.  |
-`-----------------------------------------------------*/
-
-static void
-initialize_LA (void)
-{
-  state_number i;
-  bitsetv pLA;
-
-  /* Compute the total number of reductions requiring a look-ahead.  */
-  nLA = 0;
-  for (i = 0; i < nstates; i++)
-    nLA += state_look_ahead_tokens_count (states[i]);
-  /* Avoid having to special case 0.  */
-  if (!nLA)
-    nLA = 1;
-
-  pLA = LA = bitsetv_create (nLA, ntokens, BITSET_FIXED);
-  lookback = xcalloc (nLA, sizeof *lookback);
-
-  /* Initialize the members LOOK_AHEAD_TOKENS for each state whose reductions
-     require look-ahead tokens.  */
-  for (i = 0; i < nstates; i++)
-    {
-      int count = state_look_ahead_tokens_count (states[i]);
-      if (count)
-	{
-	  states[i]->reductions->look_ahead_tokens = pLA;
-	  pLA += count;
-	}
-    }
-}
-
-
-/*----------------------------------------------.
-| Output the look-ahead tokens for each state.  |
-`----------------------------------------------*/
-
-static void
-look_ahead_tokens_print (FILE *out)
-{
-  state_number i;
-  int j, k;
-  fprintf (out, "Look-ahead tokens: BEGIN\n");
-  for (i = 0; i < nstates; ++i)
-    {
-      reductions *reds = states[i]->reductions;
-      bitset_iterator iter;
-      int n_look_ahead_tokens = 0;
-
-      if (reds->look_ahead_tokens)
-	for (k = 0; k < reds->num; ++k)
-	  if (reds->look_ahead_tokens[k])
-	    ++n_look_ahead_tokens;
-
-      fprintf (out, "State %d: %d look-ahead tokens\n",
-	       i, n_look_ahead_tokens);
-
-      if (reds->look_ahead_tokens)
-	for (j = 0; j < reds->num; ++j)
-	  BITSET_FOR_EACH (iter, reds->look_ahead_tokens[j], k, 0)
-	  {
-	    fprintf (out, "   on %d (%s) -> rule %d\n",
-		     k, symbols[k]->tag,
-		     reds->rules[j]->number);
-	  };
-    }
-  fprintf (out, "Look-ahead tokens: END\n");
-}
-
-void
-lalr (void)
-{
-  initialize_LA ();
-  set_goto_map ();
-  initialize_F ();
-  build_relations ();
-  compute_FOLLOWS ();
-  compute_look_ahead_tokens ();
-
-  if (trace_flag & trace_sets)
-    look_ahead_tokens_print (stderr);
-}
-
-
-void
-lalr_free (void)
-{
-  state_number s;
-  for (s = 0; s < nstates; ++s)
-    states[s]->reductions->look_ahead_tokens = NULL;
-  bitsetv_free (LA);
-}
diff --git a/src/lalr.h b/src/lalr.h
deleted file mode 100644
index a2c1753..0000000
--- a/src/lalr.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Compute look-ahead criteria for bison,
-
-   Copyright (C) 1984, 1986, 1989, 2000, 2002, 2004 Free Software
-   Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef LALR_H_
-# define LALR_H_
-
-# include <bitset.h>
-# include <bitsetv.h>
-
-/* Import the definition of RULE_T. */
-# include "gram.h"
-
-/* Import the definition of CORE, TRANSITIONS and REDUCTIONS. */
-# include "state.h"
-
-/* Compute how to make the finite state machine deterministic; find
-   which rules need look-ahead in each state, and which look-ahead
-   tokens they accept.  */
-
-void lalr (void);
-
-/* Release the information related to look-ahead tokens.  Can be performed
-   once the action tables are computed.  */
-
-void lalr_free (void);
-
-
-/* lalr() builds these data structures. */
-
-/* GOTO_MAP, FROM_STATE and TO_STATE -- record each shift transition
-   which accepts a variable (a nonterminal).
-
-   FROM_STATE[T] -- state number which a transition leads from.
-   TO_STATE[T] -- state number it leads to.
-
-   All the transitions that accept a particular variable are grouped
-   together and GOTO_MAP[I - NTOKENS] is the index in FROM_STATE and
-   TO_STATE of the first of them.  */
-
-typedef size_t goto_number;
-# define GOTO_NUMBER_MAXIMUM ((goto_number) -1)
-
-extern goto_number *goto_map;
-extern state_number *from_state;
-extern state_number *to_state;
-
-
-#endif /* !LALR_H_ */
diff --git a/src/location.c b/src/location.c
deleted file mode 100644
index ecd3658..0000000
--- a/src/location.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Locations for Bison
-
-   Copyright (C) 2002, 2005 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <quotearg.h>
-
-#include "location.h"
-
-location const empty_location;
-
-/* Output to OUT the location LOC.
-   Warning: it uses quotearg's slot 3.  */
-void
-location_print (FILE *out, location loc)
-{
-  fprintf (out, "%s:%d.%d",
-	   quotearg_n_style (3, escape_quoting_style, loc.start.file),
-	   loc.start.line, loc.start.column);
-
-  if (loc.start.file != loc.end.file)
-    fprintf (out, "-%s:%d.%d",
-	     quotearg_n_style (3, escape_quoting_style, loc.end.file),
-	     loc.end.line, loc.end.column - 1);
-  else if (loc.start.line < loc.end.line)
-    fprintf (out, "-%d.%d", loc.end.line, loc.end.column - 1);
-  else if (loc.start.column < loc.end.column - 1)
-    fprintf (out, "-%d", loc.end.column - 1);
-}
diff --git a/src/location.h b/src/location.h
deleted file mode 100644
index 49d2a2e..0000000
--- a/src/location.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Locations for Bison
-   Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef LOCATION_H_
-# define LOCATION_H_
-
-# include "uniqstr.h"
-
-/* A boundary between two characters.  */
-typedef struct
-{
-  /* The name of the file that contains the boundary.  */
-  uniqstr file;
-
-  /* The (origin-1) line that contains the boundary.
-     If this is INT_MAX, the line number has overflowed.  */
-  int line;
-
-  /* The (origin-1) column just after the boundary.  This is neither a
-     byte count, nor a character count; it is a column count.
-     If this is INT_MAX, the column number has overflowed.  */
-  int column;
-
-} boundary;
-
-/* Return nonzero if A and B are equal boundaries.  */
-static inline bool
-equal_boundaries (boundary a, boundary b)
-{
-  return (a.column == b.column
-	  && a.line == b.line
-	  && UNIQSTR_EQ (a.file, b.file));
-}
-
-/* A location, that is, a region of source code.  */
-typedef struct
-{
-  /* Boundary just before the location starts.  */
-  boundary start;
-
-  /* Boundary just after the location ends.  */
-  boundary end;
-
-} location;
-
-#define YYLTYPE location
-
-extern location const empty_location;
-
-void location_print (FILE *out, location loc);
-
-#endif /* ! defined LOCATION_H_ */
diff --git a/src/main.c b/src/main.c
deleted file mode 100644
index 8769fef..0000000
--- a/src/main.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/* Top level entry point of Bison.
-
-   Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000, 2001, 2002, 2004, 2005
-   Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <bitset_stats.h>
-#include <bitset.h>
-#include <timevar.h>
-
-#include "LR0.h"
-#include "complain.h"
-#include "conflicts.h"
-#include "derives.h"
-#include "files.h"
-#include "getargs.h"
-#include "gram.h"
-#include "lalr.h"
-#include "muscle_tab.h"
-#include "nullable.h"
-#include "output.h"
-#include "print.h"
-#include "print_graph.h"
-#include "reader.h"
-#include "reduce.h"
-#include "symtab.h"
-#include "tables.h"
-#include "uniqstr.h"
-
-/* The name this program was run with, for messages.  */
-char *program_name;
-
-
-
-int
-main (int argc, char *argv[])
-{
-  program_name = argv[0];
-  setlocale (LC_ALL, "");
-  (void) bindtextdomain (PACKAGE, LOCALEDIR);
-  (void) bindtextdomain ("bison-runtime", LOCALEDIR);
-  (void) textdomain (PACKAGE);
-
-  uniqstrs_new ();
-
-  getargs (argc, argv);
-
-  timevar_report = trace_flag & trace_time;
-  init_timevar ();
-  timevar_start (TV_TOTAL);
-
-  if (trace_flag & trace_bitsets)
-    bitset_stats_enable ();
-
-  muscle_init ();
-
-  /* Read the input.  Copy some parts of it to FGUARD, FACTION, FTABLE
-     and FATTRS.  In file reader.c.  The other parts are recorded in
-     the grammar; see gram.h.  */
-
-  timevar_push (TV_READER);
-  reader ();
-  timevar_pop (TV_READER);
-
-  if (complaint_issued)
-    goto finish;
-
-  /* Find useless nonterminals and productions and reduce the grammar. */
-  timevar_push (TV_REDUCE);
-  reduce_grammar ();
-  timevar_pop (TV_REDUCE);
-
-  /* Record other info about the grammar.  In files derives and
-     nullable.  */
-  timevar_push (TV_SETS);
-  derives_compute ();
-  nullable_compute ();
-  timevar_pop (TV_SETS);
-
-  /* Convert to nondeterministic finite state machine.  In file LR0.
-     See state.h for more info.  */
-  timevar_push (TV_LR0);
-  generate_states ();
-  timevar_pop (TV_LR0);
-
-  /* make it deterministic.  In file lalr.  */
-  timevar_push (TV_LALR);
-  lalr ();
-  timevar_pop (TV_LALR);
-
-  /* Find and record any conflicts: places where one token of
-     look-ahead is not enough to disambiguate the parsing.  In file
-     conflicts.  Also resolve s/r conflicts based on precedence
-     declarations.  */
-  timevar_push (TV_CONFLICTS);
-  conflicts_solve ();
-  conflicts_print ();
-  timevar_pop (TV_CONFLICTS);
-
-  /* Compute the parser tables.  */
-  timevar_push (TV_ACTIONS);
-  tables_generate ();
-  timevar_pop (TV_ACTIONS);
-
-  grammar_rules_never_reduced_report
-    (_("rule never reduced because of conflicts"));
-
-  /* Output file names. */
-  compute_output_file_names ();
-
-  /* Output the detailed report on the grammar.  */
-  if (report_flag)
-    {
-      timevar_push (TV_REPORT);
-      print_results ();
-      timevar_pop (TV_REPORT);
-    }
-
-  /* Output the VCG graph.  */
-  if (graph_flag)
-    {
-      timevar_push (TV_GRAPH);
-      print_graph ();
-      timevar_pop (TV_GRAPH);
-    }
-
-  /* Stop if there were errors, to avoid trashing previous output
-     files.  */
-  if (complaint_issued)
-    goto finish;
-
-  /* Look-ahead tokens are no longer needed. */
-  timevar_push (TV_FREE);
-  lalr_free ();
-  timevar_pop (TV_FREE);
-
-  /* Output the tables and the parser to ftable.  In file output.  */
-  timevar_push (TV_PARSER);
-  output ();
-  timevar_pop (TV_PARSER);
-
-  timevar_push (TV_FREE);
-  nullable_free ();
-  derives_free ();
-  tables_free ();
-  states_free ();
-  reduce_free ();
-  conflicts_free ();
-  grammar_free ();
-
-  /* The scanner memory cannot be released right after parsing, as it
-     contains things such as user actions, prologue, epilogue etc.  */
-  scanner_free ();
-  muscle_free ();
-  uniqstrs_free ();
-  timevar_pop (TV_FREE);
-
-  if (trace_flag & trace_bitsets)
-    bitset_stats_dump (stderr);
-
- finish:
-
-  /* Stop timing and print the times.  */
-  timevar_stop (TV_TOTAL);
-  timevar_print (stderr);
-
-  return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;
-}
diff --git a/src/muscle_tab.c b/src/muscle_tab.c
deleted file mode 100644
index 2d71085..0000000
--- a/src/muscle_tab.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/* Muscle table manager for Bison.
-
-   Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software
-   Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <hash.h>
-#include <quotearg.h>
-
-#include "files.h"
-#include "muscle_tab.h"
-#include "getargs.h"
-
-typedef struct
-{
-  const char *key;
-  char *value;
-} muscle_entry;
-
-/* An obstack used to create some entries.  */
-struct obstack muscle_obstack;
-
-/* Initial capacity of muscles hash table.  */
-#define HT_INITIAL_CAPACITY 257
-
-static struct hash_table *muscle_table = NULL;
-
-static bool
-hash_compare_muscles (void const *x, void const *y)
-{
-  muscle_entry const *m1 = x;
-  muscle_entry const *m2 = y;
-  return strcmp (m1->key, m2->key) == 0;
-}
-
-static size_t
-hash_muscle (const void *x, size_t tablesize)
-{
-  muscle_entry const *m = x;
-  return hash_string (m->key, tablesize);
-}
-
-/*-----------------------------------------------------------------.
-| Create the MUSCLE_TABLE, and initialize it with default values.  |
-| Also set up the MUSCLE_OBSTACK.                                  |
-`-----------------------------------------------------------------*/
-
-void
-muscle_init (void)
-{
-  /* Initialize the muscle obstack.  */
-  obstack_init (&muscle_obstack);
-
-  muscle_table = hash_initialize (HT_INITIAL_CAPACITY, NULL, hash_muscle,
-				  hash_compare_muscles, free);
-
-  /* Version and input file.  */
-  MUSCLE_INSERT_STRING ("version", VERSION);
-  MUSCLE_INSERT_C_STRING ("file_name", grammar_file);
-}
-
-
-/*------------------------------------------------------------.
-| Free all the memory consumed by the muscle machinery only.  |
-`------------------------------------------------------------*/
-
-void
-muscle_free (void)
-{
-  hash_free (muscle_table);
-  obstack_free (&muscle_obstack, NULL);
-}
-
-
-
-/*------------------------------------------------------------.
-| Insert (KEY, VALUE).  If KEY already existed, overwrite the |
-| previous value.                                             |
-`------------------------------------------------------------*/
-
-void
-muscle_insert (const char *key, char *value)
-{
-  muscle_entry probe;
-  muscle_entry *entry;
-
-  probe.key = key;
-  entry = hash_lookup (muscle_table, &probe);
-
-  if (!entry)
-    {
-      /* First insertion in the hash. */
-      entry = xmalloc (sizeof *entry);
-      entry->key = key;
-      hash_insert (muscle_table, entry);
-    }
-  entry->value = value;
-}
-
-
-/*-------------------------------------------------------------------.
-| Append VALUE to the current value of KEY.  If KEY did not already  |
-| exist, create it.  Use MUSCLE_OBSTACK.  De-allocate the previously |
-| associated value.  Copy VALUE and SEPARATOR.                       |
-`-------------------------------------------------------------------*/
-
-void
-muscle_grow (const char *key, const char *val, const char *separator)
-{
-  muscle_entry probe;
-  muscle_entry *entry = NULL;
-
-  probe.key = key;
-  entry = hash_lookup (muscle_table, &probe);
-
-  if (!entry)
-    {
-      /* First insertion in the hash. */
-      entry = xmalloc (sizeof *entry);
-      entry->key = key;
-      hash_insert (muscle_table, entry);
-      entry->value = xstrdup (val);
-    }
-  else
-    {
-      /* Grow the current value. */
-      char *new_val;
-      obstack_sgrow (&muscle_obstack, entry->value);
-      free (entry->value);
-      obstack_sgrow (&muscle_obstack, separator);
-      obstack_sgrow (&muscle_obstack, val);
-      obstack_1grow (&muscle_obstack, 0);
-      new_val = obstack_finish (&muscle_obstack);
-      entry->value = xstrdup (new_val);
-      obstack_free (&muscle_obstack, new_val);
-    }
-}
-
-
-/*------------------------------------------------------------------.
-| Append VALUE to the current value of KEY, using muscle_grow.  But |
-| in addition, issue a synchronization line for the location LOC.   |
-`------------------------------------------------------------------*/
-
-void
-muscle_code_grow (const char *key, const char *val, location loc)
-{
-  char *extension = NULL;
-  obstack_fgrow1 (&muscle_obstack, "]b4_syncline(%d, [[", loc.start.line);
-  MUSCLE_OBSTACK_SGROW (&muscle_obstack,
-			quotearg_style (c_quoting_style, loc.start.file));
-  obstack_sgrow (&muscle_obstack, "]])[\n");
-  obstack_sgrow (&muscle_obstack, val);
-  obstack_1grow (&muscle_obstack, 0);
-  extension = obstack_finish (&muscle_obstack);
-  muscle_grow (key, extension, "");
-}
-
-
-/*-------------------------------------------------------------------.
-| MUSCLE is an M4 list of pairs.  Create or extend it with the pair  |
-| (A1, A2).  Note that because the muscle values are output *double* |
-| quoted, one needs to strip the first level of quotes to reach the  |
-| list itself.                                                       |
-`-------------------------------------------------------------------*/
-
-void muscle_pair_list_grow (const char *muscle,
-			    const char *a1, const char *a2)
-{
-  char *pair;
-  obstack_fgrow2 (&muscle_obstack, "[[[%s]], [[%s]]]", a1, a2);
-  obstack_1grow (&muscle_obstack, 0);
-  pair = obstack_finish (&muscle_obstack);
-  muscle_grow (muscle, pair, ",\n");
-  obstack_free (&muscle_obstack, pair);
-}
-
-/*-------------------------------.
-| Find the value of muscle KEY.  |
-`-------------------------------*/
-
-char *
-muscle_find (const char *key)
-{
-  muscle_entry probe;
-  muscle_entry *result = NULL;
-
-  probe.key = key;
-  result = hash_lookup (muscle_table, &probe);
-  return result ? result->value : NULL;
-}
-
-
-/*------------------------------------------------.
-| Output the definition of ENTRY as a m4_define.  |
-`------------------------------------------------*/
-
-static inline bool
-muscle_m4_output (muscle_entry *entry, FILE *out)
-{
-  fprintf (out, "m4_define([b4_%s],\n", entry->key);
-  fprintf (out, "[[%s]])\n\n\n", entry->value);
-  return true;
-}
-
-static bool
-muscle_m4_output_processor (void *entry, void *out)
-{
-  return muscle_m4_output (entry, out);
-}
-
-
-/*----------------------------------------------------------------.
-| Output the definition of all the current muscles into a list of |
-| m4_defines.                                                     |
-`----------------------------------------------------------------*/
-
-void
-muscles_m4_output (FILE *out)
-{
-  hash_do_for_each (muscle_table, muscle_m4_output_processor, out);
-}
diff --git a/src/muscle_tab.h b/src/muscle_tab.h
deleted file mode 100644
index 9e8ac24..0000000
--- a/src/muscle_tab.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/* Muscle table manager for Bison,
-   Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef MUSCLE_TAB_H_
-# define MUSCLE_TAB_H_
-
-# include "location.h"
-
-void muscle_init (void);
-void muscle_insert (const char *key, char *value);
-char *muscle_find (const char *key);
-void muscle_free (void);
-
-
-/* An obstack dedicated to receive muscle keys and values.  */
-extern struct obstack muscle_obstack;
-
-#define MUSCLE_INSERT_BOOL(Key, Value)				\
-{								\
-  int v = Value;						\
-  MUSCLE_INSERT_INT (Key, v);					\
-}
-
-#define MUSCLE_INSERT_INT(Key, Value)				\
-{								\
-  obstack_fgrow1 (&muscle_obstack, "%d", Value);		\
-  obstack_1grow (&muscle_obstack, 0);				\
-  muscle_insert (Key, obstack_finish (&muscle_obstack));	\
-}
-
-#define MUSCLE_INSERT_LONG_INT(Key, Value)			\
-{								\
-  obstack_fgrow1 (&muscle_obstack, "%ld", Value);		\
-  obstack_1grow (&muscle_obstack, 0);				\
-  muscle_insert (Key, obstack_finish (&muscle_obstack));	\
-}
-
-#define MUSCLE_INSERT_STRING(Key, Value)			\
-{								\
-  obstack_sgrow (&muscle_obstack, Value);			\
-  obstack_1grow (&muscle_obstack, 0);				\
-  muscle_insert (Key, obstack_finish (&muscle_obstack));	\
-}
-
-#define MUSCLE_OBSTACK_SGROW(Obstack, Value)			\
-{								\
-  char const *p;						\
-  for (p = Value; *p; p++)					\
-    switch (*p)							\
-      {								\
-      case '$':	obstack_sgrow (Obstack, "$]["); break;		\
-      case '@':	obstack_sgrow (Obstack, "@@" ); break;		\
-      case '[':	obstack_sgrow (Obstack, "@{" ); break;		\
-      case ']':	obstack_sgrow (Obstack, "@}" ); break;		\
-      default: obstack_1grow (Obstack, *p); break;		\
-      }								\
-}
-
-#define MUSCLE_INSERT_C_STRING(Key, Value)			\
-{								\
-  MUSCLE_OBSTACK_SGROW (&muscle_obstack,			\
-			quotearg_style (c_quoting_style,	\
-					Value));		\
-  obstack_1grow (&muscle_obstack, 0);				\
-  muscle_insert (Key, obstack_finish (&muscle_obstack));	\
-}
-
-/* Insert (KEY, VALUE).  If KEY already existed, overwrite the
-   previous value.  Uses MUSCLE_OBSTACK.  De-allocates the previously
-   associated value.  VALUE and SEPARATOR are copied.  */
-
-void muscle_grow (const char *key, const char *value, const char *separator);
-
-
-/* Append VALUE to the current value of KEY, using muscle_grow.  But
-   in addition, issue a synchronization line for the location LOC.  */
-
-void muscle_code_grow (const char *key, const char *value, location loc);
-
-
-/* MUSCLE is an M4 list of pairs.  Create or extend it with the pair
-   (A1, A2).  Note that because the muscle values are output *double*
-   quoted, one needs to strip the first level of quotes to reach the
-   list itself.  */
-
-void muscle_pair_list_grow (const char *muscle,
-			    const char *a1, const char *a2);
-
-void muscles_m4_output (FILE *out);
-
-#endif /* not MUSCLE_TAB_H_ */
diff --git a/src/nullable.c b/src/nullable.c
deleted file mode 100644
index 83a90e9..0000000
--- a/src/nullable.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/* Calculate which nonterminals can expand into the null string for Bison.
-
-   Copyright (C) 1984, 1989, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-   Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-
-/* Set up NULLABLE, a vector saying which nonterminals can expand into
-   the null string.  NULLABLE[I - NTOKENS] is nonzero if symbol I can
-   do so.  */
-
-#include <config.h>
-#include "system.h"
-
-#include "getargs.h"
-#include "gram.h"
-#include "nullable.h"
-#include "reduce.h"
-#include "symtab.h"
-
-/* Linked list of rules.  */
-typedef struct rule_list
-{
-  struct rule_list *next;
-  rule *value;
-} rule_list;
-
-bool *nullable = NULL;
-
-static void
-nullable_print (FILE *out)
-{
-  int i;
-  fputs ("NULLABLE\n", out);
-  for (i = ntokens; i < nsyms; i++)
-    fprintf (out, "\t%s: %s\n", symbols[i]->tag,
-	     nullable[i - ntokens] ? "yes" : "no");
-  fputs ("\n\n", out);
-}
-
-void
-nullable_compute (void)
-{
-  rule_number ruleno;
-  symbol_number *s1;
-  symbol_number *s2;
-  rule_list *p;
-
-  symbol_number *squeue = xnmalloc (nvars, sizeof *squeue);
-  size_t *rcount = xcalloc (nrules, sizeof *rcount);
-  /* RITEM contains all the rules, including useless productions.
-     Hence we must allocate room for useless nonterminals too.  */
-  rule_list **rsets = xcalloc (nvars, sizeof *rsets);
-  /* This is said to be more elements than we actually use.
-     Supposedly NRITEMS - NRULES is enough.  But why take the risk?  */
-  rule_list *relts = xnmalloc (nritems + nvars + 1, sizeof *relts);
-
-  nullable = xcalloc (nvars, sizeof *nullable);
-
-  s1 = s2 = squeue;
-  p = relts;
-
-  for (ruleno = 0; ruleno < nrules; ++ruleno)
-    if (rules[ruleno].useful)
-      {
-	rule *rules_ruleno = &rules[ruleno];
-	if (rules_ruleno->rhs[0] >= 0)
-	  {
-	    /* This rule has a non empty RHS. */
-	    item_number *rp = NULL;
-	    bool any_tokens = false;
-	    for (rp = rules_ruleno->rhs; *rp >= 0; ++rp)
-	      if (ISTOKEN (*rp))
-		any_tokens = true;
-
-	    /* This rule has only nonterminals: schedule it for the second
-	       pass.  */
-	    if (!any_tokens)
-	      for (rp = rules_ruleno->rhs; *rp >= 0; ++rp)
-		{
-		  rcount[ruleno]++;
-		  p->next = rsets[*rp - ntokens];
-		  p->value = rules_ruleno;
-		  rsets[*rp - ntokens] = p;
-		  p++;
-		}
-	  }
-	else
-	  {
-	    /* This rule has an empty RHS. */
-	    assert (item_number_as_rule_number (rules_ruleno->rhs[0])
-		    == ruleno);
-	    if (rules_ruleno->useful
-		&& ! nullable[rules_ruleno->lhs->number - ntokens])
-	      {
-		nullable[rules_ruleno->lhs->number - ntokens] = true;
-		*s2++ = rules_ruleno->lhs->number;
-	      }
-	  }
-      }
-
-  while (s1 < s2)
-    for (p = rsets[*s1++ - ntokens]; p; p = p->next)
-      {
-	rule *r = p->value;
-	if (--rcount[r->number] == 0)
-	  if (r->useful && ! nullable[r->lhs->number - ntokens])
-	    {
-	      nullable[r->lhs->number - ntokens] = true;
-	      *s2++ = r->lhs->number;
-	    }
-      }
-
-  free (squeue);
-  free (rcount);
-  free (rsets);
-  free (relts);
-
-  if (trace_flag & trace_sets)
-    nullable_print (stderr);
-}
-
-
-void
-nullable_free (void)
-{
-  free (nullable);
-}
diff --git a/src/nullable.h b/src/nullable.h
deleted file mode 100644
index d5106c7..0000000
--- a/src/nullable.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Part of the bison parser generator,
-   Copyright (C) 2000, 2002 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef NULLABLE_H_
-# define NULLABLE_H_
-
-/* A vector saying which nonterminals can expand into the null string.
-   NULLABLE[I - NTOKENS] is nonzero if symbol I can do so.  */
-extern bool *nullable;
-
-/* Set up NULLABLE. */
-extern void nullable_compute (void);
-
-/* Free NULLABLE. */
-extern void nullable_free (void);
-#endif /* !NULLABLE_H_ */
diff --git a/src/output.c b/src/output.c
deleted file mode 100644
index 6a02bb3..0000000
--- a/src/output.c
+++ /dev/null
@@ -1,652 +0,0 @@
-/* Output the generated parsing program for Bison.
-
-   Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004,
-   2005, 2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <error.h>
-#include <get-errno.h>
-#include <quotearg.h>
-#include <subpipe.h>
-#include <timevar.h>
-
-#include "complain.h"
-#include "files.h"
-#include "getargs.h"
-#include "gram.h"
-#include "muscle_tab.h"
-#include "output.h"
-#include "reader.h"
-#include "scan-skel.h"
-#include "symtab.h"
-#include "tables.h"
-
-
-static struct obstack format_obstack;
-
-
-/*-------------------------------------------------------------------.
-| Create a function NAME which associates to the muscle NAME the     |
-| result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of |
-| TYPE), and to the muscle NAME_max, the max value of the            |
-| TABLE_DATA.                                                        |
-`-------------------------------------------------------------------*/
-
-
-#define GENERATE_MUSCLE_INSERT_TABLE(Name, Type)			\
-									\
-static void								\
-Name (char const *name,							\
-      Type *table_data,							\
-      Type first,							\
-      int begin,							\
-      int end)								\
-{									\
-  Type min = first;							\
-  Type max = first;							\
-  long int lmin;							\
-  long int lmax;							\
-  int i;								\
-  int j = 1;								\
-									\
-  obstack_fgrow1 (&format_obstack, "%6d", first);			\
-  for (i = begin; i < end; ++i)						\
-    {									\
-      obstack_1grow (&format_obstack, ',');				\
-      if (j >= 10)							\
-	{								\
-	  obstack_sgrow (&format_obstack, "\n  ");			\
-	  j = 1;							\
-	}								\
-      else								\
-	++j;								\
-      obstack_fgrow1 (&format_obstack, "%6d", table_data[i]);		\
-      if (table_data[i] < min)						\
-	min = table_data[i];						\
-      if (max < table_data[i])						\
-	max = table_data[i];						\
-    }									\
-  obstack_1grow (&format_obstack, 0);					\
-  muscle_insert (name, obstack_finish (&format_obstack));		\
-									\
-  lmin = min;								\
-  lmax = max;								\
-  /* Build `NAME_min' and `NAME_max' in the obstack. */			\
-  obstack_fgrow1 (&format_obstack, "%s_min", name);			\
-  obstack_1grow (&format_obstack, 0);					\
-  MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmin);	\
-  obstack_fgrow1 (&format_obstack, "%s_max", name);			\
-  obstack_1grow (&format_obstack, 0);					\
-  MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmax);	\
-}
-
-GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table, unsigned int)
-GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_int_table, int)
-GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_base_table, base_number)
-GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_rule_number_table, rule_number)
-GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table, symbol_number)
-GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table, item_number)
-GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number)
-
-
-/*--------------------------------------------------------------------.
-| Print to OUT a representation of STRING escaped both for C and M4.  |
-`--------------------------------------------------------------------*/
-
-static void
-escaped_output (FILE *out, char const *string)
-{
-  char const *p;
-  fprintf (out, "[[");
-
-  for (p = quotearg_style (c_quoting_style, string); *p; p++)
-    switch (*p)
-      {
-      case '$': fputs ("$][", out); break;
-      case '@': fputs ("@@",  out); break;
-      case '[': fputs ("@{",  out); break;
-      case ']': fputs ("@}",  out); break;
-      default: fputc (*p, out); break;
-      }
-
-  fprintf (out, "]]");
-}
-
-
-/*------------------------------------------------------------------.
-| Prepare the muscles related to the symbols: translate, tname, and |
-| toknum.                                                           |
-`------------------------------------------------------------------*/
-
-static void
-prepare_symbols (void)
-{
-  MUSCLE_INSERT_BOOL ("token_table", token_table_flag);
-  MUSCLE_INSERT_INT ("tokens_number", ntokens);
-  MUSCLE_INSERT_INT ("nterms_number", nvars);
-  MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
-  MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
-
-  muscle_insert_symbol_number_table ("translate",
-				     token_translations,
-				     token_translations[0],
-				     1, max_user_token_number + 1);
-
-  /* tname -- token names.  */
-  {
-    int i;
-    /* We assume that the table will be output starting at column 2. */
-    int j = 2;
-    for (i = 0; i < nsyms; i++)
-      {
-	char const *cp = quotearg_style (c_quoting_style, symbols[i]->tag);
-	/* Width of the next token, including the two quotes, the
-	   comma and the space.  */
-	int width = strlen (cp) + 2;
-
-	if (j + width > 75)
-	  {
-	    obstack_sgrow (&format_obstack, "\n ");
-	    j = 1;
-	  }
-
-	if (i)
-	  obstack_1grow (&format_obstack, ' ');
-	MUSCLE_OBSTACK_SGROW (&format_obstack, cp);
-	obstack_1grow (&format_obstack, ',');
-	j += width;
-      }
-    /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
-       defined).  */
-    obstack_sgrow (&format_obstack, " 0");
-
-    /* Finish table and store. */
-    obstack_1grow (&format_obstack, 0);
-    muscle_insert ("tname", obstack_finish (&format_obstack));
-  }
-
-  /* Output YYTOKNUM. */
-  {
-    int i;
-    int *values = xnmalloc (ntokens, sizeof *values);
-    for (i = 0; i < ntokens; ++i)
-      values[i] = symbols[i]->user_token_number;
-    muscle_insert_int_table ("toknum", values,
-			     values[0], 1, ntokens);
-    free (values);
-  }
-}
-
-
-/*-------------------------------------------------------------.
-| Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
-| rline, dprec, merger.                                        |
-`-------------------------------------------------------------*/
-
-static void
-prepare_rules (void)
-{
-  rule_number r;
-  unsigned int i = 0;
-  item_number *rhs = xnmalloc (nritems, sizeof *rhs);
-  unsigned int *prhs = xnmalloc (nrules, sizeof *prhs);
-  unsigned int *rline = xnmalloc (nrules, sizeof *rline);
-  symbol_number *r1 = xnmalloc (nrules, sizeof *r1);
-  unsigned int *r2 = xnmalloc (nrules, sizeof *r2);
-  int *dprec = xnmalloc (nrules, sizeof *dprec);
-  int *merger = xnmalloc (nrules, sizeof *merger);
-
-  for (r = 0; r < nrules; ++r)
-    {
-      item_number *rhsp = NULL;
-      /* Index of rule R in RHS. */
-      prhs[r] = i;
-      /* RHS of the rule R. */
-      for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
-	rhs[i++] = *rhsp;
-      /* LHS of the rule R. */
-      r1[r] = rules[r].lhs->number;
-      /* Length of rule R's RHS. */
-      r2[r] = i - prhs[r];
-      /* Separator in RHS. */
-      rhs[i++] = -1;
-      /* Line where rule was defined. */
-      rline[r] = rules[r].location.start.line;
-      /* Dynamic precedence (GLR).  */
-      dprec[r] = rules[r].dprec;
-      /* Merger-function index (GLR).  */
-      merger[r] = rules[r].merger;
-    }
-  assert (i == nritems);
-
-  muscle_insert_item_number_table ("rhs", rhs, ritem[0], 1, nritems);
-  muscle_insert_unsigned_int_table ("prhs", prhs, 0, 0, nrules);
-  muscle_insert_unsigned_int_table ("rline", rline, 0, 0, nrules);
-  muscle_insert_symbol_number_table ("r1", r1, 0, 0, nrules);
-  muscle_insert_unsigned_int_table ("r2", r2, 0, 0, nrules);
-  muscle_insert_int_table ("dprec", dprec, 0, 0, nrules);
-  muscle_insert_int_table ("merger", merger, 0, 0, nrules);
-
-  MUSCLE_INSERT_INT ("rules_number", nrules);
-  MUSCLE_INSERT_INT ("max_left_semantic_context", max_left_semantic_context);
-
-  free (rhs);
-  free (prhs);
-  free (rline);
-  free (r1);
-  free (r2);
-  free (dprec);
-  free (merger);
-}
-
-/*--------------------------------------------.
-| Prepare the muscles related to the states.  |
-`--------------------------------------------*/
-
-static void
-prepare_states (void)
-{
-  state_number i;
-  symbol_number *values = xnmalloc (nstates, sizeof *values);
-  for (i = 0; i < nstates; ++i)
-    values[i] = states[i]->accessing_symbol;
-  muscle_insert_symbol_number_table ("stos", values,
-				     0, 1, nstates);
-  free (values);
-
-  MUSCLE_INSERT_INT ("last", high);
-  MUSCLE_INSERT_INT ("final_state_number", final_state->number);
-  MUSCLE_INSERT_INT ("states_number", nstates);
-}
-
-
-
-/*---------------------------------.
-| Output the user actions to OUT.  |
-`---------------------------------*/
-
-static void
-user_actions_output (FILE *out)
-{
-  rule_number r;
-
-  fputs ("m4_define([b4_actions], \n[[", out);
-  for (r = 0; r < nrules; ++r)
-    if (rules[r].action)
-      {
-	fprintf (out, "  case %d:\n", r + 1);
-
-	fprintf (out, "]b4_syncline(%d, ",
-		 rules[r].action_location.start.line);
-	escaped_output (out, rules[r].action_location.start.file);
-	fprintf (out, ")[\n");
-	fprintf (out, "    %s\n    break;\n\n",
-		 rules[r].action);
-      }
-  fputs ("]])\n\n", out);
-}
-
-/*--------------------------------------.
-| Output the merge functions to OUT.   |
-`--------------------------------------*/
-
-static void
-merger_output (FILE *out)
-{
-  int n;
-  merger_list* p;
-
-  fputs ("m4_define([b4_mergers], \n[[", out);
-  for (n = 1, p = merge_functions; p != NULL; n += 1, p = p->next)
-    {
-      if (p->type[0] == '\0')
-	fprintf (out, "  case %d: *yy0 = %s (*yy0, *yy1); break;\n",
-		 n, p->name);
-      else
-	fprintf (out, "  case %d: yy0->%s = %s (*yy0, *yy1); break;\n",
-		 n, p->type, p->name);
-    }
-  fputs ("]])\n\n", out);
-}
-
-/*--------------------------------------.
-| Output the tokens definition to OUT.  |
-`--------------------------------------*/
-
-static void
-token_definitions_output (FILE *out)
-{
-  int i;
-  char const *sep = "";
-
-  fputs ("m4_define([b4_tokens], \n[", out);
-  for (i = 0; i < ntokens; ++i)
-    {
-      symbol *sym = symbols[i];
-      int number = sym->user_token_number;
-
-      /* At this stage, if there are literal aliases, they are part of
-	 SYMBOLS, so we should not find symbols which are the aliases
-	 here.  */
-      assert (number != USER_NUMBER_ALIAS);
-
-      /* Skip error token.  */
-      if (sym == errtoken)
-	continue;
-
-      /* If this string has an alias, then it is necessarily the alias
-	 which is to be output.  */
-      if (sym->alias)
-	sym = sym->alias;
-
-      /* Don't output literal chars or strings (when defined only as a
-	 string).  Note that must be done after the alias resolution:
-	 think about `%token 'f' "f"'.  */
-      if (sym->tag[0] == '\'' || sym->tag[0] == '\"')
-	continue;
-
-      /* Don't #define nonliteral tokens whose names contain periods
-	 or '$' (as does the default value of the EOF token).  */
-      if (strchr (sym->tag, '.') || strchr (sym->tag, '$'))
-	continue;
-
-      fprintf (out, "%s[[[%s]], %d]",
-	       sep, sym->tag, number);
-      sep = ",\n";
-    }
-  fputs ("])\n\n", out);
-}
-
-
-/*---------------------------------------.
-| Output the symbol destructors to OUT.  |
-`---------------------------------------*/
-
-static void
-symbol_destructors_output (FILE *out)
-{
-  int i;
-  char const *sep = "";
-
-  fputs ("m4_define([b4_symbol_destructors], \n[", out);
-  for (i = 0; i < nsyms; ++i)
-    if (symbols[i]->destructor)
-      {
-	symbol *sym = symbols[i];
-
-	/* Filename, lineno,
-	   Symbol-name, Symbol-number,
-	   destructor, optional typename.  */
-	fprintf (out, "%s[", sep);
-	sep = ",\n";
-	escaped_output (out, sym->destructor_location.start.file);
-	fprintf (out, ", %d, ", sym->destructor_location.start.line);
-	escaped_output (out, sym->tag);
-	fprintf (out, ", %d, [[%s]]", sym->number, sym->destructor);
-	if (sym->type_name)
-	  fprintf (out, ", [[%s]]", sym->type_name);
-	fputc (']', out);
-      }
-  fputs ("])\n\n", out);
-}
-
-
-/*------------------------------------.
-| Output the symbol printers to OUT.  |
-`------------------------------------*/
-
-static void
-symbol_printers_output (FILE *out)
-{
-  int i;
-  char const *sep = "";
-
-  fputs ("m4_define([b4_symbol_printers], \n[", out);
-  for (i = 0; i < nsyms; ++i)
-    if (symbols[i]->printer)
-      {
-	symbol *sym = symbols[i];
-
-	/* Filename, lineno,
-	   Symbol-name, Symbol-number,
-	   printer, optional typename.  */
-	fprintf (out, "%s[", sep);
-	sep = ",\n";
-	escaped_output (out, sym->printer_location.start.file);
-	fprintf (out, ", %d, ", sym->printer_location.start.line);
-	escaped_output (out, sym->tag);
-	fprintf (out, ", %d, [[%s]]", sym->number, sym->printer);
-	if (sym->type_name)
-	  fprintf (out, ", [[%s]]", sym->type_name);
-	fputc (']', out);
-      }
-  fputs ("])\n\n", out);
-}
-
-
-static void
-prepare_actions (void)
-{
-  /* Figure out the actions for the specified state, indexed by
-     look-ahead token type.  */
-
-  muscle_insert_rule_number_table ("defact", yydefact,
-				   yydefact[0], 1, nstates);
-
-  /* Figure out what to do after reducing with each rule, depending on
-     the saved state from before the beginning of parsing the data
-     that matched this rule.  */
-  muscle_insert_state_number_table ("defgoto", yydefgoto,
-				    yydefgoto[0], 1, nsyms - ntokens);
-
-
-  /* Output PACT. */
-  muscle_insert_base_table ("pact", base,
-			     base[0], 1, nstates);
-  MUSCLE_INSERT_INT ("pact_ninf", base_ninf);
-
-  /* Output PGOTO. */
-  muscle_insert_base_table ("pgoto", base,
-			     base[nstates], nstates + 1, nvectors);
-
-  muscle_insert_base_table ("table", table,
-			    table[0], 1, high + 1);
-  MUSCLE_INSERT_INT ("table_ninf", table_ninf);
-
-  muscle_insert_base_table ("check", check,
-			    check[0], 1, high + 1);
-
-  /* GLR parsing slightly modifies YYTABLE and YYCHECK (and thus
-     YYPACT) so that in states with unresolved conflicts, the default
-     reduction is not used in the conflicted entries, so that there is
-     a place to put a conflict pointer.
-
-     This means that YYCONFLP and YYCONFL are nonsense for a non-GLR
-     parser, so we could avoid accidents by not writing them out in
-     that case.  Nevertheless, it seems even better to be able to use
-     the GLR skeletons even without the non-deterministic tables.  */
-  muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table,
-				    conflict_table[0], 1, high + 1);
-  muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list,
-				    0, 1, conflict_list_cnt);
-}
-
-
-/*---------------------------.
-| Call the skeleton parser.  |
-`---------------------------*/
-
-static void
-output_skeleton (void)
-{
-  FILE *in;
-  FILE *out;
-  int filter_fd[2];
-  char const *argv[6];
-  pid_t pid;
-
-  /* Compute the names of the package data dir and skeleton file.
-     Test whether m4sugar.m4 is readable, to check for proper
-     installation.  A faulty installation can cause deadlock, so a
-     cheap sanity check is worthwhile.  */
-  char const m4sugar[] = "m4sugar/m4sugar.m4";
-  char *full_m4sugar;
-  char *full_skeleton;
-  char const *p;
-  char const *m4 = (p = getenv ("M4")) ? p : M4;
-  char const *pkgdatadir = (p = getenv ("BISON_PKGDATADIR")) ? p : PKGDATADIR;
-  size_t skeleton_size = strlen (skeleton) + 1;
-  size_t pkgdatadirlen = strlen (pkgdatadir);
-  while (pkgdatadirlen && pkgdatadir[pkgdatadirlen - 1] == '/')
-    pkgdatadirlen--;
-  full_skeleton = xmalloc (pkgdatadirlen + 1
-			   + (skeleton_size < sizeof m4sugar
-			      ? sizeof m4sugar : skeleton_size));
-  strcpy (full_skeleton, pkgdatadir);
-  full_skeleton[pkgdatadirlen] = '/';
-  strcpy (full_skeleton + pkgdatadirlen + 1, m4sugar);
-  full_m4sugar = xstrdup (full_skeleton);
-  strcpy (full_skeleton + pkgdatadirlen + 1, skeleton);
-  xfclose (xfopen (full_m4sugar, "r"));
-
-  /* Create an m4 subprocess connected to us via two pipes.  */
-
-  if (trace_flag & trace_tools)
-    fprintf (stderr, "running: %s %s - %s\n",
-	     m4, full_m4sugar, full_skeleton);
-
-  argv[0] = m4;
-  argv[1] = full_m4sugar;
-  argv[2] = "-";
-  argv[3] = full_skeleton;
-  argv[4] = trace_flag & trace_m4 ? "-dV" : NULL;
-  argv[5] = NULL;
-
-  init_subpipe ();
-  pid = create_subpipe (argv, filter_fd);
-  free (full_m4sugar);
-  free (full_skeleton);
-
-  out = fdopen (filter_fd[0], "w");
-  if (! out)
-    error (EXIT_FAILURE, get_errno (),
-	   "fdopen");
-
-  /* Output the definitions of all the muscles.  */
-  fputs ("m4_init()\n", out);
-
-  user_actions_output (out);
-  merger_output (out);
-  token_definitions_output (out);
-  symbol_destructors_output (out);
-  symbol_printers_output (out);
-
-  muscles_m4_output (out);
-
-  fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
-  fputs ("m4_divert_push(0)dnl\n", out);
-  xfclose (out);
-
-  /* Read and process m4's output.  */
-  timevar_push (TV_M4);
-  end_of_output_subpipe (pid, filter_fd);
-  in = fdopen (filter_fd[1], "r");
-  if (! in)
-    error (EXIT_FAILURE, get_errno (),
-	   "fdopen");
-  scan_skel (in);
-  xfclose (in);
-  reap_subpipe (pid, m4);
-  timevar_pop (TV_M4);
-}
-
-static void
-prepare (void)
-{
-  /* Flags. */
-  MUSCLE_INSERT_BOOL ("debug_flag", debug_flag);
-  MUSCLE_INSERT_BOOL ("defines_flag", defines_flag);
-  MUSCLE_INSERT_BOOL ("error_verbose_flag", error_verbose);
-  MUSCLE_INSERT_BOOL ("locations_flag", locations_flag);
-  MUSCLE_INSERT_BOOL ("pure_flag", pure_parser);
-  MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag);
-
-  /* File names.  */
-  MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
-#define DEFINE(Name) MUSCLE_INSERT_STRING (#Name, Name ? Name : "")
-  DEFINE (dir_prefix);
-  DEFINE (parser_file_name);
-  DEFINE (spec_defines_file);
-  DEFINE (spec_file_prefix);
-  DEFINE (spec_graph_file);
-  DEFINE (spec_name_prefix);
-  DEFINE (spec_outfile);
-  DEFINE (spec_verbose_file);
-#undef DEFINE
-
-  /* User Code.  */
-  obstack_1grow (&pre_prologue_obstack, 0);
-  obstack_1grow (&post_prologue_obstack, 0);
-  muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack));
-  muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack));
-
-  /* Find the right skeleton file.  */
-  if (!skeleton)
-    {
-      if (glr_parser || nondeterministic_parser)
-	skeleton = "glr.c";
-      else
-	skeleton = "yacc.c";
-    }
-
-  /* About the skeletons. */
-  {
-    char const *pkgdatadir = getenv ("BISON_PKGDATADIR");
-    MUSCLE_INSERT_STRING ("pkgdatadir", pkgdatadir ? pkgdatadir : PKGDATADIR);
-    MUSCLE_INSERT_C_STRING ("skeleton", skeleton);
-  }
-}
-
-
-/*----------------------------------------------------------.
-| Output the parsing tables and the parser code to ftable.  |
-`----------------------------------------------------------*/
-
-void
-output (void)
-{
-  obstack_init (&format_obstack);
-
-  prepare_symbols ();
-  prepare_rules ();
-  prepare_states ();
-  prepare_actions ();
-
-  prepare ();
-
-  /* Process the selected skeleton file.  */
-  output_skeleton ();
-
-  obstack_free (&format_obstack, NULL);
-  obstack_free (&pre_prologue_obstack, NULL);
-  obstack_free (&post_prologue_obstack, NULL);
-}
diff --git a/src/output.h b/src/output.h
deleted file mode 100644
index 784f227..0000000
--- a/src/output.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Output the generated parsing program for bison,
-   Copyright (C) 2000, 2001, 2002, 2003, 2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
-
-#ifndef OUTPUT_H_
-# define OUTPUT_H_
-
-/* Output the parsing tables and the parser code to FTABLE.  */
-void output (void);
-
-#endif /* !OUTPUT_H_ */
diff --git a/src/parse-gram.c b/src/parse-gram.c
deleted file mode 100644
index 2b77f3e..0000000
--- a/src/parse-gram.c
+++ /dev/null
@@ -1,2485 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.2a.  */
-
-/* Skeleton implementation for Bison's Yacc-like parsers in C
-
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-   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.  */
-
-/* As a special exception, you may create a larger work that contains
-   part or all of the Bison parser skeleton and distribute that work
-   under terms of your choice, so long as that work isn't itself a
-   parser generator using the skeleton or a modified version thereof
-   as a parser skeleton.  Alternatively, if you modify or redistribute
-   the parser skeleton itself, you may (at your option) remove this
-   special exception, which will cause the skeleton and the resulting
-   Bison output files to be licensed under the GNU General Public
-   License without this special exception.
-
-   This special exception was added by the Free Software Foundation in
-   version 2.2 of Bison.  */
-
-/* C LALR(1) parser skeleton written by Richard Stallman, by
-   simplifying the original so-called "semantic" parser.  */
-
-/* All symbols defined below should begin with yy or YY, to avoid
-   infringing on user name space.  This should be done even for local
-   variables, as they might otherwise be expanded by user macros.
-   There are some unavoidable exceptions within include files to
-   define necessary library symbols; they are noted "INFRINGES ON
-   USER NAME SPACE" below.  */
-
-/* Identify Bison output.  */
-#define YYBISON 1
-
-/* Bison version.  */
-#define YYBISON_VERSION "2.2a"
-
-/* Skeleton name.  */
-#define YYSKELETON_NAME "yacc.c"
-
-/* Pure parsers.  */
-#define YYPURE 1
-
-/* Using locations.  */
-#define YYLSP_NEEDED 1
-
-/* Substitute the variable and function names.  */
-#define yyparse gram_parse
-#define yylex   gram_lex
-#define yyerror gram_error
-#define yylval  gram_lval
-#define yychar  gram_char
-#define yydebug gram_debug
-#define yynerrs gram_nerrs
-#define yylloc gram_lloc
-
-/* Tokens.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     GRAM_EOF = 0,
-     STRING = 258,
-     INT = 259,
-     PERCENT_TOKEN = 260,
-     PERCENT_NTERM = 261,
-     PERCENT_TYPE = 262,
-     PERCENT_DESTRUCTOR = 263,
-     PERCENT_PRINTER = 264,
-     PERCENT_UNION = 265,
-     PERCENT_LEFT = 266,
-     PERCENT_RIGHT = 267,
-     PERCENT_NONASSOC = 268,
-     PERCENT_PREC = 269,
-     PERCENT_DPREC = 270,
-     PERCENT_MERGE = 271,
-     PERCENT_DEBUG = 272,
-     PERCENT_DEFAULT_PREC = 273,
-     PERCENT_DEFINE = 274,
-     PERCENT_DEFINES = 275,
-     PERCENT_ERROR_VERBOSE = 276,
-     PERCENT_EXPECT = 277,
-     PERCENT_EXPECT_RR = 278,
-     PERCENT_FILE_PREFIX = 279,
-     PERCENT_GLR_PARSER = 280,
-     PERCENT_INITIAL_ACTION = 281,
-     PERCENT_LEX_PARAM = 282,
-     PERCENT_LOCATIONS = 283,
-     PERCENT_NAME_PREFIX = 284,
-     PERCENT_NO_DEFAULT_PREC = 285,
-     PERCENT_NO_LINES = 286,
-     PERCENT_NONDETERMINISTIC_PARSER = 287,
-     PERCENT_OUTPUT = 288,
-     PERCENT_PARSE_PARAM = 289,
-     PERCENT_PURE_PARSER = 290,
-     PERCENT_REQUIRE = 291,
-     PERCENT_SKELETON = 292,
-     PERCENT_START = 293,
-     PERCENT_TOKEN_TABLE = 294,
-     PERCENT_VERBOSE = 295,
-     PERCENT_YACC = 296,
-     TYPE = 297,
-     EQUAL = 298,
-     SEMICOLON = 299,
-     PIPE = 300,
-     ID = 301,
-     ID_COLON = 302,
-     PERCENT_PERCENT = 303,
-     PROLOGUE = 304,
-     EPILOGUE = 305,
-     BRACED_CODE = 306
-   };
-#endif
-/* Tokens.  */
-#define GRAM_EOF 0
-#define STRING 258
-#define INT 259
-#define PERCENT_TOKEN 260
-#define PERCENT_NTERM 261
-#define PERCENT_TYPE 262
-#define PERCENT_DESTRUCTOR 263
-#define PERCENT_PRINTER 264
-#define PERCENT_UNION 265
-#define PERCENT_LEFT 266
-#define PERCENT_RIGHT 267
-#define PERCENT_NONASSOC 268
-#define PERCENT_PREC 269
-#define PERCENT_DPREC 270
-#define PERCENT_MERGE 271
-#define PERCENT_DEBUG 272
-#define PERCENT_DEFAULT_PREC 273
-#define PERCENT_DEFINE 274
-#define PERCENT_DEFINES 275
-#define PERCENT_ERROR_VERBOSE 276
-#define PERCENT_EXPECT 277
-#define PERCENT_EXPECT_RR 278
-#define PERCENT_FILE_PREFIX 279
-#define PERCENT_GLR_PARSER 280
-#define PERCENT_INITIAL_ACTION 281
-#define PERCENT_LEX_PARAM 282
-#define PERCENT_LOCATIONS 283
-#define PERCENT_NAME_PREFIX 284
-#define PERCENT_NO_DEFAULT_PREC 285
-#define PERCENT_NO_LINES 286
-#define PERCENT_NONDETERMINISTIC_PARSER 287
-#define PERCENT_OUTPUT 288
-#define PERCENT_PARSE_PARAM 289
-#define PERCENT_PURE_PARSER 290
-#define PERCENT_REQUIRE 291
-#define PERCENT_SKELETON 292
-#define PERCENT_START 293
-#define PERCENT_TOKEN_TABLE 294
-#define PERCENT_VERBOSE 295
-#define PERCENT_YACC 296
-#define TYPE 297
-#define EQUAL 298
-#define SEMICOLON 299
-#define PIPE 300
-#define ID 301
-#define ID_COLON 302
-#define PERCENT_PERCENT 303
-#define PROLOGUE 304
-#define EPILOGUE 305
-#define BRACED_CODE 306
-
-
-
-
-/* Copy the first part of user declarations.  */
-#line 1 "parse-gram.y"
-/* Bison Grammar Parser                             -*- C -*-
-
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   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 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, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301  USA
-*/
-
-#include <config.h>
-#include "system.h"
-
-#include "complain.h"
-#include "conflicts.h"
-#include "files.h"
-#include "getargs.h"
-#include "gram.h"
-#include "muscle_tab.h"
-#include "quotearg.h"
-#include "reader.h"
-#include "symlist.h"
-#include "strverscmp.h"
-
-#define YYLLOC_DEFAULT(Current, Rhs, N)  (Current) = lloc_default (Rhs, N)
-static YYLTYPE lloc_default (YYLTYPE const *, int);
-
-#define YY_LOCATION_PRINT(File, Loc) \
-	  location_print (File, Loc)
-
-static void version_check (location const *loc, char const *version);
-
-/* Request detailed syntax error messages, and pass them to GRAM_ERROR.
-   FIXME: depends on the undocumented availability of YYLLOC.  */
-#undef  yyerror
-#define yyerror(Msg) \
-	gram_error (&yylloc, Msg)
-static void gram_error (location const *, char const *);
-
-static void add_param (char const *, char *, location);
-
-static symbol_class current_class = unknown_sym;
-static uniqstr current_type = 0;
-static symbol *current_lhs;
-static location current_lhs_location;
-static int current_prec = 0;
-
-#ifdef UINT_FAST8_MAX
-# define YYTYPE_UINT8 uint_fast8_t
-#endif
-#ifdef INT_FAST8_MAX
-# define YYTYPE_INT8 int_fast8_t
-#endif
-#ifdef UINT_FAST16_MAX
-# define YYTYPE_UINT16 uint_fast16_t
-#endif
-#ifdef INT_FAST16_MAX
-# define YYTYPE_INT16 int_fast16_t
-#endif
-
-
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 1
-#endif
-
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 1
-#endif
-
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
-#endif
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 94 "parse-gram.y"
-{
-  symbol *symbol;
-  symbol_list *list;
-  int integer;
-  char *chars;
-  assoc assoc;
-  uniqstr uniqstr;
-}
-/* Line 193 of yacc.c.  */
-#line 290 "parse-gram.c"
-	YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
-typedef struct YYLTYPE
-{
-  int first_line;
-  int first_column;
-  int last_line;
-  int last_column;
-} YYLTYPE;
-# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
-# define YYLTYPE_IS_DECLARED 1
-# define YYLTYPE_IS_TRIVIAL 1
-#endif
-
-
-/* Copy the second part of user declarations.  */
-
-
-/* Line 216 of yacc.c.  */
-#line 315 "parse-gram.c"
-
-#ifdef short
-# undef short
-#endif
-
-#ifdef YYTYPE_UINT8
-typedef YYTYPE_UINT8 yytype_uint8;
-#else
-typedef unsigned char yytype_uint8;
-#endif
-
-#ifdef YYTYPE_INT8
-typedef YYTYPE_INT8 yytype_int8;
-#elif (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-typedef signed char yytype_int8;
-#else
-typedef short int yytype_int8;
-#endif
-
-#ifdef YYTYPE_UINT16
-typedef YYTYPE_UINT16 yytype_uint16;
-#else
-typedef unsigned short int yytype_uint16;
-#endif
-
-#ifdef YYTYPE_INT16
-typedef YYTYPE_INT16 yytype_int16;
-#else
-typedef short int yytype_int16;
-#endif
-
-#ifndef YYSIZE_T
-# ifdef __SIZE_TYPE__
-#  define YYSIZE_T __SIZE_TYPE__
-# elif defined size_t
-#  define YYSIZE_T size_t
-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-#  define YYSIZE_T size_t
-# else
-#  define YYSIZE_T unsigned int
-# endif
-#endif
-
-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
-
-#ifndef YY_
-# if YYENABLE_NLS
-#  if ENABLE_NLS
-#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-#   define YY_(msgid) dgettext ("bison-runtime", msgid)
-#  endif
-# endif
-# ifndef YY_
-#  define YY_(msgid) msgid
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E.  */
-#if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
-#else
-# define YYUSE(e) /* empty */
-#endif
-
-/* Identity function, used to suppress warnings about constant conditions.  */
-#ifndef lint
-# define YYID(n) (n)
-#else
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static int
-YYID (int i)
-#else
-static int
-YYID (i)
-    int i;
-#endif
-{
-  return i;
-}
-#endif
-
-#if ! defined yyoverflow || YYERROR_VERBOSE
-
-/* The parser invokes alloca or malloc; define the necessary symbols.  */
-
-# ifdef YYSTACK_USE_ALLOCA
-#  if YYSTACK_USE_ALLOCA
-#   ifdef __GNUC__
-#    define YYSTACK_ALLOC __builtin_alloca
-#   elif defined __BUILTIN_VA_ARG_INCR
-#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
-#   elif defined _AIX
-#    define YYSTACK_ALLOC __alloca
-#   elif defined _MSC_VER
-#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
-#    define alloca _alloca
-#   else
-#    define YYSTACK_ALLOC alloca
-#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#     ifndef _STDLIB_H
-#      define _STDLIB_H 1
-#     endif
-#    endif
-#   endif
-#  endif
-# endif
-
-# ifdef YYSTACK_ALLOC
-   /* Pacify GCC's `empty if-body' warning.  */
-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
-#  ifndef YYSTACK_ALLOC_MAXIMUM
-    /* The OS might guarantee only one guard page at the bottom of the stack,
-       and a page size can be as small as 4096 bytes.  So we cannot safely
-       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
-       to allow for a few compiler-allocated temporary stack slots.  */
-#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
-#  endif
-# else
-#  define YYSTACK_ALLOC YYMALLOC
-#  define YYSTACK_FREE YYFREE
-#  ifndef YYSTACK_ALLOC_MAXIMUM
-#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
-#  endif
-#  if (defined __cplusplus && ! defined _STDLIB_H \
-       && ! ((defined YYMALLOC || defined malloc) \
-	     && (defined YYFREE || defined free)))
-#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#   ifndef _STDLIB_H
-#    define _STDLIB_H 1
-#   endif
-#  endif
-#  ifndef YYMALLOC
-#   define YYMALLOC malloc
-#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-#   endif
-#  endif
-#  ifndef YYFREE
-#   define YYFREE free
-#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-void free (void *); /* INFRINGES ON USER NAME SPACE */
-#   endif
-#  endif
-# endif
-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
-
-
-#if (! defined yyoverflow \
-     && (! defined __cplusplus \
-	 || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
-	     && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member.  */
-union yyalloc
-{
-  yytype_int16 yyss;
-  YYSTYPE yyvs;
-    YYLTYPE yyls;
-};
-
-/* The size of the maximum gap between one aligned stack and the next.  */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
-   N elements.  */
-# define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
-      + 2 * YYSTACK_GAP_MAXIMUM)
-
-/* Copy COUNT objects from FROM to TO.  The source and destination do
-   not overlap.  */
-# ifndef YYCOPY
-#  if defined __GNUC__ && 1 < __GNUC__
-#   define YYCOPY(To, From, Count) \
-      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-#  else
-#   define YYCOPY(To, From, Count)		\
-      do					\
-	{					\
-	  YYSIZE_T yyi;				\
-	  for (yyi = 0; yyi < (Count); yyi++)	\
-	    (To)[yyi] = (From)[yyi];		\
-	}					\
-      while (YYID (0))
-#  endif
-# endif
-
-/* Relocate STACK from its old location to the new one.  The
-   local variables YYSIZE and YYSTACKSIZE give the old and new number of
-   elements in the stack, and YYPTR gives the new location of the
-   stack.  Advance YYPTR to a properly aligned location for the next
-   stack.  */
-# define YYSTACK_RELOCATE(Stack)					\
-    do									\
-      {									\
-	YYSIZE_T yynewbytes;						\
-	YYCOPY (&yyptr->Stack, Stack, yysize);				\
-	Stack = &yyptr->Stack;						\
-	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-	yyptr += yynewbytes / sizeof (*yyptr);				\
-      }									\
-    while (YYID (0))
-
-#endif
-
-/* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  3
-/* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   161
-
-/* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  52
-/* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  26
-/* YYNRULES -- Number of rules.  */
-#define YYNRULES  82
-/* YYNRULES -- Number of states.  */
-#define YYNSTATES  111
-
-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
-#define YYUNDEFTOK  2
-#define YYMAXUTOK   306
-
-#define YYTRANSLATE(YYX)						\
-  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
-static const yytype_uint8 yytranslate[] =
-{
-       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     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
-};
-
-#if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-   YYRHS.  */
-static const yytype_uint8 yyprhs[] =
-{
-       0,     0,     3,     8,     9,    12,    14,    16,    18,    21,
-      25,    27,    29,    32,    35,    39,    41,    43,    45,    47,
-      51,    53,    55,    59,    61,    63,    66,    69,    71,    73,
-      75,    77,    79,    81,    84,    86,    89,    92,    94,    96,
-      97,   101,   102,   106,   110,   114,   116,   118,   120,   121,
-     123,   125,   128,   130,   132,   135,   138,   142,   144,   147,
-     149,   152,   154,   157,   160,   161,   165,   167,   171,   174,
-     175,   178,   181,   185,   189,   193,   195,   197,   198,   201,
-     203,   205,   206
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
-static const yytype_int8 yyrhs[] =
-{
-      53,     0,    -1,    54,    48,    66,    77,    -1,    -1,    54,
-      55,    -1,    56,    -1,    49,    -1,    17,    -1,    19,    76,
-      -1,    19,    76,    76,    -1,    20,    -1,    21,    -1,    22,
-       4,    -1,    23,     4,    -1,    24,    43,    76,    -1,    25,
-      -1,    26,    -1,    27,    -1,    28,    -1,    29,    43,    76,
-      -1,    31,    -1,    32,    -1,    33,    43,    76,    -1,    34,
-      -1,    35,    -1,    36,    76,    -1,    37,    76,    -1,    39,
-      -1,    40,    -1,    41,    -1,    44,    -1,    60,    -1,    57,
-      -1,    38,    72,    -1,    10,    -1,     8,    63,    -1,     9,
-      63,    -1,    18,    -1,    30,    -1,    -1,     6,    58,    65,
-      -1,    -1,     5,    59,    65,    -1,     7,    42,    63,    -1,
-      61,    62,    63,    -1,    11,    -1,    12,    -1,    13,    -1,
-      -1,    42,    -1,    72,    -1,    63,    72,    -1,    42,    -1,
-      46,    -1,    46,     4,    -1,    46,    75,    -1,    46,     4,
-      75,    -1,    64,    -1,    65,    64,    -1,    67,    -1,    66,
-      67,    -1,    68,    -1,    56,    44,    -1,     1,    44,    -1,
-      -1,    47,    69,    70,    -1,    71,    -1,    70,    45,    71,
-      -1,    70,    44,    -1,    -1,    71,    72,    -1,    71,    73,
-      -1,    71,    14,    72,    -1,    71,    15,     4,    -1,    71,
-      16,    42,    -1,    46,    -1,    75,    -1,    -1,    74,    51,
-      -1,     3,    -1,     3,    -1,    -1,    48,    50,    -1
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-static const yytype_uint16 yyrline[] =
-{
-       0,   202,   202,   210,   212,   216,   217,   218,   219,   224,
-     225,   226,   227,   228,   229,   230,   235,   239,   240,   241,
-     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,
-     252,   256,   257,   258,   262,   278,   285,   292,   296,   303,
-     303,   308,   308,   313,   323,   338,   339,   340,   344,   345,
-     351,   352,   357,   361,   366,   372,   378,   389,   390,   399,
-     400,   406,   407,   408,   415,   415,   419,   420,   421,   426,
-     427,   429,   430,   432,   434,   439,   440,   456,   456,   462,
-     471,   476,   478
-};
-#endif
-
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
-static const char *const yytname[] =
-{
-  "\"end of file\"", "error", "$undefined", "\"string\"", "\"integer\"",
-  "\"%token\"", "\"%nterm\"", "\"%type\"", "\"%destructor {...}\"",
-  "\"%printer {...}\"", "\"%union {...}\"", "\"%left\"", "\"%right\"",
-  "\"%nonassoc\"", "\"%prec\"", "\"%dprec\"", "\"%merge\"", "\"%debug\"",
-  "\"%default-prec\"", "\"%define\"", "\"%defines\"", "\"%error-verbose\"",
-  "\"%expect\"", "\"%expect-rr\"", "\"%file-prefix\"", "\"%glr-parser\"",
-  "\"%initial-action {...}\"", "\"%lex-param {...}\"", "\"%locations\"",
-  "\"%name-prefix\"", "\"%no-default-prec\"", "\"%no-lines\"",
-  "\"%nondeterministic-parser\"", "\"%output\"", "\"%parse-param {...}\"",
-  "\"%pure-parser\"", "\"%require\"", "\"%skeleton\"", "\"%start\"",
-  "\"%token-table\"", "\"%verbose\"", "\"%yacc\"", "\"type\"", "\"=\"",
-  "\";\"", "\"|\"", "\"identifier\"", "\"identifier:\"", "\"%%\"",
-  "\"%{...%}\"", "\"epilogue\"", "\"{...}\"", "$accept", "input",
-  "declarations", "declaration", "grammar_declaration",
-  "symbol_declaration", "@1", "@2", "precedence_declaration",
-  "precedence_declarator", "type.opt", "symbols.1", "symbol_def",
-  "symbol_defs.1", "grammar", "rules_or_grammar_declaration", "rules",
-  "@3", "rhses.1", "rhs", "symbol", "action", "@4", "string_as_id",
-  "string_content", "epilogue.opt", 0
-};
-#endif
-
-# ifdef YYPRINT
-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
-   token YYLEX-NUM.  */
-static const yytype_uint16 yytoknum[] =
-{
-       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
-     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
-     305,   306
-};
-# endif
-
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const yytype_uint8 yyr1[] =
-{
-       0,    52,    53,    54,    54,    55,    55,    55,    55,    55,
-      55,    55,    55,    55,    55,    55,    55,    55,    55,    55,
-      55,    55,    55,    55,    55,    55,    55,    55,    55,    55,
-      55,    56,    56,    56,    56,    56,    56,    56,    56,    58,
-      57,    59,    57,    57,    60,    61,    61,    61,    62,    62,
-      63,    63,    64,    64,    64,    64,    64,    65,    65,    66,
-      66,    67,    67,    67,    69,    68,    70,    70,    70,    71,
-      71,    71,    71,    71,    71,    72,    72,    74,    73,    75,
-      76,    77,    77
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-static const yytype_uint8 yyr2[] =
-{
-       0,     2,     4,     0,     2,     1,     1,     1,     2,     3,
-       1,     1,     2,     2,     3,     1,     1,     1,     1,     3,
-       1,     1,     3,     1,     1,     2,     2,     1,     1,     1,
-       1,     1,     1,     2,     1,     2,     2,     1,     1,     0,
-       3,     0,     3,     3,     3,     1,     1,     1,     0,     1,
-       1,     2,     1,     1,     2,     2,     3,     1,     2,     1,
-       2,     1,     2,     2,     0,     3,     1,     3,     2,     0,
-       2,     2,     3,     3,     3,     1,     1,     0,     2,     1,
-       1,     0,     2
-};
-
-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
-   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
-   means the default is an error.  */
-static const yytype_uint8 yydefact[] =
-{
-       3,     0,     0,     1,    41,    39,     0,     0,     0,    34,
-      45,    46,    47,     7,    37,     0,    10,    11,     0,     0,
-       0,    15,    16,    17,    18,     0,    38,    20,    21,     0,
-      23,    24,     0,     0,     0,    27,    28,    29,    30,     0,
-       6,     4,     5,    32,    31,    48,     0,     0,     0,    79,
-      75,    35,    50,    76,    36,    80,     8,    12,    13,     0,
-       0,     0,    25,    26,    33,     0,    64,     0,     0,    59,
-      61,    49,     0,    52,    53,    57,    42,    40,    43,    51,
-       9,    14,    19,    22,    63,    69,    62,     0,    60,     2,
-      44,    54,    55,    58,    65,    66,    82,    56,    68,    69,
-       0,     0,     0,    70,    71,     0,    67,    72,    73,    74,
-      78
-};
-
-/* YYDEFGOTO[NTERM-NUM].  */
-static const yytype_int8 yydefgoto[] =
-{
-      -1,     1,     2,    41,    67,    43,    47,    46,    44,    45,
-      72,    51,    75,    76,    68,    69,    70,    85,    94,    95,
-      52,   104,   105,    53,    56,    89
-};
-
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-   STATE-NUM.  */
-#define YYPACT_NINF -69
-static const yytype_int8 yypact[] =
-{
-     -69,     5,   112,   -69,   -69,   -69,   -35,     0,     0,   -69,
-     -69,   -69,   -69,   -69,   -69,    13,   -69,   -69,    20,    31,
-     -18,   -69,   -69,   -69,   -69,    -6,   -69,   -69,   -69,    -5,
-     -69,   -69,    13,    13,     0,   -69,   -69,   -69,   -69,    69,
-     -69,   -69,   -69,   -69,   -69,    -2,   -38,   -38,     0,   -69,
-     -69,     0,   -69,   -69,     0,   -69,    13,   -69,   -69,    13,
-      13,    13,   -69,   -69,   -69,    -8,   -69,     3,    21,   -69,
-     -69,   -69,     0,   -69,     6,   -69,   -38,   -38,     0,   -69,
-     -69,   -69,   -69,   -69,   -69,   -69,   -69,     2,   -69,   -69,
-       0,    39,   -69,   -69,   -33,    -1,   -69,   -69,   -69,   -69,
-       0,    44,     1,   -69,   -69,     4,    -1,   -69,   -69,   -69,
-     -69
-};
-
-/* YYPGOTO[NTERM-NUM].  */
-static const yytype_int8 yypgoto[] =
-{
-     -69,   -69,   -69,   -69,    47,   -69,   -69,   -69,   -69,   -69,
-     -69,    -7,   -58,     7,   -69,   -15,   -69,   -69,   -69,   -42,
-     -34,   -69,   -69,   -68,    30,   -69
-};
-
-/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
-   positive, shift that token.  If negative, reduce the rule which
-   number is the opposite.  If zero, do what YYDEFACT says.
-   If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -82
-static const yytype_int8 yytable[] =
-{
-      64,    54,    49,    49,    73,     3,    92,    48,    74,    49,
-      91,    98,    99,   100,   101,   102,    55,    79,    93,    93,
-      79,   -81,    65,    97,    57,    59,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    58,    84,    60,    61,    14,
-      71,    78,    49,   109,    79,    50,    50,    86,   108,    42,
-     -77,    26,    96,    88,    77,   110,    79,   106,     0,    34,
-       0,   103,    62,    63,     0,    90,   107,     0,    66,    87,
-      65,     0,   103,     0,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,     0,     0,     0,    80,    14,     0,    81,
-      82,    83,     0,     0,     0,     0,     0,     0,     0,    26,
-       0,     0,     0,     0,     0,     0,     0,    34,     0,     0,
-       0,     0,     0,     0,     0,     0,    66,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,     0,     0,     0,    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,     0,     0,    38,     0,     0,     0,
-      39,    40
-};
-
-static const yytype_int8 yycheck[] =
-{
-      34,     8,     3,     3,    42,     0,    74,    42,    46,     3,
-       4,    44,    45,    14,    15,    16,     3,    51,    76,    77,
-      54,     0,     1,    91,     4,    43,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,     4,    44,    43,    43,    18,
-      42,    48,     3,    42,    78,    46,    46,    44,     4,     2,
-      51,    30,    50,    68,    47,    51,    90,    99,    -1,    38,
-      -1,    95,    32,    33,    -1,    72,   100,    -1,    47,    48,
-       1,    -1,   106,    -1,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    -1,    -1,    -1,    56,    18,    -1,    59,
-      60,    61,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    30,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    38,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    47,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    -1,    -1,    -1,    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,    -1,    -1,    44,    -1,    -1,    -1,
-      48,    49
-};
-
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-   symbol of state STATE-NUM.  */
-static const yytype_uint8 yystos[] =
-{
-       0,    53,    54,     0,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    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,    44,    48,
-      49,    55,    56,    57,    60,    61,    59,    58,    42,     3,
-      46,    63,    72,    75,    63,     3,    76,     4,     4,    43,
-      43,    43,    76,    76,    72,     1,    47,    56,    66,    67,
-      68,    42,    62,    42,    46,    64,    65,    65,    63,    72,
-      76,    76,    76,    76,    44,    69,    44,    48,    67,    77,
-      63,     4,    75,    64,    70,    71,    50,    75,    44,    45,
-      14,    15,    16,    72,    73,    74,    71,    72,     4,    42,
-      51
-};
-
-#define yyerrok		(yyerrstatus = 0)
-#define yyclearin	(yychar = YYEMPTY)
-#define YYEMPTY		(-2)
-#define YYEOF		0
-
-#define YYACCEPT	goto yyacceptlab
-#define YYABORT		goto yyabortlab
-#define YYERROR		goto yyerrorlab
-
-
-/* Like YYERROR except do call yyerror.  This remains here temporarily
-   to ease the transition to the new meaning of YYERROR, for GCC.
-   Once GCC version 2 has supplanted version 1, this can go.  */
-
-#define YYFAIL		goto yyerrlab
-
-#define YYRECOVERING()  (!!yyerrstatus)
-
-#define YYBACKUP(Token, Value)					\
-do								\
-  if (yychar == YYEMPTY && yylen == 1)				\
-    {								\
-      yychar = (Token);						\
-      yylval = (Value);						\
-      yytoken = YYTRANSLATE (yychar);				\
-      YYPOPSTACK (1);						\
-      goto yybackup;						\
-    }								\
-  else								\
-    {								\
-      yyerror (YY_("syntax error: cannot back up")); \
-      YYERROR;							\
-    }								\
-while (YYID (0))
-
-
-#define YYTERROR	1
-#define YYERRCODE	256
-
-
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-   If N is 0, then set CURRENT to the empty location which ends
-   the previous symbol: RHS[0] (always defined).  */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)				\
-    do									\
-      if (YYID (N))                                                    \
-	{								\
-	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
-	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
-	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
-	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
-	}								\
-      else								\
-	{								\
-	  (Current).first_line   = (Current).last_line   =		\
-	    YYRHSLOC (Rhs, 0).last_line;				\
-	  (Current).first_column = (Current).last_column =		\
-	    YYRHSLOC (Rhs, 0).last_column;				\
-	}								\
-    while (YYID (0))
-#endif
-
-
-/* YY_LOCATION_PRINT -- Print the location on the stream.
-   This macro was not mandated originally: define only if we know
-   we won't break user code: when these are the locations we know.  */
-
-#ifndef YY_LOCATION_PRINT
-# if YYLTYPE_IS_TRIVIAL
-#  define YY_LOCATION_PRINT(File, Loc)			\
-     fprintf (File, "%d.%d-%d.%d",			\
-	      (Loc).first_line, (Loc).first_column,	\
-	      (Loc).last_line,  (Loc).last_column)
-# else
-#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-# endif
-#endif
-
-
-/* YYLEX -- calling `yylex' with the right arguments.  */
-
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM)
-#else
-# define YYLEX yylex (&yylval, &yylloc)
-#endif
-
-/* Enable debugging if requested.  */
-#if YYDEBUG
-
-# ifndef YYFPRINTF
-#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
-#  define YYFPRINTF fprintf
-# endif
-
-# define YYDPRINTF(Args)			\
-do {						\
-  if (yydebug)					\
-    YYFPRINTF Args;				\
-} while (YYID (0))
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
-do {									  \
-  if (yydebug)								  \
-    {									  \
-      YYFPRINTF (stderr, "%s ", Title);					  \
-      yy_symbol_print (stderr,						  \
-		  Type, Value, Location); \
-      YYFPRINTF (stderr, "\n");						  \
-    }									  \
-} while (YYID (0))
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
-#else
-static void
-yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE const * const yyvaluep;
-    YYLTYPE const * const yylocationp;
-#endif
-{
-  if (!yyvaluep)
-    return;
-  YYUSE (yylocationp);
-# ifdef YYPRINT
-  if (yytype < YYNTOKENS)
-    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# else
-  YYUSE (yyoutput);
-# endif
-  switch (yytype)
-    {
-      case 3: /* "\"string\"" */
-#line 179 "parse-gram.y"
-	{ fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
-#line 979 "parse-gram.c"
-	break;
-      case 4: /* "\"integer\"" */
-#line 192 "parse-gram.y"
-	{ fprintf (stderr, "%d", (yyvaluep->integer)); };
-#line 984 "parse-gram.c"
-	break;
-      case 8: /* "\"%destructor {...}\"" */
-#line 181 "parse-gram.y"
-	{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 989 "parse-gram.c"
-	break;
-      case 9: /* "\"%printer {...}\"" */
-#line 181 "parse-gram.y"
-	{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 994 "parse-gram.c"
-	break;
-      case 10: /* "\"%union {...}\"" */
-#line 181 "parse-gram.y"
-	{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 999 "parse-gram.c"
-	break;
-      case 26: /* "\"%initial-action {...}\"" */
-#line 181 "parse-gram.y"
-	{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1004 "parse-gram.c"
-	break;
-      case 27: /* "\"%lex-param {...}\"" */
-#line 181 "parse-gram.y"
-	{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1009 "parse-gram.c"
-	break;
-      case 34: /* "\"%parse-param {...}\"" */
-#line 181 "parse-gram.y"
-	{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1014 "parse-gram.c"
-	break;
-      case 42: /* "\"type\"" */
-#line 190 "parse-gram.y"
-	{ fprintf (stderr, "<%s>", (yyvaluep->uniqstr)); };
-#line 1019 "parse-gram.c"
-	break;
-      case 46: /* "\"identifier\"" */
-#line 194 "parse-gram.y"
-	{ fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 1024 "parse-gram.c"
-	break;
-      case 47: /* "\"identifier:\"" */
-#line 196 "parse-gram.y"
-	{ fprintf (stderr, "%s:", (yyvaluep->symbol)->tag); };
-#line 1029 "parse-gram.c"
-	break;
-      case 49: /* "\"%{...%}\"" */
-#line 181 "parse-gram.y"
-	{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1034 "parse-gram.c"
-	break;
-      case 50: /* "\"epilogue\"" */
-#line 181 "parse-gram.y"
-	{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1039 "parse-gram.c"
-	break;
-      case 72: /* "symbol" */
-#line 194 "parse-gram.y"
-	{ fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 1044 "parse-gram.c"
-	break;
-      case 75: /* "string_as_id" */
-#line 194 "parse-gram.y"
-	{ fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 1049 "parse-gram.c"
-	break;
-      case 76: /* "string_content" */
-#line 179 "parse-gram.y"
-	{ fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
-#line 1054 "parse-gram.c"
-	break;
-      default:
-	break;
-    }
-}
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
-#else
-static void
-yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE const * const yyvaluep;
-    YYLTYPE const * const yylocationp;
-#endif
-{
-  if (yytype < YYNTOKENS)
-    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-  else
-    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
-  YY_LOCATION_PRINT (yyoutput, *yylocationp);
-  YYFPRINTF (yyoutput, ": ");
-  yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp);
-  YYFPRINTF (yyoutput, ")");
-}
-
-/*------------------------------------------------------------------.
-| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-| TOP (included).                                                   |
-`------------------------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
-#else
-static void
-yy_stack_print (bottom, top)
-    yytype_int16 *bottom;
-    yytype_int16 *top;
-#endif
-{
-  YYFPRINTF (stderr, "Stack now");
-  for (; bottom <= top; ++bottom)
-    YYFPRINTF (stderr, " %d", *bottom);
-  YYFPRINTF (stderr, "\n");
-}
-
-# define YY_STACK_PRINT(Bottom, Top)				\
-do {								\
-  if (yydebug)							\
-    yy_stack_print ((Bottom), (Top));				\
-} while (YYID (0))
-
-
-/*------------------------------------------------.
-| Report that the YYRULE is going to be reduced.  |
-`------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)
-#else
-static void
-yy_reduce_print (yyvsp, yylsp, yyrule)
-    YYSTYPE *yyvsp;
-    YYLTYPE *yylsp;
-    int yyrule;
-#endif
-{
-  int yynrhs = yyr2[yyrule];
-  int yyi;
-  unsigned long int yylno = yyrline[yyrule];
-  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
-	     yyrule - 1, yylno);
-  /* The symbols being reduced.  */
-  for (yyi = 0; yyi < yynrhs; yyi++)
-    {
-      fprintf (stderr, "   $%d = ", yyi + 1);
-      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
-		       &(yyvsp[(yyi + 1) - (yynrhs)])
-		       , &(yylsp[(yyi + 1) - (yynrhs)])		       );
-      fprintf (stderr, "\n");
-    }
-}
-
-# define YY_REDUCE_PRINT(Rule)		\
-do {					\
-  if (yydebug)				\
-    yy_reduce_print (yyvsp, yylsp, Rule); \
-} while (YYID (0))
-
-/* Nonzero means print parse trace.  It is left uninitialized so that
-   multiple parsers can coexist.  */
-int yydebug;
-#else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-# define YY_STACK_PRINT(Bottom, Top)
-# define YY_REDUCE_PRINT(Rule)
-#endif /* !YYDEBUG */
-
-
-/* YYINITDEPTH -- initial size of the parser's stacks.  */
-#ifndef	YYINITDEPTH
-# define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
-   if the built-in stack extension method is used).
-
-   Do not make this value too large; the results are undefined if
-   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
-   evaluated with infinite-precision integer arithmetic.  */
-
-#ifndef YYMAXDEPTH
-# define YYMAXDEPTH 10000
-#endif
-
-
-
-#if YYERROR_VERBOSE
-
-# ifndef yystrlen
-#  if defined __GLIBC__ && defined _STRING_H
-#   define yystrlen strlen
-#  else
-/* Return the length of YYSTR.  */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static YYSIZE_T
-yystrlen (const char *yystr)
-#else
-static YYSIZE_T
-yystrlen (yystr)
-    const char *yystr;
-#endif
-{
-  YYSIZE_T yylen;
-  for (yylen = 0; yystr[yylen]; yylen++)
-    continue;
-  return yylen;
-}
-#  endif
-# endif
-
-# ifndef yystpcpy
-#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-#   define yystpcpy stpcpy
-#  else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-   YYDEST.  */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static char *
-yystpcpy (char *yydest, const char *yysrc)
-#else
-static char *
-yystpcpy (yydest, yysrc)
-    char *yydest;
-    const char *yysrc;
-#endif
-{
-  char *yyd = yydest;
-  const char *yys = yysrc;
-
-  while ((*yyd++ = *yys++) != '\0')
-    continue;
-
-  return yyd - 1;
-}
-#  endif
-# endif
-
-# ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
-   quotes and backslashes, so that it's suitable for yyerror.  The
-   heuristic is that double-quoting is unnecessary unless the string
-   contains an apostrophe, a comma, or backslash (other than
-   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
-   null, do not copy; instead, return the length of what the result
-   would have been.  */
-static YYSIZE_T
-yytnamerr (char *yyres, const char *yystr)
-{
-  if (*yystr == '"')
-    {
-      YYSIZE_T yyn = 0;
-      char const *yyp = yystr;
-
-      for (;;)
-	switch (*++yyp)
-	  {
-	  case '\'':
-	  case ',':
-	    goto do_not_strip_quotes;
-
-	  case '\\':
-	    if (*++yyp != '\\')
-	      goto do_not_strip_quotes;
-	    /* Fall through.  */
-	  default:
-	    if (yyres)
-	      yyres[yyn] = *yyp;
-	    yyn++;
-	    break;
-
-	  case '"':
-	    if (yyres)
-	      yyres[yyn] = '\0';
-	    return yyn;
-	  }
-    do_not_strip_quotes: ;
-    }
-
-  if (! yyres)
-    return yystrlen (yystr);
-
-  return yystpcpy (yyres, yystr) - yyres;
-}
-# endif
-
-/* Copy into YYRESULT an error message about the unexpected token
-   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
-   including the terminating null byte.  If YYRESULT is null, do not
-   copy anything; just return the number of bytes that would be
-   copied.  As a special case, return 0 if an ordinary "syntax error"
-   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
-   size calculation.  */
-static YYSIZE_T
-yysyntax_error (char *yyresult, int yystate, int yychar)
-{
-  int yyn = yypact[yystate];
-
-  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
-    return 0;
-  else
-    {
-      int yytype = YYTRANSLATE (yychar);
-      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
-      YYSIZE_T yysize = yysize0;
-      YYSIZE_T yysize1;
-      int yysize_overflow = 0;
-      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-      int yyx;
-
-# if 0
-      /* This is so xgettext sees the translatable formats that are
-	 constructed on the fly.  */
-      YY_("syntax error, unexpected %s");
-      YY_("syntax error, unexpected %s, expecting %s");
-      YY_("syntax error, unexpected %s, expecting %s or %s");
-      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
-      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-# endif
-      char *yyfmt;
-      char const *yyf;
-      static char const yyunexpected[] = "syntax error, unexpected %s";
-      static char const yyexpecting[] = ", expecting %s";
-      static char const yyor[] = " or %s";
-      char yyformat[sizeof yyunexpected
-		    + sizeof yyexpecting - 1
-		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-		       * (sizeof yyor - 1))];
-      char const *yyprefix = yyexpecting;
-
-      /* Start YYX at -YYN if negative to avoid negative indexes in
-	 YYCHECK.  */
-      int yyxbegin = yyn < 0 ? -yyn : 0;
-
-      /* Stay within bounds of both yycheck and yytname.  */
-      int yychecklim = YYLAST - yyn + 1;
-      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-      int yycount = 1;
-
-      yyarg[0] = yytname[yytype];
-      yyfmt = yystpcpy (yyformat, yyunexpected);
-
-      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-	  {
-	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-	      {
-		yycount = 1;
-		yysize = yysize0;
-		yyformat[sizeof yyunexpected - 1] = '\0';
-		break;
-	      }
-	    yyarg[yycount++] = yytname[yyx];
-	    yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-	    yysize_overflow |= (yysize1 < yysize);
-	    yysize = yysize1;
-	    yyfmt = yystpcpy (yyfmt, yyprefix);
-	    yyprefix = yyor;
-	  }
-
-      yyf = YY_(yyformat);
-      yysize1 = yysize + yystrlen (yyf);
-      yysize_overflow |= (yysize1 < yysize);
-      yysize = yysize1;
-
-      if (yysize_overflow)
-	return YYSIZE_MAXIMUM;
-
-      if (yyresult)
-	{
-	  /* Avoid sprintf, as that infringes on the user's name space.
-	     Don't have undefined behavior even if the translation
-	     produced a string with the wrong number of "%s"s.  */
-	  char *yyp = yyresult;
-	  int yyi = 0;
-	  while ((*yyp = *yyf) != '\0')
-	    {
-	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-		{
-		  yyp += yytnamerr (yyp, yyarg[yyi++]);
-		  yyf += 2;
-		}
-	      else
-		{
-		  yyp++;
-		  yyf++;
-		}
-	    }
-	}
-      return yysize;
-    }
-}
-#endif /* YYERROR_VERBOSE */
-
-
-/*-----------------------------------------------.
-| Release the memory associated to this symbol.  |
-`-----------------------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
-#else
-static void
-yydestruct (yymsg, yytype, yyvaluep, yylocationp)
-    const char *yymsg;
-    int yytype;
-    YYSTYPE *yyvaluep;
-    YYLTYPE *yylocationp;
-#endif
-{
-  YYUSE (yyvaluep);
-  YYUSE (yylocationp);
-
-  if (!yymsg)
-    yymsg = "Deleting";
-  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-
-  switch (yytype)
-    {
-
-      default:
-	break;
-    }
-}
-
-
-/* Prevent warnings from -Wmissing-prototypes.  */
-
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
-
-
-
-
-
-
-/*----------.
-| yyparse.  |
-`----------*/
-
-#ifdef YYPARSE_PARAM
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void *YYPARSE_PARAM)
-#else
-int
-yyparse (YYPARSE_PARAM)
-    void *YYPARSE_PARAM;
-#endif
-#else /* ! YYPARSE_PARAM */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void)
-#else
-int
-yyparse ()
-
-#endif
-#endif
-{
-  /* The look-ahead symbol.  */
-int yychar;
-
-/* The semantic value of the look-ahead symbol.  */
-YYSTYPE yylval;
-
-/* Number of syntax errors so far.  */
-int yynerrs;
-/* Location data for the look-ahead symbol.  */
-YYLTYPE yylloc;
-
-  int yystate;
-  int yyn;
-  int yyresult;
-  /* Number of tokens to shift before error messages enabled.  */
-  int yyerrstatus;
-  /* Look-ahead token as an internal (translated) token number.  */
-  int yytoken = 0;
-#if YYERROR_VERBOSE
-  /* Buffer for error messages, and its allocated size.  */
-  char yymsgbuf[128];
-  char *yymsg = yymsgbuf;
-  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
-
-  /* Three stacks and their tools:
-     `yyss': related to states,
-     `yyvs': related to semantic values,
-     `yyls': related to locations.
-
-     Refer to the stacks thru separate pointers, to allow yyoverflow
-     to reallocate them elsewhere.  */
-
-  /* The state stack.  */
-  yytype_int16 yyssa[YYINITDEPTH];
-  yytype_int16 *yyss = yyssa;
-  yytype_int16 *yyssp;
-
-  /* The semantic value stack.  */
-  YYSTYPE yyvsa[YYINITDEPTH];
-  YYSTYPE *yyvs = yyvsa;
-  YYSTYPE *yyvsp;
-
-  /* The location stack.  */
-  YYLTYPE yylsa[YYINITDEPTH];
-  YYLTYPE *yyls = yylsa;
-  YYLTYPE *yylsp;
-  /* The locations where the error started and ended.  */
-  YYLTYPE yyerror_range[2];
-
-#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
-
-  YYSIZE_T yystacksize = YYINITDEPTH;
-
-  /* The variables used to return semantic value and location from the
-     action routines.  */
-  YYSTYPE yyval;
-  YYLTYPE yyloc;
-
-  /* The number of symbols on the RHS of the reduced rule.
-     Keep to zero when no symbol should be popped.  */
-  int yylen = 0;
-
-  YYDPRINTF ((stderr, "Starting parse\n"));
-
-  yystate = 0;
-  yyerrstatus = 0;
-  yynerrs = 0;
-  yychar = YYEMPTY;		/* Cause a token to be read.  */
-
-  /* Initialize stack pointers.
-     Waste one element of value and location stack
-     so that they stay on the same level as the state stack.
-     The wasted elements are never initialized.  */
-
-  yyssp = yyss;
-  yyvsp = yyvs;
-  yylsp = yyls;
-#if YYLTYPE_IS_TRIVIAL
-  /* Initialize the default location before parsing starts.  */
-  yylloc.first_line   = yylloc.last_line   = 1;
-  yylloc.first_column = yylloc.last_column = 0;
-#endif
-
-
-  /* User initialization code.  */
-#line 84 "parse-gram.y"
-{
-  /* Bison's grammar can initial empty locations, hence a default
-     location is needed. */
-  yylloc.start.file   = yylloc.end.file   = current_file;
-  yylloc.start.line   = yylloc.end.line   = 1;
-  yylloc.start.column = yylloc.end.column = 0;
-}
-/* Line 1078 of yacc.c.  */
-#line 1573 "parse-gram.c"
-  yylsp[0] = yylloc;
-  goto yysetstate;
-
-/*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate.  |
-`------------------------------------------------------------*/
- yynewstate:
-  /* In all cases, when you get here, the value and location stacks
-     have just been pushed.  So pushing a state here evens the stacks.  */
-  yyssp++;
-
- yysetstate:
-  *yyssp = yystate;
-
-  if (yyss + yystacksize - 1 <= yyssp)
-    {
-      /* Get the current used size of the three stacks, in elements.  */
-      YYSIZE_T yysize = yyssp - yyss + 1;
-
-#ifdef yyoverflow
-      {
-	/* Give user a chance to reallocate the stack.  Use copies of
-	   these so that the &'s don't force the real ones into
-	   memory.  */
-	YYSTYPE *yyvs1 = yyvs;
-	yytype_int16 *yyss1 = yyss;
-	YYLTYPE *yyls1 = yyls;
-
-	/* Each stack pointer address is followed by the size of the
-	   data in use in that stack, in bytes.  This used to be a
-	   conditional around just the two extra args, but that might
-	   be undefined if yyoverflow is a macro.  */
-	yyoverflow (YY_("memory exhausted"),
-		    &yyss1, yysize * sizeof (*yyssp),
-		    &yyvs1, yysize * sizeof (*yyvsp),
-		    &yyls1, yysize * sizeof (*yylsp),
-		    &yystacksize);
-	yyls = yyls1;
-	yyss = yyss1;
-	yyvs = yyvs1;
-      }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
-      goto yyexhaustedlab;
-# else
-      /* Extend the stack our own way.  */
-      if (YYMAXDEPTH <= yystacksize)
-	goto yyexhaustedlab;
-      yystacksize *= 2;
-      if (YYMAXDEPTH < yystacksize)
-	yystacksize = YYMAXDEPTH;
-
-      {
-	yytype_int16 *yyss1 = yyss;
-	union yyalloc *yyptr =
-	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-	if (! yyptr)
-	  goto yyexhaustedlab;
-	YYSTACK_RELOCATE (yyss);
-	YYSTACK_RELOCATE (yyvs);
-	YYSTACK_RELOCATE (yyls);
-#  undef YYSTACK_RELOCATE
-	if (yyss1 != yyssa)
-	  YYSTACK_FREE (yyss1);
-      }
-# endif
-#endif /* no yyoverflow */
-
-      yyssp = yyss + yysize - 1;
-      yyvsp = yyvs + yysize - 1;
-      yylsp = yyls + yysize - 1;
-
-      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-		  (unsigned long int) yystacksize));
-
-      if (yyss + yystacksize - 1 <= yyssp)
-	YYABORT;
-    }
-
-  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-
-  goto yybackup;
-
-/*-----------.
-| yybackup.  |
-`-----------*/
-yybackup:
-
-  /* Do appropriate processing given the current state.  Read a
-     look-ahead token if we need one and don't already have one.  */
-
-  /* First try to decide what to do without reference to look-ahead token.  */
-  yyn = yypact[yystate];
-  if (yyn == YYPACT_NINF)
-    goto yydefault;
-
-  /* Not known => get a look-ahead token if don't already have one.  */
-
-  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
-  if (yychar == YYEMPTY)
-    {
-      YYDPRINTF ((stderr, "Reading a token: "));
-      yychar = YYLEX;
-    }
-
-  if (yychar <= YYEOF)
-    {
-      yychar = yytoken = YYEOF;
-      YYDPRINTF ((stderr, "Now at end of input.\n"));
-    }
-  else
-    {
-      yytoken = YYTRANSLATE (yychar);
-      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
-    }
-
-  /* If the proper action on seeing token YYTOKEN is to reduce or to
-     detect an error, take that action.  */
-  yyn += yytoken;
-  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
-    goto yydefault;
-  yyn = yytable[yyn];
-  if (yyn <= 0)
-    {
-      if (yyn == 0 || yyn == YYTABLE_NINF)
-	goto yyerrlab;
-      yyn = -yyn;
-      goto yyreduce;
-    }
-
-  if (yyn == YYFINAL)
-    YYACCEPT;
-
-  /* Count tokens shifted since error; after three, turn off error
-     status.  */
-  if (yyerrstatus)
-    yyerrstatus--;
-
-  /* Shift the look-ahead token.  */
-  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
-  /* Discard the shifted token unless it is eof.  */
-  if (yychar != YYEOF)
-    yychar = YYEMPTY;
-
-  yystate = yyn;
-  *++yyvsp = yylval;
-  *++yylsp = yylloc;
-  goto yynewstate;
-
-
-/*-----------------------------------------------------------.
-| yydefault -- do the default action for the current state.  |
-`-----------------------------------------------------------*/
-yydefault:
-  yyn = yydefact[yystate];
-  if (yyn == 0)
-    goto yyerrlab;
-  goto yyreduce;
-
-
-/*-----------------------------.
-| yyreduce -- Do a reduction.  |
-`-----------------------------*/
-yyreduce:
-  /* yyn is the number of a rule to reduce with.  */
-  yylen = yyr2[yyn];
-
-  /* If YYLEN is nonzero, implement the default value of the action:
-     `$$ = $1'.
-
-     Otherwise, the following line sets YYVAL to garbage.
-     This behavior is undocumented and Bison
-     users should not rely upon it.  Assigning to YYVAL
-     unconditionally makes the parser a bit smaller, and it avoids a
-     GCC warning that YYVAL may be used uninitialized.  */
-  yyval = yyvsp[1-yylen];
-
-  /* Default location.  */
-  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
-  YY_REDUCE_PRINT (yyn);
-  switch (yyn)
-    {
-        case 6:
-#line 217 "parse-gram.y"
-    { prologue_augment ((yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
-    break;
-
-  case 7:
-#line 218 "parse-gram.y"
-    { debug_flag = true; }
-    break;
-
-  case 8:
-#line 220 "parse-gram.y"
-    {
-      static char one[] = "1";
-      muscle_insert ((yyvsp[(2) - (2)].chars), one);
-    }
-    break;
-
-  case 9:
-#line 224 "parse-gram.y"
-    { muscle_insert ((yyvsp[(2) - (3)].chars), (yyvsp[(3) - (3)].chars)); }
-    break;
-
-  case 10:
-#line 225 "parse-gram.y"
-    { defines_flag = true; }
-    break;
-
-  case 11:
-#line 226 "parse-gram.y"
-    { error_verbose = true; }
-    break;
-
-  case 12:
-#line 227 "parse-gram.y"
-    { expected_sr_conflicts = (yyvsp[(2) - (2)].integer); }
-    break;
-
-  case 13:
-#line 228 "parse-gram.y"
-    { expected_rr_conflicts = (yyvsp[(2) - (2)].integer); }
-    break;
-
-  case 14:
-#line 229 "parse-gram.y"
-    { spec_file_prefix = (yyvsp[(3) - (3)].chars); }
-    break;
-
-  case 15:
-#line 231 "parse-gram.y"
-    {
-      nondeterministic_parser = true;
-      glr_parser = true;
-    }
-    break;
-
-  case 16:
-#line 236 "parse-gram.y"
-    {
-      muscle_code_grow ("initial_action", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)]));
-    }
-    break;
-
-  case 17:
-#line 239 "parse-gram.y"
-    { add_param ("lex_param", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
-    break;
-
-  case 18:
-#line 240 "parse-gram.y"
-    { locations_flag = true; }
-    break;
-
-  case 19:
-#line 241 "parse-gram.y"
-    { spec_name_prefix = (yyvsp[(3) - (3)].chars); }
-    break;
-
-  case 20:
-#line 242 "parse-gram.y"
-    { no_lines_flag = true; }
-    break;
-
-  case 21:
-#line 243 "parse-gram.y"
-    { nondeterministic_parser = true; }
-    break;
-
-  case 22:
-#line 244 "parse-gram.y"
-    { spec_outfile = (yyvsp[(3) - (3)].chars); }
-    break;
-
-  case 23:
-#line 245 "parse-gram.y"
-    { add_param ("parse_param", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
-    break;
-
-  case 24:
-#line 246 "parse-gram.y"
-    { pure_parser = true; }
-    break;
-
-  case 25:
-#line 247 "parse-gram.y"
-    { version_check (&(yylsp[(2) - (2)]), (yyvsp[(2) - (2)].chars)); }
-    break;
-
-  case 26:
-#line 248 "parse-gram.y"
-    { skeleton = (yyvsp[(2) - (2)].chars); }
-    break;
-
-  case 27:
-#line 249 "parse-gram.y"
-    { token_table_flag = true; }
-    break;
-
-  case 28:
-#line 250 "parse-gram.y"
-    { report_flag = report_states; }
-    break;
-
-  case 29:
-#line 251 "parse-gram.y"
-    { yacc_flag = true; }
-    break;
-
-  case 33:
-#line 259 "parse-gram.y"
-    {
-      grammar_start_symbol_set ((yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)]));
-    }
-    break;
-
-  case 34:
-#line 263 "parse-gram.y"
-    {
-      char const *body = (yyvsp[(1) - (1)].chars);
-
-      if (typed)
-	{
-	  /* Concatenate the union bodies, turning the first one's
-	     trailing '}' into '\n', and omitting the second one's '{'.  */
-	  char *code = muscle_find ("stype");
-	  code[strlen (code) - 1] = '\n';
-	  body++;
-	}
-
-      typed = true;
-      muscle_code_grow ("stype", body, (yylsp[(1) - (1)]));
-    }
-    break;
-
-  case 35:
-#line 279 "parse-gram.y"
-    {
-      symbol_list *list;
-      for (list = (yyvsp[(2) - (2)].list); list; list = list->next)
-	symbol_destructor_set (list->sym, (yyvsp[(1) - (2)].chars), (yylsp[(1) - (2)]));
-      symbol_list_free ((yyvsp[(2) - (2)].list));
-    }
-    break;
-
-  case 36:
-#line 286 "parse-gram.y"
-    {
-      symbol_list *list;
-      for (list = (yyvsp[(2) - (2)].list); list; list = list->next)
-	symbol_printer_set (list->sym, (yyvsp[(1) - (2)].chars), (yylsp[(1) - (2)]));
-      symbol_list_free ((yyvsp[(2) - (2)].list));
-    }
-    break;
-
-  case 37:
-#line 293 "parse-gram.y"
-    {
-      default_prec = true;
-    }
-    break;
-
-  case 38:
-#line 297 "parse-gram.y"
-    {
-      default_prec = false;
-    }
-    break;
-
-  case 39:
-#line 303 "parse-gram.y"
-    { current_class = nterm_sym; }
-    break;
-
-  case 40:
-#line 304 "parse-gram.y"
-    {
-      current_class = unknown_sym;
-      current_type = NULL;
-    }
-    break;
-
-  case 41:
-#line 308 "parse-gram.y"
-    { current_class = token_sym; }
-    break;
-
-  case 42:
-#line 309 "parse-gram.y"
-    {
-      current_class = unknown_sym;
-      current_type = NULL;
-    }
-    break;
-
-  case 43:
-#line 314 "parse-gram.y"
-    {
-      symbol_list *list;
-      for (list = (yyvsp[(3) - (3)].list); list; list = list->next)
-	symbol_type_set (list->sym, (yyvsp[(2) - (3)].uniqstr), (yylsp[(2) - (3)]));
-      symbol_list_free ((yyvsp[(3) - (3)].list));
-    }
-    break;
-
-  case 44:
-#line 324 "parse-gram.y"
-    {
-      symbol_list *list;
-      ++current_prec;
-      for (list = (yyvsp[(3) - (3)].list); list; list = list->next)
-	{
-	  symbol_type_set (list->sym, current_type, (yylsp[(2) - (3)]));
-	  symbol_precedence_set (list->sym, current_prec, (yyvsp[(1) - (3)].assoc), (yylsp[(1) - (3)]));
-	}
-      symbol_list_free ((yyvsp[(3) - (3)].list));
-      current_type = NULL;
-    }
-    break;
-
-  case 45:
-#line 338 "parse-gram.y"
-    { (yyval.assoc) = left_assoc; }
-    break;
-
-  case 46:
-#line 339 "parse-gram.y"
-    { (yyval.assoc) = right_assoc; }
-    break;
-
-  case 47:
-#line 340 "parse-gram.y"
-    { (yyval.assoc) = non_assoc; }
-    break;
-
-  case 48:
-#line 344 "parse-gram.y"
-    { current_type = NULL; }
-    break;
-
-  case 49:
-#line 345 "parse-gram.y"
-    { current_type = (yyvsp[(1) - (1)].uniqstr); }
-    break;
-
-  case 50:
-#line 351 "parse-gram.y"
-    { (yyval.list) = symbol_list_new ((yyvsp[(1) - (1)].symbol), (yylsp[(1) - (1)])); }
-    break;
-
-  case 51:
-#line 352 "parse-gram.y"
-    { (yyval.list) = symbol_list_prepend ((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)])); }
-    break;
-
-  case 52:
-#line 358 "parse-gram.y"
-    {
-       current_type = (yyvsp[(1) - (1)].uniqstr);
-     }
-    break;
-
-  case 53:
-#line 362 "parse-gram.y"
-    {
-       symbol_class_set ((yyvsp[(1) - (1)].symbol), current_class, (yylsp[(1) - (1)]), true);
-       symbol_type_set ((yyvsp[(1) - (1)].symbol), current_type, (yylsp[(1) - (1)]));
-     }
-    break;
-
-  case 54:
-#line 367 "parse-gram.y"
-    {
-      symbol_class_set ((yyvsp[(1) - (2)].symbol), current_class, (yylsp[(1) - (2)]), true);
-      symbol_type_set ((yyvsp[(1) - (2)].symbol), current_type, (yylsp[(1) - (2)]));
-      symbol_user_token_number_set ((yyvsp[(1) - (2)].symbol), (yyvsp[(2) - (2)].integer), (yylsp[(2) - (2)]));
-    }
-    break;
-
-  case 55:
-#line 373 "parse-gram.y"
-    {
-      symbol_class_set ((yyvsp[(1) - (2)].symbol), current_class, (yylsp[(1) - (2)]), true);
-      symbol_type_set ((yyvsp[(1) - (2)].symbol), current_type, (yylsp[(1) - (2)]));
-      symbol_make_alias ((yyvsp[(1) - (2)].symbol), (yyvsp[(2) - (2)].symbol), (yyloc));
-    }
-    break;
-
-  case 56:
-#line 379 "parse-gram.y"
-    {
-      symbol_class_set ((yyvsp[(1) - (3)].symbol), current_class, (yylsp[(1) - (3)]), true);
-      symbol_type_set ((yyvsp[(1) - (3)].symbol), current_type, (yylsp[(1) - (3)]));
-      symbol_user_token_number_set ((yyvsp[(1) - (3)].symbol), (yyvsp[(2) - (3)].integer), (yylsp[(2) - (3)]));
-      symbol_make_alias ((yyvsp[(1) - (3)].symbol), (yyvsp[(3) - (3)].symbol), (yyloc));
-    }
-    break;
-
-  case 63:
-#line 409 "parse-gram.y"
-    {
-      yyerrok;
-    }
-    break;
-
-  case 64:
-#line 415 "parse-gram.y"
-    { current_lhs = (yyvsp[(1) - (1)].symbol); current_lhs_location = (yylsp[(1) - (1)]); }
-    break;
-
-  case 66:
-#line 419 "parse-gram.y"
-    { grammar_current_rule_end ((yylsp[(1) - (1)])); }
-    break;
-
-  case 67:
-#line 420 "parse-gram.y"
-    { grammar_current_rule_end ((yylsp[(3) - (3)])); }
-    break;
-
-  case 69:
-#line 426 "parse-gram.y"
-    { grammar_current_rule_begin (current_lhs, current_lhs_location); }
-    break;
-
-  case 70:
-#line 428 "parse-gram.y"
-    { grammar_current_rule_symbol_append ((yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)])); }
-    break;
-
-  case 72:
-#line 431 "parse-gram.y"
-    { grammar_current_rule_prec_set ((yyvsp[(3) - (3)].symbol), (yylsp[(3) - (3)])); }
-    break;
-
-  case 73:
-#line 433 "parse-gram.y"
-    { grammar_current_rule_dprec_set ((yyvsp[(3) - (3)].integer), (yylsp[(3) - (3)])); }
-    break;
-
-  case 74:
-#line 435 "parse-gram.y"
-    { grammar_current_rule_merge_set ((yyvsp[(3) - (3)].uniqstr), (yylsp[(3) - (3)])); }
-    break;
-
-  case 75:
-#line 439 "parse-gram.y"
-    { (yyval.symbol) = (yyvsp[(1) - (1)].symbol); }
-    break;
-
-  case 76:
-#line 440 "parse-gram.y"
-    { (yyval.symbol) = (yyvsp[(1) - (1)].symbol); }
-    break;
-
-  case 77:
-#line 456 "parse-gram.y"
-    { grammar_current_rule_action_append (last_string, last_braced_code_loc); }
-    break;
-
-  case 79:
-#line 463 "parse-gram.y"
-    {
-      (yyval.symbol) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[(1) - (1)].chars)), (yylsp[(1) - (1)]));
-      symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false);
-    }
-    break;
-
-  case 80:
-#line 472 "parse-gram.y"
-    { (yyval.chars) = (yyvsp[(1) - (1)].chars); }
-    break;
-
-  case 82:
-#line 479 "parse-gram.y"
-    {
-      muscle_code_grow ("epilogue", (yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)]));
-      scanner_last_string_free ();
-    }
-    break;
-
-
-/* Line 1267 of yacc.c.  */
-#line 2159 "parse-gram.c"
-      default: break;
-    }
-  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
-
-  YYPOPSTACK (yylen);
-  yylen = 0;
-  YY_STACK_PRINT (yyss, yyssp);
-
-  *++yyvsp = yyval;
-  *++yylsp = yyloc;
-
-  /* Now `shift' the result of the reduction.  Determine what state
-     that goes to, based on the state we popped back to and the rule
-     number reduced by.  */
-
-  yyn = yyr1[yyn];
-
-  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
-  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
-    yystate = yytable[yystate];
-  else
-    yystate = yydefgoto[yyn - YYNTOKENS];
-
-  goto yynewstate;
-
-
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
-yyerrlab:
-  /* If not already recovering from an error, report this error.  */
-  if (!yyerrstatus)
-    {
-      ++yynerrs;
-#if ! YYERROR_VERBOSE
-      yyerror (YY_("syntax error"));
-#else
-      {
-	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
-	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
-	  {
-	    YYSIZE_T yyalloc = 2 * yysize;
-	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
-	      yyalloc = YYSTACK_ALLOC_MAXIMUM;
-	    if (yymsg != yymsgbuf)
-	      YYSTACK_FREE (yymsg);
-	    yymsg = (char *) YYSTACK_ALLOC (yyalloc);
-	    if (yymsg)
-	      yymsg_alloc = yyalloc;
-	    else
-	      {
-		yymsg = yymsgbuf;
-		yymsg_alloc = sizeof yymsgbuf;
-	      }
-	  }
-
-	if (0 < yysize && yysize <= yymsg_alloc)
-	  {
-	    (void) yysyntax_error (yymsg, yystate, yychar);
-	    yyerror (yymsg);
-	  }
-	else
-	  {
-	    yyerror (YY_("syntax error"));
-	    if (yysize != 0)
-	      goto yyexhaustedlab;
-	  }
-      }
-#endif
-    }
-
-  yyerror_range[0] = yylloc;
-
-  if (yyerrstatus == 3)
-    {
-      /* If just tried and failed to reuse look-ahead token after an
-	 error, discard it.  */
-
-      if (yychar <= YYEOF)
-	{
-	  /* Return failure if at end of input.  */
-	  if (yychar == YYEOF)
-	    YYABORT;
-	}
-      else
-	{
-	  yydestruct ("Error: discarding",
-		      yytoken, &yylval, &yylloc);
-	  yychar = YYEMPTY;
-	}
-    }
-
-  /* Else will try to reuse look-ahead token after shifting the error
-     token.  */
-  goto yyerrlab1;
-
-
-/*---------------------------------------------------.
-| yyerrorlab -- error raised explicitly by YYERROR.  |
-`---------------------------------------------------*/
-yyerrorlab:
-
-  /* Pacify compilers like GCC when the user code never invokes
-     YYERROR and the label yyerrorlab therefore never appears in user
-     code.  */
-  if (/*CONSTCOND*/ 0)
-     goto yyerrorlab;
-
-  yyerror_range[0] = yylsp[1-yylen];
-  /* Do not reclaim the symbols of the rule which action triggered
-     this YYERROR.  */
-  YYPOPSTACK (yylen);
-  yylen = 0;
-  YY_STACK_PRINT (yyss, yyssp);
-  yystate = *yyssp;
-  goto yyerrlab1;
-
-
-/*-------------------------------------------------------------.
-| yyerrlab1 -- common code for both syntax error and YYERROR.  |
-`-------------------------------------------------------------*/
-yyerrlab1:
-  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
-
-  for (;;)
-    {
-      yyn = yypact[yystate];
-      if (yyn != YYPACT_NINF)
-	{
-	  yyn += YYTERROR;
-	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
-	    {
-	      yyn = yytable[yyn];
-	      if (0 < yyn)
-		break;
-	    }
-	}
-
-      /* Pop the current state because it cannot handle the error token.  */
-      if (yyssp == yyss)
-	YYABORT;
-
-      yyerror_range[0] = *yylsp;
-      yydestruct ("Error: popping",
-		  yystos[yystate], yyvsp, yylsp);
-      YYPOPSTACK (1);
-      yystate = *yyssp;
-      YY_STACK_PRINT (yyss, yyssp);
-    }
-
-  if (yyn == YYFINAL)
-    YYACCEPT;
-
-  *++yyvsp = yylval;
-
-  yyerror_range[1] = yylloc;
-  /* Using YYLLOC is tempting, but would change the location of
-     the look-ahead.  YYLOC is available though.  */
-  YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2);
-  *++yylsp = yyloc;
-
-  /* Shift the error token.  */
-  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-
-  yystate = yyn;
-  goto yynewstate;
-
-
-/*-------------------------------------.
-| yyacceptlab -- YYACCEPT comes here.  |
-`-------------------------------------*/
-yyacceptlab:
-  yyresult = 0;
-  goto yyreturn;
-
-/*-----------------------------------.
-| yyabortlab -- YYABORT comes here.  |
-`-----------------------------------*/
-yyabortlab:
-  yyresult = 1;
-  goto yyreturn;
-
-#ifndef yyoverflow
-/*-------------------------------------------------.
-| yyexhaustedlab -- memory exhaustion comes here.  |
-`-------------------------------------------------*/
-yyexhaustedlab:
-  yyerror (YY_("memory exhausted"));
-  yyresult = 2;
-  /* Fall through.  */
-#endif
-
-yyreturn:
-  if (yychar != YYEOF && yychar != YYEMPTY)
-     yydestruct ("Cleanup: discarding lookahead",
-		 yytoken, &yylval, &yylloc);
-  /* Do not reclaim the symbols of the rule which action triggered
-     this YYABORT or YYACCEPT.  */
-  YYPOPSTACK (yylen);
-  YY_STACK_PRINT (yyss, yyssp);
-  while (yyssp != yyss)
-    {
-      yydestruct ("Cleanup: popping",
-		  yystos[*yyssp], yyvsp, yylsp);
-      YYPOPSTACK (1);
-    }
-#ifndef yyoverflow
-  if (yyss != yyssa)
-    YYSTACK_FREE (yyss);
-#endif
-#if YYERROR_VERBOSE
-  if (yymsg != yymsgbuf)
-    YYSTACK_FREE (yymsg);
-#endif
-  /* Make sure YYID is used.  */
-  return YYID (yyresult);
-}
-
-
-#line 485 "parse-gram.y"
-
-
-
-/* Return the location of the left-hand side of a rule whose
-   right-hand side is RHS[1] ... RHS[N].  Ignore empty nonterminals in
-   the right-hand side, and return an empty location equal to the end
-   boundary of RHS[0] if the right-hand side is empty.  */
-
-static YYLTYPE
-lloc_default (YYLTYPE const *rhs, int n)
-{
-  int i;
-  YYLTYPE loc;
-
-  /* SGI MIPSpro 7.4.1m miscompiles "loc.start = loc.end = rhs[n].end;".
-     The bug is fixed in 7.4.2m, but play it safe for now.  */
-  loc.start = rhs[n].end;
-  loc.end = rhs[n].end;
-
-  /* Ignore empty nonterminals the start of the the right-hand side.
-     Do not bother to ignore them at the end of the right-hand side,
-     since empty nonterminals have the same end as their predecessors.  */
-  for (i = 1; i <= n; i++)
-    if (! equal_boundaries (rhs[i].start, rhs[i].end))
-      {
-	loc.start = rhs[i].start;
-	break;
-      }
-
-  return loc;
-}
-
-
-/* Add a lex-param or a parse-param (depending on TYPE) with
-   declaration DECL and location LOC.  */
-
-static void
-add_param (char const *type, char *decl, location loc)
-{
-  static char const alphanum[26 + 26 + 1 + 10] =
-    "abcdefghijklmnopqrstuvwxyz"
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-    "_"
-    "0123456789";
-  char const *name_start = NULL;
-  char *p;
-
-  /* Stop on last actual character.  */
-  for (p = decl; p[1]; p++)
-    if ((p == decl
-	 || ! memchr (alphanum, p[-1], sizeof alphanum))
-	&& memchr (alphanum, p[0], sizeof alphanum - 10))
-      name_start = p;
-
-  /* Strip the surrounding '{' and '}', and any blanks just inside
-     the braces.  */
-  while (*--p == ' ' || *p == '\t')
-    continue;
-  p[1] = '\0';
-  while (*++decl == ' ' || *decl == '\t')
-    continue;
-
-  if (! name_start)
-    complain_at (loc, _("missing identifier in parameter declaration"));
-  else
-    {
-      char *name;
-      size_t name_len;
-
-      for (name_len = 1;
-	   memchr (alphanum, name_start[name_len], sizeof alphanum);
-	   name_len++)
-	continue;
-
-      name = xmalloc (name_len + 1);
-      memcpy (name, name_start, name_len);
-      name[name_len] = '\0';
-      muscle_pair_list_grow (type, decl, name);
-      free (name);
-    }
-
-  scanner_last_string_free ();
-}
-
-static void
-version_check (location const *loc, char const *version)
-{
-  if (strverscmp (version, PACKAGE_VERSION) > 0)
-    {
-      complain_at (*loc, "require bison %s, but have %s",
-		   version, PACKAGE_VERSION);
-      exit (63);
-    }
-}
-
-static void
-gram_error (location const *loc, char const *msg)
-{
-  complain_at (*loc, "%s", msg);
-}
-
-char const *
-token_name (int type)
-{
-  return yytname[YYTRANSLATE (type)];
-}
-
diff --git a/src/parse-gram.h b/src/parse-gram.h
deleted file mode 100644
index 2d37fc1..0000000
--- a/src/parse-gram.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.2a.  */
-
-/* Skeleton interface for Bison's Yacc-like parsers in C
-
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-   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.  */
-
-/* As a special exception, you may create a larger work that contains
-   part or all of the Bison parser skeleton and distribute that work
-   under terms of your choice, so long as that work isn't itself a
-   parser generator using the skeleton or a modified version thereof
-   as a parser skeleton.  Alternatively, if you modify or redistribute
-   the parser skeleton itself, you may (at your option) remove this
-   special exception, which will cause the skeleton and the resulting
-   Bison output files to be licensed under the GNU General Public
-   License without this special exception.
-
-   This special exception was added by the Free Software Foundation in
-   version 2.2 of Bison.  */
-
-/* Tokens.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     GRAM_EOF = 0,
-     STRING = 258,
-     INT = 259,
-     PERCENT_TOKEN = 260,
-     PERCENT_NTERM = 261,
-     PERCENT_TYPE = 262,
-     PERCENT_DESTRUCTOR = 263,
-     PERCENT_PRINTER = 264,
-     PERCENT_UNION = 265,
-     PERCENT_LEFT = 266,
-     PERCENT_RIGHT = 267,
-     PERCENT_NONASSOC = 268,
-     PERCENT_PREC = 269,
-     PERCENT_DPREC = 270,
-     PERCENT_MERGE = 271,
-     PERCENT_DEBUG = 272,
-     PERCENT_DEFAULT_PREC = 273,
-     PERCENT_DEFINE = 274,
-     PERCENT_DEFINES = 275,
-     PERCENT_ERROR_VERBOSE = 276,
-     PERCENT_EXPECT = 277,
-     PERCENT_EXPECT_RR = 278,
-     PERCENT_FILE_PREFIX = 279,
-     PERCENT_GLR_PARSER = 280,
-     PERCENT_INITIAL_ACTION = 281,
-     PERCENT_LEX_PARAM = 282,
-     PERCENT_LOCATIONS = 283,
-     PERCENT_NAME_PREFIX = 284,
-     PERCENT_NO_DEFAULT_PREC = 285,
-     PERCENT_NO_LINES = 286,
-     PERCENT_NONDETERMINISTIC_PARSER = 287,
-     PERCENT_OUTPUT = 288,
-     PERCENT_PARSE_PARAM = 289,
-     PERCENT_PURE_PARSER = 290,
-     PERCENT_REQUIRE = 291,
-     PERCENT_SKELETON = 292,
-     PERCENT_START = 293,
-     PERCENT_TOKEN_TABLE = 294,
-     PERCENT_VERBOSE = 295,
-     PERCENT_YACC = 296,
-     TYPE = 297,
-     EQUAL = 298,
-     SEMICOLON = 299,
-     PIPE = 300,
-     ID = 301,
-     ID_COLON = 302,
-     PERCENT_PERCENT = 303,
-     PROLOGUE = 304,
-     EPILOGUE = 305,
-     BRACED_CODE = 306
-   };
-#endif
-/* Tokens.  */
-#define GRAM_EOF 0
-#define STRING 258
-#define INT 259
-#define PERCENT_TOKEN 260
-#define PERCENT_NTERM 261
-#define PERCENT_TYPE 262
-#define PERCENT_DESTRUCTOR 263
-#define PERCENT_PRINTER 264
-#define PERCENT_UNION 265
-#define PERCENT_LEFT 266
-#define PERCENT_RIGHT 267
-#define PERCENT_NONASSOC 268
-#define PERCENT_PREC 269
-#define PERCENT_DPREC 270
-#define PERCENT_MERGE 271
-#define PERCENT_DEBUG 272
-#define PERCENT_DEFAULT_PREC 273
-#define PERCENT_DEFINE 274
-#define PERCENT_DEFINES 275
-#define PERCENT_ERROR_VERBOSE 276
-#define PERCENT_EXPECT 277
-#define PERCENT_EXPECT_RR 278
-#define PERCENT_FILE_PREFIX 279
-#define PERCENT_GLR_PARSER 280
-#define PERCENT_INITIAL_ACTION 281
-#define PERCENT_LEX_PARAM 282
-#define PERCENT_LOCATIONS 283
-#define PERCENT_NAME_PREFIX 284
-#define PERCENT_NO_DEFAULT_PREC 285
-#define PERCENT_NO_LINES 286
-#define PERCENT_NONDETERMINISTIC_PARSER 287
-#define PERCENT_OUTPUT 288
-#define PERCENT_PARSE_PARAM 289
-#define PERCENT_PURE_PARSER 290
-#define PERCENT_REQUIRE 291
-#define PERCENT_SKELETON 292
-#define PERCENT_START 293
-#define PERCENT_TOKEN_TABLE 294
-#define PERCENT_VERBOSE 295
-#define PERCENT_YACC 296
-#define TYPE 297
-#define EQUAL 298
-#define SEMICOLON 299
-#define PIPE 300
-#define ID 301
-#define ID_COLON 302
-#define PERCENT_PERCENT 303
-#define PROLOGUE 304
-#define EPILOGUE 305
-#define BRACED_CODE 306
-
-
-
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 94 "parse-gram.y"
-{
-  symbol *symbol;
-  symbol_list *list;
-  int integer;
-  char *chars;
-  assoc assoc;
-  uniqstr uniqstr;
-}
-/* Line 1529 of yacc.c.  */
-#line 162 "parse-gram.h"
-	YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-
-
-#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
-typedef struct YYLTYPE
-{
-  int first_line;
-  int first_column;
-  int last_line;
-  int last_column;
-} YYLTYPE;
-# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
-# define YYLTYPE_IS_DECLARED 1
-# define YYLTYPE_IS_TRIVIAL 1
-#endif
-
-
diff --git a/src/parse-gram.y b/src/parse-gram.y
deleted file mode 100644
index e189e14..0000000
--- a/src/parse-gram.y
+++ /dev/null
@@ -1,590 +0,0 @@
-%{/* Bison Grammar Parser                             -*- C -*-
-
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   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 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, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301  USA
-*/
-
-#include <config.h>
-#include "system.h"
-
-#include "complain.h"
-#include "conflicts.h"
-#include "files.h"
-#include "getargs.h"
-#include "gram.h"
-#include "muscle_tab.h"
-#include "quotearg.h"
-#include "reader.h"
-#include "symlist.h"
-#include "strverscmp.h"
-
-#define YYLLOC_DEFAULT(Current, Rhs, N)  (Current) = lloc_default (Rhs, N)
-static YYLTYPE lloc_default (YYLTYPE const *, int);
-
-#define YY_LOCATION_PRINT(File, Loc) \
-	  location_print (File, Loc)
-
-static void version_check (location const *loc, char const *version);
-
-/* Request detailed syntax error messages, and pass them to GRAM_ERROR.
-   FIXME: depends on the undocumented availability of YYLLOC.  */
-#undef  yyerror
-#define yyerror(Msg) \
-	gram_error (&yylloc, Msg)
-static void gram_error (location const *, char const *);
-
-static void add_param (char const *, char *, location);
-
-static symbol_class current_class = unknown_sym;
-static uniqstr current_type = 0;
-static symbol *current_lhs;
-static location current_lhs_location;
-static int current_prec = 0;
-
-#ifdef UINT_FAST8_MAX
-# define YYTYPE_UINT8 uint_fast8_t
-#endif
-#ifdef INT_FAST8_MAX
-# define YYTYPE_INT8 int_fast8_t
-#endif
-#ifdef UINT_FAST16_MAX
-# define YYTYPE_UINT16 uint_fast16_t
-#endif
-#ifdef INT_FAST16_MAX
-# define YYTYPE_INT16 int_fast16_t
-#endif
-%}
-
-%debug
-%verbose
-%defines
-%locations
-%pure-parser
-%error-verbose
-%defines
-%name-prefix="gram_"
-
-%initial-action
-{
-  /* Bison's grammar can initial empty locations, hence a default
-     location is needed. */
-  @$.start.file   = @$.end.file   = current_file;
-  @$.start.line   = @$.end.line   = 1;
-  @$.start.column = @$.end.column = 0;
-}
-
-/* Only NUMBERS have a value.  */
-%union
-{
-  symbol *symbol;
-  symbol_list *list;
-  int integer;
-  char *chars;
-  assoc assoc;
-  uniqstr uniqstr;
-};
-
-/* Define the tokens together with their human representation.  */
-%token GRAM_EOF 0 "end of file"
-%token STRING     "string"
-%token INT        "integer"
-
-%token PERCENT_TOKEN       "%token"
-%token PERCENT_NTERM       "%nterm"
-
-%token PERCENT_TYPE        "%type"
-%token PERCENT_DESTRUCTOR  "%destructor {...}"
-%token PERCENT_PRINTER     "%printer {...}"
-
-%token PERCENT_UNION       "%union {...}"
-
-%token PERCENT_LEFT        "%left"
-%token PERCENT_RIGHT       "%right"
-%token PERCENT_NONASSOC    "%nonassoc"
-
-%token PERCENT_PREC          "%prec"
-%token PERCENT_DPREC         "%dprec"
-%token PERCENT_MERGE         "%merge"
-
-
-/*----------------------.
-| Global Declarations.  |
-`----------------------*/
-
-%token
-  PERCENT_DEBUG           "%debug"
-  PERCENT_DEFAULT_PREC    "%default-prec"
-  PERCENT_DEFINE          "%define"
-  PERCENT_DEFINES         "%defines"
-  PERCENT_ERROR_VERBOSE   "%error-verbose"
-  PERCENT_EXPECT          "%expect"
-  PERCENT_EXPECT_RR	  "%expect-rr"
-  PERCENT_FILE_PREFIX     "%file-prefix"
-  PERCENT_GLR_PARSER      "%glr-parser"
-  PERCENT_INITIAL_ACTION  "%initial-action {...}"
-  PERCENT_LEX_PARAM       "%lex-param {...}"
-  PERCENT_LOCATIONS       "%locations"
-  PERCENT_NAME_PREFIX     "%name-prefix"
-  PERCENT_NO_DEFAULT_PREC "%no-default-prec"
-  PERCENT_NO_LINES        "%no-lines"
-  PERCENT_NONDETERMINISTIC_PARSER
-			  "%nondeterministic-parser"
-  PERCENT_OUTPUT          "%output"
-  PERCENT_PARSE_PARAM     "%parse-param {...}"
-  PERCENT_PURE_PARSER     "%pure-parser"
-  PERCENT_REQUIRE	  "%require"
-  PERCENT_SKELETON        "%skeleton"
-  PERCENT_START           "%start"
-  PERCENT_TOKEN_TABLE     "%token-table"
-  PERCENT_VERBOSE         "%verbose"
-  PERCENT_YACC            "%yacc"
-;
-
-%token TYPE            "type"
-%token EQUAL           "="
-%token SEMICOLON       ";"
-%token PIPE            "|"
-%token ID              "identifier"
-%token ID_COLON        "identifier:"
-%token PERCENT_PERCENT "%%"
-%token PROLOGUE        "%{...%}"
-%token EPILOGUE        "epilogue"
-%token BRACED_CODE     "{...}"
-
-
-%type <chars> STRING string_content
-	      "%destructor {...}"
-	      "%initial-action {...}"
-	      "%lex-param {...}"
-	      "%parse-param {...}"
-	      "%printer {...}"
-	      "%union {...}"
-	      PROLOGUE EPILOGUE
-%printer { fprintf (stderr, "\"%s\"", $$); }
-	      STRING string_content
-%printer { fprintf (stderr, "{\n%s\n}", $$); }
-	      "%destructor {...}"
-	      "%initial-action {...}"
-	      "%lex-param {...}"
-	      "%parse-param {...}"
-	      "%printer {...}"
-	      "%union {...}"
-	      PROLOGUE EPILOGUE
-%type <uniqstr> TYPE
-%printer { fprintf (stderr, "<%s>", $$); } TYPE
-%type <integer> INT
-%printer { fprintf (stderr, "%d", $$); } INT
-%type <symbol> ID symbol string_as_id
-%printer { fprintf (stderr, "%s", $$->tag); } ID symbol string_as_id
-%type <symbol> ID_COLON
-%printer { fprintf (stderr, "%s:", $$->tag); } ID_COLON
-%type <assoc> precedence_declarator
-%type <list>  symbols.1
-%%
-
-input:
-  declarations "%%" grammar epilogue.opt
-;
-
-
-	/*------------------------------------.
-	| Declarations: before the first %%.  |
-	`------------------------------------*/
-
-declarations:
-  /* Nothing */
-| declarations declaration
-;
-
-declaration:
-  grammar_declaration
-| PROLOGUE                                 { prologue_augment ($1, @1); }
-| "%debug"                                 { debug_flag = true; }
-| "%define" string_content
-    {
-      static char one[] = "1";
-      muscle_insert ($2, one);
-    }
-| "%define" string_content string_content  { muscle_insert ($2, $3); }
-| "%defines"                               { defines_flag = true; }
-| "%error-verbose"                         { error_verbose = true; }
-| "%expect" INT                            { expected_sr_conflicts = $2; }
-| "%expect-rr" INT			   { expected_rr_conflicts = $2; }
-| "%file-prefix" "=" string_content        { spec_file_prefix = $3; }
-| "%glr-parser"
-    {
-      nondeterministic_parser = true;
-      glr_parser = true;
-    }
-| "%initial-action {...}"
-    {
-      muscle_code_grow ("initial_action", $1, @1);
-    }
-| "%lex-param {...}"			   { add_param ("lex_param", $1, @1); }
-| "%locations"                             { locations_flag = true; }
-| "%name-prefix" "=" string_content        { spec_name_prefix = $3; }
-| "%no-lines"                              { no_lines_flag = true; }
-| "%nondeterministic-parser"		   { nondeterministic_parser = true; }
-| "%output" "=" string_content             { spec_outfile = $3; }
-| "%parse-param {...}"			   { add_param ("parse_param", $1, @1); }
-| "%pure-parser"                           { pure_parser = true; }
-| "%require" string_content                { version_check (&@2, $2); }
-| "%skeleton" string_content               { skeleton = $2; }
-| "%token-table"                           { token_table_flag = true; }
-| "%verbose"                               { report_flag = report_states; }
-| "%yacc"                                  { yacc_flag = true; }
-| /*FIXME: Err?  What is this horror doing here? */ ";"
-;
-
-grammar_declaration:
-  precedence_declaration
-| symbol_declaration
-| "%start" symbol
-    {
-      grammar_start_symbol_set ($2, @2);
-    }
-| "%union {...}"
-    {
-      char const *body = $1;
-
-      if (typed)
-	{
-	  /* Concatenate the union bodies, turning the first one's
-	     trailing '}' into '\n', and omitting the second one's '{'.  */
-	  char *code = muscle_find ("stype");
-	  code[strlen (code) - 1] = '\n';
-	  body++;
-	}
-
-      typed = true;
-      muscle_code_grow ("stype", body, @1);
-    }
-| "%destructor {...}" symbols.1
-    {
-      symbol_list *list;
-      for (list = $2; list; list = list->next)
-	symbol_destructor_set (list->sym, $1, @1);
-      symbol_list_free ($2);
-    }
-| "%printer {...}" symbols.1
-    {
-      symbol_list *list;
-      for (list = $2; list; list = list->next)
-	symbol_printer_set (list->sym, $1, @1);
-      symbol_list_free ($2);
-    }
-| "%default-prec"
-    {
-      default_prec = true;
-    }
-| "%no-default-prec"
-    {
-      default_prec = false;
-    }
-;
-
-symbol_declaration:
-  "%nterm" { current_class = nterm_sym; } symbol_defs.1
-    {
-      current_class = unknown_sym;
-      current_type = NULL;
-    }
-| "%token" { current_class = token_sym; } symbol_defs.1
-    {
-      current_class = unknown_sym;
-      current_type = NULL;
-    }
-| "%type" TYPE symbols.1
-    {
-      symbol_list *list;
-      for (list = $3; list; list = list->next)
-	symbol_type_set (list->sym, $2, @2);
-      symbol_list_free ($3);
-    }
-;
-
-precedence_declaration:
-  precedence_declarator type.opt symbols.1
-    {
-      symbol_list *list;
-      ++current_prec;
-      for (list = $3; list; list = list->next)
-	{
-	  symbol_type_set (list->sym, current_type, @2);
-	  symbol_precedence_set (list->sym, current_prec, $1, @1);
-	}
-      symbol_list_free ($3);
-      current_type = NULL;
-    }
-;
-
-precedence_declarator:
-  "%left"     { $$ = left_assoc; }
-| "%right"    { $$ = right_assoc; }
-| "%nonassoc" { $$ = non_assoc; }
-;
-
-type.opt:
-  /* Nothing. */ { current_type = NULL; }
-| TYPE           { current_type = $1; }
-;
-
-/* One or more nonterminals to be %typed. */
-
-symbols.1:
-  symbol            { $$ = symbol_list_new ($1, @1); }
-| symbols.1 symbol  { $$ = symbol_list_prepend ($1, $2, @2); }
-;
-
-/* One token definition.  */
-symbol_def:
-  TYPE
-     {
-       current_type = $1;
-     }
-| ID
-     {
-       symbol_class_set ($1, current_class, @1, true);
-       symbol_type_set ($1, current_type, @1);
-     }
-| ID INT
-    {
-      symbol_class_set ($1, current_class, @1, true);
-      symbol_type_set ($1, current_type, @1);
-      symbol_user_token_number_set ($1, $2, @2);
-    }
-| ID string_as_id
-    {
-      symbol_class_set ($1, current_class, @1, true);
-      symbol_type_set ($1, current_type, @1);
-      symbol_make_alias ($1, $2, @$);
-    }
-| ID INT string_as_id
-    {
-      symbol_class_set ($1, current_class, @1, true);
-      symbol_type_set ($1, current_type, @1);
-      symbol_user_token_number_set ($1, $2, @2);
-      symbol_make_alias ($1, $3, @$);
-    }
-;
-
-/* One or more symbol definitions. */
-symbol_defs.1:
-  symbol_def
-| symbol_defs.1 symbol_def
-;
-
-
-	/*------------------------------------------.
-	| The grammar section: between the two %%.  |
-	`------------------------------------------*/
-
-grammar:
-  rules_or_grammar_declaration
-| grammar rules_or_grammar_declaration
-;
-
-/* As a Bison extension, one can use the grammar declarations in the
-   body of the grammar.  */
-rules_or_grammar_declaration:
-  rules
-| grammar_declaration ";"
-| error ";"
-    {
-      yyerrok;
-    }
-;
-
-rules:
-  ID_COLON { current_lhs = $1; current_lhs_location = @1; } rhses.1
-;
-
-rhses.1:
-  rhs                { grammar_current_rule_end (@1); }
-| rhses.1 "|" rhs    { grammar_current_rule_end (@3); }
-| rhses.1 ";"
-;
-
-rhs:
-  /* Nothing.  */
-    { grammar_current_rule_begin (current_lhs, current_lhs_location); }
-| rhs symbol
-    { grammar_current_rule_symbol_append ($2, @2); }
-| rhs action
-| rhs "%prec" symbol
-    { grammar_current_rule_prec_set ($3, @3); }
-| rhs "%dprec" INT
-    { grammar_current_rule_dprec_set ($3, @3); }
-| rhs "%merge" TYPE
-    { grammar_current_rule_merge_set ($3, @3); }
-;
-
-symbol:
-  ID              { $$ = $1; }
-| string_as_id    { $$ = $1; }
-;
-
-/* Handle the semantics of an action specially, with a mid-rule
-   action, so that grammar_current_rule_action_append is invoked
-   immediately after the braced code is read by the scanner.
-
-   This implementation relies on the LALR(1) parsing algorithm.
-   If grammar_current_rule_action_append were executed in a normal
-   action for this rule, then when the input grammar contains two
-   successive actions, the scanner would have to read both actions
-   before reducing this rule.  That wouldn't work, since the scanner
-   relies on all preceding input actions being processed by
-   grammar_current_rule_action_append before it scans the next
-   action.  */
-action:
-    { grammar_current_rule_action_append (last_string, last_braced_code_loc); }
-  BRACED_CODE
-;
-
-/* A string used as an ID: quote it.  */
-string_as_id:
-  STRING
-    {
-      $$ = symbol_get (quotearg_style (c_quoting_style, $1), @1);
-      symbol_class_set ($$, token_sym, @1, false);
-    }
-;
-
-/* A string used for its contents.  Don't quote it.  */
-string_content:
-  STRING
-    { $$ = $1; }
-;
-
-
-epilogue.opt:
-  /* Nothing.  */
-| "%%" EPILOGUE
-    {
-      muscle_code_grow ("epilogue", $2, @2);
-      scanner_last_string_free ();
-    }
-;
-
-%%
-
-
-/* Return the location of the left-hand side of a rule whose
-   right-hand side is RHS[1] ... RHS[N].  Ignore empty nonterminals in
-   the right-hand side, and return an empty location equal to the end
-   boundary of RHS[0] if the right-hand side is empty.  */
-
-static YYLTYPE
-lloc_default (YYLTYPE const *rhs, int n)
-{
-  int i;
-  YYLTYPE loc;
-
-  /* SGI MIPSpro 7.4.1m miscompiles "loc.start = loc.end = rhs[n].end;".
-     The bug is fixed in 7.4.2m, but play it safe for now.  */
-  loc.start = rhs[n].end;
-  loc.end = rhs[n].end;
-
-  /* Ignore empty nonterminals the start of the the right-hand side.
-     Do not bother to ignore them at the end of the right-hand side,
-     since empty nonterminals have the same end as their predecessors.  */
-  for (i = 1; i <= n; i++)
-    if (! equal_boundaries (rhs[i].start, rhs[i].end))
-      {
-	loc.start = rhs[i].start;
-	break;
-      }
-
-  return loc;
-}
-
-
-/* Add a lex-param or a parse-param (depending on TYPE) with
-   declaration DECL and location LOC.  */
-
-static void
-add_param (char const *type, char *decl, location loc)
-{
-  static char const alphanum[26 + 26 + 1 + 10] =
-    "abcdefghijklmnopqrstuvwxyz"
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-    "_"
-    "0123456789";
-  char const *name_start = NULL;
-  char *p;
-
-  /* Stop on last actual character.  */
-  for (p = decl; p[1]; p++)
-    if ((p == decl
-	 || ! memchr (alphanum, p[-1], sizeof alphanum))
-	&& memchr (alphanum, p[0], sizeof alphanum - 10))
-      name_start = p;
-
-  /* Strip the surrounding '{' and '}', and any blanks just inside
-     the braces.  */
-  while (*--p == ' ' || *p == '\t')
-    continue;
-  p[1] = '\0';
-  while (*++decl == ' ' || *decl == '\t')
-    continue;
-
-  if (! name_start)
-    complain_at (loc, _("missing identifier in parameter declaration"));
-  else
-    {
-      char *name;
-      size_t name_len;
-
-      for (name_len = 1;
-	   memchr (alphanum, name_start[name_len], sizeof alphanum);
-	   name_len++)
-	continue;
-
-      name = xmalloc (name_len + 1);
-      memcpy (name, name_start, name_len);
-      name[name_len] = '\0';
-      muscle_pair_list_grow (type, decl, name);
-      free (name);
-    }
-
-  scanner_last_string_free ();
-}
-
-static void
-version_check (location const *loc, char const *version)
-{
-  if (strverscmp (version, PACKAGE_VERSION) > 0)
-    {
-      complain_at (*loc, "require bison %s, but have %s",
-		   version, PACKAGE_VERSION);
-      exit (63);
-    }
-}
-
-static void
-gram_error (location const *loc, char const *msg)
-{
-  complain_at (*loc, "%s", msg);
-}
-
-char const *
-token_name (int type)
-{
-  return yytname[YYTRANSLATE (type)];
-}
diff --git a/src/print.c b/src/print.c
deleted file mode 100644
index cb1600c..0000000
--- a/src/print.c
+++ /dev/null
@@ -1,575 +0,0 @@
-/* Print information on generated parser, for bison,
-
-   Copyright (C) 1984, 1986, 1989, 2000, 2001, 2002, 2003, 2004, 2005
-   Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <bitset.h>
-#include <quotearg.h>
-
-#include "LR0.h"
-#include "closure.h"
-#include "conflicts.h"
-#include "files.h"
-#include "getargs.h"
-#include "gram.h"
-#include "lalr.h"
-#include "print.h"
-#include "reader.h"
-#include "reduce.h"
-#include "state.h"
-#include "symtab.h"
-
-static bitset shift_set;
-static bitset look_ahead_set;
-
-#if 0
-static void
-print_token (int extnum, int token)
-{
-  fprintf (out, _(" type %d is %s\n"), extnum, tags[token]);
-}
-#endif
-
-
-
-/*---------------------------------------.
-| *WIDTH := max (*WIDTH, strlen (STR)).  |
-`---------------------------------------*/
-
-static void
-max_length (size_t *width, const char *str)
-{
-  size_t len = strlen (str);
-  if (len > *width)
-    *width = len;
-}
-
-/*--------------------------------.
-| Report information on a state.  |
-`--------------------------------*/
-
-static void
-print_core (FILE *out, state *s)
-{
-  size_t i;
-  item_number *sitems = s->items;
-  size_t snritems = s->nitems;
-  symbol *previous_lhs = NULL;
-
-  /* Output all the items of a state, not only its kernel.  */
-  if (report_flag & report_itemsets)
-    {
-      closure (sitems, snritems);
-      sitems = itemset;
-      snritems = nritemset;
-    }
-
-  if (!snritems)
-    return;
-
-  fputc ('\n', out);
-
-  for (i = 0; i < snritems; i++)
-    {
-      item_number *sp;
-      item_number *sp1;
-      rule_number r;
-
-      sp1 = sp = ritem + sitems[i];
-
-      while (*sp >= 0)
-	sp++;
-
-      r = item_number_as_rule_number (*sp);
-
-      rule_lhs_print (&rules[r], previous_lhs, out);
-      previous_lhs = rules[r].lhs;
-
-      for (sp = rules[r].rhs; sp < sp1; sp++)
-	fprintf (out, " %s", symbols[*sp]->tag);
-      fputs (" .", out);
-      for (/* Nothing */; *sp >= 0; ++sp)
-	fprintf (out, " %s", symbols[*sp]->tag);
-
-      /* Display the look-ahead tokens?  */
-      if (report_flag & report_look_ahead_tokens)
-	state_rule_look_ahead_tokens_print (s, &rules[r], out);
-
-      fputc ('\n', out);
-    }
-}
-
-
-/*------------------------------------------------------------.
-| Report the shifts iff DISPLAY_SHIFTS_P or the gotos of S on |
-| OUT.                                                        |
-`------------------------------------------------------------*/
-
-static void
-print_transitions (state *s, FILE *out, bool display_transitions_p)
-{
-  transitions *trans = s->transitions;
-  size_t width = 0;
-  int i;
-
-  /* Compute the width of the look-ahead token column.  */
-  for (i = 0; i < trans->num; i++)
-    if (!TRANSITION_IS_DISABLED (trans, i)
-	&& TRANSITION_IS_SHIFT (trans, i) == display_transitions_p)
-      {
-	symbol *sym = symbols[TRANSITION_SYMBOL (trans, i)];
-	max_length (&width, sym->tag);
-      }
-
-  /* Nothing to report. */
-  if (!width)
-    return;
-
-  fputc ('\n', out);
-  width += 2;
-
-  /* Report look-ahead tokens and shifts.  */
-  for (i = 0; i < trans->num; i++)
-    if (!TRANSITION_IS_DISABLED (trans, i)
-	&& TRANSITION_IS_SHIFT (trans, i) == display_transitions_p)
-      {
-	symbol *sym = symbols[TRANSITION_SYMBOL (trans, i)];
-	const char *tag = sym->tag;
-	state *s1 = trans->states[i];
-	int j;
-
-	fprintf (out, "    %s", tag);
-	for (j = width - strlen (tag); j > 0; --j)
-	  fputc (' ', out);
-	if (display_transitions_p)
-	  fprintf (out, _("shift, and go to state %d\n"), s1->number);
-	else
-	  fprintf (out, _("go to state %d\n"), s1->number);
-      }
-}
-
-
-/*--------------------------------------------------------.
-| Report the explicit errors of S raised from %nonassoc.  |
-`--------------------------------------------------------*/
-
-static void
-print_errs (FILE *out, state *s)
-{
-  errs *errp = s->errs;
-  size_t width = 0;
-  int i;
-
-  /* Compute the width of the look-ahead token column.  */
-  for (i = 0; i < errp->num; ++i)
-    if (errp->symbols[i])
-      max_length (&width, errp->symbols[i]->tag);
-
-  /* Nothing to report. */
-  if (!width)
-    return;
-
-  fputc ('\n', out);
-  width += 2;
-
-  /* Report look-ahead tokens and errors.  */
-  for (i = 0; i < errp->num; ++i)
-    if (errp->symbols[i])
-      {
-	const char *tag = errp->symbols[i]->tag;
-	int j;
-	fprintf (out, "    %s", tag);
-	for (j = width - strlen (tag); j > 0; --j)
-	  fputc (' ', out);
-	fputs (_("error (nonassociative)\n"), out);
-      }
-}
-
-
-/*-------------------------------------------------------------.
-| Return the default rule of S if it has one, NULL otherwise.  |
-`-------------------------------------------------------------*/
-
-static rule *
-state_default_rule (state *s)
-{
-  reductions *reds = s->reductions;
-  rule *default_rule = NULL;
-  int cmax = 0;
-  int i;
-
-  /* No need for a look-ahead.  */
-  if (s->consistent)
-    return reds->rules[0];
-
-  /* 1. Each reduction is possibly masked by the look-ahead tokens on which
-     we shift (S/R conflicts)...  */
-  bitset_zero (shift_set);
-  {
-    transitions *trans = s->transitions;
-    FOR_EACH_SHIFT (trans, i)
-      {
-	/* If this state has a shift for the error token, don't use a
-	     default rule.  */
-	if (TRANSITION_IS_ERROR (trans, i))
-	  return NULL;
-	bitset_set (shift_set, TRANSITION_SYMBOL (trans, i));
-      }
-  }
-
-  /* 2. Each reduction is possibly masked by the look-ahead tokens on which
-     we raise an error (due to %nonassoc).  */
-  {
-    errs *errp = s->errs;
-    for (i = 0; i < errp->num; i++)
-      if (errp->symbols[i])
-	bitset_set (shift_set, errp->symbols[i]->number);
-  }
-
-  for (i = 0; i < reds->num; ++i)
-    {
-      int count = 0;
-
-      /* How many non-masked look-ahead tokens are there for this
-	 reduction?  */
-      bitset_andn (look_ahead_set, reds->look_ahead_tokens[i], shift_set);
-      count = bitset_count (look_ahead_set);
-
-      if (count > cmax)
-	{
-	  cmax = count;
-	  default_rule = reds->rules[i];
-	}
-
-      /* 3. And finally, each reduction is possibly masked by previous
-	 reductions (in R/R conflicts, we keep the first reductions).
-	 */
-      bitset_or (shift_set, shift_set, reds->look_ahead_tokens[i]);
-    }
-
-  return default_rule;
-}
-
-
-/*--------------------------------------------------------------------------.
-| Report a reduction of RULE on LOOK_AHEAD_TOKEN (which can be `default').  |
-| If not ENABLED, the rule is masked by a shift or a reduce (S/R and        |
-| R/R conflicts).                                                           |
-`--------------------------------------------------------------------------*/
-
-static void
-print_reduction (FILE *out, size_t width,
-		 const char *look_ahead_token,
-		 rule *r, bool enabled)
-{
-  int j;
-  fprintf (out, "    %s", look_ahead_token);
-  for (j = width - strlen (look_ahead_token); j > 0; --j)
-    fputc (' ', out);
-  if (!enabled)
-    fputc ('[', out);
-  if (r->number)
-    fprintf (out, _("reduce using rule %d (%s)"), r->number, r->lhs->tag);
-  else
-    fprintf (out, _("accept"));
-  if (!enabled)
-    fputc (']', out);
-  fputc ('\n', out);
-}
-
-
-/*-------------------------------------------.
-| Report on OUT the reduction actions of S.  |
-`-------------------------------------------*/
-
-static void
-print_reductions (FILE *out, state *s)
-{
-  transitions *trans = s->transitions;
-  reductions *reds = s->reductions;
-  rule *default_rule = NULL;
-  size_t width = 0;
-  int i, j;
-
-  if (reds->num == 0)
-    return;
-
-  default_rule = state_default_rule (s);
-
-  bitset_zero (shift_set);
-  FOR_EACH_SHIFT (trans, i)
-    bitset_set (shift_set, TRANSITION_SYMBOL (trans, i));
-
-  /* Compute the width of the look-ahead token column.  */
-  if (default_rule)
-    width = strlen (_("$default"));
-
-  if (reds->look_ahead_tokens)
-    for (i = 0; i < ntokens; i++)
-      {
-	bool count = bitset_test (shift_set, i);
-
-	for (j = 0; j < reds->num; ++j)
-	  if (bitset_test (reds->look_ahead_tokens[j], i))
-	    {
-	      if (! count)
-		{
-		  if (reds->rules[j] != default_rule)
-		    max_length (&width, symbols[i]->tag);
-		  count = true;
-		}
-	      else
-		{
-		  max_length (&width, symbols[i]->tag);
-		}
-	    }
-      }
-
-  /* Nothing to report. */
-  if (!width)
-    return;
-
-  fputc ('\n', out);
-  width += 2;
-
-  /* Report look-ahead tokens (or $default) and reductions.  */
-  if (reds->look_ahead_tokens)
-    for (i = 0; i < ntokens; i++)
-      {
-	bool defaulted = false;
-	bool count = bitset_test (shift_set, i);
-
-	for (j = 0; j < reds->num; ++j)
-	  if (bitset_test (reds->look_ahead_tokens[j], i))
-	    {
-	      if (! count)
-		{
-		  if (reds->rules[j] != default_rule)
-		    print_reduction (out, width,
-				     symbols[i]->tag,
-				     reds->rules[j], true);
-		  else
-		    defaulted = true;
-		  count = true;
-		}
-	      else
-		{
-		  if (defaulted)
-		    print_reduction (out, width,
-				     symbols[i]->tag,
-				     default_rule, true);
-		  defaulted = false;
-		  print_reduction (out, width,
-				   symbols[i]->tag,
-				   reds->rules[j], false);
-		}
-	    }
-      }
-
-  if (default_rule)
-    print_reduction (out, width,
-		     _("$default"), default_rule, true);
-}
-
-
-/*--------------------------------------------------------------.
-| Report on OUT all the actions (shifts, gotos, reductions, and |
-| explicit erros from %nonassoc) of S.                          |
-`--------------------------------------------------------------*/
-
-static void
-print_actions (FILE *out, state *s)
-{
-  /* Print shifts.  */
-  print_transitions (s, out, true);
-  print_errs (out, s);
-  print_reductions (out, s);
-  /* Print gotos.  */
-  print_transitions (s, out, false);
-}
-
-
-/*----------------------------------.
-| Report all the data on S on OUT.  |
-`----------------------------------*/
-
-static void
-print_state (FILE *out, state *s)
-{
-  fputs ("\n\n", out);
-  fprintf (out, _("state %d"), s->number);
-  fputc ('\n', out);
-  print_core (out, s);
-  print_actions (out, s);
-  if ((report_flag & report_solved_conflicts) && s->solved_conflicts)
-    {
-      fputc ('\n', out);
-      fputs (s->solved_conflicts, out);
-    }
-}
-
-/*-----------------------------------------.
-| Print information on the whole grammar.  |
-`-----------------------------------------*/
-
-#define END_TEST(End)				\
-do {						\
-  if (column + strlen(buffer) > (End))		\
-    {						\
-      fprintf (out, "%s\n   ", buffer);		\
-      column = 3;				\
-      buffer[0] = 0;				\
-    }						\
-} while (0)
-
-
-static void
-print_grammar (FILE *out)
-{
-  symbol_number i;
-  char buffer[90];
-  int column = 0;
-
-  grammar_rules_print (out);
-
-  /* TERMINAL (type #) : rule #s terminal is on RHS */
-  fprintf (out, "%s\n\n", _("Terminals, with rules where they appear"));
-  for (i = 0; i < max_user_token_number + 1; i++)
-    if (token_translations[i] != undeftoken->number)
-      {
-	const char *tag = symbols[token_translations[i]]->tag;
-	rule_number r;
-	item_number *rhsp;
-
-	buffer[0] = 0;
-	column = strlen (tag);
-	fputs (tag, out);
-	END_TEST (50);
-	sprintf (buffer, " (%d)", i);
-
-	for (r = 0; r < nrules; r++)
-	  for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++)
-	    if (item_number_as_symbol_number (*rhsp) == token_translations[i])
-	      {
-		END_TEST (65);
-		sprintf (buffer + strlen (buffer), " %d", r);
-		break;
-	      }
-	fprintf (out, "%s\n", buffer);
-      }
-  fputs ("\n\n", out);
-
-
-  fprintf (out, "%s\n\n", _("Nonterminals, with rules where they appear"));
-  for (i = ntokens; i < nsyms; i++)
-    {
-      int left_count = 0, right_count = 0;
-      rule_number r;
-      const char *tag = symbols[i]->tag;
-
-      for (r = 0; r < nrules; r++)
-	{
-	  item_number *rhsp;
-	  if (rules[r].lhs->number == i)
-	    left_count++;
-	  for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++)
-	    if (item_number_as_symbol_number (*rhsp) == i)
-	      {
-		right_count++;
-		break;
-	      }
-	}
-
-      buffer[0] = 0;
-      fputs (tag, out);
-      column = strlen (tag);
-      sprintf (buffer, " (%d)", i);
-      END_TEST (0);
-
-      if (left_count > 0)
-	{
-	  END_TEST (50);
-	  sprintf (buffer + strlen (buffer), _(" on left:"));
-
-	  for (r = 0; r < nrules; r++)
-	    {
-	      END_TEST (65);
-	      if (rules[r].lhs->number == i)
-		sprintf (buffer + strlen (buffer), " %d", r);
-	    }
-	}
-
-      if (right_count > 0)
-	{
-	  if (left_count > 0)
-	    sprintf (buffer + strlen (buffer), ",");
-	  END_TEST (50);
-	  sprintf (buffer + strlen (buffer), _(" on right:"));
-	  for (r = 0; r < nrules; r++)
-	    {
-	      item_number *rhsp;
-	      for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++)
-		if (item_number_as_symbol_number (*rhsp) == i)
-		  {
-		    END_TEST (65);
-		    sprintf (buffer + strlen (buffer), " %d", r);
-		    break;
-		  }
-	    }
-	}
-      fprintf (out, "%s\n", buffer);
-    }
-}
-
-void
-print_results (void)
-{
-  state_number i;
-
-  /* We used to use just .out if SPEC_NAME_PREFIX (-p) was used, but
-     that conflicts with Posix.  */
-  FILE *out = xfopen (spec_verbose_file, "w");
-
-  reduce_output (out);
-  grammar_rules_partial_print (out,
-			       _("Rules never reduced"), rule_never_reduced_p);
-  conflicts_output (out);
-
-  print_grammar (out);
-
-  /* If the whole state item sets, not only the kernels, are wanted,
-     `closure' will be run, which needs memory allocation/deallocation.   */
-  if (report_flag & report_itemsets)
-    new_closure (nritems);
-  /* Storage for print_reductions.  */
-  shift_set =  bitset_create (ntokens, BITSET_FIXED);
-  look_ahead_set = bitset_create (ntokens, BITSET_FIXED);
-  for (i = 0; i < nstates; i++)
-    print_state (out, states[i]);
-  bitset_free (shift_set);
-  bitset_free (look_ahead_set);
-  if (report_flag & report_itemsets)
-    free_closure ();
-
-  xfclose (out);
-}
diff --git a/src/print.h b/src/print.h
deleted file mode 100644
index 1daa577..0000000
--- a/src/print.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Print information on generated parser, for bison,
-   Copyright 2000 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef PRINT_H_
-# define PRINT_H_
-
-void print_results (void);
-
-#endif /* !PRINT_H_ */
diff --git a/src/print_graph.c b/src/print_graph.c
deleted file mode 100644
index 9580f3f..0000000
--- a/src/print_graph.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/* Output a VCG description on generated parser, for Bison,
-
-   Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <quotearg.h>
-
-#include "LR0.h"
-#include "closure.h"
-#include "complain.h"
-#include "conflicts.h"
-#include "files.h"
-#include "getargs.h"
-#include "gram.h"
-#include "lalr.h"
-#include "print_graph.h"
-#include "reader.h"
-#include "state.h"
-#include "symtab.h"
-#include "vcg.h"
-
-static graph static_graph;
-static FILE *fgraph = NULL;
-
-
-/*----------------------------.
-| Construct the node labels.  |
-`----------------------------*/
-
-static void
-print_core (struct obstack *oout, state *s)
-{
-  size_t i;
-  item_number *sitems = s->items;
-  size_t snritems = s->nitems;
-
-  /* Output all the items of a state, not only its kernel.  */
-  if (report_flag & report_itemsets)
-    {
-      closure (sitems, snritems);
-      sitems = itemset;
-      snritems = nritemset;
-    }
-
-  obstack_fgrow1 (oout, "state %2d\n", s->number);
-  for (i = 0; i < snritems; i++)
-    {
-      item_number *sp;
-      item_number *sp1;
-      rule_number r;
-
-      sp1 = sp = ritem + sitems[i];
-
-      while (*sp >= 0)
-	sp++;
-
-      r = item_number_as_rule_number (*sp);
-
-      if (i)
-	obstack_1grow (oout, '\n');
-      obstack_fgrow1 (oout, " %s -> ",
-		      rules[r].lhs->tag);
-
-      for (sp = rules[r].rhs; sp < sp1; sp++)
-	obstack_fgrow1 (oout, "%s ", symbols[*sp]->tag);
-
-      obstack_1grow (oout, '.');
-
-      for (/* Nothing */; *sp >= 0; ++sp)
-	obstack_fgrow1 (oout, " %s", symbols[*sp]->tag);
-
-      /* Experimental feature: display the look-ahead tokens. */
-      if (report_flag & report_look_ahead_tokens)
-	{
-	  /* Find the reduction we are handling.  */
-	  reductions *reds = s->reductions;
-	  int redno = state_reduction_find (s, &rules[r]);
-
-	  /* Print them if there are.  */
-	  if (reds->look_ahead_tokens && redno != -1)
-	    {
-	      bitset_iterator biter;
-	      int k;
-	      char const *sep = "";
-	      obstack_sgrow (oout, "[");
-	      BITSET_FOR_EACH (biter, reds->look_ahead_tokens[redno], k, 0)
-		{
-		  obstack_fgrow2 (oout, "%s%s", sep, symbols[k]->tag);
-		  sep = ", ";
-		}
-	      obstack_sgrow (oout, "]");
-	    }
-	}
-    }
-}
-
-
-/*---------------------------------------------------------------.
-| Output in graph_obstack edges specifications in incidence with |
-| current node.                                                  |
-`---------------------------------------------------------------*/
-
-static void
-print_actions (state *s, const char *node_name)
-{
-  int i;
-
-  transitions *trans = s->transitions;
-  reductions *reds = s->reductions;
-
-  static char buff[10];
-  edge e;
-
-  if (!trans->num && !reds)
-    return;
-
-  for (i = 0; i < trans->num; i++)
-    if (!TRANSITION_IS_DISABLED (trans, i))
-      {
-	state *s1 = trans->states[i];
-	symbol_number sym = s1->accessing_symbol;
-
-	new_edge (&e);
-
-	if (s->number > s1->number)
-	  e.type = back_edge;
-	open_edge (&e, fgraph);
-	/* The edge source is the current node.  */
-	e.sourcename = node_name;
-	sprintf (buff, "%d", s1->number);
-	e.targetname = buff;
-	/* Shifts are blue, gotos are green, and error is red. */
-	if (TRANSITION_IS_ERROR (trans, i))
-	  e.color = red;
-	else
-	  e.color = TRANSITION_IS_SHIFT (trans, i) ? blue : green;
-	e.label = symbols[sym]->tag;
-	output_edge (&e, fgraph);
-	close_edge (fgraph);
-      }
-}
-
-
-/*-------------------------------------------------------------.
-| Output in FGRAPH the current node specifications and exiting |
-| edges.                                                       |
-`-------------------------------------------------------------*/
-
-static void
-print_state (state *s)
-{
-  static char name[10];
-  struct obstack node_obstack;
-  node n;
-
-  /* The labels of the nodes are their the items.  */
-  obstack_init (&node_obstack);
-  new_node (&n);
-  sprintf (name, "%d", s->number);
-  n.title = name;
-  print_core (&node_obstack, s);
-  obstack_1grow (&node_obstack, '\0');
-  n.label = obstack_finish (&node_obstack);
-
-  open_node (fgraph);
-  output_node (&n, fgraph);
-  close_node (fgraph);
-
-  /* Output the edges.  */
-  print_actions (s, name);
-
-  obstack_free (&node_obstack, 0);
-}
-
-
-void
-print_graph (void)
-{
-  state_number i;
-
-  /* Output file.  */
-  fgraph = xfopen (spec_graph_file, "w");
-
-  new_graph (&static_graph);
-
-  static_graph.display_edge_labels = yes;
-
-  static_graph.port_sharing = no;
-  static_graph.finetuning = yes;
-  static_graph.priority_phase = yes;
-  static_graph.splines = yes;
-
-  static_graph.crossing_weight = median;
-
-  /* Output graph options. */
-  open_graph (fgraph);
-  output_graph (&static_graph, fgraph);
-
-  /* Output nodes and edges. */
-  new_closure (nritems);
-  for (i = 0; i < nstates; i++)
-    print_state (states[i]);
-  free_closure ();
-
-  /* Close graph. */
-  close_graph (&static_graph, fgraph);
-  xfclose (fgraph);
-}
diff --git a/src/print_graph.h b/src/print_graph.h
deleted file mode 100644
index befc531..0000000
--- a/src/print_graph.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Output a VCG description on generated parser, for bison,
-   Copyright 2000 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef PRINT_GRAPH_H_
-# define PRINT_GRAPH_H_
-
-void print_graph (void);
-
-#endif /* !PRINT_GRAPH_H_ */
diff --git a/src/reader.c b/src/reader.c
deleted file mode 100644
index d07ce5c..0000000
--- a/src/reader.c
+++ /dev/null
@@ -1,576 +0,0 @@
-/* Input parser for Bison
-
-   Copyright (C) 1984, 1986, 1989, 1992, 1998, 2000, 2001, 2002, 2003,
-   2005, 2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <quotearg.h>
-
-#include "complain.h"
-#include "conflicts.h"
-#include "files.h"
-#include "getargs.h"
-#include "gram.h"
-#include "muscle_tab.h"
-#include "reader.h"
-#include "symlist.h"
-#include "symtab.h"
-
-static void check_and_convert_grammar (void);
-
-static symbol_list *grammar = NULL;
-static bool start_flag = false;
-merger_list *merge_functions;
-
-/* Was %union seen?  */
-bool typed = false;
-
-/* Should rules have a default precedence?  */
-bool default_prec = true;
-
-/*-----------------------.
-| Set the start symbol.  |
-`-----------------------*/
-
-void
-grammar_start_symbol_set (symbol *sym, location loc)
-{
-  if (start_flag)
-    complain_at (loc, _("multiple %s declarations"), "%start");
-  else
-    {
-      start_flag = true;
-      startsymbol = sym;
-      startsymbol_location = loc;
-    }
-}
-
-
-/*----------------------------------------------------------------.
-| There are two prologues: one before %union, one after.  Augment |
-| the current one.                                                |
-`----------------------------------------------------------------*/
-
-void
-prologue_augment (const char *prologue, location loc)
-{
-  struct obstack *oout =
-    !typed ? &pre_prologue_obstack : &post_prologue_obstack;
-
-  obstack_fgrow1 (oout, "]b4_syncline(%d, [[", loc.start.line);
-  MUSCLE_OBSTACK_SGROW (oout,
-			quotearg_style (c_quoting_style, loc.start.file));
-  obstack_sgrow (oout, "]])[\n");
-  obstack_sgrow (oout, prologue);
-}
-
-
-
-/*-------------------------------------------------------------------.
-| Return the merger index for a merging function named NAME, whose   |
-| arguments have type TYPE.  Records the function, if new, in        |
-| MERGER_LIST.							     |
-`-------------------------------------------------------------------*/
-
-static int
-get_merge_function (uniqstr name, uniqstr type, location loc)
-{
-  merger_list *syms;
-  merger_list head;
-  int n;
-
-  if (! glr_parser)
-    return 0;
-
-  if (type == NULL)
-    type = uniqstr_new ("");
-
-  head.next = merge_functions;
-  for (syms = &head, n = 1; syms->next; syms = syms->next, n += 1)
-    if (UNIQSTR_EQ (name, syms->next->name))
-      break;
-  if (syms->next == NULL)
-    {
-      syms->next = xmalloc (sizeof syms->next[0]);
-      syms->next->name = uniqstr_new (name);
-      syms->next->type = uniqstr_new (type);
-      syms->next->next = NULL;
-      merge_functions = head.next;
-    }
-  else if (!UNIQSTR_EQ (type, syms->next->type))
-    warn_at (loc, _("result type clash on merge function %s: <%s> != <%s>"),
-	     name, type, syms->next->type);
-  return n;
-}
-
-/*--------------------------------------.
-| Free all merge-function definitions.	|
-`--------------------------------------*/
-
-void
-free_merger_functions (void)
-{
-  merger_list *L0 = merge_functions;
-  while (L0)
-    {
-      merger_list *L1 = L0->next;
-      free (L0);
-      L0 = L1;
-    }
-}
-
-
-/*-------------------------------------------------------------------.
-| Parse the input grammar into a one symbol_list structure.  Each    |
-| rule is represented by a sequence of symbols: the left hand side   |
-| followed by the contents of the right hand side, followed by a     |
-| null pointer instead of a symbol to terminate the rule.  The next  |
-| symbol is the lhs of the following rule.                           |
-|                                                                    |
-| All actions are copied out, labelled by the rule number they apply |
-| to.                                                                |
-`-------------------------------------------------------------------*/
-
-/* The (currently) last symbol of GRAMMAR. */
-static symbol_list *grammar_end = NULL;
-
-/* Append SYM to the grammar.  */
-static void
-grammar_symbol_append (symbol *sym, location loc)
-{
-  symbol_list *p = symbol_list_new (sym, loc);
-
-  if (grammar_end)
-    grammar_end->next = p;
-  else
-    grammar = p;
-
-  grammar_end = p;
-
-  /* A null SYM stands for an end of rule; it is not an actual
-     part of it.  */
-  if (sym)
-    ++nritems;
-}
-
-/* The rule currently being defined, and the previous rule.
-   CURRENT_RULE points to the first LHS of the current rule, while
-   PREVIOUS_RULE_END points to the *end* of the previous rule (NULL).  */
-symbol_list *current_rule = NULL;
-static symbol_list *previous_rule_end = NULL;
-
-
-/*----------------------------------------------.
-| Create a new rule for LHS in to the GRAMMAR.  |
-`----------------------------------------------*/
-
-void
-grammar_current_rule_begin (symbol *lhs, location loc)
-{
-  if (!start_flag)
-    {
-      startsymbol = lhs;
-      startsymbol_location = loc;
-      start_flag = true;
-    }
-
-  /* Start a new rule and record its lhs.  */
-  ++nrules;
-  previous_rule_end = grammar_end;
-  grammar_symbol_append (lhs, loc);
-  current_rule = grammar_end;
-
-  /* Mark the rule's lhs as a nonterminal if not already so.  */
-  if (lhs->class == unknown_sym)
-    {
-      lhs->class = nterm_sym;
-      lhs->number = nvars;
-      ++nvars;
-    }
-  else if (lhs->class == token_sym)
-    complain_at (loc, _("rule given for %s, which is a token"), lhs->tag);
-}
-
-
-/*----------------------------------------------------------------------.
-| A symbol should be used if it has a destructor, or if it is a         |
-| mid-rule symbol (i.e., the generated LHS replacing a mid-rule         |
-| action) that was assigned to, as in "exp: { $$ = 1; } { $$ = $1; }".  |
-`----------------------------------------------------------------------*/
-
-static bool
-symbol_should_be_used (symbol_list const *s)
-{
-  return (s->sym->destructor
-	  || (s->midrule && s->midrule->used));
-}
-
-/*----------------------------------------------------------------.
-| Check that the rule R is properly defined.  For instance, there |
-| should be no type clash on the default action.                  |
-`----------------------------------------------------------------*/
-
-static void
-grammar_rule_check (const symbol_list *r)
-{
-  /* Type check.
-
-     If there is an action, then there is nothing we can do: the user
-     is allowed to shoot herself in the foot.
-
-     Don't worry about the default action if $$ is untyped, since $$'s
-     value can't be used.  */
-  if (!r->action && r->sym->type_name)
-    {
-      symbol *first_rhs = r->next->sym;
-      /* If $$ is being set in default way, report if any type mismatch.  */
-      if (first_rhs)
-	{
-	  char const *lhs_type = r->sym->type_name;
-	  const char *rhs_type =
-	    first_rhs->type_name ? first_rhs->type_name : "";
-	  if (!UNIQSTR_EQ (lhs_type, rhs_type))
-	    warn_at (r->location,
-		     _("type clash on default action: <%s> != <%s>"),
-		     lhs_type, rhs_type);
-	}
-      /* Warn if there is no default for $$ but we need one.  */
-      else
-	warn_at (r->location,
-		 _("empty rule for typed nonterminal, and no action"));
-    }
-
-  /* Check that symbol values that should be used are in fact used.  */
-  {
-    symbol_list const *l = r;
-    int n = 0;
-    for (; l && l->sym; l = l->next, ++n)
-      if (! (l->used
-	     || !symbol_should_be_used (l)
-	     /* The default action, $$ = $1, `uses' both.  */
-	     || (!r->action && (n == 0 || n == 1))))
-	{
-	  if (n)
-	    warn_at (r->location, _("unused value: $%d"), n);
-	  else
-	    warn_at (r->location, _("unset value: $$"));
-	}
-  }
-}
-
-
-/*-------------------------------------.
-| End the currently being grown rule.  |
-`-------------------------------------*/
-
-void
-grammar_current_rule_end (location loc)
-{
-  /* Put an empty link in the list to mark the end of this rule  */
-  grammar_symbol_append (NULL, grammar_end->location);
-  current_rule->location = loc;
-  grammar_rule_check (current_rule);
-}
-
-
-/*-------------------------------------------------------------------.
-| The previous action turns out the be a mid-rule action.  Attach it |
-| to the current rule, i.e., create a dummy symbol, attach it this   |
-| mid-rule action, and append this dummy nonterminal to the current  |
-| rule.                                                              |
-`-------------------------------------------------------------------*/
-
-void
-grammar_midrule_action (void)
-{
-  /* Since the action was written out with this rule's number, we must
-     give the new rule this number by inserting the new rule before
-     it.  */
-
-  /* Make a DUMMY nonterminal, whose location is that of the midrule
-     action.  Create the MIDRULE.  */
-  location dummy_location = current_rule->action_location;
-  symbol *dummy = dummy_symbol_get (dummy_location);
-  symbol_list *midrule = symbol_list_new (dummy, dummy_location);
-
-  /* Make a new rule, whose body is empty, before the current one, so
-     that the action just read can belong to it.  */
-  ++nrules;
-  ++nritems;
-  /* Attach its location and actions to that of the DUMMY.  */
-  midrule->location = dummy_location;
-  midrule->action = current_rule->action;
-  midrule->action_location = dummy_location;
-  current_rule->action = NULL;
-  /* If $$ was used in the action, the LHS of the enclosing rule was
-     incorrectly flagged as used.  */
-  midrule->used = current_rule->used;
-  current_rule->used = false;
-
-  if (previous_rule_end)
-    previous_rule_end->next = midrule;
-  else
-    grammar = midrule;
-
-  /* End the dummy's rule.  */
-  midrule->next = symbol_list_new (NULL, dummy_location);
-  grammar_rule_check (midrule);
-  midrule->next->next = current_rule;
-
-  previous_rule_end = midrule->next;
-
-  /* Insert the dummy nonterminal replacing the midrule action into
-     the current rule.  Bind it to its dedicated rule.  */
-  grammar_current_rule_symbol_append (dummy, dummy_location);
-  grammar_end->midrule = midrule;
-}
-
-/* Set the precedence symbol of the current rule to PRECSYM. */
-
-void
-grammar_current_rule_prec_set (symbol *precsym, location loc)
-{
-  if (current_rule->ruleprec)
-    complain_at (loc, _("only one %s allowed per rule"), "%prec");
-  current_rule->ruleprec = precsym;
-}
-
-/* Attach dynamic precedence DPREC to the current rule. */
-
-void
-grammar_current_rule_dprec_set (int dprec, location loc)
-{
-  if (! glr_parser)
-    warn_at (loc, _("%s affects only GLR parsers"), "%dprec");
-  if (dprec <= 0)
-    complain_at (loc, _("%s must be followed by positive number"), "%dprec");
-  else if (current_rule->dprec != 0)
-    complain_at (loc, _("only one %s allowed per rule"), "%dprec");
-  current_rule->dprec = dprec;
-}
-
-/* Attach a merge function NAME with argument type TYPE to current
-   rule. */
-
-void
-grammar_current_rule_merge_set (uniqstr name, location loc)
-{
-  if (! glr_parser)
-    warn_at (loc, _("%s affects only GLR parsers"), "%merge");
-  if (current_rule->merger != 0)
-    complain_at (loc, _("only one %s allowed per rule"), "%merge");
-  current_rule->merger =
-    get_merge_function (name, current_rule->sym->type_name, loc);
-}
-
-/* Attach SYM to the current rule.  If needed, move the previous
-   action as a mid-rule action.  */
-
-void
-grammar_current_rule_symbol_append (symbol *sym, location loc)
-{
-  if (current_rule->action)
-    grammar_midrule_action ();
-  grammar_symbol_append (sym, loc);
-}
-
-/* Attach an ACTION to the current rule.  */
-
-void
-grammar_current_rule_action_append (const char *action, location loc)
-{
-  /* There's no need to invoke grammar_midrule_action here, since the
-     scanner already did it if necessary.  */
-  current_rule->action = action;
-  current_rule->action_location = loc;
-}
-
-
-/*---------------------------------------------------------------.
-| Convert the rules into the representation using RRHS, RLHS and |
-| RITEM.                                                         |
-`---------------------------------------------------------------*/
-
-static void
-packgram (void)
-{
-  unsigned int itemno = 0;
-  rule_number ruleno = 0;
-  symbol_list *p = grammar;
-
-  ritem = xnmalloc (nritems + 1, sizeof *ritem);
-
-  /* This sentinel is used by build_relations in gram.c.  */
-  *ritem++ = 0;
-
-  rules = xnmalloc (nrules, sizeof *rules);
-
-  while (p)
-    {
-      symbol *ruleprec = p->ruleprec;
-      rules[ruleno].user_number = ruleno;
-      rules[ruleno].number = ruleno;
-      rules[ruleno].lhs = p->sym;
-      rules[ruleno].rhs = ritem + itemno;
-      rules[ruleno].prec = NULL;
-      rules[ruleno].dprec = p->dprec;
-      rules[ruleno].merger = p->merger;
-      rules[ruleno].precsym = NULL;
-      rules[ruleno].location = p->location;
-      rules[ruleno].useful = true;
-      rules[ruleno].action = p->action;
-      rules[ruleno].action_location = p->action_location;
-
-      p = p->next;
-      while (p && p->sym)
-	{
-	  /* item_number = symbol_number.
-	     But the former needs to contain more: negative rule numbers. */
-	  ritem[itemno++] = symbol_number_as_item_number (p->sym->number);
-	  /* A rule gets by default the precedence and associativity
-	     of the last token in it.  */
-	  if (p->sym->class == token_sym && default_prec)
-	    rules[ruleno].prec = p->sym;
-	  if (p)
-	    p = p->next;
-	}
-
-      /* If this rule has a %prec,
-         the specified symbol's precedence replaces the default.  */
-      if (ruleprec)
-	{
-	  rules[ruleno].precsym = ruleprec;
-	  rules[ruleno].prec = ruleprec;
-	}
-      ritem[itemno++] = rule_number_as_item_number (ruleno);
-      ++ruleno;
-
-      if (p)
-	p = p->next;
-    }
-
-  assert (itemno == nritems);
-
-  if (trace_flag & trace_sets)
-    ritem_print (stderr);
-}
-
-/*------------------------------------------------------------------.
-| Read in the grammar specification and record it in the format     |
-| described in gram.h.  All actions are copied into ACTION_OBSTACK, |
-| in each case forming the body of a C function (YYACTION) which    |
-| contains a switch statement to decide which action to execute.    |
-`------------------------------------------------------------------*/
-
-void
-reader (void)
-{
-  /* Initialize the symbol table.  */
-  symbols_new ();
-
-  /* Construct the accept symbol. */
-  accept = symbol_get ("$accept", empty_location);
-  accept->class = nterm_sym;
-  accept->number = nvars++;
-
-  /* Construct the error token */
-  errtoken = symbol_get ("error", empty_location);
-  errtoken->class = token_sym;
-  errtoken->number = ntokens++;
-
-  /* Construct a token that represents all undefined literal tokens.
-     It is always token number 2.  */
-  undeftoken = symbol_get ("$undefined", empty_location);
-  undeftoken->class = token_sym;
-  undeftoken->number = ntokens++;
-
-  /* Initialize the obstacks. */
-  obstack_init (&pre_prologue_obstack);
-  obstack_init (&post_prologue_obstack);
-
-  gram_in = xfopen (grammar_file, "r");
-
-  gram__flex_debug = trace_flag & trace_scan;
-  gram_debug = trace_flag & trace_parse;
-  scanner_initialize ();
-  gram_parse ();
-
-  if (! complaint_issued)
-    check_and_convert_grammar ();
-
-  xfclose (gram_in);
-}
-
-
-/*-------------------------------------------------------------.
-| Check the grammar that has just been read, and convert it to |
-| internal form.					       |
-`-------------------------------------------------------------*/
-
-static void
-check_and_convert_grammar (void)
-{
-  /* Grammar has been read.  Do some checking.  */
-  if (nrules == 0)
-    fatal (_("no rules in the input grammar"));
-
-  /* Report any undefined symbols and consider them nonterminals.  */
-  symbols_check_defined ();
-
-  /* If the user did not define her ENDTOKEN, do it now. */
-  if (!endtoken)
-    {
-      endtoken = symbol_get ("$end", empty_location);
-      endtoken->class = token_sym;
-      endtoken->number = 0;
-      /* Value specified by POSIX.  */
-      endtoken->user_token_number = 0;
-    }
-
-  /* Insert the initial rule, whose line is that of the first rule
-     (not that of the start symbol):
-
-     accept: %start EOF.  */
-  {
-    symbol_list *p = symbol_list_new (accept, empty_location);
-    p->location = grammar->location;
-    p->next = symbol_list_new (startsymbol, empty_location);
-    p->next->next = symbol_list_new (endtoken, empty_location);
-    p->next->next->next = symbol_list_new (NULL, empty_location);
-    p->next->next->next->next = grammar;
-    nrules += 1;
-    nritems += 3;
-    grammar = p;
-  }
-
-  assert (nsyms <= SYMBOL_NUMBER_MAXIMUM && nsyms == ntokens + nvars);
-
-  /* Assign the symbols their symbol numbers.  Write #defines for the
-     token symbols into FDEFINES if requested.  */
-  symbols_pack ();
-
-  /* Convert the grammar into the format described in gram.h.  */
-  packgram ();
-
-  /* The grammar as a symbol_list is no longer needed. */
-  LIST_FREE (symbol_list, grammar);
-}
diff --git a/src/reader.h b/src/reader.h
deleted file mode 100644
index f110f70..0000000
--- a/src/reader.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Input parser for Bison
-
-   Copyright (C) 2000, 2001, 2002, 2003, 2005, 2006 Free Software
-   Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef READER_H_
-# define READER_H_
-
-# include "location.h"
-# include "symlist.h"
-
-# include "parse-gram.h"
-
-typedef struct merger_list
-{
-  struct merger_list* next;
-  uniqstr name;
-  uniqstr type;
-} merger_list;
-
-/* From the scanner.  */
-extern FILE *gram_in;
-extern int gram__flex_debug;
-extern boundary scanner_cursor;
-extern char *last_string;
-extern location last_braced_code_loc;
-extern int max_left_semantic_context;
-void scanner_initialize (void);
-void scanner_free (void);
-void scanner_last_string_free (void);
-
-/* These are declared by the scanner, but not used.  We put them here
-   to pacify "make syntax-check".  */
-extern FILE *gram_out;
-extern int gram_lineno;
-
-# define YY_DECL int gram_lex (YYSTYPE *val, location *loc)
-YY_DECL;
-
-
-/* From the parser.  */
-extern int gram_debug;
-int gram_parse (void);
-char const *token_name (int type);
-
-
-/* From reader.c. */
-void grammar_start_symbol_set (symbol *sym, location loc);
-void prologue_augment (const char *prologue, location loc);
-void grammar_current_rule_begin (symbol *lhs, location loc);
-void grammar_current_rule_end (location loc);
-void grammar_midrule_action (void);
-void grammar_current_rule_prec_set (symbol *precsym, location loc);
-void grammar_current_rule_dprec_set (int dprec, location loc);
-void grammar_current_rule_merge_set (uniqstr name, location loc);
-void grammar_current_rule_symbol_append (symbol *sym, location loc);
-void grammar_current_rule_action_append (const char *action, location loc);
-extern symbol_list *current_rule;
-void reader (void);
-void free_merger_functions (void);
-
-extern merger_list *merge_functions;
-
-/* Was %union seen?  */
-extern bool typed;
-
-/* Should rules have a default precedence?  */
-extern bool default_prec;
-
-#endif /* !READER_H_ */
diff --git a/src/reduce.c b/src/reduce.c
deleted file mode 100644
index 1bb40f0..0000000
--- a/src/reduce.c
+++ /dev/null
@@ -1,470 +0,0 @@
-/* Grammar reduction for Bison.
-
-   Copyright (C) 1988, 1989, 2000, 2001, 2002, 2003, 2005, 2006 Free
-   Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-
-/* Reduce the grammar: Find and eliminate unreachable terminals,
-   nonterminals, and productions.  David S. Bakin.  */
-
-/* Don't eliminate unreachable terminals: They may be used by the
-   user's parser.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <bitset.h>
-#include <quotearg.h>
-
-#include "complain.h"
-#include "files.h"
-#include "getargs.h"
-#include "gram.h"
-#include "reader.h"
-#include "reduce.h"
-#include "symtab.h"
-
-/* Set of all nonterminals which are not useless.  */
-static bitset N;
-
-/* Set of all rules which have no useless nonterminals in their RHS.  */
-static bitset P;
-
-/* Set of all accessible symbols.  */
-static bitset V;
-
-/* Set of symbols used to define rule precedence (so they are
-   `useless', but no warning should be issued).  */
-static bitset V1;
-
-static rule_number nuseful_productions;
-rule_number nuseless_productions;
-static int nuseful_nonterminals;
-symbol_number nuseless_nonterminals;
-
-/*-------------------------------------------------------------------.
-| Another way to do this would be with a set for each production and |
-| then do subset tests against N0, but even for the C grammar the    |
-| whole reducing process takes only 2 seconds on my 8Mhz AT.         |
-`-------------------------------------------------------------------*/
-
-static bool
-useful_production (rule_number r, bitset N0)
-{
-  item_number *rhsp;
-
-  /* A production is useful if all of the nonterminals in its appear
-     in the set of useful nonterminals.  */
-
-  for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
-    if (ISVAR (*rhsp) && !bitset_test (N0, *rhsp - ntokens))
-      return false;
-  return true;
-}
-
-
-/*---------------------------------------------------------.
-| Remember that rules are 1-origin, symbols are 0-origin.  |
-`---------------------------------------------------------*/
-
-static void
-useless_nonterminals (void)
-{
-  bitset Np, Ns;
-  rule_number r;
-
-  /* N is set as built.  Np is set being built this iteration. P is
-     set of all productions which have a RHS all in N.  */
-
-  Np = bitset_create (nvars, BITSET_FIXED);
-
-
-  /* The set being computed is a set of nonterminals which can derive
-     the empty string or strings consisting of all terminals. At each
-     iteration a nonterminal is added to the set if there is a
-     production with that nonterminal as its LHS for which all the
-     nonterminals in its RHS are already in the set.  Iterate until
-     the set being computed remains unchanged.  Any nonterminals not
-     in the set at that point are useless in that they will never be
-     used in deriving a sentence of the language.
-
-     This iteration doesn't use any special traversal over the
-     productions.  A set is kept of all productions for which all the
-     nonterminals in the RHS are in useful.  Only productions not in
-     this set are scanned on each iteration.  At the end, this set is
-     saved to be used when finding useful productions: only
-     productions in this set will appear in the final grammar.  */
-
-  while (1)
-    {
-      bitset_copy (Np, N);
-      for (r = 0; r < nrules; r++)
-	if (!bitset_test (P, r)
-	    && useful_production (r, N))
-	  {
-	    bitset_set (Np, rules[r].lhs->number - ntokens);
-	    bitset_set (P, r);
-	  }
-      if (bitset_equal_p (N, Np))
-	break;
-      Ns = Np;
-      Np = N;
-      N = Ns;
-    }
-  bitset_free (N);
-  N = Np;
-}
-
-
-static void
-inaccessable_symbols (void)
-{
-  bitset Vp, Vs, Pp;
-
-  /* Find out which productions are reachable and which symbols are
-     used.  Starting with an empty set of productions and a set of
-     symbols which only has the start symbol in it, iterate over all
-     productions until the set of productions remains unchanged for an
-     iteration.  For each production which has a LHS in the set of
-     reachable symbols, add the production to the set of reachable
-     productions, and add all of the nonterminals in the RHS of the
-     production to the set of reachable symbols.
-
-     Consider only the (partially) reduced grammar which has only
-     nonterminals in N and productions in P.
-
-     The result is the set P of productions in the reduced grammar,
-     and the set V of symbols in the reduced grammar.
-
-     Although this algorithm also computes the set of terminals which
-     are reachable, no terminal will be deleted from the grammar. Some
-     terminals might not be in the grammar but might be generated by
-     semantic routines, and so the user might want them available with
-     specified numbers.  (Is this true?)  However, the nonreachable
-     terminals are printed (if running in verbose mode) so that the
-     user can know.  */
-
-  Vp = bitset_create (nsyms, BITSET_FIXED);
-  Pp = bitset_create (nrules, BITSET_FIXED);
-
-  /* If the start symbol isn't useful, then nothing will be useful. */
-  if (bitset_test (N, accept->number - ntokens))
-    {
-      bitset_set (V, accept->number);
-
-      while (1)
-	{
-	  rule_number r;
-	  bitset_copy (Vp, V);
-	  for (r = 0; r < nrules; r++)
-	    {
-	      if (!bitset_test (Pp, r)
-		  && bitset_test (P, r)
-		  && bitset_test (V, rules[r].lhs->number))
-		{
-		  item_number *rhsp;
-		  for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++)
-		    if (ISTOKEN (*rhsp) || bitset_test (N, *rhsp - ntokens))
-		      bitset_set (Vp, *rhsp);
-		  bitset_set (Pp, r);
-		}
-	    }
-	  if (bitset_equal_p (V, Vp))
-	    break;
-	  Vs = Vp;
-	  Vp = V;
-	  V = Vs;
-	}
-    }
-
-  bitset_free (V);
-  V = Vp;
-
-  /* Tokens 0, 1, and 2 are internal to Bison.  Consider them useful. */
-  bitset_set (V, endtoken->number);		/* end-of-input token */
-  bitset_set (V, errtoken->number);		/* error token */
-  bitset_set (V, undeftoken->number);		/* some undefined token */
-
-  bitset_free (P);
-  P = Pp;
-
-  nuseful_productions = bitset_count (P);
-  nuseless_productions = nrules - nuseful_productions;
-
-  nuseful_nonterminals = 0;
-  {
-    symbol_number i;
-    for (i = ntokens; i < nsyms; i++)
-      if (bitset_test (V, i))
-	nuseful_nonterminals++;
-  }
-  nuseless_nonterminals = nvars - nuseful_nonterminals;
-
-  /* A token that was used in %prec should not be warned about.  */
-  {
-    rule_number r;
-    for (r = 0; r < nrules; ++r)
-      if (rules[r].precsym != 0)
-	bitset_set (V1, rules[r].precsym->number);
-  }
-}
-
-
-/*-------------------------------------------------------------------.
-| Put the useless productions at the end of RULES, and adjust NRULES |
-| accordingly.                                                       |
-`-------------------------------------------------------------------*/
-
-static void
-reduce_grammar_tables (void)
-{
-  /* Report and flag useless productions.  */
-  {
-    rule_number r;
-    for (r = 0; r < nrules; r++)
-      rules[r].useful = bitset_test (P, r);
-    grammar_rules_never_reduced_report (_("useless rule"));
-  }
-
-  /* Map the nonterminals to their new index: useful first, useless
-     afterwards.  Kept for later report.  */
-  {
-    int useful = 0;
-    int useless = nrules - nuseless_productions;
-    rule *rules_sorted = xnmalloc (nrules, sizeof *rules_sorted);
-    rule_number r;
-    for (r = 0; r < nrules; ++r)
-      rules_sorted[rules[r].useful ? useful++ : useless++] = rules[r];
-    free (rules);
-    rules = rules_sorted;
-
-    /* Renumber the rules markers in RITEMS.  */
-    for (r = 0; r < nrules; ++r)
-      {
-	item_number *rhsp = rules[r].rhs;
-	for (/* Nothing. */; *rhsp >= 0; ++rhsp)
-	  /* Nothing. */;
-	*rhsp = rule_number_as_item_number (r);
-	rules[r].number = r;
-      }
-    nrules -= nuseless_productions;
-  }
-
-  /* Adjust NRITEMS.  */
-  {
-    rule_number r;
-    int length;
-    for (r = nrules; r < nrules + nuseless_productions; ++r)
-      {
-	length = rule_rhs_length (&rules[r]);
-	nritems -= length + 1;
-      }
-  }
-}
-
-
-/*------------------------------.
-| Remove useless nonterminals.  |
-`------------------------------*/
-
-static void
-nonterminals_reduce (void)
-{
-  symbol_number i, n;
-
-  /* Map the nonterminals to their new index: useful first, useless
-     afterwards.  Kept for later report.  */
-
-  symbol_number *nontermmap = xnmalloc (nvars, sizeof *nontermmap);
-  n = ntokens;
-  for (i = ntokens; i < nsyms; i++)
-    if (bitset_test (V, i))
-      nontermmap[i - ntokens] = n++;
-  for (i = ntokens; i < nsyms; i++)
-    if (!bitset_test (V, i))
-      {
-	nontermmap[i - ntokens] = n++;
-	warn_at (symbols[i]->location, _("useless nonterminal: %s"),
-		 symbols[i]->tag);
-      }
-
-
-  /* Shuffle elements of tables indexed by symbol number.  */
-  {
-    symbol **symbols_sorted = xnmalloc (nvars, sizeof *symbols_sorted);
-
-    for (i = ntokens; i < nsyms; i++)
-      symbols[i]->number = nontermmap[i - ntokens];
-    for (i = ntokens; i < nsyms; i++)
-      symbols_sorted[nontermmap[i - ntokens] - ntokens] = symbols[i];
-    for (i = ntokens; i < nsyms; i++)
-      symbols[i] = symbols_sorted[i - ntokens];
-    free (symbols_sorted);
-  }
-
-  {
-    rule_number r;
-    for (r = 0; r < nrules; ++r)
-      {
-	item_number *rhsp;
-	for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
-	  if (ISVAR (*rhsp))
-	    *rhsp =  symbol_number_as_item_number (nontermmap[*rhsp
-							      - ntokens]);
-      }
-    accept->number = nontermmap[accept->number - ntokens];
-  }
-
-  nsyms -= nuseless_nonterminals;
-  nvars -= nuseless_nonterminals;
-
-  free (nontermmap);
-}
-
-
-/*------------------------------------------------------------------.
-| Output the detailed results of the reductions.  For FILE.output.  |
-`------------------------------------------------------------------*/
-
-void
-reduce_output (FILE *out)
-{
-  if (nuseless_nonterminals > 0)
-    {
-      int i;
-      fprintf (out, "%s\n\n", _("Useless nonterminals"));
-      for (i = 0; i < nuseless_nonterminals; ++i)
-	fprintf (out, "   %s\n", symbols[nsyms + i]->tag);
-      fputs ("\n\n", out);
-    }
-
-  {
-    bool b = false;
-    int i;
-    for (i = 0; i < ntokens; i++)
-      if (!bitset_test (V, i) && !bitset_test (V1, i))
-	{
-	  if (!b)
-	    fprintf (out, "%s\n\n", _("Terminals which are not used"));
-	  b = true;
-	  fprintf (out, "   %s\n", symbols[i]->tag);
-	}
-    if (b)
-      fputs ("\n\n", out);
-  }
-
-  if (nuseless_productions > 0)
-    grammar_rules_partial_print (out, _("Useless rules"),
-				 rule_useless_p);
-}
-
-
-
-
-
-/*-------------------------------.
-| Report the results to STDERR.  |
-`-------------------------------*/
-
-static void
-reduce_print (void)
-{
-  if (yacc_flag && nuseless_productions)
-    fprintf (stderr, ngettext ("%d rule never reduced\n",
-			       "%d rules never reduced\n",
-			       nuseless_productions),
-	     nuseless_productions);
-
-  fprintf (stderr, "%s: %s: ", grammar_file, _("warning"));
-
-  if (nuseless_nonterminals > 0)
-    fprintf (stderr, ngettext ("%d useless nonterminal",
-			       "%d useless nonterminals",
-			       nuseless_nonterminals),
-	     nuseless_nonterminals);
-
-  if (nuseless_nonterminals > 0 && nuseless_productions > 0)
-    fprintf (stderr, _(" and "));
-
-  if (nuseless_productions > 0)
-    fprintf (stderr, ngettext ("%d useless rule",
-			       "%d useless rules",
-			       nuseless_productions),
-	     nuseless_productions);
-  fprintf (stderr, "\n");
-}
-
-void
-reduce_grammar (void)
-{
-  bool reduced;
-
-  /* Allocate the global sets used to compute the reduced grammar */
-
-  N = bitset_create (nvars, BITSET_FIXED);
-  P =  bitset_create (nrules, BITSET_FIXED);
-  V = bitset_create (nsyms, BITSET_FIXED);
-  V1 = bitset_create (nsyms, BITSET_FIXED);
-
-  useless_nonterminals ();
-  inaccessable_symbols ();
-
-  reduced = (nuseless_nonterminals + nuseless_productions > 0);
-  if (!reduced)
-    return;
-
-  reduce_print ();
-
-  if (!bitset_test (N, accept->number - ntokens))
-    fatal_at (startsymbol_location,
-	      _("start symbol %s does not derive any sentence"),
-	      startsymbol->tag);
-
-  /* First reduce the nonterminals, as they renumber themselves in the
-     whole grammar.  If you change the order, nonterms would be
-     renumbered only in the reduced grammar.  */
-  if (nuseless_nonterminals > 0)
-    nonterminals_reduce ();
-  if (nuseless_productions > 0)
-    reduce_grammar_tables ();
-
-  if (trace_flag & trace_grammar)
-    {
-      grammar_dump (stderr, "Reduced Grammar");
-
-      fprintf (stderr, "reduced %s defines %d terminals, %d nonterminals\
-, and %d productions.\n",
-	       grammar_file, ntokens, nvars, nrules);
-    }
-}
-
-
-/*-----------------------------------------------------------.
-| Free the global sets used to compute the reduced grammar.  |
-`-----------------------------------------------------------*/
-
-void
-reduce_free (void)
-{
-  bitset_free (N);
-  bitset_free (V);
-  bitset_free (V1);
-  bitset_free (P);
-}
diff --git a/src/reduce.h b/src/reduce.h
deleted file mode 100644
index dfdab65..0000000
--- a/src/reduce.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Grammar reduction for Bison.
-
-   Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef REDUCE_H_
-# define REDUCE_H_
-
-void reduce_grammar (void);
-void reduce_output (FILE *out);
-void reduce_free (void);
-
-extern symbol_number nuseless_nonterminals;
-extern rule_number nuseless_productions;
-#endif /* !REDUCE_H_ */
diff --git a/src/relation.c b/src/relation.c
deleted file mode 100644
index 1d2b42d..0000000
--- a/src/relation.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/* Binary relations.
-   Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <bitsetv.h>
-
-#include "getargs.h"
-#include "relation.h"
-
-void
-relation_print (relation r, relation_node size, FILE *out)
-{
-  relation_node i;
-  relation_node j;
-
-  for (i = 0; i < size; ++i)
-    {
-      fprintf (out, "%3lu: ", (unsigned long int) i);
-      if (r[i])
-	for (j = 0; r[i][j] != END_NODE; ++j)
-	  fprintf (out, "%3lu ", (unsigned long int) r[i][j]);
-      fputc ('\n', out);
-    }
-  fputc ('\n', out);
-}
-
-
-/*---------------------------------------------------------------.
-| digraph & traverse.                                            |
-|                                                                |
-| The following variables are used as common storage between the |
-| two.                                                           |
-`---------------------------------------------------------------*/
-
-static relation R;
-static relation_nodes INDEX;
-static relation_nodes VERTICES;
-static relation_node top;
-static relation_node infinity;
-static bitsetv F;
-
-static void
-traverse (relation_node i)
-{
-  relation_node j;
-  relation_node height;
-
-  VERTICES[++top] = i;
-  INDEX[i] = height = top;
-
-  if (R[i])
-    for (j = 0; R[i][j] != END_NODE; ++j)
-      {
-	if (INDEX[R[i][j]] == 0)
-	  traverse (R[i][j]);
-
-	if (INDEX[i] > INDEX[R[i][j]])
-	  INDEX[i] = INDEX[R[i][j]];
-
-	bitset_or (F[i], F[i], F[R[i][j]]);
-      }
-
-  if (INDEX[i] == height)
-    for (;;)
-      {
-	j = VERTICES[top--];
-	INDEX[j] = infinity;
-
-	if (i == j)
-	  break;
-
-	bitset_copy (F[j], F[i]);
-      }
-}
-
-
-void
-relation_digraph (relation r, relation_node size, bitsetv *function)
-{
-  relation_node i;
-
-  infinity = size + 2;
-  INDEX = xcalloc (size + 1, sizeof *INDEX);
-  VERTICES = xnmalloc (size + 1, sizeof *VERTICES);
-  top = 0;
-
-  R = r;
-  F = *function;
-
-  for (i = 0; i < size; i++)
-    if (INDEX[i] == 0 && R[i])
-      traverse (i);
-
-  free (INDEX);
-  free (VERTICES);
-
-  *function = F;
-}
-
-
-/*-------------------------------------------.
-| Destructively transpose R_ARG, of size N.  |
-`-------------------------------------------*/
-
-void
-relation_transpose (relation *R_arg, relation_node n)
-{
-  relation r = *R_arg;
-  /* The result. */
-  relation new_R = xnmalloc (n, sizeof *new_R);
-  /* END_R[I] -- next entry of NEW_R[I]. */
-  relation end_R = xnmalloc (n, sizeof *end_R);
-  /* NEDGES[I] -- total size of NEW_R[I]. */
-  size_t *nedges = xcalloc (n, sizeof *nedges);
-  relation_node i;
-  relation_node j;
-
-  if (trace_flag & trace_sets)
-    {
-      fputs ("relation_transpose: input\n", stderr);
-      relation_print (r, n, stderr);
-    }
-
-  /* Count. */
-  for (i = 0; i < n; i++)
-    if (r[i])
-      for (j = 0; r[i][j] != END_NODE; ++j)
-	++nedges[r[i][j]];
-
-  /* Allocate. */
-  for (i = 0; i < n; i++)
-    {
-      relation_node *sp = NULL;
-      if (nedges[i] > 0)
-	{
-	  sp = xnmalloc (nedges[i] + 1, sizeof *sp);
-	  sp[nedges[i]] = END_NODE;
-	}
-      new_R[i] = sp;
-      end_R[i] = sp;
-    }
-
-  /* Store. */
-  for (i = 0; i < n; i++)
-    if (r[i])
-      for (j = 0; r[i][j] != END_NODE; ++j)
-	*end_R[r[i][j]]++ = i;
-
-  free (nedges);
-  free (end_R);
-
-  /* Free the input: it is replaced with the result. */
-  for (i = 0; i < n; i++)
-    free (r[i]);
-  free (r);
-
-  if (trace_flag & trace_sets)
-    {
-      fputs ("relation_transpose: output\n", stderr);
-      relation_print (new_R, n, stderr);
-    }
-
-  *R_arg = new_R;
-}
diff --git a/src/relation.h b/src/relation.h
deleted file mode 100644
index 479e42e..0000000
--- a/src/relation.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Binary relations.
-   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-
-#ifndef RELATION_H_
-# define RELATION_H_
-
-/* Performing operations on graphs coded as list of adjacency.
-
-   If GRAPH is a relation, then GRAPH[Node] is a list of adjacent
-   nodes, ended with END_NODE.  */
-
-#define END_NODE ((relation_node) -1)
-
-typedef size_t relation_node;
-typedef relation_node *relation_nodes;
-typedef relation_nodes *relation;
-
-
-/* Report a relation R that has SIZE vertices.  */
-void relation_print (relation r, relation_node size, FILE *out);
-
-/* Compute the transitive closure of the FUNCTION on the relation R
-   with SIZE vertices.
-
-   If R (NODE-1, NODE-2) then on exit FUNCTION[NODE - 1] was extended
-   (unioned) with FUNCTION[NODE - 2].  */
-void relation_digraph (relation r, relation_node size, bitsetv *function);
-
-/* Destructively transpose *R_ARG, of size N.  */
-void relation_transpose (relation *R_arg, relation_node n);
-
-#endif /* ! RELATION_H_ */
diff --git a/src/scan-gram-c.c b/src/scan-gram-c.c
deleted file mode 100644
index 8f12e2c..0000000
--- a/src/scan-gram-c.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#include <config.h>
-#include "scan-gram.c"
diff --git a/src/scan-gram.c b/src/scan-gram.c
deleted file mode 100644
index 04cf539..0000000
--- a/src/scan-gram.c
+++ /dev/null
@@ -1,3822 +0,0 @@
-#line 2 "scan-gram.c"
-
-#line 4 "scan-gram.c"
-
-#define  YY_INT_ALIGNED short int
-
-/* A lexical scanner generated by flex */
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 31
-#if YY_FLEX_SUBMINOR_VERSION > 0
-#define FLEX_BETA
-#endif
-
-/* %if-c++-only */
-/* %endif */
-
-/* %if-c-only */
-    
-/* %endif */
-
-/* %if-c-only */
-
-/* %endif */
-
-/* First, we deal with  platform-specific or compiler-specific issues. */
-
-/* begin standard C headers. */
-/* %if-c-only */
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-/* %endif */
-
-/* %if-tables-serialization */
-/* %endif */
-/* end standard C headers. */
-
-/* %if-c-or-c++ */
-/* flex integer type definitions */
-
-#ifndef FLEXINT_H
-#define FLEXINT_H
-
-/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
-
-#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
-#include <inttypes.h>
-typedef int8_t flex_int8_t;
-typedef uint8_t flex_uint8_t;
-typedef int16_t flex_int16_t;
-typedef uint16_t flex_uint16_t;
-typedef int32_t flex_int32_t;
-typedef uint32_t flex_uint32_t;
-#else
-typedef signed char flex_int8_t;
-typedef short int flex_int16_t;
-typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t; 
-typedef unsigned short int flex_uint16_t;
-typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
-
-/* Limits of integral types. */
-#ifndef INT8_MIN
-#define INT8_MIN               (-128)
-#endif
-#ifndef INT16_MIN
-#define INT16_MIN              (-32767-1)
-#endif
-#ifndef INT32_MIN
-#define INT32_MIN              (-2147483647-1)
-#endif
-#ifndef INT8_MAX
-#define INT8_MAX               (127)
-#endif
-#ifndef INT16_MAX
-#define INT16_MAX              (32767)
-#endif
-#ifndef INT32_MAX
-#define INT32_MAX              (2147483647)
-#endif
-#ifndef UINT8_MAX
-#define UINT8_MAX              (255U)
-#endif
-#ifndef UINT16_MAX
-#define UINT16_MAX             (65535U)
-#endif
-#ifndef UINT32_MAX
-#define UINT32_MAX             (4294967295U)
-#endif
-
-#endif /* ! FLEXINT_H */
-
-/* %endif */
-
-/* %if-c++-only */
-/* %endif */
-
-#ifdef __cplusplus
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else	/* ! __cplusplus */
-
-#if __STDC__
-
-#define YY_USE_CONST
-
-#endif	/* __STDC__ */
-#endif	/* ! __cplusplus */
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-/* %not-for-header */
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-/* %ok-for-header */
-
-/* %not-for-header */
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index.  If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-/* %ok-for-header */
-
-/* %if-reentrant */
-/* %endif */
-
-/* %if-not-reentrant */
-
-/* %endif */
-
-/* Enter a start condition.  This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN (yy_start) = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state.  The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START (((yy_start) - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE gram_restart(gram_in  )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#ifndef YY_BUF_SIZE
-#define YY_BUF_SIZE 16384
-#endif
-
-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
-#define YY_TYPEDEF_YY_BUFFER_STATE
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-#endif
-
-/* %if-not-reentrant */
-extern int gram_leng;
-/* %endif */
-
-/* %if-c-only */
-/* %if-not-reentrant */
-extern FILE *gram_in, *gram_out;
-/* %endif */
-/* %endif */
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
-    #define YY_LESS_LINENO(n)
-    
-/* Return all but the first "n" matched characters back to the input stream. */
-#define yyless(n) \
-	do \
-		{ \
-		/* Undo effects of setting up gram_text. */ \
-        int yyless_macro_arg = (n); \
-        YY_LESS_LINENO(yyless_macro_arg);\
-		*yy_cp = (yy_hold_char); \
-		YY_RESTORE_YY_MORE_OFFSET \
-		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
-		YY_DO_BEFORE_ACTION; /* set up gram_text again */ \
-		} \
-	while ( 0 )
-
-#define unput(c) yyunput( c, (yytext_ptr)  )
-
-/* The following is because we cannot portably get our hands on size_t
- * (without autoconf's help, which isn't available because we want
- * flex-generated scanners to compile on their own).
- */
-
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef unsigned int yy_size_t;
-#endif
-
-#ifndef YY_STRUCT_YY_BUFFER_STATE
-#define YY_STRUCT_YY_BUFFER_STATE
-struct yy_buffer_state
-	{
-/* %if-c-only */
-	FILE *yy_input_file;
-/* %endif */
-
-/* %if-c++-only */
-/* %endif */
-
-	char *yy_ch_buf;		/* input buffer */
-	char *yy_buf_pos;		/* current position in input buffer */
-
-	/* Size of input buffer in bytes, not including room for EOB
-	 * characters.
-	 */
-	yy_size_t yy_buf_size;
-
-	/* Number of characters read into yy_ch_buf, not including EOB
-	 * characters.
-	 */
-	int yy_n_chars;
-
-	/* Whether we "own" the buffer - i.e., we know we created it,
-	 * and can realloc() it to grow it, and should free() it to
-	 * delete it.
-	 */
-	int yy_is_our_buffer;
-
-	/* Whether this is an "interactive" input source; if so, and
-	 * if we're using stdio for input, then we want to use getc()
-	 * instead of fread(), to make sure we stop fetching input after
-	 * each newline.
-	 */
-	int yy_is_interactive;
-
-	/* Whether we're considered to be at the beginning of a line.
-	 * If so, '^' rules will be active on the next match, otherwise
-	 * not.
-	 */
-	int yy_at_bol;
-
-    int yy_bs_lineno; /**< The line count. */
-    int yy_bs_column; /**< The column count. */
-    
-	/* Whether to try to fill the input buffer when we reach the
-	 * end of it.
-	 */
-	int yy_fill_buffer;
-
-	int yy_buffer_status;
-
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
-	/* When an EOF's been seen but there's still some text to process
-	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
-	 * shouldn't try reading from the input source any more.  We might
-	 * still have a bunch of tokens to match, though, because of
-	 * possible backing-up.
-	 *
-	 * When we actually see the EOF, we change the status to "new"
-	 * (via gram_restart()), so that the user can continue scanning by
-	 * just pointing gram_in at a new input file.
-	 */
-#define YY_BUFFER_EOF_PENDING 2
-
-	};
-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-
-/* %if-c-only Standard (non-C++) definition */
-/* %not-for-header */
-
-/* %if-not-reentrant */
-
-/* Stack of input buffers. */
-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
-/* %endif */
-/* %ok-for-header */
-
-/* %endif */
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- *
- * Returns the top of the stack, or NULL.
- */
-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
-                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
-                          : NULL)
-
-/* Same as previous macro, but useful when we know that the buffer stack is not
- * NULL or when we need an lvalue. For internal use only.
- */
-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
-
-/* %if-c-only Standard (non-C++) definition */
-
-/* %if-not-reentrant */
-/* %not-for-header */
-
-/* yy_hold_char holds the character lost when gram_text is formed. */
-static char yy_hold_char;
-static int yy_n_chars;		/* number of characters read into yy_ch_buf */
-int gram_leng;
-
-/* Points to current character in buffer. */
-static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 1;		/* whether we need to initialize */
-static int yy_start = 0;	/* start state number */
-
-/* Flag which is used to allow gram_wrap()'s to do buffer switches
- * instead of setting up a fresh gram_in.  A bit of a hack ...
- */
-static int yy_did_buffer_switch_on_eof;
-/* %ok-for-header */
-
-/* %endif */
-
-void gram_restart (FILE *input_file  );
-void gram__switch_to_buffer (YY_BUFFER_STATE new_buffer  );
-YY_BUFFER_STATE gram__create_buffer (FILE *file,int size  );
-void gram__delete_buffer (YY_BUFFER_STATE b  );
-void gram__flush_buffer (YY_BUFFER_STATE b  );
-void gram_push_buffer_state (YY_BUFFER_STATE new_buffer  );
-void gram_pop_buffer_state (void );
-
-static void gram_ensure_buffer_stack (void );
-static void gram__load_buffer_state (void );
-static void gram__init_buffer (YY_BUFFER_STATE b,FILE *file  );
-
-#define YY_FLUSH_BUFFER gram__flush_buffer(YY_CURRENT_BUFFER )
-
-YY_BUFFER_STATE gram__scan_buffer (char *base,yy_size_t size  );
-YY_BUFFER_STATE gram__scan_string (yyconst char *yy_str  );
-YY_BUFFER_STATE gram__scan_bytes (yyconst char *bytes,int len  );
-
-/* %endif */
-
-void *gram_alloc (yy_size_t  );
-void *gram_realloc (void *,yy_size_t  );
-void gram_free (void *  );
-
-#define yy_new_buffer gram__create_buffer
-
-#define yy_set_interactive(is_interactive) \
-	{ \
-	if ( ! YY_CURRENT_BUFFER ){ \
-        gram_ensure_buffer_stack (); \
-		YY_CURRENT_BUFFER_LVALUE =    \
-            gram__create_buffer(gram_in,YY_BUF_SIZE ); \
-	} \
-	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
-	}
-
-#define yy_set_bol(at_bol) \
-	{ \
-	if ( ! YY_CURRENT_BUFFER ){\
-        gram_ensure_buffer_stack (); \
-		YY_CURRENT_BUFFER_LVALUE =    \
-            gram__create_buffer(gram_in,YY_BUF_SIZE ); \
-	} \
-	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
-	}
-
-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
-
-/* %% [1.0] gram_text/gram_in/gram_out/yy_state_type/gram_lineno etc. def's & init go here */
-/* Begin user sect3 */
-
-#define gram_wrap(n) 1
-#define YY_SKIP_YYWRAP
-
-#define FLEX_DEBUG
-
-typedef unsigned char YY_CHAR;
-
-FILE *gram_in = (FILE *) 0, *gram_out = (FILE *) 0;
-
-typedef int yy_state_type;
-
-extern int gram_lineno;
-
-int gram_lineno = 1;
-
-extern char *gram_text;
-#define yytext_ptr gram_text
-
-/* %if-c-only Standard (non-C++) definition */
-
-static yy_state_type yy_get_previous_state (void );
-static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
-static int yy_get_next_buffer (void );
-static void yy_fatal_error (yyconst char msg[]  );
-
-/* %endif */
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up gram_text.
- */
-#define YY_DO_BEFORE_ACTION \
-	(yytext_ptr) = yy_bp; \
-/* %% [2.0] code to fiddle gram_text and gram_leng for yymore() goes here \ */\
-	gram_leng = (size_t) (yy_cp - yy_bp); \
-	(yy_hold_char) = *yy_cp; \
-	*yy_cp = '\0'; \
-/* %% [3.0] code to copy yytext_ptr to gram_text[] goes here, if %array \ */\
-	(yy_c_buf_p) = yy_cp;
-
-/* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */
-#define YY_NUM_RULES 109
-#define YY_END_OF_BUFFER 110
-/* This struct is not used in this scanner,
-   but its presence is necessary. */
-struct yy_trans_info
-	{
-	flex_int32_t yy_verify;
-	flex_int32_t yy_nxt;
-	};
-static yyconst flex_int16_t yy_accept[461] =
-    {   0,
-        0,    0,    0,    0,   66,   66,    0,    0,   84,   84,
-       84,   84,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  110,   59,    2,    2,
-       54,   59,   53,    1,   50,   59,   51,   51,   49,   59,
-       47,   56,   48,   59,  107,  108,  103,  107,  104,  105,
-      106,   65,  107,   63,   63,   88,   87,  107,   86,   85,
-       61,    2,    1,   61,   60,   61,   68,   67,  107,   71,
-       70,   69,   93,    2,    1,   93,   93,   90,  100,  107,
-       89,  107,  107,  101,   94,   96,  107,   58,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-
-       46,   46,   46,   46,   46,   46,   55,   50,    4,    3,
-       51,    0,    0,    0,   64,    0,    0,   66,   62,   84,
-       84,   84,   84,   83,   81,   72,   83,   74,   75,   76,
-       77,   78,   79,   83,   80,   83,   98,    0,   98,    0,
-       95,    0,   91,   92,    0,   94,   97,    0,   99,    0,
-       99,  102,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,    3,   52,   57,    0,    0,    0,    0,    0,    0,
-        0,    0,   72,    0,    0,   73,    0,    0,    0,    0,
-
-        0,    0,    0,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,    0,   72,    0,
-        0,    0,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   20,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   32,   46,   46,   46,
-       46,   46,   46,   39,   46,   42,   46,   46,   45,    0,
-        0,    0,   46,    7,   46,   46,   46,   12,   46,   46,
-       46,   46,   46,   46,   46,   46,   23,   46,   46,   46,
-
-       46,   46,   29,   46,   46,   46,   46,   46,   36,   46,
-       38,   40,   43,   46,    0,    0,   82,    6,   46,    9,
-       46,   46,   14,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   30,   46,   46,   46,   46,   46,
-       46,   46,    0,   46,   10,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-       33,   46,   35,   46,   46,   44,    0,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   26,
-       27,   46,   46,   46,   37,   46,    0,   46,   46,   46,
-       15,   46,   46,   46,   46,   21,   22,   46,   46,   46,
-
-       46,   46,   46,    0,    0,   46,   11,   46,   46,   46,
-       19,   46,   46,   46,   46,   46,   46,   46,    5,   46,
-       46,   16,   46,   46,   24,   46,   46,   31,   34,   41,
-        8,   46,   46,   46,   46,   46,   13,   46,   46,   46,
-       46,   46,   18,   46,   46,   46,   25,   46,   46,   46,
-       46,   46,   17,   46,   46,   46,   46,   46,   28,    0
-    } ;
-
-static yyconst flex_int32_t yy_ec[256] =
-    {   0,
-        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
-        2,    2,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    4,    1,    5,    6,    7,    8,    1,    9,    1,
-        1,   10,    1,   11,   12,   13,   14,   15,   16,   16,
-       16,   16,   16,   16,   16,   17,   17,   18,   19,   20,
-       21,   22,   23,   24,   25,   25,   25,   25,   25,   25,
-       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
-       13,   13,   13,   13,   26,   13,   13,   27,   13,   13,
-       28,   29,   30,    1,   31,    1,   32,   33,   34,   35,
-
-       36,   37,   38,   39,   40,   13,   41,   42,   43,   44,
-       45,   46,   47,   48,   49,   50,   51,   52,   13,   53,
-       54,   13,   55,   56,   57,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1
-    } ;
-
-static yyconst flex_int32_t yy_meta[59] =
-    {   0,
-        1,    1,    2,    1,    1,    1,    3,    1,    1,    1,
-        1,    4,    5,    1,    6,    6,    6,    1,    1,    1,
-        1,    7,    1,    3,    6,    5,    5,    3,    1,    3,
-        5,    6,    6,    6,    6,    6,    6,    5,    5,    5,
-        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-        5,    5,    5,    5,    1,    1,    1,    7
-    } ;
-
-static yyconst flex_int16_t yy_base[483] =
-    {   0,
-        0,  733,   56,   57,   65,   68,  728,  727,   96,   99,
-      106,  109,  138,  144,   85,  102,  142,  150,  161,  174,
-      206,    0,  162,  182,  220,  225,  736,  740,  740,  740,
-      740,  275,  740,  740,    0,   51,  176,   61,  740,    0,
-      740,  740,  740,  693,  740,  740,  740,  103,  740,  740,
-      740,  740,  164,  740,  720,  740,  740,  192,  740,  740,
-      740,  740,  740,   59,  740,  691,  740,  740,  326,  740,
-      740,  740,  740,  740,  740,   60,  690,  740,  231,  132,
-      740,  187,   71,  243,  740,  740,  674,  740,    0,  690,
-       75,  151,  689,  686,  683,   74,  690,  173,  674,  220,
-
-      147,  157,  220,  680,  687,  690,  740,    0,  740,    0,
-      269,    0,  699,  680,  740,  287,  290,  690,  740,  740,
-      293,  689,  301,  740,  740,   67,    0,  740,  740,  740,
-      740,  740,  740,    0,  740,    0,  740,  317,  321,    0,
-      740,  341,  740,  740,  344,  740,  740,  358,  740,  349,
-      352,  740,    0,  673,  220,  668,  667,  668,  131,  665,
-      672,  188,  677,  662,  666,  223,  672,  657,  658,  226,
-      657,  657,  665,  666,  669,  652,  658,  652,  657,  648,
-      661,    0,    0,  740,  650,  369,  250,  378,  381,  384,
-      387,  269,  324,    0,    0,    0,  671,  390,  152,  393,
-
-      388,  397,  202,  660,  640,  238,  640,  653,  643,  651,
-      650,  649,  672,  633,  632,  669,  648,  641,  642,  315,
-      241,  629,  630,  626,  640,  629,  636,  620,  631,  627,
-      620,  624,  630,  629,  619,  630,  628,  625,  740,    0,
-        0,  396,  612,  621,  607,  613,  608,  621,  606,  619,
-      640,  616,  604,  609,    0,  602,  597,  610,  344,  609,
-      604,  594,  606,  598,  589,  603,    0,  588,  392,  597,
-      586,  599,  584,    0,  589,    0,  588,  586,    0,  626,
-        0,    0,  575,    0,  586,  591,  575,    0,  393,  575,
-      578,  394,  591,  590,  589,  580,    0,  573,  581,  573,
-
-      567,  565,    0,  564,  601,  576,  565,  562,    0,  559,
-        0,  395,    0,  559,  399,    0,  740,    0,  557,  557,
-      571,  552,  397,  555,  557,  553,  558,  551,  553,  549,
-      564,  559,  549,  557,    0,  546,  543,  558,  553,  543,
-      537,  550,  414,  407,    0,  535,  548,  535,  546,  530,
-      531,  567,  546,  533,  540,  524,  525,  539,  524,  539,
-        0,  522,    0,  525,  536,    0,  562,  520,  520,  516,
-      515,  525,  511,  524,  527,  515,  508,  519,  513,    0,
-        0,  511,  505,  503,    0,  518,  545,  501,  500,  514,
-        0,  506,  499,  496,  509,    0,    0,  502,  491,  500,
-
-      507,  502,  495,  531,  348,  499,    0,  489,  480,  481,
-        0,  481,  477,  408,  485,  485,  479,  490,  740,  491,
-      475,    0,  473,  482,    0,  475,  480,    0,    0,    0,
-        0,  483,  409,  473,  469,  467,    0,  478,  470,  472,
-      452,  455,    0,  445,  432,  395,    0,  402,  399,  422,
-      384,  386,    0,  395,  374,  361,  318,  251,    0,  740,
-      440,  447,  454,  461,  464,  470,  476,  483,  487,  493,
-      281,  275,  236,  218,  500,  206,  151,  138,  116,  102,
-       56,  506
-    } ;
-
-static yyconst flex_int16_t yy_def[483] =
-    {   0,
-      460,    1,  461,  461,  461,  461,  462,  462,  461,  461,
-      461,  461,  463,  463,  461,  461,  461,  461,  464,  464,
-      461,   21,   21,   21,   21,   21,  460,  460,  460,  460,
-      460,  460,  460,  460,  465,  460,  460,  460,  460,  466,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  467,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  460,  468,  460,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  460,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-
-      469,  469,  469,  469,  469,  469,  460,  465,  460,  470,
-      460,  471,  466,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  460,  460,  460,  460,  472,  460,  460,  460,
-      460,  460,  460,  473,  460,  474,  460,  460,  460,  475,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  470,  471,  460,  460,  460,  460,  460,  460,  460,
-      460,  467,  460,  476,  477,  474,  475,  460,  460,  460,
-
-      460,  460,  460,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  460,  460,  478,
-      479,  460,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  460,
-      480,  481,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  460,  473,  460,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  460,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  460,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  482,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-
-      469,  469,  469,  482,  482,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  460,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,    0,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460
-    } ;
-
-static yyconst flex_int16_t yy_nxt[799] =
-    {   0,
-       28,   29,   30,   29,   31,   28,   28,   32,   33,   28,
-       34,   28,   35,   36,   37,   38,   38,   28,   39,   40,
-       41,   28,   28,   28,   35,   35,   35,   28,   28,   28,
-       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
-       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
-       35,   35,   35,   35,   42,   43,   28,   28,   46,   46,
-      109,  317,   47,   47,  110,   48,   48,   52,  109,  109,
-       52,   47,  110,  110,   47,  111,  111,  111,  146,   49,
-       49,  193,  193,   50,   50,   51,   51,   67,   49,   68,
-      147,   49,   50,   53,   51,   50,   53,   51,   56,  148,
-
-       57,   56,   47,   57,   67,   47,   68,  316,   59,  162,
-      155,   59,   47,   69,   60,   47,  115,   60,  163,   49,
-      156,  282,   49,   50,   58,   51,   50,   58,   51,   49,
-       69,  116,   49,   50,   58,   51,   50,   58,   51,   62,
-       30,   62,   70,  281,   71,   62,   30,   62,   63,   66,
-       72,   64,   71,  141,   63,   65,  241,   64,   72,   70,
-      142,   65,   74,   30,   74,  117,  118,  117,   47,   87,
-       69,   75,  211,  141,   76,   74,   30,   74,   69,   77,
-      142,   45,  172,  212,   75,   49,  173,   76,   47,   87,
-      111,  111,  111,  121,  122,  121,  143,  174,  157,   70,
-
-      144,   45,  112,  158,  165,   49,  175,   70,   46,  146,
-       78,  240,   79,   80,   81,  145,   45,  166,   45,   82,
-      123,  147,  167,  196,  215,   83,   47,   45,  112,   84,
-      148,   47,   45,   50,  220,   51,   45,  137,   45,   45,
-      216,  195,  138,   49,   45,  139,  139,  139,   49,  149,
-      140,  169,  205,  220,  150,  176,  206,  151,  151,  151,
-       85,  225,   86,  115,  177,  226,  221,  170,  207,  245,
-      171,  460,  262,  178,   45,  263,   45,  246,  116,   45,
-      194,   45,   88,  111,  111,  111,  183,   89,  186,  187,
-      186,  117,  118,  117,  189,  122,  189,  123,  459,   89,
-
-       89,   89,  191,  192,  191,   89,   89,   90,   89,   91,
-       92,   93,   94,   89,   95,   89,   96,   97,   98,   99,
-      100,   89,  101,  102,  103,  104,  105,   89,  106,  107,
-      125,  139,  139,  139,  125,  139,  139,  139,  239,  239,
-      126,  126,  198,  199,  198,  200,  201,  200,  125,  260,
-      419,  127,  405,  458,  125,  298,  261,  128,  129,  202,
-      203,  202,  130,  151,  151,  151,  151,  151,  151,  131,
-      186,  187,  186,  132,  298,  133,  134,  135,  136,  117,
-      118,  117,  189,  122,  189,  189,  122,  189,  191,  192,
-      191,  198,  199,  198,  200,  201,  200,  143,  202,  203,
-
-      202,  144,  137,  307,  322,  325,  341,  138,  348,  457,
-      139,  139,  139,  343,  343,  343,  145,  367,  368,  426,
-      438,  456,  307,  322,  325,  341,  455,  348,  343,  343,
-      343,  454,  453,  452,  451,  450,  449,  368,  426,  438,
-       45,   45,   45,   45,   45,   45,   45,   54,   54,   54,
-       54,   54,   54,   54,   61,   61,   61,   61,   61,   61,
-       61,   73,   73,   73,   73,   73,   73,   73,  108,  108,
-      113,  448,  113,  113,  113,  113,  120,  120,  447,  120,
-      120,  120,  120,  124,  124,  124,  124,  124,  124,  124,
-      153,  153,  153,  182,  446,  182,  182,  182,  182,  182,
-
-      197,  445,  197,  197,  197,  197,  404,  444,  404,  404,
-      404,  404,  404,  443,  442,  441,  440,  439,  437,  436,
-      435,  434,  433,  432,  431,  430,  429,  428,  427,  425,
-      424,  423,  422,  421,  420,  405,  418,  417,  416,  415,
-      414,  413,  412,  411,  410,  409,  408,  407,  406,  405,
-      403,  402,  401,  400,  399,  398,  397,  396,  395,  394,
-      393,  392,  391,  390,  389,  388,  387,  386,  385,  384,
-      383,  382,  381,  380,  379,  378,  377,  376,  375,  374,
-      373,  372,  371,  370,  369,  366,  365,  364,  363,  362,
-      361,  360,  359,  358,  357,  356,  355,  354,  353,  352,
-
-      351,  350,  349,  347,  346,  345,  344,  342,  340,  339,
-      338,  337,  336,  335,  334,  333,  332,  331,  330,  329,
-      328,  327,  326,  324,  323,  321,  320,  319,  318,  315,
-      314,  313,  312,  311,  310,  309,  308,  306,  305,  304,
-      303,  302,  301,  300,  299,  297,  296,  295,  294,  293,
-      292,  291,  290,  289,  288,  287,  286,  285,  284,  283,
-      280,  279,  278,  277,  276,  275,  274,  273,  272,  271,
-      270,  269,  268,  267,  266,  265,  264,  259,  258,  257,
-      256,  255,  254,  253,  252,  251,  250,  249,  248,  247,
-      244,  243,  242,  238,  237,  236,  235,  234,  233,  232,
-
-      231,  230,  229,  228,  227,  224,  223,  222,  219,  218,
-      217,  214,  213,  210,  209,  208,  204,  190,  188,  185,
-      184,  181,  180,  179,  168,  164,  161,  160,  159,  154,
-      152,  114,  114,  119,  114,  460,   55,   55,   44,   27,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  460
-
-    } ;
-
-static yyconst flex_int16_t yy_chk[799] =
-    {   0,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    3,    4,
-       36,  481,    3,    4,   36,    3,    4,    5,   64,   76,
-        6,    5,   64,   76,    6,   38,   38,   38,   83,    3,
-        4,  126,  126,    3,    4,    3,    4,   15,    5,   15,
-       83,    6,    5,    5,    5,    6,    6,    6,    9,   83,
-
-        9,   10,    9,   10,   16,   10,   16,  480,   11,   96,
-       91,   12,   11,   15,   11,   12,   48,   12,   96,    9,
-       91,  479,   10,    9,    9,    9,   10,   10,   10,   11,
-       16,   48,   12,   11,   11,   11,   12,   12,   12,   13,
-       13,   13,   15,  478,   17,   14,   14,   14,   13,   14,
-       17,   13,   18,   80,   14,   13,  477,   14,   18,   16,
-       80,   14,   19,   19,   19,   53,   53,   53,   23,   23,
-       17,   19,  159,  199,   19,   20,   20,   20,   18,   20,
-      199,   23,  101,  159,   20,   23,  101,   20,   24,   24,
-       37,   37,   37,   58,   58,   58,   82,  102,   92,   17,
-
-       82,   24,   37,   92,   98,   24,  102,   18,   21,  203,
-       21,  476,   21,   21,   21,   82,   23,   98,   23,   21,
-       58,  203,   98,  474,  162,   21,   25,   25,   37,   21,
-      203,   26,   26,   21,  166,   21,   24,   79,   24,   25,
-      162,  473,   79,   25,   26,   79,   79,   79,   26,   84,
-       79,  100,  155,  166,   84,  103,  155,   84,   84,   84,
-       21,  170,   21,  187,  103,  170,  166,  100,  155,  206,
-      100,  192,  221,  103,   25,  221,   25,  206,  187,   26,
-      472,   26,   32,  111,  111,  111,  471,   32,  116,  116,
-      116,  117,  117,  117,  121,  121,  121,  192,  458,   32,
-
-       32,   32,  123,  123,  123,   32,   32,   32,   32,   32,
-       32,   32,   32,   32,   32,   32,   32,   32,   32,   32,
-       32,   32,   32,   32,   32,   32,   32,   32,   32,   32,
-       69,  138,  138,  138,   69,  139,  139,  139,  193,  193,
-       69,   69,  142,  142,  142,  145,  145,  145,   69,  220,
-      405,   69,  405,  457,   69,  259,  220,   69,   69,  148,
-      148,  148,   69,  150,  150,  150,  151,  151,  151,   69,
-      186,  186,  186,   69,  259,   69,   69,   69,   69,  188,
-      188,  188,  189,  189,  189,  190,  190,  190,  191,  191,
-      191,  198,  198,  198,  200,  200,  200,  201,  202,  202,
-
-      202,  201,  242,  269,  289,  292,  312,  242,  323,  456,
-      242,  242,  242,  315,  315,  315,  201,  343,  344,  414,
-      433,  455,  269,  289,  292,  312,  454,  323,  343,  343,
-      343,  452,  451,  450,  449,  448,  446,  344,  414,  433,
-      461,  461,  461,  461,  461,  461,  461,  462,  462,  462,
-      462,  462,  462,  462,  463,  463,  463,  463,  463,  463,
-      463,  464,  464,  464,  464,  464,  464,  464,  465,  465,
-      466,  445,  466,  466,  466,  466,  467,  467,  444,  467,
-      467,  467,  467,  468,  468,  468,  468,  468,  468,  468,
-      469,  469,  469,  470,  442,  470,  470,  470,  470,  470,
-
-      475,  441,  475,  475,  475,  475,  482,  440,  482,  482,
-      482,  482,  482,  439,  438,  436,  435,  434,  432,  427,
-      426,  424,  423,  421,  420,  418,  417,  416,  415,  413,
-      412,  410,  409,  408,  406,  404,  403,  402,  401,  400,
-      399,  398,  395,  394,  393,  392,  390,  389,  388,  387,
-      386,  384,  383,  382,  379,  378,  377,  376,  375,  374,
-      373,  372,  371,  370,  369,  368,  367,  365,  364,  362,
-      360,  359,  358,  357,  356,  355,  354,  353,  352,  351,
-      350,  349,  348,  347,  346,  342,  341,  340,  339,  338,
-      337,  336,  334,  333,  332,  331,  330,  329,  328,  327,
-
-      326,  325,  324,  322,  321,  320,  319,  314,  310,  308,
-      307,  306,  305,  304,  302,  301,  300,  299,  298,  296,
-      295,  294,  293,  291,  290,  287,  286,  285,  283,  280,
-      278,  277,  275,  273,  272,  271,  270,  268,  266,  265,
-      264,  263,  262,  261,  260,  258,  257,  256,  254,  253,
-      252,  251,  250,  249,  248,  247,  246,  245,  244,  243,
-      238,  237,  236,  235,  234,  233,  232,  231,  230,  229,
-      228,  227,  226,  225,  224,  223,  222,  219,  218,  217,
-      216,  215,  214,  213,  212,  211,  210,  209,  208,  207,
-      205,  204,  197,  185,  181,  180,  179,  178,  177,  176,
-
-      175,  174,  173,  172,  171,  169,  168,  167,  165,  164,
-      163,  161,  160,  158,  157,  156,  154,  122,  118,  114,
-      113,  106,  105,  104,   99,   97,   95,   94,   93,   90,
-       87,   77,   66,   55,   44,   27,    8,    7,    2,  460,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  460
-
-    } ;
-
-static yy_state_type yy_last_accepting_state;
-static char *yy_last_accepting_cpos;
-
-extern int gram__flex_debug;
-int gram__flex_debug = 1;
-
-static yyconst flex_int16_t yy_rule_linenum[109] =
-    {   0,
-      197,  198,  199,  200,  208,  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,  256,  257,  258,  260,  264,  265,  266,  268,
-      275,  279,  285,  288,  291,  294,  305,  313,  320,  337,
-      343,  364,  365,  376,  387,  388,  400,  408,  419,  435,
-      441,  451,  461,  472,  473,  474,  475,  476,  477,  478,
-      481,  483,  492,  504,  509,  510,  516,  517,  528,  534,
-      540,  546,  562,  596,  597,  598,  634,  636,  637,  639,
-
-      643,  658,  693,  694,  695,  696,  704,  705
-    } ;
-
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-#define yymore() yymore_used_but_not_detected
-#define YY_MORE_ADJ 0
-#define YY_RESTORE_YY_MORE_OFFSET
-char *gram_text;
-#line 1 "scan-gram.l"
-/* Bison Grammar Scanner                             -*- C -*-
-
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   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 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, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301  USA
-*/
-#line 27 "scan-gram.l"
-/* Work around a bug in flex 2.5.31.  See Debian bug 333231
-   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
-#undef gram_wrap
-#define gram_wrap() 1
-
-#include "system.h"
-
-#include <mbswidth.h>
-#include <quote.h>
-
-#include "complain.h"
-#include "files.h"
-#include "getargs.h"
-#include "gram.h"
-#include "quotearg.h"
-#include "reader.h"
-#include "uniqstr.h"
-
-#define YY_USER_INIT					\
-  do							\
-    {							\
-      scanner_cursor.file = current_file;		\
-      scanner_cursor.line = 1;				\
-      scanner_cursor.column = 1;			\
-      code_start = scanner_cursor;			\
-    }							\
-  while (0)
-
-/* Pacify "gcc -Wmissing-prototypes" when flex 2.5.31 is used.  */
-int gram_get_lineno (void);
-FILE *gram_get_in (void);
-FILE *gram_get_out (void);
-int gram_get_leng (void);
-char *gram_get_text (void);
-void gram_set_lineno (int);
-void gram_set_in (FILE *);
-void gram_set_out (FILE *);
-int gram_get_debug (void);
-void gram_set_debug (int);
-int gram_lex_destroy (void);
-
-/* Location of scanner cursor.  */
-boundary scanner_cursor;
-
-static void adjust_location (location *, char const *, size_t);
-#define YY_USER_ACTION  adjust_location (loc, gram_text, gram_leng);
-
-static size_t no_cr_read (FILE *, char *, size_t);
-#define YY_INPUT(buf, result, size) ((result) = no_cr_read (gram_in, buf, size))
-
-
-/* OBSTACK_FOR_STRING -- Used to store all the characters that we need to
-   keep (to construct ID, STRINGS etc.).  Use the following macros to
-   use it.
-
-   Use STRING_GROW to append what has just been matched, and
-   STRING_FINISH to end the string (it puts the ending 0).
-   STRING_FINISH also stores this string in LAST_STRING, which can be
-   used, and which is used by STRING_FREE to free the last string.  */
-
-static struct obstack obstack_for_string;
-
-/* A string representing the most recently saved token.  */
-char *last_string;
-
-/* The location of the most recently saved token, if it was a
-   BRACED_CODE token; otherwise, this has an unspecified value.  */
-location last_braced_code_loc;
-
-#define STRING_GROW   \
-  obstack_grow (&obstack_for_string, gram_text, gram_leng)
-
-#define STRING_FINISH					\
-  do {							\
-    obstack_1grow (&obstack_for_string, '\0');		\
-    last_string = obstack_finish (&obstack_for_string);	\
-  } while (0)
-
-#define STRING_FREE \
-  obstack_free (&obstack_for_string, last_string)
-
-void
-scanner_last_string_free (void)
-{
-  STRING_FREE;
-}
-
-/* Within well-formed rules, RULE_LENGTH is the number of values in
-   the current rule so far, which says where to find `$0' with respect
-   to the top of the stack.  It is not the same as the rule->length in
-   the case of mid rule actions.
-
-   Outside of well-formed rules, RULE_LENGTH has an undefined value.  */
-static int rule_length;
-
-static void rule_length_overflow (location) __attribute__ ((__noreturn__));
-
-/* Increment the rule length by one, checking for overflow.  */
-static inline void
-increment_rule_length (location loc)
-{
-  rule_length++;
-
-  /* Don't allow rule_length == INT_MAX, since that might cause
-     confusion with strtol if INT_MAX == LONG_MAX.  */
-  if (rule_length == INT_MAX)
-    rule_length_overflow (loc);
-}
-
-static void handle_dollar (int token_type, char *cp, location loc);
-static void handle_at (int token_type, char *cp, location loc);
-static void handle_syncline (char *, location);
-static unsigned long int scan_integer (char const *p, int base, location loc);
-static int convert_ucn_to_byte (char const *hex_text);
-static void unexpected_eof (boundary, char const *);
-static void unexpected_newline (boundary, char const *);
-
-
-
-
-
-
-/* POSIX says that a tag must be both an id and a C union member, but
-   historically almost any character is allowed in a tag.  We disallow
-   NUL and newline, as this simplifies our implementation.  */
-/* Zero or more instances of backslash-newline.  Following GCC, allow
-   white space between the backslash and the newline.  */
-#line 1016 "scan-gram.c"
-
-#define INITIAL 0
-#define SC_COMMENT 1
-#define SC_LINE_COMMENT 2
-#define SC_YACC_COMMENT 3
-#define SC_STRING 4
-#define SC_CHARACTER 5
-#define SC_AFTER_IDENTIFIER 6
-#define SC_ESCAPED_STRING 7
-#define SC_ESCAPED_CHARACTER 8
-#define SC_PRE_CODE 9
-#define SC_BRACED_CODE 10
-#define SC_PROLOGUE 11
-#define SC_EPILOGUE 12
-
-#ifndef YY_NO_UNISTD_H
-/* Special case for "unistd.h", since it is non-ANSI. We include it way
- * down here because we want the user's section 1 to have been scanned first.
- * The user has a chance to override it with an option.
- */
-/* %if-c-only */
-#include <unistd.h>
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-#endif
-
-#ifndef YY_EXTRA_TYPE
-#define YY_EXTRA_TYPE void *
-#endif
-
-/* %if-c-only Reentrant structure and macros (non-C++). */
-/* %if-reentrant */
-/* %if-reentrant */
-/* %endif */
-/* %if-bison-bridge */
-/* %endif */
-/* %endif End reentrant structures and macros. */
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int gram_wrap (void );
-#else
-extern int gram_wrap (void );
-#endif
-#endif
-
-/* %not-for-header */
-
-/* %ok-for-header */
-
-/* %endif */
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char *,yyconst char *,int );
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * );
-#endif
-
-#ifndef YY_NO_INPUT
-/* %if-c-only Standard (non-C++) definition */
-/* %not-for-header */
-
-#ifdef __cplusplus
-static int yyinput (void );
-#else
-static int input (void );
-#endif
-/* %ok-for-header */
-
-/* %endif */
-#endif
-
-/* %if-c-only */
-
-/* %endif */
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#define YY_READ_BUF_SIZE 8192
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-#ifndef ECHO
-/* %if-c-only Standard (non-C++) definition */
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO (void) fwrite( gram_text, gram_leng, 1, gram_out )
-/* %endif */
-/* %if-c++-only C++ definition */
-/* %endif */
-#endif
-
-/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
-/* %% [5.0] fread()/read() definition of YY_INPUT goes here unless we're doing C++ \ */\
-	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
-		{ \
-		int c = '*'; \
-		size_t n; \
-		for ( n = 0; n < max_size && \
-			     (c = getc( gram_in )) != EOF && c != '\n'; ++n ) \
-			buf[n] = (char) c; \
-		if ( c == '\n' ) \
-			buf[n++] = (char) c; \
-		if ( c == EOF && ferror( gram_in ) ) \
-			YY_FATAL_ERROR( "input in flex scanner failed" ); \
-		result = n; \
-		} \
-	else \
-		{ \
-		errno=0; \
-		while ( (result = fread(buf, 1, max_size, gram_in))==0 && ferror(gram_in)) \
-			{ \
-			if( errno != EINTR) \
-				{ \
-				YY_FATAL_ERROR( "input in flex scanner failed" ); \
-				break; \
-				} \
-			errno=0; \
-			clearerr(gram_in); \
-			} \
-		}\
-\
-/* %if-c++-only C++ definition \ */\
-/* %endif */
-
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-/* %if-c-only */
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-#endif
-
-/* %if-tables-serialization structures and prototypes */
-/* %not-for-header */
-
-/* %ok-for-header */
-
-/* %not-for-header */
-
-/* %tables-yydmap generated elements */
-/* %endif */
-/* end tables serialization structures and prototypes */
-
-/* %ok-for-header */
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL_IS_OURS 1
-/* %if-c-only Standard (non-C++) definition */
-
-extern int gram_lex (void);
-
-#define YY_DECL int gram_lex (void)
-/* %endif */
-/* %if-c++-only C++ definition */
-/* %endif */
-#endif /* !YY_DECL */
-
-/* Code executed at the beginning of each rule, after gram_text and gram_leng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK break;
-#endif
-
-/* %% [6.0] YY_RULE_SETUP definition goes here */
-#define YY_RULE_SETUP \
-	if ( gram_leng > 0 ) \
-		YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
-				(gram_text[gram_leng - 1] == '\n'); \
-	YY_USER_ACTION
-
-/* %not-for-header */
-
-/** The main scanner function which does all the work.
- */
-YY_DECL
-{
-	register yy_state_type yy_current_state;
-	register char *yy_cp, *yy_bp;
-	register int yy_act;
-    
-/* %% [7.0] user's declarations go here */
-#line 165 "scan-gram.l"
-
-
-  /* Nesting level of the current code in braces.  */
-  int braces_level IF_LINT (= 0);
-
-  /* Parent context state, when applicable.  */
-  int context_state IF_LINT (= 0);
-
-  /* Token type to return, when applicable.  */
-  int token_type IF_LINT (= 0);
-
-  /* Location of most recent identifier, when applicable.  */
-  location id_loc IF_LINT (= empty_location);
-
-  /* Where containing code started, when applicable.  Its initial
-     value is relevant only when gram_lex is invoked in the SC_EPILOGUE
-     start condition.  */
-  boundary code_start = scanner_cursor;
-
-  /* Where containing comment or string or character literal started,
-     when applicable.  */
-  boundary token_start IF_LINT (= scanner_cursor);
-
-
-
-  /*-----------------------.
-  | Scanning white space.  |
-  `-----------------------*/
-
-#line 1266 "scan-gram.c"
-
-	if ( (yy_init) )
-		{
-		(yy_init) = 0;
-
-#ifdef YY_USER_INIT
-		YY_USER_INIT;
-#endif
-
-		if ( ! (yy_start) )
-			(yy_start) = 1;	/* first start state */
-
-		if ( ! gram_in )
-/* %if-c-only */
-			gram_in = stdin;
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-
-		if ( ! gram_out )
-/* %if-c-only */
-			gram_out = stdout;
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-
-		if ( ! YY_CURRENT_BUFFER ) {
-			gram_ensure_buffer_stack ();
-			YY_CURRENT_BUFFER_LVALUE =
-				gram__create_buffer(gram_in,YY_BUF_SIZE );
-		}
-
-		gram__load_buffer_state( );
-		}
-
-	while ( 1 )		/* loops until end-of-file is reached */
-		{
-/* %% [8.0] yymore()-related code goes here */
-		yy_cp = (yy_c_buf_p);
-
-		/* Support of gram_text. */
-		*yy_cp = (yy_hold_char);
-
-		/* yy_bp points to the position in yy_ch_buf of the start of
-		 * the current run.
-		 */
-		yy_bp = yy_cp;
-
-/* %% [9.0] code to set up and find next match goes here */
-		yy_current_state = (yy_start);
-		yy_current_state += YY_AT_BOL();
-yy_match:
-		do
-			{
-			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
-			if ( yy_accept[yy_current_state] )
-				{
-				(yy_last_accepting_state) = yy_current_state;
-				(yy_last_accepting_cpos) = yy_cp;
-				}
-			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-				{
-				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 461 )
-					yy_c = yy_meta[(unsigned int) yy_c];
-				}
-			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-			++yy_cp;
-			}
-		while ( yy_current_state != 460 );
-		yy_cp = (yy_last_accepting_cpos);
-		yy_current_state = (yy_last_accepting_state);
-
-yy_find_action:
-/* %% [10.0] code to find the action number goes here */
-		yy_act = yy_accept[yy_current_state];
-
-		YY_DO_BEFORE_ACTION;
-
-/* %% [11.0] code for gram_lineno update goes here */
-
-do_action:	/* This label is used only to access EOF actions. */
-
-/* %% [12.0] debug code goes here */
-		if ( gram__flex_debug )
-			{
-			if ( yy_act == 0 )
-				fprintf( stderr, "--scanner backing up\n" );
-			else if ( yy_act < 109 )
-				fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
-				         (long)yy_rule_linenum[yy_act], gram_text );
-			else if ( yy_act == 109 )
-				fprintf( stderr, "--accepting default rule (\"%s\")\n",
-				         gram_text );
-			else if ( yy_act == 110 )
-				fprintf( stderr, "--(end of buffer or a NUL)\n" );
-			else
-				fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
-			}
-
-		switch ( yy_act )
-	{ /* beginning of action switch */
-/* %% [13.0] actions go here */
-			case 0: /* must back up */
-			/* undo the effects of YY_DO_BEFORE_ACTION */
-			*yy_cp = (yy_hold_char);
-			yy_cp = (yy_last_accepting_cpos);
-			yy_current_state = (yy_last_accepting_state);
-			goto yy_find_action;
-
-/* Comments and white space.  */
-case 1:
-YY_RULE_SETUP
-#line 197 "scan-gram.l"
-warn_at (*loc, _("stray `,' treated as white space"));
-	YY_BREAK
-case 2:
-/* rule 2 can match eol */
-#line 199 "scan-gram.l"
-case 3:
-/* rule 3 can match eol */
-YY_RULE_SETUP
-#line 199 "scan-gram.l"
-;
-	YY_BREAK
-case 4:
-YY_RULE_SETUP
-#line 200 "scan-gram.l"
-{
-    token_start = loc->start;
-    context_state = YY_START;
-    BEGIN SC_YACC_COMMENT;
-  }
-	YY_BREAK
-/* #line directives are not documented, and may be withdrawn or
-     modified in future versions of Bison.  */
-case 5:
-/* rule 5 can match eol */
-YY_RULE_SETUP
-#line 208 "scan-gram.l"
-{
-    handle_syncline (gram_text + sizeof "#line " - 1, *loc);
-  }
-	YY_BREAK
-
-/*----------------------------.
-  | Scanning Bison directives.  |
-  `----------------------------*/
-
-
-case 6:
-YY_RULE_SETUP
-#line 219 "scan-gram.l"
-return PERCENT_NONASSOC;
-	YY_BREAK
-case 7:
-YY_RULE_SETUP
-#line 220 "scan-gram.l"
-return PERCENT_DEBUG;
-	YY_BREAK
-case 8:
-YY_RULE_SETUP
-#line 221 "scan-gram.l"
-return PERCENT_DEFAULT_PREC;
-	YY_BREAK
-case 9:
-YY_RULE_SETUP
-#line 222 "scan-gram.l"
-return PERCENT_DEFINE;
-	YY_BREAK
-case 10:
-YY_RULE_SETUP
-#line 223 "scan-gram.l"
-return PERCENT_DEFINES;
-	YY_BREAK
-case 11:
-YY_RULE_SETUP
-#line 224 "scan-gram.l"
-token_type = PERCENT_DESTRUCTOR; BEGIN SC_PRE_CODE;
-	YY_BREAK
-case 12:
-YY_RULE_SETUP
-#line 225 "scan-gram.l"
-return PERCENT_DPREC;
-	YY_BREAK
-case 13:
-YY_RULE_SETUP
-#line 226 "scan-gram.l"
-return PERCENT_ERROR_VERBOSE;
-	YY_BREAK
-case 14:
-YY_RULE_SETUP
-#line 227 "scan-gram.l"
-return PERCENT_EXPECT;
-	YY_BREAK
-case 15:
-YY_RULE_SETUP
-#line 228 "scan-gram.l"
-return PERCENT_EXPECT_RR;
-	YY_BREAK
-case 16:
-YY_RULE_SETUP
-#line 229 "scan-gram.l"
-return PERCENT_FILE_PREFIX;
-	YY_BREAK
-case 17:
-YY_RULE_SETUP
-#line 230 "scan-gram.l"
-return PERCENT_YACC;
-	YY_BREAK
-case 18:
-YY_RULE_SETUP
-#line 231 "scan-gram.l"
-token_type = PERCENT_INITIAL_ACTION; BEGIN SC_PRE_CODE;
-	YY_BREAK
-case 19:
-YY_RULE_SETUP
-#line 232 "scan-gram.l"
-return PERCENT_GLR_PARSER;
-	YY_BREAK
-case 20:
-YY_RULE_SETUP
-#line 233 "scan-gram.l"
-return PERCENT_LEFT;
-	YY_BREAK
-case 21:
-YY_RULE_SETUP
-#line 234 "scan-gram.l"
-token_type = PERCENT_LEX_PARAM; BEGIN SC_PRE_CODE;
-	YY_BREAK
-case 22:
-YY_RULE_SETUP
-#line 235 "scan-gram.l"
-return PERCENT_LOCATIONS;
-	YY_BREAK
-case 23:
-YY_RULE_SETUP
-#line 236 "scan-gram.l"
-return PERCENT_MERGE;
-	YY_BREAK
-case 24:
-YY_RULE_SETUP
-#line 237 "scan-gram.l"
-return PERCENT_NAME_PREFIX;
-	YY_BREAK
-case 25:
-YY_RULE_SETUP
-#line 238 "scan-gram.l"
-return PERCENT_NO_DEFAULT_PREC;
-	YY_BREAK
-case 26:
-YY_RULE_SETUP
-#line 239 "scan-gram.l"
-return PERCENT_NO_LINES;
-	YY_BREAK
-case 27:
-YY_RULE_SETUP
-#line 240 "scan-gram.l"
-return PERCENT_NONASSOC;
-	YY_BREAK
-case 28:
-YY_RULE_SETUP
-#line 241 "scan-gram.l"
-return PERCENT_NONDETERMINISTIC_PARSER;
-	YY_BREAK
-case 29:
-YY_RULE_SETUP
-#line 242 "scan-gram.l"
-return PERCENT_NTERM;
-	YY_BREAK
-case 30:
-YY_RULE_SETUP
-#line 243 "scan-gram.l"
-return PERCENT_OUTPUT;
-	YY_BREAK
-case 31:
-YY_RULE_SETUP
-#line 244 "scan-gram.l"
-token_type = PERCENT_PARSE_PARAM; BEGIN SC_PRE_CODE;
-	YY_BREAK
-case 32:
-YY_RULE_SETUP
-#line 245 "scan-gram.l"
-rule_length--; return PERCENT_PREC;
-	YY_BREAK
-case 33:
-YY_RULE_SETUP
-#line 246 "scan-gram.l"
-token_type = PERCENT_PRINTER; BEGIN SC_PRE_CODE;
-	YY_BREAK
-case 34:
-YY_RULE_SETUP
-#line 247 "scan-gram.l"
-return PERCENT_PURE_PARSER;
-	YY_BREAK
-case 35:
-YY_RULE_SETUP
-#line 248 "scan-gram.l"
-return PERCENT_REQUIRE;
-	YY_BREAK
-case 36:
-YY_RULE_SETUP
-#line 249 "scan-gram.l"
-return PERCENT_RIGHT;
-	YY_BREAK
-case 37:
-YY_RULE_SETUP
-#line 250 "scan-gram.l"
-return PERCENT_SKELETON;
-	YY_BREAK
-case 38:
-YY_RULE_SETUP
-#line 251 "scan-gram.l"
-return PERCENT_START;
-	YY_BREAK
-case 39:
-YY_RULE_SETUP
-#line 252 "scan-gram.l"
-return PERCENT_TOKEN;
-	YY_BREAK
-case 40:
-YY_RULE_SETUP
-#line 253 "scan-gram.l"
-return PERCENT_TOKEN;
-	YY_BREAK
-case 41:
-YY_RULE_SETUP
-#line 254 "scan-gram.l"
-return PERCENT_TOKEN_TABLE;
-	YY_BREAK
-case 42:
-YY_RULE_SETUP
-#line 255 "scan-gram.l"
-return PERCENT_TYPE;
-	YY_BREAK
-case 43:
-YY_RULE_SETUP
-#line 256 "scan-gram.l"
-token_type = PERCENT_UNION; BEGIN SC_PRE_CODE;
-	YY_BREAK
-case 44:
-YY_RULE_SETUP
-#line 257 "scan-gram.l"
-return PERCENT_VERBOSE;
-	YY_BREAK
-case 45:
-YY_RULE_SETUP
-#line 258 "scan-gram.l"
-return PERCENT_YACC;
-	YY_BREAK
-case 46:
-YY_RULE_SETUP
-#line 260 "scan-gram.l"
-{
-    complain_at (*loc, _("invalid directive: %s"), quote (gram_text));
-  }
-	YY_BREAK
-case 47:
-YY_RULE_SETUP
-#line 264 "scan-gram.l"
-return EQUAL;
-	YY_BREAK
-case 48:
-YY_RULE_SETUP
-#line 265 "scan-gram.l"
-rule_length = 0; return PIPE;
-	YY_BREAK
-case 49:
-YY_RULE_SETUP
-#line 266 "scan-gram.l"
-return SEMICOLON;
-	YY_BREAK
-case 50:
-YY_RULE_SETUP
-#line 268 "scan-gram.l"
-{
-    val->symbol = symbol_get (gram_text, *loc);
-    id_loc = *loc;
-    increment_rule_length (*loc);
-    BEGIN SC_AFTER_IDENTIFIER;
-  }
-	YY_BREAK
-case 51:
-YY_RULE_SETUP
-#line 275 "scan-gram.l"
-{
-    val->integer = scan_integer (gram_text, 10, *loc);
-    return INT;
-  }
-	YY_BREAK
-case 52:
-YY_RULE_SETUP
-#line 279 "scan-gram.l"
-{
-    val->integer = scan_integer (gram_text, 16, *loc);
-    return INT;
-  }
-	YY_BREAK
-/* Characters.  We don't check there is only one.  */
-case 53:
-YY_RULE_SETUP
-#line 285 "scan-gram.l"
-STRING_GROW; token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER;
-	YY_BREAK
-/* Strings. */
-case 54:
-YY_RULE_SETUP
-#line 288 "scan-gram.l"
-token_start = loc->start; BEGIN SC_ESCAPED_STRING;
-	YY_BREAK
-/* Prologue. */
-case 55:
-YY_RULE_SETUP
-#line 291 "scan-gram.l"
-code_start = loc->start; BEGIN SC_PROLOGUE;
-	YY_BREAK
-/* Code in between braces.  */
-case 56:
-YY_RULE_SETUP
-#line 294 "scan-gram.l"
-{
-    if (current_rule && current_rule->action)
-      grammar_midrule_action ();
-    STRING_GROW;
-    token_type = BRACED_CODE;
-    braces_level = 0;
-    code_start = loc->start;
-    BEGIN SC_BRACED_CODE;
-  }
-	YY_BREAK
-/* A type. */
-case 57:
-YY_RULE_SETUP
-#line 305 "scan-gram.l"
-{
-    obstack_grow (&obstack_for_string, gram_text + 1, gram_leng - 2);
-    STRING_FINISH;
-    val->uniqstr = uniqstr_new (last_string);
-    STRING_FREE;
-    return TYPE;
-  }
-	YY_BREAK
-case 58:
-YY_RULE_SETUP
-#line 313 "scan-gram.l"
-{
-    static int percent_percent_count;
-    if (++percent_percent_count == 2)
-      BEGIN SC_EPILOGUE;
-    return PERCENT_PERCENT;
-  }
-	YY_BREAK
-case 59:
-YY_RULE_SETUP
-#line 320 "scan-gram.l"
-{
-    complain_at (*loc, _("invalid character: %s"), quote (gram_text));
-  }
-	YY_BREAK
-case YY_STATE_EOF(INITIAL):
-#line 324 "scan-gram.l"
-{
-    loc->start = loc->end = scanner_cursor;
-    yyterminate ();
-  }
-	YY_BREAK
-
-/*-----------------------------------------------------------------.
-  | Scanning after an identifier, checking whether a colon is next.  |
-  `-----------------------------------------------------------------*/
-
-
-case 60:
-YY_RULE_SETUP
-#line 337 "scan-gram.l"
-{
-    rule_length = 0;
-    *loc = id_loc;
-    BEGIN INITIAL;
-    return ID_COLON;
-  }
-	YY_BREAK
-case 61:
-YY_RULE_SETUP
-#line 343 "scan-gram.l"
-{
-    scanner_cursor.column -= mbsnwidth (gram_text, gram_leng, 0);
-    yyless (0);
-    *loc = id_loc;
-    BEGIN INITIAL;
-    return ID;
-  }
-	YY_BREAK
-case YY_STATE_EOF(SC_AFTER_IDENTIFIER):
-#line 350 "scan-gram.l"
-{
-    *loc = id_loc;
-    BEGIN INITIAL;
-    return ID;
-  }
-	YY_BREAK
-
-/*---------------------------------------------------------------.
-  | Scanning a Yacc comment.  The initial `/ *' is already eaten.  |
-  `---------------------------------------------------------------*/
-
-
-case 62:
-YY_RULE_SETUP
-#line 364 "scan-gram.l"
-BEGIN context_state;
-	YY_BREAK
-case 63:
-/* rule 63 can match eol */
-YY_RULE_SETUP
-#line 365 "scan-gram.l"
-;
-	YY_BREAK
-case YY_STATE_EOF(SC_YACC_COMMENT):
-#line 366 "scan-gram.l"
-unexpected_eof (token_start, "*/"); BEGIN context_state;
-	YY_BREAK
-
-/*------------------------------------------------------------.
-  | Scanning a C comment.  The initial `/ *' is already eaten.  |
-  `------------------------------------------------------------*/
-
-
-case 64:
-/* rule 64 can match eol */
-YY_RULE_SETUP
-#line 376 "scan-gram.l"
-STRING_GROW; BEGIN context_state;
-	YY_BREAK
-case YY_STATE_EOF(SC_COMMENT):
-#line 377 "scan-gram.l"
-unexpected_eof (token_start, "*/"); BEGIN context_state;
-	YY_BREAK
-
-/*--------------------------------------------------------------.
-  | Scanning a line comment.  The initial `//' is already eaten.  |
-  `--------------------------------------------------------------*/
-
-
-case 65:
-/* rule 65 can match eol */
-YY_RULE_SETUP
-#line 387 "scan-gram.l"
-STRING_GROW; BEGIN context_state;
-	YY_BREAK
-case 66:
-/* rule 66 can match eol */
-YY_RULE_SETUP
-#line 388 "scan-gram.l"
-STRING_GROW;
-	YY_BREAK
-case YY_STATE_EOF(SC_LINE_COMMENT):
-#line 389 "scan-gram.l"
-BEGIN context_state;
-	YY_BREAK
-
-/*------------------------------------------------.
-  | Scanning a Bison string, including its escapes. |
-  | The initial quote is already eaten.             |
-  `------------------------------------------------*/
-
-
-case 67:
-YY_RULE_SETUP
-#line 400 "scan-gram.l"
-{
-    STRING_FINISH;
-    loc->start = token_start;
-    val->chars = last_string;
-    increment_rule_length (*loc);
-    BEGIN INITIAL;
-    return STRING;
-  }
-	YY_BREAK
-case 68:
-/* rule 68 can match eol */
-YY_RULE_SETUP
-#line 408 "scan-gram.l"
-unexpected_newline (token_start, "\"");	BEGIN INITIAL;
-	YY_BREAK
-case YY_STATE_EOF(SC_ESCAPED_STRING):
-#line 409 "scan-gram.l"
-unexpected_eof (token_start, "\"");	BEGIN INITIAL;
-	YY_BREAK
-
-/*----------------------------------------------------------.
-  | Scanning a Bison character literal, decoding its escapes. |
-  | The initial quote is already eaten.			      |
-  `----------------------------------------------------------*/
-
-
-case 69:
-YY_RULE_SETUP
-#line 419 "scan-gram.l"
-{
-    unsigned char last_string_1;
-    STRING_GROW;
-    STRING_FINISH;
-    loc->start = token_start;
-    val->symbol = symbol_get (quotearg_style (escape_quoting_style,
-					      last_string),
-			      *loc);
-    symbol_class_set (val->symbol, token_sym, *loc, false);
-    last_string_1 = last_string[1];
-    symbol_user_token_number_set (val->symbol, last_string_1, *loc);
-    STRING_FREE;
-    increment_rule_length (*loc);
-    BEGIN INITIAL;
-    return ID;
-  }
-	YY_BREAK
-case 70:
-/* rule 70 can match eol */
-YY_RULE_SETUP
-#line 435 "scan-gram.l"
-unexpected_newline (token_start, "'");	BEGIN INITIAL;
-	YY_BREAK
-case YY_STATE_EOF(SC_ESCAPED_CHARACTER):
-#line 436 "scan-gram.l"
-unexpected_eof (token_start, "'");	BEGIN INITIAL;
-	YY_BREAK
-
-
-
-case 71:
-YY_RULE_SETUP
-#line 441 "scan-gram.l"
-complain_at (*loc, _("invalid null character"));
-	YY_BREAK
-
-/*----------------------------.
-  | Decode escaped characters.  |
-  `----------------------------*/
-
-
-case 72:
-YY_RULE_SETUP
-#line 451 "scan-gram.l"
-{
-    unsigned long int c = strtoul (gram_text + 1, NULL, 8);
-    if (UCHAR_MAX < c)
-      complain_at (*loc, _("invalid escape sequence: %s"), quote (gram_text));
-    else if (! c)
-      complain_at (*loc, _("invalid null character: %s"), quote (gram_text));
-    else
-      obstack_1grow (&obstack_for_string, c);
-  }
-	YY_BREAK
-case 73:
-YY_RULE_SETUP
-#line 461 "scan-gram.l"
-{
-    verify (UCHAR_MAX < ULONG_MAX);
-    unsigned long int c = strtoul (gram_text + 2, NULL, 16);
-    if (UCHAR_MAX < c)
-      complain_at (*loc, _("invalid escape sequence: %s"), quote (gram_text));
-    else if (! c)
-      complain_at (*loc, _("invalid null character: %s"), quote (gram_text));
-    else
-      obstack_1grow (&obstack_for_string, c);
-  }
-	YY_BREAK
-case 74:
-YY_RULE_SETUP
-#line 472 "scan-gram.l"
-obstack_1grow (&obstack_for_string, '\a');
-	YY_BREAK
-case 75:
-YY_RULE_SETUP
-#line 473 "scan-gram.l"
-obstack_1grow (&obstack_for_string, '\b');
-	YY_BREAK
-case 76:
-YY_RULE_SETUP
-#line 474 "scan-gram.l"
-obstack_1grow (&obstack_for_string, '\f');
-	YY_BREAK
-case 77:
-YY_RULE_SETUP
-#line 475 "scan-gram.l"
-obstack_1grow (&obstack_for_string, '\n');
-	YY_BREAK
-case 78:
-YY_RULE_SETUP
-#line 476 "scan-gram.l"
-obstack_1grow (&obstack_for_string, '\r');
-	YY_BREAK
-case 79:
-YY_RULE_SETUP
-#line 477 "scan-gram.l"
-obstack_1grow (&obstack_for_string, '\t');
-	YY_BREAK
-case 80:
-YY_RULE_SETUP
-#line 478 "scan-gram.l"
-obstack_1grow (&obstack_for_string, '\v');
-	YY_BREAK
-/* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
-case 81:
-YY_RULE_SETUP
-#line 481 "scan-gram.l"
-obstack_1grow (&obstack_for_string, gram_text[1]);
-	YY_BREAK
-case 82:
-YY_RULE_SETUP
-#line 483 "scan-gram.l"
-{
-    int c = convert_ucn_to_byte (gram_text);
-    if (c < 0)
-      complain_at (*loc, _("invalid escape sequence: %s"), quote (gram_text));
-    else if (! c)
-      complain_at (*loc, _("invalid null character: %s"), quote (gram_text));
-    else
-      obstack_1grow (&obstack_for_string, c);
-  }
-	YY_BREAK
-case 83:
-/* rule 83 can match eol */
-YY_RULE_SETUP
-#line 492 "scan-gram.l"
-{
-    complain_at (*loc, _("unrecognized escape sequence: %s"), quote (gram_text));
-    STRING_GROW;
-  }
-	YY_BREAK
-
-/*--------------------------------------------.
-  | Scanning user-code characters and strings.  |
-  `--------------------------------------------*/
-
-
-case 84:
-/* rule 84 can match eol */
-YY_RULE_SETUP
-#line 504 "scan-gram.l"
-STRING_GROW;
-	YY_BREAK
-
-
-
-case 85:
-YY_RULE_SETUP
-#line 509 "scan-gram.l"
-STRING_GROW; BEGIN context_state;
-	YY_BREAK
-case 86:
-/* rule 86 can match eol */
-YY_RULE_SETUP
-#line 510 "scan-gram.l"
-unexpected_newline (token_start, "'"); BEGIN context_state;
-	YY_BREAK
-case YY_STATE_EOF(SC_CHARACTER):
-#line 511 "scan-gram.l"
-unexpected_eof (token_start, "'"); BEGIN context_state;
-	YY_BREAK
-
-
-
-case 87:
-YY_RULE_SETUP
-#line 516 "scan-gram.l"
-STRING_GROW; BEGIN context_state;
-	YY_BREAK
-case 88:
-/* rule 88 can match eol */
-YY_RULE_SETUP
-#line 517 "scan-gram.l"
-unexpected_newline (token_start, "\""); BEGIN context_state;
-	YY_BREAK
-case YY_STATE_EOF(SC_STRING):
-#line 518 "scan-gram.l"
-unexpected_eof (token_start, "\""); BEGIN context_state;
-	YY_BREAK
-
-/*---------------------------------------------------.
-  | Strings, comments etc. can be found in user code.  |
-  `---------------------------------------------------*/
-
-
-case 89:
-YY_RULE_SETUP
-#line 528 "scan-gram.l"
-{
-    STRING_GROW;
-    context_state = YY_START;
-    token_start = loc->start;
-    BEGIN SC_CHARACTER;
-  }
-	YY_BREAK
-case 90:
-YY_RULE_SETUP
-#line 534 "scan-gram.l"
-{
-    STRING_GROW;
-    context_state = YY_START;
-    token_start = loc->start;
-    BEGIN SC_STRING;
-  }
-	YY_BREAK
-case 91:
-/* rule 91 can match eol */
-YY_RULE_SETUP
-#line 540 "scan-gram.l"
-{
-    STRING_GROW;
-    context_state = YY_START;
-    token_start = loc->start;
-    BEGIN SC_COMMENT;
-  }
-	YY_BREAK
-case 92:
-/* rule 92 can match eol */
-YY_RULE_SETUP
-#line 546 "scan-gram.l"
-{
-    STRING_GROW;
-    context_state = YY_START;
-    BEGIN SC_LINE_COMMENT;
-  }
-	YY_BREAK
-
-/*---------------------------------------------------------------.
-  | Scanning after %union etc., possibly followed by white space.  |
-  | For %union only, allow arbitrary C code to appear before the   |
-  | following brace, as an extension to POSIX.			   |
-  `---------------------------------------------------------------*/
-
-
-case 93:
-YY_RULE_SETUP
-#line 562 "scan-gram.l"
-{
-    bool valid = gram_text[0] == '{' || token_type == PERCENT_UNION;
-    scanner_cursor.column -= mbsnwidth (gram_text, gram_leng, 0);
-    yyless (0);
-
-    if (valid)
-      {
-	braces_level = -1;
-	code_start = loc->start;
-	BEGIN SC_BRACED_CODE;
-      }
-    else
-      {
-	complain_at (*loc, _("missing `{' in %s"),
-		     token_name (token_type));
-	obstack_sgrow (&obstack_for_string, "{}");
-	STRING_FINISH;
-	val->chars = last_string;
-	BEGIN INITIAL;
-	return token_type;
-      }
-  }
-	YY_BREAK
-case YY_STATE_EOF(SC_PRE_CODE):
-#line 585 "scan-gram.l"
-unexpected_eof (scanner_cursor, "{}"); BEGIN INITIAL;
-	YY_BREAK
-
-/*---------------------------------------------------------------.
-  | Scanning some code in braces (%union and actions). The initial |
-  | "{" is already eaten.                                          |
-  `---------------------------------------------------------------*/
-
-
-case 94:
-/* rule 94 can match eol */
-YY_RULE_SETUP
-#line 596 "scan-gram.l"
-STRING_GROW; braces_level++;
-	YY_BREAK
-case 95:
-/* rule 95 can match eol */
-YY_RULE_SETUP
-#line 597 "scan-gram.l"
-STRING_GROW; braces_level--;
-	YY_BREAK
-case 96:
-YY_RULE_SETUP
-#line 598 "scan-gram.l"
-{
-    bool outer_brace = --braces_level < 0;
-
-    /* As an undocumented Bison extension, append `;' before the last
-       brace in braced code, so that the user code can omit trailing
-       `;'.  But do not append `;' if emulating Yacc, since Yacc does
-       not append one.
-
-       FIXME: Bison should warn if a semicolon seems to be necessary
-       here, and should omit the semicolon if it seems unnecessary
-       (e.g., after ';', '{', or '}', each followed by comments or
-       white space).  Such a warning shouldn't depend on --yacc; it
-       should depend on a new --pedantic option, which would cause
-       Bison to warn if it detects an extension to POSIX.  --pedantic
-       should also diagnose other Bison extensions like %yacc.
-       Perhaps there should also be a GCC-style --pedantic-errors
-       option, so that such warnings are diagnosed as errors.  */
-    if (outer_brace && token_type == BRACED_CODE && ! yacc_flag)
-      obstack_1grow (&obstack_for_string, ';');
-
-    obstack_1grow (&obstack_for_string, '}');
-
-    if (outer_brace)
-      {
-	STRING_FINISH;
-	loc->start = code_start;
-	val->chars = last_string;
-	increment_rule_length (*loc);
-	last_braced_code_loc = *loc;
-	BEGIN INITIAL;
-	return token_type;
-      }
-  }
-	YY_BREAK
-/* Tokenize `<<%' correctly (as `<<' `%') rather than incorrrectly
-     (as `<' `<%').  */
-case 97:
-/* rule 97 can match eol */
-YY_RULE_SETUP
-#line 634 "scan-gram.l"
-STRING_GROW;
-	YY_BREAK
-case 98:
-YY_RULE_SETUP
-#line 636 "scan-gram.l"
-handle_dollar (token_type, gram_text, *loc);
-	YY_BREAK
-case 99:
-YY_RULE_SETUP
-#line 637 "scan-gram.l"
-handle_at (token_type, gram_text, *loc);
-	YY_BREAK
-case 100:
-YY_RULE_SETUP
-#line 639 "scan-gram.l"
-{
-    warn_at (*loc, _("stray `$'"));
-    obstack_sgrow (&obstack_for_string, "$][");
-  }
-	YY_BREAK
-case 101:
-YY_RULE_SETUP
-#line 643 "scan-gram.l"
-{
-    warn_at (*loc, _("stray `@'"));
-    obstack_sgrow (&obstack_for_string, "@@");
-  }
-	YY_BREAK
-case YY_STATE_EOF(SC_BRACED_CODE):
-#line 648 "scan-gram.l"
-unexpected_eof (code_start, "}"); BEGIN INITIAL;
-	YY_BREAK
-
-/*--------------------------------------------------------------.
-  | Scanning some prologue: from "%{" (already scanned) to "%}".  |
-  `--------------------------------------------------------------*/
-
-
-case 102:
-YY_RULE_SETUP
-#line 658 "scan-gram.l"
-{
-    STRING_FINISH;
-    loc->start = code_start;
-    val->chars = last_string;
-    BEGIN INITIAL;
-    return PROLOGUE;
-  }
-	YY_BREAK
-case YY_STATE_EOF(SC_PROLOGUE):
-#line 666 "scan-gram.l"
-unexpected_eof (code_start, "%}"); BEGIN INITIAL;
-	YY_BREAK
-
-/*---------------------------------------------------------------.
-  | Scanning the epilogue (everything after the second "%%", which |
-  | has already been eaten).                                       |
-  `---------------------------------------------------------------*/
-
-
-case YY_STATE_EOF(SC_EPILOGUE):
-#line 677 "scan-gram.l"
-{
-    STRING_FINISH;
-    loc->start = code_start;
-    val->chars = last_string;
-    BEGIN INITIAL;
-    return EPILOGUE;
-  }
-	YY_BREAK
-
-/*-----------------------------------------.
-  | Escape M4 quoting characters in C code.  |
-  `-----------------------------------------*/
-
-
-case 103:
-YY_RULE_SETUP
-#line 693 "scan-gram.l"
-obstack_sgrow (&obstack_for_string, "$][");
-	YY_BREAK
-case 104:
-YY_RULE_SETUP
-#line 694 "scan-gram.l"
-obstack_sgrow (&obstack_for_string, "@@");
-	YY_BREAK
-case 105:
-YY_RULE_SETUP
-#line 695 "scan-gram.l"
-obstack_sgrow (&obstack_for_string, "@{");
-	YY_BREAK
-case 106:
-YY_RULE_SETUP
-#line 696 "scan-gram.l"
-obstack_sgrow (&obstack_for_string, "@}");
-	YY_BREAK
-
-/*-----------------------------------------------------.
-  | By default, grow the string obstack with the input.  |
-  `-----------------------------------------------------*/
-case 107:
-#line 705 "scan-gram.l"
-case 108:
-/* rule 108 can match eol */
-YY_RULE_SETUP
-#line 705 "scan-gram.l"
-STRING_GROW;
-	YY_BREAK
-case 109:
-YY_RULE_SETUP
-#line 707 "scan-gram.l"
-YY_FATAL_ERROR( "flex scanner jammed" );
-	YY_BREAK
-#line 2305 "scan-gram.c"
-
-	case YY_END_OF_BUFFER:
-		{
-		/* Amount of text matched not including the EOB char. */
-		int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
-
-		/* Undo the effects of YY_DO_BEFORE_ACTION. */
-		*yy_cp = (yy_hold_char);
-		YY_RESTORE_YY_MORE_OFFSET
-
-		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
-			{
-			/* We're scanning a new file or input source.  It's
-			 * possible that this happened because the user
-			 * just pointed gram_in at a new source and called
-			 * gram_lex().  If so, then we have to assure
-			 * consistency between YY_CURRENT_BUFFER and our
-			 * globals.  Here is the right place to do so, because
-			 * this is the first action (other than possibly a
-			 * back-up) that will match for the new input source.
-			 */
-			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
-			YY_CURRENT_BUFFER_LVALUE->yy_input_file = gram_in;
-			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
-			}
-
-		/* Note that here we test for yy_c_buf_p "<=" to the position
-		 * of the first EOB in the buffer, since yy_c_buf_p will
-		 * already have been incremented past the NUL character
-		 * (since all states make transitions on EOB to the
-		 * end-of-buffer state).  Contrast this with the test
-		 * in input().
-		 */
-		if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
-			{ /* This was really a NUL. */
-			yy_state_type yy_next_state;
-
-			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
-
-			yy_current_state = yy_get_previous_state(  );
-
-			/* Okay, we're now positioned to make the NUL
-			 * transition.  We couldn't have
-			 * yy_get_previous_state() go ahead and do it
-			 * for us because it doesn't know how to deal
-			 * with the possibility of jamming (and we don't
-			 * want to build jamming into it because then it
-			 * will run more slowly).
-			 */
-
-			yy_next_state = yy_try_NUL_trans( yy_current_state );
-
-			yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-
-			if ( yy_next_state )
-				{
-				/* Consume the NUL. */
-				yy_cp = ++(yy_c_buf_p);
-				yy_current_state = yy_next_state;
-				goto yy_match;
-				}
-
-			else
-				{
-/* %% [14.0] code to do back-up for compressed tables and set up yy_cp goes here */
-				yy_cp = (yy_last_accepting_cpos);
-				yy_current_state = (yy_last_accepting_state);
-				goto yy_find_action;
-				}
-			}
-
-		else switch ( yy_get_next_buffer(  ) )
-			{
-			case EOB_ACT_END_OF_FILE:
-				{
-				(yy_did_buffer_switch_on_eof) = 0;
-
-				if ( gram_wrap( ) )
-					{
-					/* Note: because we've taken care in
-					 * yy_get_next_buffer() to have set up
-					 * gram_text, we can now set up
-					 * yy_c_buf_p so that if some total
-					 * hoser (like flex itself) wants to
-					 * call the scanner after we return the
-					 * YY_NULL, it'll still work - another
-					 * YY_NULL will get returned.
-					 */
-					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
-
-					yy_act = YY_STATE_EOF(YY_START);
-					goto do_action;
-					}
-
-				else
-					{
-					if ( ! (yy_did_buffer_switch_on_eof) )
-						YY_NEW_FILE;
-					}
-				break;
-				}
-
-			case EOB_ACT_CONTINUE_SCAN:
-				(yy_c_buf_p) =
-					(yytext_ptr) + yy_amount_of_matched_text;
-
-				yy_current_state = yy_get_previous_state(  );
-
-				yy_cp = (yy_c_buf_p);
-				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-				goto yy_match;
-
-			case EOB_ACT_LAST_MATCH:
-				(yy_c_buf_p) =
-				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
-
-				yy_current_state = yy_get_previous_state(  );
-
-				yy_cp = (yy_c_buf_p);
-				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-				goto yy_find_action;
-			}
-		break;
-		}
-
-	default:
-		YY_FATAL_ERROR(
-			"fatal flex scanner internal error--no action found" );
-	} /* end of action switch */
-		} /* end of scanning one token */
-} /* end of gram_lex */
-/* %ok-for-header */
-
-/* %if-c++-only */
-/* %not-for-header */
-
-/* %ok-for-header */
-
-/* %endif */
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- *	EOB_ACT_LAST_MATCH -
- *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- *	EOB_ACT_END_OF_FILE - end of file
- */
-/* %if-c-only */
-static int yy_get_next_buffer (void)
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
-	register char *source = (yytext_ptr);
-	register int number_to_move, i;
-	int ret_val;
-
-	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
-		YY_FATAL_ERROR(
-		"fatal flex scanner internal error--end of buffer missed" );
-
-	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
-		{ /* Don't try to fill the buffer, so this is an EOF. */
-		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
-			{
-			/* We matched a single character, the EOB, so
-			 * treat this as a final EOF.
-			 */
-			return EOB_ACT_END_OF_FILE;
-			}
-
-		else
-			{
-			/* We matched some text prior to the EOB, first
-			 * process it.
-			 */
-			return EOB_ACT_LAST_MATCH;
-			}
-		}
-
-	/* Try to read more data. */
-
-	/* First move last chars to start of buffer. */
-	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
-
-	for ( i = 0; i < number_to_move; ++i )
-		*(dest++) = *(source++);
-
-	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
-		/* don't do the read, it's not guaranteed to return an EOF,
-		 * just force an EOF
-		 */
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
-
-	else
-		{
-			size_t num_to_read =
-			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
-
-		while ( num_to_read <= 0 )
-			{ /* Not enough room in the buffer - grow it. */
-
-			/* just a shorter name for the current buffer */
-			YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
-
-			int yy_c_buf_p_offset =
-				(int) ((yy_c_buf_p) - b->yy_ch_buf);
-
-			if ( b->yy_is_our_buffer )
-				{
-				int new_size = b->yy_buf_size * 2;
-
-				if ( new_size <= 0 )
-					b->yy_buf_size += b->yy_buf_size / 8;
-				else
-					b->yy_buf_size *= 2;
-
-				b->yy_ch_buf = (char *)
-					/* Include room in for 2 EOB chars. */
-					gram_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
-				}
-			else
-				/* Can't grow it, we don't own it. */
-				b->yy_ch_buf = 0;
-
-			if ( ! b->yy_ch_buf )
-				YY_FATAL_ERROR(
-				"fatal error - scanner input buffer overflow" );
-
-			(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
-
-			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
-						number_to_move - 1;
-
-			}
-
-		if ( num_to_read > YY_READ_BUF_SIZE )
-			num_to_read = YY_READ_BUF_SIZE;
-
-		/* Read in more data. */
-		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
-			(yy_n_chars), num_to_read );
-
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-		}
-
-	if ( (yy_n_chars) == 0 )
-		{
-		if ( number_to_move == YY_MORE_ADJ )
-			{
-			ret_val = EOB_ACT_END_OF_FILE;
-			gram_restart(gram_in  );
-			}
-
-		else
-			{
-			ret_val = EOB_ACT_LAST_MATCH;
-			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
-				YY_BUFFER_EOF_PENDING;
-			}
-		}
-
-	else
-		ret_val = EOB_ACT_CONTINUE_SCAN;
-
-	(yy_n_chars) += number_to_move;
-	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
-	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
-
-	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
-
-	return ret_val;
-}
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
-/* %if-c-only */
-/* %not-for-header */
-
-    static yy_state_type yy_get_previous_state (void)
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-	register yy_state_type yy_current_state;
-	register char *yy_cp;
-    
-/* %% [15.0] code to get the start state into yy_current_state goes here */
-	yy_current_state = (yy_start);
-	yy_current_state += YY_AT_BOL();
-
-	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
-		{
-/* %% [16.0] code to find the next state goes here */
-		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 58);
-		if ( yy_accept[yy_current_state] )
-			{
-			(yy_last_accepting_state) = yy_current_state;
-			(yy_last_accepting_cpos) = yy_cp;
-			}
-		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-			{
-			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 461 )
-				yy_c = yy_meta[(unsigned int) yy_c];
-			}
-		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-		}
-
-	return yy_current_state;
-}
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- *	next_state = yy_try_NUL_trans( current_state );
- */
-/* %if-c-only */
-    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-	register int yy_is_jam;
-    /* %% [17.0] code to find the next state, and perhaps do backing up, goes here */
-	register char *yy_cp = (yy_c_buf_p);
-
-	register YY_CHAR yy_c = 58;
-	if ( yy_accept[yy_current_state] )
-		{
-		(yy_last_accepting_state) = yy_current_state;
-		(yy_last_accepting_cpos) = yy_cp;
-		}
-	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-		{
-		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 461 )
-			yy_c = yy_meta[(unsigned int) yy_c];
-		}
-	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-	yy_is_jam = (yy_current_state == 460);
-
-	return yy_is_jam ? 0 : yy_current_state;
-}
-
-/* %if-c-only */
-
-/* %endif */
-
-/* %if-c-only */
-#ifndef YY_NO_INPUT
-#ifdef __cplusplus
-    static int yyinput (void)
-#else
-    static int input  (void)
-#endif
-
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-	int c;
-    
-	*(yy_c_buf_p) = (yy_hold_char);
-
-	if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
-		{
-		/* yy_c_buf_p now points to the character we want to return.
-		 * If this occurs *before* the EOB characters, then it's a
-		 * valid NUL; if not, then we've hit the end of the buffer.
-		 */
-		if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
-			/* This was really a NUL. */
-			*(yy_c_buf_p) = '\0';
-
-		else
-			{ /* need more input */
-			int offset = (yy_c_buf_p) - (yytext_ptr);
-			++(yy_c_buf_p);
-
-			switch ( yy_get_next_buffer(  ) )
-				{
-				case EOB_ACT_LAST_MATCH:
-					/* This happens because yy_g_n_b()
-					 * sees that we've accumulated a
-					 * token and flags that we need to
-					 * try matching the token before
-					 * proceeding.  But for input(),
-					 * there's no matching to consider.
-					 * So convert the EOB_ACT_LAST_MATCH
-					 * to EOB_ACT_END_OF_FILE.
-					 */
-
-					/* Reset buffer status. */
-					gram_restart(gram_in );
-
-					/*FALLTHROUGH*/
-
-				case EOB_ACT_END_OF_FILE:
-					{
-					if ( gram_wrap( ) )
-						return EOF;
-
-					if ( ! (yy_did_buffer_switch_on_eof) )
-						YY_NEW_FILE;
-#ifdef __cplusplus
-					return yyinput();
-#else
-					return input();
-#endif
-					}
-
-				case EOB_ACT_CONTINUE_SCAN:
-					(yy_c_buf_p) = (yytext_ptr) + offset;
-					break;
-				}
-			}
-		}
-
-	c = *(unsigned char *) (yy_c_buf_p);	/* cast for 8-bit char's */
-	*(yy_c_buf_p) = '\0';	/* preserve gram_text */
-	(yy_hold_char) = *++(yy_c_buf_p);
-
-/* %% [19.0] update BOL and gram_lineno */
-	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
-
-	return c;
-}
-/* %if-c-only */
-#endif	/* ifndef YY_NO_INPUT */
-/* %endif */
-
-/** Immediately switch to a different input stream.
- * @param input_file A readable stream.
- * 
- * @note This function does not reset the start condition to @c INITIAL .
- */
-/* %if-c-only */
-    void gram_restart  (FILE * input_file )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    
-	if ( ! YY_CURRENT_BUFFER ){
-        gram_ensure_buffer_stack ();
-		YY_CURRENT_BUFFER_LVALUE =
-            gram__create_buffer(gram_in,YY_BUF_SIZE );
-	}
-
-	gram__init_buffer(YY_CURRENT_BUFFER,input_file );
-	gram__load_buffer_state( );
-}
-
-/** Switch to a different input buffer.
- * @param new_buffer The new input buffer.
- * 
- */
-/* %if-c-only */
-    void gram__switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    
-	/* TODO. We should be able to replace this entire function body
-	 * with
-	 *		gram_pop_buffer_state();
-	 *		gram_push_buffer_state(new_buffer);
-     */
-	gram_ensure_buffer_stack ();
-	if ( YY_CURRENT_BUFFER == new_buffer )
-		return;
-
-	if ( YY_CURRENT_BUFFER )
-		{
-		/* Flush out information for old buffer. */
-		*(yy_c_buf_p) = (yy_hold_char);
-		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-		}
-
-	YY_CURRENT_BUFFER_LVALUE = new_buffer;
-	gram__load_buffer_state( );
-
-	/* We don't actually know whether we did this switch during
-	 * EOF (gram_wrap()) processing, but the only time this flag
-	 * is looked at is after gram_wrap() is called, so it's safe
-	 * to go ahead and always set it.
-	 */
-	(yy_did_buffer_switch_on_eof) = 1;
-}
-
-/* %if-c-only */
-static void gram__load_buffer_state  (void)
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
-	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
-	gram_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
-	(yy_hold_char) = *(yy_c_buf_p);
-}
-
-/** Allocate and initialize an input buffer state.
- * @param file A readable stream.
- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
- * 
- * @return the allocated buffer state.
- */
-/* %if-c-only */
-    YY_BUFFER_STATE gram__create_buffer  (FILE * file, int  size )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-	YY_BUFFER_STATE b;
-    
-	b = (YY_BUFFER_STATE) gram_alloc(sizeof( struct yy_buffer_state )  );
-	if ( ! b )
-		YY_FATAL_ERROR( "out of dynamic memory in gram__create_buffer()" );
-
-	b->yy_buf_size = size;
-
-	/* yy_ch_buf has to be 2 characters longer than the size given because
-	 * we need to put in 2 end-of-buffer characters.
-	 */
-	b->yy_ch_buf = (char *) gram_alloc(b->yy_buf_size + 2  );
-	if ( ! b->yy_ch_buf )
-		YY_FATAL_ERROR( "out of dynamic memory in gram__create_buffer()" );
-
-	b->yy_is_our_buffer = 1;
-
-	gram__init_buffer(b,file );
-
-	return b;
-}
-
-/** Destroy the buffer.
- * @param b a buffer created with gram__create_buffer()
- * 
- */
-/* %if-c-only */
-    void gram__delete_buffer (YY_BUFFER_STATE  b )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    
-	if ( ! b )
-		return;
-
-	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
-		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
-
-	if ( b->yy_is_our_buffer )
-		gram_free((void *) b->yy_ch_buf  );
-
-	gram_free((void *) b  );
-}
-
-/* %if-c-only */
-
-/* %endif */
-
-/* %if-c++-only */
-/* %endif */
-
-/* Initializes or reinitializes a buffer.
- * This function is sometimes called more than once on the same buffer,
- * such as during a gram_restart() or at EOF.
- */
-/* %if-c-only */
-    static void gram__init_buffer  (YY_BUFFER_STATE  b, FILE * file )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-
-{
-	int oerrno = errno;
-    
-	gram__flush_buffer(b );
-
-	b->yy_input_file = file;
-	b->yy_fill_buffer = 1;
-
-    /* If b is the current buffer, then gram__init_buffer was _probably_
-     * called from gram_restart() or through yy_get_next_buffer.
-     * In that case, we don't want to reset the lineno or column.
-     */
-    if (b != YY_CURRENT_BUFFER){
-        b->yy_bs_lineno = 1;
-        b->yy_bs_column = 0;
-    }
-
-/* %if-c-only */
-
-        b->yy_is_interactive = 0;
-    
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-	errno = oerrno;
-}
-
-/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
- * 
- */
-/* %if-c-only */
-    void gram__flush_buffer (YY_BUFFER_STATE  b )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    	if ( ! b )
-		return;
-
-	b->yy_n_chars = 0;
-
-	/* We always need two end-of-buffer characters.  The first causes
-	 * a transition to the end-of-buffer state.  The second causes
-	 * a jam in that state.
-	 */
-	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
-	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
-	b->yy_buf_pos = &b->yy_ch_buf[0];
-
-	b->yy_at_bol = 1;
-	b->yy_buffer_status = YY_BUFFER_NEW;
-
-	if ( b == YY_CURRENT_BUFFER )
-		gram__load_buffer_state( );
-}
-
-/* %if-c-or-c++ */
-/** Pushes the new state onto the stack. The new state becomes
- *  the current state. This function will allocate the stack
- *  if necessary.
- *  @param new_buffer The new state.
- *  
- */
-/* %if-c-only */
-void gram_push_buffer_state (YY_BUFFER_STATE new_buffer )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    	if (new_buffer == NULL)
-		return;
-
-	gram_ensure_buffer_stack();
-
-	/* This block is copied from gram__switch_to_buffer. */
-	if ( YY_CURRENT_BUFFER )
-		{
-		/* Flush out information for old buffer. */
-		*(yy_c_buf_p) = (yy_hold_char);
-		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-		}
-
-	/* Only push if top exists. Otherwise, replace top. */
-	if (YY_CURRENT_BUFFER)
-		(yy_buffer_stack_top)++;
-	YY_CURRENT_BUFFER_LVALUE = new_buffer;
-
-	/* copied from gram__switch_to_buffer. */
-	gram__load_buffer_state( );
-	(yy_did_buffer_switch_on_eof) = 1;
-}
-/* %endif */
-
-/* %if-c-or-c++ */
-/** Removes and deletes the top of the stack, if present.
- *  The next element becomes the new top.
- *  
- */
-/* %if-c-only */
-void gram_pop_buffer_state (void)
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    	if (!YY_CURRENT_BUFFER)
-		return;
-
-	gram__delete_buffer(YY_CURRENT_BUFFER );
-	YY_CURRENT_BUFFER_LVALUE = NULL;
-	if ((yy_buffer_stack_top) > 0)
-		--(yy_buffer_stack_top);
-
-	if (YY_CURRENT_BUFFER) {
-		gram__load_buffer_state( );
-		(yy_did_buffer_switch_on_eof) = 1;
-	}
-}
-/* %endif */
-
-/* %if-c-or-c++ */
-/* Allocates the stack if it does not exist.
- *  Guarantees space for at least one push.
- */
-/* %if-c-only */
-static void gram_ensure_buffer_stack (void)
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-	int num_to_alloc;
-    
-	if (!(yy_buffer_stack)) {
-
-		/* First allocation is just for 2 elements, since we don't know if this
-		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
-		 * immediate realloc on the next call.
-         */
-		num_to_alloc = 1;
-		(yy_buffer_stack) = (struct yy_buffer_state**)gram_alloc
-								(num_to_alloc * sizeof(struct yy_buffer_state*)
-								);
-		
-		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-				
-		(yy_buffer_stack_max) = num_to_alloc;
-		(yy_buffer_stack_top) = 0;
-		return;
-	}
-
-	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
-
-		/* Increase the buffer to prepare for a possible push. */
-		int grow_size = 8 /* arbitrary grow size */;
-
-		num_to_alloc = (yy_buffer_stack_max) + grow_size;
-		(yy_buffer_stack) = (struct yy_buffer_state**)gram_realloc
-								((yy_buffer_stack),
-								num_to_alloc * sizeof(struct yy_buffer_state*)
-								);
-
-		/* zero only the new slots.*/
-		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
-		(yy_buffer_stack_max) = num_to_alloc;
-	}
-}
-/* %endif */
-
-/* %if-c-only */
-/** Setup the input buffer state to scan directly from a user-specified character buffer.
- * @param base the character buffer
- * @param size the size in bytes of the character buffer
- * 
- * @return the newly allocated buffer state object. 
- */
-YY_BUFFER_STATE gram__scan_buffer  (char * base, yy_size_t  size )
-{
-	YY_BUFFER_STATE b;
-    
-	if ( size < 2 ||
-	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
-	     base[size-1] != YY_END_OF_BUFFER_CHAR )
-		/* They forgot to leave room for the EOB's. */
-		return 0;
-
-	b = (YY_BUFFER_STATE) gram_alloc(sizeof( struct yy_buffer_state )  );
-	if ( ! b )
-		YY_FATAL_ERROR( "out of dynamic memory in gram__scan_buffer()" );
-
-	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
-	b->yy_buf_pos = b->yy_ch_buf = base;
-	b->yy_is_our_buffer = 0;
-	b->yy_input_file = 0;
-	b->yy_n_chars = b->yy_buf_size;
-	b->yy_is_interactive = 0;
-	b->yy_at_bol = 1;
-	b->yy_fill_buffer = 0;
-	b->yy_buffer_status = YY_BUFFER_NEW;
-
-	gram__switch_to_buffer(b  );
-
-	return b;
-}
-/* %endif */
-
-/* %if-c-only */
-/** Setup the input buffer state to scan a string. The next call to gram_lex() will
- * scan from a @e copy of @a str.
- * @param str a NUL-terminated string to scan
- * 
- * @return the newly allocated buffer state object.
- * @note If you want to scan bytes that may contain NUL values, then use
- *       gram__scan_bytes() instead.
- */
-YY_BUFFER_STATE gram__scan_string (yyconst char * yy_str )
-{
-    
-	return gram__scan_bytes(yy_str,strlen(yy_str) );
-}
-/* %endif */
-
-/* %if-c-only */
-/** Setup the input buffer state to scan the given bytes. The next call to gram_lex() will
- * scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
- * 
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE gram__scan_bytes  (yyconst char * bytes, int  len )
-{
-	YY_BUFFER_STATE b;
-	char *buf;
-	yy_size_t n;
-	int i;
-    
-	/* Get memory for full buffer, including space for trailing EOB's. */
-	n = len + 2;
-	buf = (char *) gram_alloc(n  );
-	if ( ! buf )
-		YY_FATAL_ERROR( "out of dynamic memory in gram__scan_bytes()" );
-
-	for ( i = 0; i < len; ++i )
-		buf[i] = bytes[i];
-
-	buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
-
-	b = gram__scan_buffer(buf,n );
-	if ( ! b )
-		YY_FATAL_ERROR( "bad buffer in gram__scan_bytes()" );
-
-	/* It's okay to grow etc. this buffer, and we should throw it
-	 * away when we're done.
-	 */
-	b->yy_is_our_buffer = 1;
-
-	return b;
-}
-/* %endif */
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-/* %if-c-only */
-static void yy_fatal_error (yyconst char* msg )
-{
-    	(void) fprintf( stderr, "%s\n", msg );
-	exit( YY_EXIT_FAILURE );
-}
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
-	do \
-		{ \
-		/* Undo effects of setting up gram_text. */ \
-        int yyless_macro_arg = (n); \
-        YY_LESS_LINENO(yyless_macro_arg);\
-		gram_text[gram_leng] = (yy_hold_char); \
-		(yy_c_buf_p) = gram_text + yyless_macro_arg; \
-		(yy_hold_char) = *(yy_c_buf_p); \
-		*(yy_c_buf_p) = '\0'; \
-		gram_leng = yyless_macro_arg; \
-		} \
-	while ( 0 )
-
-/* Accessor  methods (get/set functions) to struct members. */
-
-/* %if-c-only */
-/* %if-reentrant */
-/* %endif */
-
-/** Get the current line number.
- * 
- */
-int gram_get_lineno  (void)
-{
-        
-    return gram_lineno;
-}
-
-/** Get the input stream.
- * 
- */
-FILE *gram_get_in  (void)
-{
-        return gram_in;
-}
-
-/** Get the output stream.
- * 
- */
-FILE *gram_get_out  (void)
-{
-        return gram_out;
-}
-
-/** Get the length of the current token.
- * 
- */
-int gram_get_leng  (void)
-{
-        return gram_leng;
-}
-
-/** Get the current token.
- * 
- */
-
-char *gram_get_text  (void)
-{
-        return gram_text;
-}
-
-/* %if-reentrant */
-/* %endif */
-
-/** Set the current line number.
- * @param line_number
- * 
- */
-void gram_set_lineno (int  line_number )
-{
-    
-    gram_lineno = line_number;
-}
-
-/** Set the input stream. This does not discard the current
- * input buffer.
- * @param in_str A readable stream.
- * 
- * @see gram__switch_to_buffer
- */
-void gram_set_in (FILE *  in_str )
-{
-        gram_in = in_str ;
-}
-
-void gram_set_out (FILE *  out_str )
-{
-        gram_out = out_str ;
-}
-
-int gram_get_debug  (void)
-{
-        return gram__flex_debug;
-}
-
-void gram_set_debug (int  bdebug )
-{
-        gram__flex_debug = bdebug ;
-}
-
-/* %endif */
-
-/* %if-reentrant */
-/* %if-bison-bridge */
-/* %endif */
-/* %endif */
-
-/* %if-c-only SNIP! this currently causes conflicts with the c++ scanner */
-/* gram_lex_destroy is for both reentrant and non-reentrant scanners. */
-int gram_lex_destroy  (void)
-{
-    
-    /* Pop the buffer stack, destroying each element. */
-	while(YY_CURRENT_BUFFER){
-		gram__delete_buffer(YY_CURRENT_BUFFER  );
-		YY_CURRENT_BUFFER_LVALUE = NULL;
-		gram_pop_buffer_state();
-	}
-
-	/* Destroy the stack itself. */
-	gram_free((yy_buffer_stack) );
-	(yy_buffer_stack) = NULL;
-
-/* %if-reentrant */
-/* %endif */
-    return 0;
-}
-/* %endif */
-
-/*
- * Internal utility routines.
- */
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
-{
-	register int i;
-    	for ( i = 0; i < n; ++i )
-		s1[i] = s2[i];
-}
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * s )
-{
-	register int n;
-    	for ( n = 0; s[n]; ++n )
-		;
-
-	return n;
-}
-#endif
-
-void *gram_alloc (yy_size_t  size )
-{
-	return (void *) malloc( size );
-}
-
-void *gram_realloc  (void * ptr, yy_size_t  size )
-{
-	/* The cast to (char *) in the following accommodates both
-	 * implementations that use char* generic pointers, and those
-	 * that use void* generic pointers.  It works with the latter
-	 * because both ANSI C and C++ allow castless assignment from
-	 * any pointer type to void*, and deal with argument conversions
-	 * as though doing an assignment.
-	 */
-	return (void *) realloc( (char *) ptr, size );
-}
-
-void gram_free (void * ptr )
-{
-	free( (char *) ptr );	/* see gram_realloc() for (char *) cast */
-}
-
-/* %if-tables-serialization definitions */
-/* %define-yytables   The name for this specific scanner's tables. */
-#define YYTABLES_NAME "yytables"
-/* %endif */
-
-/* %ok-for-header */
-
-#undef YY_NEW_FILE
-#undef YY_FLUSH_BUFFER
-#undef yy_set_bol
-#undef yy_new_buffer
-#undef yy_set_interactive
-#undef yytext_ptr
-#undef YY_DO_BEFORE_ACTION
-
-#ifdef YY_DECL_IS_OURS
-#undef YY_DECL_IS_OURS
-#undef YY_DECL
-#endif
-#line 707 "scan-gram.l"
-
-
-
-/* Keeps track of the maximum number of semantic values to the left of
-   a handle (those referenced by $0, $-1, etc.) are required by the
-   semantic actions of this grammar. */
-int max_left_semantic_context = 0;
-
-/* If BUF is null, add BUFSIZE (which in this case must be less than
-   INT_MAX) to COLUMN; otherwise, add mbsnwidth (BUF, BUFSIZE, 0) to
-   COLUMN.  If an overflow occurs, or might occur but is undetectable,
-   return INT_MAX.  Assume COLUMN is nonnegative.  */
-
-static inline int
-add_column_width (int column, char const *buf, size_t bufsize)
-{
-  size_t width;
-  unsigned int remaining_columns = INT_MAX - column;
-
-  if (buf)
-    {
-      if (INT_MAX / 2 <= bufsize)
-	return INT_MAX;
-      width = mbsnwidth (buf, bufsize, 0);
-    }
-  else
-    width = bufsize;
-
-  return width <= remaining_columns ? column + width : INT_MAX;
-}
-
-/* Set *LOC and adjust scanner cursor to account for token TOKEN of
-   size SIZE.  */
-
-static void
-adjust_location (location *loc, char const *token, size_t size)
-{
-  int line = scanner_cursor.line;
-  int column = scanner_cursor.column;
-  char const *p0 = token;
-  char const *p = token;
-  char const *lim = token + size;
-
-  loc->start = scanner_cursor;
-
-  for (p = token; p < lim; p++)
-    switch (*p)
-      {
-      case '\n':
-	line += line < INT_MAX;
-	column = 1;
-	p0 = p + 1;
-	break;
-
-      case '\t':
-	column = add_column_width (column, p0, p - p0);
-	column = add_column_width (column, NULL, 8 - ((column - 1) & 7));
-	p0 = p + 1;
-	break;
-
-      default:
-	break;
-      }
-
-  scanner_cursor.line = line;
-  scanner_cursor.column = column = add_column_width (column, p0, p - p0);
-
-  loc->end = scanner_cursor;
-
-  if (line == INT_MAX && loc->start.line != INT_MAX)
-    warn_at (*loc, _("line number overflow"));
-  if (column == INT_MAX && loc->start.column != INT_MAX)
-    warn_at (*loc, _("column number overflow"));
-}
-
-
-/* Read bytes from FP into buffer BUF of size SIZE.  Return the
-   number of bytes read.  Remove '\r' from input, treating \r\n
-   and isolated \r as \n.  */
-
-static size_t
-no_cr_read (FILE *fp, char *buf, size_t size)
-{
-  size_t bytes_read = fread (buf, 1, size, fp);
-  if (bytes_read)
-    {
-      char *w = memchr (buf, '\r', bytes_read);
-      if (w)
-	{
-	  char const *r = ++w;
-	  char const *lim = buf + bytes_read;
-
-	  for (;;)
-	    {
-	      /* Found an '\r'.  Treat it like '\n', but ignore any
-		 '\n' that immediately follows.  */
-	      w[-1] = '\n';
-	      if (r == lim)
-		{
-		  int ch = getc (fp);
-		  if (ch != '\n' && ungetc (ch, fp) != ch)
-		    break;
-		}
-	      else if (*r == '\n')
-		r++;
-
-	      /* Copy until the next '\r'.  */
-	      do
-		{
-		  if (r == lim)
-		    return w - buf;
-		}
-	      while ((*w++ = *r++) != '\r');
-	    }
-
-	  return w - buf;
-	}
-    }
-
-  return bytes_read;
-}
-
-
-/*------------------------------------------------------------------.
-| TEXT is pointing to a wannabee semantic value (i.e., a `$').      |
-|                                                                   |
-| Possible inputs: $[<TYPENAME>]($|integer)                         |
-|                                                                   |
-| Output to OBSTACK_FOR_STRING a reference to this semantic value.  |
-`------------------------------------------------------------------*/
-
-static inline bool
-handle_action_dollar (char *text, location loc)
-{
-  const char *type_name = NULL;
-  char *cp = text + 1;
-
-  if (! current_rule)
-    return false;
-
-  /* Get the type name if explicit. */
-  if (*cp == '<')
-    {
-      type_name = ++cp;
-      while (*cp != '>')
-	++cp;
-      *cp = '\0';
-      ++cp;
-    }
-
-  if (*cp == '$')
-    {
-      if (!type_name)
-	type_name = symbol_list_n_type_name_get (current_rule, loc, 0);
-      if (!type_name && typed)
-	complain_at (loc, _("$$ of `%s' has no declared type"),
-		     current_rule->sym->tag);
-      if (!type_name)
-	type_name = "";
-      obstack_fgrow1 (&obstack_for_string,
-		      "]b4_lhs_value([%s])[", type_name);
-      current_rule->used = true;
-    }
-  else
-    {
-      long int num = strtol (cp, NULL, 10);
-
-      if (1 - INT_MAX + rule_length <= num && num <= rule_length)
-	{
-	  int n = num;
-	  if (max_left_semantic_context < 1 - n)
-	    max_left_semantic_context = 1 - n;
-	  if (!type_name && 0 < n)
-	    type_name = symbol_list_n_type_name_get (current_rule, loc, n);
-	  if (!type_name && typed)
-	    complain_at (loc, _("$%d of `%s' has no declared type"),
-			 n, current_rule->sym->tag);
-	  if (!type_name)
-	    type_name = "";
-	  obstack_fgrow3 (&obstack_for_string,
-			  "]b4_rhs_value(%d, %d, [%s])[",
-			  rule_length, n, type_name);
-	  symbol_list_n_used_set (current_rule, n, true);
-	}
-      else
-	complain_at (loc, _("integer out of range: %s"), quote (text));
-    }
-
-  return true;
-}
-
-
-/*----------------------------------------------------------------.
-| Map `$?' onto the proper M4 symbol, depending on its TOKEN_TYPE |
-| (are we in an action?).                                         |
-`----------------------------------------------------------------*/
-
-static void
-handle_dollar (int token_type, char *text, location loc)
-{
-  switch (token_type)
-    {
-    case BRACED_CODE:
-      if (handle_action_dollar (text, loc))
-	return;
-      break;
-
-    case PERCENT_DESTRUCTOR:
-    case PERCENT_INITIAL_ACTION:
-    case PERCENT_PRINTER:
-      if (text[1] == '$')
-	{
-	  obstack_sgrow (&obstack_for_string, "]b4_dollar_dollar[");
-	  return;
-	}
-      break;
-
-    default:
-      break;
-    }
-
-  complain_at (loc, _("invalid value: %s"), quote (text));
-}
-
-
-/*------------------------------------------------------.
-| TEXT is a location token (i.e., a `@...').  Output to |
-| OBSTACK_FOR_STRING a reference to this location.      |
-`------------------------------------------------------*/
-
-static inline bool
-handle_action_at (char *text, location loc)
-{
-  char *cp = text + 1;
-  locations_flag = true;
-
-  if (! current_rule)
-    return false;
-
-  if (*cp == '$')
-    obstack_sgrow (&obstack_for_string, "]b4_lhs_location[");
-  else
-    {
-      long int num = strtol (cp, NULL, 10);
-
-      if (1 - INT_MAX + rule_length <= num && num <= rule_length)
-	{
-	  int n = num;
-	  obstack_fgrow2 (&obstack_for_string, "]b4_rhs_location(%d, %d)[",
-			  rule_length, n);
-	}
-      else
-	complain_at (loc, _("integer out of range: %s"), quote (text));
-    }
-
-  return true;
-}
-
-
-/*----------------------------------------------------------------.
-| Map `@?' onto the proper M4 symbol, depending on its TOKEN_TYPE |
-| (are we in an action?).                                         |
-`----------------------------------------------------------------*/
-
-static void
-handle_at (int token_type, char *text, location loc)
-{
-  switch (token_type)
-    {
-    case BRACED_CODE:
-      handle_action_at (text, loc);
-      return;
-
-    case PERCENT_INITIAL_ACTION:
-    case PERCENT_DESTRUCTOR:
-    case PERCENT_PRINTER:
-      if (text[1] == '$')
-	{
-	  obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
-	  return;
-	}
-      break;
-
-    default:
-      break;
-    }
-
-  complain_at (loc, _("invalid value: %s"), quote (text));
-}
-
-
-/*------------------------------------------------------.
-| Scan NUMBER for a base-BASE integer at location LOC.  |
-`------------------------------------------------------*/
-
-static unsigned long int
-scan_integer (char const *number, int base, location loc)
-{
-  verify (INT_MAX < ULONG_MAX);
-  unsigned long int num = strtoul (number, NULL, base);
-
-  if (INT_MAX < num)
-    {
-      complain_at (loc, _("integer out of range: %s"), quote (number));
-      num = INT_MAX;
-    }
-
-  return num;
-}
-
-
-/*------------------------------------------------------------------.
-| Convert universal character name UCN to a single-byte character,  |
-| and return that character.  Return -1 if UCN does not correspond  |
-| to a single-byte character.					    |
-`------------------------------------------------------------------*/
-
-static int
-convert_ucn_to_byte (char const *ucn)
-{
-  verify (UCHAR_MAX <= INT_MAX);
-  unsigned long int code = strtoul (ucn + 2, NULL, 16);
-
-  /* FIXME: Currently we assume Unicode-compatible unibyte characters
-     on ASCII hosts (i.e., Latin-1 on hosts with 8-bit bytes).  On
-     non-ASCII hosts we support only the portable C character set.
-     These limitations should be removed once we add support for
-     multibyte characters.  */
-
-  if (UCHAR_MAX < code)
-    return -1;
-
-#if ! ('$' == 0x24 && '@' == 0x40 && '`' == 0x60 && '~' == 0x7e)
-  {
-    /* A non-ASCII host.  Use CODE to index into a table of the C
-       basic execution character set, which is guaranteed to exist on
-       all Standard C platforms.  This table also includes '$', '@',
-       and '`', which are not in the basic execution character set but
-       which are unibyte characters on all the platforms that we know
-       about.  */
-    static signed char const table[] =
-      {
-	'\0',   -1,   -1,   -1,   -1,   -1,   -1, '\a',
-	'\b', '\t', '\n', '\v', '\f', '\r',   -1,   -1,
-	  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-	  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-	 ' ',  '!',  '"',  '#',  '$',  '%',  '&', '\'',
-	 '(',  ')',  '*',  '+',  ',',  '-',  '.',  '/',
-	 '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',
-	 '8',  '9',  ':',  ';',  '<',  '=',  '>',  '?',
-	 '@',  'A',  'B',  'C',  'D',  'E',  'F',  'G',
-	 'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',
-	 'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',
-	 'X',  'Y',  'Z',  '[', '\\',  ']',  '^',  '_',
-	 '`',  'a',  'b',  'c',  'd',  'e',  'f',  'g',
-	 'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',
-	 'p',  'q',  'r',  's',  't',  'u',  'v',  'w',
-	 'x',  'y',  'z',  '{',  '|',  '}',  '~'
-      };
-
-    code = code < sizeof table ? table[code] : -1;
-  }
-#endif
-
-  return code;
-}
-
-
-/*----------------------------------------------------------------.
-| Handle `#line INT "FILE"'.  ARGS has already skipped `#line '.  |
-`----------------------------------------------------------------*/
-
-static void
-handle_syncline (char *args, location loc)
-{
-  char *after_num;
-  unsigned long int lineno = strtoul (args, &after_num, 10);
-  char *file = strchr (after_num, '"') + 1;
-  *strchr (file, '"') = '\0';
-  if (INT_MAX <= lineno)
-    {
-      warn_at (loc, _("line number overflow"));
-      lineno = INT_MAX;
-    }
-  scanner_cursor.file = current_file = uniqstr_new (file);
-  scanner_cursor.line = lineno;
-  scanner_cursor.column = 1;
-}
-
-
-/*---------------------------------.
-| Report a rule that is too long.  |
-`---------------------------------*/
-
-static void
-rule_length_overflow (location loc)
-{
-  fatal_at (loc, _("rule is too long"));
-}
-
-
-/*----------------------------------------------------------------.
-| For a token or comment starting at START, report message MSGID, |
-| which should say that an end marker was found before		  |
-| the expected TOKEN_END.					  |
-`----------------------------------------------------------------*/
-
-static void
-unexpected_end (boundary start, char const *msgid, char const *token_end)
-{
-  location loc;
-  loc.start = start;
-  loc.end = scanner_cursor;
-  complain_at (loc, _(msgid), token_end);
-}
-
-
-/*------------------------------------------------------------------------.
-| Report an unexpected EOF in a token or comment starting at START.       |
-| An end of file was encountered and the expected TOKEN_END was missing.  |
-`------------------------------------------------------------------------*/
-
-static void
-unexpected_eof (boundary start, char const *token_end)
-{
-  unexpected_end (start, N_("missing `%s' at end of file"), token_end);
-}
-
-
-/*----------------------------------------.
-| Likewise, but for unexpected newlines.  |
-`----------------------------------------*/
-
-static void
-unexpected_newline (boundary start, char const *token_end)
-{
-  unexpected_end (start, N_("missing `%s' at end of line"), token_end);
-}
-
-
-/*-------------------------.
-| Initialize the scanner.  |
-`-------------------------*/
-
-void
-scanner_initialize (void)
-{
-  obstack_init (&obstack_for_string);
-}
-
-
-/*-----------------------------------------------.
-| Free all the memory allocated to the scanner.  |
-`-----------------------------------------------*/
-
-void
-scanner_free (void)
-{
-  obstack_free (&obstack_for_string, 0);
-  /* Reclaim Flex's buffers.  */
-  gram__delete_buffer (YY_CURRENT_BUFFER);
-}
-
diff --git a/src/scan-gram.l b/src/scan-gram.l
deleted file mode 100644
index cf704c7..0000000
--- a/src/scan-gram.l
+++ /dev/null
@@ -1,1167 +0,0 @@
-/* Bison Grammar Scanner                             -*- C -*-
-
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   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 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, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301  USA
-*/
-
-%option debug nodefault nounput noyywrap never-interactive
-%option prefix="gram_" outfile="lex.yy.c"
-
-%{
-/* Work around a bug in flex 2.5.31.  See Debian bug 333231
-   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
-#undef gram_wrap
-#define gram_wrap() 1
-
-#include "system.h"
-
-#include <mbswidth.h>
-#include <quote.h>
-
-#include "complain.h"
-#include "files.h"
-#include "getargs.h"
-#include "gram.h"
-#include "quotearg.h"
-#include "reader.h"
-#include "uniqstr.h"
-
-#define YY_USER_INIT					\
-  do							\
-    {							\
-      scanner_cursor.file = current_file;		\
-      scanner_cursor.line = 1;				\
-      scanner_cursor.column = 1;			\
-      code_start = scanner_cursor;			\
-    }							\
-  while (0)
-
-/* Pacify "gcc -Wmissing-prototypes" when flex 2.5.31 is used.  */
-int gram_get_lineno (void);
-FILE *gram_get_in (void);
-FILE *gram_get_out (void);
-int gram_get_leng (void);
-char *gram_get_text (void);
-void gram_set_lineno (int);
-void gram_set_in (FILE *);
-void gram_set_out (FILE *);
-int gram_get_debug (void);
-void gram_set_debug (int);
-int gram_lex_destroy (void);
-
-/* Location of scanner cursor.  */
-boundary scanner_cursor;
-
-static void adjust_location (location *, char const *, size_t);
-#define YY_USER_ACTION  adjust_location (loc, yytext, yyleng);
-
-static size_t no_cr_read (FILE *, char *, size_t);
-#define YY_INPUT(buf, result, size) ((result) = no_cr_read (yyin, buf, size))
-
-
-/* OBSTACK_FOR_STRING -- Used to store all the characters that we need to
-   keep (to construct ID, STRINGS etc.).  Use the following macros to
-   use it.
-
-   Use STRING_GROW to append what has just been matched, and
-   STRING_FINISH to end the string (it puts the ending 0).
-   STRING_FINISH also stores this string in LAST_STRING, which can be
-   used, and which is used by STRING_FREE to free the last string.  */
-
-static struct obstack obstack_for_string;
-
-/* A string representing the most recently saved token.  */
-char *last_string;
-
-/* The location of the most recently saved token, if it was a
-   BRACED_CODE token; otherwise, this has an unspecified value.  */
-location last_braced_code_loc;
-
-#define STRING_GROW   \
-  obstack_grow (&obstack_for_string, yytext, yyleng)
-
-#define STRING_FINISH					\
-  do {							\
-    obstack_1grow (&obstack_for_string, '\0');		\
-    last_string = obstack_finish (&obstack_for_string);	\
-  } while (0)
-
-#define STRING_FREE \
-  obstack_free (&obstack_for_string, last_string)
-
-void
-scanner_last_string_free (void)
-{
-  STRING_FREE;
-}
-
-/* Within well-formed rules, RULE_LENGTH is the number of values in
-   the current rule so far, which says where to find `$0' with respect
-   to the top of the stack.  It is not the same as the rule->length in
-   the case of mid rule actions.
-
-   Outside of well-formed rules, RULE_LENGTH has an undefined value.  */
-static int rule_length;
-
-static void rule_length_overflow (location) __attribute__ ((__noreturn__));
-
-/* Increment the rule length by one, checking for overflow.  */
-static inline void
-increment_rule_length (location loc)
-{
-  rule_length++;
-
-  /* Don't allow rule_length == INT_MAX, since that might cause
-     confusion with strtol if INT_MAX == LONG_MAX.  */
-  if (rule_length == INT_MAX)
-    rule_length_overflow (loc);
-}
-
-static void handle_dollar (int token_type, char *cp, location loc);
-static void handle_at (int token_type, char *cp, location loc);
-static void handle_syncline (char *, location);
-static unsigned long int scan_integer (char const *p, int base, location loc);
-static int convert_ucn_to_byte (char const *hex_text);
-static void unexpected_eof (boundary, char const *);
-static void unexpected_newline (boundary, char const *);
-
-%}
-%x SC_COMMENT SC_LINE_COMMENT SC_YACC_COMMENT
-%x SC_STRING SC_CHARACTER
-%x SC_AFTER_IDENTIFIER
-%x SC_ESCAPED_STRING SC_ESCAPED_CHARACTER
-%x SC_PRE_CODE SC_BRACED_CODE SC_PROLOGUE SC_EPILOGUE
-
-letter	  [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
-id	  {letter}({letter}|[0-9])*
-directive %{letter}({letter}|[0-9]|-)*
-int	  [0-9]+
-
-/* POSIX says that a tag must be both an id and a C union member, but
-   historically almost any character is allowed in a tag.  We disallow
-   NUL and newline, as this simplifies our implementation.  */
-tag	 [^\0\n>]+
-
-/* Zero or more instances of backslash-newline.  Following GCC, allow
-   white space between the backslash and the newline.  */
-splice	 (\\[ \f\t\v]*\n)*
-
-%%
-%{
-  /* Nesting level of the current code in braces.  */
-  int braces_level IF_LINT (= 0);
-
-  /* Parent context state, when applicable.  */
-  int context_state IF_LINT (= 0);
-
-  /* Token type to return, when applicable.  */
-  int token_type IF_LINT (= 0);
-
-  /* Location of most recent identifier, when applicable.  */
-  location id_loc IF_LINT (= empty_location);
-
-  /* Where containing code started, when applicable.  Its initial
-     value is relevant only when yylex is invoked in the SC_EPILOGUE
-     start condition.  */
-  boundary code_start = scanner_cursor;
-
-  /* Where containing comment or string or character literal started,
-     when applicable.  */
-  boundary token_start IF_LINT (= scanner_cursor);
-%}
-
-
-  /*-----------------------.
-  | Scanning white space.  |
-  `-----------------------*/
-
-<INITIAL,SC_AFTER_IDENTIFIER,SC_PRE_CODE>
-{
-  /* Comments and white space.  */
-  ","	       warn_at (*loc, _("stray `,' treated as white space"));
-  [ \f\n\t\v]  |
-  "//".*       ;
-  "/*" {
-    token_start = loc->start;
-    context_state = YY_START;
-    BEGIN SC_YACC_COMMENT;
-  }
-
-  /* #line directives are not documented, and may be withdrawn or
-     modified in future versions of Bison.  */
-  ^"#line "{int}" \"".*"\"\n" {
-    handle_syncline (yytext + sizeof "#line " - 1, *loc);
-  }
-}
-
-
-  /*----------------------------.
-  | Scanning Bison directives.  |
-  `----------------------------*/
-<INITIAL>
-{
-  "%binary"               return PERCENT_NONASSOC;
-  "%debug"                return PERCENT_DEBUG;
-  "%default"[-_]"prec"    return PERCENT_DEFAULT_PREC;
-  "%define"               return PERCENT_DEFINE;
-  "%defines"              return PERCENT_DEFINES;
-  "%destructor"		  token_type = PERCENT_DESTRUCTOR; BEGIN SC_PRE_CODE;
-  "%dprec"		  return PERCENT_DPREC;
-  "%error"[-_]"verbose"   return PERCENT_ERROR_VERBOSE;
-  "%expect"               return PERCENT_EXPECT;
-  "%expect"[-_]"rr"	  return PERCENT_EXPECT_RR;
-  "%file-prefix"          return PERCENT_FILE_PREFIX;
-  "%fixed"[-_]"output"[-_]"files"   return PERCENT_YACC;
-  "%initial-action"       token_type = PERCENT_INITIAL_ACTION; BEGIN SC_PRE_CODE;
-  "%glr-parser"           return PERCENT_GLR_PARSER;
-  "%left"                 return PERCENT_LEFT;
-  "%lex-param"		  token_type = PERCENT_LEX_PARAM; BEGIN SC_PRE_CODE;
-  "%locations"            return PERCENT_LOCATIONS;
-  "%merge"		  return PERCENT_MERGE;
-  "%name"[-_]"prefix"     return PERCENT_NAME_PREFIX;
-  "%no"[-_]"default"[-_]"prec"	return PERCENT_NO_DEFAULT_PREC;
-  "%no"[-_]"lines"        return PERCENT_NO_LINES;
-  "%nonassoc"             return PERCENT_NONASSOC;
-  "%nondeterministic-parser"   return PERCENT_NONDETERMINISTIC_PARSER;
-  "%nterm"                return PERCENT_NTERM;
-  "%output"               return PERCENT_OUTPUT;
-  "%parse-param"	  token_type = PERCENT_PARSE_PARAM; BEGIN SC_PRE_CODE;
-  "%prec"                 rule_length--; return PERCENT_PREC;
-  "%printer"              token_type = PERCENT_PRINTER; BEGIN SC_PRE_CODE;
-  "%pure"[-_]"parser"     return PERCENT_PURE_PARSER;
-  "%require"              return PERCENT_REQUIRE;
-  "%right"                return PERCENT_RIGHT;
-  "%skeleton"             return PERCENT_SKELETON;
-  "%start"                return PERCENT_START;
-  "%term"                 return PERCENT_TOKEN;
-  "%token"                return PERCENT_TOKEN;
-  "%token"[-_]"table"     return PERCENT_TOKEN_TABLE;
-  "%type"                 return PERCENT_TYPE;
-  "%union"		  token_type = PERCENT_UNION; BEGIN SC_PRE_CODE;
-  "%verbose"              return PERCENT_VERBOSE;
-  "%yacc"                 return PERCENT_YACC;
-
-  {directive} {
-    complain_at (*loc, _("invalid directive: %s"), quote (yytext));
-  }
-
-  "="                     return EQUAL;
-  "|"                     rule_length = 0; return PIPE;
-  ";"                     return SEMICOLON;
-
-  {id} {
-    val->symbol = symbol_get (yytext, *loc);
-    id_loc = *loc;
-    increment_rule_length (*loc);
-    BEGIN SC_AFTER_IDENTIFIER;
-  }
-
-  {int} {
-    val->integer = scan_integer (yytext, 10, *loc);
-    return INT;
-  }
-  0[xX][0-9abcdefABCDEF]+ {
-    val->integer = scan_integer (yytext, 16, *loc);
-    return INT;
-  }
-
-  /* Characters.  We don't check there is only one.  */
-  "'"	      STRING_GROW; token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER;
-
-  /* Strings. */
-  "\""	      token_start = loc->start; BEGIN SC_ESCAPED_STRING;
-
-  /* Prologue. */
-  "%{"        code_start = loc->start; BEGIN SC_PROLOGUE;
-
-  /* Code in between braces.  */
-  "{" {
-    if (current_rule && current_rule->action)
-      grammar_midrule_action ();
-    STRING_GROW;
-    token_type = BRACED_CODE;
-    braces_level = 0;
-    code_start = loc->start;
-    BEGIN SC_BRACED_CODE;
-  }
-
-  /* A type. */
-  "<"{tag}">" {
-    obstack_grow (&obstack_for_string, yytext + 1, yyleng - 2);
-    STRING_FINISH;
-    val->uniqstr = uniqstr_new (last_string);
-    STRING_FREE;
-    return TYPE;
-  }
-
-  "%%" {
-    static int percent_percent_count;
-    if (++percent_percent_count == 2)
-      BEGIN SC_EPILOGUE;
-    return PERCENT_PERCENT;
-  }
-
-  . {
-    complain_at (*loc, _("invalid character: %s"), quote (yytext));
-  }
-
-  <<EOF>> {
-    loc->start = loc->end = scanner_cursor;
-    yyterminate ();
-  }
-}
-
-
-  /*-----------------------------------------------------------------.
-  | Scanning after an identifier, checking whether a colon is next.  |
-  `-----------------------------------------------------------------*/
-
-<SC_AFTER_IDENTIFIER>
-{
-  ":" {
-    rule_length = 0;
-    *loc = id_loc;
-    BEGIN INITIAL;
-    return ID_COLON;
-  }
-  . {
-    scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0);
-    yyless (0);
-    *loc = id_loc;
-    BEGIN INITIAL;
-    return ID;
-  }
-  <<EOF>> {
-    *loc = id_loc;
-    BEGIN INITIAL;
-    return ID;
-  }
-}
-
-
-  /*---------------------------------------------------------------.
-  | Scanning a Yacc comment.  The initial `/ *' is already eaten.  |
-  `---------------------------------------------------------------*/
-
-<SC_YACC_COMMENT>
-{
-  "*/"     BEGIN context_state;
-  .|\n	   ;
-  <<EOF>>  unexpected_eof (token_start, "*/"); BEGIN context_state;
-}
-
-
-  /*------------------------------------------------------------.
-  | Scanning a C comment.  The initial `/ *' is already eaten.  |
-  `------------------------------------------------------------*/
-
-<SC_COMMENT>
-{
-  "*"{splice}"/"  STRING_GROW; BEGIN context_state;
-  <<EOF>>	  unexpected_eof (token_start, "*/"); BEGIN context_state;
-}
-
-
-  /*--------------------------------------------------------------.
-  | Scanning a line comment.  The initial `//' is already eaten.  |
-  `--------------------------------------------------------------*/
-
-<SC_LINE_COMMENT>
-{
-  "\n"		 STRING_GROW; BEGIN context_state;
-  {splice}	 STRING_GROW;
-  <<EOF>>	 BEGIN context_state;
-}
-
-
-  /*------------------------------------------------.
-  | Scanning a Bison string, including its escapes. |
-  | The initial quote is already eaten.             |
-  `------------------------------------------------*/
-
-<SC_ESCAPED_STRING>
-{
-  "\"" {
-    STRING_FINISH;
-    loc->start = token_start;
-    val->chars = last_string;
-    increment_rule_length (*loc);
-    BEGIN INITIAL;
-    return STRING;
-  }
-  \n		unexpected_newline (token_start, "\"");	BEGIN INITIAL;
-  <<EOF>>	unexpected_eof (token_start, "\"");	BEGIN INITIAL;
-}
-
-  /*----------------------------------------------------------.
-  | Scanning a Bison character literal, decoding its escapes. |
-  | The initial quote is already eaten.			      |
-  `----------------------------------------------------------*/
-
-<SC_ESCAPED_CHARACTER>
-{
-  "'" {
-    unsigned char last_string_1;
-    STRING_GROW;
-    STRING_FINISH;
-    loc->start = token_start;
-    val->symbol = symbol_get (quotearg_style (escape_quoting_style,
-					      last_string),
-			      *loc);
-    symbol_class_set (val->symbol, token_sym, *loc, false);
-    last_string_1 = last_string[1];
-    symbol_user_token_number_set (val->symbol, last_string_1, *loc);
-    STRING_FREE;
-    increment_rule_length (*loc);
-    BEGIN INITIAL;
-    return ID;
-  }
-  \n		unexpected_newline (token_start, "'");	BEGIN INITIAL;
-  <<EOF>>	unexpected_eof (token_start, "'");	BEGIN INITIAL;
-}
-
-<SC_ESCAPED_CHARACTER,SC_ESCAPED_STRING>
-{
-  \0	    complain_at (*loc, _("invalid null character"));
-}
-
-
-  /*----------------------------.
-  | Decode escaped characters.  |
-  `----------------------------*/
-
-<SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>
-{
-  \\[0-7]{1,3} {
-    unsigned long int c = strtoul (yytext + 1, NULL, 8);
-    if (UCHAR_MAX < c)
-      complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext));
-    else if (! c)
-      complain_at (*loc, _("invalid null character: %s"), quote (yytext));
-    else
-      obstack_1grow (&obstack_for_string, c);
-  }
-
-  \\x[0-9abcdefABCDEF]+ {
-    verify (UCHAR_MAX < ULONG_MAX);
-    unsigned long int c = strtoul (yytext + 2, NULL, 16);
-    if (UCHAR_MAX < c)
-      complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext));
-    else if (! c)
-      complain_at (*loc, _("invalid null character: %s"), quote (yytext));
-    else
-      obstack_1grow (&obstack_for_string, c);
-  }
-
-  \\a	obstack_1grow (&obstack_for_string, '\a');
-  \\b	obstack_1grow (&obstack_for_string, '\b');
-  \\f	obstack_1grow (&obstack_for_string, '\f');
-  \\n	obstack_1grow (&obstack_for_string, '\n');
-  \\r	obstack_1grow (&obstack_for_string, '\r');
-  \\t	obstack_1grow (&obstack_for_string, '\t');
-  \\v	obstack_1grow (&obstack_for_string, '\v');
-
-  /* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
-  \\("\""|"'"|"?"|"\\")  obstack_1grow (&obstack_for_string, yytext[1]);
-
-  \\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} {
-    int c = convert_ucn_to_byte (yytext);
-    if (c < 0)
-      complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext));
-    else if (! c)
-      complain_at (*loc, _("invalid null character: %s"), quote (yytext));
-    else
-      obstack_1grow (&obstack_for_string, c);
-  }
-  \\(.|\n)	{
-    complain_at (*loc, _("unrecognized escape sequence: %s"), quote (yytext));
-    STRING_GROW;
-  }
-}
-
-  /*--------------------------------------------.
-  | Scanning user-code characters and strings.  |
-  `--------------------------------------------*/
-
-<SC_CHARACTER,SC_STRING>
-{
-  {splice}|\\{splice}[^\n$@\[\]]	STRING_GROW;
-}
-
-<SC_CHARACTER>
-{
-  "'"		STRING_GROW; BEGIN context_state;
-  \n		unexpected_newline (token_start, "'"); BEGIN context_state;
-  <<EOF>>	unexpected_eof (token_start, "'"); BEGIN context_state;
-}
-
-<SC_STRING>
-{
-  "\""		STRING_GROW; BEGIN context_state;
-  \n		unexpected_newline (token_start, "\""); BEGIN context_state;
-  <<EOF>>	unexpected_eof (token_start, "\""); BEGIN context_state;
-}
-
-
-  /*---------------------------------------------------.
-  | Strings, comments etc. can be found in user code.  |
-  `---------------------------------------------------*/
-
-<SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE>
-{
-  "'" {
-    STRING_GROW;
-    context_state = YY_START;
-    token_start = loc->start;
-    BEGIN SC_CHARACTER;
-  }
-  "\"" {
-    STRING_GROW;
-    context_state = YY_START;
-    token_start = loc->start;
-    BEGIN SC_STRING;
-  }
-  "/"{splice}"*" {
-    STRING_GROW;
-    context_state = YY_START;
-    token_start = loc->start;
-    BEGIN SC_COMMENT;
-  }
-  "/"{splice}"/" {
-    STRING_GROW;
-    context_state = YY_START;
-    BEGIN SC_LINE_COMMENT;
-  }
-}
-
-
-  /*---------------------------------------------------------------.
-  | Scanning after %union etc., possibly followed by white space.  |
-  | For %union only, allow arbitrary C code to appear before the   |
-  | following brace, as an extension to POSIX.			   |
-  `---------------------------------------------------------------*/
-
-<SC_PRE_CODE>
-{
-  . {
-    bool valid = yytext[0] == '{' || token_type == PERCENT_UNION;
-    scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0);
-    yyless (0);
-
-    if (valid)
-      {
-	braces_level = -1;
-	code_start = loc->start;
-	BEGIN SC_BRACED_CODE;
-      }
-    else
-      {
-	complain_at (*loc, _("missing `{' in %s"),
-		     token_name (token_type));
-	obstack_sgrow (&obstack_for_string, "{}");
-	STRING_FINISH;
-	val->chars = last_string;
-	BEGIN INITIAL;
-	return token_type;
-      }
-  }
-
-  <<EOF>>  unexpected_eof (scanner_cursor, "{}"); BEGIN INITIAL;
-}
-
-
-  /*---------------------------------------------------------------.
-  | Scanning some code in braces (%union and actions). The initial |
-  | "{" is already eaten.                                          |
-  `---------------------------------------------------------------*/
-
-<SC_BRACED_CODE>
-{
-  "{"|"<"{splice}"%"  STRING_GROW; braces_level++;
-  "%"{splice}">"      STRING_GROW; braces_level--;
-  "}" {
-    bool outer_brace = --braces_level < 0;
-
-    /* As an undocumented Bison extension, append `;' before the last
-       brace in braced code, so that the user code can omit trailing
-       `;'.  But do not append `;' if emulating Yacc, since Yacc does
-       not append one.
-
-       FIXME: Bison should warn if a semicolon seems to be necessary
-       here, and should omit the semicolon if it seems unnecessary
-       (e.g., after ';', '{', or '}', each followed by comments or
-       white space).  Such a warning shouldn't depend on --yacc; it
-       should depend on a new --pedantic option, which would cause
-       Bison to warn if it detects an extension to POSIX.  --pedantic
-       should also diagnose other Bison extensions like %yacc.
-       Perhaps there should also be a GCC-style --pedantic-errors
-       option, so that such warnings are diagnosed as errors.  */
-    if (outer_brace && token_type == BRACED_CODE && ! yacc_flag)
-      obstack_1grow (&obstack_for_string, ';');
-
-    obstack_1grow (&obstack_for_string, '}');
-
-    if (outer_brace)
-      {
-	STRING_FINISH;
-	loc->start = code_start;
-	val->chars = last_string;
-	increment_rule_length (*loc);
-	last_braced_code_loc = *loc;
-	BEGIN INITIAL;
-	return token_type;
-      }
-  }
-
-  /* Tokenize `<<%' correctly (as `<<' `%') rather than incorrrectly
-     (as `<' `<%').  */
-  "<"{splice}"<"  STRING_GROW;
-
-  "$"("<"{tag}">")?(-?[0-9]+|"$")  handle_dollar (token_type, yytext, *loc);
-  "@"(-?[0-9]+|"$")		   handle_at (token_type, yytext, *loc);
-
-  "$"  {
-    warn_at (*loc, _("stray `$'"));
-    obstack_sgrow (&obstack_for_string, "$][");
-  }
-  "@"  {
-    warn_at (*loc, _("stray `@'"));
-    obstack_sgrow (&obstack_for_string, "@@");
-  }
-
-  <<EOF>>  unexpected_eof (code_start, "}"); BEGIN INITIAL;
-}
-
-
-  /*--------------------------------------------------------------.
-  | Scanning some prologue: from "%{" (already scanned) to "%}".  |
-  `--------------------------------------------------------------*/
-
-<SC_PROLOGUE>
-{
-  "%}" {
-    STRING_FINISH;
-    loc->start = code_start;
-    val->chars = last_string;
-    BEGIN INITIAL;
-    return PROLOGUE;
-  }
-
-  <<EOF>>  unexpected_eof (code_start, "%}"); BEGIN INITIAL;
-}
-
-
-  /*---------------------------------------------------------------.
-  | Scanning the epilogue (everything after the second "%%", which |
-  | has already been eaten).                                       |
-  `---------------------------------------------------------------*/
-
-<SC_EPILOGUE>
-{
-  <<EOF>> {
-    STRING_FINISH;
-    loc->start = code_start;
-    val->chars = last_string;
-    BEGIN INITIAL;
-    return EPILOGUE;
-  }
-}
-
-
-  /*-----------------------------------------.
-  | Escape M4 quoting characters in C code.  |
-  `-----------------------------------------*/
-
-<SC_COMMENT,SC_LINE_COMMENT,SC_STRING,SC_CHARACTER,SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE>
-{
-  \$	obstack_sgrow (&obstack_for_string, "$][");
-  \@	obstack_sgrow (&obstack_for_string, "@@");
-  \[	obstack_sgrow (&obstack_for_string, "@{");
-  \]	obstack_sgrow (&obstack_for_string, "@}");
-}
-
-
-  /*-----------------------------------------------------.
-  | By default, grow the string obstack with the input.  |
-  `-----------------------------------------------------*/
-
-<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE,SC_STRING,SC_CHARACTER,SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>.	|
-<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE>\n	STRING_GROW;
-
-%%
-
-/* Keeps track of the maximum number of semantic values to the left of
-   a handle (those referenced by $0, $-1, etc.) are required by the
-   semantic actions of this grammar. */
-int max_left_semantic_context = 0;
-
-/* If BUF is null, add BUFSIZE (which in this case must be less than
-   INT_MAX) to COLUMN; otherwise, add mbsnwidth (BUF, BUFSIZE, 0) to
-   COLUMN.  If an overflow occurs, or might occur but is undetectable,
-   return INT_MAX.  Assume COLUMN is nonnegative.  */
-
-static inline int
-add_column_width (int column, char const *buf, size_t bufsize)
-{
-  size_t width;
-  unsigned int remaining_columns = INT_MAX - column;
-
-  if (buf)
-    {
-      if (INT_MAX / 2 <= bufsize)
-	return INT_MAX;
-      width = mbsnwidth (buf, bufsize, 0);
-    }
-  else
-    width = bufsize;
-
-  return width <= remaining_columns ? column + width : INT_MAX;
-}
-
-/* Set *LOC and adjust scanner cursor to account for token TOKEN of
-   size SIZE.  */
-
-static void
-adjust_location (location *loc, char const *token, size_t size)
-{
-  int line = scanner_cursor.line;
-  int column = scanner_cursor.column;
-  char const *p0 = token;
-  char const *p = token;
-  char const *lim = token + size;
-
-  loc->start = scanner_cursor;
-
-  for (p = token; p < lim; p++)
-    switch (*p)
-      {
-      case '\n':
-	line += line < INT_MAX;
-	column = 1;
-	p0 = p + 1;
-	break;
-
-      case '\t':
-	column = add_column_width (column, p0, p - p0);
-	column = add_column_width (column, NULL, 8 - ((column - 1) & 7));
-	p0 = p + 1;
-	break;
-
-      default:
-	break;
-      }
-
-  scanner_cursor.line = line;
-  scanner_cursor.column = column = add_column_width (column, p0, p - p0);
-
-  loc->end = scanner_cursor;
-
-  if (line == INT_MAX && loc->start.line != INT_MAX)
-    warn_at (*loc, _("line number overflow"));
-  if (column == INT_MAX && loc->start.column != INT_MAX)
-    warn_at (*loc, _("column number overflow"));
-}
-
-
-/* Read bytes from FP into buffer BUF of size SIZE.  Return the
-   number of bytes read.  Remove '\r' from input, treating \r\n
-   and isolated \r as \n.  */
-
-static size_t
-no_cr_read (FILE *fp, char *buf, size_t size)
-{
-  size_t bytes_read = fread (buf, 1, size, fp);
-  if (bytes_read)
-    {
-      char *w = memchr (buf, '\r', bytes_read);
-      if (w)
-	{
-	  char const *r = ++w;
-	  char const *lim = buf + bytes_read;
-
-	  for (;;)
-	    {
-	      /* Found an '\r'.  Treat it like '\n', but ignore any
-		 '\n' that immediately follows.  */
-	      w[-1] = '\n';
-	      if (r == lim)
-		{
-		  int ch = getc (fp);
-		  if (ch != '\n' && ungetc (ch, fp) != ch)
-		    break;
-		}
-	      else if (*r == '\n')
-		r++;
-
-	      /* Copy until the next '\r'.  */
-	      do
-		{
-		  if (r == lim)
-		    return w - buf;
-		}
-	      while ((*w++ = *r++) != '\r');
-	    }
-
-	  return w - buf;
-	}
-    }
-
-  return bytes_read;
-}
-
-
-/*------------------------------------------------------------------.
-| TEXT is pointing to a wannabee semantic value (i.e., a `$').      |
-|                                                                   |
-| Possible inputs: $[<TYPENAME>]($|integer)                         |
-|                                                                   |
-| Output to OBSTACK_FOR_STRING a reference to this semantic value.  |
-`------------------------------------------------------------------*/
-
-static inline bool
-handle_action_dollar (char *text, location loc)
-{
-  const char *type_name = NULL;
-  char *cp = text + 1;
-
-  if (! current_rule)
-    return false;
-
-  /* Get the type name if explicit. */
-  if (*cp == '<')
-    {
-      type_name = ++cp;
-      while (*cp != '>')
-	++cp;
-      *cp = '\0';
-      ++cp;
-    }
-
-  if (*cp == '$')
-    {
-      if (!type_name)
-	type_name = symbol_list_n_type_name_get (current_rule, loc, 0);
-      if (!type_name && typed)
-	complain_at (loc, _("$$ of `%s' has no declared type"),
-		     current_rule->sym->tag);
-      if (!type_name)
-	type_name = "";
-      obstack_fgrow1 (&obstack_for_string,
-		      "]b4_lhs_value([%s])[", type_name);
-      current_rule->used = true;
-    }
-  else
-    {
-      long int num = strtol (cp, NULL, 10);
-
-      if (1 - INT_MAX + rule_length <= num && num <= rule_length)
-	{
-	  int n = num;
-	  if (max_left_semantic_context < 1 - n)
-	    max_left_semantic_context = 1 - n;
-	  if (!type_name && 0 < n)
-	    type_name = symbol_list_n_type_name_get (current_rule, loc, n);
-	  if (!type_name && typed)
-	    complain_at (loc, _("$%d of `%s' has no declared type"),
-			 n, current_rule->sym->tag);
-	  if (!type_name)
-	    type_name = "";
-	  obstack_fgrow3 (&obstack_for_string,
-			  "]b4_rhs_value(%d, %d, [%s])[",
-			  rule_length, n, type_name);
-	  symbol_list_n_used_set (current_rule, n, true);
-	}
-      else
-	complain_at (loc, _("integer out of range: %s"), quote (text));
-    }
-
-  return true;
-}
-
-
-/*----------------------------------------------------------------.
-| Map `$?' onto the proper M4 symbol, depending on its TOKEN_TYPE |
-| (are we in an action?).                                         |
-`----------------------------------------------------------------*/
-
-static void
-handle_dollar (int token_type, char *text, location loc)
-{
-  switch (token_type)
-    {
-    case BRACED_CODE:
-      if (handle_action_dollar (text, loc))
-	return;
-      break;
-
-    case PERCENT_DESTRUCTOR:
-    case PERCENT_INITIAL_ACTION:
-    case PERCENT_PRINTER:
-      if (text[1] == '$')
-	{
-	  obstack_sgrow (&obstack_for_string, "]b4_dollar_dollar[");
-	  return;
-	}
-      break;
-
-    default:
-      break;
-    }
-
-  complain_at (loc, _("invalid value: %s"), quote (text));
-}
-
-
-/*------------------------------------------------------.
-| TEXT is a location token (i.e., a `@...').  Output to |
-| OBSTACK_FOR_STRING a reference to this location.      |
-`------------------------------------------------------*/
-
-static inline bool
-handle_action_at (char *text, location loc)
-{
-  char *cp = text + 1;
-  locations_flag = true;
-
-  if (! current_rule)
-    return false;
-
-  if (*cp == '$')
-    obstack_sgrow (&obstack_for_string, "]b4_lhs_location[");
-  else
-    {
-      long int num = strtol (cp, NULL, 10);
-
-      if (1 - INT_MAX + rule_length <= num && num <= rule_length)
-	{
-	  int n = num;
-	  obstack_fgrow2 (&obstack_for_string, "]b4_rhs_location(%d, %d)[",
-			  rule_length, n);
-	}
-      else
-	complain_at (loc, _("integer out of range: %s"), quote (text));
-    }
-
-  return true;
-}
-
-
-/*----------------------------------------------------------------.
-| Map `@?' onto the proper M4 symbol, depending on its TOKEN_TYPE |
-| (are we in an action?).                                         |
-`----------------------------------------------------------------*/
-
-static void
-handle_at (int token_type, char *text, location loc)
-{
-  switch (token_type)
-    {
-    case BRACED_CODE:
-      handle_action_at (text, loc);
-      return;
-
-    case PERCENT_INITIAL_ACTION:
-    case PERCENT_DESTRUCTOR:
-    case PERCENT_PRINTER:
-      if (text[1] == '$')
-	{
-	  obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
-	  return;
-	}
-      break;
-
-    default:
-      break;
-    }
-
-  complain_at (loc, _("invalid value: %s"), quote (text));
-}
-
-
-/*------------------------------------------------------.
-| Scan NUMBER for a base-BASE integer at location LOC.  |
-`------------------------------------------------------*/
-
-static unsigned long int
-scan_integer (char const *number, int base, location loc)
-{
-  verify (INT_MAX < ULONG_MAX);
-  unsigned long int num = strtoul (number, NULL, base);
-
-  if (INT_MAX < num)
-    {
-      complain_at (loc, _("integer out of range: %s"), quote (number));
-      num = INT_MAX;
-    }
-
-  return num;
-}
-
-
-/*------------------------------------------------------------------.
-| Convert universal character name UCN to a single-byte character,  |
-| and return that character.  Return -1 if UCN does not correspond  |
-| to a single-byte character.					    |
-`------------------------------------------------------------------*/
-
-static int
-convert_ucn_to_byte (char const *ucn)
-{
-  verify (UCHAR_MAX <= INT_MAX);
-  unsigned long int code = strtoul (ucn + 2, NULL, 16);
-
-  /* FIXME: Currently we assume Unicode-compatible unibyte characters
-     on ASCII hosts (i.e., Latin-1 on hosts with 8-bit bytes).  On
-     non-ASCII hosts we support only the portable C character set.
-     These limitations should be removed once we add support for
-     multibyte characters.  */
-
-  if (UCHAR_MAX < code)
-    return -1;
-
-#if ! ('$' == 0x24 && '@' == 0x40 && '`' == 0x60 && '~' == 0x7e)
-  {
-    /* A non-ASCII host.  Use CODE to index into a table of the C
-       basic execution character set, which is guaranteed to exist on
-       all Standard C platforms.  This table also includes '$', '@',
-       and '`', which are not in the basic execution character set but
-       which are unibyte characters on all the platforms that we know
-       about.  */
-    static signed char const table[] =
-      {
-	'\0',   -1,   -1,   -1,   -1,   -1,   -1, '\a',
-	'\b', '\t', '\n', '\v', '\f', '\r',   -1,   -1,
-	  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-	  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-	 ' ',  '!',  '"',  '#',  '$',  '%',  '&', '\'',
-	 '(',  ')',  '*',  '+',  ',',  '-',  '.',  '/',
-	 '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',
-	 '8',  '9',  ':',  ';',  '<',  '=',  '>',  '?',
-	 '@',  'A',  'B',  'C',  'D',  'E',  'F',  'G',
-	 'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',
-	 'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',
-	 'X',  'Y',  'Z',  '[', '\\',  ']',  '^',  '_',
-	 '`',  'a',  'b',  'c',  'd',  'e',  'f',  'g',
-	 'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',
-	 'p',  'q',  'r',  's',  't',  'u',  'v',  'w',
-	 'x',  'y',  'z',  '{',  '|',  '}',  '~'
-      };
-
-    code = code < sizeof table ? table[code] : -1;
-  }
-#endif
-
-  return code;
-}
-
-
-/*----------------------------------------------------------------.
-| Handle `#line INT "FILE"'.  ARGS has already skipped `#line '.  |
-`----------------------------------------------------------------*/
-
-static void
-handle_syncline (char *args, location loc)
-{
-  char *after_num;
-  unsigned long int lineno = strtoul (args, &after_num, 10);
-  char *file = strchr (after_num, '"') + 1;
-  *strchr (file, '"') = '\0';
-  if (INT_MAX <= lineno)
-    {
-      warn_at (loc, _("line number overflow"));
-      lineno = INT_MAX;
-    }
-  scanner_cursor.file = current_file = uniqstr_new (file);
-  scanner_cursor.line = lineno;
-  scanner_cursor.column = 1;
-}
-
-
-/*---------------------------------.
-| Report a rule that is too long.  |
-`---------------------------------*/
-
-static void
-rule_length_overflow (location loc)
-{
-  fatal_at (loc, _("rule is too long"));
-}
-
-
-/*----------------------------------------------------------------.
-| For a token or comment starting at START, report message MSGID, |
-| which should say that an end marker was found before		  |
-| the expected TOKEN_END.					  |
-`----------------------------------------------------------------*/
-
-static void
-unexpected_end (boundary start, char const *msgid, char const *token_end)
-{
-  location loc;
-  loc.start = start;
-  loc.end = scanner_cursor;
-  complain_at (loc, _(msgid), token_end);
-}
-
-
-/*------------------------------------------------------------------------.
-| Report an unexpected EOF in a token or comment starting at START.       |
-| An end of file was encountered and the expected TOKEN_END was missing.  |
-`------------------------------------------------------------------------*/
-
-static void
-unexpected_eof (boundary start, char const *token_end)
-{
-  unexpected_end (start, N_("missing `%s' at end of file"), token_end);
-}
-
-
-/*----------------------------------------.
-| Likewise, but for unexpected newlines.  |
-`----------------------------------------*/
-
-static void
-unexpected_newline (boundary start, char const *token_end)
-{
-  unexpected_end (start, N_("missing `%s' at end of line"), token_end);
-}
-
-
-/*-------------------------.
-| Initialize the scanner.  |
-`-------------------------*/
-
-void
-scanner_initialize (void)
-{
-  obstack_init (&obstack_for_string);
-}
-
-
-/*-----------------------------------------------.
-| Free all the memory allocated to the scanner.  |
-`-----------------------------------------------*/
-
-void
-scanner_free (void)
-{
-  obstack_free (&obstack_for_string, 0);
-  /* Reclaim Flex's buffers.  */
-  yy_delete_buffer (YY_CURRENT_BUFFER);
-}
diff --git a/src/scan-skel-c.c b/src/scan-skel-c.c
deleted file mode 100644
index 1a047cf..0000000
--- a/src/scan-skel-c.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#include <config.h>
-#include "scan-skel.c"
diff --git a/src/scan-skel.c b/src/scan-skel.c
deleted file mode 100644
index f2dd18c..0000000
--- a/src/scan-skel.c
+++ /dev/null
@@ -1,2134 +0,0 @@
-#line 2 "scan-skel.c"
-
-#line 4 "scan-skel.c"
-
-#define  YY_INT_ALIGNED short int
-
-/* A lexical scanner generated by flex */
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 31
-#if YY_FLEX_SUBMINOR_VERSION > 0
-#define FLEX_BETA
-#endif
-
-/* %if-c++-only */
-/* %endif */
-
-/* %if-c-only */
-    
-/* %endif */
-
-/* %if-c-only */
-
-/* %endif */
-
-/* First, we deal with  platform-specific or compiler-specific issues. */
-
-/* begin standard C headers. */
-/* %if-c-only */
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-/* %endif */
-
-/* %if-tables-serialization */
-/* %endif */
-/* end standard C headers. */
-
-/* %if-c-or-c++ */
-/* flex integer type definitions */
-
-#ifndef FLEXINT_H
-#define FLEXINT_H
-
-/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
-
-#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
-#include <inttypes.h>
-typedef int8_t flex_int8_t;
-typedef uint8_t flex_uint8_t;
-typedef int16_t flex_int16_t;
-typedef uint16_t flex_uint16_t;
-typedef int32_t flex_int32_t;
-typedef uint32_t flex_uint32_t;
-#else
-typedef signed char flex_int8_t;
-typedef short int flex_int16_t;
-typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t; 
-typedef unsigned short int flex_uint16_t;
-typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
-
-/* Limits of integral types. */
-#ifndef INT8_MIN
-#define INT8_MIN               (-128)
-#endif
-#ifndef INT16_MIN
-#define INT16_MIN              (-32767-1)
-#endif
-#ifndef INT32_MIN
-#define INT32_MIN              (-2147483647-1)
-#endif
-#ifndef INT8_MAX
-#define INT8_MAX               (127)
-#endif
-#ifndef INT16_MAX
-#define INT16_MAX              (32767)
-#endif
-#ifndef INT32_MAX
-#define INT32_MAX              (2147483647)
-#endif
-#ifndef UINT8_MAX
-#define UINT8_MAX              (255U)
-#endif
-#ifndef UINT16_MAX
-#define UINT16_MAX             (65535U)
-#endif
-#ifndef UINT32_MAX
-#define UINT32_MAX             (4294967295U)
-#endif
-
-#endif /* ! FLEXINT_H */
-
-/* %endif */
-
-/* %if-c++-only */
-/* %endif */
-
-#ifdef __cplusplus
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else	/* ! __cplusplus */
-
-#if __STDC__
-
-#define YY_USE_CONST
-
-#endif	/* __STDC__ */
-#endif	/* ! __cplusplus */
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-/* %not-for-header */
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-/* %ok-for-header */
-
-/* %not-for-header */
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index.  If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-/* %ok-for-header */
-
-/* %if-reentrant */
-/* %endif */
-
-/* %if-not-reentrant */
-
-/* %endif */
-
-/* Enter a start condition.  This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN (yy_start) = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state.  The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START (((yy_start) - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE skel_restart(skel_in  )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#ifndef YY_BUF_SIZE
-#define YY_BUF_SIZE 16384
-#endif
-
-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
-#define YY_TYPEDEF_YY_BUFFER_STATE
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-#endif
-
-/* %if-not-reentrant */
-extern int skel_leng;
-/* %endif */
-
-/* %if-c-only */
-/* %if-not-reentrant */
-extern FILE *skel_in, *skel_out;
-/* %endif */
-/* %endif */
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
-    #define YY_LESS_LINENO(n)
-    
-/* Return all but the first "n" matched characters back to the input stream. */
-#define yyless(n) \
-	do \
-		{ \
-		/* Undo effects of setting up skel_text. */ \
-        int yyless_macro_arg = (n); \
-        YY_LESS_LINENO(yyless_macro_arg);\
-		*yy_cp = (yy_hold_char); \
-		YY_RESTORE_YY_MORE_OFFSET \
-		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
-		YY_DO_BEFORE_ACTION; /* set up skel_text again */ \
-		} \
-	while ( 0 )
-
-#define unput(c) yyunput( c, (yytext_ptr)  )
-
-/* The following is because we cannot portably get our hands on size_t
- * (without autoconf's help, which isn't available because we want
- * flex-generated scanners to compile on their own).
- */
-
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef unsigned int yy_size_t;
-#endif
-
-#ifndef YY_STRUCT_YY_BUFFER_STATE
-#define YY_STRUCT_YY_BUFFER_STATE
-struct yy_buffer_state
-	{
-/* %if-c-only */
-	FILE *yy_input_file;
-/* %endif */
-
-/* %if-c++-only */
-/* %endif */
-
-	char *yy_ch_buf;		/* input buffer */
-	char *yy_buf_pos;		/* current position in input buffer */
-
-	/* Size of input buffer in bytes, not including room for EOB
-	 * characters.
-	 */
-	yy_size_t yy_buf_size;
-
-	/* Number of characters read into yy_ch_buf, not including EOB
-	 * characters.
-	 */
-	int yy_n_chars;
-
-	/* Whether we "own" the buffer - i.e., we know we created it,
-	 * and can realloc() it to grow it, and should free() it to
-	 * delete it.
-	 */
-	int yy_is_our_buffer;
-
-	/* Whether this is an "interactive" input source; if so, and
-	 * if we're using stdio for input, then we want to use getc()
-	 * instead of fread(), to make sure we stop fetching input after
-	 * each newline.
-	 */
-	int yy_is_interactive;
-
-	/* Whether we're considered to be at the beginning of a line.
-	 * If so, '^' rules will be active on the next match, otherwise
-	 * not.
-	 */
-	int yy_at_bol;
-
-    int yy_bs_lineno; /**< The line count. */
-    int yy_bs_column; /**< The column count. */
-    
-	/* Whether to try to fill the input buffer when we reach the
-	 * end of it.
-	 */
-	int yy_fill_buffer;
-
-	int yy_buffer_status;
-
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
-	/* When an EOF's been seen but there's still some text to process
-	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
-	 * shouldn't try reading from the input source any more.  We might
-	 * still have a bunch of tokens to match, though, because of
-	 * possible backing-up.
-	 *
-	 * When we actually see the EOF, we change the status to "new"
-	 * (via skel_restart()), so that the user can continue scanning by
-	 * just pointing skel_in at a new input file.
-	 */
-#define YY_BUFFER_EOF_PENDING 2
-
-	};
-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-
-/* %if-c-only Standard (non-C++) definition */
-/* %not-for-header */
-
-/* %if-not-reentrant */
-
-/* Stack of input buffers. */
-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
-/* %endif */
-/* %ok-for-header */
-
-/* %endif */
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- *
- * Returns the top of the stack, or NULL.
- */
-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
-                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
-                          : NULL)
-
-/* Same as previous macro, but useful when we know that the buffer stack is not
- * NULL or when we need an lvalue. For internal use only.
- */
-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
-
-/* %if-c-only Standard (non-C++) definition */
-
-/* %if-not-reentrant */
-/* %not-for-header */
-
-/* yy_hold_char holds the character lost when skel_text is formed. */
-static char yy_hold_char;
-static int yy_n_chars;		/* number of characters read into yy_ch_buf */
-int skel_leng;
-
-/* Points to current character in buffer. */
-static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 1;		/* whether we need to initialize */
-static int yy_start = 0;	/* start state number */
-
-/* Flag which is used to allow skel_wrap()'s to do buffer switches
- * instead of setting up a fresh skel_in.  A bit of a hack ...
- */
-static int yy_did_buffer_switch_on_eof;
-/* %ok-for-header */
-
-/* %endif */
-
-void skel_restart (FILE *input_file  );
-void skel__switch_to_buffer (YY_BUFFER_STATE new_buffer  );
-YY_BUFFER_STATE skel__create_buffer (FILE *file,int size  );
-void skel__delete_buffer (YY_BUFFER_STATE b  );
-void skel__flush_buffer (YY_BUFFER_STATE b  );
-void skel_push_buffer_state (YY_BUFFER_STATE new_buffer  );
-void skel_pop_buffer_state (void );
-
-static void skel_ensure_buffer_stack (void );
-static void skel__load_buffer_state (void );
-static void skel__init_buffer (YY_BUFFER_STATE b,FILE *file  );
-
-#define YY_FLUSH_BUFFER skel__flush_buffer(YY_CURRENT_BUFFER )
-
-YY_BUFFER_STATE skel__scan_buffer (char *base,yy_size_t size  );
-YY_BUFFER_STATE skel__scan_string (yyconst char *yy_str  );
-YY_BUFFER_STATE skel__scan_bytes (yyconst char *bytes,int len  );
-
-/* %endif */
-
-void *skel_alloc (yy_size_t  );
-void *skel_realloc (void *,yy_size_t  );
-void skel_free (void *  );
-
-#define yy_new_buffer skel__create_buffer
-
-#define yy_set_interactive(is_interactive) \
-	{ \
-	if ( ! YY_CURRENT_BUFFER ){ \
-        skel_ensure_buffer_stack (); \
-		YY_CURRENT_BUFFER_LVALUE =    \
-            skel__create_buffer(skel_in,YY_BUF_SIZE ); \
-	} \
-	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
-	}
-
-#define yy_set_bol(at_bol) \
-	{ \
-	if ( ! YY_CURRENT_BUFFER ){\
-        skel_ensure_buffer_stack (); \
-		YY_CURRENT_BUFFER_LVALUE =    \
-            skel__create_buffer(skel_in,YY_BUF_SIZE ); \
-	} \
-	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
-	}
-
-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
-
-/* %% [1.0] skel_text/skel_in/skel_out/yy_state_type/skel_lineno etc. def's & init go here */
-/* Begin user sect3 */
-
-#define skel_wrap(n) 1
-#define YY_SKIP_YYWRAP
-
-#define FLEX_DEBUG
-
-typedef unsigned char YY_CHAR;
-
-FILE *skel_in = (FILE *) 0, *skel_out = (FILE *) 0;
-
-typedef int yy_state_type;
-
-extern int skel_lineno;
-
-int skel_lineno = 1;
-
-extern char *skel_text;
-#define yytext_ptr skel_text
-
-/* %if-c-only Standard (non-C++) definition */
-
-static yy_state_type yy_get_previous_state (void );
-static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
-static int yy_get_next_buffer (void );
-static void yy_fatal_error (yyconst char msg[]  );
-
-/* %endif */
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up skel_text.
- */
-#define YY_DO_BEFORE_ACTION \
-	(yytext_ptr) = yy_bp; \
-/* %% [2.0] code to fiddle skel_text and skel_leng for yymore() goes here \ */\
-	skel_leng = (size_t) (yy_cp - yy_bp); \
-	(yy_hold_char) = *yy_cp; \
-	*yy_cp = '\0'; \
-/* %% [3.0] code to copy yytext_ptr to skel_text[] goes here, if %array \ */\
-	(yy_c_buf_p) = yy_cp;
-
-/* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */
-#define YY_NUM_RULES 13
-#define YY_END_OF_BUFFER 14
-/* This struct is not used in this scanner,
-   but its presence is necessary. */
-struct yy_trans_info
-	{
-	flex_int32_t yy_verify;
-	flex_int32_t yy_nxt;
-	};
-static yyconst flex_int16_t yy_accept[69] =
-    {   0,
-        0,    0,   14,   12,   11,   10,   12,   10,    2,   10,
-       10,    3,    4,   10,   10,   10,   10,   10,   10,   10,
-       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,
-        6,    5,   10,   10,   10,   10,   10,   10,    1,    0,
-       10,   10,   10,   10,   10,   10,   10,   10,    7,   10,
-       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,
-       10,   10,   10,   10,   10,    9,    8,    0
-    } ;
-
-static yyconst flex_int32_t yy_ec[256] =
-    {   0,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    2,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    3,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    4,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    5,    1,    6,    1,    1,    7,
-
-        8,    9,    1,   10,   11,    1,    1,   12,   13,   14,
-       15,   16,    1,   17,   18,   19,   20,    1,    1,   21,
-        1,    1,   22,    1,   23,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1
-    } ;
-
-static yyconst flex_int32_t yy_meta[24] =
-    {   0,
-        1,    2,    1,    3,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1
-    } ;
-
-static yyconst flex_int16_t yy_base[74] =
-    {   0,
-        0,    1,  107,    0,  138,    2,    0,    4,  138,   24,
-       39,  138,  138,    1,   63,   45,    0,    2,    3,    9,
-        5,   18,   22,   28,   11,   21,   33,   38,   34,   32,
-      138,  138,   49,   46,   59,   54,   30,   81,  138,    8,
-       58,   56,   47,   65,   61,   69,   68,   66,  138,   78,
-       79,   77,   80,   87,   88,   91,   95,   89,   90,   97,
-      100,  104,  106,  112,  114,  138,  138,  138,  125,    0,
-      128,  131,  134
-    } ;
-
-static yyconst flex_int16_t yy_def[74] =
-    {   0,
-       69,   69,   68,   70,   68,   71,   70,   71,   68,   71,
-       10,   68,   68,   10,   10,   10,   10,   10,   10,   10,
-       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,
-       68,   68,   10,   10,   72,   10,   10,   72,   68,   73,
-       10,   10,   10,   10,   10,   10,   10,   10,   68,   10,
-       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,
-       10,   10,   10,   10,   10,   68,   68,    0,   68,   68,
-       68,   68,   68
-    } ;
-
-static yyconst flex_int16_t yy_nxt[162] =
-    {   0,
-        7,    5,    5,    6,    6,    9,   22,   68,   10,   39,
-        8,    8,    8,    8,   23,    8,   11,   18,   21,    8,
-       25,    8,   24,   12,   13,   68,   68,   68,    8,   27,
-       29,    8,    8,   26,   14,   28,   31,   30,    8,   34,
-       43,   32,    8,    8,    8,   68,   68,   15,    8,    8,
-       16,   35,   33,   36,   37,   20,    8,    8,   17,    8,
-       39,   45,   40,   41,    8,   44,    8,   46,    8,   42,
-       47,    8,   49,   19,   50,    8,    8,   48,    8,    8,
-       40,   40,   39,   51,   40,   52,   53,    8,    8,    8,
-        8,   56,   57,   54,   60,   61,   55,    8,    8,    8,
-
-        8,    8,   40,   40,   58,    8,   68,    8,   59,   62,
-        8,   64,   63,   65,    8,   66,    8,   67,   68,   68,
-       68,   68,    8,   68,    8,    4,    4,    4,    8,   68,
-        8,   38,   38,   38,   40,   40,   40,    3,   68,   68,
-       68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
-       68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
-       68
-    } ;
-
-static yyconst flex_int16_t yy_chk[162] =
-    {   0,
-       70,    1,    2,    1,    2,    6,   18,    8,    6,   40,
-       17,   14,   18,   19,   19,   21,    6,   14,   17,   20,
-       21,   25,   20,    6,    6,    8,    8,   10,   22,   23,
-       25,   26,   23,   22,   10,   24,   27,   26,   24,   30,
-       37,   28,   30,   27,   29,   10,   10,   11,   28,   11,
-       11,   33,   29,   33,   34,   16,   34,   43,   11,   33,
-       35,   42,   35,   36,   36,   41,   42,   43,   41,   36,
-       44,   45,   46,   15,   47,   44,   48,   45,   47,   46,
-       35,   35,   38,   48,   38,   50,   51,   52,   50,   51,
-       53,   54,   55,   52,   58,   59,   53,   54,   55,   58,
-
-       59,   56,   38,   38,   56,   57,    3,   60,   57,   60,
-       61,   62,   61,   63,   62,   64,   63,   65,    0,    0,
-        0,    0,   64,    0,   65,   69,   69,   69,   71,    0,
-       71,   72,   72,   72,   73,   73,   73,   68,   68,   68,
-       68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
-       68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
-       68
-    } ;
-
-static yy_state_type yy_last_accepting_state;
-static char *yy_last_accepting_cpos;
-
-extern int skel__flex_debug;
-int skel__flex_debug = 1;
-
-static yyconst flex_int16_t yy_rule_linenum[13] =
-    {   0,
-       70,   97,   98,   99,  101,  102,  103,  104,  105,  108,
-      109,  110
-    } ;
-
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-#define yymore() yymore_used_but_not_detected
-#define YY_MORE_ADJ 0
-#define YY_RESTORE_YY_MORE_OFFSET
-char *skel_text;
-#line 1 "scan-skel.l"
-/* Scan Bison Skeletons.                                       -*- C -*-
-
-   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software
-   Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
-#line 27 "scan-skel.l"
-/* Work around a bug in flex 2.5.31.  See Debian bug 333231
-   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
-#undef skel_wrap
-#define skel_wrap() 1
-
-#include "system.h"
-
-#include <error.h>
-#include <quotearg.h>
-
-#include "complain.h"
-#include "getargs.h"
-#include "files.h"
-#include "scan-skel.h"
-
-/* Pacify "gcc -Wmissing-prototypes" when flex 2.5.31 is used.  */
-int skel_lex (void);
-int skel_get_lineno (void);
-FILE *skel_get_in (void);
-FILE *skel_get_out (void);
-int skel_get_leng (void);
-char *skel_get_text (void);
-void skel_set_lineno (int);
-void skel_set_in (FILE *);
-void skel_set_out (FILE *);
-int skel_get_debug (void);
-void skel_set_debug (int);
-int skel_lex_destroy (void);
-
-#define QPUTS(String) \
-   fputs (quotearg_style (c_quoting_style, String), skel_out)
-
-#define BASE_QPUTS(File) \
-   QPUTS (base_name (File))
-
-#line 638 "scan-skel.c"
-
-#define INITIAL 0
-
-#ifndef YY_NO_UNISTD_H
-/* Special case for "unistd.h", since it is non-ANSI. We include it way
- * down here because we want the user's section 1 to have been scanned first.
- * The user has a chance to override it with an option.
- */
-/* %if-c-only */
-#include <unistd.h>
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-#endif
-
-#ifndef YY_EXTRA_TYPE
-#define YY_EXTRA_TYPE void *
-#endif
-
-/* %if-c-only Reentrant structure and macros (non-C++). */
-/* %if-reentrant */
-/* %if-reentrant */
-/* %endif */
-/* %if-bison-bridge */
-/* %endif */
-/* %endif End reentrant structures and macros. */
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int skel_wrap (void );
-#else
-extern int skel_wrap (void );
-#endif
-#endif
-
-/* %not-for-header */
-
-/* %ok-for-header */
-
-/* %endif */
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char *,yyconst char *,int );
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * );
-#endif
-
-#ifndef YY_NO_INPUT
-/* %if-c-only Standard (non-C++) definition */
-/* %not-for-header */
-
-#ifdef __cplusplus
-static int yyinput (void );
-#else
-static int input (void );
-#endif
-/* %ok-for-header */
-
-/* %endif */
-#endif
-
-/* %if-c-only */
-
-/* %endif */
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#define YY_READ_BUF_SIZE 8192
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-#ifndef ECHO
-/* %if-c-only Standard (non-C++) definition */
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO (void) fwrite( skel_text, skel_leng, 1, skel_out )
-/* %endif */
-/* %if-c++-only C++ definition */
-/* %endif */
-#endif
-
-/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
-/* %% [5.0] fread()/read() definition of YY_INPUT goes here unless we're doing C++ \ */\
-	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
-		{ \
-		int c = '*'; \
-		size_t n; \
-		for ( n = 0; n < max_size && \
-			     (c = getc( skel_in )) != EOF && c != '\n'; ++n ) \
-			buf[n] = (char) c; \
-		if ( c == '\n' ) \
-			buf[n++] = (char) c; \
-		if ( c == EOF && ferror( skel_in ) ) \
-			YY_FATAL_ERROR( "input in flex scanner failed" ); \
-		result = n; \
-		} \
-	else \
-		{ \
-		errno=0; \
-		while ( (result = fread(buf, 1, max_size, skel_in))==0 && ferror(skel_in)) \
-			{ \
-			if( errno != EINTR) \
-				{ \
-				YY_FATAL_ERROR( "input in flex scanner failed" ); \
-				break; \
-				} \
-			errno=0; \
-			clearerr(skel_in); \
-			} \
-		}\
-\
-/* %if-c++-only C++ definition \ */\
-/* %endif */
-
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-/* %if-c-only */
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-#endif
-
-/* %if-tables-serialization structures and prototypes */
-/* %not-for-header */
-
-/* %ok-for-header */
-
-/* %not-for-header */
-
-/* %tables-yydmap generated elements */
-/* %endif */
-/* end tables serialization structures and prototypes */
-
-/* %ok-for-header */
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL_IS_OURS 1
-/* %if-c-only Standard (non-C++) definition */
-
-extern int skel_lex (void);
-
-#define YY_DECL int skel_lex (void)
-/* %endif */
-/* %if-c++-only C++ definition */
-/* %endif */
-#endif /* !YY_DECL */
-
-/* Code executed at the beginning of each rule, after skel_text and skel_leng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK break;
-#endif
-
-/* %% [6.0] YY_RULE_SETUP definition goes here */
-#define YY_RULE_SETUP \
-	YY_USER_ACTION
-
-/* %not-for-header */
-
-/** The main scanner function which does all the work.
- */
-YY_DECL
-{
-	register yy_state_type yy_current_state;
-	register char *yy_cp, *yy_bp;
-	register int yy_act;
-    
-/* %% [7.0] user's declarations go here */
-#line 63 "scan-skel.l"
-
-
-
-  int lineno IF_LINT (= 0);
-  char *outname = NULL;
-
-
-#line 851 "scan-skel.c"
-
-	if ( (yy_init) )
-		{
-		(yy_init) = 0;
-
-#ifdef YY_USER_INIT
-		YY_USER_INIT;
-#endif
-
-		if ( ! (yy_start) )
-			(yy_start) = 1;	/* first start state */
-
-		if ( ! skel_in )
-/* %if-c-only */
-			skel_in = stdin;
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-
-		if ( ! skel_out )
-/* %if-c-only */
-			skel_out = stdout;
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-
-		if ( ! YY_CURRENT_BUFFER ) {
-			skel_ensure_buffer_stack ();
-			YY_CURRENT_BUFFER_LVALUE =
-				skel__create_buffer(skel_in,YY_BUF_SIZE );
-		}
-
-		skel__load_buffer_state( );
-		}
-
-	while ( 1 )		/* loops until end-of-file is reached */
-		{
-/* %% [8.0] yymore()-related code goes here */
-		yy_cp = (yy_c_buf_p);
-
-		/* Support of skel_text. */
-		*yy_cp = (yy_hold_char);
-
-		/* yy_bp points to the position in yy_ch_buf of the start of
-		 * the current run.
-		 */
-		yy_bp = yy_cp;
-
-/* %% [9.0] code to set up and find next match goes here */
-		yy_current_state = (yy_start);
-yy_match:
-		do
-			{
-			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
-			if ( yy_accept[yy_current_state] )
-				{
-				(yy_last_accepting_state) = yy_current_state;
-				(yy_last_accepting_cpos) = yy_cp;
-				}
-			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-				{
-				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 69 )
-					yy_c = yy_meta[(unsigned int) yy_c];
-				}
-			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-			++yy_cp;
-			}
-		while ( yy_current_state != 68 );
-		yy_cp = (yy_last_accepting_cpos);
-		yy_current_state = (yy_last_accepting_state);
-
-yy_find_action:
-/* %% [10.0] code to find the action number goes here */
-		yy_act = yy_accept[yy_current_state];
-
-		YY_DO_BEFORE_ACTION;
-
-/* %% [11.0] code for skel_lineno update goes here */
-
-do_action:	/* This label is used only to access EOF actions. */
-
-/* %% [12.0] debug code goes here */
-		if ( skel__flex_debug )
-			{
-			if ( yy_act == 0 )
-				fprintf( stderr, "--scanner backing up\n" );
-			else if ( yy_act < 13 )
-				fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
-				         (long)yy_rule_linenum[yy_act], skel_text );
-			else if ( yy_act == 13 )
-				fprintf( stderr, "--accepting default rule (\"%s\")\n",
-				         skel_text );
-			else if ( yy_act == 14 )
-				fprintf( stderr, "--(end of buffer or a NUL)\n" );
-			else
-				fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
-			}
-
-		switch ( yy_act )
-	{ /* beginning of action switch */
-/* %% [13.0] actions go here */
-			case 0: /* must back up */
-			/* undo the effects of YY_DO_BEFORE_ACTION */
-			*yy_cp = (yy_hold_char);
-			yy_cp = (yy_last_accepting_cpos);
-			yy_current_state = (yy_last_accepting_state);
-			goto yy_find_action;
-
-case 1:
-/* rule 1 can match eol */
-YY_RULE_SETUP
-#line 70 "scan-skel.l"
-{
-  char const *file_name = skel_text + sizeof "@output " - 1;
-  skel_text[skel_leng - 1] = '\0';
-
-  /* Decode special file names.  They include the directory part,
-     contrary to their "free" occurrences, used for issuing #includes,
-     which must not include the directory part.  */
-
-  if (*file_name == '@')
-    {
-      if (strcmp (file_name, "@output_header_name@") == 0)
-	file_name = spec_defines_file;
-      else if (strcmp (file_name, "@output_parser_name@") == 0)
-	file_name = parser_file_name;
-      else
-	fatal ("invalid token in skeleton: %s", skel_text);
-    }
-  if (outname)
-    {
-      free (outname);
-      xfclose (skel_out);
-    }
-  outname = xstrdup (file_name);
-  skel_out = xfopen (outname, "w");
-  lineno = 1;
-}
-	YY_BREAK
-case 2:
-YY_RULE_SETUP
-#line 97 "scan-skel.l"
-fputc ('@', skel_out);
-	YY_BREAK
-case 3:
-YY_RULE_SETUP
-#line 98 "scan-skel.l"
-fputc ('[', skel_out);
-	YY_BREAK
-case 4:
-YY_RULE_SETUP
-#line 99 "scan-skel.l"
-fputc (']', skel_out);
-	YY_BREAK
-case 5:
-YY_RULE_SETUP
-#line 101 "scan-skel.l"
-fprintf (skel_out, "%d", lineno + 1);
-	YY_BREAK
-case 6:
-YY_RULE_SETUP
-#line 102 "scan-skel.l"
-QPUTS (outname);
-	YY_BREAK
-case 7:
-YY_RULE_SETUP
-#line 103 "scan-skel.l"
-QPUTS (dir_prefix);
-	YY_BREAK
-case 8:
-YY_RULE_SETUP
-#line 104 "scan-skel.l"
-BASE_QPUTS (parser_file_name);
-	YY_BREAK
-case 9:
-YY_RULE_SETUP
-#line 105 "scan-skel.l"
-BASE_QPUTS (spec_defines_file);
-	YY_BREAK
-/* This pattern must not match more than the previous @ patterns. */
-case 10:
-YY_RULE_SETUP
-#line 108 "scan-skel.l"
-fatal ("invalid @ in skeleton: %s", skel_text);
-	YY_BREAK
-case 11:
-/* rule 11 can match eol */
-YY_RULE_SETUP
-#line 109 "scan-skel.l"
-lineno++; ECHO;
-	YY_BREAK
-case 12:
-YY_RULE_SETUP
-#line 110 "scan-skel.l"
-ECHO;
-	YY_BREAK
-case YY_STATE_EOF(INITIAL):
-#line 112 "scan-skel.l"
-{
-  if (outname)
-    {
-      free (outname);
-      xfclose (skel_out);
-    }
-  return EOF;
-}
-	YY_BREAK
-case 13:
-YY_RULE_SETUP
-#line 120 "scan-skel.l"
-YY_FATAL_ERROR( "flex scanner jammed" );
-	YY_BREAK
-#line 1065 "scan-skel.c"
-
-	case YY_END_OF_BUFFER:
-		{
-		/* Amount of text matched not including the EOB char. */
-		int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
-
-		/* Undo the effects of YY_DO_BEFORE_ACTION. */
-		*yy_cp = (yy_hold_char);
-		YY_RESTORE_YY_MORE_OFFSET
-
-		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
-			{
-			/* We're scanning a new file or input source.  It's
-			 * possible that this happened because the user
-			 * just pointed skel_in at a new source and called
-			 * skel_lex().  If so, then we have to assure
-			 * consistency between YY_CURRENT_BUFFER and our
-			 * globals.  Here is the right place to do so, because
-			 * this is the first action (other than possibly a
-			 * back-up) that will match for the new input source.
-			 */
-			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
-			YY_CURRENT_BUFFER_LVALUE->yy_input_file = skel_in;
-			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
-			}
-
-		/* Note that here we test for yy_c_buf_p "<=" to the position
-		 * of the first EOB in the buffer, since yy_c_buf_p will
-		 * already have been incremented past the NUL character
-		 * (since all states make transitions on EOB to the
-		 * end-of-buffer state).  Contrast this with the test
-		 * in input().
-		 */
-		if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
-			{ /* This was really a NUL. */
-			yy_state_type yy_next_state;
-
-			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
-
-			yy_current_state = yy_get_previous_state(  );
-
-			/* Okay, we're now positioned to make the NUL
-			 * transition.  We couldn't have
-			 * yy_get_previous_state() go ahead and do it
-			 * for us because it doesn't know how to deal
-			 * with the possibility of jamming (and we don't
-			 * want to build jamming into it because then it
-			 * will run more slowly).
-			 */
-
-			yy_next_state = yy_try_NUL_trans( yy_current_state );
-
-			yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-
-			if ( yy_next_state )
-				{
-				/* Consume the NUL. */
-				yy_cp = ++(yy_c_buf_p);
-				yy_current_state = yy_next_state;
-				goto yy_match;
-				}
-
-			else
-				{
-/* %% [14.0] code to do back-up for compressed tables and set up yy_cp goes here */
-				yy_cp = (yy_last_accepting_cpos);
-				yy_current_state = (yy_last_accepting_state);
-				goto yy_find_action;
-				}
-			}
-
-		else switch ( yy_get_next_buffer(  ) )
-			{
-			case EOB_ACT_END_OF_FILE:
-				{
-				(yy_did_buffer_switch_on_eof) = 0;
-
-				if ( skel_wrap( ) )
-					{
-					/* Note: because we've taken care in
-					 * yy_get_next_buffer() to have set up
-					 * skel_text, we can now set up
-					 * yy_c_buf_p so that if some total
-					 * hoser (like flex itself) wants to
-					 * call the scanner after we return the
-					 * YY_NULL, it'll still work - another
-					 * YY_NULL will get returned.
-					 */
-					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
-
-					yy_act = YY_STATE_EOF(YY_START);
-					goto do_action;
-					}
-
-				else
-					{
-					if ( ! (yy_did_buffer_switch_on_eof) )
-						YY_NEW_FILE;
-					}
-				break;
-				}
-
-			case EOB_ACT_CONTINUE_SCAN:
-				(yy_c_buf_p) =
-					(yytext_ptr) + yy_amount_of_matched_text;
-
-				yy_current_state = yy_get_previous_state(  );
-
-				yy_cp = (yy_c_buf_p);
-				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-				goto yy_match;
-
-			case EOB_ACT_LAST_MATCH:
-				(yy_c_buf_p) =
-				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
-
-				yy_current_state = yy_get_previous_state(  );
-
-				yy_cp = (yy_c_buf_p);
-				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-				goto yy_find_action;
-			}
-		break;
-		}
-
-	default:
-		YY_FATAL_ERROR(
-			"fatal flex scanner internal error--no action found" );
-	} /* end of action switch */
-		} /* end of scanning one token */
-} /* end of skel_lex */
-/* %ok-for-header */
-
-/* %if-c++-only */
-/* %not-for-header */
-
-/* %ok-for-header */
-
-/* %endif */
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- *	EOB_ACT_LAST_MATCH -
- *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- *	EOB_ACT_END_OF_FILE - end of file
- */
-/* %if-c-only */
-static int yy_get_next_buffer (void)
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
-	register char *source = (yytext_ptr);
-	register int number_to_move, i;
-	int ret_val;
-
-	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
-		YY_FATAL_ERROR(
-		"fatal flex scanner internal error--end of buffer missed" );
-
-	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
-		{ /* Don't try to fill the buffer, so this is an EOF. */
-		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
-			{
-			/* We matched a single character, the EOB, so
-			 * treat this as a final EOF.
-			 */
-			return EOB_ACT_END_OF_FILE;
-			}
-
-		else
-			{
-			/* We matched some text prior to the EOB, first
-			 * process it.
-			 */
-			return EOB_ACT_LAST_MATCH;
-			}
-		}
-
-	/* Try to read more data. */
-
-	/* First move last chars to start of buffer. */
-	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
-
-	for ( i = 0; i < number_to_move; ++i )
-		*(dest++) = *(source++);
-
-	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
-		/* don't do the read, it's not guaranteed to return an EOF,
-		 * just force an EOF
-		 */
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
-
-	else
-		{
-			size_t num_to_read =
-			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
-
-		while ( num_to_read <= 0 )
-			{ /* Not enough room in the buffer - grow it. */
-
-			/* just a shorter name for the current buffer */
-			YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
-
-			int yy_c_buf_p_offset =
-				(int) ((yy_c_buf_p) - b->yy_ch_buf);
-
-			if ( b->yy_is_our_buffer )
-				{
-				int new_size = b->yy_buf_size * 2;
-
-				if ( new_size <= 0 )
-					b->yy_buf_size += b->yy_buf_size / 8;
-				else
-					b->yy_buf_size *= 2;
-
-				b->yy_ch_buf = (char *)
-					/* Include room in for 2 EOB chars. */
-					skel_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
-				}
-			else
-				/* Can't grow it, we don't own it. */
-				b->yy_ch_buf = 0;
-
-			if ( ! b->yy_ch_buf )
-				YY_FATAL_ERROR(
-				"fatal error - scanner input buffer overflow" );
-
-			(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
-
-			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
-						number_to_move - 1;
-
-			}
-
-		if ( num_to_read > YY_READ_BUF_SIZE )
-			num_to_read = YY_READ_BUF_SIZE;
-
-		/* Read in more data. */
-		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
-			(yy_n_chars), num_to_read );
-
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-		}
-
-	if ( (yy_n_chars) == 0 )
-		{
-		if ( number_to_move == YY_MORE_ADJ )
-			{
-			ret_val = EOB_ACT_END_OF_FILE;
-			skel_restart(skel_in  );
-			}
-
-		else
-			{
-			ret_val = EOB_ACT_LAST_MATCH;
-			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
-				YY_BUFFER_EOF_PENDING;
-			}
-		}
-
-	else
-		ret_val = EOB_ACT_CONTINUE_SCAN;
-
-	(yy_n_chars) += number_to_move;
-	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
-	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
-
-	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
-
-	return ret_val;
-}
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
-/* %if-c-only */
-/* %not-for-header */
-
-    static yy_state_type yy_get_previous_state (void)
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-	register yy_state_type yy_current_state;
-	register char *yy_cp;
-    
-/* %% [15.0] code to get the start state into yy_current_state goes here */
-	yy_current_state = (yy_start);
-
-	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
-		{
-/* %% [16.0] code to find the next state goes here */
-		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
-		if ( yy_accept[yy_current_state] )
-			{
-			(yy_last_accepting_state) = yy_current_state;
-			(yy_last_accepting_cpos) = yy_cp;
-			}
-		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-			{
-			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 69 )
-				yy_c = yy_meta[(unsigned int) yy_c];
-			}
-		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-		}
-
-	return yy_current_state;
-}
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- *	next_state = yy_try_NUL_trans( current_state );
- */
-/* %if-c-only */
-    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-	register int yy_is_jam;
-    /* %% [17.0] code to find the next state, and perhaps do backing up, goes here */
-	register char *yy_cp = (yy_c_buf_p);
-
-	register YY_CHAR yy_c = 1;
-	if ( yy_accept[yy_current_state] )
-		{
-		(yy_last_accepting_state) = yy_current_state;
-		(yy_last_accepting_cpos) = yy_cp;
-		}
-	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-		{
-		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 69 )
-			yy_c = yy_meta[(unsigned int) yy_c];
-		}
-	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-	yy_is_jam = (yy_current_state == 68);
-
-	return yy_is_jam ? 0 : yy_current_state;
-}
-
-/* %if-c-only */
-
-/* %endif */
-
-/* %if-c-only */
-#ifndef YY_NO_INPUT
-#ifdef __cplusplus
-    static int yyinput (void)
-#else
-    static int input  (void)
-#endif
-
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-	int c;
-    
-	*(yy_c_buf_p) = (yy_hold_char);
-
-	if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
-		{
-		/* yy_c_buf_p now points to the character we want to return.
-		 * If this occurs *before* the EOB characters, then it's a
-		 * valid NUL; if not, then we've hit the end of the buffer.
-		 */
-		if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
-			/* This was really a NUL. */
-			*(yy_c_buf_p) = '\0';
-
-		else
-			{ /* need more input */
-			int offset = (yy_c_buf_p) - (yytext_ptr);
-			++(yy_c_buf_p);
-
-			switch ( yy_get_next_buffer(  ) )
-				{
-				case EOB_ACT_LAST_MATCH:
-					/* This happens because yy_g_n_b()
-					 * sees that we've accumulated a
-					 * token and flags that we need to
-					 * try matching the token before
-					 * proceeding.  But for input(),
-					 * there's no matching to consider.
-					 * So convert the EOB_ACT_LAST_MATCH
-					 * to EOB_ACT_END_OF_FILE.
-					 */
-
-					/* Reset buffer status. */
-					skel_restart(skel_in );
-
-					/*FALLTHROUGH*/
-
-				case EOB_ACT_END_OF_FILE:
-					{
-					if ( skel_wrap( ) )
-						return EOF;
-
-					if ( ! (yy_did_buffer_switch_on_eof) )
-						YY_NEW_FILE;
-#ifdef __cplusplus
-					return yyinput();
-#else
-					return input();
-#endif
-					}
-
-				case EOB_ACT_CONTINUE_SCAN:
-					(yy_c_buf_p) = (yytext_ptr) + offset;
-					break;
-				}
-			}
-		}
-
-	c = *(unsigned char *) (yy_c_buf_p);	/* cast for 8-bit char's */
-	*(yy_c_buf_p) = '\0';	/* preserve skel_text */
-	(yy_hold_char) = *++(yy_c_buf_p);
-
-/* %% [19.0] update BOL and skel_lineno */
-
-	return c;
-}
-/* %if-c-only */
-#endif	/* ifndef YY_NO_INPUT */
-/* %endif */
-
-/** Immediately switch to a different input stream.
- * @param input_file A readable stream.
- * 
- * @note This function does not reset the start condition to @c INITIAL .
- */
-/* %if-c-only */
-    void skel_restart  (FILE * input_file )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    
-	if ( ! YY_CURRENT_BUFFER ){
-        skel_ensure_buffer_stack ();
-		YY_CURRENT_BUFFER_LVALUE =
-            skel__create_buffer(skel_in,YY_BUF_SIZE );
-	}
-
-	skel__init_buffer(YY_CURRENT_BUFFER,input_file );
-	skel__load_buffer_state( );
-}
-
-/** Switch to a different input buffer.
- * @param new_buffer The new input buffer.
- * 
- */
-/* %if-c-only */
-    void skel__switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    
-	/* TODO. We should be able to replace this entire function body
-	 * with
-	 *		skel_pop_buffer_state();
-	 *		skel_push_buffer_state(new_buffer);
-     */
-	skel_ensure_buffer_stack ();
-	if ( YY_CURRENT_BUFFER == new_buffer )
-		return;
-
-	if ( YY_CURRENT_BUFFER )
-		{
-		/* Flush out information for old buffer. */
-		*(yy_c_buf_p) = (yy_hold_char);
-		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-		}
-
-	YY_CURRENT_BUFFER_LVALUE = new_buffer;
-	skel__load_buffer_state( );
-
-	/* We don't actually know whether we did this switch during
-	 * EOF (skel_wrap()) processing, but the only time this flag
-	 * is looked at is after skel_wrap() is called, so it's safe
-	 * to go ahead and always set it.
-	 */
-	(yy_did_buffer_switch_on_eof) = 1;
-}
-
-/* %if-c-only */
-static void skel__load_buffer_state  (void)
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
-	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
-	skel_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
-	(yy_hold_char) = *(yy_c_buf_p);
-}
-
-/** Allocate and initialize an input buffer state.
- * @param file A readable stream.
- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
- * 
- * @return the allocated buffer state.
- */
-/* %if-c-only */
-    YY_BUFFER_STATE skel__create_buffer  (FILE * file, int  size )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-	YY_BUFFER_STATE b;
-    
-	b = (YY_BUFFER_STATE) skel_alloc(sizeof( struct yy_buffer_state )  );
-	if ( ! b )
-		YY_FATAL_ERROR( "out of dynamic memory in skel__create_buffer()" );
-
-	b->yy_buf_size = size;
-
-	/* yy_ch_buf has to be 2 characters longer than the size given because
-	 * we need to put in 2 end-of-buffer characters.
-	 */
-	b->yy_ch_buf = (char *) skel_alloc(b->yy_buf_size + 2  );
-	if ( ! b->yy_ch_buf )
-		YY_FATAL_ERROR( "out of dynamic memory in skel__create_buffer()" );
-
-	b->yy_is_our_buffer = 1;
-
-	skel__init_buffer(b,file );
-
-	return b;
-}
-
-/** Destroy the buffer.
- * @param b a buffer created with skel__create_buffer()
- * 
- */
-/* %if-c-only */
-    void skel__delete_buffer (YY_BUFFER_STATE  b )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    
-	if ( ! b )
-		return;
-
-	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
-		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
-
-	if ( b->yy_is_our_buffer )
-		skel_free((void *) b->yy_ch_buf  );
-
-	skel_free((void *) b  );
-}
-
-/* %if-c-only */
-
-/* %endif */
-
-/* %if-c++-only */
-/* %endif */
-
-/* Initializes or reinitializes a buffer.
- * This function is sometimes called more than once on the same buffer,
- * such as during a skel_restart() or at EOF.
- */
-/* %if-c-only */
-    static void skel__init_buffer  (YY_BUFFER_STATE  b, FILE * file )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-
-{
-	int oerrno = errno;
-    
-	skel__flush_buffer(b );
-
-	b->yy_input_file = file;
-	b->yy_fill_buffer = 1;
-
-    /* If b is the current buffer, then skel__init_buffer was _probably_
-     * called from skel_restart() or through yy_get_next_buffer.
-     * In that case, we don't want to reset the lineno or column.
-     */
-    if (b != YY_CURRENT_BUFFER){
-        b->yy_bs_lineno = 1;
-        b->yy_bs_column = 0;
-    }
-
-/* %if-c-only */
-
-        b->yy_is_interactive = 0;
-    
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-	errno = oerrno;
-}
-
-/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
- * 
- */
-/* %if-c-only */
-    void skel__flush_buffer (YY_BUFFER_STATE  b )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    	if ( ! b )
-		return;
-
-	b->yy_n_chars = 0;
-
-	/* We always need two end-of-buffer characters.  The first causes
-	 * a transition to the end-of-buffer state.  The second causes
-	 * a jam in that state.
-	 */
-	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
-	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
-	b->yy_buf_pos = &b->yy_ch_buf[0];
-
-	b->yy_at_bol = 1;
-	b->yy_buffer_status = YY_BUFFER_NEW;
-
-	if ( b == YY_CURRENT_BUFFER )
-		skel__load_buffer_state( );
-}
-
-/* %if-c-or-c++ */
-/** Pushes the new state onto the stack. The new state becomes
- *  the current state. This function will allocate the stack
- *  if necessary.
- *  @param new_buffer The new state.
- *  
- */
-/* %if-c-only */
-void skel_push_buffer_state (YY_BUFFER_STATE new_buffer )
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    	if (new_buffer == NULL)
-		return;
-
-	skel_ensure_buffer_stack();
-
-	/* This block is copied from skel__switch_to_buffer. */
-	if ( YY_CURRENT_BUFFER )
-		{
-		/* Flush out information for old buffer. */
-		*(yy_c_buf_p) = (yy_hold_char);
-		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-		}
-
-	/* Only push if top exists. Otherwise, replace top. */
-	if (YY_CURRENT_BUFFER)
-		(yy_buffer_stack_top)++;
-	YY_CURRENT_BUFFER_LVALUE = new_buffer;
-
-	/* copied from skel__switch_to_buffer. */
-	skel__load_buffer_state( );
-	(yy_did_buffer_switch_on_eof) = 1;
-}
-/* %endif */
-
-/* %if-c-or-c++ */
-/** Removes and deletes the top of the stack, if present.
- *  The next element becomes the new top.
- *  
- */
-/* %if-c-only */
-void skel_pop_buffer_state (void)
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-    	if (!YY_CURRENT_BUFFER)
-		return;
-
-	skel__delete_buffer(YY_CURRENT_BUFFER );
-	YY_CURRENT_BUFFER_LVALUE = NULL;
-	if ((yy_buffer_stack_top) > 0)
-		--(yy_buffer_stack_top);
-
-	if (YY_CURRENT_BUFFER) {
-		skel__load_buffer_state( );
-		(yy_did_buffer_switch_on_eof) = 1;
-	}
-}
-/* %endif */
-
-/* %if-c-or-c++ */
-/* Allocates the stack if it does not exist.
- *  Guarantees space for at least one push.
- */
-/* %if-c-only */
-static void skel_ensure_buffer_stack (void)
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-{
-	int num_to_alloc;
-    
-	if (!(yy_buffer_stack)) {
-
-		/* First allocation is just for 2 elements, since we don't know if this
-		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
-		 * immediate realloc on the next call.
-         */
-		num_to_alloc = 1;
-		(yy_buffer_stack) = (struct yy_buffer_state**)skel_alloc
-								(num_to_alloc * sizeof(struct yy_buffer_state*)
-								);
-		
-		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-				
-		(yy_buffer_stack_max) = num_to_alloc;
-		(yy_buffer_stack_top) = 0;
-		return;
-	}
-
-	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
-
-		/* Increase the buffer to prepare for a possible push. */
-		int grow_size = 8 /* arbitrary grow size */;
-
-		num_to_alloc = (yy_buffer_stack_max) + grow_size;
-		(yy_buffer_stack) = (struct yy_buffer_state**)skel_realloc
-								((yy_buffer_stack),
-								num_to_alloc * sizeof(struct yy_buffer_state*)
-								);
-
-		/* zero only the new slots.*/
-		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
-		(yy_buffer_stack_max) = num_to_alloc;
-	}
-}
-/* %endif */
-
-/* %if-c-only */
-/** Setup the input buffer state to scan directly from a user-specified character buffer.
- * @param base the character buffer
- * @param size the size in bytes of the character buffer
- * 
- * @return the newly allocated buffer state object. 
- */
-YY_BUFFER_STATE skel__scan_buffer  (char * base, yy_size_t  size )
-{
-	YY_BUFFER_STATE b;
-    
-	if ( size < 2 ||
-	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
-	     base[size-1] != YY_END_OF_BUFFER_CHAR )
-		/* They forgot to leave room for the EOB's. */
-		return 0;
-
-	b = (YY_BUFFER_STATE) skel_alloc(sizeof( struct yy_buffer_state )  );
-	if ( ! b )
-		YY_FATAL_ERROR( "out of dynamic memory in skel__scan_buffer()" );
-
-	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
-	b->yy_buf_pos = b->yy_ch_buf = base;
-	b->yy_is_our_buffer = 0;
-	b->yy_input_file = 0;
-	b->yy_n_chars = b->yy_buf_size;
-	b->yy_is_interactive = 0;
-	b->yy_at_bol = 1;
-	b->yy_fill_buffer = 0;
-	b->yy_buffer_status = YY_BUFFER_NEW;
-
-	skel__switch_to_buffer(b  );
-
-	return b;
-}
-/* %endif */
-
-/* %if-c-only */
-/** Setup the input buffer state to scan a string. The next call to skel_lex() will
- * scan from a @e copy of @a str.
- * @param str a NUL-terminated string to scan
- * 
- * @return the newly allocated buffer state object.
- * @note If you want to scan bytes that may contain NUL values, then use
- *       skel__scan_bytes() instead.
- */
-YY_BUFFER_STATE skel__scan_string (yyconst char * yy_str )
-{
-    
-	return skel__scan_bytes(yy_str,strlen(yy_str) );
-}
-/* %endif */
-
-/* %if-c-only */
-/** Setup the input buffer state to scan the given bytes. The next call to skel_lex() will
- * scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
- * 
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE skel__scan_bytes  (yyconst char * bytes, int  len )
-{
-	YY_BUFFER_STATE b;
-	char *buf;
-	yy_size_t n;
-	int i;
-    
-	/* Get memory for full buffer, including space for trailing EOB's. */
-	n = len + 2;
-	buf = (char *) skel_alloc(n  );
-	if ( ! buf )
-		YY_FATAL_ERROR( "out of dynamic memory in skel__scan_bytes()" );
-
-	for ( i = 0; i < len; ++i )
-		buf[i] = bytes[i];
-
-	buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
-
-	b = skel__scan_buffer(buf,n );
-	if ( ! b )
-		YY_FATAL_ERROR( "bad buffer in skel__scan_bytes()" );
-
-	/* It's okay to grow etc. this buffer, and we should throw it
-	 * away when we're done.
-	 */
-	b->yy_is_our_buffer = 1;
-
-	return b;
-}
-/* %endif */
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-/* %if-c-only */
-static void yy_fatal_error (yyconst char* msg )
-{
-    	(void) fprintf( stderr, "%s\n", msg );
-	exit( YY_EXIT_FAILURE );
-}
-/* %endif */
-/* %if-c++-only */
-/* %endif */
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
-	do \
-		{ \
-		/* Undo effects of setting up skel_text. */ \
-        int yyless_macro_arg = (n); \
-        YY_LESS_LINENO(yyless_macro_arg);\
-		skel_text[skel_leng] = (yy_hold_char); \
-		(yy_c_buf_p) = skel_text + yyless_macro_arg; \
-		(yy_hold_char) = *(yy_c_buf_p); \
-		*(yy_c_buf_p) = '\0'; \
-		skel_leng = yyless_macro_arg; \
-		} \
-	while ( 0 )
-
-/* Accessor  methods (get/set functions) to struct members. */
-
-/* %if-c-only */
-/* %if-reentrant */
-/* %endif */
-
-/** Get the current line number.
- * 
- */
-int skel_get_lineno  (void)
-{
-        
-    return skel_lineno;
-}
-
-/** Get the input stream.
- * 
- */
-FILE *skel_get_in  (void)
-{
-        return skel_in;
-}
-
-/** Get the output stream.
- * 
- */
-FILE *skel_get_out  (void)
-{
-        return skel_out;
-}
-
-/** Get the length of the current token.
- * 
- */
-int skel_get_leng  (void)
-{
-        return skel_leng;
-}
-
-/** Get the current token.
- * 
- */
-
-char *skel_get_text  (void)
-{
-        return skel_text;
-}
-
-/* %if-reentrant */
-/* %endif */
-
-/** Set the current line number.
- * @param line_number
- * 
- */
-void skel_set_lineno (int  line_number )
-{
-    
-    skel_lineno = line_number;
-}
-
-/** Set the input stream. This does not discard the current
- * input buffer.
- * @param in_str A readable stream.
- * 
- * @see skel__switch_to_buffer
- */
-void skel_set_in (FILE *  in_str )
-{
-        skel_in = in_str ;
-}
-
-void skel_set_out (FILE *  out_str )
-{
-        skel_out = out_str ;
-}
-
-int skel_get_debug  (void)
-{
-        return skel__flex_debug;
-}
-
-void skel_set_debug (int  bdebug )
-{
-        skel__flex_debug = bdebug ;
-}
-
-/* %endif */
-
-/* %if-reentrant */
-/* %if-bison-bridge */
-/* %endif */
-/* %endif */
-
-/* %if-c-only SNIP! this currently causes conflicts with the c++ scanner */
-/* skel_lex_destroy is for both reentrant and non-reentrant scanners. */
-int skel_lex_destroy  (void)
-{
-    
-    /* Pop the buffer stack, destroying each element. */
-	while(YY_CURRENT_BUFFER){
-		skel__delete_buffer(YY_CURRENT_BUFFER  );
-		YY_CURRENT_BUFFER_LVALUE = NULL;
-		skel_pop_buffer_state();
-	}
-
-	/* Destroy the stack itself. */
-	skel_free((yy_buffer_stack) );
-	(yy_buffer_stack) = NULL;
-
-/* %if-reentrant */
-/* %endif */
-    return 0;
-}
-/* %endif */
-
-/*
- * Internal utility routines.
- */
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
-{
-	register int i;
-    	for ( i = 0; i < n; ++i )
-		s1[i] = s2[i];
-}
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * s )
-{
-	register int n;
-    	for ( n = 0; s[n]; ++n )
-		;
-
-	return n;
-}
-#endif
-
-void *skel_alloc (yy_size_t  size )
-{
-	return (void *) malloc( size );
-}
-
-void *skel_realloc  (void * ptr, yy_size_t  size )
-{
-	/* The cast to (char *) in the following accommodates both
-	 * implementations that use char* generic pointers, and those
-	 * that use void* generic pointers.  It works with the latter
-	 * because both ANSI C and C++ allow castless assignment from
-	 * any pointer type to void*, and deal with argument conversions
-	 * as though doing an assignment.
-	 */
-	return (void *) realloc( (char *) ptr, size );
-}
-
-void skel_free (void * ptr )
-{
-	free( (char *) ptr );	/* see skel_realloc() for (char *) cast */
-}
-
-/* %if-tables-serialization definitions */
-/* %define-yytables   The name for this specific scanner's tables. */
-#define YYTABLES_NAME "yytables"
-/* %endif */
-
-/* %ok-for-header */
-
-#undef YY_NEW_FILE
-#undef YY_FLUSH_BUFFER
-#undef yy_set_bol
-#undef yy_new_buffer
-#undef yy_set_interactive
-#undef yytext_ptr
-#undef YY_DO_BEFORE_ACTION
-
-#ifdef YY_DECL_IS_OURS
-#undef YY_DECL_IS_OURS
-#undef YY_DECL
-#endif
-#line 120 "scan-skel.l"
-
-
-
-/*------------------------.
-| Scan a Bison skeleton.  |
-`------------------------*/
-
-void
-scan_skel (FILE *in)
-{
-  skel_in = in;
-  skel__flex_debug = trace_flag & trace_skeleton;
-  skel_lex ();
-  /* Reclaim Flex's buffers.  */
-  skel__delete_buffer (YY_CURRENT_BUFFER);
-}
-
diff --git a/src/scan-skel.h b/src/scan-skel.h
deleted file mode 100644
index a7e14c3..0000000
--- a/src/scan-skel.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Scan Bison Skeletons.
-
-   Copyright (C) 2005, 2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-void scan_skel (FILE *);
-
-/* Pacify "make syntax-check".  */
-extern FILE *skel_in;
-extern FILE *skel_out;
-extern int skel__flex_debug;
-extern int skel_lineno;
diff --git a/src/scan-skel.l b/src/scan-skel.l
deleted file mode 100644
index c84eea1..0000000
--- a/src/scan-skel.l
+++ /dev/null
@@ -1,134 +0,0 @@
-/* Scan Bison Skeletons.                                       -*- C -*-
-
-   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software
-   Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
-
-%option nodefault noyywrap nounput never-interactive debug
-%option prefix="skel_" outfile="lex.yy.c"
-
-%{
-/* Work around a bug in flex 2.5.31.  See Debian bug 333231
-   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
-#undef skel_wrap
-#define skel_wrap() 1
-
-#include "system.h"
-
-#include <error.h>
-#include <quotearg.h>
-
-#include "complain.h"
-#include "getargs.h"
-#include "files.h"
-#include "scan-skel.h"
-
-/* Pacify "gcc -Wmissing-prototypes" when flex 2.5.31 is used.  */
-int skel_lex (void);
-int skel_get_lineno (void);
-FILE *skel_get_in (void);
-FILE *skel_get_out (void);
-int skel_get_leng (void);
-char *skel_get_text (void);
-void skel_set_lineno (int);
-void skel_set_in (FILE *);
-void skel_set_out (FILE *);
-int skel_get_debug (void);
-void skel_set_debug (int);
-int skel_lex_destroy (void);
-
-#define QPUTS(String) \
-   fputs (quotearg_style (c_quoting_style, String), yyout)
-
-#define BASE_QPUTS(File) \
-   QPUTS (base_name (File))
-
-%}
-%%
-
-%{
-  int lineno IF_LINT (= 0);
-  char *outname = NULL;
-%}
-
-"@output ".*\n {
-  char const *file_name = yytext + sizeof "@output " - 1;
-  yytext[yyleng - 1] = '\0';
-
-  /* Decode special file names.  They include the directory part,
-     contrary to their "free" occurrences, used for issuing #includes,
-     which must not include the directory part.  */
-
-  if (*file_name == '@')
-    {
-      if (strcmp (file_name, "@output_header_name@") == 0)
-	file_name = spec_defines_file;
-      else if (strcmp (file_name, "@output_parser_name@") == 0)
-	file_name = parser_file_name;
-      else
-	fatal ("invalid token in skeleton: %s", yytext);
-    }
-  if (outname)
-    {
-      free (outname);
-      xfclose (yyout);
-    }
-  outname = xstrdup (file_name);
-  yyout = xfopen (outname, "w");
-  lineno = 1;
-}
-
-"@@"	   fputc ('@', yyout);
-"@{"	   fputc ('[', yyout);
-"@}"	   fputc (']', yyout);
-
-"@oline@"  fprintf (yyout, "%d", lineno + 1);
-"@ofile@"  QPUTS (outname);
-"@dir_prefix@" QPUTS (dir_prefix);
-"@output_parser_name@"	BASE_QPUTS (parser_file_name);
-"@output_header_name@"	BASE_QPUTS (spec_defines_file);
-
-  /* This pattern must not match more than the previous @ patterns. */
-@[^{}@\n]* fatal ("invalid @ in skeleton: %s", yytext);
-\n	   lineno++; ECHO;
-[^@\n]+	   ECHO;
-
-<<EOF>> {
-  if (outname)
-    {
-      free (outname);
-      xfclose (yyout);
-    }
-  return EOF;
-}
-%%
-
-/*------------------------.
-| Scan a Bison skeleton.  |
-`------------------------*/
-
-void
-scan_skel (FILE *in)
-{
-  skel_in = in;
-  skel__flex_debug = trace_flag & trace_skeleton;
-  skel_lex ();
-  /* Reclaim Flex's buffers.  */
-  yy_delete_buffer (YY_CURRENT_BUFFER);
-}
diff --git a/src/state.c b/src/state.c
deleted file mode 100644
index 4eb39f9..0000000
--- a/src/state.c
+++ /dev/null
@@ -1,370 +0,0 @@
-/* Type definitions for nondeterministic finite state machine for Bison.
-
-   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software
-   Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <hash.h>
-
-#include "complain.h"
-#include "gram.h"
-#include "state.h"
-
-
-			/*-------------------.
-			| Shifts and Gotos.  |
-			`-------------------*/
-
-
-/*-----------------------------------------.
-| Create a new array of NUM shifts/gotos.  |
-`-----------------------------------------*/
-
-static transitions *
-transitions_new (int num, state **the_states)
-{
-  size_t states_size = num * sizeof *the_states;
-  transitions *res = xmalloc (offsetof (transitions, states) + states_size);
-  res->num = num;
-  memcpy (res->states, the_states, states_size);
-  return res;
-}
-
-
-/*-------------------------------------------------------.
-| Return the state such that SHIFTS contain a shift/goto |
-| to it on SYM.  Abort if none found.                    |
-`-------------------------------------------------------*/
-
-state *
-transitions_to (transitions *shifts, symbol_number sym)
-{
-  int j;
-  for (j = 0; ; j++)
-    {
-      assert (j < shifts->num);
-      if (TRANSITION_SYMBOL (shifts, j) == sym)
-	return shifts->states[j];
-    }
-}
-
-
-			/*--------------------.
-			| Error transitions.  |
-			`--------------------*/
-
-
-/*---------------------------------.
-| Create a new array of NUM errs.  |
-`---------------------------------*/
-
-errs *
-errs_new (int num, symbol **tokens)
-{
-  size_t symbols_size = num * sizeof *tokens;
-  errs *res = xmalloc (offsetof (errs, symbols) + symbols_size);
-  res->num = num;
-  memcpy (res->symbols, tokens, symbols_size);
-  return res;
-}
-
-
-
-
-			/*-------------.
-			| Reductions.  |
-			`-------------*/
-
-
-/*---------------------------------------.
-| Create a new array of NUM reductions.  |
-`---------------------------------------*/
-
-static reductions *
-reductions_new (int num, rule **reds)
-{
-  size_t rules_size = num * sizeof *reds;
-  reductions *res = xmalloc (offsetof (reductions, rules) + rules_size);
-  res->num = num;
-  res->look_ahead_tokens = NULL;
-  memcpy (res->rules, reds, rules_size);
-  return res;
-}
-
-
-
-			/*---------.
-			| States.  |
-			`---------*/
-
-
-state_number nstates = 0;
-/* FINAL_STATE is properly set by new_state when it recognizes its
-   accessing symbol: $end.  */
-state *final_state = NULL;
-
-
-/*------------------------------------------------------------------.
-| Create a new state with ACCESSING_SYMBOL, for those items.  Store |
-| it in the state hash table.                                       |
-`------------------------------------------------------------------*/
-
-state *
-state_new (symbol_number accessing_symbol,
-	   size_t nitems, item_number *core)
-{
-  state *res;
-  size_t items_size = nitems * sizeof *core;
-
-  assert (nstates < STATE_NUMBER_MAXIMUM);
-
-  res = xmalloc (offsetof (state, items) + items_size);
-  res->number = nstates++;
-  res->accessing_symbol = accessing_symbol;
-  res->transitions = NULL;
-  res->reductions = NULL;
-  res->errs = NULL;
-  res->consistent = 0;
-  res->solved_conflicts = NULL;
-
-  res->nitems = nitems;
-  memcpy (res->items, core, items_size);
-
-  state_hash_insert (res);
-
-  return res;
-}
-
-
-/*---------.
-| Free S.  |
-`---------*/
-
-static void
-state_free (state *s)
-{
-  free (s->transitions);
-  free (s->reductions);
-  free (s->errs);
-  free (s);
-}
-
-
-/*---------------------------.
-| Set the transitions of S.  |
-`---------------------------*/
-
-void
-state_transitions_set (state *s, int num, state **trans)
-{
-  assert (!s->transitions);
-  s->transitions = transitions_new (num, trans);
-}
-
-
-/*--------------------------.
-| Set the reductions of S.  |
-`--------------------------*/
-
-void
-state_reductions_set (state *s, int num, rule **reds)
-{
-  assert (!s->reductions);
-  s->reductions = reductions_new (num, reds);
-}
-
-
-int
-state_reduction_find (state *s, rule *r)
-{
-  int i;
-  reductions *reds = s->reductions;
-  for (i = 0; i < reds->num; ++i)
-    if (reds->rules[i] == r)
-      return i;
-  return -1;
-}
-
-
-/*--------------------.
-| Set the errs of S.  |
-`--------------------*/
-
-void
-state_errs_set (state *s, int num, symbol **tokens)
-{
-  assert (!s->errs);
-  s->errs = errs_new (num, tokens);
-}
-
-
-
-/*---------------------------------------------------.
-| Print on OUT all the look-ahead tokens such that S |
-| wants to reduce R.                                 |
-`---------------------------------------------------*/
-
-void
-state_rule_look_ahead_tokens_print (state *s, rule *r, FILE *out)
-{
-  /* Find the reduction we are handling.  */
-  reductions *reds = s->reductions;
-  int red = state_reduction_find (s, r);
-
-  /* Print them if there are.  */
-  if (reds->look_ahead_tokens && red != -1)
-    {
-      bitset_iterator biter;
-      int k;
-      char const *sep = "";
-      fprintf (out, "  [");
-      BITSET_FOR_EACH (biter, reds->look_ahead_tokens[red], k, 0)
-	{
-	  fprintf (out, "%s%s", sep, symbols[k]->tag);
-	  sep = ", ";
-	}
-      fprintf (out, "]");
-    }
-}
-
-
-/*---------------------.
-| A state hash table.  |
-`---------------------*/
-
-/* Initial capacity of states hash table.  */
-#define HT_INITIAL_CAPACITY 257
-
-static struct hash_table *state_table = NULL;
-
-/* Two states are equal if they have the same core items.  */
-static inline bool
-state_compare (state const *s1, state const *s2)
-{
-  size_t i;
-
-  if (s1->nitems != s2->nitems)
-    return false;
-
-  for (i = 0; i < s1->nitems; ++i)
-    if (s1->items[i] != s2->items[i])
-      return false;
-
-  return true;
-}
-
-static bool
-state_comparator (void const *s1, void const *s2)
-{
-  return state_compare (s1, s2);
-}
-
-static inline size_t
-state_hash (state const *s, size_t tablesize)
-{
-  /* Add up the state's item numbers to get a hash key.  */
-  size_t key = 0;
-  size_t i;
-  for (i = 0; i < s->nitems; ++i)
-    key += s->items[i];
-  return key % tablesize;
-}
-
-static size_t
-state_hasher (void const *s, size_t tablesize)
-{
-  return state_hash (s, tablesize);
-}
-
-
-/*-------------------------------.
-| Create the states hash table.  |
-`-------------------------------*/
-
-void
-state_hash_new (void)
-{
-  state_table = hash_initialize (HT_INITIAL_CAPACITY,
-				 NULL,
-				 state_hasher,
-				 state_comparator,
-				 NULL);
-}
-
-
-/*---------------------------------------------.
-| Free the states hash table, not the states.  |
-`---------------------------------------------*/
-
-void
-state_hash_free (void)
-{
-  hash_free (state_table);
-}
-
-
-/*-----------------------------------.
-| Insert S in the state hash table.  |
-`-----------------------------------*/
-
-void
-state_hash_insert (state *s)
-{
-  hash_insert (state_table, s);
-}
-
-
-/*------------------------------------------------------------------.
-| Find the state associated to the CORE, and return it.  If it does |
-| not exist yet, return NULL.                                       |
-`------------------------------------------------------------------*/
-
-state *
-state_hash_lookup (size_t nitems, item_number *core)
-{
-  size_t items_size = nitems * sizeof *core;
-  state *probe = xmalloc (offsetof (state, items) + items_size);
-  state *entry;
-
-  probe->nitems = nitems;
-  memcpy (probe->items, core, items_size);
-  entry = hash_lookup (state_table, probe);
-  free (probe);
-  return entry;
-}
-
-/* All the decorated states, indexed by the state number.  */
-state **states = NULL;
-
-
-/*----------------------.
-| Free all the states.  |
-`----------------------*/
-
-void
-states_free (void)
-{
-  state_number i;
-  for (i = 0; i < nstates; ++i)
-    state_free (states[i]);
-  free (states);
-}
diff --git a/src/state.h b/src/state.h
deleted file mode 100644
index 440cd46..0000000
--- a/src/state.h
+++ /dev/null
@@ -1,257 +0,0 @@
-/* Type definitions for nondeterministic finite state machine for Bison.
-
-   Copyright (C) 1984, 1989, 2000, 2001, 2002, 2003, 2004 Free
-   Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-
-/* These type definitions are used to represent a nondeterministic
-   finite state machine that parses the specified grammar.  This
-   information is generated by the function generate_states in the
-   file LR0.
-
-   Each state of the machine is described by a set of items --
-   particular positions in particular rules -- that are the possible
-   places where parsing could continue when the machine is in this
-   state.  These symbols at these items are the allowable inputs that
-   can follow now.
-
-   A core represents one state.  States are numbered in the NUMBER
-   field.  When generate_states is finished, the starting state is
-   state 0 and NSTATES is the number of states.  (FIXME: This sentence
-   is no longer true: A transition to a state whose state number is
-   NSTATES indicates termination.)  All the cores are chained together
-   and FIRST_STATE points to the first one (state 0).
-
-   For each state there is a particular symbol which must have been
-   the last thing accepted to reach that state.  It is the
-   ACCESSING_SYMBOL of the core.
-
-   Each core contains a vector of NITEMS items which are the indices
-   in the RITEMS vector of the items that are selected in this state.
-
-   The two types of actions are shifts/gotos (push the look-ahead token
-   and read another/goto to the state designated by a nterm) and
-   reductions (combine the last n things on the stack via a rule,
-   replace them with the symbol that the rule derives, and leave the
-   look-ahead token alone).  When the states are generated, these
-   actions are represented in two other lists.
-
-   Each transition structure describes the possible transitions out
-   of one state, the state whose number is in the number field.  Each
-   contains a vector of numbers of the states that transitions can go
-   to.  The accessing_symbol fields of those states' cores say what
-   kind of input leads to them.
-
-   A transition to state zero should be ignored: conflict resolution
-   deletes transitions by having them point to zero.
-
-   Each reductions structure describes the possible reductions at the
-   state whose number is in the number field.  The data is a list of
-   nreds rules, represented by their rule numbers.  first_reduction
-   points to the list of these structures.
-
-   Conflict resolution can decide that certain tokens in certain
-   states should explicitly be errors (for implementing %nonassoc).
-   For each state, the tokens that are errors for this reason are
-   recorded in an errs structure, which holds the token numbers.
-
-   There is at least one goto transition present in state zero.  It
-   leads to a next-to-final state whose accessing_symbol is the
-   grammar's start symbol.  The next-to-final state has one shift to
-   the final state, whose accessing_symbol is zero (end of input).
-   The final state has one shift, which goes to the termination state.
-   The reason for the extra state at the end is to placate the
-   parser's strategy of making all decisions one token ahead of its
-   actions.  */
-
-#ifndef STATE_H_
-# define STATE_H_
-
-# include <bitset.h>
-
-# include "gram.h"
-# include "symtab.h"
-
-
-/*-------------------.
-| Numbering states.  |
-`-------------------*/
-
-typedef int state_number;
-# define STATE_NUMBER_MAXIMUM INT_MAX
-
-/* Be ready to map a state_number to an int.  */
-static inline int
-state_number_as_int (state_number s)
-{
-  return s;
-}
-
-
-typedef struct state state;
-
-/*--------------.
-| Transitions.  |
-`--------------*/
-
-typedef struct
-{
-  int num;
-  state *states[1];
-} transitions;
-
-
-/* What is the symbol labelling the transition to
-   TRANSITIONS->states[Num]?  Can be a token (amongst which the error
-   token), or non terminals in case of gotos.  */
-
-#define TRANSITION_SYMBOL(Transitions, Num) \
-  (Transitions->states[Num]->accessing_symbol)
-
-/* Is the TRANSITIONS->states[Num] a shift? (as opposed to gotos).  */
-
-#define TRANSITION_IS_SHIFT(Transitions, Num) \
-  (ISTOKEN (TRANSITION_SYMBOL (Transitions, Num)))
-
-/* Is the TRANSITIONS->states[Num] a goto?. */
-
-#define TRANSITION_IS_GOTO(Transitions, Num) \
-  (!TRANSITION_IS_SHIFT (Transitions, Num))
-
-/* Is the TRANSITIONS->states[Num] labelled by the error token?  */
-
-#define TRANSITION_IS_ERROR(Transitions, Num) \
-  (TRANSITION_SYMBOL (Transitions, Num) == errtoken->number)
-
-/* When resolving a SR conflicts, if the reduction wins, the shift is
-   disabled.  */
-
-#define TRANSITION_DISABLE(Transitions, Num) \
-  (Transitions->states[Num] = NULL)
-
-#define TRANSITION_IS_DISABLED(Transitions, Num) \
-  (Transitions->states[Num] == NULL)
-
-
-/* Iterate over each transition over a token (shifts).  */
-#define FOR_EACH_SHIFT(Transitions, Iter)			\
-  for (Iter = 0;						\
-       Iter < Transitions->num					\
-	 && (TRANSITION_IS_DISABLED (Transitions, Iter)		\
-	     || TRANSITION_IS_SHIFT (Transitions, Iter));	\
-       ++Iter)							\
-    if (!TRANSITION_IS_DISABLED (Transitions, Iter))
-
-
-/* Return the state such SHIFTS contain a shift/goto to it on SYM.
-   Abort if none found.  */
-struct state *transitions_to (transitions *shifts, symbol_number sym);
-
-
-/*-------.
-| Errs.  |
-`-------*/
-
-typedef struct
-{
-  int num;
-  symbol *symbols[1];
-} errs;
-
-errs *errs_new (int num, symbol **tokens);
-
-
-/*-------------.
-| Reductions.  |
-`-------------*/
-
-typedef struct
-{
-  int num;
-  bitset *look_ahead_tokens;
-  rule *rules[1];
-} reductions;
-
-
-
-/*---------.
-| states.  |
-`---------*/
-
-struct state
-{
-  state_number number;
-  symbol_number accessing_symbol;
-  transitions *transitions;
-  reductions *reductions;
-  errs *errs;
-
-  /* Nonzero if no look-ahead is needed to decide what to do in state S.  */
-  char consistent;
-
-  /* If some conflicts were solved thanks to precedence/associativity,
-     a human readable description of the resolution.  */
-  const char *solved_conflicts;
-
-  /* Its items.  Must be last, since ITEMS can be arbitrarily large.
-     */
-  size_t nitems;
-  item_number items[1];
-};
-
-extern state_number nstates;
-extern state *final_state;
-
-/* Create a new state with ACCESSING_SYMBOL for those items.  */
-state *state_new (symbol_number accessing_symbol,
-		  size_t core_size, item_number *core);
-
-/* Set the transitions of STATE.  */
-void state_transitions_set (state *s, int num, state **trans);
-
-/* Set the reductions of STATE.  */
-void state_reductions_set (state *s, int num, rule **reds);
-
-int state_reduction_find (state *s, rule *r);
-
-/* Set the errs of STATE.  */
-void state_errs_set (state *s, int num, symbol **errors);
-
-/* Print on OUT all the look-ahead tokens such that this STATE wants to
-   reduce R.  */
-void state_rule_look_ahead_tokens_print (state *s, rule *r, FILE *out);
-
-/* Create/destroy the states hash table.  */
-void state_hash_new (void);
-void state_hash_free (void);
-
-/* Find the state associated to the CORE, and return it.  If it does
-   not exist yet, return NULL.  */
-state *state_hash_lookup (size_t core_size, item_number *core);
-
-/* Insert STATE in the state hash table.  */
-void state_hash_insert (state *s);
-
-/* All the states, indexed by the state number.  */
-extern state **states;
-
-/* Free all the states.  */
-void states_free (void);
-#endif /* !STATE_H_ */
diff --git a/src/symlist.c b/src/symlist.c
deleted file mode 100644
index 70db82f..0000000
--- a/src/symlist.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/* Lists of symbols for Bison
-
-   Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include "complain.h"
-#include "symlist.h"
-
-
-/*--------------------------------------.
-| Create a list containing SYM at LOC.  |
-`--------------------------------------*/
-
-symbol_list *
-symbol_list_new (symbol *sym, location loc)
-{
-  symbol_list *res = xmalloc (sizeof *res);
-
-  res->sym = sym;
-  res->location = loc;
-
-  res->midrule = NULL;
-
-  res->action = NULL;
-  res->used = false;
-
-  res->ruleprec = NULL;
-  res->dprec = 0;
-  res->merger = 0;
-
-  res->next = NULL;
-
-  return res;
-}
-
-
-/*------------------.
-| Print this list.  |
-`------------------*/
-
-void
-symbol_list_print (const symbol_list *l, FILE *f)
-{
-  for (/* Nothing. */; l && l->sym; l = l->next)
-    {
-      symbol_print (l->sym, f);
-      fprintf (stderr, l->used ? " used" : " unused");
-      if (l && l->sym)
-	fprintf (f, ", ");
-    }
-}
-
-
-/*---------------------------------.
-| Prepend SYM at LOC to the LIST.  |
-`---------------------------------*/
-
-symbol_list *
-symbol_list_prepend (symbol_list *list, symbol *sym, location loc)
-{
-  symbol_list *res = symbol_list_new (sym, loc);
-  res->next = list;
-  return res;
-}
-
-
-/*-------------------------------------------------.
-| Free the LIST, but not the symbols it contains.  |
-`-------------------------------------------------*/
-
-void
-symbol_list_free (symbol_list *list)
-{
-  LIST_FREE (symbol_list, list);
-}
-
-
-/*--------------------.
-| Return its length.  |
-`--------------------*/
-
-unsigned int
-symbol_list_length (const symbol_list *l)
-{
-  int res = 0;
-  for (/* Nothing. */; l; l = l->next)
-    ++res;
-  return res;
-}
-
-
-/*--------------------------------.
-| Get symbol N in symbol list L.  |
-`--------------------------------*/
-
-symbol_list *
-symbol_list_n_get (symbol_list *l, int n)
-{
-  int i;
-
-  if (n < 0)
-    return NULL;
-
-  for (i = 0; i < n; ++i)
-    {
-      l = l->next;
-      if (l == NULL || l->sym == NULL)
-	return NULL;
-    }
-
-  return l;
-}
-
-
-/*--------------------------------------------------------------.
-| Get the data type (alternative in the union) of the value for |
-| symbol N in symbol list L.                                    |
-`--------------------------------------------------------------*/
-
-uniqstr
-symbol_list_n_type_name_get (symbol_list *l, location loc, int n)
-{
-  l = symbol_list_n_get (l, n);
-  if (!l)
-    {
-      complain_at (loc, _("invalid $ value: $%d"), n);
-      return NULL;
-    }
-  return l->sym->type_name;
-}
-
-
-/*----------------------------------------.
-| The symbol N in symbol list L is USED.  |
-`----------------------------------------*/
-
-void
-symbol_list_n_used_set (symbol_list *l, int n, bool used)
-{
-  l = symbol_list_n_get (l, n);
-  if (l)
-    l->used = used;
-}
diff --git a/src/symlist.h b/src/symlist.h
deleted file mode 100644
index 0423d01..0000000
--- a/src/symlist.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Lists of symbols for Bison
-
-   Copyright (C) 2002, 2005 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef SYMLIST_H_
-# define SYMLIST_H_
-
-# include "location.h"
-# include "symtab.h"
-
-/* A list of symbols, used during the parsing to store the rules.  */
-typedef struct symbol_list
-{
-  /* The symbol.  */
-  symbol *sym;
-  location location;
-
-  /* If this symbol is the generated lhs for a mid-rule, a pointer to
-     that mid-rule.  */
-  struct symbol_list *midrule;
-
-  /* The action is attached to the LHS of a rule. */
-  const char *action;
-  location action_location;
-
-  /* Whether this symbol's value is used in the current action. */
-  bool used;
-
-  /* Precedence/associativity.  */
-  symbol *ruleprec;
-  int dprec;
-  int merger;
-
-  /* The list.  */
-  struct symbol_list *next;
-} symbol_list;
-
-
-/* Create a list containing SYM at LOC.  */
-symbol_list *symbol_list_new (symbol *sym, location loc);
-
-/* Print it.  */
-void symbol_list_print (const symbol_list *l, FILE *f);
-
-/* Prepend SYM at LOC to the LIST.  */
-symbol_list *symbol_list_prepend (symbol_list *l,
-				  symbol *sym,
-				  location loc);
-
-/* Free the LIST, but not the symbols it contains.  */
-void symbol_list_free (symbol_list *l);
-
-/* Return its length. */
-unsigned int symbol_list_length (const symbol_list *l);
-
-/* Get symbol N in symbol list L.  */
-symbol_list *symbol_list_n_get (symbol_list *l, int n);
-
-/* Get the data type (alternative in the union) of the value for
-   symbol N in rule RULE.  */
-uniqstr symbol_list_n_type_name_get (symbol_list *l, location loc, int n);
-
-/* The symbol N in symbol list L is USED.  */
-void symbol_list_n_used_set (symbol_list *l, int n, bool used);
-
-#endif /* !SYMLIST_H_ */
diff --git a/src/symtab.c b/src/symtab.c
deleted file mode 100644
index ef59c6e..0000000
--- a/src/symtab.c
+++ /dev/null
@@ -1,657 +0,0 @@
-/* Symbol table manager for Bison.
-
-   Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005, 2006 Free
-   Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <hash.h>
-#include <quotearg.h>
-
-#include "complain.h"
-#include "gram.h"
-#include "symtab.h"
-
-/*------------------------.
-| Distinguished symbols.  |
-`------------------------*/
-
-symbol *errtoken = NULL;
-symbol *undeftoken = NULL;
-symbol *endtoken = NULL;
-symbol *accept = NULL;
-symbol *startsymbol = NULL;
-location startsymbol_location;
-
-/*---------------------------------.
-| Create a new symbol, named TAG.  |
-`---------------------------------*/
-
-static symbol *
-symbol_new (uniqstr tag, location loc)
-{
-  symbol *res = xmalloc (sizeof *res);
-
-  uniqstr_assert (tag);
-  res->tag = tag;
-  res->location = loc;
-
-  res->type_name = NULL;
-  res->destructor = NULL;
-  res->printer = NULL;
-
-  res->number = NUMBER_UNDEFINED;
-  res->prec = 0;
-  res->assoc = undef_assoc;
-  res->user_token_number = USER_NUMBER_UNDEFINED;
-
-  res->alias = NULL;
-  res->class = unknown_sym;
-  res->declared = false;
-
-  if (nsyms == SYMBOL_NUMBER_MAXIMUM)
-    fatal (_("too many symbols in input grammar (limit is %d)"),
-	   SYMBOL_NUMBER_MAXIMUM);
-  nsyms++;
-  return res;
-}
-
-
-/*-----------------.
-| Print a symbol.  |
-`-----------------*/
-
-#define SYMBOL_ATTR_PRINT(Attr)				\
-  if (s->Attr)						\
-    fprintf (f, " %s { %s }", #Attr, s->Attr)
-
-void
-symbol_print (symbol *s, FILE *f)
-{
-  if (s)
-    {
-      fprintf (f, "\"%s\"", s->tag);
-      SYMBOL_ATTR_PRINT (type_name);
-      SYMBOL_ATTR_PRINT (destructor);
-      SYMBOL_ATTR_PRINT (printer);
-    }
-  else
-    fprintf (f, "<NULL>");
-}
-
-#undef SYMBOL_ATTR_PRINT
-
-/*------------------------------------------------------------------.
-| Complain that S's WHAT is redeclared at SECOND, and was first set |
-| at FIRST.                                                         |
-`------------------------------------------------------------------*/
-
-static void
-redeclaration (symbol* s, const char *what, location first, location second)
-{
-  complain_at (second, _("%s redeclaration for %s"), what, s->tag);
-  complain_at (first, _("first declaration"));
-}
-
-
-/*-----------------------------------------------------------------.
-| Set the TYPE_NAME associated with SYM.  Does nothing if passed 0 |
-| as TYPE_NAME.                                                    |
-`-----------------------------------------------------------------*/
-
-void
-symbol_type_set (symbol *sym, uniqstr type_name, location loc)
-{
-  if (type_name)
-    {
-      if (sym->type_name)
-	redeclaration (sym, "%type", sym->type_location, loc);
-      uniqstr_assert (type_name);
-      sym->type_name = type_name;
-      sym->type_location = loc;
-    }
-}
-
-
-/*------------------------------------------------------------------.
-| Set the DESTRUCTOR associated with SYM.  Do nothing if passed 0.  |
-`------------------------------------------------------------------*/
-
-void
-symbol_destructor_set (symbol *sym, const char *destructor, location loc)
-{
-  if (destructor)
-    {
-      if (sym->destructor)
-	redeclaration (sym, "%destructor", sym->destructor_location, loc);
-      sym->destructor = destructor;
-      sym->destructor_location = loc;
-    }
-}
-
-
-/*---------------------------------------------------------------.
-| Set the PRINTER associated with SYM.  Do nothing if passed 0.  |
-`---------------------------------------------------------------*/
-
-void
-symbol_printer_set (symbol *sym, const char *printer, location loc)
-{
-  if (printer)
-    {
-      if (sym->printer)
-	redeclaration (sym, "%printer", sym->destructor_location, loc);
-      sym->printer = printer;
-      sym->printer_location = loc;
-    }
-}
-
-
-/*-----------------------------------------------------------------.
-| Set the PRECEDENCE associated with SYM.  Does nothing if invoked |
-| with UNDEF_ASSOC as ASSOC.                                       |
-`-----------------------------------------------------------------*/
-
-void
-symbol_precedence_set (symbol *sym, int prec, assoc a, location loc)
-{
-  if (a != undef_assoc)
-    {
-      if (sym->prec != 0)
-	redeclaration (sym, assoc_to_string (a), sym->prec_location, loc);
-      sym->prec = prec;
-      sym->assoc = a;
-      sym->prec_location = loc;
-    }
-
-  /* Only terminals have a precedence. */
-  symbol_class_set (sym, token_sym, loc, false);
-}
-
-
-/*------------------------------------.
-| Set the CLASS associated with SYM.  |
-`------------------------------------*/
-
-void
-symbol_class_set (symbol *sym, symbol_class class, location loc, bool declaring)
-{
-  if (sym->class != unknown_sym && sym->class != class)
-    {
-      complain_at (loc, _("symbol %s redefined"), sym->tag);
-      sym->declared = false;
-    }
-
-  if (class == nterm_sym && sym->class != nterm_sym)
-    sym->number = nvars++;
-  else if (class == token_sym && sym->number == NUMBER_UNDEFINED)
-    sym->number = ntokens++;
-
-  sym->class = class;
-
-  if (declaring)
-    {
-      if (sym->declared)
-	warn_at (loc, _("symbol %s redeclared"), sym->tag);
-      sym->declared = true;
-    }
-}
-
-
-/*------------------------------------------------.
-| Set the USER_TOKEN_NUMBER associated with SYM.  |
-`------------------------------------------------*/
-
-void
-symbol_user_token_number_set (symbol *sym, int user_token_number, location loc)
-{
-  assert (sym->class == token_sym);
-
-  if (sym->user_token_number != USER_NUMBER_UNDEFINED
-      && sym->user_token_number != user_token_number)
-    complain_at (loc, _("redefining user token number of %s"), sym->tag);
-
-  sym->user_token_number = user_token_number;
-  /* User defined $end token? */
-  if (user_token_number == 0)
-    {
-      endtoken = sym;
-      endtoken->number = 0;
-      /* It is always mapped to 0, so it was already counted in
-	 NTOKENS.  */
-      --ntokens;
-    }
-}
-
-
-/*----------------------------------------------------------.
-| If SYM is not defined, report an error, and consider it a |
-| nonterminal.                                              |
-`----------------------------------------------------------*/
-
-static inline bool
-symbol_check_defined (symbol *sym)
-{
-  if (sym->class == unknown_sym)
-    {
-      complain_at
-	(sym->location,
-	 _("symbol %s is used, but is not defined as a token and has no rules"),
-	 sym->tag);
-      sym->class = nterm_sym;
-      sym->number = nvars++;
-    }
-
-  return true;
-}
-
-static bool
-symbol_check_defined_processor (void *sym, void *null ATTRIBUTE_UNUSED)
-{
-  return symbol_check_defined (sym);
-}
-
-
-/*------------------------------------------------------------------.
-| Declare the new symbol SYM.  Make it an alias of SYMVAL, and type |
-| SYMVAL with SYM's type.                                           |
-`------------------------------------------------------------------*/
-
-void
-symbol_make_alias (symbol *sym, symbol *symval, location loc)
-{
-  if (symval->alias)
-    warn_at (loc, _("symbol `%s' used more than once as a literal string"),
-	     symval->tag);
-  else if (sym->alias)
-    warn_at (loc, _("symbol `%s' given more than one literal string"),
-	     sym->tag);
-  else
-    {
-      symval->class = token_sym;
-      symval->user_token_number = sym->user_token_number;
-      sym->user_token_number = USER_NUMBER_ALIAS;
-      symval->alias = sym;
-      sym->alias = symval;
-      /* sym and symval combined are only one symbol.  */
-      nsyms--;
-      ntokens--;
-      assert (ntokens == sym->number || ntokens == symval->number);
-      sym->number = symval->number =
-	(symval->number < sym->number) ? symval->number : sym->number;
-      symbol_type_set (symval, sym->type_name, loc);
-    }
-}
-
-
-/*---------------------------------------------------------.
-| Check that THIS, and its alias, have same precedence and |
-| associativity.                                           |
-`---------------------------------------------------------*/
-
-static inline void
-symbol_check_alias_consistency (symbol *this)
-{
-  symbol *alias = this;
-  symbol *orig  = this->alias;
-
-  /* Check only those that _are_ the aliases.  */
-  if (!(this->alias && this->user_token_number == USER_NUMBER_ALIAS))
-    return;
-
-  if (orig->type_name != alias->type_name)
-    {
-      if (orig->type_name)
-	symbol_type_set (alias, orig->type_name, orig->type_location);
-      else
-	symbol_type_set (orig, alias->type_name, alias->type_location);
-    }
-
-
-  if (orig->destructor || alias->destructor)
-    {
-      if (orig->destructor)
-	symbol_destructor_set (alias, orig->destructor,
-			       orig->destructor_location);
-      else
-	symbol_destructor_set (orig, alias->destructor,
-			       alias->destructor_location);
-    }
-
-  if (orig->printer || alias->printer)
-    {
-      if (orig->printer)
-	symbol_printer_set (alias, orig->printer, orig->printer_location);
-      else
-	symbol_printer_set (orig, alias->printer, alias->printer_location);
-    }
-
-  if (alias->prec || orig->prec)
-    {
-      if (orig->prec)
-	symbol_precedence_set (alias, orig->prec, orig->assoc,
-			       orig->prec_location);
-      else
-	symbol_precedence_set (orig, alias->prec, alias->assoc,
-			       alias->prec_location);
-    }
-}
-
-static bool
-symbol_check_alias_consistency_processor (void *this,
-					  void *null ATTRIBUTE_UNUSED)
-{
-  symbol_check_alias_consistency (this);
-  return true;
-}
-
-
-/*-------------------------------------------------------------------.
-| Assign a symbol number, and write the definition of the token name |
-| into FDEFINES.  Put in SYMBOLS.                                    |
-`-------------------------------------------------------------------*/
-
-static inline bool
-symbol_pack (symbol *this)
-{
-  if (this->class == nterm_sym)
-    {
-      this->number += ntokens;
-    }
-  else if (this->alias)
-    {
-      /* This symbol and its alias are a single token defn.
-	 Allocate a tokno, and assign to both check agreement of
-	 prec and assoc fields and make both the same */
-      if (this->number == NUMBER_UNDEFINED)
-	{
-	  if (this == endtoken || this->alias == endtoken)
-	    this->number = this->alias->number = 0;
-	  else
-	    {
-	      assert (this->alias->number != NUMBER_UNDEFINED);
-	      this->number = this->alias->number;
-	    }
-	}
-      /* Do not do processing below for USER_NUMBER_ALIASes.  */
-      if (this->user_token_number == USER_NUMBER_ALIAS)
-	return true;
-    }
-  else /* this->class == token_sym */
-    assert (this->number != NUMBER_UNDEFINED);
-
-  symbols[this->number] = this;
-  return true;
-}
-
-static bool
-symbol_pack_processor (void *this, void *null ATTRIBUTE_UNUSED)
-{
-  return symbol_pack (this);
-}
-
-
-
-
-/*--------------------------------------------------.
-| Put THIS in TOKEN_TRANSLATIONS if it is a token.  |
-`--------------------------------------------------*/
-
-static inline bool
-symbol_translation (symbol *this)
-{
-  /* Non-terminal? */
-  if (this->class == token_sym
-      && this->user_token_number != USER_NUMBER_ALIAS)
-    {
-      /* A token which translation has already been set? */
-      if (token_translations[this->user_token_number] != undeftoken->number)
-	complain_at (this->location,
-		     _("tokens %s and %s both assigned number %d"),
-		     symbols[token_translations[this->user_token_number]]->tag,
-		     this->tag, this->user_token_number);
-
-      token_translations[this->user_token_number] = this->number;
-    }
-
-  return true;
-}
-
-static bool
-symbol_translation_processor (void *this, void *null ATTRIBUTE_UNUSED)
-{
-  return symbol_translation (this);
-}
-
-
-/*----------------------.
-| A symbol hash table.  |
-`----------------------*/
-
-/* Initial capacity of symbols hash table.  */
-#define HT_INITIAL_CAPACITY 257
-
-static struct hash_table *symbol_table = NULL;
-
-static inline bool
-hash_compare_symbol (const symbol *m1, const symbol *m2)
-{
-  /* Since tags are unique, we can compare the pointers themselves.  */
-  return UNIQSTR_EQ (m1->tag, m2->tag);
-}
-
-static bool
-hash_symbol_comparator (void const *m1, void const *m2)
-{
-  return hash_compare_symbol (m1, m2);
-}
-
-static inline size_t
-hash_symbol (const symbol *m, size_t tablesize)
-{
-  /* Since tags are unique, we can hash the pointer itself.  */
-  return ((uintptr_t) m->tag) % tablesize;
-}
-
-static size_t
-hash_symbol_hasher (void const *m, size_t tablesize)
-{
-  return hash_symbol (m, tablesize);
-}
-
-
-/*-------------------------------.
-| Create the symbol hash table.  |
-`-------------------------------*/
-
-void
-symbols_new (void)
-{
-  symbol_table = hash_initialize (HT_INITIAL_CAPACITY,
-				  NULL,
-				  hash_symbol_hasher,
-				  hash_symbol_comparator,
-				  free);
-}
-
-
-/*----------------------------------------------------------------.
-| Find the symbol named KEY, and return it.  If it does not exist |
-| yet, create it.                                                 |
-`----------------------------------------------------------------*/
-
-symbol *
-symbol_get (const char *key, location loc)
-{
-  symbol probe;
-  symbol *entry;
-
-  key = uniqstr_new (key);
-  probe.tag = key;
-  entry = hash_lookup (symbol_table, &probe);
-
-  if (!entry)
-    {
-      /* First insertion in the hash. */
-      entry = symbol_new (key, loc);
-      hash_insert (symbol_table, entry);
-    }
-  return entry;
-}
-
-
-/*------------------------------------------------------------------.
-| Generate a dummy nonterminal, whose name cannot conflict with the |
-| user's names.                                                     |
-`------------------------------------------------------------------*/
-
-symbol *
-dummy_symbol_get (location loc)
-{
-  /* Incremented for each generated symbol.  */
-  static int dummy_count = 0;
-  static char buf[256];
-
-  symbol *sym;
-
-  sprintf (buf, "@%d", ++dummy_count);
-  sym = symbol_get (buf, loc);
-  sym->class = nterm_sym;
-  sym->number = nvars++;
-  return sym;
-}
-
-
-/*-------------------.
-| Free the symbols.  |
-`-------------------*/
-
-void
-symbols_free (void)
-{
-  hash_free (symbol_table);
-  free (symbols);
-}
-
-
-/*---------------------------------------------------------------.
-| Look for undefined symbols, report an error, and consider them |
-| terminals.                                                     |
-`---------------------------------------------------------------*/
-
-static void
-symbols_do (Hash_processor processor, void *processor_data)
-{
-  hash_do_for_each (symbol_table, processor, processor_data);
-}
-
-
-/*--------------------------------------------------------------.
-| Check that all the symbols are defined.  Report any undefined |
-| symbols and consider them nonterminals.                       |
-`--------------------------------------------------------------*/
-
-void
-symbols_check_defined (void)
-{
-  symbols_do (symbol_check_defined_processor, NULL);
-}
-
-/*------------------------------------------------------------------.
-| Set TOKEN_TRANSLATIONS.  Check that no two symbols share the same |
-| number.                                                           |
-`------------------------------------------------------------------*/
-
-static void
-symbols_token_translations_init (void)
-{
-  bool num_256_available_p = true;
-  int i;
-
-  /* Find the highest user token number, and whether 256, the POSIX
-     preferred user token number for the error token, is used.  */
-  max_user_token_number = 0;
-  for (i = 0; i < ntokens; ++i)
-    {
-      symbol *this = symbols[i];
-      if (this->user_token_number != USER_NUMBER_UNDEFINED)
-	{
-	  if (this->user_token_number > max_user_token_number)
-	    max_user_token_number = this->user_token_number;
-	  if (this->user_token_number == 256)
-	    num_256_available_p = false;
-	}
-    }
-
-  /* If 256 is not used, assign it to error, to follow POSIX.  */
-  if (num_256_available_p
-      && errtoken->user_token_number == USER_NUMBER_UNDEFINED)
-    errtoken->user_token_number = 256;
-
-  /* Set the missing user numbers. */
-  if (max_user_token_number < 256)
-    max_user_token_number = 256;
-
-  for (i = 0; i < ntokens; ++i)
-    {
-      symbol *this = symbols[i];
-      if (this->user_token_number == USER_NUMBER_UNDEFINED)
-	this->user_token_number = ++max_user_token_number;
-      if (this->user_token_number > max_user_token_number)
-	max_user_token_number = this->user_token_number;
-    }
-
-  token_translations = xnmalloc (max_user_token_number + 1,
-				 sizeof *token_translations);
-
-  /* Initialize all entries for literal tokens to 2, the internal
-     token number for $undefined, which represents all invalid inputs.
-     */
-  for (i = 0; i < max_user_token_number + 1; i++)
-    token_translations[i] = undeftoken->number;
-  symbols_do (symbol_translation_processor, NULL);
-}
-
-
-/*----------------------------------------------------------------.
-| Assign symbol numbers, and write definition of token names into |
-| FDEFINES.  Set up vectors SYMBOL_TABLE, TAGS of symbols.        |
-`----------------------------------------------------------------*/
-
-void
-symbols_pack (void)
-{
-  symbols = xcalloc (nsyms, sizeof *symbols);
-
-  symbols_do (symbol_check_alias_consistency_processor, NULL);
-  symbols_do (symbol_pack_processor, NULL);
-
-  symbols_token_translations_init ();
-
-  if (startsymbol->class == unknown_sym)
-    fatal_at (startsymbol_location,
-	      _("the start symbol %s is undefined"),
-	      startsymbol->tag);
-  else if (startsymbol->class == token_sym)
-    fatal_at (startsymbol_location,
-	      _("the start symbol %s is a token"),
-	      startsymbol->tag);
-}
diff --git a/src/symtab.h b/src/symtab.h
deleted file mode 100644
index 0f852b7..0000000
--- a/src/symtab.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/* Definitions for symtab.c and callers, part of Bison.
-
-   Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2004, 2005, 2006
-   Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef SYMTAB_H_
-# define SYMTAB_H_
-
-# include "assoc.h"
-# include "location.h"
-# include "uniqstr.h"
-
-/*----------.
-| Symbols.  |
-`----------*/
-
-/* Symbol classes.  */
-typedef enum
-{
-  unknown_sym,
-  token_sym,		/* terminal symbol */
-  nterm_sym		/* non-terminal */
-} symbol_class;
-
-
-/* Internal token numbers. */
-typedef int symbol_number;
-#define SYMBOL_NUMBER_MAXIMUM INT_MAX
-
-
-typedef struct symbol symbol;
-
-/* When extending this structure, be sure to complete
-   symbol_check_alias_consistency.  */
-struct symbol
-{
-  /* The key, name of the symbol.  */
-  uniqstr tag;
-  /* The location of its first occurrence.  */
-  location location;
-
-  /* Its %type and associated printer and destructor.  */
-  uniqstr type_name;
-  location type_location;
-
-  /* Does not own the memory. */
-  const char *destructor;
-  location destructor_location;
-
-  /* Does not own the memory. */
-  const char *printer;
-  location printer_location;
-
-  symbol_number number;
-  location prec_location;
-  int prec;
-  assoc assoc;
-  int user_token_number;
-
-  /* Points to the other in the identifier-symbol pair for an alias.
-     Special value USER_NUMBER_ALIAS in the identifier half of the
-     identifier-symbol pair for an alias.  */
-  symbol *alias;
-  symbol_class class;
-  bool declared;
-};
-
-/* Undefined user number.  */
-#define USER_NUMBER_UNDEFINED -1
-
-/* `symbol->user_token_number == USER_NUMBER_ALIAS' means this symbol
-   *has* (not is) a string literal alias.  For instance, `%token foo
-   "foo"' has `"foo"' numbered regularly, and `foo' numbered as
-   USER_NUMBER_ALIAS.  */
-#define USER_NUMBER_ALIAS -9991
-
-/* Undefined internal token number.  */
-#define NUMBER_UNDEFINED (-1)
-
-/* Print a symbol (for debugging). */
-void symbol_print (symbol *s, FILE *f);
-
-/* Fetch (or create) the symbol associated to KEY.  */
-symbol *symbol_get (const char *key, location loc);
-
-/* Generate a dummy nonterminal, whose name cannot conflict with the
-   user's names.  */
-symbol *dummy_symbol_get (location loc);
-
-/* Declare the new symbol SYM.  Make it an alias of SYMVAL.  */
-void symbol_make_alias (symbol *sym, symbol *symval, location loc);
-
-/* Set the TYPE_NAME associated with SYM.  Do nothing if passed 0 as
-   TYPE_NAME.  */
-void symbol_type_set (symbol *sym, uniqstr type_name, location loc);
-
-/* Set the DESTRUCTOR associated with SYM.  */
-void symbol_destructor_set (symbol *sym, const char *destructor, location loc);
-
-/* Set the PRINTER associated with SYM.  */
-void symbol_printer_set (symbol *sym, const char *printer, location loc);
-
-/* Set the PRECEDENCE associated with SYM.  Ensure that SYMBOL is a
-   terminal.  Do nothing if invoked with UNDEF_ASSOC as ASSOC.  */
-void symbol_precedence_set (symbol *sym, int prec, assoc a, location loc);
-
-/* Set the CLASS associated with SYM.  */
-void symbol_class_set (symbol *sym, symbol_class class, location loc,
-		       bool declaring);
-
-/* Set the USER_TOKEN_NUMBER associated with SYM.  */
-void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
-
-
-/* Distinguished symbols.  AXIOM is the real start symbol, that used
-   by the automaton.  STARTSYMBOL is the one specified by the user.
-   */
-extern symbol *errtoken;
-extern symbol *undeftoken;
-extern symbol *endtoken;
-extern symbol *accept;
-extern symbol *startsymbol;
-extern location startsymbol_location;
-
-
-/*---------------.
-| Symbol table.  |
-`---------------*/
-
-
-/* Create the symbol table.  */
-void symbols_new (void);
-
-/* Free all the memory allocated for symbols.  */
-void symbols_free (void);
-
-/* Check that all the symbols are defined.  Report any undefined
-   symbols and consider them nonterminals.  */
-void symbols_check_defined (void);
-
-/* Perform various sanity checks, assign symbol numbers, and set up
-   TOKEN_TRANSLATIONS.  */
-void symbols_pack (void);
-
-#endif /* !SYMTAB_H_ */
diff --git a/src/system.h b/src/system.h
deleted file mode 100644
index 6315790..0000000
--- a/src/system.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/* System-dependent definitions for Bison.
-
-   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 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.  */
-
-#ifndef BISON_SYSTEM_H
-#define BISON_SYSTEM_H
-
-/* flex 2.5.31 gratutiously defines macros like INT8_MIN.  But this
-   runs afoul of pre-C99 compilers that have <inttypes.h> or
-   <stdint.h>, which are included below if available.  It also runs
-   afoul of pre-C99 compilers that define these macros in <limits.h>.  */
-#if ! defined __STDC_VERSION__ || __STDC_VERSION__ < 199901
-# undef INT8_MIN
-# undef INT16_MIN
-# undef INT32_MIN
-# undef INT8_MAX
-# undef INT16_MAX
-# undef UINT8_MAX
-# undef INT32_MAX
-# undef UINT16_MAX
-# undef UINT32_MAX
-#endif
-
-#include <limits.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "unlocked-io.h"
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-
-#if ! HAVE_UINTPTR_T
-/* This isn't perfect, but it's good enough for Bison, which needs
-   only to hash pointers.  */
-typedef size_t uintptr_t;
-#endif
-
-#include <verify.h>
-#include <xalloc.h>
-
-
-/*---------------------.
-| Missing prototypes.  |
-`---------------------*/
-
-#include <stpcpy.h>
-
-/* From lib/basename.c. */
-char *base_name (char const *name);
-
-
-/*-----------------.
-| GCC extensions.  |
-`-----------------*/
-
-/* Use this to suppress gcc's `...may be used before initialized'
-   warnings.  */
-#ifdef lint
-# define IF_LINT(Code) Code
-#else
-# define IF_LINT(Code) /* empty */
-#endif
-
-#ifndef __attribute__
-/* This feature is available in gcc versions 2.5 and later.  */
-# if (! defined __GNUC__ || __GNUC__ < 2 \
-      || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__)
-#  define __attribute__(Spec) /* empty */
-# endif
-#endif
-
-/* The __-protected variants of `format' and `printf' attributes
-   are accepted by gcc versions 2.6.4 (effectively 2.7) and later.  */
-#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
-# define __format__ format
-# define __printf__ printf
-#endif
-
-#ifndef ATTRIBUTE_NORETURN
-# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
-#endif
-
-#ifndef ATTRIBUTE_UNUSED
-# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
-#endif
-
-/*------.
-| NLS.  |
-`------*/
-
-#include <locale.h>
-
-#include <gettext.h>
-#define _(Msgid)  gettext (Msgid)
-#define N_(Msgid) (Msgid)
-
-
-/*-------------------------------.
-| Fix broken compilation flags.  |
-`-------------------------------*/
-
-#ifndef LOCALEDIR
-# define LOCALEDIR "/usr/local/share/locale"
-#endif
-
-
-/*-----------.
-| Booleans.  |
-`-----------*/
-
-#include <stdbool.h>
-
-
-/*-----------.
-| Obstacks.  |
-`-----------*/
-
-#define obstack_chunk_alloc xmalloc
-#define obstack_chunk_free  free
-#include <obstack.h>
-
-#define obstack_sgrow(Obs, Str) \
-  obstack_grow (Obs, Str, strlen (Str))
-
-#define obstack_fgrow1(Obs, Format, Arg1)	\
-do {						\
-  char buf[4096];				\
-  sprintf (buf, Format, Arg1);			\
-  obstack_grow (Obs, buf, strlen (buf));	\
-} while (0)
-
-#define obstack_fgrow2(Obs, Format, Arg1, Arg2)	\
-do {						\
-  char buf[4096];				\
-  sprintf (buf, Format, Arg1, Arg2);		\
-  obstack_grow (Obs, buf, strlen (buf));	\
-} while (0)
-
-#define obstack_fgrow3(Obs, Format, Arg1, Arg2, Arg3)	\
-do {							\
-  char buf[4096];					\
-  sprintf (buf, Format, Arg1, Arg2, Arg3);		\
-  obstack_grow (Obs, buf, strlen (buf));		\
-} while (0)
-
-#define obstack_fgrow4(Obs, Format, Arg1, Arg2, Arg3, Arg4)	\
-do {								\
-  char buf[4096];						\
-  sprintf (buf, Format, Arg1, Arg2, Arg3, Arg4);		\
-  obstack_grow (Obs, buf, strlen (buf));			\
-} while (0)
-
-
-
-/*-----------------------------------------.
-| Extensions to use for the output files.  |
-`-----------------------------------------*/
-
-#ifndef OUTPUT_EXT
-# define OUTPUT_EXT ".output"
-#endif
-
-#ifndef TAB_EXT
-# define TAB_EXT ".tab"
-#endif
-
-#ifndef DEFAULT_TMPDIR
-# define DEFAULT_TMPDIR "/tmp"
-#endif
-
-
-
-/*---------------------.
-| Free a linked list.  |
-`---------------------*/
-
-#define LIST_FREE(Type, List)			\
-do {						\
-  Type *_node, *_next;				\
-  for (_node = List; _node; _node = _next)	\
-    {						\
-      _next = _node->next;			\
-      free (_node);				\
-    }						\
-} while (0)
-
-
-/* Assertions.  <assert.h>'s assertions are too heavyweight, and can
-   be disabled too easily, so implement it separately here.  */
-#define assert(x) ((void) ((x) || (abort (), 0)))
-
-
-/*---------------------------------------------.
-| Debugging memory allocation (must be last).  |
-`---------------------------------------------*/
-
-# if WITH_DMALLOC
-#  define DMALLOC_FUNC_CHECK
-#  include <dmalloc.h>
-# endif /* WITH_DMALLOC */
-
-#endif  /* ! BISON_SYSTEM_H */
diff --git a/src/tables.c b/src/tables.c
deleted file mode 100644
index c938139..0000000
--- a/src/tables.c
+++ /dev/null
@@ -1,861 +0,0 @@
-/* Output the generated parsing program for Bison.
-
-   Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004,
-   2005 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <bitsetv.h>
-#include <quotearg.h>
-
-#include "complain.h"
-#include "conflicts.h"
-#include "files.h"
-#include "getargs.h"
-#include "gram.h"
-#include "lalr.h"
-#include "reader.h"
-#include "symtab.h"
-#include "tables.h"
-
-/* Several tables are indexed both by state and nonterminal numbers.
-   We call such an index a `vector'; i.e., a vector is either a state
-   or a nonterminal number.
-
-   Of course vector_number_t ought to be wide enough to contain
-   state_number and symbol_number.  */
-typedef int vector_number;
-
-#if 0 /* Not currently used.  */
-static inline vector_number
-state_number_to_vector_number (state_number s)
-{
-  return s;
-}
-#endif
-
-static inline vector_number
-symbol_number_to_vector_number (symbol_number sym)
-{
-  return state_number_as_int (nstates) + sym - ntokens;
-}
-
-int nvectors;
-
-
-/* FROMS and TOS are indexed by vector_number.
-
-   If VECTOR is a nonterminal, (FROMS[VECTOR], TOS[VECTOR]) form an
-   array of state numbers of the non defaulted GOTO on VECTOR.
-
-   If VECTOR is a state, TOS[VECTOR] is the array of actions to do on
-   the (array of) symbols FROMS[VECTOR].
-
-   In both cases, TALLY[VECTOR] is the size of the arrays
-   FROMS[VECTOR], TOS[VECTOR]; and WIDTH[VECTOR] =
-   (FROMS[VECTOR][SIZE] - FROMS[VECTOR][0] + 1) where SIZE =
-   TALLY[VECTOR].
-
-   FROMS therefore contains symbol_number and action_number,
-   TOS state_number and action_number,
-   TALLY sizes,
-   WIDTH differences of FROMS.
-
-   Let base_number be the type of FROMS, TOS, and WIDTH.  */
-#define BASE_MAXIMUM INT_MAX
-#define BASE_MINIMUM INT_MIN
-
-static base_number **froms;
-static base_number **tos;
-static unsigned int **conflict_tos;
-static int *tally;
-static base_number *width;
-
-
-/* For a given state, N = ACTROW[SYMBOL]:
-
-   If N = 0, stands for `run the default action'.
-   If N = MIN, stands for `raise a syntax error'.
-   If N > 0, stands for `shift SYMBOL and go to n'.
-   If N < 0, stands for `reduce -N'.  */
-typedef int action_number;
-#define ACTION_NUMBER_MINIMUM INT_MIN
-
-static action_number *actrow;
-
-/* FROMS and TOS are reordered to be compressed.  ORDER[VECTOR] is the
-   new vector number of VECTOR.  We skip `empty' vectors (i.e.,
-   TALLY[VECTOR] = 0), and call these `entries'.  */
-static vector_number *order;
-static int nentries;
-
-base_number *base = NULL;
-/* A distinguished value of BASE, negative infinite.  During the
-   computation equals to BASE_MINIMUM, later mapped to BASE_NINF to
-   keep parser tables small.  */
-base_number base_ninf = 0;
-static base_number *pos = NULL;
-
-static unsigned int *conflrow;
-unsigned int *conflict_table;
-unsigned int *conflict_list;
-int conflict_list_cnt;
-static int conflict_list_free;
-
-/* TABLE_SIZE is the allocated size of both TABLE and CHECK.  We start
-   with more or less the original hard-coded value (which was
-   SHRT_MAX).  */
-static int table_size = 32768;
-base_number *table;
-base_number *check;
-/* The value used in TABLE to denote explicit syntax errors
-   (%nonassoc), a negative infinite.  First defaults to ACTION_NUMBER_MININUM,
-   but in order to keep small tables, renumbered as TABLE_ERROR, which
-   is the smallest (non error) value minus 1.  */
-base_number table_ninf = 0;
-static int lowzero;
-int high;
-
-state_number *yydefgoto;
-rule_number *yydefact;
-
-/*----------------------------------------------------------------.
-| If TABLE (and CHECK) appear to be small to be addressed at      |
-| DESIRED, grow them.  Note that TABLE[DESIRED] is to be used, so |
-| the desired size is at least DESIRED + 1.                       |
-`----------------------------------------------------------------*/
-
-static void
-table_grow (int desired)
-{
-  int old_size = table_size;
-
-  while (table_size <= desired)
-    table_size *= 2;
-
-  if (trace_flag & trace_resource)
-    fprintf (stderr, "growing table and check from: %d to %d\n",
-	     old_size, table_size);
-
-  table = xnrealloc (table, table_size, sizeof *table);
-  conflict_table = xnrealloc (conflict_table, table_size,
-			      sizeof *conflict_table);
-  check = xnrealloc (check, table_size, sizeof *check);
-
-  for (/* Nothing. */; old_size < table_size; ++old_size)
-    {
-      table[old_size] = 0;
-      conflict_table[old_size] = 0;
-      check[old_size] = -1;
-    }
-}
-
-
-
-
-/*-------------------------------------------------------------------.
-| For GLR parsers, for each conflicted token in S, as indicated      |
-| by non-zero entries in CONFLROW, create a list of possible	     |
-| reductions that are alternatives to the shift or reduction	     |
-| currently recorded for that token in S.  Store the alternative     |
-| reductions followed by a 0 in CONFLICT_LIST, updating		     |
-| CONFLICT_LIST_CNT, and storing an index to the start of the list   |
-| back into CONFLROW.						     |
-`-------------------------------------------------------------------*/
-
-static void
-conflict_row (state *s)
-{
-  int i, j;
-  reductions *reds = s->reductions;
-
-  if (!nondeterministic_parser)
-    return;
-
-  for (j = 0; j < ntokens; j += 1)
-    if (conflrow[j])
-      {
-	conflrow[j] = conflict_list_cnt;
-
-	/* Find all reductions for token J, and record all that do not
-	   match ACTROW[J].  */
-	for (i = 0; i < reds->num; i += 1)
-	  if (bitset_test (reds->look_ahead_tokens[i], j)
-	      && (actrow[j]
-		  != rule_number_as_item_number (reds->rules[i]->number)))
-	    {
-	      assert (0 < conflict_list_free);
-	      conflict_list[conflict_list_cnt] = reds->rules[i]->number + 1;
-	      conflict_list_cnt += 1;
-	      conflict_list_free -= 1;
-	    }
-
-	/* Leave a 0 at the end.  */
-	assert (0 < conflict_list_free);
-	conflict_list[conflict_list_cnt] = 0;
-	conflict_list_cnt += 1;
-	conflict_list_free -= 1;
-      }
-}
-
-
-/*------------------------------------------------------------------.
-| Decide what to do for each type of token if seen as the           |
-| look-ahead in specified state.  The value returned is used as the |
-| default action (yydefact) for the state.  In addition, ACTROW is  |
-| filled with what to do for each kind of token, index by symbol    |
-| number, with zero meaning do the default action.  The value       |
-| ACTION_NUMBER_MINIMUM, a very negative number, means this	    |
-| situation is an error.  The parser recognizes this value	    |
-| specially.							    |
-|                                                                   |
-| This is where conflicts are resolved.  The loop over look-ahead   |
-| rules considered lower-numbered rules last, and the last rule     |
-| considered that likes a token gets to handle it.                  |
-|                                                                   |
-| For GLR parsers, also sets CONFLROW[SYM] to an index into         |
-| CONFLICT_LIST iff there is an unresolved conflict (s/r or r/r)    |
-| with symbol SYM. The default reduction is not used for a symbol   |
-| that has any such conflicts.                                      |
-`------------------------------------------------------------------*/
-
-static rule *
-action_row (state *s)
-{
-  int i;
-  rule *default_rule = NULL;
-  reductions *reds = s->reductions;
-  transitions *trans = s->transitions;
-  errs *errp = s->errs;
-  /* Set to nonzero to inhibit having any default reduction.  */
-  bool nodefault = false;
-  bool conflicted = false;
-
-  for (i = 0; i < ntokens; i++)
-    actrow[i] = conflrow[i] = 0;
-
-  if (reds->look_ahead_tokens)
-    {
-      int j;
-      bitset_iterator biter;
-      /* loop over all the rules available here which require
-	 look-ahead (in reverse order to give precedence to the first
-	 rule) */
-      for (i = reds->num - 1; i >= 0; --i)
-	/* and find each token which the rule finds acceptable
-	   to come next */
-	BITSET_FOR_EACH (biter, reds->look_ahead_tokens[i], j, 0)
-	{
-	  /* and record this rule as the rule to use if that
-	     token follows.  */
-	  if (actrow[j] != 0)
-	    {
-	      conflicted = true;
-	      conflrow[j] = 1;
-	    }
-	  actrow[j] = rule_number_as_item_number (reds->rules[i]->number);
-	}
-    }
-
-  /* Now see which tokens are allowed for shifts in this state.  For
-     them, record the shift as the thing to do.  So shift is preferred
-     to reduce.  */
-  FOR_EACH_SHIFT (trans, i)
-    {
-      symbol_number sym = TRANSITION_SYMBOL (trans, i);
-      state *shift_state = trans->states[i];
-
-      if (actrow[sym] != 0)
-	{
-	  conflicted = true;
-	  conflrow[sym] = 1;
-	}
-      actrow[sym] = state_number_as_int (shift_state->number);
-
-      /* Do not use any default reduction if there is a shift for
-	 error */
-      if (sym == errtoken->number)
-	nodefault = true;
-    }
-
-  /* See which tokens are an explicit error in this state (due to
-     %nonassoc).  For them, record ACTION_NUMBER_MINIMUM as the
-     action.  */
-  for (i = 0; i < errp->num; i++)
-    {
-      symbol *sym = errp->symbols[i];
-      actrow[sym->number] = ACTION_NUMBER_MINIMUM;
-    }
-
-  /* Now find the most common reduction and make it the default action
-     for this state.  */
-
-  if (reds->num >= 1 && !nodefault)
-    {
-      if (s->consistent)
-	default_rule = reds->rules[0];
-      else
-	{
-	  int max = 0;
-	  for (i = 0; i < reds->num; i++)
-	    {
-	      int count = 0;
-	      rule *r = reds->rules[i];
-	      symbol_number j;
-
-	      for (j = 0; j < ntokens; j++)
-		if (actrow[j] == rule_number_as_item_number (r->number))
-		  count++;
-
-	      if (count > max)
-		{
-		  max = count;
-		  default_rule = r;
-		}
-	    }
-
-	  /* GLR parsers need space for conflict lists, so we can't
-	     default conflicted entries.  For non-conflicted entries
-	     or as long as we are not building a GLR parser,
-	     actions that match the default are replaced with zero,
-	     which means "use the default". */
-
-	  if (max > 0)
-	    {
-	      int j;
-	      for (j = 0; j < ntokens; j++)
-		if (actrow[j] == rule_number_as_item_number (default_rule->number)
-		    && ! (nondeterministic_parser && conflrow[j]))
-		  actrow[j] = 0;
-	    }
-	}
-    }
-
-  /* If have no default rule, the default is an error.
-     So replace any action which says "error" with "use default".  */
-
-  if (!default_rule)
-    for (i = 0; i < ntokens; i++)
-      if (actrow[i] == ACTION_NUMBER_MINIMUM)
-	actrow[i] = 0;
-
-  if (conflicted)
-    conflict_row (s);
-
-  return default_rule;
-}
-
-
-/*----------------------------------------.
-| Set FROMS, TOS, TALLY and WIDTH for S.  |
-`----------------------------------------*/
-
-static void
-save_row (state_number s)
-{
-  symbol_number i;
-  int count;
-  base_number *sp;
-  base_number *sp1;
-  base_number *sp2;
-  unsigned int *sp3;
-
-  /* Number of non default actions in S.  */
-  count = 0;
-  for (i = 0; i < ntokens; i++)
-    if (actrow[i] != 0)
-      count++;
-
-  if (count == 0)
-    return;
-
-  /* Allocate non defaulted actions.  */
-  froms[s] = sp = sp1 = xnmalloc (count, sizeof *sp1);
-  tos[s] = sp2 = xnmalloc (count, sizeof *sp2);
-  conflict_tos[s] = sp3 =
-    nondeterministic_parser ? xnmalloc (count, sizeof *sp3) : NULL;
-
-  /* Store non defaulted actions.  */
-  for (i = 0; i < ntokens; i++)
-    if (actrow[i] != 0)
-      {
-	*sp1++ = i;
-	*sp2++ = actrow[i];
-	if (nondeterministic_parser)
-	  *sp3++ = conflrow[i];
-      }
-
-  tally[s] = count;
-  width[s] = sp1[-1] - sp[0] + 1;
-}
-
-
-/*------------------------------------------------------------------.
-| Figure out the actions for the specified state, indexed by        |
-| look-ahead token type.                                            |
-|                                                                   |
-| The YYDEFACT table is output now.  The detailed info is saved for |
-| putting into YYTABLE later.                                       |
-`------------------------------------------------------------------*/
-
-static void
-token_actions (void)
-{
-  state_number i;
-  symbol_number j;
-  rule_number r;
-
-  int nconflict = nondeterministic_parser ? conflicts_total_count () : 0;
-
-  yydefact = xnmalloc (nstates, sizeof *yydefact);
-
-  actrow = xnmalloc (ntokens, sizeof *actrow);
-  conflrow = xnmalloc (ntokens, sizeof *conflrow);
-
-  conflict_list = xnmalloc (1 + 2 * nconflict, sizeof *conflict_list);
-  conflict_list_free = 2 * nconflict;
-  conflict_list_cnt = 1;
-
-  /* Find the rules which are reduced.  */
-  if (!nondeterministic_parser)
-    for (r = 0; r < nrules; ++r)
-      rules[r].useful = false;
-
-  for (i = 0; i < nstates; ++i)
-    {
-      rule *default_rule = action_row (states[i]);
-      yydefact[i] = default_rule ? default_rule->number + 1 : 0;
-      save_row (i);
-
-      /* Now that the parser was computed, we can find which rules are
-	 really reduced, and which are not because of SR or RR
-	 conflicts.  */
-      if (!nondeterministic_parser)
-	{
-	  for (j = 0; j < ntokens; ++j)
-	    if (actrow[j] < 0 && actrow[j] != ACTION_NUMBER_MINIMUM)
-	      rules[item_number_as_rule_number (actrow[j])].useful = true;
-	  if (yydefact[i])
-	    rules[yydefact[i] - 1].useful = true;
-	}
-    }
-
-  free (actrow);
-  free (conflrow);
-}
-
-
-/*------------------------------------------------------------------.
-| Compute FROMS[VECTOR], TOS[VECTOR], TALLY[VECTOR], WIDTH[VECTOR], |
-| i.e., the information related to non defaulted GOTO on the nterm  |
-| SYM.                                                              |
-|                                                                   |
-| DEFAULT_STATE is the principal destination on SYM, i.e., the      |
-| default GOTO destination on SYM.                                  |
-`------------------------------------------------------------------*/
-
-static void
-save_column (symbol_number sym, state_number default_state)
-{
-  goto_number i;
-  base_number *sp;
-  base_number *sp1;
-  base_number *sp2;
-  int count;
-  vector_number symno = symbol_number_to_vector_number (sym);
-
-  goto_number begin = goto_map[sym - ntokens];
-  goto_number end = goto_map[sym - ntokens + 1];
-
-  /* Number of non default GOTO.  */
-  count = 0;
-  for (i = begin; i < end; i++)
-    if (to_state[i] != default_state)
-      count++;
-
-  if (count == 0)
-    return;
-
-  /* Allocate room for non defaulted gotos.  */
-  froms[symno] = sp = sp1 = xnmalloc (count, sizeof *sp1);
-  tos[symno] = sp2 = xnmalloc (count, sizeof *sp2);
-
-  /* Store the state numbers of the non defaulted gotos.  */
-  for (i = begin; i < end; i++)
-    if (to_state[i] != default_state)
-      {
-	*sp1++ = from_state[i];
-	*sp2++ = to_state[i];
-      }
-
-  tally[symno] = count;
-  width[symno] = sp1[-1] - sp[0] + 1;
-}
-
-
-/*-------------------------------------------------------------.
-| Return `the' most common destination GOTO on SYM (a nterm).  |
-`-------------------------------------------------------------*/
-
-static state_number
-default_goto (symbol_number sym, size_t state_count[])
-{
-  state_number s;
-  goto_number i;
-  goto_number m = goto_map[sym - ntokens];
-  goto_number n = goto_map[sym - ntokens + 1];
-  state_number default_state = -1;
-  size_t max = 0;
-
-  if (m == n)
-    return -1;
-
-  for (s = 0; s < nstates; s++)
-    state_count[s] = 0;
-
-  for (i = m; i < n; i++)
-    state_count[to_state[i]]++;
-
-  for (s = 0; s < nstates; s++)
-    if (state_count[s] > max)
-      {
-	max = state_count[s];
-	default_state = s;
-      }
-
-  return default_state;
-}
-
-
-/*-------------------------------------------------------------------.
-| Figure out what to do after reducing with each rule, depending on  |
-| the saved state from before the beginning of parsing the data that |
-| matched this rule.                                                 |
-|                                                                    |
-| The YYDEFGOTO table is output now.  The detailed info is saved for |
-| putting into YYTABLE later.                                        |
-`-------------------------------------------------------------------*/
-
-static void
-goto_actions (void)
-{
-  symbol_number i;
-  size_t *state_count = xnmalloc (nstates, sizeof *state_count);
-  yydefgoto = xnmalloc (nvars, sizeof *yydefgoto);
-
-  /* For a given nterm I, STATE_COUNT[S] is the number of times there
-     is a GOTO to S on I.  */
-  for (i = ntokens; i < nsyms; ++i)
-    {
-      state_number default_state = default_goto (i, state_count);
-      save_column (i, default_state);
-      yydefgoto[i - ntokens] = default_state;
-    }
-  free (state_count);
-}
-
-
-/*------------------------------------------------------------------.
-| Compute ORDER, a reordering of vectors, in order to decide how to |
-| pack the actions and gotos information into yytable.              |
-`------------------------------------------------------------------*/
-
-static void
-sort_actions (void)
-{
-  int i;
-
-  nentries = 0;
-
-  for (i = 0; i < nvectors; i++)
-    if (tally[i] > 0)
-      {
-	int k;
-	int t = tally[i];
-	int w = width[i];
-	int j = nentries - 1;
-
-	while (j >= 0 && (width[order[j]] < w))
-	  j--;
-
-	while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
-	  j--;
-
-	for (k = nentries - 1; k > j; k--)
-	  order[k + 1] = order[k];
-
-	order[j + 1] = i;
-	nentries++;
-      }
-}
-
-
-/* If VECTOR is a state which actions (reflected by FROMS, TOS, TALLY
-   and WIDTH of VECTOR) are common to a previous state, return this
-   state number.
-
-   In any other case, return -1.  */
-
-static state_number
-matching_state (vector_number vector)
-{
-  vector_number i = order[vector];
-  int t;
-  int w;
-  int prev;
-
-  /* If VECTOR is a nterm, return -1.  */
-  if (nstates <= i)
-    return -1;
-
-  t = tally[i];
-  w = width[i];
-
-  /* If VECTOR has GLR conflicts, return -1 */
-  if (conflict_tos[i] != NULL)
-    {
-      int j;
-      for (j = 0; j < t; j += 1)
-	if (conflict_tos[i][j] != 0)
-	  return -1;
-    }
-
-  for (prev = vector - 1; prev >= 0; prev--)
-    {
-      vector_number j = order[prev];
-      int k;
-      int match = 1;
-
-      /* Given how ORDER was computed, if the WIDTH or TALLY is
-	 different, there cannot be a matching state.  */
-      if (width[j] != w || tally[j] != t)
-	return -1;
-
-      for (k = 0; match && k < t; k++)
-	if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k]
-	    || (conflict_tos[j] != NULL && conflict_tos[j][k] != 0))
-	  match = 0;
-
-      if (match)
-	return j;
-    }
-
-  return -1;
-}
-
-
-static base_number
-pack_vector (vector_number vector)
-{
-  vector_number i = order[vector];
-  int j;
-  int t = tally[i];
-  int loc = 0;
-  base_number *from = froms[i];
-  base_number *to = tos[i];
-  unsigned int *conflict_to = conflict_tos[i];
-
-  assert (t);
-
-  for (j = lowzero - from[0]; ; j++)
-    {
-      int k;
-      bool ok = true;
-
-      assert (j < table_size);
-
-      for (k = 0; ok && k < t; k++)
-	{
-	  loc = j + state_number_as_int (from[k]);
-	  if (table_size <= loc)
-	    table_grow (loc);
-
-	  if (table[loc] != 0)
-	    ok = false;
-	}
-
-      for (k = 0; ok && k < vector; k++)
-	if (pos[k] == j)
-	  ok = false;
-
-      if (ok)
-	{
-	  for (k = 0; k < t; k++)
-	    {
-	      loc = j + from[k];
-	      table[loc] = to[k];
-	      if (nondeterministic_parser && conflict_to != NULL)
-		conflict_table[loc] = conflict_to[k];
-	      check[loc] = from[k];
-	    }
-
-	  while (table[lowzero] != 0)
-	    lowzero++;
-
-	  if (loc > high)
-	    high = loc;
-
-	  assert (BASE_MINIMUM <= j && j <= BASE_MAXIMUM);
-	  return j;
-	}
-    }
-}
-
-
-/*-------------------------------------------------------------.
-| Remap the negative infinite in TAB from NINF to the greatest |
-| possible smallest value.  Return it.                         |
-|                                                              |
-| In most case this allows us to use shorts instead of ints in |
-| parsers.                                                     |
-`-------------------------------------------------------------*/
-
-static base_number
-table_ninf_remap (base_number tab[], int size, base_number ninf)
-{
-  base_number res = 0;
-  int i;
-
-  for (i = 0; i < size; i++)
-    if (tab[i] < res && tab[i] != ninf)
-      res = tab[i];
-
-  --res;
-
-  for (i = 0; i < size; i++)
-    if (tab[i] == ninf)
-      tab[i] = res;
-
-  return res;
-}
-
-static void
-pack_table (void)
-{
-  int i;
-
-  base = xnmalloc (nvectors, sizeof *base);
-  pos = xnmalloc (nentries, sizeof *pos);
-  table = xcalloc (table_size, sizeof *table);
-  conflict_table = xcalloc (table_size, sizeof *conflict_table);
-  check = xnmalloc (table_size, sizeof *check);
-
-  lowzero = 0;
-  high = 0;
-
-  for (i = 0; i < nvectors; i++)
-    base[i] = BASE_MINIMUM;
-
-  for (i = 0; i < table_size; i++)
-    check[i] = -1;
-
-  for (i = 0; i < nentries; i++)
-    {
-      state_number s = matching_state (i);
-      base_number place;
-
-      if (s < 0)
-	/* A new set of state actions, or a nonterminal.  */
-	place = pack_vector (i);
-      else
-	/* Action of I were already coded for S.  */
-	place = base[s];
-
-      pos[i] = place;
-      base[order[i]] = place;
-    }
-
-  /* Use the greatest possible negative infinites.  */
-  base_ninf = table_ninf_remap (base, nvectors, BASE_MINIMUM);
-  table_ninf = table_ninf_remap (table, high + 1, ACTION_NUMBER_MINIMUM);
-
-  free (pos);
-}
-
-
-
-/*-----------------------------------------------------------------.
-| Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
-| and yycheck.                                                     |
-`-----------------------------------------------------------------*/
-
-void
-tables_generate (void)
-{
-  int i;
-
-  /* This is a poor way to make sure the sizes are properly
-     correlated.  In particular the signedness is not taken into
-     account.  But it's not useless.  */
-  verify (sizeof nstates <= sizeof nvectors
-	  && sizeof nvars <= sizeof nvectors);
-
-  nvectors = state_number_as_int (nstates) + nvars;
-
-  froms = xcalloc (nvectors, sizeof *froms);
-  tos = xcalloc (nvectors, sizeof *tos);
-  conflict_tos = xcalloc (nvectors, sizeof *conflict_tos);
-  tally = xcalloc (nvectors, sizeof *tally);
-  width = xnmalloc (nvectors, sizeof *width);
-
-  token_actions ();
-
-  goto_actions ();
-  free (goto_map);
-  free (from_state);
-  free (to_state);
-
-  order = xcalloc (nvectors, sizeof *order);
-  sort_actions ();
-  pack_table ();
-  free (order);
-
-  free (tally);
-  free (width);
-
-  for (i = 0; i < nvectors; i++)
-    {
-      free (froms[i]);
-      free (tos[i]);
-      free (conflict_tos[i]);
-    }
-
-  free (froms);
-  free (tos);
-  free (conflict_tos);
-}
-
-
-/*-------------------------.
-| Free the parser tables.  |
-`-------------------------*/
-
-void
-tables_free (void)
-{
-  free (base);
-  free (conflict_table);
-  free (conflict_list);
-  free (table);
-  free (check);
-  free (yydefgoto);
-  free (yydefact);
-}
diff --git a/src/tables.h b/src/tables.h
deleted file mode 100644
index 911917f..0000000
--- a/src/tables.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/* Prepare the LALR and GLR parser tables.
-   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
-
-#ifndef TABLES_H_
-# define TABLES_H_
-
-# include "state.h"
-
-/* The parser tables consist of these tables.
-
-   YYTRANSLATE = vector mapping yylex's token numbers into bison's
-   token numbers.
-
-   YYTNAME = vector of string-names indexed by bison token number.
-
-   YYTOKNUM = vector of yylex token numbers corresponding to entries
-   in YYTNAME.
-
-   YYRLINE = vector of line-numbers of all rules.  For yydebug
-   printouts.
-
-   YYRHS = vector of items of all rules.  This is exactly what RITEMS
-   contains.  For yydebug and for semantic parser.
-
-   YYPRHS[R] = index in YYRHS of first item for rule R.
-
-   YYR1[R] = symbol number of symbol that rule R derives.
-
-   YYR2[R] = number of symbols composing right hand side of rule R.
-
-   YYSTOS[S] = the symbol number of the symbol that leads to state S.
-
-   YYDEFACT[S] = default rule to reduce with in state s, when YYTABLE
-   doesn't specify something else to do.  Zero means the default is an
-   error.
-
-   YYDEFGOTO[I] = default state to go to after a reduction of a rule
-   that generates variable NTOKENS + I, except when YYTABLE specifies
-   something else to do.
-
-   YYPACT[S] = index in YYTABLE of the portion describing state S.
-   The look-ahead token's type is used to index that portion to find
-   out what to do.
-
-   If the value in YYTABLE is positive, we shift the token and go to
-   that state.
-
-   If the value is negative, it is minus a rule number to reduce by.
-
-   If the value is zero, the default action from YYDEFACT[S] is used.
-
-   YYPGOTO[I] = the index in YYTABLE of the portion describing what to
-   do after reducing a rule that derives variable I + NTOKENS.  This
-   portion is indexed by the parser state number, S, as of before the
-   text for this nonterminal was read.  The value from YYTABLE is the
-   state to go to if the corresponding value in YYCHECK is S.
-
-   YYTABLE = a vector filled with portions for different uses, found
-   via YYPACT and YYPGOTO.
-
-   YYCHECK = a vector indexed in parallel with YYTABLE.  It indicates,
-   in a roundabout way, the bounds of the portion you are trying to
-   examine.
-
-   Suppose that the portion of YYTABLE starts at index P and the index
-   to be examined within the portion is I.  Then if YYCHECK[P+I] != I,
-   I is outside the bounds of what is actually allocated, and the
-   default (from YYDEFACT or YYDEFGOTO) should be used.  Otherwise,
-   YYTABLE[P+I] should be used.
-
-   YYFINAL = the state number of the termination state.
-
-   YYLAST ( = high) the number of the last element of YYTABLE, i.e.,
-   sizeof (YYTABLE) - 1.  */
-
-extern int nvectors;
-
-typedef int base_number;
-extern base_number *base;
-/* A distinguished value of BASE, negative infinite.  During the
-   computation equals to BASE_MINIMUM, later mapped to BASE_NINF to
-   keep parser tables small.  */
-extern base_number base_ninf;
-
-extern unsigned int *conflict_table;
-extern unsigned int *conflict_list;
-extern int conflict_list_cnt;
-
-extern base_number *table;
-extern base_number *check;
-/* The value used in TABLE to denote explicit syntax errors
-   (%nonassoc), a negative infinite.  */
-extern base_number table_ninf;
-
-extern state_number *yydefgoto;
-extern rule_number *yydefact;
-extern int high;
-
-void tables_generate (void);
-void tables_free (void);
-
-#endif /* !TABLES_H_ */
diff --git a/src/uniqstr.c b/src/uniqstr.c
deleted file mode 100644
index 8804a80..0000000
--- a/src/uniqstr.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/* Keep a unique copy of strings.
-
-   Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <error.h>
-#include <hash.h>
-#include <quotearg.h>
-
-#include "uniqstr.h"
-
-/*-----------------------.
-| A uniqstr hash table.  |
-`-----------------------*/
-
-/* Initial capacity of uniqstr hash table.  */
-#define HT_INITIAL_CAPACITY 257
-
-static struct hash_table *uniqstrs_table = NULL;
-
-/*-------------------------------------.
-| Create the uniqstr for S if needed.  |
-`-------------------------------------*/
-
-uniqstr
-uniqstr_new (char const *str)
-{
-  uniqstr res = hash_lookup (uniqstrs_table, str);
-  if (!res)
-    {
-      /* First insertion in the hash. */
-      res = xstrdup (str);
-      hash_insert (uniqstrs_table, res);
-    }
-  return res;
-}
-
-
-/*------------------------------.
-| Abort if S is not a uniqstr.  |
-`------------------------------*/
-
-void
-uniqstr_assert (char const *str)
-{
-  if (!hash_lookup (uniqstrs_table, str))
-    {
-      error (0, 0,
-	     "not a uniqstr: %s", quotearg (str));
-      abort ();
-    }
-}
-
-
-/*--------------------.
-| Print the uniqstr.  |
-`--------------------*/
-
-static inline bool
-uniqstr_print (uniqstr ustr)
-{
-  fprintf (stderr, "%s\n", ustr);
-  return true;
-}
-
-static bool
-uniqstr_print_processor (void *ustr, void *null ATTRIBUTE_UNUSED)
-{
-  return uniqstr_print (ustr);
-}
-
-
-/*-----------------------.
-| A uniqstr hash table.  |
-`-----------------------*/
-
-static bool
-hash_compare_uniqstr (void const *m1, void const *m2)
-{
-  return strcmp (m1, m2) == 0;
-}
-
-static size_t
-hash_uniqstr (void const *m, size_t tablesize)
-{
-  return hash_string (m, tablesize);
-}
-
-/*----------------------------.
-| Create the uniqstrs table.  |
-`----------------------------*/
-
-void
-uniqstrs_new (void)
-{
-  uniqstrs_table = hash_initialize (HT_INITIAL_CAPACITY,
-				    NULL,
-				    hash_uniqstr,
-				    hash_compare_uniqstr,
-				    free);
-}
-
-
-/*-------------------------------------.
-| Perform a task on all the uniqstrs.  |
-`-------------------------------------*/
-
-static void
-uniqstrs_do (Hash_processor processor, void *processor_data)
-{
-  hash_do_for_each (uniqstrs_table, processor, processor_data);
-}
-
-
-/*-----------------.
-| Print them all.  |
-`-----------------*/
-
-void
-uniqstrs_print (void)
-{
-  uniqstrs_do (uniqstr_print_processor, NULL);
-}
-
-
-/*--------------------.
-| Free the uniqstrs.  |
-`--------------------*/
-
-void
-uniqstrs_free (void)
-{
-  hash_free (uniqstrs_table);
-}
diff --git a/src/uniqstr.h b/src/uniqstr.h
deleted file mode 100644
index ab482be..0000000
--- a/src/uniqstr.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Keeping a unique copy of strings.
-
-   Copyright (C) 2002, 2003 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef UNIQSTR_H_
-# define UNIQSTR_H_
-
-/*-----------------------------------------.
-| Pointers to unique copies of C strings.  |
-`-----------------------------------------*/
-
-typedef char const *uniqstr;
-
-/* Return the uniqstr for STR.  */
-uniqstr uniqstr_new (char const *str);
-
-/* Two uniqstr values have the same value iff they are the same.  */
-#define UNIQSTR_EQ(USTR1, USTR2) ((USTR1) == (USTR2))
-
-/*--------------------------------------.
-| Initializing, destroying, debugging.  |
-`--------------------------------------*/
-
-/* Create the string table.  */
-void uniqstrs_new (void);
-
-/* Die if STR is not a uniqstr.  */
-void uniqstr_assert (char const *str);
-
-/* Free all the memory allocated for symbols.  */
-void uniqstrs_free (void);
-
-/* Report them all.  */
-void uniqstrs_print (void);
-
-#endif /* ! defined UNIQSTR_H_ */
diff --git a/src/vcg.c b/src/vcg.c
deleted file mode 100644
index 25fbb64..0000000
--- a/src/vcg.c
+++ /dev/null
@@ -1,841 +0,0 @@
-/* VCG description handler for Bison.
-
-   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software
-   Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-#include "system.h"
-
-#include <quotearg.h>
-
-#include "vcg.h"
-#include "vcg_defaults.h"
-
-/* Return an unambiguous printable representated, for NAME, suitable
-   for C strings.  Use slot 2 since the user may use slots 0 and 1.
-   */
-
-static char const *
-quote (char const *name)
-{
-  return quotearg_n_style (2, c_quoting_style, name);
-}
-
-
-/* Initialize a graph with the default values. */
-void
-new_graph (graph *g)
-{
-  g->title = G_TITLE;
-  g->label = G_LABEL;
-
-  g->infos[0] = G_INFOS1;
-  g->infos[1] = G_INFOS2;
-  g->infos[2] = G_INFOS3;
-
-  g->color = G_COLOR;
-  g->textcolor = G_TEXTCOLOR;
-  g->bordercolor = G_BORDERCOLOR;
-
-  g->width = G_WIDTH;
-  g->height = G_HEIGHT;
-  g->borderwidth = G_BORDERWIDTH;
-  g->x = G_X;
-  g->y = G_Y;
-  g->folding = G_FOLDING;
-  g->shrink = G_SHRINK;
-  g->stretch = G_STRETCH;
-
-  g->textmode = G_TEXTMODE;
-  g->shape = G_SHAPE;
-
-  g->vertical_order = G_VERTICAL_ORDER;
-  g->horizontal_order = G_HORIZONTAL_ORDER;
-
-  g->xmax = G_XMAX; /* Not output. */
-  g->ymax = G_YMAX; /* Not output. */
-
-  g->xbase = G_XBASE;
-  g->ybase = G_YBASE;
-
-  g->xspace = G_XSPACE;
-  g->yspace = G_YSPACE;
-  g->xlspace = G_XLSPACE; /* Not output. */
-
-  g->xraster = G_XRASTER;
-  g->yraster = G_YRASTER;
-  g->xlraster = G_XLRASTER;
-
-  g->hidden = G_HIDDEN; /* No default value. */
-
-  g->classname = G_CLASSNAME; /* No class name association. */
-
-  g->layout_downfactor = G_LAYOUT_DOWNFACTOR;
-  g->layout_upfactor = G_LAYOUT_UPFACTOR;
-  g->layout_nearfactor = G_LAYOUT_NEARFACTOR;
-  g->layout_splinefactor = G_LAYOUT_SPLINEFACTOR;
-
-  g->late_edge_labels = G_LATE_EDGE_LABELS;
-  g->display_edge_labels = G_DISPLAY_EDGE_LABELS;
-  g->dirty_edge_labels = G_DIRTY_EDGE_LABELS;
-  g->finetuning = G_FINETUNING;
-  g->ignore_singles = G_IGNORE_SINGLES;
-  g->priority_phase = G_PRIORITY_PHASE;
-  g->manhattan_edges = G_MANHATTAN_EDGES;
-  g->smanhattan_edges = G_SMANHATTAN_EDGES;
-  g->near_edges = G_NEAR_EDGES;
-
-  g->orientation = G_ORIENTATION;
-  g->node_alignment = G_NODE_ALIGNMENT;
-  g->port_sharing = G_PORT_SHARING;
-  g->arrow_mode = G_ARROW_MODE;
-  g->treefactor = G_TREEFACTOR;
-  g->spreadlevel = G_SPREADLEVEL;
-  g->crossing_weight = G_CROSSING_WEIGHT;
-  g->crossing_phase2 = G_CROSSING_PHASE2;
-  g->crossing_optimization = G_CROSSING_OPTIMIZATION;
-  g->view = G_VIEW;
-
-  g->edges = G_EDGES;
-  g->nodes = G_NODES;
-  g->splines = G_SPLINES;
-
-  g->bmax = G_BMAX;
-  g->cmin = G_CMIN;
-  g->cmax = G_CMAX;
-  g->pmin = G_PMIN;
-  g->pmax = G_PMAX;
-  g->rmin = G_RMIN;
-  g->rmax = G_RMAX;
-  g->smax = G_SMAX;
-
-  g->node_list = G_NODE_LIST;
-  g->edge_list = G_EDGE_LIST;
-
-  new_edge (&g->edge);
-  new_node (&g->node);
-}
-
-/* Initialize a node with the default values. */
-void
-new_node (node *n)
-{
-  n->title = N_TITLE;
-  n->label = N_LABEL;
-
-  n->locx = N_LOCX; /* Default unspcified. */
-  n->locy = N_LOCY; /* Default unspcified. */
-
-  n->vertical_order = N_VERTICAL_ORDER;	/* Default unspcified. */
-  n->horizontal_order = N_HORIZONTAL_ORDER;	/* Default unspcified. */
-
-  n->width = N_WIDTH; /* We assume that we can't define it now. */
-  n->height = N_HEIGHT; /* Also. */
-
-  n->shrink = N_SHRINK;
-  n->stretch = N_STRETCH;
-
-  n->folding = N_FOLDING; /* No explicit default value. */
-
-  n->shape = N_SHAPE;
-  n->textmode = N_TEXTMODE;
-  n->borderwidth = N_BORDERWIDTH;
-
-  n->color = N_COLOR;
-  n->textcolor = N_TEXTCOLOR;
-  n->bordercolor = N_BORDERCOLOR;
-
-  n->infos[0] = N_INFOS1;
-  n->infos[1] = N_INFOS2;
-  n->infos[2] = N_INFOS3;
-
-  n->next = N_NEXT;
-}
-
-/* Initialize an edge with the default values. */
-void
-new_edge (edge *e)
-{
-  e->type = E_EDGE_TYPE;
-
-  e->sourcename = E_SOURCENAME;
-  e->targetname = E_TARGETNAME;
-  e->label = E_LABEL;
-
-  e->linestyle = E_LINESTYLE;
-  e->thickness = E_THICKNESS;
-
-  e->class = E_CLASS;
-
-  e->color = E_COLOR;
-  e->textcolor = E_TEXTCOLOR;
-  e->arrowcolor = E_ARROWCOLOR;
-  e->backarrowcolor = E_BACKARROWCOLOR;
-
-  e->arrowsize = E_ARROWSIZE;
-  e->backarrowsize = E_BACKARROWSIZE;
-  e->arrowstyle = E_ARROWSTYLE;
-
-  e->backarrowstyle = E_BACKARROWSTYLE;
-
-  e->priority = E_PRIORITY;
-
-  e->anchor = E_ANCHOR;
-
-  e->horizontal_order = E_HORIZONTAL_ORDER;
-
-  e->next = E_NEXT;
-}
-
-/*----------------------------------------------.
-| Get functions.	                        |
-| Return string corresponding to an enum value. |
-`----------------------------------------------*/
-
-static const char *
-get_color_str (enum color color)
-{
-  switch (color)
-    {
-    default:		abort ();
-    case white:		return "white";
-    case blue:		return "blue";
-    case red:		return "red";
-    case green:		return "green";
-    case yellow:	return "yellow";
-    case magenta:	return "magenta";
-    case cyan:		return "cyan";
-    case darkgrey:	return "darkgrey";
-    case darkblue:	return "darkblue";
-    case darkred:	return "darkred";
-    case darkgreen:	return "darkgreen";
-    case darkyellow:	return "darkyellow";
-    case darkmagenta:	return "darkmagenta";
-    case darkcyan:	return "darkcyan";
-    case gold:		return "gold";
-    case lightgrey:	return "lightgrey";
-    case lightblue:	return "lightblue";
-    case lightred:	return "lightred";
-    case lightgreen:	return "lightgreen";
-    case lightyellow:	return "lightyellow";
-    case lightmagenta:	return "lightmagenta";
-    case lightcyan:	return "lightcyan";
-    case lilac:		return "lilac";
-    case turquoise:	return "turquoise";
-    case aquamarine:	return "aquamarine";
-    case khaki:		return "khaki";
-    case purple:	return "purple";
-    case yellowgreen:	return "yellowgreen";
-    case pink:		return "pink";
-    case orange:	return "orange";
-    case orchid:	return "orchid";
-    case black:		return "black";
-    }
-}
-
-static const char *
-get_textmode_str (enum textmode textmode)
-{
-  switch (textmode)
-    {
-    default:		abort ();
-    case centered:	return "center";
-    case left_justify:	return "left_justify";
-    case right_justify:	return "right_justify";
-    }
-}
-
-static const char *
-get_shape_str (enum shape shape)
-{
-  switch (shape)
-    {
-    default:		abort ();
-    case box:		return "box";
-    case rhomb:		return "rhomb";
-    case ellipse:	return "ellipse";
-    case triangle:	return "triangle";
-    }
-}
-
-static const char *
-get_decision_str (enum decision decision)
-{
-  switch (decision)
-    {
-    default:	abort ();
-    case no:	return "no";
-    case yes:	return "yes";
-    }
-}
-
-static const char *
-get_orientation_str (enum orientation orientation)
-{
-  switch (orientation)
-    {
-    default:		abort ();
-    case top_to_bottom:	return "top_to_bottom";
-    case bottom_to_top: return "bottom_to_top";
-    case left_to_right: return "left_to_right";
-    case right_to_left: return "right_to_left";
-    }
-}
-
-static const char *
-get_node_alignment_str (enum alignment alignment)
-{
-  switch (alignment)
-    {
-    default:		abort ();
-    case center:	return "center";
-    case top:		return "top";
-    case bottom:	return "bottom";
-    }
-}
-
-static const char *
-get_arrow_mode_str (enum arrow_mode arrow_mode)
-{
-  switch (arrow_mode)
-    {
-    default:		abort ();
-    case fixed:		return "fixed";
-    case free_a:	return "free";
-    }
-}
-
-static const char *
-get_crossing_type_str (enum crossing_type crossing_type)
-{
-  switch (crossing_type)
-    {
-    default:		abort ();
-    case bary:		return "bary";
-    case median:	return "median";
-    case barymedian:	return "barymedian";
-    case medianbary:	return "medianbary";
-    }
-}
-
-static const char *
-get_view_str (enum view view)
-{
-  /* There is no way with vcg 1.30 to specify a normal view explicitly,
-     so it is an error here if view == normal_view.  */
-  switch (view)
-    {
-    default:		abort ();
-    case cfish:		return "cfish";
-    case pfish:		return "pfish";
-    case fcfish:	return "fcfish";
-    case fpfish:	return "fpfish";
-    }
-}
-
-static const char *
-get_linestyle_str (enum linestyle linestyle)
-{
-  switch (linestyle)
-    {
-    default:		abort ();
-    case continuous:	return "continuous";
-    case dashed:	return "dashed";
-    case dotted:	return "dotted";
-    case invisible:	return "invisible";
-    }
-}
-
-static const char *
-get_arrowstyle_str (enum arrowstyle arrowstyle)
-{
-  switch (arrowstyle)
-    {
-    default:	abort ();
-    case solid:	return "solid";
-    case line:	return "line";
-    case none:	return "none";
-    }
-}
-
-/*------------------------------.
-| Add functions.	        |
-| Edge and nodes into a graph.  |
-`------------------------------*/
-
-void
-add_node (graph *g, node *n)
-{
-  n->next = g->node_list;
-  g->node_list = n;
-}
-
-void
-add_edge (graph *g, edge *e)
-{
-  e->next = g->edge_list;
-  g->edge_list = e;
-}
-
-void
-add_classname (graph *g, int val, const char *name)
-{
-  struct classname *classname = xmalloc (sizeof *classname);
-  classname->no = val;
-  classname->name = name;
-  classname->next = g->classname;
-  g->classname = classname;
-}
-
-void
-add_infoname (graph *g, int integer, const char *str)
-{
-  struct infoname *infoname = xmalloc (sizeof *infoname);
-  infoname->integer = integer;
-  infoname->chars = str;
-  infoname->next = g->infoname;
-  g->infoname = infoname;
-}
-
-/* Build a colorentry struct and add it to the list.  */
-void
-add_colorentry (graph *g, int color_idx, int red_cp,
-		int green_cp, int blue_cp)
-{
-  struct colorentry *ce = xmalloc (sizeof *ce);
-  ce->color_index = color_idx;
-  ce->red_cp = red_cp;
-  ce->green_cp = green_cp;
-  ce->blue_cp = blue_cp;
-  ce->next = g->colorentry;
-  g->colorentry = ce;
-}
-
-/*-------------------------------------.
-| Open and close functions (formatted) |
-`-------------------------------------*/
-
-void
-open_edge (edge *e, FILE *fout)
-{
-  switch (e->type)
-    {
-    case normal_edge:
-      fputs ("\tedge: {\n", fout);
-      break;
-    case back_edge:
-      fputs ("\tbackedge: {\n", fout);
-      break;
-    case near_edge:
-      fputs ("\tnearedge: {\n", fout);
-      break;
-    case bent_near_edge:
-      fputs ("\tbentnearedge: {\n", fout);
-      break;
-    default:
-      fputs ("\tedge: {\n", fout);
-    }
-}
-
-void
-close_edge (FILE *fout)
-{
-  fputs ("\t}\n", fout);
-}
-
-void
-open_node (FILE *fout)
-{
-  fputs ("\tnode: {\n", fout);
-}
-
-void
-close_node (FILE *fout)
-{
-  fputs ("\t}\n", fout);
-}
-
-void
-open_graph (FILE *fout)
-{
-  fputs ("graph: {\n", fout);
-}
-
-void
-close_graph (graph *g, FILE *fout)
-{
-  fputc ('\n', fout);
-
-  /* FIXME: Unallocate nodes and edges if required.  */
-  {
-    node *n;
-
-    for (n = g->node_list; n; n = n->next)
-      {
-	open_node (fout);
-	output_node (n, fout);
-	close_node (fout);
-      }
-  }
-
-  fputc ('\n', fout);
-
-  {
-    edge *e;
-
-    for (e = g->edge_list; e; e = e->next)
-      {
-	open_edge (e, fout);
-	output_edge (e, fout);
-	close_edge (fout);
-      }
-  }
-
-  fputs ("}\n", fout);
-}
-
-/*-------------------------------------------.
-| Output functions (formatted) in file FOUT  |
-`-------------------------------------------*/
-
-void
-output_node (node *n, FILE *fout)
-{
-  if (n->title != N_TITLE)
-    fprintf (fout, "\t\ttitle:\t%s\n", quote (n->title));
-  if (n->label != N_LABEL)
-    fprintf (fout, "\t\tlabel:\t%s\n", quote (n->label));
-
-  if ((n->locx != N_LOCX) && (n->locy != N_LOCY))
-    fprintf (fout, "\t\tloc { x: %d  y: %d }\t\n", n->locx, n->locy);
-
-  if (n->vertical_order != N_VERTICAL_ORDER)
-    fprintf (fout, "\t\tvertical_order:\t%d\n", n->vertical_order);
-  if (n->horizontal_order != N_HORIZONTAL_ORDER)
-    fprintf (fout, "\t\thorizontal_order:\t%d\n", n->horizontal_order);
-
-  if (n->width != N_WIDTH)
-    fprintf (fout, "\t\twidth:\t%d\n", n->width);
-  if (n->height != N_HEIGHT)
-    fprintf (fout, "\t\theight:\t%d\n", n->height);
-
-  if (n->shrink != N_SHRINK)
-    fprintf (fout, "\t\tshrink:\t%d\n", n->shrink);
-  if (n->stretch != N_STRETCH)
-    fprintf (fout, "\t\tstretch:\t%d\n", n->stretch);
-
-  if (n->folding != N_FOLDING)
-    fprintf (fout, "\t\tfolding:\t%d\n", n->folding);
-
-  if (n->textmode != N_TEXTMODE)
-    fprintf (fout, "\t\ttextmode:\t%s\n",
-	     get_textmode_str (n->textmode));
-
-  if (n->shape != N_SHAPE)
-    fprintf (fout, "\t\tshape:\t%s\n", get_shape_str (n->shape));
-
-  if (n->borderwidth != N_BORDERWIDTH)
-    fprintf (fout, "\t\tborderwidth:\t%d\n", n->borderwidth);
-
-  if (n->color != N_COLOR)
-    fprintf (fout, "\t\tcolor:\t%s\n", get_color_str (n->color));
-  if (n->textcolor != N_TEXTCOLOR)
-    fprintf (fout, "\t\ttextcolor:\t%s\n",
-	     get_color_str (n->textcolor));
-  if (n->bordercolor != N_BORDERCOLOR)
-    fprintf (fout, "\t\tbordercolor:\t%s\n",
-	     get_color_str (n->bordercolor));
-
-  {
-    int i;
-    for (i = 0; i < 3; ++i)
-      if (n->infos[i])
-	fprintf (fout, "\t\tinfo%d:\t%s\n",
-		 i, quote (n->infos[i]));
-  }
-}
-
-void
-output_edge (edge *e, FILE *fout)
-{
-  /* FIXME: SOURCENAME and TARGETNAME are mandatory
-     so it has to be fatal not to give these informations.  */
-  if (e->sourcename != E_SOURCENAME)
-    fprintf (fout, "\t\tsourcename:\t%s\n", quote (e->sourcename));
-  if (e->targetname != E_TARGETNAME)
-    fprintf (fout, "\t\ttargetname:\t%s\n", quote (e->targetname));
-
-  if (e->label != E_LABEL)
-    fprintf (fout, "\t\tlabel:\t%s\n", quote (e->label));
-
-  if (e->linestyle != E_LINESTYLE)
-    fprintf (fout, "\t\tlinestyle:\t%s\n", get_linestyle_str (e->linestyle));
-
-  if (e->thickness != E_THICKNESS)
-    fprintf (fout, "\t\tthickness:\t%d\n", e->thickness);
-  if (e->class != E_CLASS)
-    fprintf (fout, "\t\tclass:\t%d\n", e->class);
-
-  if (e->color != E_COLOR)
-    fprintf (fout, "\t\tcolor:\t%s\n", get_color_str (e->color));
-  if (e->color != E_TEXTCOLOR)
-    fprintf (fout, "\t\ttextcolor:\t%s\n",
-	     get_color_str (e->textcolor));
-  if (e->arrowcolor != E_ARROWCOLOR)
-    fprintf (fout, "\t\tarrowcolor:\t%s\n",
-	     get_color_str (e->arrowcolor));
-  if (e->backarrowcolor != E_BACKARROWCOLOR)
-    fprintf (fout, "\t\tbackarrowcolor:\t%s\n",
-	     get_color_str (e->backarrowcolor));
-
-  if (e->arrowsize != E_ARROWSIZE)
-    fprintf (fout, "\t\tarrowsize:\t%d\n", e->arrowsize);
-  if (e->backarrowsize != E_BACKARROWSIZE)
-    fprintf (fout, "\t\tbackarrowsize:\t%d\n", e->backarrowsize);
-
-  if (e->arrowstyle != E_ARROWSTYLE)
-    fprintf (fout, "\t\tarrowstyle:\t%s\n",
-	     get_arrowstyle_str (e->arrowstyle));
-  if (e->backarrowstyle != E_BACKARROWSTYLE)
-    fprintf (fout, "\t\tbackarrowstyle:\t%s\n",
-	     get_arrowstyle_str (e->backarrowstyle));
-
-  if (e->priority != E_PRIORITY)
-    fprintf (fout, "\t\tpriority:\t%d\n", e->priority);
-  if (e->anchor != E_ANCHOR)
-    fprintf (fout, "\t\tanchor:\t%d\n", e->anchor);
-  if (e->horizontal_order != E_HORIZONTAL_ORDER)
-    fprintf (fout, "\t\thorizontal_order:\t%d\n", e->horizontal_order);
-}
-
-void
-output_graph (graph *g, FILE *fout)
-{
-  if (g->title)
-    fprintf (fout, "\ttitle:\t%s\n", quote (g->title));
-  if (g->label)
-    fprintf (fout, "\tlabel:\t%s\n", quote (g->label));
-
-  {
-    int i;
-    for (i = 0; i < 3; ++i)
-      if (g->infos[i])
-	fprintf (fout, "\tinfo%d:\t%s\n", i, quote (g->infos[i]));
-  }
-
-  if (g->color != G_COLOR)
-    fprintf (fout, "\tcolor:\t%s\n", get_color_str (g->color));
-  if (g->textcolor != G_TEXTCOLOR)
-    fprintf (fout, "\ttextcolor:\t%s\n", get_color_str (g->textcolor));
-  if (g->bordercolor != G_BORDERCOLOR)
-    fprintf (fout, "\tbordercolor:\t%s\n",
-	     get_color_str (g->bordercolor));
-
-  if (g->width != G_WIDTH)
-    fprintf (fout, "\twidth:\t%d\n", g->width);
-  if (g->height != G_HEIGHT)
-    fprintf (fout, "\theight:\t%d\n", g->height);
-  if (g->borderwidth != G_BORDERWIDTH)
-    fprintf (fout, "\tborderwidth:\t%d\n", g->borderwidth);
-
-  if (g->x != G_X)
-    fprintf (fout, "\tx:\t%d\n", g->x);
-  if (g->y != G_Y)
-    fprintf (fout, "\ty:\t%d\n", g->y);
-
-  if (g->folding != G_FOLDING)
-    fprintf (fout, "\tfolding:\t%d\n", g->folding);
-
-  if (g->shrink != G_SHRINK)
-    fprintf (fout, "\tshrink:\t%d\n", g->shrink);
-  if (g->stretch != G_STRETCH)
-    fprintf (fout, "\tstretch:\t%d\n", g->stretch);
-
-  if (g->textmode != G_TEXTMODE)
-    fprintf (fout, "\ttextmode:\t%s\n",
-	     get_textmode_str (g->textmode));
-
-  if (g->shape != G_SHAPE)
-    fprintf (fout, "\tshape:\t%s\n", get_shape_str (g->shape));
-
-  if (g->vertical_order != G_VERTICAL_ORDER)
-    fprintf (fout, "\tvertical_order:\t%d\n", g->vertical_order);
-  if (g->horizontal_order != G_HORIZONTAL_ORDER)
-    fprintf (fout, "\thorizontal_order:\t%d\n", g->horizontal_order);
-
-  if (g->xmax != G_XMAX)
-    fprintf (fout, "\txmax:\t%d\n", g->xmax);
-  if (g->ymax != G_YMAX)
-    fprintf (fout, "\tymax:\t%d\n", g->ymax);
-
-  if (g->xbase != G_XBASE)
-    fprintf (fout, "\txbase:\t%d\n", g->xbase);
-  if (g->ybase != G_YBASE)
-    fprintf (fout, "\tybase:\t%d\n", g->ybase);
-
-  if (g->xspace != G_XSPACE)
-    fprintf (fout, "\txspace:\t%d\n", g->xspace);
-  if (g->yspace != G_YSPACE)
-    fprintf (fout, "\tyspace:\t%d\n", g->yspace);
-  if (g->xlspace != G_XLSPACE)
-    fprintf (fout, "\txlspace:\t%d\n", g->xlspace);
-
-  if (g->xraster != G_XRASTER)
-    fprintf (fout, "\txraster:\t%d\n", g->xraster);
-  if (g->yraster != G_YRASTER)
-    fprintf (fout, "\tyraster:\t%d\n", g->yraster);
-  if (g->xlraster != G_XLRASTER)
-    fprintf (fout, "\txlraster:\t%d\n", g->xlraster);
-
-  if (g->hidden != G_HIDDEN)
-    fprintf (fout, "\thidden:\t%d\n", g->hidden);
-
-  /* FIXME: Unallocate struct list if required.
-     Maybe with a little function.  */
-  if (g->classname != G_CLASSNAME)
-    {
-      struct classname *ite;
-
-      for (ite = g->classname; ite; ite = ite->next)
-	fprintf (fout, "\tclassname %d :\t%s\n", ite->no, ite->name);
-    }
-
-  if (g->infoname != G_INFONAME)
-    {
-      struct infoname *ite;
-
-      for (ite = g->infoname; ite; ite = ite->next)
-	fprintf (fout, "\tinfoname %d :\t%s\n", ite->integer, ite->chars);
-    }
-
-  if (g->colorentry != G_COLORENTRY)
-    {
-      struct colorentry *ite;
-
-      for (ite = g->colorentry; ite; ite = ite->next)
-	{
-	  fprintf (fout, "\tcolorentry %d :\t%d %d %d\n",
-		   ite->color_index,
-		   ite->red_cp,
-		   ite->green_cp,
-		   ite->blue_cp);
-	}
-    }
-
-  if (g->layout_downfactor != G_LAYOUT_DOWNFACTOR)
-    fprintf (fout, "\tlayout_downfactor:\t%d\n", g->layout_downfactor);
-  if (g->layout_upfactor != G_LAYOUT_UPFACTOR)
-    fprintf (fout, "\tlayout_upfactor:\t%d\n", g->layout_upfactor);
-  if (g->layout_nearfactor != G_LAYOUT_NEARFACTOR)
-    fprintf (fout, "\tlayout_nearfactor:\t%d\n", g->layout_nearfactor);
-  if (g->layout_splinefactor != G_LAYOUT_SPLINEFACTOR)
-    fprintf (fout, "\tlayout_splinefactor:\t%d\n",
-	     g->layout_splinefactor);
-
-  if (g->late_edge_labels != G_LATE_EDGE_LABELS)
-    fprintf (fout, "\tlate_edge_labels:\t%s\n",
-	     get_decision_str (g->late_edge_labels));
-  if (g->display_edge_labels != G_DISPLAY_EDGE_LABELS)
-    fprintf (fout, "\tdisplay_edge_labels:\t%s\n",
-	     get_decision_str (g->display_edge_labels));
-  if (g->dirty_edge_labels != G_DIRTY_EDGE_LABELS)
-    fprintf (fout, "\tdirty_edge_labels:\t%s\n",
-	     get_decision_str (g->dirty_edge_labels));
-  if (g->finetuning != G_FINETUNING)
-    fprintf (fout, "\tfinetuning:\t%s\n",
-	     get_decision_str (g->finetuning));
-  if (g->ignore_singles != G_IGNORE_SINGLES)
-    fprintf (fout, "\tignore_singles:\t%s\n",
-	     get_decision_str (g->ignore_singles));
-  if (g->priority_phase != G_PRIORITY_PHASE)
-    fprintf (fout, "\tpriority_phase:\t%s\n",
-	     get_decision_str (g->priority_phase));
-  if (g->manhattan_edges != G_MANHATTAN_EDGES)
-    fprintf (fout,
-	     "\tmanhattan_edges:\t%s\n",
-	     get_decision_str (g->manhattan_edges));
-  if (g->smanhattan_edges != G_SMANHATTAN_EDGES)
-    fprintf (fout,
-	     "\tsmanhattan_edges:\t%s\n",
-	     get_decision_str (g->smanhattan_edges));
-  if (g->near_edges != G_NEAR_EDGES)
-    fprintf (fout, "\tnear_edges:\t%s\n",
-	     get_decision_str (g->near_edges));
-
-  if (g->orientation != G_ORIENTATION)
-    fprintf (fout, "\torientation:\t%s\n",
-	     get_orientation_str (g->orientation));
-
-  if (g->node_alignment != G_NODE_ALIGNMENT)
-    fprintf (fout, "\tnode_alignment:\t%s\n",
-	     get_node_alignment_str (g->node_alignment));
-
-  if (g->port_sharing != G_PORT_SHARING)
-    fprintf (fout, "\tport_sharing:\t%s\n",
-	     get_decision_str (g->port_sharing));
-
-  if (g->arrow_mode != G_ARROW_MODE)
-    fprintf (fout, "\tarrow_mode:\t%s\n",
-	     get_arrow_mode_str (g->arrow_mode));
-
-  if (g->treefactor != G_TREEFACTOR)
-    fprintf (fout, "\ttreefactor:\t%f\n", g->treefactor);
-  if (g->spreadlevel != G_SPREADLEVEL)
-    fprintf (fout, "\tspreadlevel:\t%d\n", g->spreadlevel);
-
-  if (g->crossing_weight != G_CROSSING_WEIGHT)
-    fprintf (fout, "\tcrossing_weight:\t%s\n",
-	     get_crossing_type_str (g->crossing_weight));
-  if (g->crossing_phase2 != G_CROSSING_PHASE2)
-    fprintf (fout, "\tcrossing_phase2:\t%s\n",
-	     get_decision_str (g->crossing_phase2));
-  if (g->crossing_optimization != G_CROSSING_OPTIMIZATION)
-    fprintf (fout, "\tcrossing_optimization:\t%s\n",
-	     get_decision_str (g->crossing_optimization));
-
-  if (g->view != normal_view)
-    fprintf (fout, "\tview:\t%s\n", get_view_str (g->view));
-
-  if (g->edges != G_EDGES)
-    fprintf (fout, "\tedges:\t%s\n", get_decision_str (g->edges));
-
-  if (g->nodes != G_NODES)
-    fprintf (fout,"\tnodes:\t%s\n", get_decision_str (g->nodes));
-
-  if (g->splines != G_SPLINES)
-    fprintf (fout, "\tsplines:\t%s\n", get_decision_str (g->splines));
-
-  if (g->bmax != G_BMAX)
-    fprintf (fout, "\tbmax:\t%d\n", g->bmax);
-  if (g->cmin != G_CMIN)
-    fprintf (fout, "\tcmin:\t%d\n", g->cmin);
-  if (g->cmax != G_CMAX)
-    fprintf (fout, "\tcmax:\t%d\n", g->cmax);
-  if (g->pmin != G_PMIN)
-    fprintf (fout, "\tpmin:\t%d\n", g->pmin);
-  if (g->pmax != G_PMAX)
-    fprintf (fout, "\tpmax:\t%d\n", g->pmax);
-  if (g->rmin != G_RMIN)
-    fprintf (fout, "\trmin:\t%d\n", g->rmin);
-  if (g->rmax != G_RMAX)
-    fprintf (fout, "\trmax:\t%d\n", g->rmax);
-  if (g->smax != G_SMAX)
-    fprintf (fout, "\tsmax:\t%d\n", g->smax);
-}
diff --git a/src/vcg.h b/src/vcg.h
deleted file mode 100644
index ed35603..0000000
--- a/src/vcg.h
+++ /dev/null
@@ -1,963 +0,0 @@
-/* VCG description handler for Bison.
-
-   Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef VCG_H_
-# define VCG_H_
-
-/* VCG color map. The 32 prime predefined colors. */
-enum color
-{
-  white		= 0,
-  blue,
-  red,
-  green		= 3,
-  yellow,
-  magenta,
-  cyan		= 6,
-  darkgrey,
-  darkblue,
-  darkred	= 9,
-  darkgreen,
-  darkyellow,
-  darkmagenta	= 12,
-  darkcyan,
-  gold,
-  lightgrey	= 15,
-  lightblue,
-  lightred,
-  lightgreen	= 18,
-  lightyellow,
-  lightmagenta,
-  lightcyan	= 21,
-  lilac,
-  turquoise,
-  aquamarine	= 24,
-  khaki,
-  purple,
-  yellowgreen	= 27,
-  pink,
-  orange,
-  orchid,
-  black		= 31
-};
-
-/* VCG textmode. Specify the adjustement of the text within the border of a summary node. */
-enum textmode
-{
-  centered,
-  left_justify,
-  right_justify
-};
-
-/* VCG shapes. Used for nodes shapes. */
-enum shape
-{
-  box,
-  rhomb,
-  ellipse,
-  triangle
-};
-
-/* Structure for colorentries.  */
-struct colorentry
-{
-  int color_index;
-  int red_cp;
-  int green_cp;
-  int blue_cp;
-  struct colorentry *next;
-};
-
-/* Structure to construct lists of classnames. */
-struct classname
-{
-  int no; /* Class number */
-  const char *name; /* Name associated to the class no. */
-  struct classname *next; /* next name class association. */
-};
-
-/* Structure is in infoname.  */
-struct infoname
-{
-  int integer;
-  char const *chars;
-  struct infoname *next;
-};
-
-/* VCG decision yes/no. */
-enum decision
-{
-  yes,
-  no
-};
-
-/* VCG graph orientation. */
-enum orientation
-{
-  top_to_bottom,
-  bottom_to_top,
-  left_to_right,
-  right_to_left
-};
-
-/* VCG alignment for node alignement. */
-enum alignment
-{
-  center,
-  top,
-  bottom
-};
-
-/* VCG arrow mode. */
-enum arrow_mode
-{
-  fixed,
-  free_a
-};
-
-/* VCG crossing weight type. */
-enum crossing_type
-{
-  bary,
-  median,
-  barymedian,
-  medianbary
-};
-
-/* VCG views. */
-enum view
-{
-  normal_view,
-  cfish,
-  pfish,
-  fcfish,
-  fpfish
-};
-
-/*------------------------------------------------------.
-| Node attributs list. structure that describes a node. |
-`------------------------------------------------------*/
-
-struct node
-{
-  /* Title the unique string identifying the node. This attribute is
-     mandatory. */
-  const char *title;
-
-  /* Label the text displayed inside the node. If no label is specified
-     then the title of the node will be used. Note that this text may
-     contain control characters like NEWLINE that influences the size of
-     the node. */
-  const char *label;
-
-  /* loc is the location as x, y position relatively to the system of
-     coordinates of the graph. Locations are specified in the form
-     loc: - x: xpos y: ypos "". The locations of nodes are only valid,
-     if the whole graph is fully specified with locations and no part is
-     folded. The layout algorithm of the tool calculates appropriate x, y
-     positions, if at least one node that must be drawn (i.e., is not
-     hidden by folding or edge classes) does not have fixed specified
-     locations.
-     Default is none. */
-  int locx;
-  int locy;
-
-  /* vertical order is the level position (rank) of the node. We can also
-     specify level: int. Level specifications are only valid, if the
-     layout is calculated, i.e. if at least one node does not have a
-     fixed location specification. The layout algorithm partitioned all
-     nodes into levels 0...maxlevel. Nodes at the level 0 are on the
-     upper corner. The algorithm is able to calculate appropriate levels
-     for the nodes automatically, if no fixed levels are given.
-     Specifications of levels are additional constraints, that may be
-     ignored, if they are in conflict with near edge specifications.
-     Default values are unspecified. */
-  int vertical_order;
-
-  /* horizontal order is the horizontal position of the node within a
-     level. The nodes which are specified with horizontal positions are
-     ordered according to these positions within the levels. The nodes
-     which do not have this attribute are inserted into this ordering by
-     the crossing reduction mechanism. Note that connected components are
-     handled separately, thus it is not possible to intermix such
-     components by specifying a horizontal order. If the algorithm for
-     downward laid out trees is used, the horizontal order influences
-     only the order of the child nodes at a node, but not the order of
-     the whole level.
-     Default is unspecified. */
-  int horizontal_order;
-
-  /* width, height is the width and height of a node including the border.
-     If no value (in pixels) is given then width and height are
-     calculated from the size of the label.
-     Default are width and height of the label. */
-  int width;
-  int height;
-
-  /* shrink, stretch gives the shrinking and stretching factor of the
-     node. The values of the attributes width, height, borderwidth and
-     the size of the label text is scaled by ((stretch=shrink) \Lambda
-     100) percent. Note that the actual scale value is determined by the
-     scale value of a node relatively to a scale value of the graph,
-     i.e. if (stretch,shrink) = (2,1) for the graph and (stretch,shrink)
-     = (2,1) for the node of the graph, then the node is scaled by the
-     factor 4 compared to the normal size. The scale value can also be
-     specified by scaling: float.
-     Default are 1,1. */
-  int shrink;
-  int stretch;
-
-  /* folding specifies the default folding of the nodes. The folding k
-     (with k ? 0) means that the graph part that is reachable via edges
-     of a class less or equal to k is folded and displayed as one node.
-     There are commands to unfold such summary nodes, see section 5. If
-     no folding is specified for a node, then the node may be folded if
-     it is in the region of another node that starts the folding. If
-     folding 0 is specified, then the node is never folded. In this case
-     the folding stops at the predecessors of this node, if it is
-     reachable from another folding node. The summary node inherits some
-     attributes from the original node which starts the folding (all
-     color attributes, textmode and label, but not the location). A
-     folded region may contain folded regions with smaller folding class
-     values (nested foldings). If there is more than one node that start
-     the folding of the same region (this implies that the folding class
-     values are equal) then the attributes are inherited by one of these
-     nodes nondeterministically. If foldnode attributes are specified,
-     then the summary node attributes are inherited from these attributes.
-     Default is none. */
-  int folding;
-
-  /* shape specifies the visual appearance of a node: box, rhomb, ellipse,
-     and triangle. The drawing of ellipses is much slower than the drawing
-     of the other shapes.
-     Default is box. */
-  enum shape shape;
-
-  /* textmode specifies the adjustment of the text within the border of a
-     node. The possibilities are center, left.justify and right.justify.
-     Default is center. */
-  enum textmode textmode;
-
-  /* borderwidth specifies the thickness of the node's border in pixels.
-     color is the background color of the node. If none is given, the
-     node is white. For the possibilities, see the attribute color for
-     graphs.
-     Default is 2. */
-  int borderwidth;
-
-  /* node color.
-     Default is white or transparent, */
-  enum color color;
-
-  /* textcolor is the color for the label text. bordercolor is the color
-     of the border. Default color is the textcolor. info1, info2, info3
-     combines additional text labels with a node or a folded graph. info1,
-     Default is black. */
-  enum color textcolor;
-
-  /* info2, info3 can be selected from the menu. The corresponding text
-     labels can be shown by mouse clicks on nodes.
-     Default are null strings. */
-  const char *infos[3];
-
-  /* Node border color.
-     Default is textcolor. */
-  enum color bordercolor;
-
-  /* Next node node... */
-  struct node *next;
-};
-
-/* typedef alias. */
-typedef struct node node;
-
-/*-------------------------------------------------------.
-| Edge attributs list. Structure that describes an edge. |
-`-------------------------------------------------------*/
-
-/* VCG Edge type. */
-enum edge_type
-{
-  normal_edge,
-  back_edge,
-  near_edge,
-  bent_near_edge
-};
-
-/* Structs enum definitions for edges. */
-enum linestyle
-{
-  continuous,
-  dashed,
-  dotted,
-  invisible
-};
-
-enum arrowstyle
-{
-  solid,
-  line,
-  none
-};
-
-/* The struct edge itself. */
-struct edge
-{
-
-  /* Edge type.
-     Default is normal edge. */
-  enum edge_type type;
-
-  /* Sourcename is the title of the source node of the edge.
-     Default: none. */
-  const char *sourcename; /* Mandatory. */
-
-  /* Targetname is the title of the target node of the edge.
-     Default: none. */
-  const char *targetname; /* Mandatory. */
-
-  /* Label specifies the label of the edge. It is drawn if
-     display.edge.labels is set to yes.
-     Default: no label. */
-  const char *label;
-
-  /* Linestyle specifies the style the edge is drawn. Possibilities are:
-     ffl continuous a solid line is drawn ( -- ) ffl dashed the edge
-     consists of single dashes ( - - - ) ffl dotted the edge is made of
-     single dots ( \Delta  \Delta  \Delta  ) ffl invisible the edge is not
-     drawn. The attributes of its shape (color, thickness) are ignored.
-     To draw a dashed or dotted line needs more time than solid lines.
-     Default is continuous. */
-  enum linestyle linestyle;
-
-  /* Thickness is the thickness of an edge.
-     Default is 2. */
-  int thickness;
-
-  /* Class specifies the folding class of the edge. Nodes reachable by
-     edges of a class less or equal to a constant k specify folding
-     regions of k. See the node attribute folding and the folding commands.
-     Default is 1. */
-  int class;
-
-  /* color is the color of the edge.
-     Default is black. */
-  enum color color;
-
-  /* textcolor is the color of the label of the edge. arrowcolor,
-     backarrowcolor is the color of the arrow head and of the backarrow
-     head. priority The positions of the nodes are mainly determined by
-     the incoming and outgoing edges. One can think of rubberbands instead
-     of edges that pull a node into its position. The priority of an edges
-     corresponds to the strength of the rubberband.
-     Default is color. */
-  enum color textcolor;
-
-  /* Arrow color.
-     Default is color. */
-  enum color arrowcolor;
-
-  /* BackArrow color.
-     Default is color. */
-  enum color backarrowcolor;
-
-  /* arrowsize, backarrowsize The arrow head is a right-angled, isosceles
-     triangle and the cathetuses have length arrowsize.
-     Default is 10. */
-  int arrowsize;
-
-  /* Backarrow size
-     Default is 0. */
-  int backarrowsize;
-
-  /* arrowstyle, backarrowstyle Each edge has two arrow heads: the one
-     appears at the target node (the normal arrow head), the other appears
-     at the source node (the backarrow head). Normal edges only have the
-     normal solid arrow head, while the backarrow head is not drawn, i.e.
-     it is none. Arrowstyle is the style of the normal arrow head, and
-     backarrowstyle is the style of the backarrow head. Styles are none,
-     i.e. no arrow head, solid, and line.
-     Default is solid. */
-  enum arrowstyle arrowstyle;
-
-  /* Default is none. */
-  enum arrowstyle backarrowstyle;
-
-  /* Default is 1. */
-  int priority;
-
-  /* Anchor. An anchor point describes the vertical position in a node
-     where an edge goes out. This is useful, if node labels are several
-     lines long, and outgoing edges are related to label lines. (E.g.,
-     this allows a nice visualization of structs containing pointers as
-     fields.).
-     Default is none. */
-  int anchor;
-
-  /* Horizontal order is the horizontal position the edge. This is of
-     interest only if the edge crosses several levels because it specifies
-     the point where the edge crosses the level. within a level. The nodes
-     which are specified with horizontal positions are ordered according
-     to these positions within a level. The horizontal position of a long
-     edge that crosses the level specifies between which two node of that
-     level the edge has to be drawn. Other edges which do not have this
-     attribute are inserted into this ordering by the crossing reduction
-     mechanism. Note that connected components are handled separately,
-     thus it is not possible to intermix such components by specifying a
-     horizontal order.
-     Default is unspcified. */
-  int horizontal_order;
-
-  /*
-  ** Next edge node...
-  */
-  struct edge *next;
-
-};
-
-/*
-** typedef alias.
-*/
-typedef struct edge edge;
-
-/*--------------------------------------------------------.
-| Graph attributs list. Structure that describes a graph. |
-`--------------------------------------------------------*/
-
-struct graph
-{
-  /* Graph title or name.
-     Title specifies the name (a string) associated with the graph. The
-     default name of a subgraph is the name of the outer graph, and the
-     name of the outmost graph is the name of the specification input
-     file. The name of a graph is used to identify this graph, e.g., if
-     we want to express that an edge points to a subgraph. Such edges
-     point to the root of the graph, i.e. the first node of the graph or
-     the root of the first subgraph in the graph, if the subgraph is
-     visualized explicitly.
-     By default, it's the name of the vcg graph file description. */
-  const char *title;
-
-  /* Graph label.
-     Label the text displayed inside the node, when the graph is folded
-     to a node. If no label is specified then the title of the graph will
-     be used. Note that this text may contain control characters like
-     NEWLINE that influences the size of the node.
-     By default, it takes the title value */
-  const char *label;
-
-  /* Any informations.
-     Info1, info2, info3 combines additional text labels with a node or a
-     folded graph. info1, info2, info3 can be selected from the menu
-     interactively. The corresponding text labels can be shown by mouse
-     clicks on nodes.
-     Default values are empty strings (here NULL pointers) */
-  const char *infos[3];
-
-  /* Background color and summary node colors
-     Color specifies the background color for the outermost graph, or the
-     color of the summary node for subgraphs. Colors are given in the enum
-     declared above. If more than these default colors are needed, a
-     color map with maximal 256 entries can be used. The first 32 entries
-     correspond to the colors just listed. A color of the color map can
-     selected by the color map index, an integer, for instance red has
-     index 2, green has index 3, etc.
-     Default is white for background and white or transparent for summary
-     nodes. */
-  enum color color;
-
-  /* Textcolor.
-     need explanations ???
-     default is black for summary nodes. */
-  enum color textcolor;
-
-  /* Bordercolor is the color of the summary node's border. Default color
-     is the textcolor. width, height are width and height of the
-     displayed part of the window of the outermost graph in pixels, or
-     width and height of the summary node of inner subgraphs.
-     Default is the default of the textcolor. */
-  enum color bordercolor;
-
-  /* Width, height are width and height of the displayed part of the
-     window of the outermost graph in pixels, or width and height of the
-     summary node of inner subgraphs.
-     Default value is 100. */
-  int width;
-  int height;
-
-  /* Specify the thickness if summary node's border in pixels.
-     default value is 2. */
-  int borderwidth;
-
-  /* x, y are the x-position and y-position of the graph's window in
-     pixels, relatively to the root screen, if it is the outermost graph.
-     The origin of the window is upper, left hand. For inner subgraphs,
-     it is the position of the folded summary node. The position can also
-     be specified in the form loc: fx:int y:intg.
-     The default value is 0. */
-  int x;
-  int y;
-
-  /* folding of a subgraph is 1, if the subgraph is fused, and 0, if the
-     subgraph is visualized explicitly. There are commands to unfold such
-     summary nodes.
-     Default value is 0 */
-  int folding;
-
-  /* Shrink, stretch gives the shrinking and stretching factor for the
-     graph's representation (default is 1, 1). ((stretch=shrink) \Lambda
-     100) is the scaling of the graph in percentage, e.g.,
-     (stretch,shrink) = (1,1) or (2,2) or (3,3) : : : is normal size,
-     (stretch,shrink) = (1,2) is half size, (stretch,shrink) = (2,1) is
-     double size. For subgraphs, it is also the scaling factor of the
-     summary node. The scaling factor can also be specified by scaling:
-     float (here, scaling 1.0 means normal size). */
-  int shrink;
-  int stretch;
-
-  /* textmode specifies the adjustment of the text within the border of a
-     summary node. The possibilities are center, left.justify and
-     right.justify.
-     Default value is center.*/
-  enum textmode textmode;
-
-  /* Shape can be specified for subgraphs only. It is the shape of the
-     subgraph summary node that appears if the subgraph is folded: box,
-     rhomb, ellipse, and triangle. vertical order is the level position
-     (rank) of the summary node of an inner subgraph, if this subgraph is
-     folded. We can also specify level: int. The level is only
-     recognized, if an automatical layout is calculated. horizontal order
-     is the horizontal position of the summary node within a level. The
-     nodes which are specified with horizontal positions are ordered
-     according to these positions within the levels. The nodes which do
-     not have this attribute are inserted into this ordering by the
-     crossing reduction mechanism. Note that connected
-     components are handled separately, thus it is not possible to
-     intermix such components by specifying a horizontal order. If the
-     algorithm for downward laid out trees is used, the horizontal order
-     influences only the order of the child nodes at a node, but not the
-     order of the whole level.
-     Default is box, other: rhomb, ellipse, triangle. */
-  enum shape shape;
-
-  /* Vertical order is the level position (rank) of the summary node of an
-     inner subgraph, if this subgraph is folded. We can also specify
-     level: int. The level is only recognized, if an automatical layout is
-     calculated.  */
-  int vertical_order;
-
-  /* Horizontal order is the horizontal position of the summary node within
-     a level. The nodes which are specified with horizontal positions are
-     ordered according to these positions within the levels. The nodes which
-     do not have this attribute are inserted into this ordering by the
-     crossing reduction mechanism. Note that connected components are
-     handled separately, thus it is not possible to intermix such components
-     by specifying a horizontal order. If the algorithm for downward laid
-     out trees is used, the horizontal order influences only the order of
-     the child nodes at a node, but not the order of the whole level.  */
-  int horizontal_order;
-
-  /* xmax, ymax specify the maximal size of the virtual window that is
-     used to display the graph. This is usually larger than the displayed
-     part, thus the width and height of the displayed part cannot be
-     greater than xmax and ymax. Only those parts of the graph are drawn
-     that are inside the virtual window. The virtual window can be moved
-     over the potential infinite system of coordinates by special
-     positioning commands.
-     Defaults are 90 and 90. */
-  int xmax;
-  int ymax;
-
-  /* xy-base: specify the upper left corner coordinates of the graph
-     relatively to the root window.
-     Defaults are 5, 5. */
-  int xbase;
-  int ybase;
-
-  /* xspace, yspace the minimum horizontal and vertical distance between
-     nodes. xlspace is the horizontal distance between lines at the
-     points where they cross the levels. (At these points, dummy nodes
-     are used. In fact, this is the horizontal distance between dummy
-     nodes.) It is recommended to set xlspace to a larger value, if
-     splines are used to draw edges, to prevent sharp bendings.
-     Default are 20 and 70. */
-  int xspace;
-  int yspace;
-
-  /* The horizontal space between lines at the point where they cross
-     the levels.
-     defaults value is 1/2 xspace (polygone) and 4/5 xspace (splines)*/
-  int xlspace;
-
-  /* xraster, yraster specifies the raster distance for the position of
-     the nodes. The center of a node is aligned to this raster. xlraster
-     is the horizontal raster for the positions of the line control
-     points (the dummy nodes). It should be a divisor of xraster.
-     defaults are 1,1. */
-  int xraster;
-  int yraster;
-
-  /* xlraster is the horizontal raster for the positions of the line
-     control points (the dummy nodes). It should be a divisor of xraster.
-     defaults is 1. */
-  int xlraster;
-
-  /* hidden specifies the classes of edges that are hidden.
-     Edges that are within such a class are not laid out nor drawn.
-     Nodes that are only reachable (forward or backward) by edges of an
-     hidden class are not drawn. However, nodes that are not reachable
-     at all are drawn. (But see attribute ignore.singles.) Specification
-     of classes of hidden edges allows to hide parts of a graph, e.g.,
-     annotations of a syntax tree. This attribute is only allowed at the
-     outermost level. More than one settings are possible to specify
-     exactly the set of classes that are hidden. Note the important
-     difference between hiding of edges and the edge line style invisible.
-     Hidden edges are not existent in the layout. Edges with line style
-     invisible are existent in the layout; they need space and may
-     produce crossings and influence the layout, but you cannot see
-     them.
-     No default value. */
-  int hidden;
-
-  /* Classname allows to introduce names for the edge classes. The names
-     are used in the menus. infoname allows to introduce names for the
-     additional text labels. The names are used in the menus.
-     defaults are 1,2,3...
-     By default, no class names. */
-  struct classname *classname;
-
-  /* Infoname allows to introduce names for the additional text labels.
-     The names are used in the menus.
-     Infoname is given by an integer and a string.
-     The default value is NULL.  */
-  struct infoname *infoname;
-
-  /* Colorentry allows to fill the color map. A color is a triplet of integer
-     values for the red/green/blue-part. Each integer is between 0 (off) and
-     255 (on), e.g., 0 0 0 is black and 255 255 255 is white. For instance
-     colorentry 75 : 70 130 180 sets the map entry 75 to steel blue. This
-     color can be used by specifying just the number 75.
-     Default id NULL.  */
-  struct colorentry *colorentry;
-
-  /* Layout downfactor, layout upfactor, layout nearfactor The layout
-     algorithm partitions the set of edges into edges pointing upward,
-     edges pointing downward, and edges pointing sidewards. The last type
-     of edges is also called near edges. If the layout.downfactor is
-     large compared to the layout.upfactor and the layout.nearfactor,
-     then the positions of the nodes is mainly determined by the edges
-     pointing downwards. If the layout.upfactor is large compared to the
-     layout.downfactor and the layout.nearfactor, then the positions of
-     the nodes is mainly determined by the edges pointing upwards. If the
-     layout.nearfactor is large, then the positions of the nodes is
-     mainly determined by the edges pointing sidewards. These attributes
-     have no effect, if the method for downward laid out trees is used.
-     Default is normal. */
-  int layout_downfactor;
-  int layout_upfactor;
-  int layout_nearfactor;
-  /* Layout splinefactor determines the bending at splines. The factor
-     100 indicates a very sharp bending, a factor 1 indicates a very flat
-     bending. Useful values are 30 : : : 80. */
-  int layout_splinefactor;
-
-  /* Late edge labels yes means that the graph is first partitioned and
-     then, labels are introduced. The default algorithm first creates
-     labels and then partitions the graph, which yield a more compact
-     layout, but may have more crossings.
-     Default is no. */
-  enum decision late_edge_labels;
-
-  /* Display edge labels yes means display labels and no means don't
-     display edge labels.
-     Default vaule is no. */
-  enum decision display_edge_labels;
-
-  /* Dirty edge labels yes enforces a fast layout of edge labels, which
-     may very ugly because several labels may be drawn at the same place.
-     Dirty edge labels cannot be used if splines are used.
-     Default is no.
-  */
-  enum decision dirty_edge_labels;
-
-  /* Finetuning no switches the fine tuning phase of the graph layout
-     algorithm off, while it is on as default. The fine tuning phase
-     tries to give all edges the same length.
-     Default is yes. */
-  enum decision finetuning;
-
-  /* Ignore singles yes hides all nodes which would appear single and
-     unconnected from the remaining graph. Such nodes have no edge at all
-     and are sometimes very ugly. Default is to show all nodes.
-     Default is no. */
-  enum decision ignore_singles;
-
-  /* priority phase yes replaces the normal pendulum method by a
-     specialized method: It forces straight long edges with 90 degree,
-     just as the straight phase. In fact, the straight phase is a fine
-     tune phase of the priority method. This phase is also recommended,
-     if an orthogonal layout is selected (see manhattan.edges).
-     Default is no. */
-  enum decision priority_phase;
-
-  /* manhattan edges yes switches the orthogonal layout on. Orthogonal
-     layout (or manhattan layout) means that all edges consist of line
-     segments with gradient 0 or 90 degree. Vertical edge segments might
-     by shared by several edges, while horizontal edge segments are never
-     shared. This results in very aesthetical layouts just for flowcharts.
-     If the orthogonal layout is used, then the priority phase and
-     straight phase should be used. Thus, these both phases are switched
-     on, too, unless priority layout and straight line tuning are
-     switched off explicitly.
-     Default is no. */
-  enum decision manhattan_edges;
-
-  /* Smanhattan edges yes switches a specialized orthogonal layout on:
-     Here, all horizontal edge segments between two levels share the same
-     horizontal line, i.e. not only vertical edge segments are shared,
-     but horizontal edge segments are shared by several edges, too. This
-     looks nice for trees but might be too confusing in general, because
-     the location of an edge might be ambiguously.
-     Default is no. */
-  enum decision smanhattan_edges;
-
-  /* Near edges no suppresses near edges and bent near edges in the
-     graph layout.
-     Default is yes. */
-  enum decision near_edges;
-
-  /* Orientation specifies the orientation of the graph: top.to.bottom,
-     bottom.to.top, left.to.right or right.to.left. Note: the normal
-     orientation is top.to.bottom. All explanations here are given
-     relatively to the normal orientation, i.e., e.g., if the orientation
-     is left to right, the attribute xlspace is not the horizontal but
-     the vertical distance between lines, etc.
-     Default is to_to_bottom. */
-  enum orientation orientation;
-
-  /* Node alignment specified the vertical alignment of nodes at the
-     horizontal reference line of the levels. If top is specified, the
-     tops of all nodes of a level have the same y-coordinate; on bottom,
-     the bottoms have the same y-coordinate, on center the nodes are
-     centered at the levels.
-     Default is center. */
-  enum alignment node_alignment;
-
-  /* Port sharing no suppresses the sharing of ports of edges at the
-     nodes. Normally, if multiple edges are adjacent to the same node,
-     and the arrow head of all these edges has the same visual appearance
-     (color, size, etc.), then these edges may share a port at a node,
-     i.e. only one arrow head is draw, and all edges are incoming into
-     this arrow head. This allows to have many edges adjacent to one node
-     without getting confused by too many arrow heads. If no port sharing
-     is used, each edge has its own port, i.e. its own place where it is
-     adjacent to the node.
-     Default is yes. */
-  enum decision port_sharing;
-
-  /* Arrow mode fixed (default) should be used, if port sharing is used,
-     because then, only a fixed set of rotations for the arrow heads are
-     used. If the arrow mode is free, then each arrow head is rotated
-     individually to each edge. But this can yield to a black spot, where
-     nothing is recognizable, if port sharing is used, since all these
-     qdifferently rotated arrow heads are drawn at the same place. If the
-     arrow mode is fixed, then the arrow head is rotated only in steps of
-     45 degree, and only one arrow head occurs at each port.
-     Default is fixed. */
-  enum arrow_mode arrow_mode;
-
-  /* Treefactor The algorithm tree for downward laid out trees tries to
-     produce a medium dense, balanced tree-like layout. If the tree
-     factor is greater than 0.5, the tree edges are spread, i.e. they
-     get a larger gradient. This may improve the readability of the tree.
-     Note: it is not obvious whether spreading results in a more dense or
-     wide layout. For a tree, there is a tree factor such that the whole
-     tree is minimal wide.
-     Default is 0.5. */
-  float treefactor;
-
-  /* Spreadlevel This parameter only influences the algorithm tree, too.
-     For large, balanced trees, spreading of the uppermost nodes would
-     enlarge the width of the tree too much, such that the tree does not
-     fit anymore in a window. Thus, the spreadlevel specifies the minimal
-     level (rank) where nodes are spread. Nodes of levels upper than
-     spreadlevel are not spread.
-     Default is 1. */
-  int spreadlevel;
-
-  /* Crossing weight specifies the weight that is used for the crossing
-     reduction: bary (default), median, barymedian or medianbary. We
-     cannot give a general recommendation, which is the best method. For
-     graphs with very large average degree of edges (number of incoming
-     and outgoing edges at a node), the weight bary is the fastest
-     method. With the weights barymedian and medianbary, equal weights of
-     different nodes are not very probable, thus the crossing reduction
-     phase 2 might be very fast.
-     Default is bary. */
-  enum crossing_type crossing_weight;
-
-  /* Crossing phase2 is the most time consuming phase of the crossing
-     reduction. In this phase, the nodes that happen to have equal
-     crossing weights are permuted. By specifying no, this phase is
-     suppressed.
-     Default is yes. */
-  enum decision crossing_phase2;
-
-  /* Crossing optimization is a postprocessing phase after the normal
-     crossing reduction: we try to optimize locally, by exchanging pairs
-     of nodes to reduce the crossings. Although this phase is not very
-     time consuming, it can be suppressed by specifying no.
-     Default is yes. */
-  enum decision crossing_optimization;
-
-  /* View allows to select the fisheye views. Because
-     of the fixed size of the window that shows the graph, we normally
-     can only see a small amount of a large graph. If we shrink the graph
-     such that it fits into the window, we cannot recognize any detail
-     anymore. Fisheye views are coordinate transformations: the view onto
-     the graph is distort, to overcome this usage deficiency. The polar
-     fisheye is easy to explain: assume a projection of the plane that
-     contains the graph picture onto a spheric ball. If we now look onto
-     this ball in 3 D, we have a polar fisheye view. There is a focus
-     point which is magnified such that we see all details. Parts of the
-     plane that are far away from the focus point are demagnified very
-     much. Cartesian fisheye have a similar effect; only the formula for
-     the coordinate transformation is different. Selecting cfish means
-     the cartesian fisheye is used which demagnifies such that the whole
-     graph is visible (self adaptable cartesian fisheye). With fcfish,
-     the cartesian fisheye shows the region of a fixed radius around the
-     focus point (fixed radius cartesian fisheye). This region might be
-     smaller than the whole graph, but the demagnification needed to show
-     this region in the window is also not so large, thus more details
-     are recognizable. With pfish the self adaptable polar fisheye is
-     selected that shows the whole graph, and with fpfish the fixed
-     radius polar fisheye is selected.
-     Default is normal view.  */
-  enum view view;
-
-  /* Edges no suppresses the drawing of edges.
-     Default is yes. */
-  enum decision edges;
-
-  /* Nodes no suppresses the drawing of nodes.
-     Default is yes. */
-  enum decision nodes;
-
-  /* Splines specifies whether splines are used to draw edges (yes or no).
-     As default, polygon segments are used to draw edges, because this is
-     much faster. Note that the spline drawing routine is not fully
-     validated, and is very slow. Its use is mainly to prepare high
-     quality PostScript output for very small graphs.
-     Default is no. */
-  enum decision splines;
-
-  /* Bmax set the maximal number of iterations that are done for the
-     reduction of edge bendings.
-   Default is 100. */
-  int bmax;
-
-  /* Cmin set the minimal number of iterations that are done for the
-     crossing reduction with the crossing weights. The normal method
-     stops if two consecutive checks does not reduce the number of
-     crossings anymore. However, this increasing of the number of
-     crossings might be locally, such that after some more iterations,
-     the crossing number might decrease much more.
-     Default is 0. */
-  int cmin;
-
-  /* Cmax set the maximal number of interactions for crossing reduction.
-     This is helpful for speeding up the layout process.
-     Default is -1, which represents infinity.  */
-  int cmax;
-
-  /* Pmin set the minimal number of iterations that is done with the
-     pendulum method. Similar to the crossing reduction, this method
-     stops if the `imbalancement weight' does not decreases anymore.
-     However, the increasing of the imbalancement weight might be locally,
-     such that after some more iterations, the imbalancement weight might
-     decrease much more.
-     Default is 0. */
-  int pmin;
-
-  /* Pmax set the maximal number of iterations of the pendulum method.
-     This is helpful for speedup the layout process.
-     Default is 100. */
-  int pmax;
-
-  /* Rmin set the minimal number of iterations that is done with the
-     rubberband method. This is similar as for the pendulum method.
-     Default is 0. */
-  int rmin;
-
-  /* Rmax set the maximal number of iterations of the rubberband method.
-     This is helpful for speedup the layout process.
-     Default is 100. */
-  int rmax;
-
-  /* Smax set the maximal number of iterations of the straight line
-     recognition phase (useful only, if the straight line recognition
-     phase is switched on, see attribute straight.phase).
-     Default is 100. */
-  int smax;
-
-  /* Generic values.
-   */
-  node node;
-  edge edge;
-
-  /* List of nodes declared.
-     Pointer. */
-  node *node_list;
-
-  /* List of edges declared.
-     Pointer. */
-  edge *edge_list;
-
-};
-
-/* Graph typedefs. */
-typedef struct graph graph;
-
-void new_graph (graph *g);
-void new_node (node *n);
-void new_edge (edge *e);
-
-void add_node (graph *g, node *n);
-void add_edge (graph *g, edge *e);
-
-void add_colorentry (graph *g, int color_idx, int red_cp,
-		     int green_cp, int blue_cp);
-void add_classname (graph *g, int val, const char *name);
-void add_infoname (graph *g, int val, const char *name);
-
-void open_node (FILE *fout);
-void output_node (node *n, FILE *fout);
-void close_node (FILE *fout);
-
-void open_edge (edge *e, FILE *fout);
-void output_edge (edge *e, FILE *fout);
-void close_edge (FILE *fout);
-
-void open_graph (FILE *fout);
-void output_graph (graph *g, FILE *fout);
-void close_graph (graph *g, FILE *fout);
-
-#endif /* VCG_H_ */
diff --git a/src/vcg_defaults.h b/src/vcg_defaults.h
deleted file mode 100644
index 78e24b5..0000000
--- a/src/vcg_defaults.h
+++ /dev/null
@@ -1,181 +0,0 @@
-/* VCG description handler for Bison.
-
-   Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc.
-
-   This file is part of Bison, the GNU Compiler Compiler.
-
-   Bison 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.
-
-   Bison 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 Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#ifndef VCG_DEFAULTS_H_
-# define VCG_DEFAULTS_H_
-
-/* Graph defaults. */
-# define G_TITLE		NULL
-# define G_LABEL		NULL
-# define G_INFOS1		NULL
-# define G_INFOS2		NULL
-# define G_INFOS3		NULL
-
-# define G_COLOR		white
-# define G_TEXTCOLOR		black
-# define G_BORDERCOLOR		G_TEXTCOLOR
-
-# define G_WIDTH		100
-# define G_HEIGHT		100
-# define G_BORDERWIDTH		2
-
-# define G_X			0
-# define G_Y			0
-
-# define G_FOLDING		0
-
-# define G_SHRINK		1
-# define G_STRETCH		1
-
-# define G_TEXTMODE		centered
-# define G_SHAPE		box
-
-# define G_VERTICAL_ORDER	0	/* Unspecified for subgraphs.  */
-# define G_HORIZONTAL_ORDER	0	/* Unspecified for subgraphs.  */
-
-# define G_XMAX			90	/* Not output.  */
-# define G_YMAX			90	/* Not output.  */
-
-# define G_XBASE		5
-# define G_YBASE		5
-
-# define G_XSPACE		20
-# define G_YSPACE		70
-# define G_XLSPACE		(G_XSPACE / 2)	/* Not output */
-
-# define G_XRASTER		1
-# define G_YRASTER		1
-# define G_XLRASTER		1
-
-# define G_HIDDEN		(-1)	/* No default value.  */
-
-# define G_CLASSNAME		NULL	/* No class name association.  */
-# define G_INFONAME		NULL
-# define G_COLORENTRY		NULL
-
-# define G_LAYOUTALGORITHM	normal
-# define G_LAYOUT_DOWNFACTOR	1
-# define G_LAYOUT_UPFACTOR	1
-# define G_LAYOUT_NEARFACTOR	1
-# define G_LAYOUT_SPLINEFACTOR	70
-
-# define G_LATE_EDGE_LABELS	no
-# define G_DISPLAY_EDGE_LABELS	no
-# define G_DIRTY_EDGE_LABELS	no
-# define G_FINETUNING		yes
-# define G_IGNORE_SINGLES	no
-# define G_LONG_STRAIGHT_PHASE	no
-# define G_PRIORITY_PHASE	no
-# define G_MANHATTAN_EDGES	no
-# define G_SMANHATTAN_EDGES	no
-# define G_NEAR_EDGES		yes
-
-# define G_ORIENTATION		top_to_bottom
-# define G_NODE_ALIGNMENT	center
-# define G_PORT_SHARING		yes
-# define G_ARROW_MODE		fixed
-# define G_TREEFACTOR		0.5
-# define G_SPREADLEVEL		1
-# define G_CROSSING_WEIGHT	bary
-# define G_CROSSING_PHASE2	yes
-# define G_CROSSING_OPTIMIZATION	yes
-# define G_VIEW			normal_view
-
-# define G_EDGES		yes
-# define G_NODES		yes
-# define G_SPLINES		no
-
-# define G_BMAX			100
-# define G_CMIN			0
-# define G_CMAX			(-1)	/* Infinity */
-# define G_PMIN			0
-# define G_PMAX			100
-# define G_RMIN			0
-# define G_RMAX			100
-# define G_SMAX			100
-
-# define G_NODE_LIST		NULL
-# define G_EDGE_LIST		NULL
-
-/* Nodes defaults. */
-# define N_TITLE		NULL
-# define N_LABEL		NULL
-
-# define N_LOCX			(-1)	/* Default unspcified */
-# define N_LOCY			(-1)	/* Default unspcified */
-
-# define N_VERTICAL_ORDER	(-1)	/* Default unspcified */
-# define N_HORIZONTAL_ORDER	(-1)	/* Default unspcified */
-
-# define N_WIDTH		(-1)	/* We assume that we can't define it now. */
-# define N_HEIGHT		(-1)	/* also. */
-
-# define N_SHRINK		1
-# define N_STRETCH		1
-
-# define N_FOLDING		(-1)	/* no explicit default value. */
-
-# define N_SHAPE		box
-# define N_TEXTMODE		centered
-# define N_BORDERWIDTH		2
-
-# define N_COLOR		white
-# define N_TEXTCOLOR		black
-# define N_BORDERCOLOR		N_TEXTCOLOR
-
-# define N_INFOS1		NULL
-# define N_INFOS2		NULL
-# define N_INFOS3		NULL
-
-# define N_NEXT			NULL
-
-/* Edge defaults. */
-# define E_EDGE_TYPE		normal_edge
-
-# define E_SOURCENAME		NULL	/* Mandatory. */
-# define E_TARGETNAME		NULL	/* Mandatory. */
-# define E_LABEL		NULL
-
-# define E_LINESTYLE		continuous
-# define E_THICKNESS		2
-
-# define E_CLASS		1
-
-# define E_COLOR		black
-# define E_TEXTCOLOR		E_COLOR
-# define E_ARROWCOLOR		E_COLOR
-# define E_BACKARROWCOLOR	E_COLOR
-
-# define E_ARROWSIZE		10
-# define E_BACKARROWSIZE	0
-
-# define E_ARROWSTYLE		solid
-# define E_BACKARROWSTYLE	none
-
-# define E_PRIORITY		1
-
-# define E_ANCHOR		(-1)
-
-# define E_HORIZONTAL_ORDER	(-1)
-
-# define E_NEXT			NULL
-
-#endif /* not VCG_DEFAULTS_H_ */
diff --git a/src/yacc b/src/yacc
deleted file mode 100755
index eda226d..0000000
--- a/src/yacc
+++ /dev/null
@@ -1,2 +0,0 @@
-#! /bin/sh
-exec /home/phanna/src/bison/bin/bison -y "$@"
diff --git a/stamp-h1 b/stamp-h1
deleted file mode 100644
index 4547fe1..0000000
--- a/stamp-h1
+++ /dev/null
@@ -1 +0,0 @@
-timestamp for config.h
diff --git a/tests/Makefile b/tests/Makefile
deleted file mode 100644
index 62b28e6..0000000
--- a/tests/Makefile
+++ /dev/null
@@ -1,423 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# tests/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-srcdir = .
-top_srcdir = ..
-
-pkgdatadir = $(datadir)/bison
-pkglibdir = $(libdir)/bison
-pkgincludedir = $(includedir)/bison
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = /usr/bin/install -c
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-unknown-linux-gnu
-host_triplet = x86_64-unknown-linux-gnu
-subdir = tests
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(srcdir)/atlocal.in $(srcdir)/bison.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES = atlocal bison
-SOURCES =
-DIST_SOURCES =
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run aclocal-1.9
-AMDEP_FALSE = #
-AMDEP_TRUE = 
-AMTAR = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run tar
-AUTOCONF = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoconf
-AUTOHEADER = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autoheader
-AUTOM4TE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run autom4te
-AUTOMAKE = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run automake-1.9
-AWK = gawk
-BISON_CXX_WORKS = :
-BISON_CXX_WORKS_FALSE = #
-BISON_CXX_WORKS_TRUE = 
-BISON_LOCALEDIR = /usr/share/locale
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPP = gcc -E
-CPPFLAGS = 
-CXX = g++
-CXXDEPMODE = depmode=gcc3
-CXXFLAGS = -g -O2
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = grep -E
-EXEEXT = 
-GCC = yes
-GETOPT_H = 
-GMSGFMT = /usr/bin/msgfmt
-HAVE__BOOL = 1
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
-INTLLIBS = 
-INTL_MACOSX_LIBS = 
-LDFLAGS = 
-LEX = flex
-LEXLIB = -lfl
-LEX_OUTPUT_ROOT = lex.yy
-LIBICONV = -liconv
-LIBINTL = 
-LIBOBJS =  dirname$U.o exitfail$U.o hard-locale$U.o hash$U.o quote$U.o quotearg$U.o fopen-safer$U.o dup-safer$U.o fd-safer$U.o pipe-safer$U.o xmalloc$U.o
-LIBS = 
-LTLIBICONV = -liconv
-LTLIBINTL = 
-LTLIBOBJS =  dirname$U.lo exitfail$U.lo hard-locale$U.lo hash$U.lo quote$U.lo quotearg$U.lo fopen-safer$U.lo dup-safer$U.lo fd-safer$U.lo pipe-safer$U.lo xmalloc$U.lo
-M4 = /usr/bin/m4
-MAKEINFO = ${SHELL} /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/missing --run makeinfo
-MKINSTALLDIRS = $(top_builddir)/build-aux/mkinstalldirs
-MSGFMT = /usr/bin/msgfmt
-MSGMERGE = /usr/bin/msgmerge
-O0CFLAGS = -g 
-O0CXXFLAGS = -g 
-OBJEXT = o
-PACKAGE = bison
-PACKAGE_BUGREPORT = bug-bison@gnu.org
-PACKAGE_NAME = GNU Bison
-PACKAGE_STRING = GNU Bison 2.3
-PACKAGE_TARNAME = bison
-PACKAGE_VERSION = 2.3
-PATH_SEPARATOR = :
-POSUB = po
-RANLIB = ranlib
-SET_MAKE = 
-SHELL = /bin/sh
-STDBOOL_H = 
-STRIP = 
-UNISTD_H = 
-USE_NLS = yes
-VALGRIND = 
-VERSION = 2.3
-WARNING_CFLAGS = 
-WARNING_CXXFLAGS = 
-WERROR_CFLAGS = 
-XGETTEXT = /usr/bin/xgettext
-YACC = bison -y
-YACC_LIBRARY = liby.a
-YACC_SCRIPT = yacc
-ac_ct_CC = gcc
-ac_ct_CXX = g++
-ac_ct_RANLIB = ranlib
-ac_ct_STRIP = 
-aclocaldir = ${datadir}/aclocal
-am__fastdepCC_FALSE = #
-am__fastdepCC_TRUE = 
-am__fastdepCXX_FALSE = #
-am__fastdepCXX_TRUE = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = ${AMTAR} chof - "$$tardir"
-am__untar = ${AMTAR} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-unknown-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = unknown
-datadir = ${prefix}/share
-exec_prefix = ${prefix}
-host = x86_64-unknown-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = unknown
-includedir = ${prefix}/include
-infodir = ${prefix}/info
-install_sh = /usr/local/google/workspace/WebKit/tools/bison-2.3/build-aux/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localstatedir = ${prefix}/var
-mandir = ${prefix}/man
-mkdir_p = mkdir -p --
-oldincludedir = /usr/include
-prefix = /home/phanna/src/bison
-program_transform_name = s,x,x,
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-sysconfdir = ${prefix}/etc
-target_alias = 
-EXTRA_DIST = $(TESTSUITE_AT) testsuite package.m4
-DISTCLEANFILES = atconfig $(check_SCRIPTS)
-MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE)
-TESTSUITE_AT = \
-	local.at \
-	testsuite.at \
-	input.at \
-	output.at sets.at reduce.at \
-	synclines.at headers.at actions.at conflicts.at \
-	calc.at \
-        torture.at existing.at regression.at \
-        c++.at \
-	cxx-type.at glr-regression.at
-
-TESTSUITE = $(srcdir)/testsuite
-AUTOTEST = $(AUTOM4TE) --language=autotest
-check_SCRIPTS = bison
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  tests/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  tests/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-atlocal: $(top_builddir)/config.status $(srcdir)/atlocal.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-bison: $(top_builddir)/config.status $(srcdir)/bison.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-uninstall-info-am:
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS)
-	$(MAKE) $(AM_MAKEFLAGS) check-local
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-clean: clean-am
-
-clean-am: clean-generic clean-local mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am: installcheck-local
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am
-
-.PHONY: all all-am check check-am check-local clean clean-generic \
-	clean-local distclean distclean-generic distdir dvi dvi-am \
-	html html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
-	installcheck-am installcheck-local installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
-	uninstall-info-am
-
-
-$(srcdir)/package.m4: $(top_srcdir)/configure.ac
-	{ \
-	  echo '# Signature of the current package.'; \
-	  echo 'm4_define([AT_PACKAGE_NAME],      [$(PACKAGE_NAME)])'; \
-	  echo 'm4_define([AT_PACKAGE_TARNAME],   [$(PACKAGE_TARNAME)])'; \
-	  echo 'm4_define([AT_PACKAGE_VERSION],   [$(PACKAGE_VERSION)])'; \
-	  echo 'm4_define([AT_PACKAGE_STRING],    [$(PACKAGE_STRING)])'; \
-	  echo 'm4_define([AT_PACKAGE_BUGREPORT], [$(PACKAGE_BUGREPORT)])'; \
-	} >$(srcdir)/package.m4
-$(TESTSUITE): package.m4 $(TESTSUITE_AT)
-	$(AUTOTEST) -I $(srcdir) testsuite.at -o $@.tmp
-	mv $@.tmp $@
-
-atconfig: $(top_builddir)/config.status
-	cd $(top_builddir) && ./config.status tests/$@
-
-clean-local:
-	test ! -f $(TESTSUITE) || $(SHELL) $(TESTSUITE) --clean
-
-check-local: atconfig atlocal $(TESTSUITE)
-	$(SHELL) $(TESTSUITE) $(TESTSUITEFLAGS)
-
-# Run the test suite on the *installed* tree.
-installcheck-local:
-	$(SHELL) $(TESTSUITE) AUTOTEST_PATH="$(bindir)" $(TESTSUITEFLAGS)
-
-# Be real mean with it.
-.PHONY: maintainer-check-g++
-maintainer-check-g++: $(TESTSUITE)
-	$(TESTSUITE) CC='$(CXX)'
-
-.PHONY: maintainer-check-posix
-maintainer-check-posix: $(TESTSUITE)
-	$(TESTSUITE) POSIXLY_CORRECT=1 _POSIX2_VERSION=200112
-
-.PHONY: maintainer-check-valgrind
-maintainer-check-valgrind: $(TESTSUITE)
-	test -z '$(VALGRIND)' || \
-	   $(TESTSUITE) PREBISON='$(VALGRIND) -q' PREPARSER='$(VALGRIND) -q'
-
-.PHONY: maintainer-check
-maintainer-check: maintainer-check-posix maintainer-check-valgrind maintainer-check-g++
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/tests/Makefile.am b/tests/Makefile.am
deleted file mode 100644
index 7cf188a..0000000
--- a/tests/Makefile.am
+++ /dev/null
@@ -1,94 +0,0 @@
-## Process this file with automake to create Makefile.in.
-
-## Makefile for Bison testsuite.
-
-## Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 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.
-
-EXTRA_DIST = $(TESTSUITE_AT) testsuite package.m4
-
-DISTCLEANFILES       = atconfig $(check_SCRIPTS)
-MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE)
-
-## ------------ ##
-## package.m4.  ##
-## ------------ ##
-
-$(srcdir)/package.m4: $(top_srcdir)/configure.ac
-	{ \
-	  echo '# Signature of the current package.'; \
-	  echo 'm4_define([AT_PACKAGE_NAME],      [$(PACKAGE_NAME)])'; \
-	  echo 'm4_define([AT_PACKAGE_TARNAME],   [$(PACKAGE_TARNAME)])'; \
-	  echo 'm4_define([AT_PACKAGE_VERSION],   [$(PACKAGE_VERSION)])'; \
-	  echo 'm4_define([AT_PACKAGE_STRING],    [$(PACKAGE_STRING)])'; \
-	  echo 'm4_define([AT_PACKAGE_BUGREPORT], [$(PACKAGE_BUGREPORT)])'; \
-	} >$(srcdir)/package.m4
-
-## ------------ ##
-## Test suite.  ##
-## ------------ ##
-
-TESTSUITE_AT = \
-	local.at \
-	testsuite.at \
-	input.at \
-	output.at sets.at reduce.at \
-	synclines.at headers.at actions.at conflicts.at \
-	calc.at \
-        torture.at existing.at regression.at \
-        c++.at \
-	cxx-type.at glr-regression.at
-
-TESTSUITE = $(srcdir)/testsuite
-
-AUTOTEST = $(AUTOM4TE) --language=autotest
-$(TESTSUITE): package.m4 $(TESTSUITE_AT)
-	$(AUTOTEST) -I $(srcdir) testsuite.at -o $@.tmp
-	mv $@.tmp $@
-
-atconfig: $(top_builddir)/config.status
-	cd $(top_builddir) && ./config.status tests/$@
-
-clean-local:
-	test ! -f $(TESTSUITE) || $(SHELL) $(TESTSUITE) --clean
-
-check-local: atconfig atlocal $(TESTSUITE)
-	$(SHELL) $(TESTSUITE) $(TESTSUITEFLAGS)
-
-check_SCRIPTS = bison
-
-# Run the test suite on the *installed* tree.
-installcheck-local:
-	$(SHELL) $(TESTSUITE) AUTOTEST_PATH="$(bindir)" $(TESTSUITEFLAGS)
-
-# Be real mean with it.
-.PHONY: maintainer-check-g++
-maintainer-check-g++: $(TESTSUITE)
-	$(TESTSUITE) CC='$(CXX)'
-
-.PHONY: maintainer-check-posix
-maintainer-check-posix: $(TESTSUITE)
-	$(TESTSUITE) POSIXLY_CORRECT=1 _POSIX2_VERSION=200112
-
-.PHONY: maintainer-check-valgrind
-maintainer-check-valgrind: $(TESTSUITE)
-	test -z '$(VALGRIND)' || \
-	   $(TESTSUITE) PREBISON='$(VALGRIND) -q' PREPARSER='$(VALGRIND) -q'
-
-.PHONY: maintainer-check
-maintainer-check: maintainer-check-posix maintainer-check-valgrind maintainer-check-g++
diff --git a/tests/Makefile.in b/tests/Makefile.in
deleted file mode 100644
index 20f9b3c..0000000
--- a/tests/Makefile.in
+++ /dev/null
@@ -1,423 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = tests
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(srcdir)/atlocal.in $(srcdir)/bison.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/bison-i18n.m4 \
-	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \
-	$(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \
-	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext_gl.m4 \
-	$(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \
-	$(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/inttypes_h_gl.m4 \
-	$(top_srcdir)/m4/lib-ld_gl.m4 $(top_srcdir)/m4/lib-link.m4 \
-	$(top_srcdir)/m4/lib-prefix_gl.m4 $(top_srcdir)/m4/m4.m4 \
-	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \
-	$(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \
-	$(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \
-	$(top_srcdir)/m4/po_gl.m4 $(top_srcdir)/m4/progtest.m4 \
-	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h_gl.m4 \
-	$(top_srcdir)/m4/stdio-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strtol.m4 $(top_srcdir)/m4/strtoul.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 $(top_srcdir)/m4/subpipe.m4 \
-	$(top_srcdir)/m4/timevar.m4 $(top_srcdir)/m4/uintmax_t_gl.m4 \
-	$(top_srcdir)/m4/ulonglong_gl.m4 \
-	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
-	$(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \
-	$(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES = atlocal bison
-SOURCES =
-DIST_SOURCES =
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOM4TE = @AUTOM4TE@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BISON_CXX_WORKS = @BISON_CXX_WORKS@
-BISON_CXX_WORKS_FALSE = @BISON_CXX_WORKS_FALSE@
-BISON_CXX_WORKS_TRUE = @BISON_CXX_WORKS_TRUE@
-BISON_LOCALEDIR = @BISON_LOCALEDIR@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-GCC = @GCC@
-GETOPT_H = @GETOPT_H@
-GMSGFMT = @GMSGFMT@
-HAVE__BOOL = @HAVE__BOOL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTLLIBS = @INTLLIBS@
-INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
-LDFLAGS = @LDFLAGS@
-LEX = @LEX@
-LEXLIB = @LEXLIB@
-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
-LIBICONV = @LIBICONV@
-LIBINTL = @LIBINTL@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LTLIBICONV = @LTLIBICONV@
-LTLIBINTL = @LTLIBINTL@
-LTLIBOBJS = @LTLIBOBJS@
-M4 = @M4@
-MAKEINFO = @MAKEINFO@
-MKINSTALLDIRS = @MKINSTALLDIRS@
-MSGFMT = @MSGFMT@
-MSGMERGE = @MSGMERGE@
-O0CFLAGS = @O0CFLAGS@
-O0CXXFLAGS = @O0CXXFLAGS@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-POSUB = @POSUB@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STDBOOL_H = @STDBOOL_H@
-STRIP = @STRIP@
-UNISTD_H = @UNISTD_H@
-USE_NLS = @USE_NLS@
-VALGRIND = @VALGRIND@
-VERSION = @VERSION@
-WARNING_CFLAGS = @WARNING_CFLAGS@
-WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
-WERROR_CFLAGS = @WERROR_CFLAGS@
-XGETTEXT = @XGETTEXT@
-YACC = @YACC@
-YACC_LIBRARY = @YACC_LIBRARY@
-YACC_SCRIPT = @YACC_SCRIPT@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-aclocaldir = @aclocaldir@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-EXTRA_DIST = $(TESTSUITE_AT) testsuite package.m4
-DISTCLEANFILES = atconfig $(check_SCRIPTS)
-MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE)
-TESTSUITE_AT = \
-	local.at \
-	testsuite.at \
-	input.at \
-	output.at sets.at reduce.at \
-	synclines.at headers.at actions.at conflicts.at \
-	calc.at \
-        torture.at existing.at regression.at \
-        c++.at \
-	cxx-type.at glr-regression.at
-
-TESTSUITE = $(srcdir)/testsuite
-AUTOTEST = $(AUTOM4TE) --language=autotest
-check_SCRIPTS = bison
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  tests/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  tests/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-atlocal: $(top_builddir)/config.status $(srcdir)/atlocal.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-bison: $(top_builddir)/config.status $(srcdir)/bison.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-uninstall-info-am:
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS)
-	$(MAKE) $(AM_MAKEFLAGS) check-local
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-clean: clean-am
-
-clean-am: clean-generic clean-local mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am: installcheck-local
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am
-
-.PHONY: all all-am check check-am check-local clean clean-generic \
-	clean-local distclean distclean-generic distdir dvi dvi-am \
-	html html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
-	installcheck-am installcheck-local installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
-	uninstall-info-am
-
-
-$(srcdir)/package.m4: $(top_srcdir)/configure.ac
-	{ \
-	  echo '# Signature of the current package.'; \
-	  echo 'm4_define([AT_PACKAGE_NAME],      [$(PACKAGE_NAME)])'; \
-	  echo 'm4_define([AT_PACKAGE_TARNAME],   [$(PACKAGE_TARNAME)])'; \
-	  echo 'm4_define([AT_PACKAGE_VERSION],   [$(PACKAGE_VERSION)])'; \
-	  echo 'm4_define([AT_PACKAGE_STRING],    [$(PACKAGE_STRING)])'; \
-	  echo 'm4_define([AT_PACKAGE_BUGREPORT], [$(PACKAGE_BUGREPORT)])'; \
-	} >$(srcdir)/package.m4
-$(TESTSUITE): package.m4 $(TESTSUITE_AT)
-	$(AUTOTEST) -I $(srcdir) testsuite.at -o $@.tmp
-	mv $@.tmp $@
-
-atconfig: $(top_builddir)/config.status
-	cd $(top_builddir) && ./config.status tests/$@
-
-clean-local:
-	test ! -f $(TESTSUITE) || $(SHELL) $(TESTSUITE) --clean
-
-check-local: atconfig atlocal $(TESTSUITE)
-	$(SHELL) $(TESTSUITE) $(TESTSUITEFLAGS)
-
-# Run the test suite on the *installed* tree.
-installcheck-local:
-	$(SHELL) $(TESTSUITE) AUTOTEST_PATH="$(bindir)" $(TESTSUITEFLAGS)
-
-# Be real mean with it.
-.PHONY: maintainer-check-g++
-maintainer-check-g++: $(TESTSUITE)
-	$(TESTSUITE) CC='$(CXX)'
-
-.PHONY: maintainer-check-posix
-maintainer-check-posix: $(TESTSUITE)
-	$(TESTSUITE) POSIXLY_CORRECT=1 _POSIX2_VERSION=200112
-
-.PHONY: maintainer-check-valgrind
-maintainer-check-valgrind: $(TESTSUITE)
-	test -z '$(VALGRIND)' || \
-	   $(TESTSUITE) PREBISON='$(VALGRIND) -q' PREPARSER='$(VALGRIND) -q'
-
-.PHONY: maintainer-check
-maintainer-check: maintainer-check-posix maintainer-check-valgrind maintainer-check-g++
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/tests/actions.at b/tests/actions.at
deleted file mode 100644
index 7a03fb0..0000000
--- a/tests/actions.at
+++ /dev/null
@@ -1,537 +0,0 @@
-# Executing Actions.                               -*- Autotest -*-
-# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 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.
-
-AT_BANNER([[User Actions.]])
-
-## ------------------ ##
-## Mid-rule actions.  ##
-## ------------------ ##
-
-AT_SETUP([Mid-rule actions])
-
-# Bison once forgot the mid-rule actions.  It was because the action
-# was attached to the host rule (the one with the mid-rule action),
-# instead of being attached to the empty rule dedicated to this
-# action.
-
-AT_DATA_GRAMMAR([[input.y]],
-[[%error-verbose
-%debug
-%{
-# include <stdio.h>
-# include <stdlib.h>
-  static void yyerror (const char *msg);
-  static int yylex (void);
-%}
-%%
-exp:     { putchar ('0'); }
-     '1' { putchar ('1'); }
-     '2' { putchar ('2'); }
-     '3' { putchar ('3'); }
-     '4' { putchar ('4'); }
-     '5' { putchar ('5'); }
-     '6' { putchar ('6'); }
-     '7' { putchar ('7'); }
-     '8' { putchar ('8'); }
-     '9' { putchar ('9'); }
-         { putchar ('\n'); }
-   ;
-%%
-static int
-yylex (void)
-{
-  static const char *input = "123456789";
-  return *input++;
-}
-
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-]])
-
-AT_CHECK([bison -d -v -o input.c input.y])
-AT_COMPILE([input])
-AT_PARSER_CHECK([./input], 0,
-[[0123456789
-]])
-
-AT_CLEANUP
-
-
-
-
-
-## ---------------- ##
-## Exotic Dollars.  ##
-## ---------------- ##
-
-AT_SETUP([Exotic Dollars])
-
-AT_DATA_GRAMMAR([[input.y]],
-[[%error-verbose
-%debug
-%{
-# include <stdio.h>
-# include <stdlib.h>
-  static void yyerror (const char *msg);
-  static int yylex (void);
-# define USE(Var)
-%}
-
-%union
-{
-  int val;
-};
-
-%type <val> a_1 a_2 a_5
-            sum_of_the_five_previous_values
-
-%%
-exp: a_1 a_2 { $<val>$ = 3; } { $<val>$ = $<val>3 + 1; } a_5
-     sum_of_the_five_previous_values
-    {
-       USE (($1, $2, $<foo>3, $<foo>4, $5));
-       printf ("%d\n", $6);
-    }
-;
-a_1: { $$ = 1; };
-a_2: { $$ = 2; };
-a_5: { $$ = 5; };
-
-sum_of_the_five_previous_values:
-    {
-       $$ = $<val>0 + $<val>-1 + $<val>-2 + $<val>-3 + $<val>-4;
-    }
-;
-
-%%
-static int
-yylex (void)
-{
-  return EOF;
-}
-
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-]])
-
-AT_CHECK([bison -d -v -o input.c input.y], 0)
-AT_COMPILE([input])
-AT_PARSER_CHECK([./input], 0,
-[[15
-]])
-
-AT_CLEANUP
-
-
-
-## -------------------------- ##
-## Printers and Destructors.  ##
-## -------------------------- ##
-
-# _AT_CHECK_PRINTER_AND_DESTRUCTOR($1, $2, $3, $4, BISON-DIRECTIVE, UNION-FLAG)
-# -----------------------------------------------------------------------------
-m4_define([_AT_CHECK_PRINTER_AND_DESTRUCTOR],
-[# Make sure complex $n work.
-m4_if([$1$2$3], $[1]$[2]$[3], [],
-       [m4_fatal([$0: Invalid arguments: $@])])dnl
-
-# Be sure to pass all the %directives to this macro to have correct
-# helping macros.  So don't put any directly in the Bison file.
-AT_BISON_OPTION_PUSHDEFS([$5])
-AT_DATA_GRAMMAR([[input.y]],
-[[%{
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#define YYINITDEPTH 10
-#define YYMAXDEPTH 10
-]AT_LALR1_CC_IF(
-  [#define RANGE(Location) (Location).begin.line, (Location).end.line],
-  [#define RANGE(Location) (Location).first_line, (Location).last_line])
-[%}
-
-$5]
-m4_ifval([$6], [%union
-{
-  int ival;
-}])
-AT_LALR1_CC_IF([%define "global_tokens_and_yystype"])
-[
-%{
-]AT_LALR1_CC_IF([typedef yy::location YYLTYPE;
-                m4_ifval([$6], , [#define YYSTYPE int])])
-[static int yylex (]AT_LEX_FORMALS[);
-]AT_LALR1_CC_IF([], [static void yyerror (const char *msg);])
-[%}
-
-]m4_ifval([$6], [%type <ival> '(' 'x' 'y' ')' ';' thing line input])[
-
-%printer
-  {
-    ]AT_LALR1_CC_IF([debug_stream () << $$;],
-                    [fprintf (yyoutput, "%d", $$)])[;
-  }
-  input line thing 'x' 'y'
-
-%destructor
-  { printf ("Freeing nterm input (%d@%d-%d)\n", $$, RANGE (@$)); }
-  input
-
-%destructor
-  { printf ("Freeing nterm line (%d@%d-%d)\n", $$, RANGE (@$)); }
-  line
-
-%destructor
-  { printf ("Freeing nterm thing (%d@%d-%d)\n", $$, RANGE (@$)); }
-  thing
-
-%destructor
-  { printf ("Freeing token 'x' (%d@%d-%d)\n", $$, RANGE (@$)); }
-  'x'
-
-%destructor
-  { printf ("Freeing token 'y' (%d@%d-%d)\n", $$, RANGE (@$)); }
-  'y'
-
-%%
-/*
-   This grammar is made to exercise error recovery.
-   "Lines" starting with `(' support error recovery, with
-   ')' as synchronizing token.  Lines starting with 'x' can never
-   be recovered from if in error.
-*/
-
-input:
-  /* Nothing. */
-    {
-      $$ = 0;
-      printf ("input (%d@%d-%d): /* Nothing */\n", $$, RANGE (@$));
-    }
-| line input /* Right recursive to load the stack so that popping at
-		EOF can	be exercised.  */
-    {
-      $$ = 2;
-      printf ("input (%d@%d-%d): line (%d@%d-%d) input (%d@%d-%d)\n",
-	      $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2));
-    }
-;
-
-line:
-  thing thing thing ';'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): thing (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ';' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2),
-              $3, RANGE (@3), $4, RANGE (@4));
-    }
-| '(' thing thing ')'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2),
-              $3, RANGE (@3), $4, RANGE (@4));
-    }
-| '(' thing ')'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), $3, RANGE (@3));
-    }
-| '(' error ')'
-    {
-      $$ = -1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) error (@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), RANGE (@2), $3, RANGE (@3));
-    }
-;
-
-thing:
-  'x'
-    {
-      $$ = $1;
-      printf ("thing (%d@%d-%d): 'x' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1));
-    }
-;
-%%
-/* Alias to ARGV[1]. */
-const char *source = 0;
-
-static int
-yylex (]AT_LEX_FORMALS[)
-{
-  static unsigned int counter = 0;
-
-  int c = ]AT_VAL[]m4_ifval([$6], [.ival])[ = counter++;
-  /* As in BASIC, line numbers go from 10 to 10.  */
-]AT_LALR1_CC_IF(
-[ AT_LOC.begin.line = AT_LOC.begin.column = 10 * c;
-  AT_LOC.end.line = AT_LOC.end.column = AT_LOC.begin.line + 9;
-],
-[ AT_LOC.first_line = AT_LOC.first_column = 10 * c;
-  AT_LOC.last_line = AT_LOC.last_column = AT_LOC.first_line + 9;
-])[
-
-  if (source[c])
-    printf ("sending: '%c'", source[c]);
-  else
-    printf ("sending: EOF");
-  printf (" (%d@%d-%d)\n", c, RANGE (]AT_LOC[));
-  return source[c];
-}
-
-]AT_LALR1_CC_IF(
-[/* A C++ error reporting function. */
-void
-yy::parser::error (const location& l, const std::string& m)
-{
-  printf ("%d-%d: %s\n", RANGE (l), m.c_str());
-}
-
-static bool yydebug;
-int
-yyparse ()
-{
-  yy::parser parser;
-  parser.set_debug_level (yydebug);
-  return parser.parse ();
-}
-],
-[static void
-yyerror (const char *msg)
-{
-  printf ("%d-%d: %s\n", RANGE (yylloc), msg);
-}])[
-
-int
-main (int argc, const char *argv[])
-{
-  int status;
-  yydebug = !!getenv ("YYDEBUG");
-  assert (argc == 2);
-  source = argv[1];
-  status = yyparse ();
-  switch (status)
-    {
-      case 0: printf ("Successful parse.\n"); break;
-      case 1: printf ("Parsing FAILED.\n"); break;
-      default: printf ("Parsing FAILED (status %d).\n", status); break;
-    }
-  return status;
-}
-]])
-
-AT_LALR1_CC_IF(
-  [AT_CHECK([bison -o input.cc input.y])
-   AT_COMPILE_CXX([input])],
-  [AT_CHECK([bison -o input.c input.y])
-   AT_COMPILE([input])])
-
-
-# Check the location of "empty"
-# -----------------------------
-# I.e., epsilon-reductions, as in "(x)" which ends by reducing
-# an empty "line" nterm.
-# FIXME: This location is not satisfying.  Depend on the lookahead?
-AT_PARSER_CHECK([./input '(x)'], 0,
-[[sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: ')' (2@20-29)
-line (0@0-29): '(' (0@0-9) thing (1@10-19) ')' (2@20-29)
-sending: EOF (3@30-39)
-input (0@29-29): /* Nothing */
-input (2@0-29): line (0@0-29) input (0@29-29)
-Freeing nterm input (2@0-29)
-Successful parse.
-]])
-
-
-# Check locations in error recovery
-# ---------------------------------
-# '(y)' is an error, but can be recovered from.  But what's the location
-# of the error itself ('y'), and of the resulting reduction ('(error)').
-AT_PARSER_CHECK([./input '(y)'], 0,
-[[sending: '(' (0@0-9)
-sending: 'y' (1@10-19)
-10-19: syntax error, unexpected 'y', expecting 'x'
-Freeing token 'y' (1@10-19)
-sending: ')' (2@20-29)
-line (-1@0-29): '(' (0@0-9) error (@10-19) ')' (2@20-29)
-sending: EOF (3@30-39)
-input (0@29-29): /* Nothing */
-input (2@0-29): line (-1@0-29) input (0@29-29)
-Freeing nterm input (2@0-29)
-Successful parse.
-]])
-
-
-# Syntax errors caught by the parser
-# ----------------------------------
-# Exercise the discarding of stack top and input until `error'
-# can be reduced.
-#
-#     '(', 'x', 'x', 'x', 'x', 'x', ')',
-#
-# Load the stack and provoke an error that cannot be caught by the
-# grammar, to check that the stack is cleared.  And make sure the
-# lookahead is freed.
-#
-#     '(', 'x', ')',
-#     '(', 'x', ')',
-#     'y'
-AT_PARSER_CHECK([./input '(xxxxx)(x)(x)y'], 1,
-[[sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: 'x' (2@20-29)
-thing (2@20-29): 'x' (2@20-29)
-sending: 'x' (3@30-39)
-30-39: syntax error, unexpected 'x', expecting ')'
-Freeing nterm thing (2@20-29)
-Freeing nterm thing (1@10-19)
-Freeing token 'x' (3@30-39)
-sending: 'x' (4@40-49)
-Freeing token 'x' (4@40-49)
-sending: 'x' (5@50-59)
-Freeing token 'x' (5@50-59)
-sending: ')' (6@60-69)
-line (-1@0-69): '(' (0@0-9) error (@10-59) ')' (6@60-69)
-sending: '(' (7@70-79)
-sending: 'x' (8@80-89)
-thing (8@80-89): 'x' (8@80-89)
-sending: ')' (9@90-99)
-line (7@70-99): '(' (7@70-79) thing (8@80-89) ')' (9@90-99)
-sending: '(' (10@100-109)
-sending: 'x' (11@110-119)
-thing (11@110-119): 'x' (11@110-119)
-sending: ')' (12@120-129)
-line (10@100-129): '(' (10@100-109) thing (11@110-119) ')' (12@120-129)
-sending: 'y' (13@130-139)
-input (0@129-129): /* Nothing */
-input (2@100-129): line (10@100-129) input (0@129-129)
-input (2@70-129): line (7@70-99) input (2@100-129)
-input (2@0-129): line (-1@0-69) input (2@70-129)
-130-139: syntax error, unexpected 'y', expecting $end
-Freeing nterm input (2@0-129)
-Freeing token 'y' (13@130-139)
-Parsing FAILED.
-]])
-
-# Check destruction upon stack overflow
-# -------------------------------------
-# Upon stack overflow, all symbols on the stack should be destroyed.
-# Only check for yacc.c.
-AT_YACC_IF([
-AT_PARSER_CHECK([./input '(x)(x)(x)(x)(x)(x)(x)'], 2,
-[[sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: ')' (2@20-29)
-line (0@0-29): '(' (0@0-9) thing (1@10-19) ')' (2@20-29)
-sending: '(' (3@30-39)
-sending: 'x' (4@40-49)
-thing (4@40-49): 'x' (4@40-49)
-sending: ')' (5@50-59)
-line (3@30-59): '(' (3@30-39) thing (4@40-49) ')' (5@50-59)
-sending: '(' (6@60-69)
-sending: 'x' (7@70-79)
-thing (7@70-79): 'x' (7@70-79)
-sending: ')' (8@80-89)
-line (6@60-89): '(' (6@60-69) thing (7@70-79) ')' (8@80-89)
-sending: '(' (9@90-99)
-sending: 'x' (10@100-109)
-thing (10@100-109): 'x' (10@100-109)
-sending: ')' (11@110-119)
-line (9@90-119): '(' (9@90-99) thing (10@100-109) ')' (11@110-119)
-sending: '(' (12@120-129)
-sending: 'x' (13@130-139)
-thing (13@130-139): 'x' (13@130-139)
-sending: ')' (14@140-149)
-line (12@120-149): '(' (12@120-129) thing (13@130-139) ')' (14@140-149)
-sending: '(' (15@150-159)
-sending: 'x' (16@160-169)
-thing (16@160-169): 'x' (16@160-169)
-sending: ')' (17@170-179)
-line (15@150-179): '(' (15@150-159) thing (16@160-169) ')' (17@170-179)
-sending: '(' (18@180-189)
-sending: 'x' (19@190-199)
-thing (19@190-199): 'x' (19@190-199)
-sending: ')' (20@200-209)
-200-209: memory exhausted
-Freeing nterm thing (19@190-199)
-Freeing nterm line (15@150-179)
-Freeing nterm line (12@120-149)
-Freeing nterm line (9@90-119)
-Freeing nterm line (6@60-89)
-Freeing nterm line (3@30-59)
-Freeing nterm line (0@0-29)
-Parsing FAILED (status 2).
-]])
-])
-
-])
-
-
-# AT_CHECK_PRINTER_AND_DESTRUCTOR([BISON-OPTIONS], [UNION-FLAG], [SKIP_FLAG])
-# ---------------------------------------------------------------------------
-m4_define([AT_CHECK_PRINTER_AND_DESTRUCTOR],
-[AT_SETUP([Printers and Destructors $2: $1])
-
-$3
-_AT_CHECK_PRINTER_AND_DESTRUCTOR($[1], $[2], $[3], $[4],
-[%error-verbose
-%debug
-%verbose
-%locations
-$1], [$2])
-
-AT_CLEANUP
-])
-
-
-AT_CHECK_PRINTER_AND_DESTRUCTOR([])
-AT_CHECK_PRINTER_AND_DESTRUCTOR([], [with union])
-
-# These tests currently fail on a Debian GNU/Linux 3.0r2 x86 host,
-# but the 2nd test succeeds on a Solaris 9 sparc hosts (Forte 7 cc).
-# Skip them until we figure out what the problem is.
-AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"])
-AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"], [with union])
-
-AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser])
-AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [with union])
diff --git a/tests/atconfig b/tests/atconfig
deleted file mode 100644
index 0f2b26b..0000000
--- a/tests/atconfig
+++ /dev/null
@@ -1,17 +0,0 @@
-# Configurable variable values for building test suites.
-# Generated by ./config.status.
-# Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
-
-# The test suite will define top_srcdir=/../.. etc.
-at_testdir='tests'
-abs_builddir='/usr/local/google/workspace/WebKit/tools/bison-2.3/tests'
-at_srcdir='.'
-abs_srcdir='/usr/local/google/workspace/WebKit/tools/bison-2.3/tests'
-at_top_srcdir='..'
-abs_top_srcdir='/usr/local/google/workspace/WebKit/tools/bison-2.3/tests/..'
-at_top_builddir='../'
-abs_top_builddir='/usr/local/google/workspace/WebKit/tools/bison-2.3/tests/../.'
-
-AUTOTEST_PATH='tests'
-
-SHELL=${CONFIG_SHELL-'/bin/sh'}
diff --git a/tests/atlocal b/tests/atlocal
deleted file mode 100644
index 849fd10..0000000
--- a/tests/atlocal
+++ /dev/null
@@ -1,30 +0,0 @@
-# tests/atlocal.  Generated from atlocal.in by configure.					-*- shell-script -*-
-# Configurable variable values for Bison test suite.
-# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-
-# We need a C compiler.
-CC='gcc'
-
-# We want no optimization.
-CFLAGS='-g   '
-
-# We need `config.h'.
-CPPFLAGS="-DHAVE_CONFIG_H=1 -I$abs_top_builddir "
-
-# Is the compiler GCC?
-GCC='yes'
-
-# The C++ compiler.
-CXX='g++'
-
-# If 'exit 77'; skip all C++ tests; otherwise ':'.
-BISON_CXX_WORKS=':'
-
-# We want no optimization with C++, too.
-CXXFLAGS='-g   '
-
-# Are special link options needed?
-LDFLAGS=''
-
-# Are special libraries needed?
-LIBS=' '
diff --git a/tests/atlocal.in b/tests/atlocal.in
deleted file mode 100644
index 15c99e6..0000000
--- a/tests/atlocal.in
+++ /dev/null
@@ -1,30 +0,0 @@
-# @configure_input@					-*- shell-script -*-
-# Configurable variable values for Bison test suite.
-# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-
-# We need a C compiler.
-CC='@CC@'
-
-# We want no optimization.
-CFLAGS='@O0CFLAGS@ @WARNING_CFLAGS@ @WERROR_CFLAGS@'
-
-# We need `config.h'.
-CPPFLAGS="-DHAVE_CONFIG_H=1 -I$abs_top_builddir @CPPFLAGS@"
-
-# Is the compiler GCC?
-GCC='@GCC@'
-
-# The C++ compiler.
-CXX='@CXX@'
-
-# If 'exit 77'; skip all C++ tests; otherwise ':'.
-BISON_CXX_WORKS='@BISON_CXX_WORKS@'
-
-# We want no optimization with C++, too.
-CXXFLAGS='@O0CXXFLAGS@ @WARNING_CXXFLAGS@ @WERROR_CFLAGS@'
-
-# Are special link options needed?
-LDFLAGS='@LDFLAGS@'
-
-# Are special libraries needed?
-LIBS='@LIBS@ @INTLLIBS@'
diff --git a/tests/bison b/tests/bison
deleted file mode 100755
index 82dd651..0000000
--- a/tests/bison
+++ /dev/null
@@ -1,8 +0,0 @@
-#! /bin/sh
-# tests/bison.  Generated from bison.in by configure.
-# Wrapper around a non installed bison to make it work as an installed one.
-
-# Use the shipped files, not those installed.
-BISON_PKGDATADIR='/usr/local/google/workspace/WebKit/tools/bison-2.3/tests/../data'
-export BISON_PKGDATADIR
-exec $PREBISON '/usr/local/google/workspace/WebKit/tools/bison-2.3/tests/.././src/bison' ${1+"$@"}
diff --git a/tests/bison.in b/tests/bison.in
deleted file mode 100644
index b90c087..0000000
--- a/tests/bison.in
+++ /dev/null
@@ -1,8 +0,0 @@
-#! @SHELL@
-# @configure_input@
-# Wrapper around a non installed bison to make it work as an installed one.
-
-# Use the shipped files, not those installed.
-BISON_PKGDATADIR='@abs_top_srcdir@/data'
-export BISON_PKGDATADIR
-exec $PREBISON '@abs_top_builddir@/src/bison' ${1+"$@"}
diff --git a/tests/c++.at b/tests/c++.at
deleted file mode 100644
index e1bd906..0000000
--- a/tests/c++.at
+++ /dev/null
@@ -1,103 +0,0 @@
-# Checking the output filenames.                    -*- Autotest -*-
-# Copyright (C) 2004, 2005 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.
-
-AT_BANNER([[C++ Features.]])
-
-
-## ----------------------- ##
-## Doxygen Documentation.  ##
-## ----------------------- ##
-
-m4_define([AT_CHECK_DOXYGEN],
-[m4_case([$1],
-         [Public],  [m4_pushdef([AT_DOXYGEN_PRIVATE], [NO])],
-         [Private], [m4_pushdef([AT_DOXYGEN_PRIVATE], [YES])],
-	 [m4_fatal([invalid argument: $1])])
-AT_SETUP([Doxygen $1 Documentation])
-
-AT_DATA([input.yy],
-[[%skeleton "lalr1.cc"
-%locations
-%debug
-%defines
-%%
-exp:;
-%%
-yy::parser::error (const location& l, const std::string& m)
-{
-  std::cerr << l << s << std::endl;
-}
-]])
-
-AT_CHECK([bison -o input.cc input.yy], 0)
-
-AT_DATA([Doxyfile],
-[# The PROJECT_NAME tag is a single word (or a sequence of words
-# surrounded by quotes) that should identify the project.
-PROJECT_NAME = "Bison C++ Parser"
-
-# The QUIET tag can be used to turn on/off the messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-QUIET = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages
-# that are generated by doxygen. Possible values are YES and NO. If
-# left blank NO is used.
-WARNINGS     = YES
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate
-# warnings for undocumented members. If EXTRACT_ALL is set to YES then
-# this flag will automatically be disabled.
-WARN_IF_UNDOCUMENTED   = YES
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings
-# for potential errors in the documentation, such as not documenting
-# some parameters in a documented function, or documenting parameters
-# that don't exist or using markup commands wrongly.
-WARN_IF_DOC_ERROR      = YES
-# The WARN_FORMAT tag determines the format of the warning messages
-# that doxygen can produce. The string should contain the $file,
-# $line, and $text tags, which will be replaced by the file and line
-# number from which the warning originated and the warning text.
-WARN_FORMAT            = "$file:$line: $text"
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all
-# entities in documentation are documented, even if no documentation
-# was available.  Private class members and static file members will
-# be hidden unless the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set
-# to YES
-EXTRACT_ALL            = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a
-# class will be included in the documentation.
-EXTRACT_PRIVATE        = AT_DOXYGEN_PRIVATE
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-EXTRACT_STATIC         = AT_DOXYGEN_PRIVATE
-])
-
-AT_CHECK([doxygen --version || exit 77], 0, ignore)
-AT_CHECK([doxygen], 0, [], [ignore])
-
-AT_CLEANUP
-
-m4_popdef([AT_DOXYGEN_PRIVATE])
-])# AT_CHECK_DOXYGEN
-
-AT_CHECK_DOXYGEN([Public])
-AT_CHECK_DOXYGEN([Private])
diff --git a/tests/calc.at b/tests/calc.at
deleted file mode 100644
index dedf568..0000000
--- a/tests/calc.at
+++ /dev/null
@@ -1,653 +0,0 @@
-# Simple calculator.                         -*- Autotest -*-
-
-# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 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.
-
-## ---------------------------------------------------- ##
-## Compile the grammar described in the documentation.  ##
-## ---------------------------------------------------- ##
-
-
-# ------------------------- #
-# Helping Autotest macros.  #
-# ------------------------- #
-
-
-# _AT_DATA_CALC_Y($1, $2, $3, [BISON-DIRECTIVES])
-# -----------------------------------------------
-# Produce `calc.y'.  Don't call this macro directly, because it contains
-# some occurrences of `$1' etc. which will be interpreted by m4.  So
-# you should call it with $1, $2, and $3 as arguments, which is what
-# AT_DATA_CALC_Y does.
-m4_define([_AT_DATA_CALC_Y],
-[m4_if([$1$2$3], $[1]$[2]$[3], [],
-       [m4_fatal([$0: Invalid arguments: $@])])dnl
-AT_DATA_GRAMMAR([calc.y],
-[[/* Infix notation calculator--calc */
-]$4
-AT_SKEL_CC_IF(
-[%define "global_tokens_and_yystype"])[
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-]AT_SKEL_CC_IF(
-[#ifndef YYLTYPE
-[#] define YYLTYPE AT_NAME_PREFIX::location
-#endif
-#define first_line   begin.line
-#define first_column begin.column
-#define last_line    end.line
-#define last_column  end.column
-],
-[/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (AT_YYERROR_ARG_LOC_IF([YYLTYPE *llocp, ])
-                     AT_PARAM_IF([semantic_value *result, int *count, ])
-                     const char *s
-                     );])[
-static int yylex (]AT_LEX_FORMALS[);
-static int get_char (]AT_LEX_FORMALS[);
-static void unget_char (]AT_LEX_PRE_FORMALS[ int c);
-%}
-
-]AT_SKEL_CC_IF(
-[/* The lalr1.cc skeleton, for backward compatibility, defines
-   a constructor for position that initializes the filename.  The
-   glr.cc skeleton does not (and in fact cannot: location/position
-   are stored in a union, from which objects with constructors are
-   excluded in C++. */
-%initial-action {
-  @$.initialize (0);
-}
-])[
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         { ]AT_PARAM_IF([++*count; ++global_count;])[ }
-;
-
-line:
-  '\n'
-| exp '\n'           { ]AT_PARAM_IF([*result = global_result = $1], [USE ($1)])[; }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-]AT_SKEL_CC_IF(
-[/* A C++ error reporting function.  */
-void
-AT_NAME_PREFIX::parser::error (const location& l, const std::string& m)
-{
-  (void) l;
-  std::cerr << AT_LOCATION_IF([l << ": " << ])m << std::endl;
-}
-
-int
-yyparse (AT_PARAM_IF([semantic_value *result, int *count]))
-{
-  AT_NAME_PREFIX::parser parser[]AT_PARAM_IF([ (result, count)]);
-  parser.set_debug_level (!!YYDEBUG);
-  return parser.parse ();
-}
-],
-[static void
-yyerror (AT_YYERROR_ARG_LOC_IF([YYLTYPE *llocp, ])
-         AT_PARAM_IF([semantic_value *result, int *count, ])
-         const char *s)
-{
-AT_PARAM_IF([(void) result; (void) count;])
-AT_YYERROR_SEES_LOC_IF([
-  fprintf (stderr, "%d.%d",
-           AT_LOC.first_line, AT_LOC.first_column);
-  if (AT_LOC.first_line != AT_LOC.last_line)
-    fprintf (stderr, "-%d.%d",
-	     AT_LOC.last_line,  AT_LOC.last_column - 1);
-  else if (AT_LOC.first_column != AT_LOC.last_column - 1)
-    fprintf (stderr, "-%d",
-	     AT_LOC.last_column - 1);
-  fprintf (stderr, ": ");])
-  fprintf (stderr, "%s\n", s);
-}])[
-
-
-]AT_LOCATION_IF([
-static YYLTYPE last_yylloc;
-])[
-static int
-get_char (]AT_LEX_FORMALS[)
-{
-  int res = getc (input);
-  ]AT_USE_LEX_ARGS[;
-]AT_LOCATION_IF([
-  last_yylloc = AT_LOC;
-  if (res == '\n')
-    {
-      AT_LOC.last_line++;
-      AT_LOC.last_column = 0;
-    }
-  else
-    AT_LOC.last_column++;
-])[
-  return res;
-}
-
-
-static void
-unget_char (]AT_LEX_PRE_FORMALS[ int c)
-{
-  ]AT_USE_LEX_ARGS[;
-]AT_LOCATION_IF([
-  /* Wrong when C == `\n'. */
-  AT_LOC = last_yylloc;
-])[
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (]AT_LEX_FORMALS[)
-{
-  int c = get_char (]AT_LEX_ARGS[);
-  int sign = 1;
-  int n = 0;
-
-  ]AT_USE_LEX_ARGS[;
-  if (c == '-')
-    {
-      c = get_char (]AT_LEX_ARGS[);
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char (]AT_LEX_ARGS[);
-    }
-
-  unget_char (]AT_LEX_PRE_ARGS[ c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (]AT_LEX_FORMALS[)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-]AT_LOCATION_IF([
-      AT_LOC.last_column = 0;
-      AT_LOC.last_line = 1;
-])[
-    }
-
-]AT_LOCATION_IF([
- AT_LOC.first_column = AT_LOC.last_column;
-  AT_LOC.first_line   = AT_LOC.last_line;
-])[
-
-  /* Skip white space.  */
-  while ((c = get_char (]AT_LEX_ARGS[)) == ' ' || c == '\t')
-    {
-]AT_LOCATION_IF(
-[     AT_LOC.first_column = AT_LOC.last_column;
-      AT_LOC.first_line   = AT_LOC.last_line;
-])[
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char (]AT_LEX_PRE_ARGS[ c);
-      ]AT_VAL[.ival = read_signed_integer (]AT_LEX_ARGS[);
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-]AT_SKEL_CC_IF([], [m4_bmatch([$4], [%debug],
-[  yydebug = 1;])])[
-  status = yyparse (]AT_PARAM_IF([&result, &count])[);
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-]])
-])# _AT_DATA_CALC_Y
-
-
-# AT_DATA_CALC_Y([BISON-OPTIONS])
-# -------------------------------
-# Produce `calc.y'.
-m4_define([AT_DATA_CALC_Y],
-[_AT_DATA_CALC_Y($[1], $[2], $[3], [$1])
-])
-
-
-
-# _AT_CHECK_CALC(BISON-OPTIONS, INPUT, [NUM-STDERR-LINES])
-# --------------------------------------------------------
-# Run `calc' on INPUT and expect no STDOUT nor STDERR.
-#
-# If BISON-OPTIONS contains `%debug' but not `%glr-parser', then
-#
-# NUM-STDERR-LINES is the number of expected lines on stderr.
-# Currently this is ignored, though, since the output format is fluctuating.
-#
-# We don't count GLR's traces yet, since its traces are somewhat
-# different from LALR's.
-m4_define([_AT_CHECK_CALC],
-[AT_DATA([[input]],
-[[$2
-]])
-AT_PARSER_CHECK([./calc input], 0, [], [stderr])
-])
-
-
-# _AT_CHECK_CALC_ERROR(BISON-OPTIONS, EXIT-STATUS, INPUT,
-#                      [NUM-STDERR-LINES],
-#                      [VERBOSE-AND-LOCATED-ERROR-MESSAGE])
-# ---------------------------------------------------------
-# Run `calc' on INPUT, and expect a `syntax error' message.
-#
-# If INPUT starts with a slash, it is used as absolute input file name,
-# otherwise as contents.
-#
-# NUM-STDERR-LINES is the number of expected lines on stderr.
-# Currently this is ignored, though, since the output format is fluctuating.
-#
-# If BISON-OPTIONS contains `%location', then make sure the ERROR-LOCATION
-# is correctly output on stderr.
-#
-# If BISON-OPTIONS contains `%error-verbose', then make sure the
-# IF-YYERROR-VERBOSE message is properly output after `syntax error, '
-# on STDERR.
-#
-# If BISON-OPTIONS contains `%debug' but not `%glr', then NUM-STDERR-LINES
-# is the number of expected lines on stderr.
-m4_define([_AT_CHECK_CALC_ERROR],
-[m4_bmatch([$3], [^/],
-           [AT_PARSER_CHECK([./calc $3], $2, [], [stderr])],
-           [AT_DATA([[input]],
-[[$3
-]])
-AT_PARSER_CHECK([./calc input], $2, [], [stderr])])
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[[0-9$]]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-AT_DATA([[expout]],
-[$5
-])
-# 3. If locations are not used, remove them.
-AT_YYERROR_SEES_LOC_IF([],
-[[sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout]])
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-m4_bmatch([$1], [%error-verbose], [],
-[[sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout]])
-# 5. Check
-AT_CHECK([cat stderr], 0, [expout])
-])
-
-
-# AT_CHECK_CALC([BISON-OPTIONS, [EXPECTED-TO-FAIL]])
-# --------------------------------------------------
-# Start a testing chunk which compiles `calc' grammar with
-# BISON-OPTIONS, and performs several tests over the parser.
-# However, if EXPECTED-TO-FAIL is nonempty, this test is expected to fail.
-m4_define([AT_CHECK_CALC],
-[# We use integers to avoid dependencies upon the precision of doubles.
-AT_SETUP([Calculator $1])
-
-m4_ifval([$2], [AT_CHECK([exit 77])])
-
-AT_BISON_OPTION_PUSHDEFS([$1])
-
-AT_DATA_CALC_Y([$1])
-
-AT_SKEL_CC_IF(
-  [AT_CHECK([bison -o calc.cc calc.y])
-   AT_COMPILE_CXX([calc])],
-  [AT_CHECK([bison -o calc.c calc.y])
-   AT_COMPILE([calc])])
-
-# Test the priorities.
-_AT_CHECK_CALC([$1],
-[1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64],
-               [842])
-
-# Some syntax errors.
-_AT_CHECK_CALC_ERROR([$1], [1], [0 0], [15],
-                     [1.2: syntax error, unexpected number])
-_AT_CHECK_CALC_ERROR([$1], [1], [1//2], [20],
-                     [1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'])
-_AT_CHECK_CALC_ERROR([$1], [1], [error], [5],
-                     [1.0: syntax error, unexpected $undefined])
-_AT_CHECK_CALC_ERROR([$1], [1], [1 = 2 = 3], [30],
-                     [1.6: syntax error, unexpected '='])
-_AT_CHECK_CALC_ERROR([$1], [1],
-                     [
-+1],
-                     [20],
-                     [2.0: syntax error, unexpected '+'])
-# Exercise error messages with EOF: work on an empty file.
-_AT_CHECK_CALC_ERROR([$1], [1], [/dev/null], [4],
-                     [1.0: syntax error, unexpected end of input])
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-_AT_CHECK_CALC_ERROR([$1], [0],
-                     [() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1],
-                     [250],
-[1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1])
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-_AT_CHECK_CALC_ERROR([$1], [0], [(!) + (0 0) = 1], [102],
-[1.9: syntax error, unexpected number
-calc: error: 2222 != 1])
-_AT_CHECK_CALC_ERROR([$1], [0], [(- *) + (0 0) = 1], [113],
-[1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1])
-AT_BISON_OPTION_POPDEFS
-
-AT_CLEANUP
-])# AT_CHECK_CALC
-
-
-
-
-# ------------------------ #
-# Simple LALR Calculator.  #
-# ------------------------ #
-
-AT_BANNER([[Simple LALR(1) Calculator.]])
-
-# AT_CHECK_CALC_LALR([BISON-OPTIONS])
-# -----------------------------------
-# Start a testing chunk which compiles `calc' grammar with
-# BISON-OPTIONS, and performs several tests over the parser.
-m4_define([AT_CHECK_CALC_LALR],
-[AT_CHECK_CALC($@)])
-
-AT_CHECK_CALC_LALR()
-
-AT_CHECK_CALC_LALR([%defines])
-AT_CHECK_CALC_LALR([%locations])
-AT_CHECK_CALC_LALR([%name-prefix="calc"])
-AT_CHECK_CALC_LALR([%verbose])
-AT_CHECK_CALC_LALR([%yacc])
-AT_CHECK_CALC_LALR([%error-verbose])
-
-AT_CHECK_CALC_LALR([%pure-parser %locations])
-AT_CHECK_CALC_LALR([%error-verbose %locations])
-
-AT_CHECK_CALC_LALR([%error-verbose %locations %defines %name-prefix="calc" %verbose %yacc])
-
-AT_CHECK_CALC_LALR([%debug])
-AT_CHECK_CALC_LALR([%error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc])
-
-AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc])
-
-AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
-
-
-# ----------------------- #
-# Simple GLR Calculator.  #
-# ----------------------- #
-
-AT_BANNER([[Simple GLR Calculator.]])
-
-# AT_CHECK_CALC_GLR([BISON-OPTIONS])
-# ----------------------------------
-# Start a testing chunk which compiles `calc' grammar with
-# BISON-OPTIONS and %glr-parser, and performs several tests over the parser.
-m4_define([AT_CHECK_CALC_GLR],
-[AT_CHECK_CALC([%glr-parser] $@)])
-
-
-AT_CHECK_CALC_GLR()
-
-AT_CHECK_CALC_GLR([%defines])
-AT_CHECK_CALC_GLR([%locations])
-AT_CHECK_CALC_GLR([%name-prefix="calc"])
-AT_CHECK_CALC_GLR([%verbose])
-AT_CHECK_CALC_GLR([%yacc])
-AT_CHECK_CALC_GLR([%error-verbose])
-
-AT_CHECK_CALC_GLR([%pure-parser %locations])
-AT_CHECK_CALC_GLR([%error-verbose %locations])
-
-AT_CHECK_CALC_GLR([%error-verbose %locations %defines %name-prefix="calc" %verbose %yacc])
-
-AT_CHECK_CALC_GLR([%debug])
-AT_CHECK_CALC_GLR([%error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc])
-
-AT_CHECK_CALC_GLR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc])
-
-AT_CHECK_CALC_GLR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
-
-
-# ----------------------------- #
-# Simple LALR1 C++ Calculator.  #
-# ----------------------------- #
-
-AT_BANNER([[Simple LALR(1) C++ Calculator.]])
-
-# AT_CHECK_CALC_LALR1_CC([BISON-OPTIONS])
-# ---------------------------------------
-# Start a testing chunk which compiles `calc' grammar with
-# the C++ skeleton, and performs several tests over the parser.
-m4_define([AT_CHECK_CALC_LALR1_CC],
-[AT_CHECK_CALC([%skeleton "lalr1.cc" %defines %locations] $@)])
-
-AT_CHECK_CALC_LALR1_CC([])
-AT_CHECK_CALC_LALR1_CC([%error-verbose %name-prefix="calc" %verbose %yacc])
-
-AT_CHECK_CALC_LALR1_CC([%error-verbose %debug %name-prefix="calc" %verbose %yacc])
-
-AT_CHECK_CALC_LALR1_CC([%pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc])
-
-AT_CHECK_CALC_LALR1_CC([%pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
-
-
-
-# --------------------------- #
-# Simple GLR C++ Calculator.  #
-# --------------------------- #
-
-AT_BANNER([[Simple GLR C++ Calculator.]])
-
-# AT_CHECK_CALC_GLR_CC([BISON-OPTIONS])
-# -------------------------------------
-# Start a testing chunk which compiles `calc' grammar with
-# the GLR C++ skeleton, and performs several tests over the parser.
-m4_define([AT_CHECK_CALC_GLR_CC],
-[AT_CHECK_CALC([%skeleton "glr.cc" %defines %locations] $@)])
-
-#AT_CHECK_CALC_GLR_CC([])
-#AT_CHECK_CALC_GLR_CC([%error-verbose %name-prefix="calc" %verbose %yacc])
-
-# AT_CHECK_CALC_GLR_CC([%debug])
-#AT_CHECK_CALC_GLR_CC([%error-verbose %debug %name-prefix="calc" %verbose %yacc])
-
-AT_CHECK_CALC_GLR_CC([%pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc])
-
-AT_CHECK_CALC_GLR_CC([%pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
diff --git a/tests/conflicts.at b/tests/conflicts.at
deleted file mode 100644
index 1cbf23a..0000000
--- a/tests/conflicts.at
+++ /dev/null
@@ -1,620 +0,0 @@
-# Exercising Bison on conflicts.                         -*- Autotest -*-
-
-# Copyright (C) 2002, 2003, 2004, 2005 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.
-
-AT_BANNER([[Conflicts.]])
-
-
-## ---------------- ##
-## S/R in initial.  ##
-## ---------------- ##
-
-# I once hacked Bison in such a way that it lost its reductions on the
-# initial state (because it was confusing it with the last state).  It
-# took me a while to strip down my failures to this simple case.  So
-# make sure it finds the s/r conflict below.
-
-AT_SETUP([S/R in initial])
-
-AT_DATA([[input.y]],
-[[%expect 1
-%%
-exp: e 'e';
-e: 'e' | /* Nothing. */;
-]])
-
-AT_CHECK([bison -o input.c input.y], 0, [],
-[[input.y:4.9: warning: rule never reduced because of conflicts: e: /* empty */
-]])
-
-AT_CLEANUP
-
-
-## ------------------- ##
-## %nonassoc and eof.  ##
-## ------------------- ##
-
-AT_SETUP([%nonassoc and eof])
-
-AT_DATA_GRAMMAR([input.y],
-[[
-%{
-#include <stdio.h>
-#include <stdlib.h>
-
-#define YYERROR_VERBOSE 1
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-/* The current argument. */
-static const char *input = NULL;
-
-static int
-yylex (void)
-{
-  /* No token stands for end of file. */
-  if (input && *input)
-    return *input++;
-  else
-    return 0;
-}
-
-%}
-
-%nonassoc '<' '>'
-
-%%
-expr: expr '<' expr
-    | expr '>' expr
-    | '0'
-    ;
-%%
-int
-main (int argc, const char *argv[])
-{
-  if (argc > 1)
-    input = argv[1];
-  return yyparse ();
-}
-]])
-
-# Specify the output files to avoid problems on different file systems.
-AT_CHECK([bison -o input.c input.y])
-AT_COMPILE([input])
-
-AT_PARSER_CHECK([./input '0<0'])
-# FIXME: This is an actual bug, but a new one, in the sense that
-# no one has ever spotted it!  The messages are *wrong*: there should
-# be nothing there, it should be expected eof.
-AT_PARSER_CHECK([./input '0<0<0'], [1], [],
-         [syntax error, unexpected '<', expecting '<' or '>'
-])
-
-AT_PARSER_CHECK([./input '0>0'])
-AT_PARSER_CHECK([./input '0>0>0'], [1], [],
-         [syntax error, unexpected '>', expecting '<' or '>'
-])
-
-AT_PARSER_CHECK([./input '0<0>0'], [1], [],
-         [syntax error, unexpected '>', expecting '<' or '>'
-])
-
-AT_CLEANUP
-
-
-
-## ------------------------- ##
-## Unresolved SR Conflicts.  ##
-## ------------------------- ##
-
-AT_SETUP([Unresolved SR Conflicts])
-
-AT_KEYWORDS([report])
-
-AT_DATA([input.y],
-[[%token NUM OP
-%%
-exp: exp OP exp | NUM;
-]])
-
-AT_CHECK([bison -o input.c --report=all input.y], 0, [],
-[input.y: conflicts: 1 shift/reduce
-])
-
-# Check the contents of the report.
-AT_CHECK([cat input.output], [],
-[[State 5 conflicts: 1 shift/reduce
-
-
-Grammar
-
-    0 $accept: exp $end
-
-    1 exp: exp OP exp
-    2    | NUM
-
-
-Terminals, with rules where they appear
-
-$end (0) 0
-error (256)
-NUM (258) 2
-OP (259) 1
-
-
-Nonterminals, with rules where they appear
-
-$accept (5)
-    on left: 0
-exp (6)
-    on left: 1 2, on right: 0 1
-
-
-state 0
-
-    0 $accept: . exp $end
-    1 exp: . exp OP exp
-    2    | . NUM
-
-    NUM  shift, and go to state 1
-
-    exp  go to state 2
-
-
-state 1
-
-    2 exp: NUM .
-
-    $default  reduce using rule 2 (exp)
-
-
-state 2
-
-    0 $accept: exp . $end
-    1 exp: exp . OP exp
-
-    $end  shift, and go to state 3
-    OP    shift, and go to state 4
-
-
-state 3
-
-    0 $accept: exp $end .
-
-    $default  accept
-
-
-state 4
-
-    1 exp: . exp OP exp
-    1    | exp OP . exp
-    2    | . NUM
-
-    NUM  shift, and go to state 1
-
-    exp  go to state 5
-
-
-state 5
-
-    1 exp: exp . OP exp  [$end, OP]
-    1    | exp OP exp .  [$end, OP]
-
-    OP  shift, and go to state 4
-
-    OP        [reduce using rule 1 (exp)]
-    $default  reduce using rule 1 (exp)
-]])
-
-AT_CLEANUP
-
-
-
-## ----------------------- ##
-## Resolved SR Conflicts.  ##
-## ----------------------- ##
-
-AT_SETUP([Resolved SR Conflicts])
-
-AT_KEYWORDS([report])
-
-AT_DATA([input.y],
-[[%token NUM OP
-%left OP
-%%
-exp: exp OP exp | NUM;
-]])
-
-AT_CHECK([bison -o input.c --report=all input.y])
-
-# Check the contents of the report.
-AT_CHECK([cat input.output], [],
-[[Grammar
-
-    0 $accept: exp $end
-
-    1 exp: exp OP exp
-    2    | NUM
-
-
-Terminals, with rules where they appear
-
-$end (0) 0
-error (256)
-NUM (258) 2
-OP (259) 1
-
-
-Nonterminals, with rules where they appear
-
-$accept (5)
-    on left: 0
-exp (6)
-    on left: 1 2, on right: 0 1
-
-
-state 0
-
-    0 $accept: . exp $end
-    1 exp: . exp OP exp
-    2    | . NUM
-
-    NUM  shift, and go to state 1
-
-    exp  go to state 2
-
-
-state 1
-
-    2 exp: NUM .
-
-    $default  reduce using rule 2 (exp)
-
-
-state 2
-
-    0 $accept: exp . $end
-    1 exp: exp . OP exp
-
-    $end  shift, and go to state 3
-    OP    shift, and go to state 4
-
-
-state 3
-
-    0 $accept: exp $end .
-
-    $default  accept
-
-
-state 4
-
-    1 exp: . exp OP exp
-    1    | exp OP . exp
-    2    | . NUM
-
-    NUM  shift, and go to state 1
-
-    exp  go to state 5
-
-
-state 5
-
-    1 exp: exp . OP exp  [$end, OP]
-    1    | exp OP exp .  [$end, OP]
-
-    $default  reduce using rule 1 (exp)
-
-    Conflict between rule 1 and token OP resolved as reduce (%left OP).
-]])
-
-AT_CLEANUP
-
-
-## -------------------------------- ##
-## Defaulted Conflicted Reduction.  ##
-## -------------------------------- ##
-
-# When there are RR conflicts, some rules are disabled.  Usually it is
-# simply displayed as:
-#
-#    $end           reduce using rule 3 (num)
-#    $end           [reduce using rule 4 (id)]
-#
-# But when `reduce 3' is the default action, we'd produce:
-#
-#    $end           [reduce using rule 4 (id)]
-#    $default    reduce using rule 3 (num)
-#
-# In this precise case (a reduction is masked by the default
-# reduction), we make the `reduce 3' explicit:
-#
-#    $end           reduce using rule 3 (num)
-#    $end           [reduce using rule 4 (id)]
-#    $default    reduce using rule 3 (num)
-#
-# Maybe that's not the best display, but then, please propose something
-# else.
-
-AT_SETUP([Defaulted Conflicted Reduction])
-AT_KEYWORDS([report])
-
-AT_DATA([input.y],
-[[%%
-exp: num | id;
-num: '0';
-id : '0';
-%%
-]])
-
-AT_CHECK([bison -o input.c --report=all input.y], 0, [],
-[[input.y: conflicts: 1 reduce/reduce
-input.y:4.6-8: warning: rule never reduced because of conflicts: id: '0'
-]])
-
-# Check the contents of the report.
-AT_CHECK([cat input.output], [],
-[[Rules never reduced
-
-    4 id: '0'
-
-
-State 1 conflicts: 1 reduce/reduce
-
-
-Grammar
-
-    0 $accept: exp $end
-
-    1 exp: num
-    2    | id
-
-    3 num: '0'
-
-    4 id: '0'
-
-
-Terminals, with rules where they appear
-
-$end (0) 0
-'0' (48) 3 4
-error (256)
-
-
-Nonterminals, with rules where they appear
-
-$accept (4)
-    on left: 0
-exp (5)
-    on left: 1 2, on right: 0
-num (6)
-    on left: 3, on right: 1
-id (7)
-    on left: 4, on right: 2
-
-
-state 0
-
-    0 $accept: . exp $end
-    1 exp: . num
-    2    | . id
-    3 num: . '0'
-    4 id: . '0'
-
-    '0'  shift, and go to state 1
-
-    exp  go to state 2
-    num  go to state 3
-    id   go to state 4
-
-
-state 1
-
-    3 num: '0' .  [$end]
-    4 id: '0' .  [$end]
-
-    $end      reduce using rule 3 (num)
-    $end      [reduce using rule 4 (id)]
-    $default  reduce using rule 3 (num)
-
-
-state 2
-
-    0 $accept: exp . $end
-
-    $end  shift, and go to state 5
-
-
-state 3
-
-    1 exp: num .
-
-    $default  reduce using rule 1 (exp)
-
-
-state 4
-
-    2 exp: id .
-
-    $default  reduce using rule 2 (exp)
-
-
-state 5
-
-    0 $accept: exp $end .
-
-    $default  accept
-]])
-
-AT_CLEANUP
-
-
-
-
-## -------------------- ##
-## %expect not enough.  ##
-## -------------------- ##
-
-AT_SETUP([%expect not enough])
-
-AT_DATA([input.y],
-[[%token NUM OP
-%expect 0
-%%
-exp: exp OP exp | NUM;
-]])
-
-AT_CHECK([bison -o input.c input.y], 1, [],
-[input.y: conflicts: 1 shift/reduce
-input.y: expected 0 shift/reduce conflicts
-])
-AT_CLEANUP
-
-
-## --------------- ##
-## %expect right.  ##
-## --------------- ##
-
-AT_SETUP([%expect right])
-
-AT_DATA([input.y],
-[[%token NUM OP
-%expect 1
-%%
-exp: exp OP exp | NUM;
-]])
-
-AT_CHECK([bison -o input.c input.y])
-AT_CLEANUP
-
-
-## ------------------ ##
-## %expect too much.  ##
-## ------------------ ##
-
-AT_SETUP([%expect too much])
-
-AT_DATA([input.y],
-[[%token NUM OP
-%expect 2
-%%
-exp: exp OP exp | NUM;
-]])
-
-AT_CHECK([bison -o input.c input.y], 1, [],
-[input.y: conflicts: 1 shift/reduce
-input.y: expected 2 shift/reduce conflicts
-])
-AT_CLEANUP
-
-
-## ------------------------------ ##
-## %expect with reduce conflicts  ##
-## ------------------------------ ##
-
-AT_SETUP([%expect with reduce conflicts])
-
-AT_DATA([input.y],
-[[%expect 0
-%%
-program: a 'a' | a a;
-a: 'a';
-]])
-
-AT_CHECK([bison -o input.c input.y], 1, [],
-[input.y: conflicts: 1 reduce/reduce
-input.y: expected 0 reduce/reduce conflicts
-])
-AT_CLEANUP
-
-
-## ------------------------------- ##
-## %no-default-prec without %prec  ##
-## ------------------------------- ##
-
-AT_SETUP([%no-default-prec without %prec])
-
-AT_DATA([[input.y]],
-[[%left '+'
-%left '*'
-
-%%
-
-%no-default-prec;
-
-e:   e '+' e
-   | e '*' e
-   | '0'
-   ;
-]])
-
-AT_CHECK([bison -o input.c input.y], 0, [],
-[[input.y: conflicts: 4 shift/reduce
-]])
-AT_CLEANUP
-
-
-## ---------------------------- ##
-## %no-default-prec with %prec  ##
-## ---------------------------- ##
-
-AT_SETUP([%no-default-prec with %prec])
-
-AT_DATA([[input.y]],
-[[%left '+'
-%left '*'
-
-%%
-
-%no-default-prec;
-
-e:   e '+' e %prec '+'
-   | e '*' e %prec '*'
-   | '0'
-   ;
-]])
-
-AT_CHECK([bison -o input.c input.y])
-AT_CLEANUP
-
-
-## ---------------- ##
-## %default-prec    ##
-## ---------------- ##
-
-AT_SETUP([%default-prec])
-
-AT_DATA([[input.y]],
-[[%left '+'
-%left '*'
-
-%%
-
-%default-prec;
-
-e:   e '+' e
-   | e '*' e
-   | '0'
-   ;
-]])
-
-AT_CHECK([bison -o input.c input.y])
-AT_CLEANUP
diff --git a/tests/cxx-type.at b/tests/cxx-type.at
deleted file mode 100644
index b716a1d..0000000
--- a/tests/cxx-type.at
+++ /dev/null
@@ -1,471 +0,0 @@
-# Checking GLR Parsing.                         -*- Autotest -*-
-# Copyright (C) 2002, 2003, 2004, 2005, 2006 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.
-
-AT_BANNER([[C++ Type Syntax (GLR).]])
-
-# _AT_TEST_GLR_CXXTYPES(DECL, RESOLVE1, RESOLVE2)
-# -----------------------------------------------
-# Store into types.y the calc program, with DECL inserted as a declaration,
-# and with RESOLVE1 and RESOLVE2 as annotations on the conflicted rule for
-# stmt.  Then compile the result.
-m4_define([_AT_TEST_GLR_CXXTYPES],
-[
-AT_BISON_OPTION_PUSHDEFS([$1])
-
-AT_DATA_GRAMMAR([types.y],
-[[/* Simplified C++ Type and Expression Grammar.  */
-
-$1
-
-%{
-  #include <stdio.h>
-  union Node {
-    struct {
-      int isNterm;
-      int parents;
-    } nodeInfo;
-    struct {
-      int isNterm; /* 1 */
-      int parents;
-      char const *form;
-      union Node *children[3];
-    } nterm;
-    struct {
-      int isNterm; /* 0 */
-      int parents;
-      char *text;
-    } term;
-  };
-  typedef union Node Node;
-  static Node *new_nterm (char const *, Node *, Node *, Node *);
-  static Node *new_term (char *);
-  static void free_node (Node *);
-  static char *node_to_string (Node *);
-  #define YYSTYPE Node *
-]m4_bmatch([$2], [stmtMerge],
-[ static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);])[
-  #define YYINITDEPTH 10
-  #define YYSTACKEXPANDABLE 1
-  struct YYLTYPE;
-#if YYPURE
-# if YYLSP_NEEDED
-#  define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp
-#  define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s
-# else
-#  define LEX_PARAMETERS YYSTYPE *lvalp
-# endif
-#endif
-#ifndef LEX_PARAMETERS
-# define LEX_PARAMETERS void
-#endif
-#ifndef ERROR_PARAMETERS
-# define ERROR_PARAMETERS char const *s
-#endif
-  int yylex (LEX_PARAMETERS);
-  void yyerror (ERROR_PARAMETERS);
-%}
-
-%token TYPENAME ID
-
-%right '='
-%left '+'
-
-%glr-parser
-
-%destructor { free_node ($$); } stmt expr decl declarator TYPENAME ID
-
-%%
-
-prog :
-     | prog stmt   {
-			char *output;]AT_LOCATION_IF([
-			printf ("%d.%d-%d.%d: ",
-			     @2.first_line, @2.first_column,
-			     @2.last_line, @2.last_column);])[
-			output = node_to_string (]$[2);
-			printf ("%s\n", output);
-			free (output);
-			free_node (]$[2);
-		   }
-     ;
-
-stmt : expr ';'  $2	{ $$ = ]$[1; }
-     | decl      $3
-     | error ';'	{ $$ = new_nterm ("<error>", 0, 0, 0); }
-     | '@'		{ YYACCEPT; }
-     ;
-
-expr : ID
-     | TYPENAME '(' expr ')'
-			{ $$ = new_nterm ("<cast>(%s,%s)", ]$[3, ]$[1, 0); }
-     | expr '+' expr	{ $$ = new_nterm ("+(%s,%s)", ]$[1, ]$[3, 0); }
-     | expr '=' expr    { $$ = new_nterm ("=(%s,%s)", ]$[1, ]$[3, 0); }
-     ;
-
-decl : TYPENAME declarator ';'
-			{ $$ = new_nterm ("<declare>(%s,%s)", ]$[1, ]$[2, 0); }
-     | TYPENAME declarator '=' expr ';'
-			{ $$ = new_nterm ("<init-declare>(%s,%s,%s)", ]$[1,
-					  ]$[2, ]$[4); }
-     ;
-
-declarator : ID
-     | '(' declarator ')' { $$ = ]$[2; }
-     ;
-
-%%
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-int
-main (int argc, char **argv)
-{
-  if (argc != 2)
-    abort ();
-  if (!freopen (argv[1], "r", stdin))
-    return 3;
-  return yyparse ();
-}
-
-int
-yylex (LEX_PARAMETERS)
-{
-  char buffer[256];
-  int c;
-  unsigned int i;
-  static int lineNum = 1;
-  static int colNum = 0;
-
-#if YYPURE
-# undef yylloc
-# define yylloc (*llocp)
-# undef yylval
-# define yylval (*lvalp)
-#endif
-
-  while (1)
-    {
-      c = getchar ();
-      switch (c)
-	{
-	case EOF:
-	  return 0;
-	case '\t':
-	  colNum = (colNum + 7) & ~7;
-	  break;
-	case ' ': case '\f':
-	  colNum += 1;
-	  break;
-	case '\n':
-	  lineNum += 1;
-	  colNum = 0;
-	  break;
-	default:
-	  {
-	    int tok;
-#if YYLSP_NEEDED
-	    yylloc.first_line = yylloc.last_line = lineNum;
-	    yylloc.first_column = colNum;
-#endif
-	    if (isalpha (c))
-	      {
-		i = 0;
-
-		do
-		  {
-		    buffer[i++] = c;
-		    colNum += 1;
-		    if (i == sizeof buffer - 1)
-		      abort ();
-		    c = getchar ();
-		  }
-		while (isalnum (c) || c == '_');
-
-		ungetc (c, stdin);
-		buffer[i++] = 0;
-		tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID;
-		yylval = new_term (strcpy ((char *) malloc (i), buffer));
-	      }
-	    else
-	      {
-		colNum += 1;
-		tok = c;
-		yylval = 0;
-	      }
-#if YYLSP_NEEDED
-	    yylloc.last_column = colNum-1;
-#endif
-	    return tok;
-	  }
-	}
-    }
-}
-
-void
-yyerror (ERROR_PARAMETERS)
-{
-#if YYPURE && YYLSP_NEEDED
-  /* Pacify GCC by using llocp.  */
-  if (! llocp)
-    abort ();
-#endif
-  fprintf (stderr, "%s\n", s);
-}
-
-static Node *
-new_nterm (char const *form, Node *child0, Node *child1, Node *child2)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->nterm.isNterm = 1;
-  node->nterm.parents = 0;
-  node->nterm.form = form;
-  node->nterm.children[0] = child0;
-  if (child0)
-    child0->nodeInfo.parents += 1;
-  node->nterm.children[1] = child1;
-  if (child1)
-    child1->nodeInfo.parents += 1;
-  node->nterm.children[2] = child2;
-  if (child2)
-    child2->nodeInfo.parents += 1;
-  return node;
-}
-
-static Node *
-new_term (char *text)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->term.isNterm = 0;
-  node->term.parents = 0;
-  node->term.text = text;
-  return node;
-}
-
-static void
-free_node (Node *node)
-{
-  if (!node)
-    return;
-  node->nodeInfo.parents -= 1;
-  /* Free only if 0 (last parent) or -1 (no parents).  */
-  if (node->nodeInfo.parents > 0)
-    return;
-  if (node->nodeInfo.isNterm == 1)
-    {
-      free_node (node->nterm.children[0]);
-      free_node (node->nterm.children[1]);
-      free_node (node->nterm.children[2]);
-    }
-  else
-    free (node->term.text);
-  free (node);
-}
-
-static char *
-node_to_string (Node *node)
-{
-  char *child0;
-  char *child1;
-  char *child2;
-  char *buffer;
-  if (!node)
-    {
-      buffer = (char *) malloc (1);
-      buffer[0] = 0;
-    }
-  else if (node->nodeInfo.isNterm == 1)
-    {
-      child0 = node_to_string (node->nterm.children[0]);
-      child1 = node_to_string (node->nterm.children[1]);
-      child2 = node_to_string (node->nterm.children[2]);
-      buffer = (char *) malloc (strlen (node->nterm.form) + strlen (child0)
-				+ strlen (child1) + strlen (child2) + 1);
-      sprintf (buffer, node->nterm.form, child0, child1, child2);
-      free (child0);
-      free (child1);
-      free (child2);
-    }
-  else
-    buffer = strdup (node->term.text);
-  return buffer;
-}
-
-]]
-m4_bmatch([$2], [stmtMerge],
-[[static YYSTYPE
-stmtMerge (YYSTYPE x0, YYSTYPE x1)
-{
-  return new_nterm ("<OR>(%s,%s)", x0, x1, 0);
-}
-]])
-)
-
-AT_DATA([test-input],
-[[
-
-z + q;
-
-T x;
-
-T x = y;
-
-x = y;
-
-T (x) + y;
-
-T (x);
-
-T (y) = z + q;
-
-T (y y) = z + q;
-
-z + q;
-
-@
-
-This is total garbage, but it should be ignored.
-]])
-
-AT_CHECK([bison -o types.c types.y], 0, [], ignore)
-AT_COMPILE([types])
-AT_BISON_OPTION_POPDEFS
-])
-
-m4_define([_AT_RESOLVED_GLR_OUTPUT],
-[[+(z,q)
-<declare>(T,x)
-<init-declare>(T,x,y)
-=(x,y)
-+(<cast>(x,T),y)
-<declare>(T,x)
-<init-declare>(T,y,+(z,q))
-<error>
-+(z,q)
-]])
-
-m4_define([_AT_RESOLVED_GLR_OUTPUT_WITH_LOC],
-[[3.0-3.5: +(z,q)
-5.0-5.3: <declare>(T,x)
-7.0-7.7: <init-declare>(T,x,y)
-9.0-9.5: =(x,y)
-11.0-11.9: +(<cast>(x,T),y)
-13.0-13.5: <declare>(T,x)
-15.0-15.13: <init-declare>(T,y,+(z,q))
-17.0-17.15: <error>
-19.0-19.5: +(z,q)
-]])
-
-m4_define([_AT_AMBIG_GLR_OUTPUT],
-[[+(z,q)
-<declare>(T,x)
-<init-declare>(T,x,y)
-=(x,y)
-+(<cast>(x,T),y)
-<OR>(<declare>(T,x),<cast>(x,T))
-<OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
-<error>
-+(z,q)
-]])
-
-m4_define([_AT_AMBIG_GLR_OUTPUT_WITH_LOC],
-[[3.0-3.5: +(z,q)
-5.0-5.3: <declare>(T,x)
-7.0-7.7: <init-declare>(T,x,y)
-9.0-9.5: =(x,y)
-11.0-11.9: +(<cast>(x,T),y)
-13.0-13.5: <OR>(<declare>(T,x),<cast>(x,T))
-15.0-15.13: <OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
-17.0-17.15: <error>
-19.0-19.5: +(z,q)
-]])
-
-m4_define([_AT_GLR_STDERR],
-[[syntax error
-]])
-
-m4_define([_AT_VERBOSE_GLR_STDERR],
-[[syntax error, unexpected ID, expecting '=' or '+' or ')'
-]])
-
-## ---------------------------------------------------- ##
-## Compile the grammar described in the documentation.  ##
-## ---------------------------------------------------- ##
-
-AT_SETUP([GLR: Resolve ambiguity, impure, no locations])
-_AT_TEST_GLR_CXXTYPES([],
-		      [%dprec 1], [%dprec 2])
-AT_PARSER_CHECK([[./types test-input]], 0,
-		_AT_RESOLVED_GLR_OUTPUT, _AT_GLR_STDERR)
-AT_CLEANUP
-
-AT_SETUP([GLR: Resolve ambiguity, impure, locations])
-_AT_TEST_GLR_CXXTYPES([%locations],[%dprec 1],[%dprec 2])
-AT_PARSER_CHECK([[./types test-input]], 0,
-		_AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR)
-AT_CLEANUP
-
-AT_SETUP([GLR: Resolve ambiguity, pure, no locations])
-_AT_TEST_GLR_CXXTYPES([%pure-parser],
-		      [%dprec 1], [%dprec 2])
-AT_PARSER_CHECK([[./types test-input]], 0,
-		_AT_RESOLVED_GLR_OUTPUT, _AT_GLR_STDERR)
-AT_CLEANUP
-
-AT_SETUP([GLR: Resolve ambiguity, pure, locations])
-_AT_TEST_GLR_CXXTYPES([%pure-parser %locations],
-		      [%dprec 1], [%dprec 2])
-AT_PARSER_CHECK([[./types test-input]], 0,
-		_AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR)
-AT_CLEANUP
-
-AT_SETUP([GLR: Merge conflicting parses, impure, no locations])
-_AT_TEST_GLR_CXXTYPES([],
-		      [%merge <stmtMerge>], [%merge <stmtMerge>])
-AT_PARSER_CHECK([[./types test-input]], 0,
-		_AT_AMBIG_GLR_OUTPUT, _AT_GLR_STDERR)
-AT_CLEANUP
-
-AT_SETUP([GLR: Merge conflicting parses, impure, locations])
-_AT_TEST_GLR_CXXTYPES([%locations],
-		      [%merge <stmtMerge>], [%merge <stmtMerge>])
-AT_PARSER_CHECK([[./types test-input]], 0,
-		_AT_AMBIG_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR)
-AT_CLEANUP
-
-AT_SETUP([GLR: Merge conflicting parses, pure, no locations])
-_AT_TEST_GLR_CXXTYPES([%pure-parser],
-		      [%merge <stmtMerge>], [%merge <stmtMerge>])
-AT_PARSER_CHECK([[./types test-input]], 0,
-		_AT_AMBIG_GLR_OUTPUT, _AT_GLR_STDERR)
-AT_CLEANUP
-AT_SETUP([GLR: Merge conflicting parses, pure, locations])
-_AT_TEST_GLR_CXXTYPES([%pure-parser %locations],
-		      [%merge <stmtMerge>],[%merge <stmtMerge>])
-AT_PARSER_CHECK([[./types test-input]], 0,
-		_AT_AMBIG_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR)
-AT_CLEANUP
-
-AT_SETUP([GLR: Verbose messages, resolve ambiguity, impure, no locations])
-_AT_TEST_GLR_CXXTYPES([%error-verbose],
-		      [%merge <stmtMerge>], [%merge <stmtMerge>])
-AT_PARSER_CHECK([[./types test-input]], 0,
-		_AT_AMBIG_GLR_OUTPUT, _AT_VERBOSE_GLR_STDERR)
-AT_CLEANUP
diff --git a/tests/existing.at b/tests/existing.at
deleted file mode 100644
index 9db625a..0000000
--- a/tests/existing.at
+++ /dev/null
@@ -1,1525 +0,0 @@
-# Exercising Bison on actual grammars.                   -*- Autotest -*-
-
-# Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004, 2005
-# 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.
-
-AT_BANNER([[Existing Grammars.]])
-## ----------------- ##
-## GNU AWK Grammar.  ##
-## ----------------- ##
-
-AT_SETUP([GNU AWK Grammar])
-
-# We have been careful to strip all the actions excepts the
-# mid-rule actions.  We rely on %expect to check that there are
-# indeed 65 SR conflicts.
-#
-# Bison was once wrong, due to an incorrect computation of nullable.
-# It reported 485 SR conflicts!
-
-AT_DATA([[input.y]],
-[[%expect 65
-
-%token FUNC_CALL NAME REGEXP
-%token ERROR
-%token YNUMBER YSTRING
-%token RELOP APPEND_OP
-%token ASSIGNOP MATCHOP NEWLINE CONCAT_OP
-%token LEX_BEGIN LEX_END LEX_IF LEX_ELSE LEX_RETURN LEX_DELETE
-%token LEX_WHILE LEX_DO LEX_FOR LEX_BREAK LEX_CONTINUE
-%token LEX_PRINT LEX_PRINTF LEX_NEXT LEX_EXIT LEX_FUNCTION
-%token LEX_GETLINE LEX_NEXTFILE
-%token LEX_IN
-%token LEX_AND LEX_OR INCREMENT DECREMENT
-%token LEX_BUILTIN LEX_LENGTH
-
-/* Lowest to highest */
-%right ASSIGNOP
-%right '?' ':'
-%left LEX_OR
-%left LEX_AND
-%left LEX_GETLINE
-%nonassoc LEX_IN
-%left FUNC_CALL LEX_BUILTIN LEX_LENGTH
-%nonassoc ','
-%nonassoc MATCHOP
-%nonassoc RELOP '<' '>' '|' APPEND_OP TWOWAYIO
-%left CONCAT_OP
-%left YSTRING YNUMBER
-%left '+' '-'
-%left '*' '/' '%'
-%right '!' UNARY
-%right '^'
-%left INCREMENT DECREMENT
-%left '$'
-%left '(' ')'
-%%
-
-start
-	: opt_nls program opt_nls
-	;
-
-program
-	: rule
-	| program rule
-	| error
-	| program error
-	| /* empty */
-	;
-
-rule
-	: LEX_BEGIN {} action
-	| LEX_END {}   action
-	| LEX_BEGIN statement_term
-	| LEX_END statement_term
-	| pattern action
-	| action
-	| pattern statement_term
-	| function_prologue function_body
-	;
-
-func_name
-	: NAME
-	| FUNC_CALL
-	| lex_builtin
-	;
-
-lex_builtin
-	: LEX_BUILTIN
-	| LEX_LENGTH
-	;
-
-function_prologue
-	: LEX_FUNCTION {} func_name '(' opt_param_list r_paren opt_nls
-	;
-
-function_body
-	: l_brace statements r_brace opt_semi opt_nls
-	| l_brace r_brace opt_semi opt_nls
-	;
-
-pattern
-	: exp
-	| exp ',' exp
-	;
-
-regexp
-	/*
-	 * In this rule, want_regexp tells yylex that the next thing
-	 * is a regexp so it should read up to the closing slash.
-	 */
-	: '/' {} REGEXP '/'
-	;
-
-action
-	: l_brace statements r_brace opt_semi opt_nls
-	| l_brace r_brace opt_semi opt_nls
-	;
-
-statements
-	: statement
-	| statements statement
-	| error
-	| statements error
-	;
-
-statement_term
-	: nls
-	| semi opt_nls
-	;
-
-statement
-	: semi opt_nls
-	| l_brace r_brace
-	| l_brace statements r_brace
-	| if_statement
-	| LEX_WHILE '(' exp r_paren opt_nls statement
-	| LEX_DO opt_nls statement LEX_WHILE '(' exp r_paren opt_nls
-	| LEX_FOR '(' NAME LEX_IN NAME r_paren opt_nls statement
-	| LEX_FOR '(' opt_exp semi opt_nls exp semi opt_nls opt_exp r_paren opt_nls statement
-	| LEX_FOR '(' opt_exp semi opt_nls semi opt_nls opt_exp r_paren opt_nls statement
-	| LEX_BREAK statement_term
-	| LEX_CONTINUE statement_term
-	| print '(' expression_list r_paren output_redir statement_term
-	| print opt_rexpression_list output_redir statement_term
-	| LEX_NEXT statement_term
-	| LEX_NEXTFILE statement_term
-	| LEX_EXIT opt_exp statement_term
-	| LEX_RETURN {} opt_exp statement_term
-	| LEX_DELETE NAME '[' expression_list ']' statement_term
-	| LEX_DELETE NAME  statement_term
-	| exp statement_term
-	;
-
-print
-	: LEX_PRINT
-	| LEX_PRINTF
-	;
-
-if_statement
-	: LEX_IF '(' exp r_paren opt_nls statement
-	| LEX_IF '(' exp r_paren opt_nls statement
-	     LEX_ELSE opt_nls statement
-	;
-
-nls
-	: NEWLINE
-	| nls NEWLINE
-	;
-
-opt_nls
-	: /* empty */
-	| nls
-	;
-
-input_redir
-	: /* empty */
-	| '<' simp_exp
-	;
-
-output_redir
-	: /* empty */
-	| '>' exp
-	| APPEND_OP exp
-	| '|' exp
-	| TWOWAYIO exp
-	;
-
-opt_param_list
-	: /* empty */
-	| param_list
-	;
-
-param_list
-	: NAME
-	| param_list comma NAME
-	| error
-	| param_list error
-	| param_list comma error
-	;
-
-/* optional expression, as in for loop */
-opt_exp
-	: /* empty */
-	| exp
-	;
-
-opt_rexpression_list
-	: /* empty */
-	| rexpression_list
-	;
-
-rexpression_list
-	: rexp
-	| rexpression_list comma rexp
-	| error
-	| rexpression_list error
-	| rexpression_list error rexp
-	| rexpression_list comma error
-	;
-
-opt_expression_list
-	: /* empty */
-	| expression_list
-	;
-
-expression_list
-	: exp
-	| expression_list comma exp
-	| error
-	| expression_list error
-	| expression_list error exp
-	| expression_list comma error
-	;
-
-/* Expressions, not including the comma operator.  */
-exp	: variable ASSIGNOP {} exp
-	| '(' expression_list r_paren LEX_IN NAME
-	| exp '|' LEX_GETLINE opt_variable
-	| exp TWOWAYIO LEX_GETLINE opt_variable
-	| LEX_GETLINE opt_variable input_redir
-	| exp LEX_AND exp
-	| exp LEX_OR exp
-	| exp MATCHOP exp
-	| regexp
-	| '!' regexp %prec UNARY
-	| exp LEX_IN NAME
-	| exp RELOP exp
-	| exp '<' exp
-	| exp '>' exp
-	| exp '?' exp ':' exp
-	| simp_exp
-	| exp simp_exp %prec CONCAT_OP
-	;
-
-rexp
-	: variable ASSIGNOP {} rexp
-	| rexp LEX_AND rexp
-	| rexp LEX_OR rexp
-	| LEX_GETLINE opt_variable input_redir
-	| regexp
-	| '!' regexp %prec UNARY
-	| rexp MATCHOP rexp
-	| rexp LEX_IN NAME
-	| rexp RELOP rexp
-	| rexp '?' rexp ':' rexp
-	| simp_exp
-	| rexp simp_exp %prec CONCAT_OP
-	;
-
-simp_exp
-	: non_post_simp_exp
-	/* Binary operators in order of decreasing precedence.  */
-	| simp_exp '^' simp_exp
-	| simp_exp '*' simp_exp
-	| simp_exp '/' simp_exp
-	| simp_exp '%' simp_exp
-	| simp_exp '+' simp_exp
-	| simp_exp '-' simp_exp
-	| variable INCREMENT
-	| variable DECREMENT
-	;
-
-non_post_simp_exp
-	: '!' simp_exp %prec UNARY
-	| '(' exp r_paren
-	| LEX_BUILTIN
-	  '(' opt_expression_list r_paren
-	| LEX_LENGTH '(' opt_expression_list r_paren
-	| LEX_LENGTH
-	| FUNC_CALL '(' opt_expression_list r_paren
-	| variable
-	| INCREMENT variable
-	| DECREMENT variable
-	| YNUMBER
-	| YSTRING
-	| '-' simp_exp    %prec UNARY
-	| '+' simp_exp    %prec UNARY
-	;
-
-opt_variable
-	: /* empty */
-	| variable
-	;
-
-variable
-	: NAME
-	| NAME '[' expression_list ']'
-	| '$' non_post_simp_exp
-	;
-
-l_brace
-	: '{' opt_nls
-	;
-
-r_brace
-	: '}' opt_nls
-	;
-
-r_paren
-	: ')'
-	;
-
-opt_semi
-	: /* empty */
-	| semi
-	;
-
-semi
-	: ';'
-	;
-
-comma	: ',' opt_nls
-	;
-
-%%
-]])
-
-# Pass plenty of options, to exercise plenty of code, even if we
-# don't actually check the output.  But SEGV is watching us, and
-# so might do dmalloc.
-AT_CHECK([[bison --verbose --defines input.y]])
-
-AT_CLEANUP
-
-## ----------------- ##
-## GNU Cim Grammar.  ##
-## ----------------- ##
-
-AT_SETUP([GNU Cim Grammar])
-
-# GNU Cim, the GNU Simula 87 Compiler.
-
-# Bison was once wrong, due to an incorrect computation of the RR conflicts.
-# It reported 80 SR && 99 RR conflicts instead of 78/10!!!
-
-AT_DATA([[input.y]],
-[[%union {}
-
-%token
-	HACTIVATE HAFTER /*HAND*/ HARRAY HAT
-	HBEFORE HBEGIN HBOOLEAN
-	HCHARACTER HCLASS /*HCOMMENT*/ HCONC
-	HDELAY HDO
-	HELSE HEND HEQ /*HEQV*/ HEXTERNAL
-	HFOR
-	HGE HGO HGOTO HGT
-	HHIDDEN
-	HIF /*HIMP*/ HIN HINNER HINSPECT HINTEGER HIS
-	HLABEL HLE HLONG HLT
-	HNAME HNE HNEW HNONE /*HNOT*/ HNOTEXT
-	/*HOR*/ HOTHERWISE
-	HPRIOR HPROCEDURE HPROTECTED
-	HQUA
-	HREACTIVATE HREAL HREF
-	HSHORT HSTEP HSWITCH
-	HTEXT HTHEN HTHIS HTO
-	HUNTIL
-	HVALUE HVAR HVIRTUAL
-	HWHEN HWHILE
-
-	HASSIGNVALUE HASSIGNREF
-	/*HDOT*/ HPAREXPSEPARATOR HLABELSEPARATOR HSTATEMENTSEPARATOR
-	HBEGPAR HENDPAR
-	HEQR HNER
-	HADD HSUB HMUL HDIV HINTDIV HEXP
-	HDOTDOTDOT
-
-%token HIDENTIFIER
-%token HBOOLEANKONST HINTEGERKONST HCHARACTERKONST
-%token HREALKONST
-%token HTEXTKONST
-
-
-%right HASSIGN
-%left   HORELSE
-%left   HANDTHEN
-%left   HEQV
-%left   HIMP
-%left   HOR
-%left   HAND
-
-%left   HNOT
-
-%left HVALRELOPERATOR HREFRELOPERATOR HOBJRELOPERATOR
-
-%left	HCONC
-
-%left HTERMOPERATOR
-%left UNEAR
-%left HFACTOROPERATOR
-%left         HPRIMARYOPERATOR
-
-%left   HQUA
-
-%left   HDOT
-
-%start  MAIN_MODULE
-%%
-/* GRAMATIKK FOR PROGRAM MODULES */
-MAIN_MODULE     :       {}
-			MODULS
-		|	error HSTATEMENTSEPARATOR MBEE_DECLSTMS
-		;
-EXT_DECLARATION	:	HEXTERNAL
-			MBEE_TYPE
-			HPROCEDURE
-				{}
-			EXT_LIST
-		|
-			HEXTERNAL
-			HIDENTIFIER
-			HPROCEDURE
-				{}
-			HIDENTIFIER {}
-			EXTERNAL_KIND_ITEM
-		|	HEXTERNAL
-			HCLASS
-				{}
-			EXT_LIST
-
-		;
-EXTERNAL_KIND_ITEM:	EXT_IDENT
-			HOBJRELOPERATOR
-				{}
-			MBEE_TYPE HPROCEDURE
-			HIDENTIFIER
-				{}
-			HEADING EMPTY_BLOCK
-				{}
-/*		|
-			EXT_IDENT
-				{}
-			MBEE_REST_EXT_LIST
-		;
-MBEE_REST_EXT_LIST:	/* EMPTY
-		|	HPAREXPSEPARATOR EXT_KIND_LIST
-		;
-EXT_KIND_LIST	:	EXT_KIND_ITEM
-		|	EXT_KIND_LIST HPAREXPSEPARATOR EXT_KIND_ITEM
-		;
-EXT_KIND_ITEM	:	HIDENTIFIER
-			EXT_IDENT
-				{}*/
-		;
-EMPTY_BLOCK	:	/*EMPT*/
-		|	HBEGIN HEND
-		;
-EXT_LIST	:	EXT_ITEM
-		|	EXT_LIST HPAREXPSEPARATOR EXT_ITEM
-		;
-EXT_ITEM	:	HIDENTIFIER
-			EXT_IDENT
-		;
-EXT_IDENT	:	/* EMPTY */
-		|	HVALRELOPERATOR {}
-			HTEXTKONST
-		;
-/* GRAMATIKK FOR TYPER */
-NO_TYPE         :       /*EMPT*/
-		;
-MBEE_TYPE       :       NO_TYPE
-		|       TYPE
-		;
-TYPE            :       HREF HBEGPAR
-			HIDENTIFIER
-				{}
-			HENDPAR
-		|       HTEXT
-		|       HBOOLEAN
-		|       HCHARACTER
-		|       HSHORT HINTEGER
-		|       HINTEGER
-		|       HREAL
-		|       HLONG HREAL
-		;
-
-/* GRAMATIKK FOR DEL AV SETNINGER */
-MBEE_ELSE_PART  :       /*EMPT*/
-/*		|	HELSE
-			HIF
-			EXPRESSION
-			HTHEN   {}
-			BLOCK   {}
-			MBEE_ELSE_PART          {}*/
-		|       HELSE   {}
-			BLOCK
-		;
-FOR_LIST        :       FOR_LIST_ELEMENT
-		|       FOR_LIST_ELEMENT
-			HPAREXPSEPARATOR
-			FOR_LIST
-		;
-FOR_LIST_ELEMENT:       EXPRESSION
-			MBEE_F_L_EL_R_PT
-		;
-MBEE_F_L_EL_R_PT:       /*EMPT*/
-		|       HWHILE
-			EXPRESSION
-		|       HSTEP
-			EXPRESSION
-			HUNTIL
-			EXPRESSION
-		;
-GOTO            :       HGO
-			HTO
-		|       HGOTO
-		;
-CONN_STATE_R_PT :       WHEN_CLAUSE_LIST
-		|       HDO   {}
-			BLOCK
-		;
-WHEN_CLAUSE_LIST:       HWHEN
-			HIDENTIFIER
-			HDO    {}
-			BLOCK
-		|       WHEN_CLAUSE_LIST
-			HWHEN
-			HIDENTIFIER
-			HDO    {}
-			BLOCK
-		;
-MBEE_OTWI_CLAUS :       /*EMPT*/
-		|       HOTHERWISE {}
-
-			BLOCK
-		;
-ACTIVATOR	:	HACTIVATE
-		|	HREACTIVATE
-		;
-SCHEDULE	:	/*EMPT*/
-		|	ATDELAY EXPRESSION	{}
-			PRIOR
-		|	BEFOREAFTER		{}
-			EXPRESSION
-		;
-ATDELAY		:	HAT
-		|	HDELAY
-		;
-BEFOREAFTER	:	HBEFORE
-		|	HAFTER
-		;
-PRIOR		:	/*EMPT*/
-		|	HPRIOR
-		;
-/* GRAMATIKK FOR SETNINGER OG DEKLARASJONER */
-MODULSTATEMENT  :       HWHILE
-			EXPRESSION
-			HDO     {}
-			BLOCK
-		|       HIF
-			EXPRESSION
-			HTHEN   {}
-			BLOCK   {}
-			MBEE_ELSE_PART
-		|       HFOR
-			HIDENTIFIER
-			HASSIGN {}
-			FOR_LIST
-			HDO     {}
-			BLOCK
-		|       GOTO
-			EXPRESSION
-		|       HINSPECT
-			EXPRESSION              {}
-			CONN_STATE_R_PT
-				{}
-			MBEE_OTWI_CLAUS
-		|       HINNER
-		|       HIDENTIFIER
-			HLABELSEPARATOR
-				{}
-			DECLSTATEMENT
-		|       EXPRESSION_SIMP
-			HBEGIN
-				{}
-			IMPORT_SPEC_MODULE
-				{}
-			MBEE_DECLSTMS
-			HEND
-		|	EXPRESSION_SIMP HBEGIN error HSTATEMENTSEPARATOR
-			MBEE_DECLSTMS HEND
-		|	EXPRESSION_SIMP HBEGIN error HEND
-		|       EXPRESSION_SIMP
-		|	ACTIVATOR EXPRESSION SCHEDULE
-		|       HBEGIN
-				{}
-			MBEE_DECLSTMS
-			HEND
-		|       MBEE_TYPE HPROCEDURE
-			HIDENTIFIER
-				{}
-			HEADING BLOCK
-		|       HIDENTIFIER
-			HCLASS
-			NO_TYPE
-				{}
-			IMPORT_SPEC_MODULE
-			HIDENTIFIER
-				{}
-			HEADING
-			BLOCK
-		|       HCLASS
-			NO_TYPE
-			HIDENTIFIER
-				{}
-			HEADING
-			BLOCK
-		|       EXT_DECLARATION
-		|       /*EMPT*/
-		;
-IMPORT_SPEC_MODULE:
-		;
-DECLSTATEMENT	:	MODULSTATEMENT
-		|       TYPE
-			HIDENTIFIER
-			MBEE_CONSTANT
-			HPAREXPSEPARATOR
-				{}
-			IDENTIFIER_LISTC
-		|       TYPE
-			HIDENTIFIER
-			MBEE_CONSTANT
-		|       MBEE_TYPE
-			HARRAY  {}
-			ARR_SEGMENT_LIST
-		|       HSWITCH
-			HIDENTIFIER
-			HASSIGN {}
-			SWITCH_LIST
-		;
-BLOCK           :       DECLSTATEMENT
-		|       HBEGIN MBEE_DECLSTMS HEND
-		|	HBEGIN error HSTATEMENTSEPARATOR MBEE_DECLSTMS HEND
-		|	HBEGIN error HEND
-		;
-MBEE_DECLSTMS   :       MBEE_DECLSTMSU
-		;
-MBEE_DECLSTMSU  :       DECLSTATEMENT
-		|       MBEE_DECLSTMSU
-			HSTATEMENTSEPARATOR
-			DECLSTATEMENT
-		;
-MODULS		:	MODULSTATEMENT
-		|	MODULS HSTATEMENTSEPARATOR MODULSTATEMENT
-		;
-/* GRAMATIKK FOR DEL AV DEKLARASJONER */
-ARR_SEGMENT_LIST:       ARR_SEGMENT
-		|       ARR_SEGMENT_LIST
-			HPAREXPSEPARATOR
-			ARR_SEGMENT
-		;
-ARR_SEGMENT	:       ARRAY_SEGMENT
-			HBEGPAR
-			BAUND_PAIR_LIST HENDPAR
-		;
-ARRAY_SEGMENT   :       ARRAY_SEGMENT_EL        {}
-
-		|       ARRAY_SEGMENT_EL
-			HPAREXPSEPARATOR
-			ARRAY_SEGMENT
-		;
-ARRAY_SEGMENT_EL:       HIDENTIFIER
-		;
-BAUND_PAIR_LIST :       BAUND_PAIR
-		|       BAUND_PAIR
-			HPAREXPSEPARATOR
-			BAUND_PAIR_LIST
-		;
-BAUND_PAIR      :       EXPRESSION
-			HLABELSEPARATOR
-			EXPRESSION
-		;
-SWITCH_LIST     :       EXPRESSION
-		|       EXPRESSION
-			HPAREXPSEPARATOR
-			SWITCH_LIST
-		;
-HEADING         :       MBEE_FMAL_PAR_P HSTATEMENTSEPARATOR {}
-			MBEE_MODE_PART  {}
-			MBEE_SPEC_PART  {}
-			MBEE_PROT_PART  {}
-			MBEE_VIRT_PART
-		;
-MBEE_FMAL_PAR_P :       /*EMPT*/
-		|       FMAL_PAR_PART
-		;
-FMAL_PAR_PART   :       HBEGPAR NO_TYPE
-			MBEE_LISTV HENDPAR
-		;
-MBEE_LISTV      :       /*EMPT*/
-		|       LISTV
-		;
-LISTV           :       HIDENTIFIER
-		|	FPP_CATEG HDOTDOTDOT
-		|       HIDENTIFIER     {}
-			HPAREXPSEPARATOR LISTV
-		|       FPP_SPEC
-		|       FPP_SPEC
-			HPAREXPSEPARATOR LISTV
-		;
-FPP_HEADING     :       HBEGPAR NO_TYPE
-			FPP_MBEE_LISTV HENDPAR
-		;
-FPP_MBEE_LISTV  :       /*EMPT*/
-		|       FPP_LISTV
-		;
-FPP_LISTV       :	FPP_CATEG HDOTDOTDOT
-		|       FPP_SPEC
-		|       FPP_SPEC
-			HPAREXPSEPARATOR LISTV
-		;
-FPP_SPEC        :       FPP_CATEG SPECIFIER HIDENTIFIER
-		|	FPP_CATEG FPP_PROC_DECL_IN_SPEC
-		;
-FPP_CATEG       :       HNAME HLABELSEPARATOR
-		|       HVALUE HLABELSEPARATOR
-		|       HVAR HLABELSEPARATOR
-		|       /*EMPT*/
-		;
-FPP_PROC_DECL_IN_SPEC:	MBEE_TYPE HPROCEDURE
-			HIDENTIFIER
-					{}
-			FPP_HEADING {} { /* Yes, two "final" actions. */ }
-		;
-IDENTIFIER_LISTV:       HIDENTIFIER
-		|	HDOTDOTDOT
-		|       HIDENTIFIER     {}
-			HPAREXPSEPARATOR IDENTIFIER_LISTV
-		;
-MBEE_MODE_PART  :       /*EMPT*/
-		|       MODE_PART
-		;
-MODE_PART       :       NAME_PART
-		|       VALUE_PART
-		|       VAR_PART
-		|       NAME_PART VALUE_PART
-		|       VALUE_PART NAME_PART
-		|       NAME_PART VAR_PART
-		|       VAR_PART NAME_PART
-		|       VALUE_PART VAR_PART
-		|       VAR_PART VALUE_PART
-		|       VAR_PART NAME_PART VALUE_PART
-		|       NAME_PART VAR_PART VALUE_PART
-		|       NAME_PART VALUE_PART VAR_PART
-		|       VAR_PART VALUE_PART NAME_PART
-		|       VALUE_PART VAR_PART NAME_PART
-		|       VALUE_PART NAME_PART VAR_PART
-		;
-NAME_PART       :       HNAME           {}
-			IDENTIFIER_LISTV
-			HSTATEMENTSEPARATOR
-		;
-VAR_PART        :       HVAR            {}
-			IDENTIFIER_LISTV
-			HSTATEMENTSEPARATOR
-		;
-VALUE_PART      :       HVALUE          {}
-			IDENTIFIER_LISTV HSTATEMENTSEPARATOR
-		;
-MBEE_SPEC_PART  :       /*EMPT*/
-		|       SPEC_PART
-		;
-SPEC_PART       :       ONE_SPEC
-		|       SPEC_PART ONE_SPEC
-		;
-ONE_SPEC	:	SPECIFIER IDENTIFIER_LIST HSTATEMENTSEPARATOR
-		|	NO_TYPE HPROCEDURE HIDENTIFIER HOBJRELOPERATOR
-			  {}
-			PROC_DECL_IN_SPEC HSTATEMENTSEPARATOR
-		|       FPP_PROC_DECL_IN_SPEC HSTATEMENTSEPARATOR
-		|       MBEE_TYPE HPROCEDURE HIDENTIFIER HSTATEMENTSEPARATOR
-		|       MBEE_TYPE HPROCEDURE HIDENTIFIER HPAREXPSEPARATOR
-			IDENTIFIER_LIST HSTATEMENTSEPARATOR
-		;
-SPECIFIER       :       TYPE
-		|       MBEE_TYPE
-			HARRAY
-		|       HLABEL
-		|       HSWITCH
-		;
-PROC_DECL_IN_SPEC:	MBEE_TYPE HPROCEDURE
-			HIDENTIFIER
-					{}
-			HEADING
-					{}
-			MBEE_BEGIN_END
-		;
-MBEE_BEGIN_END	:	/* EMPTY */
-		|	HBEGIN HEND
-		;
-MBEE_PROT_PART  :       /*EMPT*/
-		|       PROTECTION_PART
-		;
-PROTECTION_PART :       PROT_SPECIFIER IDENTIFIER_LIST
-			HSTATEMENTSEPARATOR
-		|       PROTECTION_PART  PROT_SPECIFIER
-			IDENTIFIER_LIST HSTATEMENTSEPARATOR
-		;
-PROT_SPECIFIER  :       HHIDDEN
-		|       HPROTECTED
-		|       HHIDDEN
-			HPROTECTED
-		|       HPROTECTED
-			HHIDDEN
-		;
-MBEE_VIRT_PART  :       /*EMPT*/
-		|       VIRTUAL_PART
-		;
-VIRTUAL_PART    :       HVIRTUAL
-			HLABELSEPARATOR
-			MBEE_SPEC_PART
-		;
-IDENTIFIER_LIST :       HIDENTIFIER
-		|       IDENTIFIER_LIST HPAREXPSEPARATOR
-			HIDENTIFIER
-		;
-IDENTIFIER_LISTC:       HIDENTIFIER
-			MBEE_CONSTANT
-		|       IDENTIFIER_LISTC HPAREXPSEPARATOR
-			HIDENTIFIER
-			MBEE_CONSTANT
-		;
-MBEE_CONSTANT	:	/* EMPTY */
-		|	HVALRELOPERATOR
-				{}
-			EXPRESSION
-		;
-
-/* GRAMATIKK FOR UTTRYKK */
-EXPRESSION      :       EXPRESSION_SIMP
-		|       HIF
-			EXPRESSION
-			HTHEN
-			EXPRESSION
-			HELSE
-			EXPRESSION
-		;
-EXPRESSION_SIMP :	EXPRESSION_SIMP
-			HASSIGN
-			EXPRESSION
-		|
-
-			EXPRESSION_SIMP
-			HCONC
-			EXPRESSION_SIMP
-		|       EXPRESSION_SIMP HOR
-			HELSE
-			EXPRESSION_SIMP
-			%prec HORELSE
-		|       EXPRESSION_SIMP HAND
-			HTHEN
-			EXPRESSION_SIMP
-			%prec HANDTHEN
-		|       EXPRESSION_SIMP
-			HEQV EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HIMP EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HOR EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HAND EXPRESSION_SIMP
-		|       HNOT EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HVALRELOPERATOR
-			EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HREFRELOPERATOR
-			EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HOBJRELOPERATOR
-			EXPRESSION_SIMP
-		|       HTERMOPERATOR
-			EXPRESSION_SIMP %prec UNEAR
-		|       EXPRESSION_SIMP
-			HTERMOPERATOR
-			EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HFACTOROPERATOR
-			EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HPRIMARYOPERATOR
-			EXPRESSION_SIMP
-		|       HBEGPAR
-			EXPRESSION HENDPAR
-		|       HTEXTKONST
-		|       HCHARACTERKONST
-		|       HREALKONST
-		|       HINTEGERKONST
-		|       HBOOLEANKONST
-		|       HNONE
-		|       HIDENTIFIER
-				{}
-			MBEE_ARG_R_PT
-		|       HTHIS HIDENTIFIER
-		|       HNEW
-			HIDENTIFIER
-			ARG_R_PT
-		|       EXPRESSION_SIMP
-			HDOT
-			EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HQUA HIDENTIFIER
-		;
-ARG_R_PT        :       /*EMPTY*/
-		|       HBEGPAR
-			ARGUMENT_LIST HENDPAR
-		;
-MBEE_ARG_R_PT   :       /*EMPTY*/
-		|       HBEGPAR
-			ARGUMENT_LIST HENDPAR
-		;
-ARGUMENT_LIST   :       EXPRESSION
-		|       EXPRESSION
-			HPAREXPSEPARATOR
-			ARGUMENT_LIST
-		;
-%%
-]])
-
-# Pass plenty of options, to exercise plenty of code, even if we
-# don't actually check the output.  But SEGV is watching us, and
-# so might do dmalloc.
-AT_CHECK([[bison --verbose --defines input.y]], 0, [],
-[[input.y: conflicts: 78 shift/reduce, 10 reduce/reduce
-]])
-
-AT_CHECK([[grep '^State.*conflicts:' input.output]], 0,
-[[State 64 conflicts: 14 shift/reduce
-State 164 conflicts: 1 shift/reduce
-State 201 conflicts: 33 shift/reduce, 4 reduce/reduce
-State 206 conflicts: 1 shift/reduce
-State 240 conflicts: 1 shift/reduce
-State 335 conflicts: 9 shift/reduce, 2 reduce/reduce
-State 356 conflicts: 1 shift/reduce
-State 360 conflicts: 9 shift/reduce, 2 reduce/reduce
-State 427 conflicts: 9 shift/reduce, 2 reduce/reduce
-]])
-
-AT_CLEANUP
-
-## ----------------- ##
-## GNU pic Grammar.  ##
-## ----------------- ##
-
-AT_SETUP([GNU pic Grammar])
-
-# GNU pic, part of groff.
-
-# Bison once reported shift/reduce conflicts that it shouldn't have.
-
-AT_DATA([[input.y]],
-[[%union {}
-
-%token LABEL
-%token VARIABLE
-%token NUMBER
-%token TEXT
-%token COMMAND_LINE
-%token DELIMITED
-%token ORDINAL
-%token TH
-%token LEFT_ARROW_HEAD
-%token RIGHT_ARROW_HEAD
-%token DOUBLE_ARROW_HEAD
-%token LAST
-%token UP
-%token DOWN
-%token LEFT
-%token RIGHT
-%token BOX
-%token CIRCLE
-%token ELLIPSE
-%token ARC
-%token LINE
-%token ARROW
-%token MOVE
-%token SPLINE
-%token HEIGHT
-%token RADIUS
-%token WIDTH
-%token DIAMETER
-%token FROM
-%token TO
-%token AT
-%token WITH
-%token BY
-%token THEN
-%token SOLID
-%token DOTTED
-%token DASHED
-%token CHOP
-%token SAME
-%token INVISIBLE
-%token LJUST
-%token RJUST
-%token ABOVE
-%token BELOW
-%token OF
-%token THE
-%token WAY
-%token BETWEEN
-%token AND
-%token HERE
-%token DOT_N
-%token DOT_E
-%token DOT_W
-%token DOT_S
-%token DOT_NE
-%token DOT_SE
-%token DOT_NW
-%token DOT_SW
-%token DOT_C
-%token DOT_START
-%token DOT_END
-%token DOT_X
-%token DOT_Y
-%token DOT_HT
-%token DOT_WID
-%token DOT_RAD
-%token SIN
-%token COS
-%token ATAN2
-%token LOG
-%token EXP
-%token SQRT
-%token K_MAX
-%token K_MIN
-%token INT
-%token RAND
-%token SRAND
-%token COPY
-%token THRU
-%token TOP
-%token BOTTOM
-%token UPPER
-%token LOWER
-%token SH
-%token PRINT
-%token CW
-%token CCW
-%token FOR
-%token DO
-%token IF
-%token ELSE
-%token ANDAND
-%token OROR
-%token NOTEQUAL
-%token EQUALEQUAL
-%token LESSEQUAL
-%token GREATEREQUAL
-%token LEFT_CORNER
-%token RIGHT_CORNER
-%token NORTH
-%token SOUTH
-%token EAST
-%token WEST
-%token CENTER
-%token END
-%token START
-%token RESET
-%token UNTIL
-%token PLOT
-%token THICKNESS
-%token FILL
-%token COLORED
-%token OUTLINED
-%token SHADED
-%token ALIGNED
-%token SPRINTF
-%token COMMAND
-
-%left '.'
-
-/* this ensures that plot 17 "%g" parses as (plot 17 "%g") */
-%left PLOT
-%left TEXT SPRINTF
-
-/* give text adjustments higher precedence than TEXT, so that
-box "foo" above ljust == box ("foo" above ljust)
-*/
-
-%left LJUST RJUST ABOVE BELOW
-
-%left LEFT RIGHT
-/* Give attributes that take an optional expression a higher
-precedence than left and right, so that eg `line chop left'
-parses properly. */
-%left CHOP SOLID DASHED DOTTED UP DOWN FILL COLORED OUTLINED
-%left LABEL
-
-%left VARIABLE NUMBER '(' SIN COS ATAN2 LOG EXP SQRT K_MAX K_MIN INT RAND SRAND LAST
-%left ORDINAL HERE '`'
-
-%left BOX CIRCLE ELLIPSE ARC LINE ARROW SPLINE '[' /* ] */
-
-/* these need to be lower than '-' */
-%left HEIGHT RADIUS WIDTH DIAMETER FROM TO AT THICKNESS
-
-/* these must have higher precedence than CHOP so that `label %prec CHOP'
-works */
-%left DOT_N DOT_E DOT_W DOT_S DOT_NE DOT_SE DOT_NW DOT_SW DOT_C
-%left DOT_START DOT_END TOP BOTTOM LEFT_CORNER RIGHT_CORNER
-%left UPPER LOWER NORTH SOUTH EAST WEST CENTER START END
-
-%left ','
-%left OROR
-%left ANDAND
-%left EQUALEQUAL NOTEQUAL
-%left '<' '>' LESSEQUAL GREATEREQUAL
-
-%left BETWEEN OF
-%left AND
-
-%left '+' '-'
-%left '*' '/' '%'
-%right '!'
-%right '^'
-
-%%
-
-top:
-	optional_separator
-	| element_list
-	;
-
-element_list:
-	optional_separator middle_element_list optional_separator
-	;
-
-middle_element_list:
-	element
-	| middle_element_list separator element
-	;
-
-optional_separator:
-	/* empty */
-	| separator
-	;
-
-separator:
-	';'
-	| separator ';'
-	;
-
-placeless_element:
-	VARIABLE '=' any_expr
-	| VARIABLE ':' '=' any_expr
-	| UP
-	| DOWN
-	| LEFT
-	| RIGHT
-	| COMMAND_LINE
-	| COMMAND print_args
-	| PRINT print_args
-	| SH
-		{}
-	  DELIMITED
-	| COPY TEXT
-	| COPY TEXT THRU
-		{}
-	  DELIMITED
-		{}
-	  until
-	| COPY THRU
-		{}
-	  DELIMITED
-		{}
-	  until
-	| FOR VARIABLE '=' expr TO expr optional_by DO
-		{}
-	  DELIMITED
-	| simple_if
-	| simple_if ELSE
-		{}
-	  DELIMITED
-	| reset_variables
-	| RESET
-	;
-
-reset_variables:
-	RESET VARIABLE
-	| reset_variables VARIABLE
-	| reset_variables ',' VARIABLE
-	;
-
-print_args:
-	print_arg
-	| print_args print_arg
-	;
-
-print_arg:
-	expr							%prec ','
-	| text
-	| position						%prec ','
-	;
-
-simple_if:
-	IF any_expr THEN
-		{}
-	DELIMITED
-	;
-
-until:
-	/* empty */
-	| UNTIL TEXT
-	;
-
-any_expr:
-	expr
-	| text_expr
-	;
-
-text_expr:
-	text EQUALEQUAL text
-	| text NOTEQUAL text
-	| text_expr ANDAND text_expr
-	| text_expr ANDAND expr
-	| expr ANDAND text_expr
-	| text_expr OROR text_expr
-	| text_expr OROR expr
-	| expr OROR text_expr
-	| '!' text_expr
-	;
-
-optional_by:
-	/* empty */
-	| BY expr
-	| BY '*' expr
-	;
-
-element:
-	object_spec
-	| LABEL ':' optional_separator element
-	| LABEL ':' optional_separator position_not_place
-	| LABEL ':' optional_separator place
-	| '{}'
-		{}
-	  optional_element
-	| placeless_element
-	;
-
-optional_element:
-	/* empty */
-	| element
-	;
-
-object_spec:
-	BOX
-	| CIRCLE
-	| ELLIPSE
-	| ARC
-	| LINE
-	| ARROW
-	| MOVE
-	| SPLINE
-	| text							%prec TEXT
-	| PLOT expr
-	| PLOT expr text
-	| '['
-		{}
-	  element_list ']'
-	| object_spec HEIGHT expr
-	| object_spec RADIUS expr
-	| object_spec WIDTH expr
-	| object_spec DIAMETER expr
-	| object_spec expr					%prec HEIGHT
-	| object_spec UP
-	| object_spec UP expr
-	| object_spec DOWN
-	| object_spec DOWN expr
-	| object_spec RIGHT
-	| object_spec RIGHT expr
-	| object_spec LEFT
-	| object_spec LEFT expr
-	| object_spec FROM position
-	| object_spec TO position
-	| object_spec AT position
-	| object_spec WITH path
-	| object_spec WITH position				%prec ','
-	| object_spec BY expr_pair
-	| object_spec THEN
-	| object_spec SOLID
-	| object_spec DOTTED
-	| object_spec DOTTED expr
-	| object_spec DASHED
-	| object_spec DASHED expr
-	| object_spec FILL
-	| object_spec FILL expr
-	| object_spec SHADED text
-	| object_spec COLORED text
-	| object_spec OUTLINED text
-	| object_spec CHOP
-	| object_spec CHOP expr
-	| object_spec SAME
-	| object_spec INVISIBLE
-	| object_spec LEFT_ARROW_HEAD
-	| object_spec RIGHT_ARROW_HEAD
-	| object_spec DOUBLE_ARROW_HEAD
-	| object_spec CW
-	| object_spec CCW
-	| object_spec text					%prec TEXT
-	| object_spec LJUST
-	| object_spec RJUST
-	| object_spec ABOVE
-	| object_spec BELOW
-	| object_spec THICKNESS expr
-	| object_spec ALIGNED
-	;
-
-text:
-	TEXT
-	| SPRINTF '(' TEXT sprintf_args ')'
-	;
-
-sprintf_args:
-	/* empty */
-	| sprintf_args ',' expr
-	;
-
-position:
-	position_not_place
-	| place
-	;
-
-position_not_place:
-	expr_pair
-	| position '+' expr_pair
-	| position '-' expr_pair
-	| '(' position ',' position ')'
-	| expr between position AND position
-	| expr '<' position ',' position '>'
-	;
-
-between:
-	BETWEEN
-	| OF THE WAY BETWEEN
-	;
-
-expr_pair:
-	expr ',' expr
-	| '(' expr_pair ')'
-	;
-
-place:
-	/* line at A left == line (at A) left */
-	label							%prec CHOP
-	| label corner
-	| corner label
-	| corner OF label
-	| HERE
-	;
-
-label:
-	LABEL
-	| nth_primitive
-	| label '.' LABEL
-	;
-
-ordinal:
-	ORDINAL
-	| '`' any_expr TH
-	;
-
-optional_ordinal_last:
-	LAST
-	| ordinal LAST
-	;
-
-nth_primitive:
-	ordinal object_type
-	| optional_ordinal_last object_type
-	;
-
-object_type:
-	BOX
-	| CIRCLE
-	| ELLIPSE
-	| ARC
-	| LINE
-	| ARROW
-	| SPLINE
-	| '[' ']'
-	| TEXT
-	;
-
-label_path:
-	'.' LABEL
-	| label_path '.' LABEL
-	;
-
-relative_path:
-	corner							%prec CHOP
-	/* give this a lower precedence than LEFT and RIGHT so that
-	   [A: box] with .A left == [A: box] with (.A left) */
-	| label_path						%prec TEXT
-	| label_path corner
-	;
-
-path:
-	relative_path
-	| '(' relative_path ',' relative_path ')'
-		{}
-	/* The rest of these rules are a compatibility sop. */
-	| ORDINAL LAST object_type relative_path
-	| LAST object_type relative_path
-	| ORDINAL object_type relative_path
-	| LABEL relative_path
-	;
-
-corner:
-	DOT_N
-	| DOT_E
-	| DOT_W
-	| DOT_S
-	| DOT_NE
-	| DOT_SE
-	| DOT_NW
-	| DOT_SW
-	| DOT_C
-	| DOT_START
-	| DOT_END
-	| TOP
-	| BOTTOM
-	| LEFT
-	| RIGHT
-	| UPPER LEFT
-	| LOWER LEFT
-	| UPPER RIGHT
-	| LOWER RIGHT
-	| LEFT_CORNER
-	| RIGHT_CORNER
-	| UPPER LEFT_CORNER
-	| LOWER LEFT_CORNER
-	| UPPER RIGHT_CORNER
-	| LOWER RIGHT_CORNER
-	| NORTH
-	| SOUTH
-	| EAST
-	| WEST
-	| CENTER
-	| START
-	| END
-	;
-
-expr:
-	VARIABLE
-	| NUMBER
-	| place DOT_X
-	| place DOT_Y
-	| place DOT_HT
-	| place DOT_WID
-	| place DOT_RAD
-	| expr '+' expr
-	| expr '-' expr
-	| expr '*' expr
-	| expr '/' expr
-	| expr '%' expr
-	| expr '^' expr
-	| '-' expr						%prec '!'
-	| '(' any_expr ')'
-	| SIN '(' any_expr ')'
-	| COS '(' any_expr ')'
-	| ATAN2 '(' any_expr ',' any_expr ')'
-	| LOG '(' any_expr ')'
-	| EXP '(' any_expr ')'
-	| SQRT '(' any_expr ')'
-	| K_MAX '(' any_expr ',' any_expr ')'
-	| K_MIN '(' any_expr ',' any_expr ')'
-	| INT '(' any_expr ')'
-	| RAND '(' any_expr ')'
-	| RAND '(' ')'
-	| SRAND '(' any_expr ')'
-	| expr '<' expr
-	| expr LESSEQUAL expr
-	| expr '>' expr
-	| expr GREATEREQUAL expr
-	| expr EQUALEQUAL expr
-	| expr NOTEQUAL expr
-	| expr ANDAND expr
-	| expr OROR expr
-	| '!' expr
-	;
-]])
-
-# Pass plenty of options, to exercise plenty of code, even if we
-# don't actually check the output.  But SEGV is watching us, and
-# so might do dmalloc.
-AT_CHECK([[bison --verbose --defines input.y]], 0, [], [])
-
-AT_CLEANUP
diff --git a/tests/glr-regression.at b/tests/glr-regression.at
deleted file mode 100644
index 9e3cec7..0000000
--- a/tests/glr-regression.at
+++ /dev/null
@@ -1,1663 +0,0 @@
-# Checking GLR Parsing: Regression Tests           -*- Autotest -*-
-# Copyright (C) 2002, 2003, 2005, 2006 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.
-
-AT_BANNER([[GLR Regression Tests]])
-
-## --------------------------- ##
-## Badly Collapsed GLR States. ##
-## --------------------------- ##
-
-AT_SETUP([Badly Collapsed GLR States])
-
-AT_DATA_GRAMMAR([glr-regr1.y],
-[[/* Regression Test: Improper state compression */
-/* Reported by Scott McPeak */
-
-%{
-#include <stdio.h>
-
-#define YYSTYPE int
-static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1);
-int yylex (void);
-void yyerror (char const *msg);
-%}
-
-
-%glr-parser
-
-
-/* -------- productions ------ */
-%%
-
-StartSymbol: E  { $$=0; }                   %merge <exprMerge>
-           ;
-
-E: E 'P' E { $$=1; printf("E -> E 'P' E\n"); }  %merge <exprMerge>
- | 'B'     { $$=2; printf("E -> 'B'\n"); }      %merge <exprMerge>
- ;
-
-
-
-/* ---------- C code ----------- */
-%%
-
-static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1)
-{
-  (void) x0;
-  (void) x1;
-  printf ("<OR>\n");
-  return 0;
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-
-void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-
-int
-yylex (void)
-{
-  for (;;)
-    {
-      int ch = getchar ();
-      if (ch == EOF)
-	return 0;
-      else if (ch == 'B' || ch == 'P')
-	return ch;
-    }
-}
-]])
-
-AT_CHECK([[bison -o glr-regr1.c glr-regr1.y]], 0, [],
-[glr-regr1.y: conflicts: 1 shift/reduce
-])
-AT_COMPILE([glr-regr1])
-AT_CHECK([[echo BPBPB | ./glr-regr1]], 0,
-[[E -> 'B'
-E -> 'B'
-E -> E 'P' E
-E -> 'B'
-E -> E 'P' E
-E -> 'B'
-E -> E 'P' E
-E -> E 'P' E
-<OR>
-]], [])
-
-AT_CLEANUP
-
-## ------------------------------------------------------------ ##
-## Improper handling of embedded actions and $-N in GLR parsers ##
-## ------------------------------------------------------------ ##
-
-AT_SETUP([Improper handling of embedded actions and dollar(-N) in GLR parsers])
-
-AT_DATA_GRAMMAR([glr-regr2a.y],
-[[/* Regression Test: Improper handling of embedded actions and $-N  */
-/* Reported by S. Eken */
-
-%{
-  #define YYSTYPE char *
-
-  #include <ctype.h>
-  #include <stdio.h>
-  #include <stdlib.h>
-  #include <string.h>
-  int yylex (void);
-  void yyerror (char const *);
-%}
-
-%glr-parser
-
-%%
-
-command:
-    's' var 't'
-       { printf ("Variable: '%s'\n", $2); }
-    'v' 'x' 'q'
-       { free ($2); }
-  | 's' var_list 't' 'e'
-       { printf ("Varlist: '%s'\n", $2); free ($2); }
-  | 's' var 't' var_printer 'x'
-       { free ($2); }
-  ;
-
-var:
-  'V'
-     { $$ = $1; }
-  ;
-
-var_list:
-  var
-    { $$ = $1; }
-  | var ',' var_list
-    {
-      char *s = (char *) realloc ($1, strlen ($1) + 1 + strlen ($3) + 1);
-      strcat (s, ",");
-      strcat (s, $3);
-      free ($3);
-      $$ = s;
-    }
-  ;
-
-var_printer: 'v'
-   { printf ("Variable: '%s'\n", $-1); }
-
-%%
-
-FILE *input = NULL;
-
-int
-yylex (void)
-{
-  char buf[50];
-  char *s;
-  switch (fscanf (input, " %1[a-z,]", buf)) {
-  case 1:
-    return buf[0];
-  case EOF:
-    return 0;
-  default:
-    break;
-  }
-  if (fscanf (input, "%49s", buf) != 1)
-    return 0;
-  if (sizeof buf - 1 <= strlen (buf))
-    abort ();
-  s = (char *) malloc (strlen (buf) + 1);
-  strcpy (s, buf);
-  yylval = s;
-  return 'V';
-}
-
-void
-yyerror (char const *s)
-{ printf ("%s\n", s);
-}
-
-int
-main (int argc, char **argv)
-{
-  input = stdin;
-  if (argc == 2 && !(input = fopen (argv[1], "r"))) return 3;
-  return yyparse ();
-}
-]])
-
-AT_CHECK([[bison -o glr-regr2a.c glr-regr2a.y]], 0, [],
-[glr-regr2a.y: conflicts: 2 shift/reduce
-])
-AT_COMPILE([glr-regr2a])
-
-AT_CHECK([[echo s VARIABLE_1 t v x q | ./glr-regr2a]], 0,
-[[Variable: 'VARIABLE_1'
-]], [])
-AT_CHECK([[echo s VARIABLE_1 , ANOTHER_VARIABLE_2 t e | ./glr-regr2a]], 0,
-[[Varlist: 'VARIABLE_1,ANOTHER_VARIABLE_2'
-]])
-AT_CHECK([[echo s VARIABLE_3 t v x | ./glr-regr2a]], 0,
-[[Variable: 'VARIABLE_3'
-]], [])
-
-
-AT_CLEANUP
-
-## ------------------------------------------------------------ ##
-## Improper merging of GLR delayed action sets                  ##
-## ------------------------------------------------------------ ##
-
-AT_SETUP([Improper merging of GLR delayed action sets])
-
-AT_DATA_GRAMMAR([glr-regr3.y],
-[[/* Regression Test: Improper merging of GLR delayed action sets.  */
-/* Reported by M. Rosien */
-
-%{
-#include <stdio.h>
-#include <stdarg.h>
-
-static int MergeRule (int x0, int x1);
-static void yyerror (char const * s);
-int yylex (void);
-
-#define RULE(x) (1 << (x))
-
-%}
-
-%glr-parser
-
-%token BAD_CHAR
-%token P1 P2 T1 T2 T3 T4 O1 O2
-
-%%
-
-S : P1 T4 O2 NT6 P2  { printf ("Result: %x\n", $4); }
-;
-
-NT1 : P1 T1 O1 T2 P2 { $$ = RULE(2); }  %merge<MergeRule>
-;
-
-NT2 : NT1             { $$ = RULE(3); } %merge<MergeRule>
-    | P1 NT1 O1 T3 P2 { $$ = RULE(4); } %merge<MergeRule>
-;
-
-NT3 : T3              { $$ = RULE(5); } %merge<MergeRule>
-    | P1 NT1 O1 T3 P2 { $$ = RULE(6); } %merge<MergeRule>
-;
-
-NT4 : NT3              { $$ = RULE(7); } %merge<MergeRule>
-    | NT2              { $$ = RULE(8); } %merge<MergeRule>
-    | P1 NT2 O1 NT3 P2 { $$ = RULE(9); } %merge<MergeRule>
-;
-
-NT5 : NT4              { $$ = RULE(10); } %merge<MergeRule>
-;
-
-NT6 : P1 NT1 O1 T3 P2  { $$ = RULE(11) | $2; } %merge<MergeRule>
-    | NT5              { $$ = RULE(12) | $1; } %merge<MergeRule>
-;
-
-%%
-
-static int MergeRule (int x0, int x1) {
-  return x0 | x1;
-}
-
-static void yyerror(char const * s) {
-  fprintf(stderr,"error: %s\n",s);
-}
-
-FILE *input = NULL;
-
-int P[] = { P1, P2 };
-int O[] = { O1, O2 };
-int T[] = { T1, T2, T3, T4 };
-
-int yylex (void)
-{
-  char inp[3];
-  if (fscanf (input, "%2s", inp) == EOF)
-    return 0;
-  switch (inp[0])
-    {
-    case 'p': return P[inp[1] - '1'];
-    case 't': return T[inp[1] - '1'];
-    case 'o': return O[inp[1] - '1'];
-    }
-  return BAD_CHAR;
-}
-
-int main(int argc, char* argv[]) {
-  input = stdin;
-  if (argc == 2 && !(input = fopen (argv[1], "r"))) return 3;
-  return yyparse ();
-}
-]])
-
-AT_CHECK([[bison -o glr-regr3.c glr-regr3.y]], 0, [],
-[glr-regr3.y: conflicts: 1 shift/reduce, 1 reduce/reduce
-])
-AT_COMPILE([glr-regr3])
-
-AT_CHECK([[echo p1 t4 o2 p1 p1 t1 o1 t2 p2 o1 t3 p2 p2 | ./glr-regr3]], 0,
-[[Result: 1c04
-]], [])
-
-AT_CLEANUP
-
-
-## ------------------------------------------------------------------------- ##
-## Duplicate representation of merged trees.  See			     ##
-## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>.     ##
-## ------------------------------------------------------------------------- ##
-
-AT_SETUP([Duplicate representation of merged trees])
-
-AT_DATA_GRAMMAR([glr-regr4.y],
-[[
-%union { char *ptr; }
-%type <ptr> S A A1 A2 B
-%glr-parser
-
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
-  #include <string.h>
-  static char *merge (YYSTYPE, YYSTYPE);
-  static char *make_value (char const *, char const *);
-  static void yyerror (char const *);
-  static int yylex (void);
-%}
-
-%%
-
-tree: S { printf ("%s\n", $1); } ;
-
-S:
-  A   %merge<merge> { $$ = make_value ("S", $1); }
-  | B %merge<merge> { $$ = make_value ("S", $1); }
-  ;
-
-A:
-  A1   %merge<merge> { $$ = make_value ("A", $1); }
-  | A2 %merge<merge> { $$ = make_value ("A", $1); }
-  ;
-
-A1: 'a' { $$ = make_value ("A1", "'a'"); } ;
-A2: 'a' { $$ = make_value ("A2", "'a'"); } ;
-B:  'a' { $$ = make_value ("B", "'a'");  } ;
-
-%%
-
-static int
-yylex (void)
-{
-  static char const *input = "a";
-  return *input++;
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-
-static char *
-make_value (char const *parent, char const *child)
-{
-  char const format[] = "%s <- %s";
-  char *value =
-    (char *) malloc (strlen (parent) + strlen (child) + sizeof format);
-  sprintf (value, format, parent, child);
-  return value;
-}
-
-static char *
-merge (YYSTYPE s1, YYSTYPE s2)
-{
-  char const format[] = "merge{ %s and %s }";
-  char *value =
-    (char *) malloc (strlen (s1.ptr) + strlen (s2.ptr) + sizeof format);
-  sprintf (value, format, s1.ptr, s2.ptr);
-  return value;
-}
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-]])
-
-AT_CHECK([[bison -o glr-regr4.c glr-regr4.y]], 0, [],
-[glr-regr4.y: conflicts: 1 reduce/reduce
-])
-AT_COMPILE([glr-regr4])
-
-AT_CHECK([[./glr-regr4]], 0,
-[[merge{ S <- merge{ A <- A1 <- 'a' and A <- A2 <- 'a' } and S <- B <- 'a' }
-]], [])
-
-AT_CLEANUP
-
-
-## -------------------------------------------------------------------------- ##
-## User destructor for unresolved GLR semantic value.  See		      ##
-## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00016.html>.   ##
-## -------------------------------------------------------------------------- ##
-
-AT_SETUP([User destructor for unresolved GLR semantic value])
-
-AT_DATA_GRAMMAR([glr-regr5.y],
-[[
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  enum { MAGIC_VALUE = -1057808125 }; /* originally chosen at random */
-%}
-
-%glr-parser
-%union { int value; }
-%type <value> start
-
-%destructor {
-  if ($$ != MAGIC_VALUE)
-    {
-      fprintf (stderr, "Bad destructor call.\n");
-      exit (EXIT_FAILURE);
-    }
-} start
-
-%%
-
-start:
-   'a' { $$ = MAGIC_VALUE; }
-   | 'a' { $$ = MAGIC_VALUE; }
-   ;
-
-%%
-
-static int
-yylex (void)
-{
-  static char const *input = "a";
-  return *input++;
-}
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-int
-main (void)
-{
-  return yyparse () != 1;
-}
-]])
-
-AT_CHECK([[bison -o glr-regr5.c glr-regr5.y]], 0, [],
-[glr-regr5.y: conflicts: 1 reduce/reduce
-])
-AT_COMPILE([glr-regr5])
-
-AT_CHECK([[./glr-regr5]], 0, [],
-[syntax is ambiguous
-])
-
-AT_CLEANUP
-
-
-## -------------------------------------------------------------------------- ##
-## User destructor after an error during a split parse.  See		      ##
-## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html>.   ##
-## -------------------------------------------------------------------------- ##
-
-AT_SETUP([User destructor after an error during a split parse])
-
-AT_DATA_GRAMMAR([glr-regr6.y],
-[[
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-%}
-
-%glr-parser
-%union { int value; }
-%type <value> 'a'
-
-%destructor {
-  printf ("Destructor called.\n");
-} 'a'
-
-%%
-
-start: 'a' | 'a' ;
-
-%%
-
-static int
-yylex (void)
-{
-  static char const *input = "a";
-  return *input++;
-}
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-int
-main (void)
-{
-  return yyparse () != 1;
-}
-]])
-
-AT_CHECK([[bison -o glr-regr6.c glr-regr6.y]], 0, [],
-[glr-regr6.y: conflicts: 1 reduce/reduce
-])
-AT_COMPILE([glr-regr6])
-
-AT_CHECK([[./glr-regr6]], 0,
-[Destructor called.
-],
-[syntax is ambiguous
-])
-
-AT_CLEANUP
-
-
-## ------------------------------------------------------------------------- ##
-## Duplicated user destructor for lookahead.  See			     ##
-## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00035.html>.  ##
-## ------------------------------------------------------------------------- ##
-
-AT_SETUP([Duplicated user destructor for lookahead])
-
-AT_DATA_GRAMMAR([glr-regr7.y],
-[[
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  #define YYSTACKEXPANDABLE 0
-%}
-
-%glr-parser
-%union { int *count; }
-%type <count> 'a'
-
-%destructor {
-  if ((*$$)++)
-    fprintf (stderr, "Destructor called on same value twice.\n");
-} 'a'
-
-%%
-
-start:
-    stack1 start
-  | stack2 start
-  | /* empty */
-  ;
-stack1: 'a' ;
-stack2: 'a' ;
-
-%%
-
-static int
-yylex (void)
-{
-  yylval.count = (int *) malloc (sizeof (int));
-  if (!yylval.count)
-    {
-      fprintf (stderr, "Test inconclusive.\n");
-      exit (EXIT_FAILURE);
-    }
-  *yylval.count = 0;
-  return 'a';
-}
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-]])
-
-AT_CHECK([[bison -o glr-regr7.c glr-regr7.y]], 0, [],
-[glr-regr7.y: conflicts: 2 reduce/reduce
-])
-AT_COMPILE([glr-regr7])
-
-AT_CHECK([[./glr-regr7]], 2, [],
-[memory exhausted
-])
-
-AT_CLEANUP
-
-
-## ------------------------------------------------------------------------- ##
-## Incorrect default location for empty right-hand sides.  Adapted from bug  ##
-## report by Claudia Hermann.						     ##
-## See http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00069.html and ##
-## http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00072.html         ##
-## ------------------------------------------------------------------------- ##
-
-AT_SETUP([Incorrectly initialized location for empty right-hand side in GLR])
-
-AT_DATA_GRAMMAR([glr-regr8.y],
-[[
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  static void yyerror (char const *msg);
-%}
-
-%token T_CONSTANT
-%token T_PORT
-%token T_SIGNAL
-
-%glr-parser
-
-%%
-
-
-PortClause	: T_PORT InterfaceDeclaration T_PORT
-		{ printf("%d/%d - %d/%d - %d/%d\n",
-			 @1.first_column, @1.last_column,
-			 @2.first_column, @2.last_column,
-			 @3.first_column, @3.last_column); }
-	;
-
-InterfaceDeclaration	: OptConstantWord	%dprec 1
-	| OptSignalWord	%dprec 2
-	;
-
-OptConstantWord	: /* empty */
-	| T_CONSTANT
-	;
-
-OptSignalWord	: /* empty */
-		{ printf("empty: %d/%d\n", @$.first_column, @$.last_column); }
-	| T_SIGNAL
-	;
-
-%%
-
-void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int lexIndex;
-
-int yylex (void)
-{
-  lexIndex += 1;
-  switch (lexIndex)
-    {
-    case 1:
-      yylloc.first_column = 1;
-      yylloc.last_column = 9;
-      return T_PORT;
-    case 2:
-      yylloc.first_column = 13;
-      yylloc.last_column = 17;
-      return T_PORT;
-    default:
-      return 0;
-    }
-}
-
-int
-main (void)
-{
-  yyparse();
-  return 0;
-}
-]])
-
-AT_CHECK([[bison -o glr-regr8.c glr-regr8.y]], 0, [],
-[glr-regr8.y: conflicts: 1 reduce/reduce
-])
-AT_COMPILE([glr-regr8])
-
-AT_CHECK([[./glr-regr8]], 0,
-[empty: 9/9
-1/9 - 9/9 - 13/17
-],
-[])
-
-AT_CLEANUP
-
-
-## ------------------------------------------------------------------------- ##
-## No users destructors if stack 0 deleted.  See			     ##
-## <http://lists.gnu.org/archive/html/bison-patches/2005-09/msg00109.html>.  ##
-## ------------------------------------------------------------------------- ##
-
-AT_SETUP([No users destructors if stack 0 deleted])
-
-AT_DATA_GRAMMAR([glr-regr9.y],
-[[
-%{
-# include <stdio.h>
-# include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-# define YYSTACKEXPANDABLE 0
-  static int tokens = 0;
-  static int destructors = 0;
-# define USE(Var)
-%}
-
-%glr-parser
-%union { int dummy; }
-%type <dummy> 'a'
-
-%destructor {
-  destructors += 1;
-} 'a'
-
-%%
-
-start:
-    ambig0 'a'   { destructors += 2; USE ($2); }
-  | ambig1 start { destructors += 1; }
-  | ambig2 start { destructors += 1; }
-  ;
-
-ambig0: 'a' ;
-ambig1: 'a' ;
-ambig2: 'a' ;
-
-%%
-
-static int
-yylex (void)
-{
-  tokens += 1;
-  return 'a';
-}
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-int
-main (void)
-{
-  int exit_status;
-  exit_status = yyparse ();
-  if (tokens != destructors)
-    {
-      fprintf (stderr, "Tokens = %d, Destructors = %d\n", tokens, destructors);
-      return 1;
-    }
-  return !exit_status;
-}
-]])
-
-AT_CHECK([[bison -o glr-regr9.c glr-regr9.y]], 0, [],
-[glr-regr9.y: conflicts: 1 reduce/reduce
-])
-AT_COMPILE([glr-regr9])
-
-AT_CHECK([[./glr-regr9]], 0, [],
-[memory exhausted
-])
-
-AT_CLEANUP
-
-
-## ------------------------------------------------------------------------- ##
-## Corrupted semantic options if user action cuts parse.	             ##
-## ------------------------------------------------------------------------- ##
-
-AT_SETUP([Corrupted semantic options if user action cuts parse])
-
-AT_DATA_GRAMMAR([glr-regr10.y],
-[[
-%{
-# include <stdio.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  #define GARBAGE_SIZE 50
-  static char garbage[GARBAGE_SIZE];
-%}
-
-%glr-parser
-%union { char *ptr; }
-%type <ptr> start
-
-%%
-
-start:
-    %dprec 2 { $$ = garbage; YYACCEPT; }
-  | %dprec 1 { $$ = garbage; YYACCEPT; }
-  ;
-
-%%
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  return 0;
-}
-
-int
-main (void)
-{
-  int i;
-  for (i = 0; i < GARBAGE_SIZE; i+=1)
-    garbage[i] = 108;
-  return yyparse ();
-}
-]])
-
-AT_CHECK([[bison -o glr-regr10.c glr-regr10.y]], 0, [],
-[glr-regr10.y: conflicts: 1 reduce/reduce
-])
-AT_COMPILE([glr-regr10])
-
-AT_CHECK([[./glr-regr10]], 0, [], [])
-
-AT_CLEANUP
-
-
-## ------------------------------------------------------------------------- ##
-## Undesirable destructors if user action cuts parse.			     ##
-## ------------------------------------------------------------------------- ##
-
-AT_SETUP([Undesirable destructors if user action cuts parse])
-
-AT_DATA_GRAMMAR([glr-regr11.y],
-[[
-%{
-# include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  static int destructors = 0;
-# define USE(val)
-%}
-
-%glr-parser
-%union { int dummy; }
-%type <int> 'a'
-%destructor { destructors += 1; } 'a'
-
-%%
-
-start:
-    'a' %dprec 2 { USE ($1); destructors += 1; YYACCEPT; }
-  | 'a' %dprec 1 { USE ($1); destructors += 1; YYACCEPT; }
-  ;
-
-%%
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  static char const *input = "a";
-  return *input++;
-}
-
-int
-main (void)
-{
-  int exit_status = yyparse ();
-  if (destructors != 1)
-    {
-      fprintf (stderr, "Destructor calls: %d\n", destructors);
-      return 1;
-    }
-  return exit_status;
-}
-]])
-
-AT_CHECK([[bison -o glr-regr11.c glr-regr11.y]], 0, [],
-[glr-regr11.y: conflicts: 1 reduce/reduce
-])
-AT_COMPILE([glr-regr11])
-
-AT_CHECK([[./glr-regr11]], 0, [], [])
-
-AT_CLEANUP
-
-
-## ------------------------------------------------------------------------- ##
-## Leaked semantic values if user action cuts parse.			     ##
-## ------------------------------------------------------------------------- ##
-
-AT_SETUP([Leaked semantic values if user action cuts parse])
-
-AT_DATA_GRAMMAR([glr-regr12.y],
-[[
-%glr-parser
-%union { int dummy; }
-%token PARENT_RHS_AFTER
-%type <dummy> parent_rhs_before merged PARENT_RHS_AFTER
-%destructor { parent_rhs_before_value = 0; } parent_rhs_before
-%destructor { merged_value = 0; } merged
-%destructor { parent_rhs_after_value = 0; } PARENT_RHS_AFTER
-
-%{
-# include <stdlib.h>
-  static int merge (YYSTYPE, YYSTYPE);
-  static void yyerror (char const *);
-  static int yylex (void);
-  static int parent_rhs_before_value = 0;
-  static int merged_value = 0;
-  static int parent_rhs_after_value = 0;
-# define USE(val)
-%}
-
-%%
-
-start:
-  alt1 %dprec 1
-  | alt2 %dprec 2
-  ;
-
-alt1:
-  PARENT_RHS_AFTER {
-    USE ($1);
-    parent_rhs_after_value = 0;
-  }
-  ;
-
-alt2:
-  parent_rhs_before merged PARENT_RHS_AFTER {
-    USE (($1, $2, $3));
-    parent_rhs_before_value = 0;
-    merged_value = 0;
-    parent_rhs_after_value = 0;
-  }
-  ;
-
-parent_rhs_before:
-  {
-    USE ($$);
-    parent_rhs_before_value = 1;
-  }
-  ;
-
-merged:
-  %merge<merge> {
-    USE ($$);
-    merged_value = 1;
-  }
-  | cut %merge<merge> {
-    USE ($$);
-    merged_value = 1;
-  }
-  ;
-
-cut: { YYACCEPT; } ;
-
-%%
-
-static int
-merge (YYSTYPE s1, YYSTYPE s2)
-{
-  /* Not invoked. */
-  char dummy = s1.dummy + s2.dummy;
-  return dummy;
-}
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  static int const input[] = { PARENT_RHS_AFTER, 0 };
-  static const int *inputp = input;
-  if (*inputp == PARENT_RHS_AFTER)
-    parent_rhs_after_value = 1;
-  return *inputp++;
-}
-
-int
-main (void)
-{
-  int exit_status = yyparse ();
-  if (parent_rhs_before_value)
-    {
-      fprintf (stderr, "`parent_rhs_before' destructor not called.\n");
-      exit_status = 1;
-    }
-  if (merged_value)
-    {
-      fprintf (stderr, "`merged' destructor not called.\n");
-      exit_status = 1;
-    }
-  if (parent_rhs_after_value)
-    {
-      fprintf (stderr, "`PARENT_RHS_AFTER' destructor not called.\n");
-      exit_status = 1;
-    }
-  return exit_status;
-}
-]])
-
-AT_CHECK([[bison -o glr-regr12.c glr-regr12.y]], 0, [],
-[glr-regr12.y: conflicts: 1 shift/reduce, 1 reduce/reduce
-])
-AT_COMPILE([glr-regr12])
-
-AT_CHECK([[./glr-regr12]], 0, [], [])
-
-AT_CLEANUP
-
-
-## ------------------------------------------------------------------------- ##
-## Incorrect lookahead during deterministic GLR.  See			     ##
-## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00017.html> and  ##
-## <http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00060.html>.  ##
-## ------------------------------------------------------------------------- ##
-
-AT_SETUP([Incorrect lookahead during deterministic GLR])
-
-AT_DATA_GRAMMAR([glr-regr13.y],
-[[
-/* Tests:
-     - Defaulted state with initial yychar: yychar == YYEMPTY.
-     - Nondefaulted state: yychar != YYEMPTY.
-     - Defaulted state after lookahead: yychar != YYEMPTY.
-     - Defaulted state after shift: yychar == YYEMPTY.
-     - User action changing the lookahead.  */
-
-%{
-  #include <stdio.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  static void print_look_ahead (char const *);
-  #define USE(value)
-%}
-
-%union { char value; }
-%type <value> 'a' 'b'
-%glr-parser
-%locations
-
-%%
-
-start:
-  defstate_init defstate_shift 'b' change_lookahead 'a' {
-    USE ($3);
-    print_look_ahead ("start <- defstate_init defstate_shift 'b'");
-  }
-  ;
-defstate_init:
-  {
-    print_look_ahead ("defstate_init <- empty string");
-  }
-  ;
-defstate_shift:
-  nondefstate defstate_look 'a' {
-    USE ($3);
-    print_look_ahead ("defstate_shift <- nondefstate defstate_look 'a'");
-  }
-  ;
-defstate_look:
-  {
-    print_look_ahead ("defstate_look <- empty string");
-  }
-  ;
-nondefstate:
-  {
-    print_look_ahead ("nondefstate <- empty string");
-  }
-  | 'b' {
-    USE ($1);
-    print_look_ahead ("nondefstate <- 'b'");
-  }
-  ;
-change_lookahead:
-  {
-    yychar = 'a';
-  }
-  ;
-
-%%
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  static char const *input = "ab";
-  static int i = 0;
-  yylloc.first_line = yylloc.last_line = 1;
-  yylloc.first_column = yylloc.last_column = i + 1;
-  yylval.value = input[i] + 'A' - 'a';
-  return input[i++];
-}
-
-static void
-print_look_ahead (char const *reduction)
-{
-  printf ("%s:\n  yychar=", reduction);
-  if (yychar == YYEMPTY)
-    printf ("YYEMPTY");
-  else if (yychar == YYEOF)
-    printf ("YYEOF");
-  else
-    {
-      printf ("'%c', yylval='", yychar);
-      if (yylval.value > ' ')
-	printf ("%c", yylval.value);
-      printf ("', yylloc=(%d,%d),(%d,%d)",
-	      yylloc.first_line, yylloc.first_column,
-	      yylloc.last_line, yylloc.last_column);
-    }
-  printf ("\n");
-}
-
-int
-main (void)
-{
-  yychar = '#'; /* Not a token in the grammar.  */
-  yylval.value = '!';
-  return yyparse ();
-}
-]])
-
-AT_CHECK([[bison -o glr-regr13.c glr-regr13.y]], 0, [], [])
-AT_COMPILE([glr-regr13])
-
-AT_CHECK([[./glr-regr13]], 0,
-[defstate_init <- empty string:
-  yychar=YYEMPTY
-nondefstate <- empty string:
-  yychar='a', yylval='A', yylloc=(1,1),(1,1)
-defstate_look <- empty string:
-  yychar='a', yylval='A', yylloc=(1,1),(1,1)
-defstate_shift <- nondefstate defstate_look 'a':
-  yychar=YYEMPTY
-start <- defstate_init defstate_shift 'b':
-  yychar=YYEMPTY
-], [])
-
-AT_CLEANUP
-
-
-## ------------------------------------------------------------------------- ##
-## Incorrect lookahead during nondeterministic GLR.			     ##
-## ------------------------------------------------------------------------- ##
-
-AT_SETUP([Incorrect lookahead during nondeterministic GLR])
-
-AT_DATA_GRAMMAR([glr-regr14.y],
-[[
-/* Tests:
-     - Conflicting actions (split-off parse, which copies lookahead need,
-       which is necessarily yytrue) and nonconflicting actions (non-split-off
-       parse) for nondefaulted state: yychar != YYEMPTY.
-     - Merged deferred actions (lookahead need and RHS from different stack
-       than the target state) and nonmerged deferred actions (same stack).
-     - Defaulted state after lookahead: yychar != YYEMPTY.
-     - Defaulted state after shift: yychar == YYEMPTY.
-     - yychar != YYEMPTY but lookahead need is yyfalse (a previous stack has
-       seen the lookahead but current stack has not).
-     - Exceeding stack capacity (stack explosion), and thus reallocating
-       lookahead need array.
-   Note that it does not seem possible to see the initial yychar value during
-   nondeterministic operation since:
-     - In order to preserve the initial yychar, only defaulted states may be
-       entered.
-     - If only defaulted states are entered, there are no conflicts, so
-       nondeterministic operation does not start.  */
-
-%union { char value; }
-
-%{
-  #include <stdio.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  static void print_look_ahead (char const *);
-  static char merge (union YYSTYPE, union YYSTYPE);
-  #define USE(value)
-%}
-
-%type <value> 'a' 'b' 'c' 'd' stack_explosion
-%glr-parser
-%locations
-
-%%
-
-start:
-  merge 'c' stack_explosion {
-    USE ($2); USE ($3);
-    print_look_ahead ("start <- merge 'c' stack_explosion");
-  }
-  ;
-
-/* When merging the 2 deferred actions, the lookahead needs are different.  */
-merge:
-  nonconflict1 'a' 'b' nonconflict2 %dprec 1 {
-    USE ($2); USE ($3);
-    print_look_ahead ("merge <- nonconflict1 'a' 'b' nonconflict2");
-  }
-  | conflict defstate_look 'a' nonconflict2 'b' defstate_shift %dprec 2 {
-    USE ($3); USE ($5);
-    print_look_ahead ("merge <- conflict defstate_look 'a' nonconflict2 'b'"
-		      " defstate_shift");
-  }
-  ;
-
-nonconflict1:
-  {
-    print_look_ahead ("nonconflict1 <- empty string");
-  }
-  ;
-nonconflict2:
-  {
-    print_look_ahead ("nonconflict2 <- empty string");
-  }
-  | 'a' {
-    USE ($1);
-    print_look_ahead ("nonconflict2 <- 'a'");
-  }
-  ;
-conflict:
-  {
-    print_look_ahead ("conflict <- empty string");
-  }
-  ;
-defstate_look:
-  {
-    print_look_ahead ("defstate_look <- empty string");
-  }
-  ;
-
-/* yychar != YYEMPTY but lookahead need is yyfalse.  */
-defstate_shift:
-  {
-    print_look_ahead ("defstate_shift <- empty string");
-  }
-  ;
-
-stack_explosion:
-  { $$ = '\0'; }
-  | alt1 stack_explosion %merge<merge> { $$ = $2; }
-  | alt2 stack_explosion %merge<merge> { $$ = $2; }
-  | alt3 stack_explosion %merge<merge> { $$ = $2; }
-  ;
-alt1:
-  'd' no_look {
-    USE ($1);
-    if (yychar != 'd' && yychar != YYEOF)
-      {
-	fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
-      }
-  }
-  ;
-alt2:
-  'd' no_look {
-    USE ($1);
-    if (yychar != 'd' && yychar != YYEOF)
-      {
-	fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
-      }
-  }
-  ;
-alt3:
-  'd' no_look {
-    USE ($1);
-    if (yychar != 'd' && yychar != YYEOF)
-      {
-	fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
-      }
-  }
-  ;
-no_look:
-  {
-    if (yychar != YYEMPTY)
-      {
-	fprintf (stderr,
-		 "Found lookahead where shouldn't during stack explosion.\n");
-      }
-  }
-  ;
-
-%%
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  static char const *input = "abcdddd";
-  static int i = 0;
-  yylloc.first_line = yylloc.last_line = 1;
-  yylloc.first_column = yylloc.last_column = i + 1;
-  yylval.value = input[i] + 'A' - 'a';
-  return input[i++];
-}
-
-static void
-print_look_ahead (char const *reduction)
-{
-  printf ("%s:\n  yychar=", reduction);
-  if (yychar == YYEMPTY)
-    printf ("YYEMPTY");
-  else if (yychar == YYEOF)
-    printf ("YYEOF");
-  else
-    {
-      printf ("'%c', yylval='", yychar);
-      if (yylval.value > ' ')
-	printf ("%c", yylval.value);
-      printf ("', yylloc=(%d,%d),(%d,%d)",
-	      yylloc.first_line, yylloc.first_column,
-	      yylloc.last_line, yylloc.last_column);
-    }
-  printf ("\n");
-}
-
-static char
-merge (union YYSTYPE s1, union YYSTYPE s2)
-{
-  char dummy = s1.value + s2.value;
-  return dummy;
-}
-
-int
-main (void)
-{
-  yychar = '#'; /* Not a token in the grammar.  */
-  yylval.value = '!';
-  return yyparse ();
-}
-]])
-
-AT_CHECK([[bison -o glr-regr14.c glr-regr14.y]], 0, [],
-[glr-regr14.y: conflicts: 3 reduce/reduce
-])
-AT_COMPILE([glr-regr14])
-
-AT_CHECK([[./glr-regr14]], 0,
-[conflict <- empty string:
-  yychar='a', yylval='A', yylloc=(1,1),(1,1)
-defstate_look <- empty string:
-  yychar='a', yylval='A', yylloc=(1,1),(1,1)
-nonconflict2 <- empty string:
-  yychar='b', yylval='B', yylloc=(1,2),(1,2)
-defstate_shift <- empty string:
-  yychar=YYEMPTY
-merge <- conflict defstate_look 'a' nonconflict2 'b' defstate_shift:
-  yychar=YYEMPTY
-start <- merge 'c' stack_explosion:
-  yychar=YYEOF
-], [])
-
-AT_CLEANUP
-
-
-## ------------------------------------------------------------------------- ##
-## Leaked semantic values when reporting ambiguity.			     ##
-## ------------------------------------------------------------------------- ##
-
-AT_SETUP([Leaked semantic values when reporting ambiguity])
-
-AT_DATA_GRAMMAR([glr-regr15.y],
-[[
-%glr-parser
-%destructor { parent_rhs_before_value = 0; } parent_rhs_before
-
-%{
-# include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  static int parent_rhs_before_value = 0;
-# define USE(val)
-%}
-
-%%
-
-start:
-  alt1 %dprec 1
-  | alt2 %dprec 2
-  ;
-
-/* This stack must be merged into the other stacks *last* (added at the
-   beginning of the semantic options list) so that yyparse will choose to clean
-   it up rather than the tree for which some semantic actions have been
-   performed.  Thus, if yyreportAmbiguity longjmp's to yyparse, the values from
-   those other trees are not cleaned up.  */
-alt1: ;
-
-alt2:
-  parent_rhs_before ambiguity {
-    USE ($1);
-    parent_rhs_before_value = 0;
-  }
-  ;
-
-parent_rhs_before:
-  {
-    USE ($$);
-    parent_rhs_before_value = 1;
-  }
-  ;
-
-ambiguity: ambiguity1 | ambiguity2 ;
-ambiguity1: ;
-ambiguity2: ;
-
-%%
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  return 0;
-}
-
-int
-main (void)
-{
-  int exit_status = yyparse () != 1;
-  if (parent_rhs_before_value)
-    {
-      fprintf (stderr, "`parent_rhs_before' destructor not called.\n");
-      exit_status = 1;
-    }
-  return exit_status;
-}
-]])
-
-AT_CHECK([[bison -o glr-regr15.c glr-regr15.y]], 0, [],
-[glr-regr15.y: conflicts: 2 reduce/reduce
-])
-AT_COMPILE([glr-regr15])
-
-AT_CHECK([[./glr-regr15]], 0, [],
-[syntax is ambiguous
-])
-
-AT_CLEANUP
-
-
-## ------------------------------------------------------------------------- ##
-## Leaked lookahead after nondeterministic parse syntax error.		     ##
-## ------------------------------------------------------------------------- ##
-
-AT_SETUP([Leaked lookahead after nondeterministic parse syntax error])
-AT_DATA_GRAMMAR([glr-regr16.y],
-[[
-%glr-parser
-%destructor { lookahead_value = 0; } 'b'
-
-%{
-# include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  static int lookahead_value = 0;
-# define USE(val)
-%}
-
-%%
-
-start: alt1 'a' | alt2 'a' ;
-alt1: ;
-alt2: ;
-
-%%
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  static char const *input = "ab";
-  if (*input == 'b')
-    lookahead_value = 1;
-  return *input++;
-}
-
-int
-main (void)
-{
-  int exit_status = yyparse () != 1;
-  if (lookahead_value)
-    {
-      fprintf (stderr, "Lookahead destructor not called.\n");
-      exit_status = 1;
-    }
-  return exit_status;
-}
-]])
-
-AT_CHECK([[bison -o glr-regr16.c glr-regr16.y]], 0, [],
-[glr-regr16.y: conflicts: 1 reduce/reduce
-])
-AT_COMPILE([glr-regr16])
-
-AT_CHECK([[./glr-regr16]], 0, [],
-[syntax error
-])
-
-AT_CLEANUP
-
-
-## ------------------------------------------------------------------------- ##
-## Uninitialized location when reporting ambiguity.			     ##
-## ------------------------------------------------------------------------- ##
-
-AT_SETUP([Uninitialized location when reporting ambiguity])
-AT_DATA_GRAMMAR([glr-regr17.y],
-[[
-%glr-parser
-%locations
-%pure-parser
-%error-verbose
-
-%union { int dummy; }
-
-%{
-  static void yyerror (YYLTYPE *, char const *);
-  static int yylex (YYSTYPE *, YYLTYPE *);
-%}
-
-%initial-action {
-  @$.first_line = 1;
-  @$.first_column = 1;
-  @$.last_line = 1;
-  @$.last_column = 1;
-}
-
-%%
-
-/* Tests the case of an empty RHS that has inherited the location of the
-   previous nonterminal, which is unresolved.  That location is reported as the
-   last position of the ambiguity.  */
-start: ambig1 empty1 | ambig2 empty2 ;
-
-/* Tests multiple levels of yyresolveLocations recursion.  */
-ambig1: sub_ambig1 | sub_ambig2 ;
-ambig2: sub_ambig1 | sub_ambig2 ;
-
-/* Tests the case of a non-empty RHS as well as the case of an empty RHS that
-   has inherited the initial location.  The empty RHS's location is reported as
-   the first position in the ambiguity.  */
-sub_ambig1: empty1 'a' 'b' ;
-sub_ambig2: empty2 'a' 'b' ;
-empty1: ;
-empty2: ;
-
-%%
-
-static void
-yyerror (YYLTYPE *locp, char const *msg)
-{
-  fprintf (stderr, "Error at %d.%d-%d.%d: %s.\n", locp->first_line,
-	   locp->first_column, locp->last_line, locp->last_column, msg);
-}
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static char const input[] = "ab";
-  static char const *inputp = input;
-  lvalp->dummy = 0;
-  llocp->first_line = llocp->last_line = 2;
-  llocp->first_column = inputp - input + 1;
-  llocp->last_column = llocp->first_column + 1;
-  return *inputp++;
-}
-
-int
-main (void)
-{
-  return yyparse () != 1;
-}
-]])
-
-AT_CHECK([[bison -o glr-regr17.c glr-regr17.y]], 0, [],
-[glr-regr17.y: conflicts: 3 reduce/reduce
-])
-AT_COMPILE([glr-regr17])
-
-AT_CHECK([[./glr-regr17]], 0, [],
-[Error at 1.1-2.3: syntax is ambiguous.
-])
-
-AT_CLEANUP
diff --git a/tests/headers.at b/tests/headers.at
deleted file mode 100644
index a348d65..0000000
--- a/tests/headers.at
+++ /dev/null
@@ -1,137 +0,0 @@
-# Bison Parser Headers.                               -*- Autotest -*-
-# Copyright (C) 2001, 2002, 2006 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.
-
-AT_BANNER([[Parser Headers.]])
-
-
-## ---------------------- ##
-## %union and --defines.  ##
-## ---------------------- ##
-
-
-AT_SETUP([%union and --defines])
-
-AT_DATA([input.y],
-[%union
-{
-  int   integer;
-  char *string ;
-}
-%%
-exp: {};
-])
-
-AT_CHECK([bison --defines input.y])
-
-AT_CLEANUP
-
-
-
-## --------------------- ##
-## Invalid CPP headers.  ##
-## --------------------- ##
-
-# AT_TEST_CPP_GUARD_H([INPUT-FILE-BASE)
-# -------------------------------------
-m4_define([AT_TEST_CPP_GUARD_H],
-[AT_SETUP([Invalid CPP guards: $1])
-
-# Possibly create inner directories.
-dirname=`AS_DIRNAME([$1])`
-AS_MKDIR_P([$dirname])
-
-AT_DATA_GRAMMAR([$1.y],
-[%{
-#include <$1.h>
-void yyerror (const char *);
-int yylex (void);
-%}
-%%
-dummy:;
-%%
-#include <$1.h>
-])
-
-AT_CHECK([bison --defines=$1.h --output=y.tab.c $1.y])
-
-AT_COMPILE([y.tab.o], [-I. -c y.tab.c])
-
-AT_CLEANUP
-])
-
-AT_TEST_CPP_GUARD_H([input/input])
-AT_TEST_CPP_GUARD_H([9foo])
-
-
-
-## ---------------- ##
-## export YYLTYPE.  ##
-## ---------------- ##
-
-
-AT_SETUP([export YYLTYPE])
-
-AT_DATA_GRAMMAR([input.y],
-[%locations
-
-%name-prefix="my_"
-%{
-#include <stdio.h>
-#include <stdlib.h>
-
-static int
-my_lex (void)
-{
-  return EOF;
-}
-
-static void
-my_error (const char *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-%}
-%%
-exp:;
-])
-
-AT_CHECK([bison --defines -o input.c input.y])
-
-# YYLTYPE should be defined, and MY_LLOC declared.
-AT_DATA([caller.c],
-[[#include "input.h"
-YYLTYPE *my_llocp = &my_lloc;
-
-int my_parse (void);
-
-int
-main (void)
-{
-  return my_parse ();
-}
-]])
-
-# Link and execute, just to make sure everything is fine (and in
-# particular, that MY_LLOC is indeed defined somewhere).
-AT_COMPILE([caller.o], [-c caller.c])
-AT_COMPILE([input.o], [-c input.c])
-AT_COMPILE([caller], [caller.o input.o])
-AT_PARSER_CHECK([./caller])
-
-AT_CLEANUP
diff --git a/tests/input.at b/tests/input.at
deleted file mode 100644
index 82fbe06..0000000
--- a/tests/input.at
+++ /dev/null
@@ -1,396 +0,0 @@
-# Checking the Bison scanner.                    -*- Autotest -*-
-# Copyright (C) 2002, 2003, 2004, 2005, 2006 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.
-
-AT_BANNER([[Input Processing.]])
-
-# Mostly test that we are robust to mistakes.
-
-
-## ------------ ##
-## Invalid $n.  ##
-## ------------ ##
-
-AT_SETUP([Invalid dollar-n])
-
-AT_DATA([input.y],
-[[%%
-exp: { $$ = $1 ; };
-]])
-
-AT_CHECK([bison input.y], [1], [],
-[[input.y:2.13-14: integer out of range: `$1'
-]])
-
-AT_CLEANUP
-
-
-## ------------ ##
-## Invalid @n.  ##
-## ------------ ##
-
-AT_SETUP([Invalid @n])
-
-AT_DATA([input.y],
-[[%%
-exp: { @$ = @1 ; };
-]])
-
-AT_CHECK([bison input.y], [1], [],
-[[input.y:2.13-14: integer out of range: `@1'
-]])
-
-AT_CLEANUP
-
-
-## -------------- ##
-## Type Clashes.  ##
-## -------------- ##
-
-AT_SETUP([Type Clashes])
-
-AT_DATA([input.y],
-[[%token foo
-%type <bar> exp
-%%
-exp: foo {} foo
-   | foo
-   | /* Empty. */
-   ;
-]])
-
-AT_CHECK([bison input.y], [], [],
-[[input.y:4.6-15: warning: type clash on default action: <bar> != <>
-input.y:5.6-8: warning: type clash on default action: <bar> != <>
-input.y:6.5: warning: empty rule for typed nonterminal, and no action
-]])
-
-AT_CLEANUP
-
-
-## --------------- ##
-## Unused values.  ##
-## --------------- ##
-
-AT_SETUP([Unused values])
-
-AT_DATA([input.y],
-[[%token <integer> INT
-%type <integer> a b c d e f g h i j k l
-%destructor { destroy ($$); } INT a b c d e f g h i j k l
-%%
-start:
-  'a' a { $2 } | 'b' b { $2 } | 'c' c { $2 } | 'd' d { $2 } | 'e' e { $2 }
-| 'f' f { $2 } | 'g' g { $2 } | 'h' h { $2 } | 'i' i { $2 } | 'j' j { $2 }
-| 'k' k { $2 } | 'l' l { $2 }
-;
-
-a: INT | INT { } INT { } INT { };
-b: INT | /* empty */;
-c: INT | INT { $1 } INT { } INT { };
-d: INT | INT { } INT { $1 } INT { };
-e: INT | INT { } INT {  } INT { $1 };
-f: INT | INT { } INT {  } INT { $$ = $1 + $3 + $5; };
-g: INT | INT { $$ } INT { $$ } INT { };
-h: INT | INT { $$ } INT { $$ = $2 } INT { };
-i: INT | INT INT { } { $$ = $1 + $2; };
-j: INT | INT INT { $<integer>$ = 1; } { $$ = $1 + $2; };
-k: INT | INT INT { $$; } { $$ = $3; } { };
-l: INT | INT { $$ = $1; } INT { $$ = $2 + $3; } INT { $$ = $4 + $5; };
-
-]])
-
-AT_CHECK([bison input.y], [], [],
-[[input.y:11.10-32: warning: unset value: $$
-input.y:11.10-32: warning: unused value: $1
-input.y:11.10-32: warning: unused value: $3
-input.y:11.10-32: warning: unused value: $5
-input.y:12.9: warning: empty rule for typed nonterminal, and no action
-input.y:13.10-35: warning: unset value: $$
-input.y:13.10-35: warning: unused value: $3
-input.y:13.10-35: warning: unused value: $5
-input.y:14.10-35: warning: unset value: $$
-input.y:14.10-35: warning: unused value: $3
-input.y:14.10-35: warning: unused value: $5
-input.y:15.10-36: warning: unset value: $$
-input.y:15.10-36: warning: unused value: $3
-input.y:15.10-36: warning: unused value: $5
-input.y:17.10-38: warning: unset value: $$
-input.y:17.10-38: warning: unused value: $1
-input.y:17.10-38: warning: unused value: $2
-input.y:17.10-38: warning: unused value: $3
-input.y:17.10-38: warning: unused value: $4
-input.y:17.10-38: warning: unused value: $5
-input.y:18.10-43: warning: unset value: $$
-input.y:18.10-43: warning: unused value: $1
-input.y:18.10-43: warning: unused value: $3
-input.y:18.10-43: warning: unused value: $4
-input.y:18.10-43: warning: unused value: $5
-input.y:20.10-55: warning: unused value: $3
-input.y:21.10-41: warning: unset value: $$
-input.y:21.10-41: warning: unused value: $1
-input.y:21.10-41: warning: unused value: $2
-input.y:21.10-41: warning: unused value: $4
-]])
-
-AT_CLEANUP
-
-
-## ---------------------- ##
-## Incompatible Aliases.  ##
-## ---------------------- ##
-
-AT_SETUP([Incompatible Aliases])
-
-AT_DATA([input.y],
-[[%token foo "foo"
-
-%type <bar>       foo
-%printer {bar}    foo
-%destructor {bar} foo
-%left             foo
-
-%type <baz>       "foo"
-%printer {baz}    "foo"
-%destructor {baz} "foo"
-%left             "foo"
-
-%%
-exp: foo;
-]])
-
-AT_CHECK([bison input.y], [1], [],
-[[input.y:8.7-11: %type redeclaration for foo
-input.y:3.7-11: first declaration
-input.y:10.13-17: %destructor redeclaration for foo
-input.y:5.13-17: first declaration
-input.y:9.10-14: %printer redeclaration for foo
-input.y:10.13-17: first declaration
-input.y:11.1-5: %left redeclaration for foo
-input.y:6.1-5: first declaration
-]])
-
-AT_CLEANUP
-
-
-
-## ----------------------- ##
-## Torturing the Scanner.  ##
-## ----------------------- ##
-
-# Be sure to compile and run, so that the C compiler checks what
-# we do.
-
-AT_SETUP([Torturing the Scanner])
-
-
-AT_DATA([input.y], [])
-AT_CHECK([bison input.y], [1], [],
-[[input.y:1.1: syntax error, unexpected end of file
-]])
-
-
-AT_DATA([input.y], 
-[{}
-])
-AT_CHECK([bison input.y], [1], [],
-[[input.y:1.1-2: syntax error, unexpected {...}
-]])
-
-
-AT_DATA_GRAMMAR([input.y],
-[[%{
-/* This is seen in GCC: a %{ and %} in middle of a comment. */
-const char *foo = "So %{ and %} can be here too.";
-
-#if 0
-/* These examples test Bison while not stressing C compilers too much.
-   Many C compilers mishandle backslash-newlines, so this part of the
-   test is inside "#if 0".  The comment and string are written so that
-   the "#endif" will be seen regardless of the C compiler bugs that we
-   know about, namely:
-
-     HP C (as of late 2002) mishandles *\[newline]\[newline]/ within a
-     comment.
-
-     The Apple Darwin compiler (as of late 2002) mishandles
-     \\[newline]' within a character constant.
-
-   */
-
-/\
-* A comment with backslash-newlines in it. %} *\
-\
-/
-/* { Close the above comment, if the C compiler mishandled it.  */
-
-char str[] = "\\
-" A string with backslash-newlines in it %{ %} \\
-\
-"";
-
-char apostrophe = '\'';
-#endif
-
-#include <stdio.h>
-%}
-/* %{ and %} can be here too. */
-
-%{
-/* Exercise pre-prologue dependency to %union.  */
-typedef int value;
-%}
-
-/* Exercise M4 quoting: '@:>@@:>@', 0.  */
-
-/* Also exercise %union. */
-%union
-{
-  value ival; /* A comment to exercise an old bug. */
-};
-
-
-/* Exercise post-prologue dependency to %union.  */
-%{
-static YYSTYPE value_as_yystype (value val);
-
-/* Exercise quotes in declarations.  */
-char quote[] = "@:>@@:>@,";
-%}
-
-%{
-static void yyerror (const char *s);
-static int yylex (void);
-%}
-
-%type <ival> '@<:@'
-
-/* Exercise quotes in strings.  */
-%token FAKE "fake @<:@@:>@ \a\b\f\n\r\t\v\"\'\?\\\u005B\U0000005c ??!??'??(??)??-??/??<??=??> \x1\1"
-
-%%
-/* Exercise M4 quoting: '@:>@@:>@', @<:@, 1.  */
-exp: '@<:@' '\1' two '$' '@' '{' oline output.or.oline.opt
-  {
-    /* Exercise quotes in braces.  */
-    char tmp[] = "@<:@%c@:>@,\n";
-    printf (tmp, $1);
-  }
-;
-
-two: '\x000000000000000000000000000000000000000000000000000000000000000000002';
-oline: '@' 'o' 'l' 'i' 'n' 'e' '@' '_' '_' 'o' 'l' 'i' 'n' 'e' '_' '_';
-output.or.oline.opt: ;|oline;;|output;;;
-output: '#' 'o' 'u' 't' 'p' 'u' 't' ' ';
-%%
-/* Exercise M4 quoting: '@:>@@:>@', @<:@, 2.  */
-
-static YYSTYPE
-value_as_yystype (value val)
-{
-  YYSTYPE res;
-  res.ival = val;
-  return res;
-}
-
-static int
-yylex (void)
-{
-  static const char *input = "@<:@\1\2$@{@oline@__@&t@oline__\
-#output "; /* "
-  */
-  yylval = value_as_yystype (*input);
-  return *input++;
-}
-
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-]])
-
-# Pacify Emacs'font-lock-mode: "
-
-AT_DATA([main.c],
-[[typedef int value;
-#include "input.h"
-
-int yyparse (void);
-
-int
-main (void)
-{
-  return yyparse ();
-}
-]])
-
-AT_CHECK([bison -d -v -o input.c input.y])
-AT_COMPILE([input.o], [-c input.c])
-AT_COMPILE([main.o], [-c main.c])
-AT_COMPILE([input], [input.o main.o])
-AT_PARSER_CHECK([./input], 0,
-[[[@<:@],
-]])
-
-AT_CLEANUP
-
-
-## ---------------------- ##
-## Typed symbol aliases.  ##
-## ---------------------- ##
-
-AT_SETUP([Typed symbol aliases])
-
-# Bison 2.0 broke typed symbol aliases - ensure they work.
-
-AT_DATA_GRAMMAR([input.y],
-[[%union
-{
-  int val;
-};
-%token <val> MY_TOKEN "MY TOKEN"
-%type <val> exp
-%%
-exp: "MY TOKEN";
-%%
-]])
-
-AT_CHECK([bison -o input.c input.y])
-
-AT_CLEANUP
-
-
-## --------- ##
-## Require.  ##
-## --------- ##
-
-m4_define([AT_CHECK_REQUIRE],
-[AT_SETUP([Require $1])
-AT_DATA_GRAMMAR([input.y],
-[[%require "$1";
-%%
-empty_file:;
-]])
-AT_CHECK([bison -o input.c input.y], $2, [], ignore)
-AT_CLEANUP
-])
-
-AT_CHECK_REQUIRE(1.0, 0)
-AT_CHECK_REQUIRE(AT_PACKAGE_VERSION, 0)
-## FIXME: Some day augment this version number.
-AT_CHECK_REQUIRE(100.0, 63)
diff --git a/tests/local.at b/tests/local.at
deleted file mode 100644
index 55ba824..0000000
--- a/tests/local.at
+++ /dev/null
@@ -1,218 +0,0 @@
-# Process this -*- Autotest -*- file with autom4te.
-
-# Macros for the GNU Bison Test suite.
-# Copyright (C) 2003, 2004, 2005, 2006 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.
-
-# We want a recent Autotest.
-m4_version_prereq([2.58])
-
-
-## ------------------------------- ##
-## Macros decoding Bison options.  ##
-## ------------------------------- ##
-
-
-# AT_BISON_OPTION_PUSHDEFS([BISON-OPTIONS])
-# -----------------------------------------
-m4_define([AT_BISON_OPTION_PUSHDEFS],
-[_AT_BISON_OPTION_PUSHDEFS($[1], $[2], [$1])])
-
-
-# _AT_BISON_OPTION_PUSHDEFS($1, $2, [BISON-OPTIONS])
-# --------------------------------------------------
-# This macro works around the impossibility to define macros
-# inside macros, because issuing `[$1]' is not possible in M4 :(.
-# This sucks hard, GNU M4 should really provide M5 like $$1.
-m4_define([_AT_BISON_OPTION_PUSHDEFS],
-[m4_if([$1$2], $[1]$[2], [],
-       [m4_fatal([$0: Invalid arguments: $@])])dnl
-m4_pushdef([AT_LALR1_CC_IF],
-[m4_bmatch([$3], ["lalr1.cc"], [$1], [$2])])
-m4_pushdef([AT_GLR_CC_IF],
-[m4_bmatch([$3], ["glr.cc"], [$1], [$2])])
-m4_pushdef([AT_SKEL_CC_IF],
-[m4_bmatch([$3], ["\(glr\|lalr1\).cc"], [$1], [$2])])
-m4_pushdef([AT_GLR_IF],
-[m4_bmatch([$3], [%glr-parser], [$1], [$2])])
-# Using yacc.c?
-m4_pushdef([AT_YACC_IF],
-[m4_bmatch([$3], [%glr-parser\|%skeleton], [$2], [$1])])
-m4_pushdef([AT_PARAM_IF],
-[m4_bmatch([$3], [%parse-param], [$1], [$2])])
-m4_pushdef([AT_LOCATION_IF],
-[m4_bmatch([$3], [%locations], [$1], [$2])])
-m4_pushdef([AT_PURE_IF],
-[m4_bmatch([$3], [%pure-parser], [$1], [$2])])
-m4_pushdef([AT_PURE_AND_LOC_IF],
-[m4_bmatch([$3], [%locations.*%pure-parser\|%pure-parser.*%locations],
-	   [$1], [$2])])
-m4_pushdef([AT_GLR_OR_PARAM_IF],
-[m4_bmatch([$3], [%glr-parser\|%parse-param], [$1], [$2])])
-m4_pushdef([AT_NAME_PREFIX],
-[m4_bmatch([$3], [%name-prefix=".*"], 
-           [m4_bregexp([$3], [name-prefix="\([^"]*\)"], [\1])],
-           [yy])])
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-m4_pushdef([AT_YYERROR_ARG_LOC_IF],
-[AT_GLR_OR_PARAM_IF([AT_PURE_AND_LOC_IF([$1], [$2])],
-		    [$2])])
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-m4_pushdef([AT_YYERROR_SEES_LOC_IF],
-[AT_LOCATION_IF([AT_YACC_IF([AT_PURE_IF([AT_PARAM_IF([$1], [$2])],
-					[$1])],
-			    [$1])],
-		[$2])])
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-m4_pushdef([AT_PURE_LEX_IF],
-[AT_PURE_IF([$1],
-	    [AT_SKEL_CC_IF([$1], [$2])])])
-
-AT_PURE_LEX_IF(
-[m4_pushdef([AT_LOC], [(*llocp)])
- m4_pushdef([AT_VAL], [(*lvalp)])
- m4_pushdef([AT_LEX_FORMALS],
-	    [YYSTYPE *lvalp[]AT_LOCATION_IF([, YYLTYPE *llocp])])
- m4_pushdef([AT_LEX_ARGS],
-	    [lvalp[]AT_LOCATION_IF([, llocp])])
- m4_pushdef([AT_USE_LEX_ARGS],
-	    [(void) lvalp;AT_LOCATION_IF([(void) llocp])])
- m4_pushdef([AT_LEX_PRE_FORMALS],
-	    [AT_LEX_FORMALS, ])
- m4_pushdef([AT_LEX_PRE_ARGS],
-	    [AT_LEX_ARGS, ])
-],
-[m4_pushdef([AT_LOC], [(yylloc)])
- m4_pushdef([AT_VAL], [(yylval)])
- m4_pushdef([AT_LEX_FORMALS],     [void])
- m4_pushdef([AT_LEX_ARGS],        [])
- m4_pushdef([AT_USE_LEX_ARGS],    [])
- m4_pushdef([AT_LEX_PRE_FORMALS], [])
- m4_pushdef([AT_LEX_PRE_ARGS],    [])
-])
-])# _AT_BISON_OPTION_PUSHDEFS
-
-
-# AT_BISON_OPTION_POPDEFS
-# -----------------------
-m4_define([AT_BISON_OPTION_POPDEFS],
-[m4_popdef([AT_LEX_PRE_ARGS])
-m4_popdef([AT_LEX_PRE_FORMALS])
-m4_popdef([AT_USE_LEX_ARGS])
-m4_popdef([AT_LEX_ARGS])
-m4_popdef([AT_LEX_FORMALS])
-m4_popdef([AT_VAL])
-m4_popdef([AT_LOC])
-m4_popdef([AT_PURE_LEX_IF])
-m4_popdef([AT_YYERROR_SEES_LOC_IF])
-m4_popdef([AT_YYERROR_ARG_LOC_IF])
-m4_popdef([AT_NAME_PREFIX])
-m4_popdef([AT_GLR_OR_PARAM_IF])
-m4_popdef([AT_PURE_AND_LOC_IF])
-m4_popdef([AT_LOCATION_IF])
-m4_popdef([AT_PARAM_IF])
-m4_popdef([AT_YACC_IF])
-m4_popdef([AT_GLR_IF])
-m4_popdef([AT_SKEL_CC_IF])
-m4_popdef([AT_GLR_CC_IF])
-m4_popdef([AT_LALR1_CC_IF])
-])# AT_BISON_OPTION_POPDEFS
-
-
-
-## -------------------------- ##
-## Generating Grammar Files.  ##
-## -------------------------- ##
-
-
-# AT_DATA_GRAMMAR_PROLOGUE
-# ------------------------
-# The prologue that should be included in any grammar which parser is
-# meant to be compiled.
-m4_define([AT_DATA_GRAMMAR_PROLOGUE],
-[[%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}]
-])
-
-
-# AT_DATA_GRAMMAR(NAME, CONTENT)
-# ------------------------------
-# Generate the file NAME, which CONTENT is preceded by
-# AT_DATA_GRAMMAR_PROLOGUE.
-m4_define([AT_DATA_GRAMMAR],
-[AT_DATA([$1],
-[AT_DATA_GRAMMAR_PROLOGUE
-$2])
-])
-
-
-## ------------------------ ##
-## Compiling C, C++ Files.  ##
-## ------------------------ ##
-
-
-# AT_COMPILE(OUTPUT, [SOURCES = OUTPUT.c])
-# ----------------------------------------
-# Compile SOURCES into OUTPUT.  If OUTPUT does not contain '.',
-# assume that we are linking too; this is a hack.
-m4_define([AT_COMPILE],
-[AT_CHECK([$CC $CFLAGS $CPPFLAGS m4_bmatch([$1], [[.]], [], [$LDFLAGS ])-o $1 m4_default([$2], [$1.c])[]m4_bmatch([$1], [[.]], [], [ $LIBS])],
-	   0, [ignore], [ignore])])
-
-# AT_COMPILE_CXX(OUTPUT, [SOURCES = OUTPUT.cc])
-# --------------------------------------------
-# Compile SOURCES into OUTPUT.  If OUTPUT does not contain '.',
-# assume that we are linking too; this is a hack.
-# If the C++ compiler does not work, ignore the test.
-m4_define([AT_COMPILE_CXX],
-[AT_KEYWORDS(c++)
-AT_CHECK([$BISON_CXX_WORKS], 0, ignore, ignore)
-AT_CHECK([$CXX $CXXFLAGS $CPPFLAGS m4_bmatch([$1], [[.]], [], [$LDFLAGS ])-o $1 m4_default([$2], [$1.cc])[]m4_bmatch([$1], [[.]], [], [ $LIBS])],
-	 0, [ignore], [ignore])])
-
-
-
-## ---------------------------- ##
-## Running a generated parser.  ##
-## ---------------------------- ##
-
-# AT_PARSER_CHECK(COMMAND, EXIT-STATUS, EXPOUT, EXPERR)
-# -----------------------------------------------------
-# So that we can run `./testsuite PREPARSER='valgrind -q' for instance.
-m4_define([AT_PARSER_CHECK],
-[AT_CHECK([$PREPARSER $1], [$2], [$3], [$4])])
-
-
-
-
-## ----------------------- ##
-## Launch the test suite.  ##
-## ----------------------- ##
-
-AT_INIT
-
-AT_TESTED([bison])
diff --git a/tests/output.at b/tests/output.at
deleted file mode 100644
index 8ddde46..0000000
--- a/tests/output.at
+++ /dev/null
@@ -1,114 +0,0 @@
-# Checking the output filenames.                    -*- Autotest -*-
-# Copyright (C) 2000, 2001, 2002, 2005 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.
-
-AT_BANNER([[Output file names.]])
-
-
-# AT_CHECK_OUTPUT(INPUT-FILE, [DIRECTIVES], [FLAGS], EXPECTED-FILES, [SHELLIO],
-#                 [ADDITIONAL-TESTS])
-# -----------------------------------------------------------------------------
-m4_define([AT_CHECK_OUTPUT],
-[AT_SETUP([Output files: $2 $3 $5])
-case "$1" in
-  */*) mkdir `echo "$1" | sed 's,/.*,,'`;;
-esac
-AT_DATA([$1],
-[[$2
-%%
-foo: {};
-]])
-
-AT_CHECK([bison $3 $1 $5], 0)
-AT_CHECK([ls $4], [], [ignore])
-$6
-AT_CLEANUP
-])
-
-AT_CHECK_OUTPUT([foo.y], [], [-dv],
-		[foo.output foo.tab.c foo.tab.h])
-AT_CHECK_OUTPUT([foo.y], [], [-dv],
-		[foo.output foo.tab.c foo.tab.h],
-		[>&-])
-AT_CHECK_OUTPUT([foo.y], [], [-dv -o foo.c],
-		[foo.c foo.h foo.output])
-AT_CHECK_OUTPUT([foo.y], [], [-dv -o foo.tab.c],
-		[foo.output foo.tab.c foo.tab.h])
-AT_CHECK_OUTPUT([foo.y], [], [-dv -y],
-		[y.output y.tab.c y.tab.h])
-AT_CHECK_OUTPUT([foo.y], [], [-dv -b bar],
-		[bar.output bar.tab.c bar.tab.h])
-AT_CHECK_OUTPUT([foo.y], [], [-dv -g -o foo.c],
-		[foo.c foo.h foo.output foo.vcg])
-
-
-AT_CHECK_OUTPUT([foo.y], [%defines %verbose],      [],
-		[foo.output foo.tab.c foo.tab.h])
-AT_CHECK_OUTPUT([foo.y], [%defines %verbose %yacc],[],
-		[y.output y.tab.c y.tab.h])
-
-AT_CHECK_OUTPUT([foo.yy], [%defines %verbose %yacc],[],
-		[y.output y.tab.c y.tab.h])
-
-# Exercise %output and %file-prefix
-AT_CHECK_OUTPUT([foo.y], [%file-prefix="bar" %defines %verbose],      [],
-		[bar.output bar.tab.c bar.tab.h])
-AT_CHECK_OUTPUT([foo.y], [%output="bar.c" %defines %verbose %yacc],[],
-		[bar.output bar.c bar.h])
-AT_CHECK_OUTPUT([foo.y],
-		[%file-prefix="baz" %output="bar.c" %defines %verbose %yacc],
-		[],
-		[bar.output bar.c bar.h])
-
-
-# Check priorities of extension control.
-AT_CHECK_OUTPUT([foo.yy], [%defines %verbose], [],
-		[foo.output foo.tab.cc foo.tab.hh])
-
-AT_CHECK_OUTPUT([foo.yy], [%defines %verbose ], [-o foo.c],
-		[foo.c foo.h foo.output])
-
-AT_CHECK_OUTPUT([foo.yy], [],
-		[--defines=foo.hpp -o foo.c++],
-		[foo.c++ foo.hpp])
-
-AT_CHECK_OUTPUT([foo.yy], [],
-		[-o foo.c++ --graph=foo.gph],
-		[foo.c++ foo.gph])
-
-
-## ------------ ##
-## C++ output.  ##
-## ------------ ##
-
-m4_define([AT_CHECK_NO_SUBDIR_PART],
-[# Also make sure that the includes do not refer to the subdirectory.
-AT_CHECK([grep 'include .subdir/' $1.cc], 1, [])
-AT_CHECK([grep 'include .subdir/' $1.hh], 1, [])
-])
-
-AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %defines %verbose], [],
-		[foo.tab.cc foo.tab.hh foo.output location.hh stack.hh position.hh])
-
-AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %defines %verbose], [],
-		[foo.tab.cc foo.tab.hh foo.output location.hh stack.hh position.hh],
-		[], [AT_CHECK_NO_SUBDIR_PART([foo.tab])])
-
-AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %defines %verbose],
-		[-o subdir/foo.cc],
-		[subdir/foo.cc subdir/foo.hh subdir/foo.output subdir/location.hh subdir/stack.hh subdir/position.hh],
-		[], [AT_CHECK_NO_SUBDIR_PART([subdir/foo])])
diff --git a/tests/package.m4 b/tests/package.m4
deleted file mode 100644
index 4c59293..0000000
--- a/tests/package.m4
+++ /dev/null
@@ -1,6 +0,0 @@
-# Signature of the current package.
-m4_define([AT_PACKAGE_NAME],      [GNU Bison])
-m4_define([AT_PACKAGE_TARNAME],   [bison])
-m4_define([AT_PACKAGE_VERSION],   [2.3])
-m4_define([AT_PACKAGE_STRING],    [GNU Bison 2.3])
-m4_define([AT_PACKAGE_BUGREPORT], [bug-bison@gnu.org])
diff --git a/tests/reduce.at b/tests/reduce.at
deleted file mode 100644
index 90b0130..0000000
--- a/tests/reduce.at
+++ /dev/null
@@ -1,355 +0,0 @@
-# Exercising Bison Grammar Reduction.                      -*- Autotest -*-
-# Copyright (C) 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 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.
-
-AT_BANNER([[Grammar Reduction.]])
-
-
-## ------------------- ##
-## Useless Terminals.  ##
-## ------------------- ##
-
-AT_SETUP([Useless Terminals])
-
-AT_DATA([[input.y]],
-[[%verbose
-%output="input.c"
-
-%token useless1
-%token useless2
-%token useless3
-%token useless4
-%token useless5
-%token useless6
-%token useless7
-%token useless8
-%token useless9
-
-%token useful
-%%
-exp: useful;
-]])
-
-AT_CHECK([[bison input.y]])
-
-AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
-[[Terminals which are not used
-   useless1
-   useless2
-   useless3
-   useless4
-   useless5
-   useless6
-   useless7
-   useless8
-   useless9
-]])
-
-AT_CLEANUP
-
-
-
-## ---------------------- ##
-## Useless Nonterminals.  ##
-## ---------------------- ##
-
-AT_SETUP([Useless Nonterminals])
-
-AT_DATA([[input.y]],
-[[%verbose
-%output="input.c"
-
-%nterm useless1
-%nterm useless2
-%nterm useless3
-%nterm useless4
-%nterm useless5
-%nterm useless6
-%nterm useless7
-%nterm useless8
-%nterm useless9
-
-%token useful
-%%
-exp: useful;
-]])
-
-AT_CHECK([[bison input.y]], 0, [],
-[[input.y: warning: 9 useless nonterminals
-input.y:4.8-15: warning: useless nonterminal: useless1
-input.y:5.8-15: warning: useless nonterminal: useless2
-input.y:6.8-15: warning: useless nonterminal: useless3
-input.y:7.8-15: warning: useless nonterminal: useless4
-input.y:8.8-15: warning: useless nonterminal: useless5
-input.y:9.8-15: warning: useless nonterminal: useless6
-input.y:10.8-15: warning: useless nonterminal: useless7
-input.y:11.8-15: warning: useless nonterminal: useless8
-input.y:12.8-15: warning: useless nonterminal: useless9
-]])
-
-AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
-[[Useless nonterminals
-   useless1
-   useless2
-   useless3
-   useless4
-   useless5
-   useless6
-   useless7
-   useless8
-   useless9
-]])
-
-AT_CLEANUP
-
-
-
-## --------------- ##
-## Useless Rules.  ##
-## --------------- ##
-
-AT_SETUP([Useless Rules])
-
-AT_KEYWORDS([report])
-
-AT_DATA([[input.y]],
-[[%verbose
-%output="input.c"
-%token useful
-%%
-exp: useful;
-useless1: '1';
-useless2: '2';
-useless3: '3';
-useless4: '4';
-useless5: '5';
-useless6: '6';
-useless7: '7';
-useless8: '8';
-useless9: '9';
-]])
-
-AT_CHECK([[bison input.y]], 0, [],
-[[input.y: warning: 9 useless nonterminals and 9 useless rules
-input.y:6.1-8: warning: useless nonterminal: useless1
-input.y:7.1-8: warning: useless nonterminal: useless2
-input.y:8.1-8: warning: useless nonterminal: useless3
-input.y:9.1-8: warning: useless nonterminal: useless4
-input.y:10.1-8: warning: useless nonterminal: useless5
-input.y:11.1-8: warning: useless nonterminal: useless6
-input.y:12.1-8: warning: useless nonterminal: useless7
-input.y:13.1-8: warning: useless nonterminal: useless8
-input.y:14.1-8: warning: useless nonterminal: useless9
-input.y:6.11-13: warning: useless rule: useless1: '1'
-input.y:7.11-13: warning: useless rule: useless2: '2'
-input.y:8.11-13: warning: useless rule: useless3: '3'
-input.y:9.11-13: warning: useless rule: useless4: '4'
-input.y:10.11-13: warning: useless rule: useless5: '5'
-input.y:11.11-13: warning: useless rule: useless6: '6'
-input.y:12.11-13: warning: useless rule: useless7: '7'
-input.y:13.11-13: warning: useless rule: useless8: '8'
-input.y:14.11-13: warning: useless rule: useless9: '9'
-]])
-
-AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
-[[Useless nonterminals
-   useless1
-   useless2
-   useless3
-   useless4
-   useless5
-   useless6
-   useless7
-   useless8
-   useless9
-Terminals which are not used
-   '1'
-   '2'
-   '3'
-   '4'
-   '5'
-   '6'
-   '7'
-   '8'
-   '9'
-Useless rules
-    2 useless1: '1'
-    3 useless2: '2'
-    4 useless3: '3'
-    5 useless4: '4'
-    6 useless5: '5'
-    7 useless6: '6'
-    8 useless7: '7'
-    9 useless8: '8'
-   10 useless9: '9'
-]])
-
-AT_CLEANUP
-
-
-
-## ------------------- ##
-## Reduced Automaton.  ##
-## ------------------- ##
-
-# Check that the automaton is that as the for the grammar reduced by
-# hand.
-
-AT_SETUP([Reduced Automaton])
-
-AT_KEYWORDS([report])
-
-# The non reduced grammar.
-# ------------------------
-AT_DATA([[not-reduced.y]],
-[[/* A useless token. */
-%token useless_token
-/* A useful one. */
-%token useful
-%verbose
-%output="not-reduced.c"
-
-%%
-
-exp: useful            { /* A useful action. */ }
-   | non_productive    { /* A non productive action. */ }
-   ;
-
-not_reachable: useful  { /* A not reachable action. */ }
-             ;
-
-non_productive: non_productive useless_token
-                       { /* Another non productive action. */ }
-              ;
-%%
-]])
-
-AT_CHECK([[bison not-reduced.y]], 0, [],
-[[not-reduced.y: warning: 2 useless nonterminals and 3 useless rules
-not-reduced.y:14.1-13: warning: useless nonterminal: not_reachable
-not-reduced.y:11.6-19: warning: useless nonterminal: non_productive
-not-reduced.y:11.6-57: warning: useless rule: exp: non_productive
-not-reduced.y:14.16-56: warning: useless rule: not_reachable: useful
-not-reduced.y:17.17-18.63: warning: useless rule: non_productive: non_productive useless_token
-]])
-
-AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,
-[[Useless nonterminals
-   not_reachable
-   non_productive
-Terminals which are not used
-   useless_token
-Useless rules
-    2 exp: non_productive
-    3 not_reachable: useful
-    4 non_productive: non_productive useless_token
-]])
-
-# The reduced grammar.
-# --------------------
-AT_DATA([[reduced.y]],
-[[/* A useless token. */
-%token useless_token
-/* A useful one. */
-%token useful
-%verbose
-%output="reduced.c"
-
-%%
-
-exp: useful            { /* A useful action. */ }
-//   | non_productive    { /* A non productive action. */ } */
-   ;
-
-//not_reachable: useful  { /* A not reachable action. */ }
-//             ;
-
-//non_productive: non_productive useless_token
-//                       { /* Another non productive action. */ }
-//              ;
-%%
-]])
-
-AT_CHECK([[bison reduced.y]])
-
-# Comparing the parsers.
-cp reduced.c expout
-AT_CHECK([sed 's/not-reduced/reduced/g' not-reduced.c], 0, [expout])
-
-AT_CLEANUP
-
-
-
-## ------------------- ##
-## Underivable Rules.  ##
-## ------------------- ##
-
-AT_SETUP([Underivable Rules])
-
-AT_KEYWORDS([report])
-
-AT_DATA([[input.y]],
-[[%verbose
-%output="input.c"
-%token useful
-%%
-exp: useful | underivable;
-underivable: indirection;
-indirection: underivable;
-]])
-
-AT_CHECK([[bison input.y]], 0, [],
-[[input.y: warning: 2 useless nonterminals and 3 useless rules
-input.y:5.15-25: warning: useless nonterminal: underivable
-input.y:6.14-24: warning: useless nonterminal: indirection
-input.y:5.15-25: warning: useless rule: exp: underivable
-input.y:6.14-24: warning: useless rule: underivable: indirection
-input.y:7.14-24: warning: useless rule: indirection: underivable
-]])
-
-AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,
-[[Useless nonterminals
-   underivable
-   indirection
-Useless rules
-    2 exp: underivable
-    3 underivable: indirection
-    4 indirection: underivable
-]])
-
-AT_CLEANUP
-
-
-
-## ---------------- ##
-## Empty Language.  ##
-## ---------------- ##
-
-AT_SETUP([Empty Language])
-
-AT_DATA([[input.y]],
-[[%output="input.c"
-%%
-exp: exp;
-]])
-
-AT_CHECK([[bison input.y]], 1, [],
-[[input.y: warning: 2 useless nonterminals and 2 useless rules
-input.y:3.1-3: fatal error: start symbol exp does not derive any sentence
-]])
-
-AT_CLEANUP
diff --git a/tests/regression.at b/tests/regression.at
deleted file mode 100644
index 6a37f75..0000000
--- a/tests/regression.at
+++ /dev/null
@@ -1,965 +0,0 @@
-# Bison Regressions.                               -*- Autotest -*-
-
-# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 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.
-
-AT_BANNER([[Regression tests.]])
-
-
-## ------------------ ##
-## Trivial grammars.  ##
-## ------------------ ##
-
-AT_SETUP([Trivial grammars])
-
-AT_DATA_GRAMMAR([input.y],
-[[%{
-void yyerror (char const *);
-int yylex (void);
-#define YYSTYPE int *
-%}
-
-%error-verbose
-
-%%
-
-program: 'x';
-]])
-
-AT_CHECK([bison -o input.c input.y])
-AT_COMPILE([input.o], [-c input.c])
-AT_COMPILE([input.o], [-DYYDEBUG -c input.c])
-
-AT_CLEANUP
-
-
-
-## ------------------------- ##
-## Early token definitions.  ##
-## ------------------------- ##
-
-
-AT_SETUP([Early token definitions])
-
-# Found in GCJ: they expect the tokens to be defined before the user
-# prologue, so that they can use the token definitions in it.
-
-AT_DATA_GRAMMAR([input.y],
-[[%{
-void yyerror (const char *s);
-int yylex (void);
-%}
-
-%union
-{
-  int val;
-};
-%{
-#ifndef MY_TOKEN
-# error "MY_TOKEN not defined."
-#endif
-%}
-%token MY_TOKEN
-%%
-exp: MY_TOKEN;
-%%
-]])
-
-AT_CHECK([bison -o input.c input.y])
-AT_COMPILE([input.o], [-c input.c])
-
-AT_CLEANUP
-
-
-
-## ---------------- ##
-## Braces parsing.  ##
-## ---------------- ##
-
-
-AT_SETUP([Braces parsing])
-
-AT_DATA([input.y],
-[[/* Bison used to swallow the character after `}'. */
-
-%%
-exp: { tests = {{{{{{{{{{}}}}}}}}}}; };
-%%
-]])
-
-AT_CHECK([bison -v -o input.c input.y])
-
-AT_CHECK([grep 'tests = {{{{{{{{{{}}}}}}}}}};' input.c], 0, [ignore])
-
-AT_CLEANUP
-
-
-## ------------------ ##
-## Duplicate string.  ##
-## ------------------ ##
-
-
-AT_SETUP([Duplicate string])
-
-AT_DATA([input.y],
-[[/* `Bison -v' used to dump core when two tokens are defined with the same
-   string, as LE and GE below. */
-
-%token NUM
-%token LE "<="
-%token GE "<="
-
-%%
-exp: '(' exp ')' | NUM ;
-%%
-]])
-
-AT_CHECK([bison -v -o input.c input.y], 0, [],
-[[input.y:6.8-14: warning: symbol `"<="' used more than once as a literal string
-]])
-
-AT_CLEANUP
-
-
-## ------------------- ##
-## Rule Line Numbers.  ##
-## ------------------- ##
-
-AT_SETUP([Rule Line Numbers])
-
-AT_KEYWORDS([report])
-
-AT_DATA([input.y],
-[[%%
-expr:
-'a'
-
-{
-
-}
-
-'b'
-
-{
-
-}
-
-|
-
-
-{
-
-
-}
-
-'c'
-
-{
-
-};
-]])
-
-AT_CHECK([bison -o input.c -v input.y])
-
-# Check the contents of the report.
-AT_CHECK([cat input.output], [],
-[[Grammar
-
-    0 $accept: expr $end
-
-    1 @1: /* empty */
-
-    2 expr: 'a' @1 'b'
-
-    3 @2: /* empty */
-
-    4 expr: @2 'c'
-
-
-Terminals, with rules where they appear
-
-$end (0) 0
-'a' (97) 2
-'b' (98) 2
-'c' (99) 4
-error (256)
-
-
-Nonterminals, with rules where they appear
-
-$accept (6)
-    on left: 0
-expr (7)
-    on left: 2 4, on right: 0
-@1 (8)
-    on left: 1, on right: 2
-@2 (9)
-    on left: 3, on right: 4
-
-
-state 0
-
-    0 $accept: . expr $end
-
-    'a'  shift, and go to state 1
-
-    $default  reduce using rule 3 (@2)
-
-    expr  go to state 2
-    @2    go to state 3
-
-
-state 1
-
-    2 expr: 'a' . @1 'b'
-
-    $default  reduce using rule 1 (@1)
-
-    @1  go to state 4
-
-
-state 2
-
-    0 $accept: expr . $end
-
-    $end  shift, and go to state 5
-
-
-state 3
-
-    4 expr: @2 . 'c'
-
-    'c'  shift, and go to state 6
-
-
-state 4
-
-    2 expr: 'a' @1 . 'b'
-
-    'b'  shift, and go to state 7
-
-
-state 5
-
-    0 $accept: expr $end .
-
-    $default  accept
-
-
-state 6
-
-    4 expr: @2 'c' .
-
-    $default  reduce using rule 4 (expr)
-
-
-state 7
-
-    2 expr: 'a' @1 'b' .
-
-    $default  reduce using rule 2 (expr)
-]])
-
-AT_CLEANUP
-
-
-
-## ---------------------- ##
-## Mixing %token styles.  ##
-## ---------------------- ##
-
-
-AT_SETUP([Mixing %token styles])
-
-# Taken from the documentation.
-AT_DATA([input.y],
-[[%token  <operator>  OR      "||"
-%token  <operator>  LE 134  "<="
-%left  OR  "<="
-%%
-exp: ;
-%%
-]])
-
-AT_CHECK([bison -v -o input.c input.y])
-
-AT_CLEANUP
-
-
-
-## ---------------- ##
-## Invalid inputs.  ##
-## ---------------- ##
-
-
-AT_SETUP([Invalid inputs])
-
-AT_DATA([input.y],
-[[%%
-?
-default: 'a' }
-%&
-%a-does-not-exist
-%-
-%{
-]])
-
-AT_CHECK([bison input.y], [1], [],
-[[input.y:2.1: invalid character: `?'
-input.y:3.14: invalid character: `}'
-input.y:4.1: invalid character: `%'
-input.y:4.2: invalid character: `&'
-input.y:5.1-17: invalid directive: `%a-does-not-exist'
-input.y:6.1: invalid character: `%'
-input.y:6.2: invalid character: `-'
-input.y:7.1-8.0: missing `%}' at end of file
-]])
-
-AT_CLEANUP
-
-
-AT_SETUP([Invalid inputs with {}])
-
-AT_DATA([input.y],
-[[
-%destructor
-%initial-action
-%lex-param
-%parse-param
-%printer
-%union
-]])
-
-AT_CHECK([bison input.y], [1], [],
-[[input.y:3.1: missing `{' in "%destructor {...}"
-input.y:4.1: missing `{' in "%initial-action {...}"
-input.y:4.1: syntax error, unexpected %initial-action {...}, expecting string or identifier
-]])
-
-AT_CLEANUP
-
-
-
-## ------------------- ##
-## Token definitions.  ##
-## ------------------- ##
-
-
-AT_SETUP([Token definitions])
-
-# Bison managed, when fed with `%token 'f' "f"' to #define 'f'!
-AT_DATA_GRAMMAR([input.y],
-[%{
-#include <stdio.h>
-void yyerror (const char *s);
-int yylex (void);
-%}
-[%error-verbose
-%token MYEOF 0 "end of file"
-%token 'a' "a"
-%token B_TOKEN "b"
-%token C_TOKEN 'c'
-%token 'd' D_TOKEN
-%token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
-%%
-exp: "a" "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!";
-%%
-void
-yyerror (char const *s)
-{
-  fprintf (stderr, "%s\n", s);
-}
-
-int
-yylex (void)
-{
-  return SPECIAL;
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-]])
-
-AT_CHECK([bison -o input.c input.y])
-AT_COMPILE([input])
-AT_DATA([experr],
-[[syntax error, unexpected "\\'?\"\a\b\f\n\r\t\v\001\201\001\201?\?!", expecting a
-]])
-AT_PARSER_CHECK([./input], 1, [], [experr])
-AT_CLEANUP
-
-
-
-## -------------------- ##
-## Characters Escapes.  ##
-## -------------------- ##
-
-
-AT_SETUP([Characters Escapes])
-
-AT_DATA_GRAMMAR([input.y],
-[%{
-void yyerror (const char *s);
-int yylex (void);
-%}
-[%%
-exp:
-  '\'' "\'"
-| '\"' "\""
-| '"'  "'"
-;
-]])
-# Pacify font-lock-mode: "
-
-AT_CHECK([bison -o input.c input.y])
-AT_COMPILE([input.o], [-c input.c])
-AT_CLEANUP
-
-
-
-## -------------- ##
-## Web2c Report.  ##
-## -------------- ##
-
-# The generation of the reduction was once wrong in Bison, and made it
-# miss some reductions.  In the following test case, the reduction on
-# `undef_id_tok' in state 1 was missing.  This is stripped down from
-# the actual web2c.y.
-
-AT_SETUP([Web2c Report])
-
-AT_KEYWORDS([report])
-
-AT_DATA([input.y],
-[[%token	undef_id_tok const_id_tok
-
-%start CONST_DEC_PART
-
-%%
-CONST_DEC_PART:
-         CONST_DEC_LIST
-        ;
-
-CONST_DEC_LIST:
-	  CONST_DEC
-        | CONST_DEC_LIST CONST_DEC
-        ;
-
-CONST_DEC:
-	  { } undef_id_tok '=' const_id_tok ';'
-        ;
-%%
-]])
-
-AT_CHECK([bison -v input.y])
-AT_CHECK([cat input.output], 0,
-[[Grammar
-
-    0 $accept: CONST_DEC_PART $end
-
-    1 CONST_DEC_PART: CONST_DEC_LIST
-
-    2 CONST_DEC_LIST: CONST_DEC
-    3               | CONST_DEC_LIST CONST_DEC
-
-    4 @1: /* empty */
-
-    5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';'
-
-
-Terminals, with rules where they appear
-
-$end (0) 0
-';' (59) 5
-'=' (61) 5
-error (256)
-undef_id_tok (258) 5
-const_id_tok (259) 5
-
-
-Nonterminals, with rules where they appear
-
-$accept (7)
-    on left: 0
-CONST_DEC_PART (8)
-    on left: 1, on right: 0
-CONST_DEC_LIST (9)
-    on left: 2 3, on right: 1 3
-CONST_DEC (10)
-    on left: 5, on right: 2 3
-@1 (11)
-    on left: 4, on right: 5
-
-
-state 0
-
-    0 $accept: . CONST_DEC_PART $end
-
-    $default  reduce using rule 4 (@1)
-
-    CONST_DEC_PART  go to state 1
-    CONST_DEC_LIST  go to state 2
-    CONST_DEC       go to state 3
-    @1              go to state 4
-
-
-state 1
-
-    0 $accept: CONST_DEC_PART . $end
-
-    $end  shift, and go to state 5
-
-
-state 2
-
-    1 CONST_DEC_PART: CONST_DEC_LIST .
-    3 CONST_DEC_LIST: CONST_DEC_LIST . CONST_DEC
-
-    undef_id_tok  reduce using rule 4 (@1)
-    $default      reduce using rule 1 (CONST_DEC_PART)
-
-    CONST_DEC  go to state 6
-    @1         go to state 4
-
-
-state 3
-
-    2 CONST_DEC_LIST: CONST_DEC .
-
-    $default  reduce using rule 2 (CONST_DEC_LIST)
-
-
-state 4
-
-    5 CONST_DEC: @1 . undef_id_tok '=' const_id_tok ';'
-
-    undef_id_tok  shift, and go to state 7
-
-
-state 5
-
-    0 $accept: CONST_DEC_PART $end .
-
-    $default  accept
-
-
-state 6
-
-    3 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC .
-
-    $default  reduce using rule 3 (CONST_DEC_LIST)
-
-
-state 7
-
-    5 CONST_DEC: @1 undef_id_tok . '=' const_id_tok ';'
-
-    '='  shift, and go to state 8
-
-
-state 8
-
-    5 CONST_DEC: @1 undef_id_tok '=' . const_id_tok ';'
-
-    const_id_tok  shift, and go to state 9
-
-
-state 9
-
-    5 CONST_DEC: @1 undef_id_tok '=' const_id_tok . ';'
-
-    ';'  shift, and go to state 10
-
-
-state 10
-
-    5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';' .
-
-    $default  reduce using rule 5 (CONST_DEC)
-]])
-
-AT_CLEANUP
-
-
-## --------------- ##
-## Web2c Actions.  ##
-## --------------- ##
-
-# The generation of the mapping `state -> action' was once wrong in
-# extremely specific situations.  web2c.y exhibits this situation.
-# Below is a stripped version of the grammar.  It looks like one can
-# simplify it further, but just don't: it is tuned to exhibit a bug,
-# which disapears when applying sane grammar transformations.
-#
-# It used to be wrong on yydefact only:
-#
-# static const yytype_uint8 yydefact[] =
-#  {
-# -       2,     0,     1,     0,     0,     2,     3,     2,     5,     4,
-# +       2,     0,     1,     0,     0,     0,     3,     2,     5,     4,
-#         0,     0
-#  };
-#
-# but let's check all the tables.
-
-
-AT_SETUP([Web2c Actions])
-
-AT_KEYWORDS([report])
-
-AT_DATA([input.y],
-[[%%
-statement:  struct_stat;
-struct_stat:  /* empty. */ | if else;
-if: "if" "const" "then" statement;
-else: "else" statement;
-%%
-]])
-
-AT_CHECK([bison -v -o input.c input.y])
-
-# Check only the tables.  We don't use --no-parser, because it is
-# still to be implemented in the experimental branch of Bison.
-[sed -n 's/  *$//;/^static const.*\[\] =/,/^}/p' input.c >tables.c]
-
-AT_CHECK([[cat tables.c]], 0,
-[[static const yytype_uint8 yytranslate[] =
-{
-       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
-       5,     6
-};
-static const yytype_uint8 yyprhs[] =
-{
-       0,     0,     3,     5,     6,     9,    14
-};
-static const yytype_int8 yyrhs[] =
-{
-       8,     0,    -1,     9,    -1,    -1,    10,    11,    -1,     3,
-       4,     5,     8,    -1,     6,     8,    -1
-};
-static const yytype_uint8 yyrline[] =
-{
-       0,     2,     2,     3,     3,     4,     5
-};
-static const char *const yytname[] =
-{
-  "$end", "error", "$undefined", "\"if\"", "\"const\"", "\"then\"",
-  "\"else\"", "$accept", "statement", "struct_stat", "if", "else", 0
-};
-static const yytype_uint16 yytoknum[] =
-{
-       0,   256,   257,   258,   259,   260,   261
-};
-static const yytype_uint8 yyr1[] =
-{
-       0,     7,     8,     9,     9,    10,    11
-};
-static const yytype_uint8 yyr2[] =
-{
-       0,     2,     1,     0,     2,     4,     2
-};
-static const yytype_uint8 yydefact[] =
-{
-       3,     0,     0,     2,     0,     0,     1,     3,     4,     3,
-       6,     5
-};
-static const yytype_int8 yydefgoto[] =
-{
-      -1,     2,     3,     4,     8
-};
-static const yytype_int8 yypact[] =
-{
-      -2,    -1,     4,    -8,     0,     2,    -8,    -2,    -8,    -2,
-      -8,    -8
-};
-static const yytype_int8 yypgoto[] =
-{
-      -8,    -7,    -8,    -8,    -8
-};
-static const yytype_uint8 yytable[] =
-{
-      10,     1,    11,     5,     6,     0,     7,     9
-};
-static const yytype_int8 yycheck[] =
-{
-       7,     3,     9,     4,     0,    -1,     6,     5
-};
-static const yytype_uint8 yystos[] =
-{
-       0,     3,     8,     9,    10,     4,     0,     6,    11,     5,
-       8,     8
-};
-]])
-
-AT_CLEANUP
-
-
-## ------------------------- ##
-## yycheck Bound Violation.  ##
-## ------------------------- ##
-
-
-# _AT_DATA_DANCER_Y(BISON-OPTIONS)
-# --------------------------------
-# The following grammar, taken from Andrew Suffield's GPL'd implementation
-# of DGMTP, the Dancer Generic Message Transport Protocol, used to violate
-# yycheck's bounds where issuing a verbose error message.  Keep this test
-# so that possible bound checking compilers could check all the skeletons.
-m4_define([_AT_DATA_DANCER_Y],
-[AT_DATA_GRAMMAR([dancer.y],
-[%{
-static int yylex (AT_LALR1_CC_IF([int *], [void]));
-AT_LALR1_CC_IF([],
-[#include <stdio.h>
-static void yyerror (const char *);])
-%}
-$1
-%token ARROW INVALID NUMBER STRING DATA
-%defines
-%verbose
-%error-verbose
-/* Grammar follows */
-%%
-line: header body
-   ;
-
-header: '<' from ARROW to '>' type ':'
-   | '<' ARROW to '>' type ':'
-   | ARROW to type ':'
-   | type ':'
-   | '<' '>'
-   ;
-
-from: DATA
-   | STRING
-   | INVALID
-   ;
-
-to: DATA
-   | STRING
-   | INVALID
-   ;
-
-type: DATA
-   | STRING
-   | INVALID
-   ;
-
-body: /* empty */
-   | body member
-   ;
-
-member: STRING
-   | DATA
-   | '+' NUMBER
-   | '-' NUMBER
-   | NUMBER
-   | INVALID
-   ;
-%%
-AT_LALR1_CC_IF(
-[/* A C++ error reporting function. */
-void
-yy::parser::error (const location&, const std::string& m)
-{
-  std::cerr << m << std::endl;
-}
-
-int
-yyparse ()
-{
-  yy::parser parser;
-  parser.set_debug_level (!!YYDEBUG);
-  return parser.parse ();
-}
-],
-[static void
-yyerror (const char *s)
-{
-  fprintf (stderr, "%s\n", s);
-}])
-
-static int
-yylex (AT_LALR1_CC_IF([int *lval], [void]))
-[{
-  static int toknum = 0;
-  static int tokens[] =
-    {
-      ':', -1
-    };
-  ]AT_LALR1_CC_IF([*lval = 0; /* Pacify GCC.  */])[
-  return tokens[toknum++];
-}]
-
-int
-main (void)
-{
-  return yyparse ();
-}
-])
-])# _AT_DATA_DANCER_Y
-
-
-# AT_CHECK_DANCER(BISON-OPTIONS)
-# ------------------------------
-# Generate the grammar, compile it, run it.
-m4_define([AT_CHECK_DANCER],
-[AT_SETUP([Dancer $1])
-AT_BISON_OPTION_PUSHDEFS([$1])
-_AT_DATA_DANCER_Y([$1])
-AT_CHECK([bison -o dancer.c dancer.y])
-AT_LALR1_CC_IF(
-  [AT_CHECK([bison -o dancer.cc dancer.y])
-   AT_COMPILE_CXX([dancer])],
-  [AT_CHECK([bison -o dancer.c dancer.y])
-   AT_COMPILE([dancer])])
-AT_PARSER_CHECK([./dancer], 1, [],
-[syntax error, unexpected ':'
-])
-AT_BISON_OPTION_POPDEFS
-AT_CLEANUP
-])
-
-AT_CHECK_DANCER()
-AT_CHECK_DANCER([%glr-parser])
-AT_CHECK_DANCER([%skeleton "lalr1.cc"])
-
-
-## ------------------------------------------ ##
-## Diagnostic that expects two alternatives.  ##
-## ------------------------------------------ ##
-
-
-# _AT_DATA_EXPECT2_Y(BISON-OPTIONS)
-# --------------------------------
-m4_define([_AT_DATA_EXPECT2_Y],
-[AT_DATA_GRAMMAR([expect2.y],
-[%{
-static int yylex (AT_LALR1_CC_IF([int *], [void]));
-AT_LALR1_CC_IF([],
-[#include <stdio.h>
-static void yyerror (const char *);])
-%}
-$1
-%defines
-%error-verbose
-%token A 1000
-%token B
-
-%%
-program: /* empty */
- | program e ';'
- | program error ';';
-
-e: e '+' t | t;
-t: A | B;
-
-%%
-AT_LALR1_CC_IF(
-[/* A C++ error reporting function. */
-void
-yy::parser::error (const location&, const std::string& m)
-{
-  std::cerr << m << std::endl;
-}
-
-int
-yyparse ()
-{
-  yy::parser parser;
-  return parser.parse ();
-}
-],
-[static void
-yyerror (const char *s)
-{
-  fprintf (stderr, "%s\n", s);
-}])
-
-static int
-yylex (AT_LALR1_CC_IF([int *lval], [void]))
-[{
-  static int toknum = 0;
-  static int tokens[] =
-    {
-      1000, '+', '+', -1
-    };
-  ]AT_LALR1_CC_IF([*lval = 0; /* Pacify GCC.  */])[
-  return tokens[toknum++];
-}]
-
-int
-main (void)
-{
-  return yyparse ();
-}
-])
-])# _AT_DATA_EXPECT2_Y
-
-
-# AT_CHECK_EXPECT2(BISON-OPTIONS)
-# ------------------------------
-# Generate the grammar, compile it, run it.
-m4_define([AT_CHECK_EXPECT2],
-[AT_SETUP([Expecting two tokens $1])
-AT_BISON_OPTION_PUSHDEFS([$1])
-_AT_DATA_EXPECT2_Y([$1])
-AT_CHECK([bison -o expect2.c expect2.y])
-AT_LALR1_CC_IF(
-  [AT_CHECK([bison -o expect2.cc expect2.y])
-   AT_COMPILE_CXX([expect2])],
-  [AT_CHECK([bison -o expect2.c expect2.y])
-   AT_COMPILE([expect2])])
-AT_PARSER_CHECK([./expect2], 1, [],
-[syntax error, unexpected '+', expecting A or B
-])
-AT_BISON_OPTION_POPDEFS
-AT_CLEANUP
-])
-
-AT_CHECK_EXPECT2()
-AT_CHECK_EXPECT2([%glr-parser])
-AT_CHECK_EXPECT2([%skeleton "lalr1.cc"])
diff --git a/tests/sets.at b/tests/sets.at
deleted file mode 100644
index a731315..0000000
--- a/tests/sets.at
+++ /dev/null
@@ -1,302 +0,0 @@
-# Exercising Bison Grammar Sets.                      -*- Autotest -*-
-# Copyright (C) 2001, 2002, 2005 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.
-
-
-# AT_EXTRACT_SETS(INPUT, OUTPUT)
-# ------------------------------
-# Extract the information about the grammar sets from a bison
-# trace output (INPUT), and save it in OUTPUT.
-# And remember, there is no alternation in portable sed.
-m4_define([AT_EXTRACT_SETS],
-[AT_DATA([extract.sed],
-[[#n
-/^NULLABLE$/ {
-   :null
-   p
-   n
-   /^[	 ]*$/ !b null
-}
-/^FIRSTS$/ {
-   :firsts
-   p
-   n
-   /^[	 ]*$/ !b firsts
-}
-/^FDERIVES$/ {
-   :fderiv
-   p
-   n
-   /^[	 ]*$/ !b fderiv
-}
-/^DERIVES$/ {
-   :deriv
-   p
-   n
-   /^[	 ]*$/ !b deriv
-}
-]])
-AT_CHECK([sed -f extract.sed $1], 0, [stdout])
-AT_CHECK([mv stdout $2])
-])
-
-
-
-AT_BANNER([[Grammar Sets (Firsts etc.).]])
-
-
-## ---------- ##
-## Nullable.  ##
-## ---------- ##
-
-AT_SETUP([Nullable])
-
-# At some point, nullable had been smoking grass, and managed to say:
-#
-# Entering set_nullable
-# NULLABLE
-#         'e': yes
-#         (null): no
-# ...
-
-AT_DATA([[input.y]],
-[[%%
-e: 'e' | /* Nothing */;
-]])
-
-AT_CHECK([[bison --trace=sets input.y]], [], [], [stderr])
-AT_EXTRACT_SETS([stderr], [sets])
-AT_CHECK([[cat sets]], [],
-[[DERIVES
-	$accept derives
-		  0  e $end
-	e derives
-		  1  'e'
-		  2  /* empty */
-NULLABLE
-	$accept: no
-	e: yes
-FIRSTS
-	$accept firsts
-		$accept
-		e
-	e firsts
-		e
-FDERIVES
-	$accept derives
-		  0  e $end
-		  1  'e'
-		  2  /* empty */
-	e derives
-		  1  'e'
-		  2  /* empty */
-]])
-
-AT_CLEANUP
-
-
-## ---------------- ##
-## Broken Closure.  ##
-## ---------------- ##
-
-# TC was once broken during a massive `simplification' of the code.
-# It resulted in bison dumping core on the following grammar (the
-# computation of FIRSTS uses TC).  It managed to produce a pretty
-# exotic closure:
-#
-# TC: Input
-#
-#    01234567
-#   +--------+
-#  0| 1      |
-#  1|  1     |
-#  2|   1    |
-#  3|    1   |
-#  4|     1  |
-#  5|      1 |
-#  6|       1|
-#  7|        |
-#   +--------+
-#
-# TC: Output
-#
-#    01234567
-#   +--------+
-#  0| 1      |
-#  1| 111    |
-#  2| 111    |
-#  3| 1111   |
-#  4| 111 1  |
-#  5| 111  1 |
-#  6| 111   1|
-#  7| 111    |
-#   +--------+
-#
-# instead of that below.
-
-AT_SETUP([Broken Closure])
-
-AT_DATA([input.y],
-[[%%
-a: b;
-b: c;
-c: d;
-d: e;
-e: f;
-f: g;
-g: h;
-h: 'h';
-]])
-
-AT_CHECK([[bison --trace=sets input.y]], [], [], [stderr])
-
-AT_CHECK([[sed -n 's/[	 ]*$//;/^RTC: Firsts Output BEGIN/,/^RTC: Firsts Output END/p' stderr]], [],
-[[RTC: Firsts Output BEGIN
-
-   012345678
-  .---------.
- 0|111111111|
- 1| 11111111|
- 2|  1111111|
- 3|   111111|
- 4|    11111|
- 5|     1111|
- 6|      111|
- 7|       11|
- 8|        1|
-  `---------'
-RTC: Firsts Output END
-]])
-
-AT_CLEANUP
-
-
-
-## -------- ##
-## Firsts.  ##
-## -------- ##
-
-AT_SETUP([Firsts])
-
-AT_DATA([input.y],
-[[%nonassoc '<' '>'
-%left '+' '-'
-%right '^' '='
-%%
-exp:
-   exp '<' exp
- | exp '>' exp
- | exp '+' exp
- | exp '-' exp
- | exp '^' exp
- | exp '=' exp
- | "exp"
- ;
-]])
-
-AT_CHECK([[bison --trace=sets input.y]], [], [], [stderr])
-AT_EXTRACT_SETS([stderr], [sets])
-AT_CHECK([[cat sets]], [],
-[[DERIVES
-	$accept derives
-		  0  exp $end
-	exp derives
-		  1  exp '<' exp
-		  2  exp '>' exp
-		  3  exp '+' exp
-		  4  exp '-' exp
-		  5  exp '^' exp
-		  6  exp '=' exp
-		  7  "exp"
-NULLABLE
-	$accept: no
-	exp: no
-FIRSTS
-	$accept firsts
-		$accept
-		exp
-	exp firsts
-		exp
-FDERIVES
-	$accept derives
-		  0  exp $end
-		  1  exp '<' exp
-		  2  exp '>' exp
-		  3  exp '+' exp
-		  4  exp '-' exp
-		  5  exp '^' exp
-		  6  exp '=' exp
-		  7  "exp"
-	exp derives
-		  1  exp '<' exp
-		  2  exp '>' exp
-		  3  exp '+' exp
-		  4  exp '-' exp
-		  5  exp '^' exp
-		  6  exp '=' exp
-		  7  "exp"
-]])
-
-AT_CLEANUP
-
-
-
-
-## -------- ##
-## Accept.  ##
-## -------- ##
-
-# In some weird cases Bison could compute an incorrect final state
-# number.  This happens only if the $end token is used in the user
-# grammar, which is a very suspicious accidental feature introduced as
-# a side effect of allowing the user to name $end using `%token END 0
-# "end of file"'.
-
-AT_SETUP([Accept])
-
-AT_DATA([input.y],
-[[%token END 0
-%%
-input:
-  'a'
-| '(' input ')'
-| '(' error END
-;
-]])
-
-AT_CHECK([[bison -v -o input.c input.y]])
-
-# Get the final state in the parser.
-AT_CHECK([[sed -n 's/.*define YYFINAL *\([0-9][0-9]*\)/final state \1/p' input.c]],
-         0, [stdout])
-mv stdout expout
-
-# Get the final state in the report, from the "accept" action..
-AT_CHECK([sed -n '
-           /^state \(.*\)/{
-	     s//final state \1/
-	     x
-	   }
-	   / accept/{
-	     x
-	     p
-	     q
-	   }
-	' input.output],
-	0, [expout])
-
-AT_CLEANUP
diff --git a/tests/synclines.at b/tests/synclines.at
deleted file mode 100644
index 5ecbdb3..0000000
--- a/tests/synclines.at
+++ /dev/null
@@ -1,175 +0,0 @@
-# Executing Actions.                               -*- Autotest -*-
-# Copyright (C) 2002, 2004, 2005 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.
-
-AT_BANNER([[User Actions.]])
-
-
-# AT_SYNCLINES_COMPILE(FILE)
-# --------------------------
-# Compile FILE expecting an error, and save in the file stdout the
-# normalized output.  Ignore the exit status, since some compilers
-# (e.g. c89 on IRIX 6.5) triger warnings on `#error', instead of
-# errors.
-m4_define([AT_SYNCLINES_COMPILE],
-[AT_CHECK([$CC $CFLAGS $CPPFLAGS -c $1], [ignore], [], [stderr])
-# In case GCC displays column information, strip it down.
-#
-#   input.y:4:2: #error "4"    or
-#   input.y:4.2: #error "4"    or
-#   input.y:4:2: error: #error "4"
-# =>
-#   input.y:4: #error "4"
-#
-AT_CHECK([[sed -e 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' -e 's/^\([^:]*:[^:]*:\)[^@%:@]*\( @%:@error\)/\1\2/' stderr]], 0, [stdout])
-])
-
-# AT_TEST_SYNCLINE(TITLE, INPUT, ERROR-MSG)
-# -----------------------------------------
-# Check that compiling the parser produced from INPUT cause GCC
-# to issue ERROR-MSG.
-m4_define([AT_TEST_SYNCLINE],
-[AT_SETUP([$1])
-
-# It seems impossible to find a generic scheme to check the location
-# of an error.  Even requiring GCC is not sufficient, since for instance
-# the version modified by Apple:
-#
-# | Reading specs from /usr/libexec/gcc/darwin/ppc/2.95.2/specs
-# | Apple Computer, Inc. version gcc-934.3, based on gcc version 2.95.2
-# | 19991024 (release) configure:2124: $? = 0
-#
-# instead of:
-#
-# | input.y:2: #error "2"
-#
-# it reports:
-#
-# | input.y:2: "2"
-# | cpp-precomp: warning: errors during smart preprocessing, retrying in basic mode
-
-AT_DATA([syncline.c],
-[[#error "1"
-]])
-
-AT_SYNCLINES_COMPILE([syncline.c])
-AT_CHECK([[test "`cat stdout`" = 'syncline.c:1: @%:@error "1"' || exit 77]])
-
-AT_DATA([[input.y]], [$2])
-AT_CHECK([bison -o input.c input.y])
-AT_SYNCLINES_COMPILE([input.c])
-AT_CHECK([cat stdout], 0, [$3])
-AT_CLEANUP
-])
-
-
-## --------------------- ##
-## Prologue synch line.  ##
-## --------------------- ##
-
-
-AT_TEST_SYNCLINE([Prologue synch line],
-[[%{
-#error "2"
-void yyerror (const char *s);
-int yylex (void);
-%}
-%%
-exp: '0';
-]],
-[input.y:2: #error "2"
-])
-
-
-## ------------------- ##
-## %union synch line.  ##
-## ------------------- ##
-
-AT_TEST_SYNCLINE([%union synch line],
-[[%union {
-#error "2"
-  char dummy;
-}
-%{
-void yyerror (const char *s);
-int yylex (void);
-%}
-%%
-exp: '0';
-]],
-[input.y:2: #error "2"
-])
-
-
-## ------------------------- ##
-## Postprologue synch line.  ##
-## ------------------------- ##
-
-AT_TEST_SYNCLINE([Postprologue synch line],
-[[%{
-void yyerror (const char *s);
-int yylex (void);
-%}
-%union
-{
-  int ival;
-}
-%{
-#error "10"
-%}
-%%
-exp: '0';
-]],
-[input.y:10: #error "10"
-])
-
-
-## ------------------- ##
-## Action synch line.  ##
-## ------------------- ##
-
-AT_TEST_SYNCLINE([Action synch line],
-[[%{
-void yyerror (const char *s);
-int yylex (void);
-%}
-%%
-exp:
-{
-#error "8"
-};
-]],
-[input.y:8: #error "8"
-])
-
-
-## --------------------- ##
-## Epilogue synch line.  ##
-## --------------------- ##
-
-AT_TEST_SYNCLINE([Epilogue synch line],
-[[%{
-void yyerror (const char *s);
-int yylex (void);
-%}
-%%
-exp: '0';
-%%
-#error "8"
-]],
-[input.y:8: #error "8"
-])
diff --git a/tests/testsuite b/tests/testsuite
deleted file mode 100755
index d429345..0000000
--- a/tests/testsuite
+++ /dev/null
@@ -1,67531 +0,0 @@
-#! /bin/sh
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
-
-
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
-    sed '
-      N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
-      t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
-    ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
-   { (exit 1); exit 1; }; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
-  # Exit status is that of the last command.
-  exit
-}
-
-
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
-    as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-as_executable_p="test -f"
-
-# 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'"
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
-
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-# How were we run?
-at_cli_args="$@"
-
-# Load the config file.
-for at_file in atconfig atlocal
-do
-  test -r $at_file || continue
-  . ./$at_file || { echo "$as_me: error: invalid content: $at_file" >&2
-   { (exit 1); exit 1; }; }
-done
-
-# atconfig delivers paths relative to the directory the test suite is
-# in, but the groups themselves are run in testsuite-dir/group-dir.
-if test -n "$at_top_srcdir"; then
-  builddir=../..
-  for at_dir in srcdir top_srcdir top_builddir
-  do
-    at_val=`eval echo '${'at_$at_dir'}'`
-    eval "$at_dir=\$at_val/../.."
-  done
-fi
-
-# Not all shells have the 'times' builtin; the subshell is needed to make
-# sure we discard the 'times: not found' message from the shell.
-at_times_p=false
-(times) >/dev/null 2>&1 && at_times_p=:
-
-# CLI Arguments to pass to the debugging scripts.
-at_debug_args=
-# -e sets to true
-at_errexit_p=false
-# Shall we be verbose?
-at_verbose=:
-at_quiet=echo
-
-# Shall we keep the debug scripts?  Must be `:' when the suite is
-# run by a debug script, so that the script doesn't remove itself.
-at_debug_p=false
-# Display help message?
-at_help_p=false
-# List test groups?
-at_list_p=false
-# Test groups to run
-at_groups=
-
-# The directory we are in.
-at_dir=`pwd`
-# The directory the whole suite works in.
-# Should be absolutely to let the user `cd' at will.
-at_suite_dir=$at_dir/$as_me.dir
-# The file containing the suite.
-at_suite_log=$at_dir/$as_me.log
-# The file containing the location of the last AT_CHECK.
-at_check_line_file=$at_suite_dir/at-check-line
-# The file containing the exit status of the last command.
-at_status_file=$at_suite_dir/at-status
-# The files containing the output of the tested commands.
-at_stdout=$at_suite_dir/at-stdout
-at_stder1=$at_suite_dir/at-stder1
-at_stderr=$at_suite_dir/at-stderr
-# The file containing dates.
-at_times_file=$at_suite_dir/at-times
-
-# List of the tested programs.
-at_tested='bison'
-# List of the all the test groups.
-at_groups_all=' banner-1 1 2 3 4 5 6 7 8 9 10 banner-2 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 banner-3 31 32 33 34 banner-4 35 36 37 38 39 40 banner-5 41 42 43 44 45 banner-6 46 47 48 49 banner-7 50 51 52 53 54 55 56 57 banner-8 58 59 60 61 62 63 64 65 66 67 68 69 banner-9 70 71 72 73 74 75 76 77 78 79 80 81 82 83 banner-10 84 85 86 87 88 89 90 91 92 93 94 95 96 97 banner-11 98 99 100 101 102 banner-12 103 104 banner-13 105 106 107 108 109 banner-14 110 111 112 banner-15 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 banner-16 131 132 banner-17 133 134 135 136 137 138 139 140 141 banner-18 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158'
-# As many dots as there are digits in the last test group number.
-# Used to normalize the test group numbers so that `ls' lists them in
-# numerical order.
-at_format='...'
-# Description of all the test groups.
-at_help_all='1;input.at:28;Invalid dollar-n;;
-2;input.at:46;Invalid @n;;
-3;input.at:64;Type Clashes;;
-4;input.at:89;Unused values;;
-5;input.at:157;Incompatible Aliases;;
-6;input.at:198;Torturing the Scanner;;
-7;input.at:357;Typed symbol aliases;;
-8;input.at:393;Require 1.0;;
-9;input.at:394;Require 2.3;;
-10;input.at:396;Require 100.0;;
-11;output.at:43;Output files:  -dv ;;
-12;output.at:46;Output files:  -dv >&-;;
-13;output.at:48;Output files:  -dv -o foo.c ;;
-14;output.at:50;Output files:  -dv -o foo.tab.c ;;
-15;output.at:52;Output files:  -dv -y ;;
-16;output.at:54;Output files:  -dv -b bar ;;
-17;output.at:56;Output files:  -dv -g -o foo.c ;;
-18;output.at:60;Output files: %defines %verbose  ;;
-19;output.at:62;Output files: %defines %verbose %yacc  ;;
-20;output.at:65;Output files: %defines %verbose %yacc  ;;
-21;output.at:69;Output files: %file-prefix="bar" %defines %verbose  ;;
-22;output.at:71;Output files: %output="bar.c" %defines %verbose %yacc  ;;
-23;output.at:75;Output files: %file-prefix="baz" %output="bar.c" %defines %verbose %yacc  ;;
-24;output.at:80;Output files: %defines %verbose  ;;
-25;output.at:83;Output files: %defines %verbose  -o foo.c ;;
-26;output.at:87;Output files:  --defines=foo.hpp -o foo.c++ ;;
-27;output.at:91;Output files:  -o foo.c++ --graph=foo.gph ;;
-28;output.at:105;Output files: %skeleton "lalr1.cc" %defines %verbose  ;;
-29;output.at:109;Output files: %skeleton "lalr1.cc" %defines %verbose  ;;
-30;output.at:114;Output files: %skeleton "lalr1.cc" %defines %verbose -o subdir/foo.cc ;;
-31;sets.at:66;Nullable;;
-32;sets.at:151;Broken Closure;;
-33;sets.at:193;Firsts;;
-34;sets.at:269;Accept;;
-35;reduce.at:26;Useless Terminals;;
-36;reduce.at:70;Useless Nonterminals;;
-37;reduce.at:125;Useless Rules;report;
-38;reduce.at:212;Reduced Automaton;report;
-39;reduce.at:301;Underivable Rules;report;
-40;reduce.at:342;Empty Language;;
-41;synclines.at:95;Prologue synch line;;
-42;synclines.at:115;%union synch line;;
-43;synclines.at:138;Postprologue synch line;;
-44;synclines.at:157;Action synch line;;
-45;synclines.at:175;Epilogue synch line;;
-46;headers.at:27;%union and --defines;;
-47;headers.at:77;Invalid CPP guards: input/input;;
-48;headers.at:78;Invalid CPP guards: 9foo;;
-49;headers.at:87;export YYLTYPE;;
-50;actions.at:25;Mid-rule actions;;
-51;actions.at:91;Exotic Dollars;;
-52;actions.at:527;Printers and Destructors : ;;
-53;actions.at:528;Printers and Destructors with union: ;;
-54;actions.at:533;Printers and Destructors : %defines %skeleton "lalr1.cc";c++;
-55;actions.at:534;Printers and Destructors with union: %defines %skeleton "lalr1.cc";c++;
-56;actions.at:536;Printers and Destructors : %glr-parser;;
-57;actions.at:537;Printers and Destructors with union: %glr-parser;;
-58;conflicts.at:32;S/R in initial;;
-59;conflicts.at:52;%nonassoc and eof;;
-60;conflicts.at:128;Unresolved SR Conflicts;report;
-61;conflicts.at:235;Resolved SR Conflicts;report;
-62;conflicts.at:357;Defaulted Conflicted Reduction;report;
-63;conflicts.at:476;%expect not enough;;
-64;conflicts.at:496;%expect right;;
-65;conflicts.at:513;%expect too much;;
-66;conflicts.at:533;%expect with reduce conflicts;;
-67;conflicts.at:553;%no-default-prec without %prec;;
-68;conflicts.at:579;%no-default-prec with %prec;;
-69;conflicts.at:603;%default-prec;;
-70;calc.at:550;Calculator ;;
-71;calc.at:552;Calculator %defines;;
-72;calc.at:553;Calculator %locations;;
-73;calc.at:554;Calculator %name-prefix="calc";;
-74;calc.at:555;Calculator %verbose;;
-75;calc.at:556;Calculator %yacc;;
-76;calc.at:557;Calculator %error-verbose;;
-77;calc.at:559;Calculator %pure-parser %locations;;
-78;calc.at:560;Calculator %error-verbose %locations;;
-79;calc.at:562;Calculator %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc;;
-80;calc.at:564;Calculator %debug;;
-81;calc.at:565;Calculator %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc;;
-82;calc.at:567;Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc;;
-83;calc.at:569;Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count};;
-84;calc.at:586;Calculator %glr-parser ;;
-85;calc.at:588;Calculator %glr-parser %defines;;
-86;calc.at:589;Calculator %glr-parser %locations;;
-87;calc.at:590;Calculator %glr-parser %name-prefix="calc";;
-88;calc.at:591;Calculator %glr-parser %verbose;;
-89;calc.at:592;Calculator %glr-parser %yacc;;
-90;calc.at:593;Calculator %glr-parser %error-verbose;;
-91;calc.at:595;Calculator %glr-parser %pure-parser %locations;;
-92;calc.at:596;Calculator %glr-parser %error-verbose %locations;;
-93;calc.at:598;Calculator %glr-parser %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc;;
-94;calc.at:600;Calculator %glr-parser %debug;;
-95;calc.at:601;Calculator %glr-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc;;
-96;calc.at:603;Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc;;
-97;calc.at:605;Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count};;
-98;calc.at:621;Calculator %skeleton "lalr1.cc" %defines %locations ;c++;
-99;calc.at:622;Calculator %skeleton "lalr1.cc" %defines %locations %error-verbose %name-prefix="calc" %verbose %yacc;c++;
-100;calc.at:624;Calculator %skeleton "lalr1.cc" %defines %locations %error-verbose %debug %name-prefix="calc" %verbose %yacc;c++;
-101;calc.at:626;Calculator %skeleton "lalr1.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc;c++;
-102;calc.at:628;Calculator %skeleton "lalr1.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count};c++;
-103;calc.at:651;Calculator %skeleton "glr.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc;c++;
-104;calc.at:653;Calculator %skeleton "glr.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count};c++;
-105;torture.at:140;Big triangle;;
-106;torture.at:232;Big horizontal;;
-107;torture.at:368;Many look-ahead tokens;;
-108;torture.at:445;Exploding the Stack Size with Alloca;;
-109;torture.at:471;Exploding the Stack Size with Malloc;;
-110;existing.at:26;GNU AWK Grammar;;
-111;existing.at:364;GNU Cim Grammar;;
-112;existing.at:980;GNU pic Grammar;;
-113;regression.at:28;Trivial grammars;;
-114;regression.at:57;Early token definitions;;
-115;regression.at:95;Braces parsing;;
-116;regression.at:117;Duplicate string;;
-117;regression.at:143;Rule Line Numbers;report;
-118;regression.at:287;Mixing %token styles;;
-119;regression.at:310;Invalid inputs;;
-120;regression.at:336;Invalid inputs with {};;
-121;regression.at:363;Token definitions;;
-122;regression.at:416;Characters Escapes;;
-123;regression.at:447;Web2c Report;report;
-124;regression.at:624;Web2c Actions;report;
-125;regression.at:866;Dancer ;;
-126;regression.at:867;Dancer %glr-parser;;
-127;regression.at:868;Dancer %skeleton "lalr1.cc";c++;
-128;regression.at:963;Expecting two tokens ;;
-129;regression.at:964;Expecting two tokens %glr-parser;;
-130;regression.at:965;Expecting two tokens %skeleton "lalr1.cc";c++;
-131;c++.at:102;Doxygen Public Documentation;;
-132;c++.at:103;Doxygen Private Documentation;;
-133;cxx-type.at:412;GLR: Resolve ambiguity, impure, no locations;;
-134;cxx-type.at:419;GLR: Resolve ambiguity, impure, locations;;
-135;cxx-type.at:425;GLR: Resolve ambiguity, pure, no locations;;
-136;cxx-type.at:432;GLR: Resolve ambiguity, pure, locations;;
-137;cxx-type.at:439;GLR: Merge conflicting parses, impure, no locations;;
-138;cxx-type.at:446;GLR: Merge conflicting parses, impure, locations;;
-139;cxx-type.at:453;GLR: Merge conflicting parses, pure, no locations;;
-140;cxx-type.at:459;GLR: Merge conflicting parses, pure, locations;;
-141;cxx-type.at:466;GLR: Verbose messages, resolve ambiguity, impure, no locations;;
-142;glr-regression.at:25;Badly Collapsed GLR States;;
-143;glr-regression.at:116;Improper handling of embedded actions and dollar(-N) in GLR parsers;;
-144;glr-regression.at:232;Improper merging of GLR delayed action sets;;
-145;glr-regression.at:337;Duplicate representation of merged trees;;
-146;glr-regression.at:432;User destructor for unresolved GLR semantic value;;
-147;glr-regression.at:502;User destructor after an error during a split parse;;
-148;glr-regression.at:566;Duplicated user destructor for lookahead;;
-149;glr-regression.at:644;Incorrectly initialized location for empty right-hand side in GLR;;
-150;glr-regression.at:740;No users destructors if stack 0 deleted;;
-151;glr-regression.at:820;Corrupted semantic options if user action cuts parse;;
-152;glr-regression.at:881;Undesirable destructors if user action cuts parse;;
-153;glr-regression.at:947;Leaked semantic values if user action cuts parse;;
-154;glr-regression.at:1078;Incorrect lookahead during deterministic GLR;;
-155;glr-regression.at:1212;Incorrect lookahead during nondeterministic GLR;;
-156;glr-regression.at:1429;Leaked semantic values when reporting ambiguity;;
-157;glr-regression.at:1519;Leaked lookahead after nondeterministic parse syntax error;;
-158;glr-regression.at:1585;Uninitialized location when reporting ambiguity;;
-'
-
-at_keywords=
-at_prev=
-for at_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$at_prev"; then
-    at_option=$at_prev=$at_option
-    at_prev=
-  fi
-
-  at_optarg=`expr "x$at_option" : 'x[^=]*=\(.*\)'`
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $at_option in
-    --help | -h )
-	at_help_p=:
-	;;
-
-    --list | -l )
-	at_list_p=:
-	;;
-
-    --version | -V )
-	echo "$as_me (GNU Bison 2.3)"
-	exit 0
-	;;
-
-    --clean | -c )
-	rm -rf $at_suite_dir $at_suite_log
-	exit 0
-	;;
-
-    --debug | -d )
-	at_debug_p=:
-	;;
-
-    --errexit | -e )
-	at_debug_p=:
-	at_errexit_p=:
-	;;
-
-    --verbose | -v )
-	at_verbose=echo; at_quiet=:
-	;;
-
-    --trace | -x )
-	at_traceon='set -vx'; at_traceoff='set +vx'
-	;;
-
-    [0-9] | [0-9][0-9] | [0-9][0-9][0-9] | [0-9][0-9][0-9][0-9])
-	at_groups="$at_groups$at_option "
-	;;
-
-    # Ranges
-    [0-9]- | [0-9][0-9]- | [0-9][0-9][0-9]- | [0-9][0-9][0-9][0-9]-)
-	at_range_start=`echo $at_option |tr -d '-'`
-	at_range=`echo " $at_groups_all " | \
-	  sed -e 's,^.* '$at_range_start' ,'$at_range_start' ,'`
-	at_groups="$at_groups$at_range "
-	;;
-
-    -[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | -[0-9][0-9][0-9][0-9])
-	at_range_end=`echo $at_option |tr -d '-'`
-	at_range=`echo " $at_groups_all " | \
-	  sed -e 's, '$at_range_end' .*$, '$at_range_end','`
-	at_groups="$at_groups$at_range "
-	;;
-
-    [0-9]-[0-9] | [0-9]-[0-9][0-9] | [0-9]-[0-9][0-9][0-9] | \
-    [0-9]-[0-9][0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9] | \
-    [0-9][0-9]-[0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9][0-9][0-9] | \
-    [0-9][0-9][0-9]-[0-9][0-9][0-9] | \
-    [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] | \
-    [0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] )
-	at_range_start=`echo $at_option |sed 's,-.*,,'`
-	at_range_end=`echo $at_option |sed 's,.*-,,'`
-	# FIXME: Maybe test to make sure start <= end?
-	at_range=`echo " $at_groups_all " | \
-	  sed -e 's,^.* '$at_range_start' ,'$at_range_start' ,' \
-	      -e 's, '$at_range_end' .*$, '$at_range_end','`
-	at_groups="$at_groups$at_range "
-	;;
-
-    # Keywords.
-    --keywords | -k )
-	at_prev=--keywords
-	;;
-    --keywords=* )
-	at_keywords="$at_keywords,$at_optarg"
-	;;
-
-    *=*)
-  	at_envvar=`expr "x$at_option" : 'x\([^=]*\)='`
-  	# Reject names that are not valid shell variable names.
-  	expr "x$at_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
-  	  { echo "$as_me: error: invalid variable name: $at_envvar" >&2
-   { (exit 1); exit 1; }; }
-  	at_value=`echo "$at_optarg" | sed "s/'/'\\\\\\\\''/g"`
-  	eval "$at_envvar='$at_value'"
-  	export $at_envvar
-	# Propagate to debug scripts.
-  	at_debug_args="$at_debug_args $at_option"
-  	;;
-
-     *) echo "$as_me: invalid option: $at_option" >&2
-	echo "Try \`$0 --help' for more information." >&2
-	exit 1
-	;;
-  esac
-done
-
-# Process the --keywords
-if test -n "$at_keywords"; then
-  at_groups_selected=$at_help_all
-  for at_keyword in `IFS=,; set X $at_keywords; shift; echo ${1+$@}`
-  do
-    # It is on purpose that we match the test group titles too.
-    at_groups_selected=`echo "$at_groups_selected" |
-			grep -i "^[^;]*;[^;]*.*[; ]$at_keyword[ ;]"`
-  done
-  at_groups_selected=`echo "$at_groups_selected" | sed 's/;.*//'`
-  # Smash the end of lines.
-  at_groups_selected=`echo $at_groups_selected`
-  at_groups="$at_groups$at_groups_selected "
-fi
-
-# Selected test groups.
-test -z "$at_groups" && at_groups=$at_groups_all
-
-# Help message.
-if $at_help_p; then
-  cat <<_ATEOF
-Usage: $0 [OPTION]... [VARIABLE=VALUE]... [TESTS]
-
-Run all the tests, or the selected TESTS, and save a detailed log file.
-Upon failure, create debugging scripts.
-
-You should not change environment variables unless explicitly passed
-as command line arguments.  Set \`AUTOTEST_PATH' to select the executables
-to exercise.  Each relative directory is expanded as build and source
-directories relatively to the top level of this distribution.  E.g.,
-
-  $ $0 AUTOTEST_PATH=bin
-
-possibly amounts into
-
-  PATH=/tmp/foo-1.0/bin:/src/foo-1.0/bin:\$PATH
-_ATEOF
-cat <<_ATEOF
-
-Operation modes:
-  -h, --help     print the help message, then exit
-  -V, --version  print version number, then exit
-  -c, --clean    remove all the files this test suite might create and exit
-  -l, --list     describes all the tests, or the selected TESTS
-_ATEOF
-cat <<_ATEOF
-
-Execution tuning:
-  -k, --keywords=KEYWORDS
-	         select the tests matching all the comma separated KEYWORDS
-	         accumulates
-  -e, --errexit  abort as soon as a test fails; implies --debug
-  -v, --verbose  force more detailed output
-	         default for debugging scripts
-  -d, --debug    inhibit clean up and debug script creation
-	         default for debugging scripts
-  -x, --trace    enable tests shell tracing
-_ATEOF
-cat <<_ATEOF
-
-Report bugs to <bug-bison@gnu.org>.
-_ATEOF
-  exit 0
-fi
-
-# List of tests.
-if $at_list_p; then
-  cat <<_ATEOF
-GNU Bison 2.3 test suite test groups:
-
- NUM: FILENAME:LINE      TEST-GROUP-NAME
-      KEYWORDS
-
-_ATEOF
-  # "  1 42  45 " => "^(1|42|45);".
-  at_groups_pattern=`echo "$at_groups" | sed 's/^  *//;s/  *$//;s/  */|/g'`
-  echo "$at_help_all" |
-    awk 'BEGIN { FS = ";" }
-	 { if ($1 !~ /^('"$at_groups_pattern"')$/) next }
-	 { if ($1) printf " %3d: %-18s %s\n", $1, $2, $3
-	   if ($4) printf "      %s\n", $4 } '
-  exit 0
-fi
-
-# Don't take risks: use only absolute directories in PATH.
-#
-# For stand-alone test suites, AUTOTEST_PATH is relative to `.'.
-#
-# For embedded test suites, AUTOTEST_PATH is relative to the top level
-# of the package.  Then expand it into build/src parts, since users
-# may create executables in both places.
-#
-# There might be directories that don't exist, but don't redirect
-# builtins' (eg., cd) stderr directly: Ultrix's sh hates that.
-AUTOTEST_PATH=`echo $AUTOTEST_PATH | tr ':' $PATH_SEPARATOR`
-at_path=
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $AUTOTEST_PATH $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  case $as_dir in
-  [\\/]* | ?:[\\/]* )
-    at_path=$at_path$PATH_SEPARATOR$as_dir
-    ;;
-  * )
-    if test -z "$at_top_builddir"; then
-      # Stand-alone test suite.
-      at_path=$at_path$PATH_SEPARATOR$as_dir
-    else
-      # Embedded test suite.
-      at_path=$at_path$PATH_SEPARATOR$at_top_builddir/$as_dir
-      at_path=$at_path$PATH_SEPARATOR$at_top_srcdir/$as_dir
-    fi
-    ;;
-esac
-done
-
-
-# Now build and simplify PATH.
-PATH=
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $at_path
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  as_dir=`(cd "$as_dir" && pwd) 2>/dev/null`
-test -d "$as_dir" || continue
-case $PATH in
-	          $as_dir                 | \
-	          $as_dir$PATH_SEPARATOR* | \
-  *$PATH_SEPARATOR$as_dir                 | \
-  *$PATH_SEPARATOR$as_dir$PATH_SEPARATOR* ) ;;
-
-  '') PATH=$as_dir ;;
-   *) PATH=$PATH$PATH_SEPARATOR$as_dir ;;
-esac
-done
-
-export PATH
-
-# Setting up the FDs.
-# 5 is the log file.  Not to be overwritten if `-d'.
-
-$at_debug_p && at_suite_log=/dev/null
-exec 5>$at_suite_log
-
-# Banners and logs.
-cat <<\_ASBOX
-## ------------------------- ##
-## GNU Bison 2.3 test suite. ##
-## ------------------------- ##
-_ASBOX
-{
-  cat <<\_ASBOX
-## ------------------------- ##
-## GNU Bison 2.3 test suite. ##
-## ------------------------- ##
-_ASBOX
-  echo
-
-  echo "$as_me: command line was:"
-  echo "  $ $0 $at_cli_args"
-  echo
-
-  # Try to find a few ChangeLogs in case it might help determining the
-  # exact version.  Use the relative dir: if the top dir is a symlink,
-  # find will not follow it (and options to follow the links are not
-  # portable), which would result in no output here.
-  if test -n "$at_top_srcdir"; then
-    cat <<\_ASBOX
-## ----------- ##
-## ChangeLogs. ##
-## ----------- ##
-_ASBOX
-    echo
-    for at_file in `find "$at_top_srcdir" -name ChangeLog -print`
-    do
-      echo "$as_me: $at_file:"
-      sed 's/^/| /;10q' $at_file
-      echo
-    done
-
-    {
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  echo "PATH: $as_dir"
-done
-
-}
-    echo
-  fi
-
-  # Contents of the config files.
-  for at_file in atconfig atlocal
-  do
-    test -r $at_file || continue
-    echo "$as_me: $at_file:"
-    sed 's/^/| /' $at_file
-    echo
-  done
-
-  cat <<\_ASBOX
-## ---------------- ##
-## Tested programs. ##
-## ---------------- ##
-_ASBOX
-  echo
-} >&5
-
-# Report what programs are being tested.
-for at_program in : $at_tested
-do
-  test "$at_program" = : && continue
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -f $as_dir/$at_program && break
-done
-
-  if test -f $as_dir/$at_program; then
-    {
-      echo "local.at:216: $as_dir/$at_program --version"
-      $as_dir/$at_program --version
-      echo
-    } >&5 2>&1
-  else
-    { { echo "$as_me:$LINENO: error: cannot find $at_program" >&5
-echo "$as_me: error: cannot find $at_program" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-done
-
-{
-  cat <<\_ASBOX
-## ------------------ ##
-## Running the tests. ##
-## ------------------ ##
-_ASBOX
-} >&5
-
-at_start_date=`date`
-at_start_time=`(date +%s) 2>/dev/null`
-echo "$as_me: starting at: $at_start_date" >&5
-at_xpass_list=
-at_xfail_list=
-at_pass_list=
-at_fail_list=
-at_skip_list=
-at_group_count=0
-
-# Create the master directory if it doesn't already exist.
-test -d $at_suite_dir ||
-  mkdir $at_suite_dir ||
-  { { echo "$as_me:$LINENO: error: cannot create $at_suite_dir" >&5
-echo "$as_me: error: cannot create $at_suite_dir" >&2;}
-   { (exit 1); exit 1; }; }
-
-# Can we diff with `/dev/null'?  DU 5.0 refuses.
-if diff /dev/null /dev/null >/dev/null 2>&1; then
-  at_devnull=/dev/null
-else
-  at_devnull=$at_suite_dir/devnull
-  cp /dev/null $at_devnull
-fi
-
-# Use `diff -u' when possible.
-if diff -u $at_devnull $at_devnull >/dev/null 2>&1; then
-  at_diff='diff -u'
-else
-  at_diff=diff
-fi
-
-
-for at_group in $at_groups
-do
-  # Be sure to come back to the top test directory.
-  cd $at_suite_dir
-
-  case $at_group in
-    banner-*)
-      at_group_log=$at_suite_log
-      ;;
-
-    *)
-      # Skip tests we already run (using --keywords makes it easy to get
-      # duplication).
-      case " $at_pass_test $at_skip_test $at_fail_test " in
-	*" $at_group "* ) continue;;
-      esac
-
-      # Normalize the test group number.
-      at_group_normalized=`expr "00000$at_group" : ".*\($at_format\)"`
-
-      # Create a fresh directory for the next test group, and enter.
-      at_group_dir=$at_suite_dir/$at_group_normalized
-      at_group_log=$at_group_dir/$as_me.log
-      rm -rf $at_group_dir
-      mkdir $at_group_dir ||
-	{ { echo "$as_me:$LINENO: error: cannot create $at_group_dir" >&5
-echo "$as_me: error: cannot create $at_group_dir" >&2;}
-   { (exit 1); exit 1; }; }
-      cd $at_group_dir
-      ;;
-  esac
-
-  echo 0 > $at_status_file
-
-  # Clearly separate the test groups when verbose.
-  test $at_group_count != 0 && $at_verbose
-
-  # In verbose mode, append to the log file *and* show on
-  # the standard output; in quiet mode only write to the log
-  if test $at_verbose = echo; then
-    at_tee_pipe="tee -a $at_group_log"
-  else
-    at_tee_pipe="cat >> $at_group_log"
-  fi
-
-  case $at_group in
-
-  banner-1 ) # Banner 1. input.at:19
-    cat <<\_ATEOF
-
-Input Processing.
-
-_ATEOF
-    ;;
-
-  1 ) # 1. input.at:28: Invalid dollar-n
-    at_setup_line='input.at:28'
-    at_desc='Invalid dollar-n'
-    $at_quiet $ECHO_N "  1: Invalid dollar-n                             $ECHO_C"
-    at_xfail=no
-    (
-      echo "1. input.at:28: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%%
-exp: { $$ = $1 ; };
-_ATEOF
-
-
-$at_traceoff
-echo "input.at:37: bison input.y"
-echo input.at:37 >$at_check_line_file
-( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y:2.13-14: integer out of range: \`\$1'
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "input.at:37: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  2 ) # 2. input.at:46: Invalid @n
-    at_setup_line='input.at:46'
-    at_desc='Invalid @n'
-    $at_quiet $ECHO_N "  2: Invalid @n                                   $ECHO_C"
-    at_xfail=no
-    (
-      echo "2. input.at:46: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%%
-exp: { @$ = @1 ; };
-_ATEOF
-
-
-$at_traceoff
-echo "input.at:55: bison input.y"
-echo input.at:55 >$at_check_line_file
-( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y:2.13-14: integer out of range: \`@1'
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "input.at:55: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  3 ) # 3. input.at:64: Type Clashes
-    at_setup_line='input.at:64'
-    at_desc='Type Clashes'
-    $at_quiet $ECHO_N "  3: Type Clashes                                 $ECHO_C"
-    at_xfail=no
-    (
-      echo "3. input.at:64: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%token foo
-%type <bar> exp
-%%
-exp: foo {} foo
-   | foo
-   | /* Empty. */
-   ;
-_ATEOF
-
-
-$at_traceoff
-echo "input.at:80: bison input.y"
-echo input.at:80 >$at_check_line_file
-( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y:4.6-15: warning: type clash on default action: <bar> != <>
-input.y:5.6-8: warning: type clash on default action: <bar> != <>
-input.y:6.5: warning: empty rule for typed nonterminal, and no action
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "input.at:80: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  4 ) # 4. input.at:89: Unused values
-    at_setup_line='input.at:89'
-    at_desc='Unused values'
-    $at_quiet $ECHO_N "  4: Unused values                                $ECHO_C"
-    at_xfail=no
-    (
-      echo "4. input.at:89: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%token <integer> INT
-%type <integer> a b c d e f g h i j k l
-%destructor { destroy ($$); } INT a b c d e f g h i j k l
-%%
-start:
-  'a' a { $2 } | 'b' b { $2 } | 'c' c { $2 } | 'd' d { $2 } | 'e' e { $2 }
-| 'f' f { $2 } | 'g' g { $2 } | 'h' h { $2 } | 'i' i { $2 } | 'j' j { $2 }
-| 'k' k { $2 } | 'l' l { $2 }
-;
-
-a: INT | INT { } INT { } INT { };
-b: INT | /* empty */;
-c: INT | INT { $1 } INT { } INT { };
-d: INT | INT { } INT { $1 } INT { };
-e: INT | INT { } INT {  } INT { $1 };
-f: INT | INT { } INT {  } INT { $$ = $1 + $3 + $5; };
-g: INT | INT { $$ } INT { $$ } INT { };
-h: INT | INT { $$ } INT { $$ = $2 } INT { };
-i: INT | INT INT { } { $$ = $1 + $2; };
-j: INT | INT INT { $<integer>$ = 1; } { $$ = $1 + $2; };
-k: INT | INT INT { $$; } { $$ = $3; } { };
-l: INT | INT { $$ = $1; } INT { $$ = $2 + $3; } INT { $$ = $4 + $5; };
-
-_ATEOF
-
-
-$at_traceoff
-echo "input.at:148: bison input.y"
-echo input.at:148 >$at_check_line_file
-( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y:11.10-32: warning: unset value: \$\$
-input.y:11.10-32: warning: unused value: \$1
-input.y:11.10-32: warning: unused value: \$3
-input.y:11.10-32: warning: unused value: \$5
-input.y:12.9: warning: empty rule for typed nonterminal, and no action
-input.y:13.10-35: warning: unset value: \$\$
-input.y:13.10-35: warning: unused value: \$3
-input.y:13.10-35: warning: unused value: \$5
-input.y:14.10-35: warning: unset value: \$\$
-input.y:14.10-35: warning: unused value: \$3
-input.y:14.10-35: warning: unused value: \$5
-input.y:15.10-36: warning: unset value: \$\$
-input.y:15.10-36: warning: unused value: \$3
-input.y:15.10-36: warning: unused value: \$5
-input.y:17.10-38: warning: unset value: \$\$
-input.y:17.10-38: warning: unused value: \$1
-input.y:17.10-38: warning: unused value: \$2
-input.y:17.10-38: warning: unused value: \$3
-input.y:17.10-38: warning: unused value: \$4
-input.y:17.10-38: warning: unused value: \$5
-input.y:18.10-43: warning: unset value: \$\$
-input.y:18.10-43: warning: unused value: \$1
-input.y:18.10-43: warning: unused value: \$3
-input.y:18.10-43: warning: unused value: \$4
-input.y:18.10-43: warning: unused value: \$5
-input.y:20.10-55: warning: unused value: \$3
-input.y:21.10-41: warning: unset value: \$\$
-input.y:21.10-41: warning: unused value: \$1
-input.y:21.10-41: warning: unused value: \$2
-input.y:21.10-41: warning: unused value: \$4
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "input.at:148: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  5 ) # 5. input.at:157: Incompatible Aliases
-    at_setup_line='input.at:157'
-    at_desc='Incompatible Aliases'
-    $at_quiet $ECHO_N "  5: Incompatible Aliases                         $ECHO_C"
-    at_xfail=no
-    (
-      echo "5. input.at:157: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%token foo "foo"
-
-%type <bar>       foo
-%printer {bar}    foo
-%destructor {bar} foo
-%left             foo
-
-%type <baz>       "foo"
-%printer {baz}    "foo"
-%destructor {baz} "foo"
-%left             "foo"
-
-%%
-exp: foo;
-_ATEOF
-
-
-$at_traceoff
-echo "input.at:185: bison input.y"
-echo input.at:185 >$at_check_line_file
-( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y:8.7-11: %type redeclaration for foo
-input.y:3.7-11: first declaration
-input.y:10.13-17: %destructor redeclaration for foo
-input.y:5.13-17: first declaration
-input.y:9.10-14: %printer redeclaration for foo
-input.y:10.13-17: first declaration
-input.y:11.1-5: %left redeclaration for foo
-input.y:6.1-5: first declaration
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "input.at:185: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  6 ) # 6. input.at:198: Torturing the Scanner
-    at_setup_line='input.at:198'
-    at_desc='Torturing the Scanner'
-    $at_quiet $ECHO_N "  6: Torturing the Scanner                        $ECHO_C"
-    at_xfail=no
-    (
-      echo "6. input.at:198: testing ..."
-      $at_traceon
-
-
-
-cat >input.y <<'_ATEOF'
-_ATEOF
-
-$at_traceoff
-echo "input.at:204: bison input.y"
-echo input.at:204 >$at_check_line_file
-( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y:1.1: syntax error, unexpected end of file
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "input.at:204: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-cat >input.y <<'_ATEOF'
-{}
-_ATEOF
-
-$at_traceoff
-echo "input.at:212: bison input.y"
-echo input.at:212 >$at_check_line_file
-( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y:1.1-2: syntax error, unexpected {...}
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "input.at:212: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-/* This is seen in GCC: a %{ and %} in middle of a comment. */
-const char *foo = "So %{ and %} can be here too.";
-
-#if 0
-/* These examples test Bison while not stressing C compilers too much.
-   Many C compilers mishandle backslash-newlines, so this part of the
-   test is inside "#if 0".  The comment and string are written so that
-   the "#endif" will be seen regardless of the C compiler bugs that we
-   know about, namely:
-
-     HP C (as of late 2002) mishandles *\[newline]\[newline]/ within a
-     comment.
-
-     The Apple Darwin compiler (as of late 2002) mishandles
-     \\[newline]' within a character constant.
-
-   */
-
-/\
-* A comment with backslash-newlines in it. %} *\
-\
-/
-/* { Close the above comment, if the C compiler mishandled it.  */
-
-char str[] = "\\
-" A string with backslash-newlines in it %{ %} \\
-\
-"";
-
-char apostrophe = '\'';
-#endif
-
-#include <stdio.h>
-%}
-/* %{ and %} can be here too. */
-
-%{
-/* Exercise pre-prologue dependency to %union.  */
-typedef int value;
-%}
-
-/* Exercise M4 quoting: ']]', 0.  */
-
-/* Also exercise %union. */
-%union
-{
-  value ival; /* A comment to exercise an old bug. */
-};
-
-
-/* Exercise post-prologue dependency to %union.  */
-%{
-static YYSTYPE value_as_yystype (value val);
-
-/* Exercise quotes in declarations.  */
-char quote[] = "]],";
-%}
-
-%{
-static void yyerror (const char *s);
-static int yylex (void);
-%}
-
-%type <ival> '['
-
-/* Exercise quotes in strings.  */
-%token FAKE "fake [] \a\b\f\n\r\t\v\"\'\?\\\u005B\U0000005c ??!??'??(??)??-??/??<??=??> \x1\1"
-
-%%
-/* Exercise M4 quoting: ']]', [, 1.  */
-exp: '[' '\1' two '$' '@' '{' oline output.or.oline.opt
-  {
-    /* Exercise quotes in braces.  */
-    char tmp[] = "[%c],\n";
-    printf (tmp, $1);
-  }
-;
-
-two: '\x000000000000000000000000000000000000000000000000000000000000000000002';
-oline: '@' 'o' 'l' 'i' 'n' 'e' '@' '_' '_' 'o' 'l' 'i' 'n' 'e' '_' '_';
-output.or.oline.opt: ;|oline;;|output;;;
-output: '#' 'o' 'u' 't' 'p' 'u' 't' ' ';
-%%
-/* Exercise M4 quoting: ']]', [, 2.  */
-
-static YYSTYPE
-value_as_yystype (value val)
-{
-  YYSTYPE res;
-  res.ival = val;
-  return res;
-}
-
-static int
-yylex (void)
-{
-  static const char *input = "[\1\2$@{@oline@__oline__\
-#output "; /* "
-  */
-  yylval = value_as_yystype (*input);
-  return *input++;
-}
-
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-_ATEOF
-
-
-
-# Pacify Emacs'font-lock-mode: "
-
-cat >main.c <<'_ATEOF'
-typedef int value;
-#include "input.h"
-
-int yyparse (void);
-
-int
-main (void)
-{
-  return yyparse ();
-}
-_ATEOF
-
-
-$at_traceoff
-echo "input.at:342: bison -d -v -o input.c input.y"
-echo input.at:342 >$at_check_line_file
-( $at_traceon; bison -d -v -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "input.at:342: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "input.at:343: \$CC \$CFLAGS \$CPPFLAGS -o input.o -c input.c"
-echo input.at:343 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -o input.o -c input.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "input.at:343: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "input.at:344: \$CC \$CFLAGS \$CPPFLAGS -o main.o -c main.c"
-echo input.at:344 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -o main.o -c main.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "input.at:344: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "input.at:345: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o input input.o main.o \$LIBS"
-echo input.at:345 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o input input.o main.o $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "input.at:345: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "input.at:348: \$PREPARSER ./input"
-echo input.at:348 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "[[],
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "input.at:348: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  7 ) # 7. input.at:357: Typed symbol aliases
-    at_setup_line='input.at:357'
-    at_desc='Typed symbol aliases'
-    $at_quiet $ECHO_N "  7: Typed symbol aliases                         $ECHO_C"
-    at_xfail=no
-    (
-      echo "7. input.at:357: testing ..."
-      $at_traceon
-
-
-# Bison 2.0 broke typed symbol aliases - ensure they work.
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%union
-{
-  int val;
-};
-%token <val> MY_TOKEN "MY TOKEN"
-%type <val> exp
-%%
-exp: "MY TOKEN";
-%%
-_ATEOF
-
-
-
-$at_traceoff
-echo "input.at:373: bison -o input.c input.y"
-echo input.at:373 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "input.at:373: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  8 ) # 8. input.at:393: Require 1.0
-    at_setup_line='input.at:393'
-    at_desc='Require 1.0'
-    $at_quiet $ECHO_N "  8: Require 1.0                                  $ECHO_C"
-    at_xfail=no
-    (
-      echo "8. input.at:393: testing ..."
-      $at_traceon
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%require "1.0";
-%%
-empty_file:;
-_ATEOF
-
-
-$at_traceoff
-echo "input.at:393: bison -o input.c input.y"
-echo input.at:393 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "input.at:393: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  9 ) # 9. input.at:394: Require 2.3
-    at_setup_line='input.at:394'
-    at_desc='Require 2.3'
-    $at_quiet $ECHO_N "  9: Require 2.3                                  $ECHO_C"
-    at_xfail=no
-    (
-      echo "9. input.at:394: testing ..."
-      $at_traceon
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%require "2.3";
-%%
-empty_file:;
-_ATEOF
-
-
-$at_traceoff
-echo "input.at:394: bison -o input.c input.y"
-echo input.at:394 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "input.at:394: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  10 ) # 10. input.at:396: Require 100.0
-    at_setup_line='input.at:396'
-    at_desc='Require 100.0'
-    $at_quiet $ECHO_N " 10: Require 100.0                                $ECHO_C"
-    at_xfail=no
-    (
-      echo "10. input.at:396: testing ..."
-      $at_traceon
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%require "100.0";
-%%
-empty_file:;
-_ATEOF
-
-
-$at_traceoff
-echo "input.at:396: bison -o input.c input.y"
-echo input.at:396 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   63) ;;
-   *) echo "input.at:396: exit code was $at_status, expected 63"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-2 ) # Banner 2. output.at:19
-    cat <<\_ATEOF
-
-Output file names.
-
-_ATEOF
-    ;;
-
-  11 ) # 11. output.at:43: Output files:  -dv
-    at_setup_line='output.at:43'
-    at_desc='Output files:  -dv '
-    $at_quiet $ECHO_N " 11: Output files:  -dv                           $ECHO_C"
-    at_xfail=no
-    (
-      echo "11. output.at:43: testing ..."
-      $at_traceon
-
-case "foo.y" in
-  */*) mkdir `echo "foo.y" | sed 's,/.*,,'`;;
-esac
-cat >foo.y <<'_ATEOF'
-
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:43: bison -dv foo.y "
-echo output.at:43 >$at_check_line_file
-( $at_traceon; bison -dv foo.y  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:43: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:43: ls foo.output foo.tab.c foo.tab.h"
-echo output.at:43 >$at_check_line_file
-( $at_traceon; ls foo.output foo.tab.c foo.tab.h ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:43: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  12 ) # 12. output.at:46: Output files:  -dv >&-
-    at_setup_line='output.at:46'
-    at_desc='Output files:  -dv >&-'
-    $at_quiet $ECHO_N " 12: Output files:  -dv >&-                       $ECHO_C"
-    at_xfail=no
-    (
-      echo "12. output.at:46: testing ..."
-      $at_traceon
-
-case "foo.y" in
-  */*) mkdir `echo "foo.y" | sed 's,/.*,,'`;;
-esac
-cat >foo.y <<'_ATEOF'
-
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:46: bison -dv foo.y >&-"
-echo output.at:46 >$at_check_line_file
-( $at_traceon; bison -dv foo.y >&- ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:46: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:46: ls foo.output foo.tab.c foo.tab.h"
-echo output.at:46 >$at_check_line_file
-( $at_traceon; ls foo.output foo.tab.c foo.tab.h ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:46: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  13 ) # 13. output.at:48: Output files:  -dv -o foo.c
-    at_setup_line='output.at:48'
-    at_desc='Output files:  -dv -o foo.c '
-    $at_quiet $ECHO_N " 13: Output files:  -dv -o foo.c                  $ECHO_C"
-    at_xfail=no
-    (
-      echo "13. output.at:48: testing ..."
-      $at_traceon
-
-case "foo.y" in
-  */*) mkdir `echo "foo.y" | sed 's,/.*,,'`;;
-esac
-cat >foo.y <<'_ATEOF'
-
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:48: bison -dv -o foo.c foo.y "
-echo output.at:48 >$at_check_line_file
-( $at_traceon; bison -dv -o foo.c foo.y  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:48: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:48: ls foo.c foo.h foo.output"
-echo output.at:48 >$at_check_line_file
-( $at_traceon; ls foo.c foo.h foo.output ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:48: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  14 ) # 14. output.at:50: Output files:  -dv -o foo.tab.c
-    at_setup_line='output.at:50'
-    at_desc='Output files:  -dv -o foo.tab.c '
-    $at_quiet $ECHO_N " 14: Output files:  -dv -o foo.tab.c              $ECHO_C"
-    at_xfail=no
-    (
-      echo "14. output.at:50: testing ..."
-      $at_traceon
-
-case "foo.y" in
-  */*) mkdir `echo "foo.y" | sed 's,/.*,,'`;;
-esac
-cat >foo.y <<'_ATEOF'
-
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:50: bison -dv -o foo.tab.c foo.y "
-echo output.at:50 >$at_check_line_file
-( $at_traceon; bison -dv -o foo.tab.c foo.y  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:50: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:50: ls foo.output foo.tab.c foo.tab.h"
-echo output.at:50 >$at_check_line_file
-( $at_traceon; ls foo.output foo.tab.c foo.tab.h ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:50: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  15 ) # 15. output.at:52: Output files:  -dv -y
-    at_setup_line='output.at:52'
-    at_desc='Output files:  -dv -y '
-    $at_quiet $ECHO_N " 15: Output files:  -dv -y                        $ECHO_C"
-    at_xfail=no
-    (
-      echo "15. output.at:52: testing ..."
-      $at_traceon
-
-case "foo.y" in
-  */*) mkdir `echo "foo.y" | sed 's,/.*,,'`;;
-esac
-cat >foo.y <<'_ATEOF'
-
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:52: bison -dv -y foo.y "
-echo output.at:52 >$at_check_line_file
-( $at_traceon; bison -dv -y foo.y  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:52: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:52: ls y.output y.tab.c y.tab.h"
-echo output.at:52 >$at_check_line_file
-( $at_traceon; ls y.output y.tab.c y.tab.h ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:52: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  16 ) # 16. output.at:54: Output files:  -dv -b bar
-    at_setup_line='output.at:54'
-    at_desc='Output files:  -dv -b bar '
-    $at_quiet $ECHO_N " 16: Output files:  -dv -b bar                    $ECHO_C"
-    at_xfail=no
-    (
-      echo "16. output.at:54: testing ..."
-      $at_traceon
-
-case "foo.y" in
-  */*) mkdir `echo "foo.y" | sed 's,/.*,,'`;;
-esac
-cat >foo.y <<'_ATEOF'
-
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:54: bison -dv -b bar foo.y "
-echo output.at:54 >$at_check_line_file
-( $at_traceon; bison -dv -b bar foo.y  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:54: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:54: ls bar.output bar.tab.c bar.tab.h"
-echo output.at:54 >$at_check_line_file
-( $at_traceon; ls bar.output bar.tab.c bar.tab.h ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:54: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  17 ) # 17. output.at:56: Output files:  -dv -g -o foo.c
-    at_setup_line='output.at:56'
-    at_desc='Output files:  -dv -g -o foo.c '
-    $at_quiet $ECHO_N " 17: Output files:  -dv -g -o foo.c               $ECHO_C"
-    at_xfail=no
-    (
-      echo "17. output.at:56: testing ..."
-      $at_traceon
-
-case "foo.y" in
-  */*) mkdir `echo "foo.y" | sed 's,/.*,,'`;;
-esac
-cat >foo.y <<'_ATEOF'
-
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:56: bison -dv -g -o foo.c foo.y "
-echo output.at:56 >$at_check_line_file
-( $at_traceon; bison -dv -g -o foo.c foo.y  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:56: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:56: ls foo.c foo.h foo.output foo.vcg"
-echo output.at:56 >$at_check_line_file
-( $at_traceon; ls foo.c foo.h foo.output foo.vcg ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:56: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  18 ) # 18. output.at:60: Output files: %defines %verbose
-    at_setup_line='output.at:60'
-    at_desc='Output files: %defines %verbose  '
-    $at_quiet $ECHO_N " 18: Output files: %defines %verbose              $ECHO_C"
-    at_xfail=no
-    (
-      echo "18. output.at:60: testing ..."
-      $at_traceon
-
-case "foo.y" in
-  */*) mkdir `echo "foo.y" | sed 's,/.*,,'`;;
-esac
-cat >foo.y <<'_ATEOF'
-%defines %verbose
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:60: bison  foo.y "
-echo output.at:60 >$at_check_line_file
-( $at_traceon; bison  foo.y  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:60: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:60: ls foo.output foo.tab.c foo.tab.h"
-echo output.at:60 >$at_check_line_file
-( $at_traceon; ls foo.output foo.tab.c foo.tab.h ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:60: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  19 ) # 19. output.at:62: Output files: %defines %verbose %yacc
-    at_setup_line='output.at:62'
-    at_desc='Output files: %defines %verbose %yacc  '
-    $at_quiet $ECHO_N " 19: Output files: %defines %verbose %yacc        $ECHO_C"
-    at_xfail=no
-    (
-      echo "19. output.at:62: testing ..."
-      $at_traceon
-
-case "foo.y" in
-  */*) mkdir `echo "foo.y" | sed 's,/.*,,'`;;
-esac
-cat >foo.y <<'_ATEOF'
-%defines %verbose %yacc
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:62: bison  foo.y "
-echo output.at:62 >$at_check_line_file
-( $at_traceon; bison  foo.y  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:62: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:62: ls y.output y.tab.c y.tab.h"
-echo output.at:62 >$at_check_line_file
-( $at_traceon; ls y.output y.tab.c y.tab.h ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:62: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  20 ) # 20. output.at:65: Output files: %defines %verbose %yacc
-    at_setup_line='output.at:65'
-    at_desc='Output files: %defines %verbose %yacc  '
-    $at_quiet $ECHO_N " 20: Output files: %defines %verbose %yacc        $ECHO_C"
-    at_xfail=no
-    (
-      echo "20. output.at:65: testing ..."
-      $at_traceon
-
-case "foo.yy" in
-  */*) mkdir `echo "foo.yy" | sed 's,/.*,,'`;;
-esac
-cat >foo.yy <<'_ATEOF'
-%defines %verbose %yacc
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:65: bison  foo.yy "
-echo output.at:65 >$at_check_line_file
-( $at_traceon; bison  foo.yy  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:65: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:65: ls y.output y.tab.c y.tab.h"
-echo output.at:65 >$at_check_line_file
-( $at_traceon; ls y.output y.tab.c y.tab.h ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:65: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  21 ) # 21. output.at:69: Output files: %file-prefix="bar" %defines %verbose
-    at_setup_line='output.at:69'
-    at_desc='Output files: %file-prefix="bar" %defines %verbose  '
-    $at_quiet $ECHO_N " 21: Output files: %file-prefix="bar" %defines %verbose  $ECHO_C"
-    at_xfail=no
-    (
-      echo "21. output.at:69: testing ..."
-      $at_traceon
-
-case "foo.y" in
-  */*) mkdir `echo "foo.y" | sed 's,/.*,,'`;;
-esac
-cat >foo.y <<'_ATEOF'
-%file-prefix="bar" %defines %verbose
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:69: bison  foo.y "
-echo output.at:69 >$at_check_line_file
-( $at_traceon; bison  foo.y  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:69: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:69: ls bar.output bar.tab.c bar.tab.h"
-echo output.at:69 >$at_check_line_file
-( $at_traceon; ls bar.output bar.tab.c bar.tab.h ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:69: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  22 ) # 22. output.at:71: Output files: %output="bar.c" %defines %verbose %yacc
-    at_setup_line='output.at:71'
-    at_desc='Output files: %output="bar.c" %defines %verbose %yacc  '
-    $at_quiet $ECHO_N " 22: Output files: %output="bar.c" %defines %verbose %yacc  $ECHO_C"
-    at_xfail=no
-    (
-      echo "22. output.at:71: testing ..."
-      $at_traceon
-
-case "foo.y" in
-  */*) mkdir `echo "foo.y" | sed 's,/.*,,'`;;
-esac
-cat >foo.y <<'_ATEOF'
-%output="bar.c" %defines %verbose %yacc
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:71: bison  foo.y "
-echo output.at:71 >$at_check_line_file
-( $at_traceon; bison  foo.y  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:71: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:71: ls bar.output bar.c bar.h"
-echo output.at:71 >$at_check_line_file
-( $at_traceon; ls bar.output bar.c bar.h ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:71: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  23 ) # 23. output.at:75: Output files: %file-prefix="baz" %output="bar.c" %defines %verbose %yacc
-    at_setup_line='output.at:75'
-    at_desc='Output files: %file-prefix="baz" %output="bar.c" %defines %verbose %yacc  '
-    $at_quiet $ECHO_N " 23: Output files: %file-prefix="baz" %output="bar.c" %defines %verbose %yacc  $ECHO_C"
-    at_xfail=no
-    (
-      echo "23. output.at:75: testing ..."
-      $at_traceon
-
-case "foo.y" in
-  */*) mkdir `echo "foo.y" | sed 's,/.*,,'`;;
-esac
-cat >foo.y <<'_ATEOF'
-%file-prefix="baz" %output="bar.c" %defines %verbose %yacc
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:75: bison  foo.y "
-echo output.at:75 >$at_check_line_file
-( $at_traceon; bison  foo.y  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:75: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:75: ls bar.output bar.c bar.h"
-echo output.at:75 >$at_check_line_file
-( $at_traceon; ls bar.output bar.c bar.h ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:75: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  24 ) # 24. output.at:80: Output files: %defines %verbose
-    at_setup_line='output.at:80'
-    at_desc='Output files: %defines %verbose  '
-    $at_quiet $ECHO_N " 24: Output files: %defines %verbose              $ECHO_C"
-    at_xfail=no
-    (
-      echo "24. output.at:80: testing ..."
-      $at_traceon
-
-case "foo.yy" in
-  */*) mkdir `echo "foo.yy" | sed 's,/.*,,'`;;
-esac
-cat >foo.yy <<'_ATEOF'
-%defines %verbose
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:80: bison  foo.yy "
-echo output.at:80 >$at_check_line_file
-( $at_traceon; bison  foo.yy  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:80: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:80: ls foo.output foo.tab.cc foo.tab.hh"
-echo output.at:80 >$at_check_line_file
-( $at_traceon; ls foo.output foo.tab.cc foo.tab.hh ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:80: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  25 ) # 25. output.at:83: Output files: %defines %verbose  -o foo.c
-    at_setup_line='output.at:83'
-    at_desc='Output files: %defines %verbose  -o foo.c '
-    $at_quiet $ECHO_N " 25: Output files: %defines %verbose  -o foo.c    $ECHO_C"
-    at_xfail=no
-    (
-      echo "25. output.at:83: testing ..."
-      $at_traceon
-
-case "foo.yy" in
-  */*) mkdir `echo "foo.yy" | sed 's,/.*,,'`;;
-esac
-cat >foo.yy <<'_ATEOF'
-%defines %verbose
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:83: bison -o foo.c foo.yy "
-echo output.at:83 >$at_check_line_file
-( $at_traceon; bison -o foo.c foo.yy  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:83: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:83: ls foo.c foo.h foo.output"
-echo output.at:83 >$at_check_line_file
-( $at_traceon; ls foo.c foo.h foo.output ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:83: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  26 ) # 26. output.at:87: Output files:  --defines=foo.hpp -o foo.c++
-    at_setup_line='output.at:87'
-    at_desc='Output files:  --defines=foo.hpp -o foo.c++ '
-    $at_quiet $ECHO_N " 26: Output files:  --defines=foo.hpp -o foo.c++  $ECHO_C"
-    at_xfail=no
-    (
-      echo "26. output.at:87: testing ..."
-      $at_traceon
-
-case "foo.yy" in
-  */*) mkdir `echo "foo.yy" | sed 's,/.*,,'`;;
-esac
-cat >foo.yy <<'_ATEOF'
-
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:87: bison --defines=foo.hpp -o foo.c++ foo.yy "
-echo output.at:87 >$at_check_line_file
-( $at_traceon; bison --defines=foo.hpp -o foo.c++ foo.yy  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:87: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:87: ls foo.c++ foo.hpp"
-echo output.at:87 >$at_check_line_file
-( $at_traceon; ls foo.c++ foo.hpp ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:87: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  27 ) # 27. output.at:91: Output files:  -o foo.c++ --graph=foo.gph
-    at_setup_line='output.at:91'
-    at_desc='Output files:  -o foo.c++ --graph=foo.gph '
-    $at_quiet $ECHO_N " 27: Output files:  -o foo.c++ --graph=foo.gph    $ECHO_C"
-    at_xfail=no
-    (
-      echo "27. output.at:91: testing ..."
-      $at_traceon
-
-case "foo.yy" in
-  */*) mkdir `echo "foo.yy" | sed 's,/.*,,'`;;
-esac
-cat >foo.yy <<'_ATEOF'
-
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:91: bison -o foo.c++ --graph=foo.gph foo.yy "
-echo output.at:91 >$at_check_line_file
-( $at_traceon; bison -o foo.c++ --graph=foo.gph foo.yy  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:91: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:91: ls foo.c++ foo.gph"
-echo output.at:91 >$at_check_line_file
-( $at_traceon; ls foo.c++ foo.gph ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:91: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  28 ) # 28. output.at:105: Output files: %skeleton "lalr1.cc" %defines %verbose
-    at_setup_line='output.at:105'
-    at_desc='Output files: %skeleton "lalr1.cc" %defines %verbose  '
-    $at_quiet $ECHO_N " 28: Output files: %skeleton "lalr1.cc" %defines %verbose  $ECHO_C"
-    at_xfail=no
-    (
-      echo "28. output.at:105: testing ..."
-      $at_traceon
-
-case "foo.yy" in
-  */*) mkdir `echo "foo.yy" | sed 's,/.*,,'`;;
-esac
-cat >foo.yy <<'_ATEOF'
-%skeleton "lalr1.cc" %defines %verbose
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:105: bison  foo.yy "
-echo output.at:105 >$at_check_line_file
-( $at_traceon; bison  foo.yy  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:105: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:105: ls foo.tab.cc foo.tab.hh foo.output location.hh stack.hh position.hh"
-echo output.at:105 >$at_check_line_file
-( $at_traceon; ls foo.tab.cc foo.tab.hh foo.output location.hh stack.hh position.hh ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:105: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  29 ) # 29. output.at:109: Output files: %skeleton "lalr1.cc" %defines %verbose
-    at_setup_line='output.at:109'
-    at_desc='Output files: %skeleton "lalr1.cc" %defines %verbose  '
-    $at_quiet $ECHO_N " 29: Output files: %skeleton "lalr1.cc" %defines %verbose  $ECHO_C"
-    at_xfail=no
-    (
-      echo "29. output.at:109: testing ..."
-      $at_traceon
-
-case "subdir/foo.yy" in
-  */*) mkdir `echo "subdir/foo.yy" | sed 's,/.*,,'`;;
-esac
-cat >subdir/foo.yy <<'_ATEOF'
-%skeleton "lalr1.cc" %defines %verbose
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:109: bison  subdir/foo.yy "
-echo output.at:109 >$at_check_line_file
-( $at_traceon; bison  subdir/foo.yy  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:109: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:109: ls foo.tab.cc foo.tab.hh foo.output location.hh stack.hh position.hh"
-echo output.at:109 >$at_check_line_file
-( $at_traceon; ls foo.tab.cc foo.tab.hh foo.output location.hh stack.hh position.hh ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:109: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# Also make sure that the includes do not refer to the subdirectory.
-$at_traceoff
-echo "output.at:109: grep 'include .subdir/' foo.tab.cc"
-echo output.at:109 >$at_check_line_file
-( $at_traceon; grep 'include .subdir/' foo.tab.cc ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "output.at:109: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:109: grep 'include .subdir/' foo.tab.hh"
-echo output.at:109 >$at_check_line_file
-( $at_traceon; grep 'include .subdir/' foo.tab.hh ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "output.at:109: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  30 ) # 30. output.at:114: Output files: %skeleton "lalr1.cc" %defines %verbose -o subdir/foo.cc
-    at_setup_line='output.at:114'
-    at_desc='Output files: %skeleton "lalr1.cc" %defines %verbose -o subdir/foo.cc '
-    $at_quiet $ECHO_N " 30: Output files: %skeleton "lalr1.cc" %defines %verbose -o subdir/foo.cc $ECHO_C"
-    at_xfail=no
-    (
-      echo "30. output.at:114: testing ..."
-      $at_traceon
-
-case "subdir/foo.yy" in
-  */*) mkdir `echo "subdir/foo.yy" | sed 's,/.*,,'`;;
-esac
-cat >subdir/foo.yy <<'_ATEOF'
-%skeleton "lalr1.cc" %defines %verbose
-%%
-foo: {};
-_ATEOF
-
-
-$at_traceoff
-echo "output.at:114: bison -o subdir/foo.cc subdir/foo.yy "
-echo output.at:114 >$at_check_line_file
-( $at_traceon; bison -o subdir/foo.cc subdir/foo.yy  ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:114: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:114: ls subdir/foo.cc subdir/foo.hh subdir/foo.output subdir/location.hh subdir/stack.hh subdir/position.hh"
-echo output.at:114 >$at_check_line_file
-( $at_traceon; ls subdir/foo.cc subdir/foo.hh subdir/foo.output subdir/location.hh subdir/stack.hh subdir/position.hh ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "output.at:114: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# Also make sure that the includes do not refer to the subdirectory.
-$at_traceoff
-echo "output.at:114: grep 'include .subdir/' subdir/foo.cc"
-echo output.at:114 >$at_check_line_file
-( $at_traceon; grep 'include .subdir/' subdir/foo.cc ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "output.at:114: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "output.at:114: grep 'include .subdir/' subdir/foo.hh"
-echo output.at:114 >$at_check_line_file
-( $at_traceon; grep 'include .subdir/' subdir/foo.hh ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "output.at:114: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-3 ) # Banner 3. sets.at:59
-    cat <<\_ATEOF
-
-Grammar Sets (Firsts etc.).
-
-_ATEOF
-    ;;
-
-  31 ) # 31. sets.at:66: Nullable
-    at_setup_line='sets.at:66'
-    at_desc='Nullable'
-    $at_quiet $ECHO_N " 31: Nullable                                     $ECHO_C"
-    at_xfail=no
-    (
-      echo "31. sets.at:66: testing ..."
-      $at_traceon
-
-
-# At some point, nullable had been smoking grass, and managed to say:
-#
-# Entering set_nullable
-# NULLABLE
-#         'e': yes
-#         (null): no
-# ...
-
-cat >input.y <<'_ATEOF'
-%%
-e: 'e' | /* Nothing */;
-_ATEOF
-
-
-$at_traceoff
-echo "sets.at:81: bison --trace=sets input.y"
-echo sets.at:81 >$at_check_line_file
-( $at_traceon; bison --trace=sets input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "sets.at:81: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-cat >extract.sed <<'_ATEOF'
-#n
-/^NULLABLE$/ {
-   :null
-   p
-   n
-   /^[	 ]*$/ !b null
-}
-/^FIRSTS$/ {
-   :firsts
-   p
-   n
-   /^[	 ]*$/ !b firsts
-}
-/^FDERIVES$/ {
-   :fderiv
-   p
-   n
-   /^[	 ]*$/ !b fderiv
-}
-/^DERIVES$/ {
-   :deriv
-   p
-   n
-   /^[	 ]*$/ !b deriv
-}
-_ATEOF
-
-$at_traceoff
-echo "sets.at:82: sed -f extract.sed stderr"
-echo sets.at:82 >$at_check_line_file
-( $at_traceon; sed -f extract.sed stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "sets.at:82: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "sets.at:82: mv stdout sets"
-echo sets.at:82 >$at_check_line_file
-( $at_traceon; mv stdout sets ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "sets.at:82: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "sets.at:107: cat sets"
-echo sets.at:107 >$at_check_line_file
-( $at_traceon; cat sets ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "DERIVES
-	\$accept derives
-		  0  e \$end
-	e derives
-		  1  'e'
-		  2  /* empty */
-NULLABLE
-	\$accept: no
-	e: yes
-FIRSTS
-	\$accept firsts
-		\$accept
-		e
-	e firsts
-		e
-FDERIVES
-	\$accept derives
-		  0  e \$end
-		  1  'e'
-		  2  /* empty */
-	e derives
-		  1  'e'
-		  2  /* empty */
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "sets.at:107: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  32 ) # 32. sets.at:151: Broken Closure
-    at_setup_line='sets.at:151'
-    at_desc='Broken Closure'
-    $at_quiet $ECHO_N " 32: Broken Closure                               $ECHO_C"
-    at_xfail=no
-    (
-      echo "32. sets.at:151: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%%
-a: b;
-b: c;
-c: d;
-d: e;
-e: f;
-f: g;
-g: h;
-h: 'h';
-_ATEOF
-
-
-$at_traceoff
-echo "sets.at:165: bison --trace=sets input.y"
-echo sets.at:165 >$at_check_line_file
-( $at_traceon; bison --trace=sets input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "sets.at:165: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "sets.at:183: sed -n 's/[	 ]*\$//;/^RTC: Firsts Output BEGIN/,/^RTC: Firsts Output END/p' stderr"
-echo sets.at:183 >$at_check_line_file
-( $at_traceon; sed -n 's/[	 ]*$//;/^RTC: Firsts Output BEGIN/,/^RTC: Firsts Output END/p' stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "RTC: Firsts Output BEGIN
-
-   012345678
-  .---------.
- 0|111111111|
- 1| 11111111|
- 2|  1111111|
- 3|   111111|
- 4|    11111|
- 5|     1111|
- 6|      111|
- 7|       11|
- 8|        1|
-  \`---------'
-RTC: Firsts Output END
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "sets.at:183: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  33 ) # 33. sets.at:193: Firsts
-    at_setup_line='sets.at:193'
-    at_desc='Firsts'
-    $at_quiet $ECHO_N " 33: Firsts                                       $ECHO_C"
-    at_xfail=no
-    (
-      echo "33. sets.at:193: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%nonassoc '<' '>'
-%left '+' '-'
-%right '^' '='
-%%
-exp:
-   exp '<' exp
- | exp '>' exp
- | exp '+' exp
- | exp '-' exp
- | exp '^' exp
- | exp '=' exp
- | "exp"
- ;
-_ATEOF
-
-
-$at_traceoff
-echo "sets.at:211: bison --trace=sets input.y"
-echo sets.at:211 >$at_check_line_file
-( $at_traceon; bison --trace=sets input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "sets.at:211: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-cat >extract.sed <<'_ATEOF'
-#n
-/^NULLABLE$/ {
-   :null
-   p
-   n
-   /^[	 ]*$/ !b null
-}
-/^FIRSTS$/ {
-   :firsts
-   p
-   n
-   /^[	 ]*$/ !b firsts
-}
-/^FDERIVES$/ {
-   :fderiv
-   p
-   n
-   /^[	 ]*$/ !b fderiv
-}
-/^DERIVES$/ {
-   :deriv
-   p
-   n
-   /^[	 ]*$/ !b deriv
-}
-_ATEOF
-
-$at_traceoff
-echo "sets.at:212: sed -f extract.sed stderr"
-echo sets.at:212 >$at_check_line_file
-( $at_traceon; sed -f extract.sed stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "sets.at:212: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "sets.at:212: mv stdout sets"
-echo sets.at:212 >$at_check_line_file
-( $at_traceon; mv stdout sets ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "sets.at:212: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "sets.at:252: cat sets"
-echo sets.at:252 >$at_check_line_file
-( $at_traceon; cat sets ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "DERIVES
-	\$accept derives
-		  0  exp \$end
-	exp derives
-		  1  exp '<' exp
-		  2  exp '>' exp
-		  3  exp '+' exp
-		  4  exp '-' exp
-		  5  exp '^' exp
-		  6  exp '=' exp
-		  7  \"exp\"
-NULLABLE
-	\$accept: no
-	exp: no
-FIRSTS
-	\$accept firsts
-		\$accept
-		exp
-	exp firsts
-		exp
-FDERIVES
-	\$accept derives
-		  0  exp \$end
-		  1  exp '<' exp
-		  2  exp '>' exp
-		  3  exp '+' exp
-		  4  exp '-' exp
-		  5  exp '^' exp
-		  6  exp '=' exp
-		  7  \"exp\"
-	exp derives
-		  1  exp '<' exp
-		  2  exp '>' exp
-		  3  exp '+' exp
-		  4  exp '-' exp
-		  5  exp '^' exp
-		  6  exp '=' exp
-		  7  \"exp\"
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "sets.at:252: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  34 ) # 34. sets.at:269: Accept
-    at_setup_line='sets.at:269'
-    at_desc='Accept'
-    $at_quiet $ECHO_N " 34: Accept                                       $ECHO_C"
-    at_xfail=no
-    (
-      echo "34. sets.at:269: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%token END 0
-%%
-input:
-  'a'
-| '(' input ')'
-| '(' error END
-;
-_ATEOF
-
-
-$at_traceoff
-echo "sets.at:281: bison -v -o input.c input.y"
-echo sets.at:281 >$at_check_line_file
-( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "sets.at:281: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Get the final state in the parser.
-$at_traceoff
-echo "sets.at:285: sed -n 's/.*define YYFINAL *\\([0-9][0-9]*\\)/final state \\1/p' input.c"
-echo sets.at:285 >$at_check_line_file
-( $at_traceon; sed -n 's/.*define YYFINAL *\([0-9][0-9]*\)/final state \1/p' input.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "sets.at:285: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-mv stdout expout
-
-# Get the final state in the report, from the "accept" action..
-$at_traceoff
-echo "sets.at:300: sed -n '
-           /^state \\(.*\\)/{
-	     s//final state \\1/
-	     x
-	   }
-	   / accept/{
-	     x
-	     p
-	     q
-	   }
-	' input.output"
-echo sets.at:300 >$at_check_line_file
-( $at_traceon; sed -n '
-           /^state \(.*\)/{
-	     s//final state \1/
-	     x
-	   }
-	   / accept/{
-	     x
-	     p
-	     q
-	   }
-	' input.output ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "sets.at:300: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-4 ) # Banner 4. reduce.at:19
-    cat <<\_ATEOF
-
-Grammar Reduction.
-
-_ATEOF
-    ;;
-
-  35 ) # 35. reduce.at:26: Useless Terminals
-    at_setup_line='reduce.at:26'
-    at_desc='Useless Terminals'
-    $at_quiet $ECHO_N " 35: Useless Terminals                            $ECHO_C"
-    at_xfail=no
-    (
-      echo "35. reduce.at:26: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%verbose
-%output="input.c"
-
-%token useless1
-%token useless2
-%token useless3
-%token useless4
-%token useless5
-%token useless6
-%token useless7
-%token useless8
-%token useless9
-
-%token useful
-%%
-exp: useful;
-_ATEOF
-
-
-$at_traceoff
-echo "reduce.at:47: bison input.y"
-echo reduce.at:47 >$at_check_line_file
-( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "reduce.at:47: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "reduce.at:60: sed -n '/^Grammar/q;/^\$/!p' input.output"
-echo reduce.at:60 >$at_check_line_file
-( $at_traceon; sed -n '/^Grammar/q;/^$/!p' input.output ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "Terminals which are not used
-   useless1
-   useless2
-   useless3
-   useless4
-   useless5
-   useless6
-   useless7
-   useless8
-   useless9
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "reduce.at:60: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  36 ) # 36. reduce.at:70: Useless Nonterminals
-    at_setup_line='reduce.at:70'
-    at_desc='Useless Nonterminals'
-    $at_quiet $ECHO_N " 36: Useless Nonterminals                         $ECHO_C"
-    at_xfail=no
-    (
-      echo "36. reduce.at:70: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%verbose
-%output="input.c"
-
-%nterm useless1
-%nterm useless2
-%nterm useless3
-%nterm useless4
-%nterm useless5
-%nterm useless6
-%nterm useless7
-%nterm useless8
-%nterm useless9
-
-%token useful
-%%
-exp: useful;
-_ATEOF
-
-
-$at_traceoff
-echo "reduce.at:102: bison input.y"
-echo reduce.at:102 >$at_check_line_file
-( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y: warning: 9 useless nonterminals
-input.y:4.8-15: warning: useless nonterminal: useless1
-input.y:5.8-15: warning: useless nonterminal: useless2
-input.y:6.8-15: warning: useless nonterminal: useless3
-input.y:7.8-15: warning: useless nonterminal: useless4
-input.y:8.8-15: warning: useless nonterminal: useless5
-input.y:9.8-15: warning: useless nonterminal: useless6
-input.y:10.8-15: warning: useless nonterminal: useless7
-input.y:11.8-15: warning: useless nonterminal: useless8
-input.y:12.8-15: warning: useless nonterminal: useless9
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "reduce.at:102: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "reduce.at:115: sed -n '/^Grammar/q;/^\$/!p' input.output"
-echo reduce.at:115 >$at_check_line_file
-( $at_traceon; sed -n '/^Grammar/q;/^$/!p' input.output ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "Useless nonterminals
-   useless1
-   useless2
-   useless3
-   useless4
-   useless5
-   useless6
-   useless7
-   useless8
-   useless9
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "reduce.at:115: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  37 ) # 37. reduce.at:125: Useless Rules
-    at_setup_line='reduce.at:125'
-    at_desc='Useless Rules'
-    $at_quiet $ECHO_N " 37: Useless Rules                                $ECHO_C"
-    at_xfail=no
-    (
-      echo "37. reduce.at:125: testing ..."
-      $at_traceon
-
-
-
-
-cat >input.y <<'_ATEOF'
-%verbose
-%output="input.c"
-%token useful
-%%
-exp: useful;
-useless1: '1';
-useless2: '2';
-useless3: '3';
-useless4: '4';
-useless5: '5';
-useless6: '6';
-useless7: '7';
-useless8: '8';
-useless9: '9';
-_ATEOF
-
-
-$at_traceoff
-echo "reduce.at:166: bison input.y"
-echo reduce.at:166 >$at_check_line_file
-( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y: warning: 9 useless nonterminals and 9 useless rules
-input.y:6.1-8: warning: useless nonterminal: useless1
-input.y:7.1-8: warning: useless nonterminal: useless2
-input.y:8.1-8: warning: useless nonterminal: useless3
-input.y:9.1-8: warning: useless nonterminal: useless4
-input.y:10.1-8: warning: useless nonterminal: useless5
-input.y:11.1-8: warning: useless nonterminal: useless6
-input.y:12.1-8: warning: useless nonterminal: useless7
-input.y:13.1-8: warning: useless nonterminal: useless8
-input.y:14.1-8: warning: useless nonterminal: useless9
-input.y:6.11-13: warning: useless rule: useless1: '1'
-input.y:7.11-13: warning: useless rule: useless2: '2'
-input.y:8.11-13: warning: useless rule: useless3: '3'
-input.y:9.11-13: warning: useless rule: useless4: '4'
-input.y:10.11-13: warning: useless rule: useless5: '5'
-input.y:11.11-13: warning: useless rule: useless6: '6'
-input.y:12.11-13: warning: useless rule: useless7: '7'
-input.y:13.11-13: warning: useless rule: useless8: '8'
-input.y:14.11-13: warning: useless rule: useless9: '9'
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "reduce.at:166: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "reduce.at:199: sed -n '/^Grammar/q;/^\$/!p' input.output"
-echo reduce.at:199 >$at_check_line_file
-( $at_traceon; sed -n '/^Grammar/q;/^$/!p' input.output ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "Useless nonterminals
-   useless1
-   useless2
-   useless3
-   useless4
-   useless5
-   useless6
-   useless7
-   useless8
-   useless9
-Terminals which are not used
-   '1'
-   '2'
-   '3'
-   '4'
-   '5'
-   '6'
-   '7'
-   '8'
-   '9'
-Useless rules
-    2 useless1: '1'
-    3 useless2: '2'
-    4 useless3: '3'
-    5 useless4: '4'
-    6 useless5: '5'
-    7 useless6: '6'
-    8 useless7: '7'
-    9 useless8: '8'
-   10 useless9: '9'
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "reduce.at:199: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  38 ) # 38. reduce.at:212: Reduced Automaton
-    at_setup_line='reduce.at:212'
-    at_desc='Reduced Automaton'
-    $at_quiet $ECHO_N " 38: Reduced Automaton                            $ECHO_C"
-    at_xfail=no
-    (
-      echo "38. reduce.at:212: testing ..."
-      $at_traceon
-
-
-
-
-# The non reduced grammar.
-# ------------------------
-cat >not-reduced.y <<'_ATEOF'
-/* A useless token. */
-%token useless_token
-/* A useful one. */
-%token useful
-%verbose
-%output="not-reduced.c"
-
-%%
-
-exp: useful            { /* A useful action. */ }
-   | non_productive    { /* A non productive action. */ }
-   ;
-
-not_reachable: useful  { /* A not reachable action. */ }
-             ;
-
-non_productive: non_productive useless_token
-                       { /* Another non productive action. */ }
-              ;
-%%
-_ATEOF
-
-
-$at_traceoff
-echo "reduce.at:248: bison not-reduced.y"
-echo reduce.at:248 >$at_check_line_file
-( $at_traceon; bison not-reduced.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "not-reduced.y: warning: 2 useless nonterminals and 3 useless rules
-not-reduced.y:14.1-13: warning: useless nonterminal: not_reachable
-not-reduced.y:11.6-19: warning: useless nonterminal: non_productive
-not-reduced.y:11.6-57: warning: useless rule: exp: non_productive
-not-reduced.y:14.16-56: warning: useless rule: not_reachable: useful
-not-reduced.y:17.17-18.63: warning: useless rule: non_productive: non_productive useless_token
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "reduce.at:248: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "reduce.at:260: sed -n '/^Grammar/q;/^\$/!p' not-reduced.output"
-echo reduce.at:260 >$at_check_line_file
-( $at_traceon; sed -n '/^Grammar/q;/^$/!p' not-reduced.output ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "Useless nonterminals
-   not_reachable
-   non_productive
-Terminals which are not used
-   useless_token
-Useless rules
-    2 exp: non_productive
-    3 not_reachable: useful
-    4 non_productive: non_productive useless_token
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "reduce.at:260: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# The reduced grammar.
-# --------------------
-cat >reduced.y <<'_ATEOF'
-/* A useless token. */
-%token useless_token
-/* A useful one. */
-%token useful
-%verbose
-%output="reduced.c"
-
-%%
-
-exp: useful            { /* A useful action. */ }
-//   | non_productive    { /* A non productive action. */ } */
-   ;
-
-//not_reachable: useful  { /* A not reachable action. */ }
-//             ;
-
-//non_productive: non_productive useless_token
-//                       { /* Another non productive action. */ }
-//              ;
-%%
-_ATEOF
-
-
-$at_traceoff
-echo "reduce.at:287: bison reduced.y"
-echo reduce.at:287 >$at_check_line_file
-( $at_traceon; bison reduced.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "reduce.at:287: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Comparing the parsers.
-cp reduced.c expout
-$at_traceoff
-echo "reduce.at:291: sed 's/not-reduced/reduced/g' not-reduced.c"
-echo reduce.at:291 >$at_check_line_file
-( $at_traceon; sed 's/not-reduced/reduced/g' not-reduced.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "reduce.at:291: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  39 ) # 39. reduce.at:301: Underivable Rules
-    at_setup_line='reduce.at:301'
-    at_desc='Underivable Rules'
-    $at_quiet $ECHO_N " 39: Underivable Rules                            $ECHO_C"
-    at_xfail=no
-    (
-      echo "39. reduce.at:301: testing ..."
-      $at_traceon
-
-
-
-
-cat >input.y <<'_ATEOF'
-%verbose
-%output="input.c"
-%token useful
-%%
-exp: useful | underivable;
-underivable: indirection;
-indirection: underivable;
-_ATEOF
-
-
-$at_traceoff
-echo "reduce.at:322: bison input.y"
-echo reduce.at:322 >$at_check_line_file
-( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y: warning: 2 useless nonterminals and 3 useless rules
-input.y:5.15-25: warning: useless nonterminal: underivable
-input.y:6.14-24: warning: useless nonterminal: indirection
-input.y:5.15-25: warning: useless rule: exp: underivable
-input.y:6.14-24: warning: useless rule: underivable: indirection
-input.y:7.14-24: warning: useless rule: indirection: underivable
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "reduce.at:322: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "reduce.at:332: sed -n '/^Grammar/q;/^\$/!p' input.output"
-echo reduce.at:332 >$at_check_line_file
-( $at_traceon; sed -n '/^Grammar/q;/^$/!p' input.output ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "Useless nonterminals
-   underivable
-   indirection
-Useless rules
-    2 exp: underivable
-    3 underivable: indirection
-    4 indirection: underivable
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "reduce.at:332: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  40 ) # 40. reduce.at:342: Empty Language
-    at_setup_line='reduce.at:342'
-    at_desc='Empty Language'
-    $at_quiet $ECHO_N " 40: Empty Language                               $ECHO_C"
-    at_xfail=no
-    (
-      echo "40. reduce.at:342: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%output="input.c"
-%%
-exp: exp;
-_ATEOF
-
-
-$at_traceoff
-echo "reduce.at:353: bison input.y"
-echo reduce.at:353 >$at_check_line_file
-( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y: warning: 2 useless nonterminals and 2 useless rules
-input.y:3.1-3: fatal error: start symbol exp does not derive any sentence
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "reduce.at:353: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-5 ) # Banner 5. synclines.at:19
-    cat <<\_ATEOF
-
-User Actions.
-
-_ATEOF
-    ;;
-
-  41 ) # 41. synclines.at:95: Prologue synch line
-    at_setup_line='synclines.at:95'
-    at_desc='Prologue synch line'
-    $at_quiet $ECHO_N " 41: Prologue synch line                          $ECHO_C"
-    at_xfail=no
-    (
-      echo "41. synclines.at:95: testing ..."
-      $at_traceon
-
-
-# It seems impossible to find a generic scheme to check the location
-# of an error.  Even requiring GCC is not sufficient, since for instance
-# the version modified by Apple:
-#
-# | Reading specs from /usr/libexec/gcc/darwin/ppc/2.95.2/specs
-# | Apple Computer, Inc. version gcc-934.3, based on gcc version 2.95.2
-# | 19991024 (release) configure:2124: $? = 0
-#
-# instead of:
-#
-# | input.y:2: #error "2"
-#
-# it reports:
-#
-# | input.y:2: "2"
-# | cpp-precomp: warning: errors during smart preprocessing, retrying in basic mode
-
-cat >syncline.c <<'_ATEOF'
-#error "1"
-_ATEOF
-
-
-$at_traceoff
-echo "synclines.at:95: \$CC \$CFLAGS \$CPPFLAGS -c syncline.c"
-echo synclines.at:95 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -c syncline.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   *);;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# In case GCC displays column information, strip it down.
-#
-#   input.y:4:2: #error "4"    or
-#   input.y:4.2: #error "4"    or
-#   input.y:4:2: error: #error "4"
-# =>
-#   input.y:4: #error "4"
-#
-$at_traceoff
-echo "synclines.at:95: sed -e 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' -e 's/^\\([^:]*:[^:]*:\\)[^#]*\\( #error\\)/\\1\\2/' stderr"
-echo synclines.at:95 >$at_check_line_file
-( $at_traceon; sed -e 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' -e 's/^\([^:]*:[^:]*:\)[^#]*\( #error\)/\1\2/' stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:95: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "synclines.at:95: test \"\`cat stdout\`\" = 'syncline.c:1: #error \"1\"' || exit 77"
-echo synclines.at:95 >$at_check_line_file
-( $at_traceon; test "`cat stdout`" = 'syncline.c:1: #error "1"' || exit 77 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:95: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%{
-#error "2"
-void yyerror (const char *s);
-int yylex (void);
-%}
-%%
-exp: '0';
-_ATEOF
-
-$at_traceoff
-echo "synclines.at:95: bison -o input.c input.y"
-echo synclines.at:95 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:95: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "synclines.at:95: \$CC \$CFLAGS \$CPPFLAGS -c input.c"
-echo synclines.at:95 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   *);;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# In case GCC displays column information, strip it down.
-#
-#   input.y:4:2: #error "4"    or
-#   input.y:4.2: #error "4"    or
-#   input.y:4:2: error: #error "4"
-# =>
-#   input.y:4: #error "4"
-#
-$at_traceoff
-echo "synclines.at:95: sed -e 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' -e 's/^\\([^:]*:[^:]*:\\)[^#]*\\( #error\\)/\\1\\2/' stderr"
-echo synclines.at:95 >$at_check_line_file
-( $at_traceon; sed -e 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' -e 's/^\([^:]*:[^:]*:\)[^#]*\( #error\)/\1\2/' stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:95: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "synclines.at:95: cat stdout"
-echo synclines.at:95 >$at_check_line_file
-( $at_traceon; cat stdout ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "input.y:2: #error \"2\"
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:95: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  42 ) # 42. synclines.at:115: %union synch line
-    at_setup_line='synclines.at:115'
-    at_desc='%union synch line'
-    $at_quiet $ECHO_N " 42: %union synch line                            $ECHO_C"
-    at_xfail=no
-    (
-      echo "42. synclines.at:115: testing ..."
-      $at_traceon
-
-
-# It seems impossible to find a generic scheme to check the location
-# of an error.  Even requiring GCC is not sufficient, since for instance
-# the version modified by Apple:
-#
-# | Reading specs from /usr/libexec/gcc/darwin/ppc/2.95.2/specs
-# | Apple Computer, Inc. version gcc-934.3, based on gcc version 2.95.2
-# | 19991024 (release) configure:2124: $? = 0
-#
-# instead of:
-#
-# | input.y:2: #error "2"
-#
-# it reports:
-#
-# | input.y:2: "2"
-# | cpp-precomp: warning: errors during smart preprocessing, retrying in basic mode
-
-cat >syncline.c <<'_ATEOF'
-#error "1"
-_ATEOF
-
-
-$at_traceoff
-echo "synclines.at:115: \$CC \$CFLAGS \$CPPFLAGS -c syncline.c"
-echo synclines.at:115 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -c syncline.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   *);;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# In case GCC displays column information, strip it down.
-#
-#   input.y:4:2: #error "4"    or
-#   input.y:4.2: #error "4"    or
-#   input.y:4:2: error: #error "4"
-# =>
-#   input.y:4: #error "4"
-#
-$at_traceoff
-echo "synclines.at:115: sed -e 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' -e 's/^\\([^:]*:[^:]*:\\)[^#]*\\( #error\\)/\\1\\2/' stderr"
-echo synclines.at:115 >$at_check_line_file
-( $at_traceon; sed -e 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' -e 's/^\([^:]*:[^:]*:\)[^#]*\( #error\)/\1\2/' stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:115: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "synclines.at:115: test \"\`cat stdout\`\" = 'syncline.c:1: #error \"1\"' || exit 77"
-echo synclines.at:115 >$at_check_line_file
-( $at_traceon; test "`cat stdout`" = 'syncline.c:1: #error "1"' || exit 77 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:115: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%union {
-#error "2"
-  char dummy;
-}
-%{
-void yyerror (const char *s);
-int yylex (void);
-%}
-%%
-exp: '0';
-_ATEOF
-
-$at_traceoff
-echo "synclines.at:115: bison -o input.c input.y"
-echo synclines.at:115 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:115: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "synclines.at:115: \$CC \$CFLAGS \$CPPFLAGS -c input.c"
-echo synclines.at:115 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   *);;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# In case GCC displays column information, strip it down.
-#
-#   input.y:4:2: #error "4"    or
-#   input.y:4.2: #error "4"    or
-#   input.y:4:2: error: #error "4"
-# =>
-#   input.y:4: #error "4"
-#
-$at_traceoff
-echo "synclines.at:115: sed -e 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' -e 's/^\\([^:]*:[^:]*:\\)[^#]*\\( #error\\)/\\1\\2/' stderr"
-echo synclines.at:115 >$at_check_line_file
-( $at_traceon; sed -e 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' -e 's/^\([^:]*:[^:]*:\)[^#]*\( #error\)/\1\2/' stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:115: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "synclines.at:115: cat stdout"
-echo synclines.at:115 >$at_check_line_file
-( $at_traceon; cat stdout ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "input.y:2: #error \"2\"
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:115: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  43 ) # 43. synclines.at:138: Postprologue synch line
-    at_setup_line='synclines.at:138'
-    at_desc='Postprologue synch line'
-    $at_quiet $ECHO_N " 43: Postprologue synch line                      $ECHO_C"
-    at_xfail=no
-    (
-      echo "43. synclines.at:138: testing ..."
-      $at_traceon
-
-
-# It seems impossible to find a generic scheme to check the location
-# of an error.  Even requiring GCC is not sufficient, since for instance
-# the version modified by Apple:
-#
-# | Reading specs from /usr/libexec/gcc/darwin/ppc/2.95.2/specs
-# | Apple Computer, Inc. version gcc-934.3, based on gcc version 2.95.2
-# | 19991024 (release) configure:2124: $? = 0
-#
-# instead of:
-#
-# | input.y:2: #error "2"
-#
-# it reports:
-#
-# | input.y:2: "2"
-# | cpp-precomp: warning: errors during smart preprocessing, retrying in basic mode
-
-cat >syncline.c <<'_ATEOF'
-#error "1"
-_ATEOF
-
-
-$at_traceoff
-echo "synclines.at:138: \$CC \$CFLAGS \$CPPFLAGS -c syncline.c"
-echo synclines.at:138 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -c syncline.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   *);;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# In case GCC displays column information, strip it down.
-#
-#   input.y:4:2: #error "4"    or
-#   input.y:4.2: #error "4"    or
-#   input.y:4:2: error: #error "4"
-# =>
-#   input.y:4: #error "4"
-#
-$at_traceoff
-echo "synclines.at:138: sed -e 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' -e 's/^\\([^:]*:[^:]*:\\)[^#]*\\( #error\\)/\\1\\2/' stderr"
-echo synclines.at:138 >$at_check_line_file
-( $at_traceon; sed -e 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' -e 's/^\([^:]*:[^:]*:\)[^#]*\( #error\)/\1\2/' stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:138: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "synclines.at:138: test \"\`cat stdout\`\" = 'syncline.c:1: #error \"1\"' || exit 77"
-echo synclines.at:138 >$at_check_line_file
-( $at_traceon; test "`cat stdout`" = 'syncline.c:1: #error "1"' || exit 77 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:138: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%{
-void yyerror (const char *s);
-int yylex (void);
-%}
-%union
-{
-  int ival;
-}
-%{
-#error "10"
-%}
-%%
-exp: '0';
-_ATEOF
-
-$at_traceoff
-echo "synclines.at:138: bison -o input.c input.y"
-echo synclines.at:138 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:138: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "synclines.at:138: \$CC \$CFLAGS \$CPPFLAGS -c input.c"
-echo synclines.at:138 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   *);;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# In case GCC displays column information, strip it down.
-#
-#   input.y:4:2: #error "4"    or
-#   input.y:4.2: #error "4"    or
-#   input.y:4:2: error: #error "4"
-# =>
-#   input.y:4: #error "4"
-#
-$at_traceoff
-echo "synclines.at:138: sed -e 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' -e 's/^\\([^:]*:[^:]*:\\)[^#]*\\( #error\\)/\\1\\2/' stderr"
-echo synclines.at:138 >$at_check_line_file
-( $at_traceon; sed -e 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' -e 's/^\([^:]*:[^:]*:\)[^#]*\( #error\)/\1\2/' stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:138: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "synclines.at:138: cat stdout"
-echo synclines.at:138 >$at_check_line_file
-( $at_traceon; cat stdout ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "input.y:10: #error \"10\"
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:138: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  44 ) # 44. synclines.at:157: Action synch line
-    at_setup_line='synclines.at:157'
-    at_desc='Action synch line'
-    $at_quiet $ECHO_N " 44: Action synch line                            $ECHO_C"
-    at_xfail=no
-    (
-      echo "44. synclines.at:157: testing ..."
-      $at_traceon
-
-
-# It seems impossible to find a generic scheme to check the location
-# of an error.  Even requiring GCC is not sufficient, since for instance
-# the version modified by Apple:
-#
-# | Reading specs from /usr/libexec/gcc/darwin/ppc/2.95.2/specs
-# | Apple Computer, Inc. version gcc-934.3, based on gcc version 2.95.2
-# | 19991024 (release) configure:2124: $? = 0
-#
-# instead of:
-#
-# | input.y:2: #error "2"
-#
-# it reports:
-#
-# | input.y:2: "2"
-# | cpp-precomp: warning: errors during smart preprocessing, retrying in basic mode
-
-cat >syncline.c <<'_ATEOF'
-#error "1"
-_ATEOF
-
-
-$at_traceoff
-echo "synclines.at:157: \$CC \$CFLAGS \$CPPFLAGS -c syncline.c"
-echo synclines.at:157 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -c syncline.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   *);;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# In case GCC displays column information, strip it down.
-#
-#   input.y:4:2: #error "4"    or
-#   input.y:4.2: #error "4"    or
-#   input.y:4:2: error: #error "4"
-# =>
-#   input.y:4: #error "4"
-#
-$at_traceoff
-echo "synclines.at:157: sed -e 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' -e 's/^\\([^:]*:[^:]*:\\)[^#]*\\( #error\\)/\\1\\2/' stderr"
-echo synclines.at:157 >$at_check_line_file
-( $at_traceon; sed -e 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' -e 's/^\([^:]*:[^:]*:\)[^#]*\( #error\)/\1\2/' stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:157: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "synclines.at:157: test \"\`cat stdout\`\" = 'syncline.c:1: #error \"1\"' || exit 77"
-echo synclines.at:157 >$at_check_line_file
-( $at_traceon; test "`cat stdout`" = 'syncline.c:1: #error "1"' || exit 77 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:157: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%{
-void yyerror (const char *s);
-int yylex (void);
-%}
-%%
-exp:
-{
-#error "8"
-};
-_ATEOF
-
-$at_traceoff
-echo "synclines.at:157: bison -o input.c input.y"
-echo synclines.at:157 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:157: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "synclines.at:157: \$CC \$CFLAGS \$CPPFLAGS -c input.c"
-echo synclines.at:157 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   *);;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# In case GCC displays column information, strip it down.
-#
-#   input.y:4:2: #error "4"    or
-#   input.y:4.2: #error "4"    or
-#   input.y:4:2: error: #error "4"
-# =>
-#   input.y:4: #error "4"
-#
-$at_traceoff
-echo "synclines.at:157: sed -e 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' -e 's/^\\([^:]*:[^:]*:\\)[^#]*\\( #error\\)/\\1\\2/' stderr"
-echo synclines.at:157 >$at_check_line_file
-( $at_traceon; sed -e 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' -e 's/^\([^:]*:[^:]*:\)[^#]*\( #error\)/\1\2/' stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:157: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "synclines.at:157: cat stdout"
-echo synclines.at:157 >$at_check_line_file
-( $at_traceon; cat stdout ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "input.y:8: #error \"8\"
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:157: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  45 ) # 45. synclines.at:175: Epilogue synch line
-    at_setup_line='synclines.at:175'
-    at_desc='Epilogue synch line'
-    $at_quiet $ECHO_N " 45: Epilogue synch line                          $ECHO_C"
-    at_xfail=no
-    (
-      echo "45. synclines.at:175: testing ..."
-      $at_traceon
-
-
-# It seems impossible to find a generic scheme to check the location
-# of an error.  Even requiring GCC is not sufficient, since for instance
-# the version modified by Apple:
-#
-# | Reading specs from /usr/libexec/gcc/darwin/ppc/2.95.2/specs
-# | Apple Computer, Inc. version gcc-934.3, based on gcc version 2.95.2
-# | 19991024 (release) configure:2124: $? = 0
-#
-# instead of:
-#
-# | input.y:2: #error "2"
-#
-# it reports:
-#
-# | input.y:2: "2"
-# | cpp-precomp: warning: errors during smart preprocessing, retrying in basic mode
-
-cat >syncline.c <<'_ATEOF'
-#error "1"
-_ATEOF
-
-
-$at_traceoff
-echo "synclines.at:175: \$CC \$CFLAGS \$CPPFLAGS -c syncline.c"
-echo synclines.at:175 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -c syncline.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   *);;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# In case GCC displays column information, strip it down.
-#
-#   input.y:4:2: #error "4"    or
-#   input.y:4.2: #error "4"    or
-#   input.y:4:2: error: #error "4"
-# =>
-#   input.y:4: #error "4"
-#
-$at_traceoff
-echo "synclines.at:175: sed -e 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' -e 's/^\\([^:]*:[^:]*:\\)[^#]*\\( #error\\)/\\1\\2/' stderr"
-echo synclines.at:175 >$at_check_line_file
-( $at_traceon; sed -e 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' -e 's/^\([^:]*:[^:]*:\)[^#]*\( #error\)/\1\2/' stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:175: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "synclines.at:175: test \"\`cat stdout\`\" = 'syncline.c:1: #error \"1\"' || exit 77"
-echo synclines.at:175 >$at_check_line_file
-( $at_traceon; test "`cat stdout`" = 'syncline.c:1: #error "1"' || exit 77 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:175: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%{
-void yyerror (const char *s);
-int yylex (void);
-%}
-%%
-exp: '0';
-%%
-#error "8"
-_ATEOF
-
-$at_traceoff
-echo "synclines.at:175: bison -o input.c input.y"
-echo synclines.at:175 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:175: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "synclines.at:175: \$CC \$CFLAGS \$CPPFLAGS -c input.c"
-echo synclines.at:175 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   *);;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# In case GCC displays column information, strip it down.
-#
-#   input.y:4:2: #error "4"    or
-#   input.y:4.2: #error "4"    or
-#   input.y:4:2: error: #error "4"
-# =>
-#   input.y:4: #error "4"
-#
-$at_traceoff
-echo "synclines.at:175: sed -e 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' -e 's/^\\([^:]*:[^:]*:\\)[^#]*\\( #error\\)/\\1\\2/' stderr"
-echo synclines.at:175 >$at_check_line_file
-( $at_traceon; sed -e 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' -e 's/^\([^:]*:[^:]*:\)[^#]*\( #error\)/\1\2/' stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:175: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "synclines.at:175: cat stdout"
-echo synclines.at:175 >$at_check_line_file
-( $at_traceon; cat stdout ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "input.y:8: #error \"8\"
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "synclines.at:175: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-6 ) # Banner 6. headers.at:19
-    cat <<\_ATEOF
-
-Parser Headers.
-
-_ATEOF
-    ;;
-
-  46 ) # 46. headers.at:27: %union and --defines
-    at_setup_line='headers.at:27'
-    at_desc='%union and --defines'
-    $at_quiet $ECHO_N " 46: %union and --defines                         $ECHO_C"
-    at_xfail=no
-    (
-      echo "46. headers.at:27: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%union
-{
-  int   integer;
-  char *string ;
-}
-%%
-exp: {};
-_ATEOF
-
-
-$at_traceoff
-echo "headers.at:39: bison --defines input.y"
-echo headers.at:39 >$at_check_line_file
-( $at_traceon; bison --defines input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "headers.at:39: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  47 ) # 47. headers.at:77: Invalid CPP guards: input/input
-    at_setup_line='headers.at:77'
-    at_desc='Invalid CPP guards: input/input'
-    $at_quiet $ECHO_N " 47: Invalid CPP guards: input/input              $ECHO_C"
-    at_xfail=no
-    (
-      echo "47. headers.at:77: testing ..."
-      $at_traceon
-
-
-# Possibly create inner directories.
-dirname=`(dirname input/input) 2>/dev/null ||
-$as_expr Xinput/input : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 Xinput/input : 'X\(//\)[^/]' \| \
-	 Xinput/input : 'X\(//\)$' \| \
-	 Xinput/input : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo Xinput/input |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-{ if $as_mkdir_p; then
-    mkdir -p $dirname
-  else
-    as_dir=$dirname
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirname" >&5
-echo "$as_me: error: cannot create directory $dirname" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-
-cat >input/input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-#include <input/input.h>
-void yyerror (const char *);
-int yylex (void);
-%}
-%%
-dummy:;
-%%
-#include <input/input.h>
-_ATEOF
-
-
-
-$at_traceoff
-echo "headers.at:77: bison --defines=input/input.h --output=y.tab.c input/input.y"
-echo headers.at:77 >$at_check_line_file
-( $at_traceon; bison --defines=input/input.h --output=y.tab.c input/input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "headers.at:77: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "headers.at:77: \$CC \$CFLAGS \$CPPFLAGS -o y.tab.o -I. -c y.tab.c"
-echo headers.at:77 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -o y.tab.o -I. -c y.tab.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "headers.at:77: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  48 ) # 48. headers.at:78: Invalid CPP guards: 9foo
-    at_setup_line='headers.at:78'
-    at_desc='Invalid CPP guards: 9foo'
-    $at_quiet $ECHO_N " 48: Invalid CPP guards: 9foo                     $ECHO_C"
-    at_xfail=no
-    (
-      echo "48. headers.at:78: testing ..."
-      $at_traceon
-
-
-# Possibly create inner directories.
-dirname=`(dirname 9foo) 2>/dev/null ||
-$as_expr X9foo : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X9foo : 'X\(//\)[^/]' \| \
-	 X9foo : 'X\(//\)$' \| \
-	 X9foo : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X9foo |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-{ if $as_mkdir_p; then
-    mkdir -p $dirname
-  else
-    as_dir=$dirname
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirname" >&5
-echo "$as_me: error: cannot create directory $dirname" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-
-cat >9foo.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-#include <9foo.h>
-void yyerror (const char *);
-int yylex (void);
-%}
-%%
-dummy:;
-%%
-#include <9foo.h>
-_ATEOF
-
-
-
-$at_traceoff
-echo "headers.at:78: bison --defines=9foo.h --output=y.tab.c 9foo.y"
-echo headers.at:78 >$at_check_line_file
-( $at_traceon; bison --defines=9foo.h --output=y.tab.c 9foo.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "headers.at:78: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "headers.at:78: \$CC \$CFLAGS \$CPPFLAGS -o y.tab.o -I. -c y.tab.c"
-echo headers.at:78 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -o y.tab.o -I. -c y.tab.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "headers.at:78: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  49 ) # 49. headers.at:87: export YYLTYPE
-    at_setup_line='headers.at:87'
-    at_desc='export YYLTYPE'
-    $at_quiet $ECHO_N " 49: export YYLTYPE                               $ECHO_C"
-    at_xfail=no
-    (
-      echo "49. headers.at:87: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%locations
-
-%name-prefix="my_"
-%{
-#include <stdio.h>
-#include <stdlib.h>
-
-static int
-my_lex (void)
-{
-  return EOF;
-}
-
-static void
-my_error (const char *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-%}
-%%
-exp:;
-_ATEOF
-
-
-
-$at_traceoff
-echo "headers.at:114: bison --defines -o input.c input.y"
-echo headers.at:114 >$at_check_line_file
-( $at_traceon; bison --defines -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "headers.at:114: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# YYLTYPE should be defined, and MY_LLOC declared.
-cat >caller.c <<'_ATEOF'
-#include "input.h"
-YYLTYPE *my_llocp = &my_lloc;
-
-int my_parse (void);
-
-int
-main (void)
-{
-  return my_parse ();
-}
-_ATEOF
-
-
-# Link and execute, just to make sure everything is fine (and in
-# particular, that MY_LLOC is indeed defined somewhere).
-$at_traceoff
-echo "headers.at:132: \$CC \$CFLAGS \$CPPFLAGS -o caller.o -c caller.c"
-echo headers.at:132 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -o caller.o -c caller.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "headers.at:132: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "headers.at:133: \$CC \$CFLAGS \$CPPFLAGS -o input.o -c input.c"
-echo headers.at:133 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -o input.o -c input.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "headers.at:133: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "headers.at:134: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o caller caller.o input.o \$LIBS"
-echo headers.at:134 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o caller caller.o input.o $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "headers.at:134: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "headers.at:135: \$PREPARSER ./caller"
-echo headers.at:135 >$at_check_line_file
-( $at_traceon; $PREPARSER ./caller ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "headers.at:135: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-7 ) # Banner 7. actions.at:19
-    cat <<\_ATEOF
-
-User Actions.
-
-_ATEOF
-    ;;
-
-  50 ) # 50. actions.at:25: Mid-rule actions
-    at_setup_line='actions.at:25'
-    at_desc='Mid-rule actions'
-    $at_quiet $ECHO_N " 50: Mid-rule actions                             $ECHO_C"
-    at_xfail=no
-    (
-      echo "50. actions.at:25: testing ..."
-      $at_traceon
-
-
-# Bison once forgot the mid-rule actions.  It was because the action
-# was attached to the host rule (the one with the mid-rule action),
-# instead of being attached to the empty rule dedicated to this
-# action.
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%error-verbose
-%debug
-%{
-# include <stdio.h>
-# include <stdlib.h>
-  static void yyerror (const char *msg);
-  static int yylex (void);
-%}
-%%
-exp:     { putchar ('0'); }
-     '1' { putchar ('1'); }
-     '2' { putchar ('2'); }
-     '3' { putchar ('3'); }
-     '4' { putchar ('4'); }
-     '5' { putchar ('5'); }
-     '6' { putchar ('6'); }
-     '7' { putchar ('7'); }
-     '8' { putchar ('8'); }
-     '9' { putchar ('9'); }
-         { putchar ('\n'); }
-   ;
-%%
-static int
-yylex (void)
-{
-  static const char *input = "123456789";
-  return *input++;
-}
-
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "actions.at:75: bison -d -v -o input.c input.y"
-echo actions.at:75 >$at_check_line_file
-( $at_traceon; bison -d -v -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:75: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "actions.at:76: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o input input.c \$LIBS"
-echo actions.at:76 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o input input.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:76: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "actions.at:79: \$PREPARSER ./input"
-echo actions.at:79 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "0123456789
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:79: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  51 ) # 51. actions.at:91: Exotic Dollars
-    at_setup_line='actions.at:91'
-    at_desc='Exotic Dollars'
-    $at_quiet $ECHO_N " 51: Exotic Dollars                               $ECHO_C"
-    at_xfail=no
-    (
-      echo "51. actions.at:91: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%error-verbose
-%debug
-%{
-# include <stdio.h>
-# include <stdlib.h>
-  static void yyerror (const char *msg);
-  static int yylex (void);
-# define USE(Var)
-%}
-
-%union
-{
-  int val;
-};
-
-%type <val> a_1 a_2 a_5
-            sum_of_the_five_previous_values
-
-%%
-exp: a_1 a_2 { $<val>$ = 3; } { $<val>$ = $<val>3 + 1; } a_5
-     sum_of_the_five_previous_values
-    {
-       USE (($1, $2, $<foo>3, $<foo>4, $5));
-       printf ("%d\n", $6);
-    }
-;
-a_1: { $$ = 1; };
-a_2: { $$ = 2; };
-a_5: { $$ = 5; };
-
-sum_of_the_five_previous_values:
-    {
-       $$ = $<val>0 + $<val>-1 + $<val>-2 + $<val>-3 + $<val>-4;
-    }
-;
-
-%%
-static int
-yylex (void)
-{
-  return EOF;
-}
-
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "actions.at:150: bison -d -v -o input.c input.y"
-echo actions.at:150 >$at_check_line_file
-( $at_traceon; bison -d -v -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:150: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "actions.at:151: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o input input.c \$LIBS"
-echo actions.at:151 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o input input.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:151: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "actions.at:154: \$PREPARSER ./input"
-echo actions.at:154 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "15
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:154: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  52 ) # 52. actions.at:527: Printers and Destructors :
-    at_setup_line='actions.at:527'
-    at_desc='Printers and Destructors : '
-    $at_quiet $ECHO_N " 52: Printers and Destructors :                   $ECHO_C"
-    at_xfail=no
-    (
-      echo "52. actions.at:527: testing ..."
-      $at_traceon
-
-
-
-# Make sure complex $n work.
-
-# Be sure to pass all the %directives to this macro to have correct
-# helping macros.  So don't put any directly in the Bison file.
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#define YYINITDEPTH 10
-#define YYMAXDEPTH 10
-#define RANGE(Location) (Location).first_line, (Location).last_line
-%}
-
-%error-verbose
-%debug
-%verbose
-%locations
-
-
-
-
-%{
-
-static int yylex (void);
-static void yyerror (const char *msg);
-%}
-
-
-
-%printer
-  {
-    fprintf (yyoutput, "%d", $$);
-  }
-  input line thing 'x' 'y'
-
-%destructor
-  { printf ("Freeing nterm input (%d@%d-%d)\n", $$, RANGE (@$)); }
-  input
-
-%destructor
-  { printf ("Freeing nterm line (%d@%d-%d)\n", $$, RANGE (@$)); }
-  line
-
-%destructor
-  { printf ("Freeing nterm thing (%d@%d-%d)\n", $$, RANGE (@$)); }
-  thing
-
-%destructor
-  { printf ("Freeing token 'x' (%d@%d-%d)\n", $$, RANGE (@$)); }
-  'x'
-
-%destructor
-  { printf ("Freeing token 'y' (%d@%d-%d)\n", $$, RANGE (@$)); }
-  'y'
-
-%%
-/*
-   This grammar is made to exercise error recovery.
-   "Lines" starting with `(' support error recovery, with
-   ')' as synchronizing token.  Lines starting with 'x' can never
-   be recovered from if in error.
-*/
-
-input:
-  /* Nothing. */
-    {
-      $$ = 0;
-      printf ("input (%d@%d-%d): /* Nothing */\n", $$, RANGE (@$));
-    }
-| line input /* Right recursive to load the stack so that popping at
-		EOF can	be exercised.  */
-    {
-      $$ = 2;
-      printf ("input (%d@%d-%d): line (%d@%d-%d) input (%d@%d-%d)\n",
-	      $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2));
-    }
-;
-
-line:
-  thing thing thing ';'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): thing (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ';' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2),
-              $3, RANGE (@3), $4, RANGE (@4));
-    }
-| '(' thing thing ')'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2),
-              $3, RANGE (@3), $4, RANGE (@4));
-    }
-| '(' thing ')'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), $3, RANGE (@3));
-    }
-| '(' error ')'
-    {
-      $$ = -1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) error (@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), RANGE (@2), $3, RANGE (@3));
-    }
-;
-
-thing:
-  'x'
-    {
-      $$ = $1;
-      printf ("thing (%d@%d-%d): 'x' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1));
-    }
-;
-%%
-/* Alias to ARGV[1]. */
-const char *source = 0;
-
-static int
-yylex (void)
-{
-  static unsigned int counter = 0;
-
-  int c = (yylval) = counter++;
-  /* As in BASIC, line numbers go from 10 to 10.  */
- (yylloc).first_line = (yylloc).first_column = 10 * c;
-  (yylloc).last_line = (yylloc).last_column = (yylloc).first_line + 9;
-
-
-  if (source[c])
-    printf ("sending: '%c'", source[c]);
-  else
-    printf ("sending: EOF");
-  printf (" (%d@%d-%d)\n", c, RANGE ((yylloc)));
-  return source[c];
-}
-
-static void
-yyerror (const char *msg)
-{
-  printf ("%d-%d: %s\n", RANGE (yylloc), msg);
-}
-
-int
-main (int argc, const char *argv[])
-{
-  int status;
-  yydebug = !!getenv ("YYDEBUG");
-  assert (argc == 2);
-  source = argv[1];
-  status = yyparse ();
-  switch (status)
-    {
-      case 0: printf ("Successful parse.\n"); break;
-      case 1: printf ("Parsing FAILED.\n"); break;
-      default: printf ("Parsing FAILED (status %d).\n", status); break;
-    }
-  return status;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "actions.at:527: bison -o input.c input.y"
-echo actions.at:527 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:527: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "actions.at:527: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o input input.c \$LIBS"
-echo actions.at:527 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o input input.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:527: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Check the location of "empty"
-# -----------------------------
-# I.e., epsilon-reductions, as in "(x)" which ends by reducing
-# an empty "line" nterm.
-# FIXME: This location is not satisfying.  Depend on the lookahead?
-$at_traceoff
-echo "actions.at:527: \$PREPARSER ./input '(x)'"
-echo actions.at:527 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(x)' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: ')' (2@20-29)
-line (0@0-29): '(' (0@0-9) thing (1@10-19) ')' (2@20-29)
-sending: EOF (3@30-39)
-input (0@29-29): /* Nothing */
-input (2@0-29): line (0@0-29) input (0@29-29)
-Freeing nterm input (2@0-29)
-Successful parse.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:527: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Check locations in error recovery
-# ---------------------------------
-# '(y)' is an error, but can be recovered from.  But what's the location
-# of the error itself ('y'), and of the resulting reduction ('(error)').
-$at_traceoff
-echo "actions.at:527: \$PREPARSER ./input '(y)'"
-echo actions.at:527 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(y)' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'y' (1@10-19)
-10-19: syntax error, unexpected 'y', expecting 'x'
-Freeing token 'y' (1@10-19)
-sending: ')' (2@20-29)
-line (-1@0-29): '(' (0@0-9) error (@10-19) ')' (2@20-29)
-sending: EOF (3@30-39)
-input (0@29-29): /* Nothing */
-input (2@0-29): line (-1@0-29) input (0@29-29)
-Freeing nterm input (2@0-29)
-Successful parse.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:527: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Syntax errors caught by the parser
-# ----------------------------------
-# Exercise the discarding of stack top and input until `error'
-# can be reduced.
-#
-#     '(', 'x', 'x', 'x', 'x', 'x', ')',
-#
-# Load the stack and provoke an error that cannot be caught by the
-# grammar, to check that the stack is cleared.  And make sure the
-# lookahead is freed.
-#
-#     '(', 'x', ')',
-#     '(', 'x', ')',
-#     'y'
-$at_traceoff
-echo "actions.at:527: \$PREPARSER ./input '(xxxxx)(x)(x)y'"
-echo actions.at:527 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(xxxxx)(x)(x)y' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: 'x' (2@20-29)
-thing (2@20-29): 'x' (2@20-29)
-sending: 'x' (3@30-39)
-30-39: syntax error, unexpected 'x', expecting ')'
-Freeing nterm thing (2@20-29)
-Freeing nterm thing (1@10-19)
-Freeing token 'x' (3@30-39)
-sending: 'x' (4@40-49)
-Freeing token 'x' (4@40-49)
-sending: 'x' (5@50-59)
-Freeing token 'x' (5@50-59)
-sending: ')' (6@60-69)
-line (-1@0-69): '(' (0@0-9) error (@10-59) ')' (6@60-69)
-sending: '(' (7@70-79)
-sending: 'x' (8@80-89)
-thing (8@80-89): 'x' (8@80-89)
-sending: ')' (9@90-99)
-line (7@70-99): '(' (7@70-79) thing (8@80-89) ')' (9@90-99)
-sending: '(' (10@100-109)
-sending: 'x' (11@110-119)
-thing (11@110-119): 'x' (11@110-119)
-sending: ')' (12@120-129)
-line (10@100-129): '(' (10@100-109) thing (11@110-119) ')' (12@120-129)
-sending: 'y' (13@130-139)
-input (0@129-129): /* Nothing */
-input (2@100-129): line (10@100-129) input (0@129-129)
-input (2@70-129): line (7@70-99) input (2@100-129)
-input (2@0-129): line (-1@0-69) input (2@70-129)
-130-139: syntax error, unexpected 'y', expecting \$end
-Freeing nterm input (2@0-129)
-Freeing token 'y' (13@130-139)
-Parsing FAILED.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "actions.at:527: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Check destruction upon stack overflow
-# -------------------------------------
-# Upon stack overflow, all symbols on the stack should be destroyed.
-# Only check for yacc.c.
-
-$at_traceoff
-echo "actions.at:527: \$PREPARSER ./input '(x)(x)(x)(x)(x)(x)(x)'"
-echo actions.at:527 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(x)(x)(x)(x)(x)(x)(x)' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: ')' (2@20-29)
-line (0@0-29): '(' (0@0-9) thing (1@10-19) ')' (2@20-29)
-sending: '(' (3@30-39)
-sending: 'x' (4@40-49)
-thing (4@40-49): 'x' (4@40-49)
-sending: ')' (5@50-59)
-line (3@30-59): '(' (3@30-39) thing (4@40-49) ')' (5@50-59)
-sending: '(' (6@60-69)
-sending: 'x' (7@70-79)
-thing (7@70-79): 'x' (7@70-79)
-sending: ')' (8@80-89)
-line (6@60-89): '(' (6@60-69) thing (7@70-79) ')' (8@80-89)
-sending: '(' (9@90-99)
-sending: 'x' (10@100-109)
-thing (10@100-109): 'x' (10@100-109)
-sending: ')' (11@110-119)
-line (9@90-119): '(' (9@90-99) thing (10@100-109) ')' (11@110-119)
-sending: '(' (12@120-129)
-sending: 'x' (13@130-139)
-thing (13@130-139): 'x' (13@130-139)
-sending: ')' (14@140-149)
-line (12@120-149): '(' (12@120-129) thing (13@130-139) ')' (14@140-149)
-sending: '(' (15@150-159)
-sending: 'x' (16@160-169)
-thing (16@160-169): 'x' (16@160-169)
-sending: ')' (17@170-179)
-line (15@150-179): '(' (15@150-159) thing (16@160-169) ')' (17@170-179)
-sending: '(' (18@180-189)
-sending: 'x' (19@190-199)
-thing (19@190-199): 'x' (19@190-199)
-sending: ')' (20@200-209)
-200-209: memory exhausted
-Freeing nterm thing (19@190-199)
-Freeing nterm line (15@150-179)
-Freeing nterm line (12@120-149)
-Freeing nterm line (9@90-119)
-Freeing nterm line (6@60-89)
-Freeing nterm line (3@30-59)
-Freeing nterm line (0@0-29)
-Parsing FAILED (status 2).
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   2) ;;
-   *) echo "actions.at:527: exit code was $at_status, expected 2"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  53 ) # 53. actions.at:528: Printers and Destructors with union:
-    at_setup_line='actions.at:528'
-    at_desc='Printers and Destructors with union: '
-    $at_quiet $ECHO_N " 53: Printers and Destructors with union:         $ECHO_C"
-    at_xfail=no
-    (
-      echo "53. actions.at:528: testing ..."
-      $at_traceon
-
-
-
-# Make sure complex $n work.
-
-# Be sure to pass all the %directives to this macro to have correct
-# helping macros.  So don't put any directly in the Bison file.
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#define YYINITDEPTH 10
-#define YYMAXDEPTH 10
-#define RANGE(Location) (Location).first_line, (Location).last_line
-%}
-
-%error-verbose
-%debug
-%verbose
-%locations
-
-%union
-{
-  int ival;
-}
-
-
-%{
-
-static int yylex (void);
-static void yyerror (const char *msg);
-%}
-
-%type <ival> '(' 'x' 'y' ')' ';' thing line input
-
-%printer
-  {
-    fprintf (yyoutput, "%d", $$);
-  }
-  input line thing 'x' 'y'
-
-%destructor
-  { printf ("Freeing nterm input (%d@%d-%d)\n", $$, RANGE (@$)); }
-  input
-
-%destructor
-  { printf ("Freeing nterm line (%d@%d-%d)\n", $$, RANGE (@$)); }
-  line
-
-%destructor
-  { printf ("Freeing nterm thing (%d@%d-%d)\n", $$, RANGE (@$)); }
-  thing
-
-%destructor
-  { printf ("Freeing token 'x' (%d@%d-%d)\n", $$, RANGE (@$)); }
-  'x'
-
-%destructor
-  { printf ("Freeing token 'y' (%d@%d-%d)\n", $$, RANGE (@$)); }
-  'y'
-
-%%
-/*
-   This grammar is made to exercise error recovery.
-   "Lines" starting with `(' support error recovery, with
-   ')' as synchronizing token.  Lines starting with 'x' can never
-   be recovered from if in error.
-*/
-
-input:
-  /* Nothing. */
-    {
-      $$ = 0;
-      printf ("input (%d@%d-%d): /* Nothing */\n", $$, RANGE (@$));
-    }
-| line input /* Right recursive to load the stack so that popping at
-		EOF can	be exercised.  */
-    {
-      $$ = 2;
-      printf ("input (%d@%d-%d): line (%d@%d-%d) input (%d@%d-%d)\n",
-	      $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2));
-    }
-;
-
-line:
-  thing thing thing ';'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): thing (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ';' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2),
-              $3, RANGE (@3), $4, RANGE (@4));
-    }
-| '(' thing thing ')'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2),
-              $3, RANGE (@3), $4, RANGE (@4));
-    }
-| '(' thing ')'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), $3, RANGE (@3));
-    }
-| '(' error ')'
-    {
-      $$ = -1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) error (@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), RANGE (@2), $3, RANGE (@3));
-    }
-;
-
-thing:
-  'x'
-    {
-      $$ = $1;
-      printf ("thing (%d@%d-%d): 'x' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1));
-    }
-;
-%%
-/* Alias to ARGV[1]. */
-const char *source = 0;
-
-static int
-yylex (void)
-{
-  static unsigned int counter = 0;
-
-  int c = (yylval).ival = counter++;
-  /* As in BASIC, line numbers go from 10 to 10.  */
- (yylloc).first_line = (yylloc).first_column = 10 * c;
-  (yylloc).last_line = (yylloc).last_column = (yylloc).first_line + 9;
-
-
-  if (source[c])
-    printf ("sending: '%c'", source[c]);
-  else
-    printf ("sending: EOF");
-  printf (" (%d@%d-%d)\n", c, RANGE ((yylloc)));
-  return source[c];
-}
-
-static void
-yyerror (const char *msg)
-{
-  printf ("%d-%d: %s\n", RANGE (yylloc), msg);
-}
-
-int
-main (int argc, const char *argv[])
-{
-  int status;
-  yydebug = !!getenv ("YYDEBUG");
-  assert (argc == 2);
-  source = argv[1];
-  status = yyparse ();
-  switch (status)
-    {
-      case 0: printf ("Successful parse.\n"); break;
-      case 1: printf ("Parsing FAILED.\n"); break;
-      default: printf ("Parsing FAILED (status %d).\n", status); break;
-    }
-  return status;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "actions.at:528: bison -o input.c input.y"
-echo actions.at:528 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:528: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "actions.at:528: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o input input.c \$LIBS"
-echo actions.at:528 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o input input.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:528: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Check the location of "empty"
-# -----------------------------
-# I.e., epsilon-reductions, as in "(x)" which ends by reducing
-# an empty "line" nterm.
-# FIXME: This location is not satisfying.  Depend on the lookahead?
-$at_traceoff
-echo "actions.at:528: \$PREPARSER ./input '(x)'"
-echo actions.at:528 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(x)' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: ')' (2@20-29)
-line (0@0-29): '(' (0@0-9) thing (1@10-19) ')' (2@20-29)
-sending: EOF (3@30-39)
-input (0@29-29): /* Nothing */
-input (2@0-29): line (0@0-29) input (0@29-29)
-Freeing nterm input (2@0-29)
-Successful parse.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:528: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Check locations in error recovery
-# ---------------------------------
-# '(y)' is an error, but can be recovered from.  But what's the location
-# of the error itself ('y'), and of the resulting reduction ('(error)').
-$at_traceoff
-echo "actions.at:528: \$PREPARSER ./input '(y)'"
-echo actions.at:528 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(y)' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'y' (1@10-19)
-10-19: syntax error, unexpected 'y', expecting 'x'
-Freeing token 'y' (1@10-19)
-sending: ')' (2@20-29)
-line (-1@0-29): '(' (0@0-9) error (@10-19) ')' (2@20-29)
-sending: EOF (3@30-39)
-input (0@29-29): /* Nothing */
-input (2@0-29): line (-1@0-29) input (0@29-29)
-Freeing nterm input (2@0-29)
-Successful parse.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:528: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Syntax errors caught by the parser
-# ----------------------------------
-# Exercise the discarding of stack top and input until `error'
-# can be reduced.
-#
-#     '(', 'x', 'x', 'x', 'x', 'x', ')',
-#
-# Load the stack and provoke an error that cannot be caught by the
-# grammar, to check that the stack is cleared.  And make sure the
-# lookahead is freed.
-#
-#     '(', 'x', ')',
-#     '(', 'x', ')',
-#     'y'
-$at_traceoff
-echo "actions.at:528: \$PREPARSER ./input '(xxxxx)(x)(x)y'"
-echo actions.at:528 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(xxxxx)(x)(x)y' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: 'x' (2@20-29)
-thing (2@20-29): 'x' (2@20-29)
-sending: 'x' (3@30-39)
-30-39: syntax error, unexpected 'x', expecting ')'
-Freeing nterm thing (2@20-29)
-Freeing nterm thing (1@10-19)
-Freeing token 'x' (3@30-39)
-sending: 'x' (4@40-49)
-Freeing token 'x' (4@40-49)
-sending: 'x' (5@50-59)
-Freeing token 'x' (5@50-59)
-sending: ')' (6@60-69)
-line (-1@0-69): '(' (0@0-9) error (@10-59) ')' (6@60-69)
-sending: '(' (7@70-79)
-sending: 'x' (8@80-89)
-thing (8@80-89): 'x' (8@80-89)
-sending: ')' (9@90-99)
-line (7@70-99): '(' (7@70-79) thing (8@80-89) ')' (9@90-99)
-sending: '(' (10@100-109)
-sending: 'x' (11@110-119)
-thing (11@110-119): 'x' (11@110-119)
-sending: ')' (12@120-129)
-line (10@100-129): '(' (10@100-109) thing (11@110-119) ')' (12@120-129)
-sending: 'y' (13@130-139)
-input (0@129-129): /* Nothing */
-input (2@100-129): line (10@100-129) input (0@129-129)
-input (2@70-129): line (7@70-99) input (2@100-129)
-input (2@0-129): line (-1@0-69) input (2@70-129)
-130-139: syntax error, unexpected 'y', expecting \$end
-Freeing nterm input (2@0-129)
-Freeing token 'y' (13@130-139)
-Parsing FAILED.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "actions.at:528: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Check destruction upon stack overflow
-# -------------------------------------
-# Upon stack overflow, all symbols on the stack should be destroyed.
-# Only check for yacc.c.
-
-$at_traceoff
-echo "actions.at:528: \$PREPARSER ./input '(x)(x)(x)(x)(x)(x)(x)'"
-echo actions.at:528 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(x)(x)(x)(x)(x)(x)(x)' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: ')' (2@20-29)
-line (0@0-29): '(' (0@0-9) thing (1@10-19) ')' (2@20-29)
-sending: '(' (3@30-39)
-sending: 'x' (4@40-49)
-thing (4@40-49): 'x' (4@40-49)
-sending: ')' (5@50-59)
-line (3@30-59): '(' (3@30-39) thing (4@40-49) ')' (5@50-59)
-sending: '(' (6@60-69)
-sending: 'x' (7@70-79)
-thing (7@70-79): 'x' (7@70-79)
-sending: ')' (8@80-89)
-line (6@60-89): '(' (6@60-69) thing (7@70-79) ')' (8@80-89)
-sending: '(' (9@90-99)
-sending: 'x' (10@100-109)
-thing (10@100-109): 'x' (10@100-109)
-sending: ')' (11@110-119)
-line (9@90-119): '(' (9@90-99) thing (10@100-109) ')' (11@110-119)
-sending: '(' (12@120-129)
-sending: 'x' (13@130-139)
-thing (13@130-139): 'x' (13@130-139)
-sending: ')' (14@140-149)
-line (12@120-149): '(' (12@120-129) thing (13@130-139) ')' (14@140-149)
-sending: '(' (15@150-159)
-sending: 'x' (16@160-169)
-thing (16@160-169): 'x' (16@160-169)
-sending: ')' (17@170-179)
-line (15@150-179): '(' (15@150-159) thing (16@160-169) ')' (17@170-179)
-sending: '(' (18@180-189)
-sending: 'x' (19@190-199)
-thing (19@190-199): 'x' (19@190-199)
-sending: ')' (20@200-209)
-200-209: memory exhausted
-Freeing nterm thing (19@190-199)
-Freeing nterm line (15@150-179)
-Freeing nterm line (12@120-149)
-Freeing nterm line (9@90-119)
-Freeing nterm line (6@60-89)
-Freeing nterm line (3@30-59)
-Freeing nterm line (0@0-29)
-Parsing FAILED (status 2).
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   2) ;;
-   *) echo "actions.at:528: exit code was $at_status, expected 2"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  54 ) # 54. actions.at:533: Printers and Destructors : %defines %skeleton "lalr1.cc"
-    at_setup_line='actions.at:533'
-    at_desc='Printers and Destructors : %defines %skeleton "lalr1.cc"'
-    $at_quiet $ECHO_N " 54: Printers and Destructors : %defines %skeleton "lalr1.cc"$ECHO_C"
-    at_xfail=no
-    (
-      echo "54. actions.at:533: testing ..."
-      $at_traceon
-
-
-
-# Make sure complex $n work.
-
-# Be sure to pass all the %directives to this macro to have correct
-# helping macros.  So don't put any directly in the Bison file.
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#define YYINITDEPTH 10
-#define YYMAXDEPTH 10
-#define RANGE(Location) (Location).begin.line, (Location).end.line
-%}
-
-%error-verbose
-%debug
-%verbose
-%locations
-%defines %skeleton "lalr1.cc"
-
-%define "global_tokens_and_yystype"
-
-%{
-typedef yy::location YYLTYPE;
-                #define YYSTYPE int
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-
-%}
-
-
-
-%printer
-  {
-    debug_stream () << $$;;
-  }
-  input line thing 'x' 'y'
-
-%destructor
-  { printf ("Freeing nterm input (%d@%d-%d)\n", $$, RANGE (@$)); }
-  input
-
-%destructor
-  { printf ("Freeing nterm line (%d@%d-%d)\n", $$, RANGE (@$)); }
-  line
-
-%destructor
-  { printf ("Freeing nterm thing (%d@%d-%d)\n", $$, RANGE (@$)); }
-  thing
-
-%destructor
-  { printf ("Freeing token 'x' (%d@%d-%d)\n", $$, RANGE (@$)); }
-  'x'
-
-%destructor
-  { printf ("Freeing token 'y' (%d@%d-%d)\n", $$, RANGE (@$)); }
-  'y'
-
-%%
-/*
-   This grammar is made to exercise error recovery.
-   "Lines" starting with `(' support error recovery, with
-   ')' as synchronizing token.  Lines starting with 'x' can never
-   be recovered from if in error.
-*/
-
-input:
-  /* Nothing. */
-    {
-      $$ = 0;
-      printf ("input (%d@%d-%d): /* Nothing */\n", $$, RANGE (@$));
-    }
-| line input /* Right recursive to load the stack so that popping at
-		EOF can	be exercised.  */
-    {
-      $$ = 2;
-      printf ("input (%d@%d-%d): line (%d@%d-%d) input (%d@%d-%d)\n",
-	      $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2));
-    }
-;
-
-line:
-  thing thing thing ';'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): thing (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ';' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2),
-              $3, RANGE (@3), $4, RANGE (@4));
-    }
-| '(' thing thing ')'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2),
-              $3, RANGE (@3), $4, RANGE (@4));
-    }
-| '(' thing ')'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), $3, RANGE (@3));
-    }
-| '(' error ')'
-    {
-      $$ = -1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) error (@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), RANGE (@2), $3, RANGE (@3));
-    }
-;
-
-thing:
-  'x'
-    {
-      $$ = $1;
-      printf ("thing (%d@%d-%d): 'x' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1));
-    }
-;
-%%
-/* Alias to ARGV[1]. */
-const char *source = 0;
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static unsigned int counter = 0;
-
-  int c = (*lvalp) = counter++;
-  /* As in BASIC, line numbers go from 10 to 10.  */
- (*llocp).begin.line = (*llocp).begin.column = 10 * c;
-  (*llocp).end.line = (*llocp).end.column = (*llocp).begin.line + 9;
-
-
-  if (source[c])
-    printf ("sending: '%c'", source[c]);
-  else
-    printf ("sending: EOF");
-  printf (" (%d@%d-%d)\n", c, RANGE ((*llocp)));
-  return source[c];
-}
-
-/* A C++ error reporting function. */
-void
-yy::parser::error (const location& l, const std::string& m)
-{
-  printf ("%d-%d: %s\n", RANGE (l), m.c_str());
-}
-
-static bool yydebug;
-int
-yyparse ()
-{
-  yy::parser parser;
-  parser.set_debug_level (yydebug);
-  return parser.parse ();
-}
-
-
-int
-main (int argc, const char *argv[])
-{
-  int status;
-  yydebug = !!getenv ("YYDEBUG");
-  assert (argc == 2);
-  source = argv[1];
-  status = yyparse ();
-  switch (status)
-    {
-      case 0: printf ("Successful parse.\n"); break;
-      case 1: printf ("Parsing FAILED.\n"); break;
-      default: printf ("Parsing FAILED (status %d).\n", status); break;
-    }
-  return status;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "actions.at:533: bison -o input.cc input.y"
-echo actions.at:533 >$at_check_line_file
-( $at_traceon; bison -o input.cc input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:533: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "actions.at:533: \$BISON_CXX_WORKS"
-echo actions.at:533 >$at_check_line_file
-( $at_traceon; $BISON_CXX_WORKS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:533: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "actions.at:533: \$CXX \$CXXFLAGS \$CPPFLAGS \$LDFLAGS -o input input.cc \$LIBS"
-echo actions.at:533 >$at_check_line_file
-( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS $LDFLAGS -o input input.cc $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:533: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Check the location of "empty"
-# -----------------------------
-# I.e., epsilon-reductions, as in "(x)" which ends by reducing
-# an empty "line" nterm.
-# FIXME: This location is not satisfying.  Depend on the lookahead?
-$at_traceoff
-echo "actions.at:533: \$PREPARSER ./input '(x)'"
-echo actions.at:533 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(x)' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: ')' (2@20-29)
-line (0@0-29): '(' (0@0-9) thing (1@10-19) ')' (2@20-29)
-sending: EOF (3@30-39)
-input (0@29-29): /* Nothing */
-input (2@0-29): line (0@0-29) input (0@29-29)
-Freeing nterm input (2@0-29)
-Successful parse.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:533: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Check locations in error recovery
-# ---------------------------------
-# '(y)' is an error, but can be recovered from.  But what's the location
-# of the error itself ('y'), and of the resulting reduction ('(error)').
-$at_traceoff
-echo "actions.at:533: \$PREPARSER ./input '(y)'"
-echo actions.at:533 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(y)' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'y' (1@10-19)
-10-19: syntax error, unexpected 'y', expecting 'x'
-Freeing token 'y' (1@10-19)
-sending: ')' (2@20-29)
-line (-1@0-29): '(' (0@0-9) error (@10-19) ')' (2@20-29)
-sending: EOF (3@30-39)
-input (0@29-29): /* Nothing */
-input (2@0-29): line (-1@0-29) input (0@29-29)
-Freeing nterm input (2@0-29)
-Successful parse.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:533: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Syntax errors caught by the parser
-# ----------------------------------
-# Exercise the discarding of stack top and input until `error'
-# can be reduced.
-#
-#     '(', 'x', 'x', 'x', 'x', 'x', ')',
-#
-# Load the stack and provoke an error that cannot be caught by the
-# grammar, to check that the stack is cleared.  And make sure the
-# lookahead is freed.
-#
-#     '(', 'x', ')',
-#     '(', 'x', ')',
-#     'y'
-$at_traceoff
-echo "actions.at:533: \$PREPARSER ./input '(xxxxx)(x)(x)y'"
-echo actions.at:533 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(xxxxx)(x)(x)y' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: 'x' (2@20-29)
-thing (2@20-29): 'x' (2@20-29)
-sending: 'x' (3@30-39)
-30-39: syntax error, unexpected 'x', expecting ')'
-Freeing nterm thing (2@20-29)
-Freeing nterm thing (1@10-19)
-Freeing token 'x' (3@30-39)
-sending: 'x' (4@40-49)
-Freeing token 'x' (4@40-49)
-sending: 'x' (5@50-59)
-Freeing token 'x' (5@50-59)
-sending: ')' (6@60-69)
-line (-1@0-69): '(' (0@0-9) error (@10-59) ')' (6@60-69)
-sending: '(' (7@70-79)
-sending: 'x' (8@80-89)
-thing (8@80-89): 'x' (8@80-89)
-sending: ')' (9@90-99)
-line (7@70-99): '(' (7@70-79) thing (8@80-89) ')' (9@90-99)
-sending: '(' (10@100-109)
-sending: 'x' (11@110-119)
-thing (11@110-119): 'x' (11@110-119)
-sending: ')' (12@120-129)
-line (10@100-129): '(' (10@100-109) thing (11@110-119) ')' (12@120-129)
-sending: 'y' (13@130-139)
-input (0@129-129): /* Nothing */
-input (2@100-129): line (10@100-129) input (0@129-129)
-input (2@70-129): line (7@70-99) input (2@100-129)
-input (2@0-129): line (-1@0-69) input (2@70-129)
-130-139: syntax error, unexpected 'y', expecting \$end
-Freeing nterm input (2@0-129)
-Freeing token 'y' (13@130-139)
-Parsing FAILED.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "actions.at:533: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Check destruction upon stack overflow
-# -------------------------------------
-# Upon stack overflow, all symbols on the stack should be destroyed.
-# Only check for yacc.c.
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  55 ) # 55. actions.at:534: Printers and Destructors with union: %defines %skeleton "lalr1.cc"
-    at_setup_line='actions.at:534'
-    at_desc='Printers and Destructors with union: %defines %skeleton "lalr1.cc"'
-    $at_quiet $ECHO_N " 55: Printers and Destructors with union: %defines %skeleton "lalr1.cc"$ECHO_C"
-    at_xfail=no
-    (
-      echo "55. actions.at:534: testing ..."
-      $at_traceon
-
-
-
-# Make sure complex $n work.
-
-# Be sure to pass all the %directives to this macro to have correct
-# helping macros.  So don't put any directly in the Bison file.
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#define YYINITDEPTH 10
-#define YYMAXDEPTH 10
-#define RANGE(Location) (Location).begin.line, (Location).end.line
-%}
-
-%error-verbose
-%debug
-%verbose
-%locations
-%defines %skeleton "lalr1.cc"
-%union
-{
-  int ival;
-}
-%define "global_tokens_and_yystype"
-
-%{
-typedef yy::location YYLTYPE;
-
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-
-%}
-
-%type <ival> '(' 'x' 'y' ')' ';' thing line input
-
-%printer
-  {
-    debug_stream () << $$;;
-  }
-  input line thing 'x' 'y'
-
-%destructor
-  { printf ("Freeing nterm input (%d@%d-%d)\n", $$, RANGE (@$)); }
-  input
-
-%destructor
-  { printf ("Freeing nterm line (%d@%d-%d)\n", $$, RANGE (@$)); }
-  line
-
-%destructor
-  { printf ("Freeing nterm thing (%d@%d-%d)\n", $$, RANGE (@$)); }
-  thing
-
-%destructor
-  { printf ("Freeing token 'x' (%d@%d-%d)\n", $$, RANGE (@$)); }
-  'x'
-
-%destructor
-  { printf ("Freeing token 'y' (%d@%d-%d)\n", $$, RANGE (@$)); }
-  'y'
-
-%%
-/*
-   This grammar is made to exercise error recovery.
-   "Lines" starting with `(' support error recovery, with
-   ')' as synchronizing token.  Lines starting with 'x' can never
-   be recovered from if in error.
-*/
-
-input:
-  /* Nothing. */
-    {
-      $$ = 0;
-      printf ("input (%d@%d-%d): /* Nothing */\n", $$, RANGE (@$));
-    }
-| line input /* Right recursive to load the stack so that popping at
-		EOF can	be exercised.  */
-    {
-      $$ = 2;
-      printf ("input (%d@%d-%d): line (%d@%d-%d) input (%d@%d-%d)\n",
-	      $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2));
-    }
-;
-
-line:
-  thing thing thing ';'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): thing (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ';' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2),
-              $3, RANGE (@3), $4, RANGE (@4));
-    }
-| '(' thing thing ')'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2),
-              $3, RANGE (@3), $4, RANGE (@4));
-    }
-| '(' thing ')'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), $3, RANGE (@3));
-    }
-| '(' error ')'
-    {
-      $$ = -1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) error (@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), RANGE (@2), $3, RANGE (@3));
-    }
-;
-
-thing:
-  'x'
-    {
-      $$ = $1;
-      printf ("thing (%d@%d-%d): 'x' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1));
-    }
-;
-%%
-/* Alias to ARGV[1]. */
-const char *source = 0;
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static unsigned int counter = 0;
-
-  int c = (*lvalp).ival = counter++;
-  /* As in BASIC, line numbers go from 10 to 10.  */
- (*llocp).begin.line = (*llocp).begin.column = 10 * c;
-  (*llocp).end.line = (*llocp).end.column = (*llocp).begin.line + 9;
-
-
-  if (source[c])
-    printf ("sending: '%c'", source[c]);
-  else
-    printf ("sending: EOF");
-  printf (" (%d@%d-%d)\n", c, RANGE ((*llocp)));
-  return source[c];
-}
-
-/* A C++ error reporting function. */
-void
-yy::parser::error (const location& l, const std::string& m)
-{
-  printf ("%d-%d: %s\n", RANGE (l), m.c_str());
-}
-
-static bool yydebug;
-int
-yyparse ()
-{
-  yy::parser parser;
-  parser.set_debug_level (yydebug);
-  return parser.parse ();
-}
-
-
-int
-main (int argc, const char *argv[])
-{
-  int status;
-  yydebug = !!getenv ("YYDEBUG");
-  assert (argc == 2);
-  source = argv[1];
-  status = yyparse ();
-  switch (status)
-    {
-      case 0: printf ("Successful parse.\n"); break;
-      case 1: printf ("Parsing FAILED.\n"); break;
-      default: printf ("Parsing FAILED (status %d).\n", status); break;
-    }
-  return status;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "actions.at:534: bison -o input.cc input.y"
-echo actions.at:534 >$at_check_line_file
-( $at_traceon; bison -o input.cc input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:534: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "actions.at:534: \$BISON_CXX_WORKS"
-echo actions.at:534 >$at_check_line_file
-( $at_traceon; $BISON_CXX_WORKS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:534: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "actions.at:534: \$CXX \$CXXFLAGS \$CPPFLAGS \$LDFLAGS -o input input.cc \$LIBS"
-echo actions.at:534 >$at_check_line_file
-( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS $LDFLAGS -o input input.cc $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:534: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Check the location of "empty"
-# -----------------------------
-# I.e., epsilon-reductions, as in "(x)" which ends by reducing
-# an empty "line" nterm.
-# FIXME: This location is not satisfying.  Depend on the lookahead?
-$at_traceoff
-echo "actions.at:534: \$PREPARSER ./input '(x)'"
-echo actions.at:534 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(x)' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: ')' (2@20-29)
-line (0@0-29): '(' (0@0-9) thing (1@10-19) ')' (2@20-29)
-sending: EOF (3@30-39)
-input (0@29-29): /* Nothing */
-input (2@0-29): line (0@0-29) input (0@29-29)
-Freeing nterm input (2@0-29)
-Successful parse.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:534: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Check locations in error recovery
-# ---------------------------------
-# '(y)' is an error, but can be recovered from.  But what's the location
-# of the error itself ('y'), and of the resulting reduction ('(error)').
-$at_traceoff
-echo "actions.at:534: \$PREPARSER ./input '(y)'"
-echo actions.at:534 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(y)' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'y' (1@10-19)
-10-19: syntax error, unexpected 'y', expecting 'x'
-Freeing token 'y' (1@10-19)
-sending: ')' (2@20-29)
-line (-1@0-29): '(' (0@0-9) error (@10-19) ')' (2@20-29)
-sending: EOF (3@30-39)
-input (0@29-29): /* Nothing */
-input (2@0-29): line (-1@0-29) input (0@29-29)
-Freeing nterm input (2@0-29)
-Successful parse.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:534: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Syntax errors caught by the parser
-# ----------------------------------
-# Exercise the discarding of stack top and input until `error'
-# can be reduced.
-#
-#     '(', 'x', 'x', 'x', 'x', 'x', ')',
-#
-# Load the stack and provoke an error that cannot be caught by the
-# grammar, to check that the stack is cleared.  And make sure the
-# lookahead is freed.
-#
-#     '(', 'x', ')',
-#     '(', 'x', ')',
-#     'y'
-$at_traceoff
-echo "actions.at:534: \$PREPARSER ./input '(xxxxx)(x)(x)y'"
-echo actions.at:534 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(xxxxx)(x)(x)y' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: 'x' (2@20-29)
-thing (2@20-29): 'x' (2@20-29)
-sending: 'x' (3@30-39)
-30-39: syntax error, unexpected 'x', expecting ')'
-Freeing nterm thing (2@20-29)
-Freeing nterm thing (1@10-19)
-Freeing token 'x' (3@30-39)
-sending: 'x' (4@40-49)
-Freeing token 'x' (4@40-49)
-sending: 'x' (5@50-59)
-Freeing token 'x' (5@50-59)
-sending: ')' (6@60-69)
-line (-1@0-69): '(' (0@0-9) error (@10-59) ')' (6@60-69)
-sending: '(' (7@70-79)
-sending: 'x' (8@80-89)
-thing (8@80-89): 'x' (8@80-89)
-sending: ')' (9@90-99)
-line (7@70-99): '(' (7@70-79) thing (8@80-89) ')' (9@90-99)
-sending: '(' (10@100-109)
-sending: 'x' (11@110-119)
-thing (11@110-119): 'x' (11@110-119)
-sending: ')' (12@120-129)
-line (10@100-129): '(' (10@100-109) thing (11@110-119) ')' (12@120-129)
-sending: 'y' (13@130-139)
-input (0@129-129): /* Nothing */
-input (2@100-129): line (10@100-129) input (0@129-129)
-input (2@70-129): line (7@70-99) input (2@100-129)
-input (2@0-129): line (-1@0-69) input (2@70-129)
-130-139: syntax error, unexpected 'y', expecting \$end
-Freeing nterm input (2@0-129)
-Freeing token 'y' (13@130-139)
-Parsing FAILED.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "actions.at:534: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Check destruction upon stack overflow
-# -------------------------------------
-# Upon stack overflow, all symbols on the stack should be destroyed.
-# Only check for yacc.c.
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  56 ) # 56. actions.at:536: Printers and Destructors : %glr-parser
-    at_setup_line='actions.at:536'
-    at_desc='Printers and Destructors : %glr-parser'
-    $at_quiet $ECHO_N " 56: Printers and Destructors : %glr-parser       $ECHO_C"
-    at_xfail=no
-    (
-      echo "56. actions.at:536: testing ..."
-      $at_traceon
-
-
-
-# Make sure complex $n work.
-
-# Be sure to pass all the %directives to this macro to have correct
-# helping macros.  So don't put any directly in the Bison file.
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#define YYINITDEPTH 10
-#define YYMAXDEPTH 10
-#define RANGE(Location) (Location).first_line, (Location).last_line
-%}
-
-%error-verbose
-%debug
-%verbose
-%locations
-%glr-parser
-
-
-
-%{
-
-static int yylex (void);
-static void yyerror (const char *msg);
-%}
-
-
-
-%printer
-  {
-    fprintf (yyoutput, "%d", $$);
-  }
-  input line thing 'x' 'y'
-
-%destructor
-  { printf ("Freeing nterm input (%d@%d-%d)\n", $$, RANGE (@$)); }
-  input
-
-%destructor
-  { printf ("Freeing nterm line (%d@%d-%d)\n", $$, RANGE (@$)); }
-  line
-
-%destructor
-  { printf ("Freeing nterm thing (%d@%d-%d)\n", $$, RANGE (@$)); }
-  thing
-
-%destructor
-  { printf ("Freeing token 'x' (%d@%d-%d)\n", $$, RANGE (@$)); }
-  'x'
-
-%destructor
-  { printf ("Freeing token 'y' (%d@%d-%d)\n", $$, RANGE (@$)); }
-  'y'
-
-%%
-/*
-   This grammar is made to exercise error recovery.
-   "Lines" starting with `(' support error recovery, with
-   ')' as synchronizing token.  Lines starting with 'x' can never
-   be recovered from if in error.
-*/
-
-input:
-  /* Nothing. */
-    {
-      $$ = 0;
-      printf ("input (%d@%d-%d): /* Nothing */\n", $$, RANGE (@$));
-    }
-| line input /* Right recursive to load the stack so that popping at
-		EOF can	be exercised.  */
-    {
-      $$ = 2;
-      printf ("input (%d@%d-%d): line (%d@%d-%d) input (%d@%d-%d)\n",
-	      $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2));
-    }
-;
-
-line:
-  thing thing thing ';'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): thing (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ';' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2),
-              $3, RANGE (@3), $4, RANGE (@4));
-    }
-| '(' thing thing ')'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2),
-              $3, RANGE (@3), $4, RANGE (@4));
-    }
-| '(' thing ')'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), $3, RANGE (@3));
-    }
-| '(' error ')'
-    {
-      $$ = -1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) error (@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), RANGE (@2), $3, RANGE (@3));
-    }
-;
-
-thing:
-  'x'
-    {
-      $$ = $1;
-      printf ("thing (%d@%d-%d): 'x' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1));
-    }
-;
-%%
-/* Alias to ARGV[1]. */
-const char *source = 0;
-
-static int
-yylex (void)
-{
-  static unsigned int counter = 0;
-
-  int c = (yylval) = counter++;
-  /* As in BASIC, line numbers go from 10 to 10.  */
- (yylloc).first_line = (yylloc).first_column = 10 * c;
-  (yylloc).last_line = (yylloc).last_column = (yylloc).first_line + 9;
-
-
-  if (source[c])
-    printf ("sending: '%c'", source[c]);
-  else
-    printf ("sending: EOF");
-  printf (" (%d@%d-%d)\n", c, RANGE ((yylloc)));
-  return source[c];
-}
-
-static void
-yyerror (const char *msg)
-{
-  printf ("%d-%d: %s\n", RANGE (yylloc), msg);
-}
-
-int
-main (int argc, const char *argv[])
-{
-  int status;
-  yydebug = !!getenv ("YYDEBUG");
-  assert (argc == 2);
-  source = argv[1];
-  status = yyparse ();
-  switch (status)
-    {
-      case 0: printf ("Successful parse.\n"); break;
-      case 1: printf ("Parsing FAILED.\n"); break;
-      default: printf ("Parsing FAILED (status %d).\n", status); break;
-    }
-  return status;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "actions.at:536: bison -o input.c input.y"
-echo actions.at:536 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:536: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "actions.at:536: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o input input.c \$LIBS"
-echo actions.at:536 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o input input.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:536: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Check the location of "empty"
-# -----------------------------
-# I.e., epsilon-reductions, as in "(x)" which ends by reducing
-# an empty "line" nterm.
-# FIXME: This location is not satisfying.  Depend on the lookahead?
-$at_traceoff
-echo "actions.at:536: \$PREPARSER ./input '(x)'"
-echo actions.at:536 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(x)' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: ')' (2@20-29)
-line (0@0-29): '(' (0@0-9) thing (1@10-19) ')' (2@20-29)
-sending: EOF (3@30-39)
-input (0@29-29): /* Nothing */
-input (2@0-29): line (0@0-29) input (0@29-29)
-Freeing nterm input (2@0-29)
-Successful parse.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:536: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Check locations in error recovery
-# ---------------------------------
-# '(y)' is an error, but can be recovered from.  But what's the location
-# of the error itself ('y'), and of the resulting reduction ('(error)').
-$at_traceoff
-echo "actions.at:536: \$PREPARSER ./input '(y)'"
-echo actions.at:536 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(y)' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'y' (1@10-19)
-10-19: syntax error, unexpected 'y', expecting 'x'
-Freeing token 'y' (1@10-19)
-sending: ')' (2@20-29)
-line (-1@0-29): '(' (0@0-9) error (@10-19) ')' (2@20-29)
-sending: EOF (3@30-39)
-input (0@29-29): /* Nothing */
-input (2@0-29): line (-1@0-29) input (0@29-29)
-Freeing nterm input (2@0-29)
-Successful parse.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:536: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Syntax errors caught by the parser
-# ----------------------------------
-# Exercise the discarding of stack top and input until `error'
-# can be reduced.
-#
-#     '(', 'x', 'x', 'x', 'x', 'x', ')',
-#
-# Load the stack and provoke an error that cannot be caught by the
-# grammar, to check that the stack is cleared.  And make sure the
-# lookahead is freed.
-#
-#     '(', 'x', ')',
-#     '(', 'x', ')',
-#     'y'
-$at_traceoff
-echo "actions.at:536: \$PREPARSER ./input '(xxxxx)(x)(x)y'"
-echo actions.at:536 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(xxxxx)(x)(x)y' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: 'x' (2@20-29)
-thing (2@20-29): 'x' (2@20-29)
-sending: 'x' (3@30-39)
-30-39: syntax error, unexpected 'x', expecting ')'
-Freeing nterm thing (2@20-29)
-Freeing nterm thing (1@10-19)
-Freeing token 'x' (3@30-39)
-sending: 'x' (4@40-49)
-Freeing token 'x' (4@40-49)
-sending: 'x' (5@50-59)
-Freeing token 'x' (5@50-59)
-sending: ')' (6@60-69)
-line (-1@0-69): '(' (0@0-9) error (@10-59) ')' (6@60-69)
-sending: '(' (7@70-79)
-sending: 'x' (8@80-89)
-thing (8@80-89): 'x' (8@80-89)
-sending: ')' (9@90-99)
-line (7@70-99): '(' (7@70-79) thing (8@80-89) ')' (9@90-99)
-sending: '(' (10@100-109)
-sending: 'x' (11@110-119)
-thing (11@110-119): 'x' (11@110-119)
-sending: ')' (12@120-129)
-line (10@100-129): '(' (10@100-109) thing (11@110-119) ')' (12@120-129)
-sending: 'y' (13@130-139)
-input (0@129-129): /* Nothing */
-input (2@100-129): line (10@100-129) input (0@129-129)
-input (2@70-129): line (7@70-99) input (2@100-129)
-input (2@0-129): line (-1@0-69) input (2@70-129)
-130-139: syntax error, unexpected 'y', expecting \$end
-Freeing nterm input (2@0-129)
-Freeing token 'y' (13@130-139)
-Parsing FAILED.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "actions.at:536: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Check destruction upon stack overflow
-# -------------------------------------
-# Upon stack overflow, all symbols on the stack should be destroyed.
-# Only check for yacc.c.
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  57 ) # 57. actions.at:537: Printers and Destructors with union: %glr-parser
-    at_setup_line='actions.at:537'
-    at_desc='Printers and Destructors with union: %glr-parser'
-    $at_quiet $ECHO_N " 57: Printers and Destructors with union: %glr-parser$ECHO_C"
-    at_xfail=no
-    (
-      echo "57. actions.at:537: testing ..."
-      $at_traceon
-
-
-
-# Make sure complex $n work.
-
-# Be sure to pass all the %directives to this macro to have correct
-# helping macros.  So don't put any directly in the Bison file.
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#define YYINITDEPTH 10
-#define YYMAXDEPTH 10
-#define RANGE(Location) (Location).first_line, (Location).last_line
-%}
-
-%error-verbose
-%debug
-%verbose
-%locations
-%glr-parser
-%union
-{
-  int ival;
-}
-
-
-%{
-
-static int yylex (void);
-static void yyerror (const char *msg);
-%}
-
-%type <ival> '(' 'x' 'y' ')' ';' thing line input
-
-%printer
-  {
-    fprintf (yyoutput, "%d", $$);
-  }
-  input line thing 'x' 'y'
-
-%destructor
-  { printf ("Freeing nterm input (%d@%d-%d)\n", $$, RANGE (@$)); }
-  input
-
-%destructor
-  { printf ("Freeing nterm line (%d@%d-%d)\n", $$, RANGE (@$)); }
-  line
-
-%destructor
-  { printf ("Freeing nterm thing (%d@%d-%d)\n", $$, RANGE (@$)); }
-  thing
-
-%destructor
-  { printf ("Freeing token 'x' (%d@%d-%d)\n", $$, RANGE (@$)); }
-  'x'
-
-%destructor
-  { printf ("Freeing token 'y' (%d@%d-%d)\n", $$, RANGE (@$)); }
-  'y'
-
-%%
-/*
-   This grammar is made to exercise error recovery.
-   "Lines" starting with `(' support error recovery, with
-   ')' as synchronizing token.  Lines starting with 'x' can never
-   be recovered from if in error.
-*/
-
-input:
-  /* Nothing. */
-    {
-      $$ = 0;
-      printf ("input (%d@%d-%d): /* Nothing */\n", $$, RANGE (@$));
-    }
-| line input /* Right recursive to load the stack so that popping at
-		EOF can	be exercised.  */
-    {
-      $$ = 2;
-      printf ("input (%d@%d-%d): line (%d@%d-%d) input (%d@%d-%d)\n",
-	      $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2));
-    }
-;
-
-line:
-  thing thing thing ';'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): thing (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ';' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2),
-              $3, RANGE (@3), $4, RANGE (@4));
-    }
-| '(' thing thing ')'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2),
-              $3, RANGE (@3), $4, RANGE (@4));
-    }
-| '(' thing ')'
-    {
-      $$ = $1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), $3, RANGE (@3));
-    }
-| '(' error ')'
-    {
-      $$ = -1;
-      printf ("line (%d@%d-%d): '(' (%d@%d-%d) error (@%d-%d) ')' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1), RANGE (@2), $3, RANGE (@3));
-    }
-;
-
-thing:
-  'x'
-    {
-      $$ = $1;
-      printf ("thing (%d@%d-%d): 'x' (%d@%d-%d)\n",
-              $$, RANGE (@$), $1, RANGE (@1));
-    }
-;
-%%
-/* Alias to ARGV[1]. */
-const char *source = 0;
-
-static int
-yylex (void)
-{
-  static unsigned int counter = 0;
-
-  int c = (yylval).ival = counter++;
-  /* As in BASIC, line numbers go from 10 to 10.  */
- (yylloc).first_line = (yylloc).first_column = 10 * c;
-  (yylloc).last_line = (yylloc).last_column = (yylloc).first_line + 9;
-
-
-  if (source[c])
-    printf ("sending: '%c'", source[c]);
-  else
-    printf ("sending: EOF");
-  printf (" (%d@%d-%d)\n", c, RANGE ((yylloc)));
-  return source[c];
-}
-
-static void
-yyerror (const char *msg)
-{
-  printf ("%d-%d: %s\n", RANGE (yylloc), msg);
-}
-
-int
-main (int argc, const char *argv[])
-{
-  int status;
-  yydebug = !!getenv ("YYDEBUG");
-  assert (argc == 2);
-  source = argv[1];
-  status = yyparse ();
-  switch (status)
-    {
-      case 0: printf ("Successful parse.\n"); break;
-      case 1: printf ("Parsing FAILED.\n"); break;
-      default: printf ("Parsing FAILED (status %d).\n", status); break;
-    }
-  return status;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "actions.at:537: bison -o input.c input.y"
-echo actions.at:537 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:537: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "actions.at:537: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o input input.c \$LIBS"
-echo actions.at:537 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o input input.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:537: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Check the location of "empty"
-# -----------------------------
-# I.e., epsilon-reductions, as in "(x)" which ends by reducing
-# an empty "line" nterm.
-# FIXME: This location is not satisfying.  Depend on the lookahead?
-$at_traceoff
-echo "actions.at:537: \$PREPARSER ./input '(x)'"
-echo actions.at:537 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(x)' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: ')' (2@20-29)
-line (0@0-29): '(' (0@0-9) thing (1@10-19) ')' (2@20-29)
-sending: EOF (3@30-39)
-input (0@29-29): /* Nothing */
-input (2@0-29): line (0@0-29) input (0@29-29)
-Freeing nterm input (2@0-29)
-Successful parse.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:537: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Check locations in error recovery
-# ---------------------------------
-# '(y)' is an error, but can be recovered from.  But what's the location
-# of the error itself ('y'), and of the resulting reduction ('(error)').
-$at_traceoff
-echo "actions.at:537: \$PREPARSER ./input '(y)'"
-echo actions.at:537 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(y)' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'y' (1@10-19)
-10-19: syntax error, unexpected 'y', expecting 'x'
-Freeing token 'y' (1@10-19)
-sending: ')' (2@20-29)
-line (-1@0-29): '(' (0@0-9) error (@10-19) ')' (2@20-29)
-sending: EOF (3@30-39)
-input (0@29-29): /* Nothing */
-input (2@0-29): line (-1@0-29) input (0@29-29)
-Freeing nterm input (2@0-29)
-Successful parse.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "actions.at:537: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Syntax errors caught by the parser
-# ----------------------------------
-# Exercise the discarding of stack top and input until `error'
-# can be reduced.
-#
-#     '(', 'x', 'x', 'x', 'x', 'x', ')',
-#
-# Load the stack and provoke an error that cannot be caught by the
-# grammar, to check that the stack is cleared.  And make sure the
-# lookahead is freed.
-#
-#     '(', 'x', ')',
-#     '(', 'x', ')',
-#     'y'
-$at_traceoff
-echo "actions.at:537: \$PREPARSER ./input '(xxxxx)(x)(x)y'"
-echo actions.at:537 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '(xxxxx)(x)(x)y' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "sending: '(' (0@0-9)
-sending: 'x' (1@10-19)
-thing (1@10-19): 'x' (1@10-19)
-sending: 'x' (2@20-29)
-thing (2@20-29): 'x' (2@20-29)
-sending: 'x' (3@30-39)
-30-39: syntax error, unexpected 'x', expecting ')'
-Freeing nterm thing (2@20-29)
-Freeing nterm thing (1@10-19)
-Freeing token 'x' (3@30-39)
-sending: 'x' (4@40-49)
-Freeing token 'x' (4@40-49)
-sending: 'x' (5@50-59)
-Freeing token 'x' (5@50-59)
-sending: ')' (6@60-69)
-line (-1@0-69): '(' (0@0-9) error (@10-59) ')' (6@60-69)
-sending: '(' (7@70-79)
-sending: 'x' (8@80-89)
-thing (8@80-89): 'x' (8@80-89)
-sending: ')' (9@90-99)
-line (7@70-99): '(' (7@70-79) thing (8@80-89) ')' (9@90-99)
-sending: '(' (10@100-109)
-sending: 'x' (11@110-119)
-thing (11@110-119): 'x' (11@110-119)
-sending: ')' (12@120-129)
-line (10@100-129): '(' (10@100-109) thing (11@110-119) ')' (12@120-129)
-sending: 'y' (13@130-139)
-input (0@129-129): /* Nothing */
-input (2@100-129): line (10@100-129) input (0@129-129)
-input (2@70-129): line (7@70-99) input (2@100-129)
-input (2@0-129): line (-1@0-69) input (2@70-129)
-130-139: syntax error, unexpected 'y', expecting \$end
-Freeing nterm input (2@0-129)
-Freeing token 'y' (13@130-139)
-Parsing FAILED.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "actions.at:537: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Check destruction upon stack overflow
-# -------------------------------------
-# Upon stack overflow, all symbols on the stack should be destroyed.
-# Only check for yacc.c.
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-8 ) # Banner 8. conflicts.at:20
-    cat <<\_ATEOF
-
-Conflicts.
-
-_ATEOF
-    ;;
-
-  58 ) # 58. conflicts.at:32: S/R in initial
-    at_setup_line='conflicts.at:32'
-    at_desc='S/R in initial'
-    $at_quiet $ECHO_N " 58: S/R in initial                               $ECHO_C"
-    at_xfail=no
-    (
-      echo "58. conflicts.at:32: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%expect 1
-%%
-exp: e 'e';
-e: 'e' | /* Nothing. */;
-_ATEOF
-
-
-$at_traceoff
-echo "conflicts.at:43: bison -o input.c input.y"
-echo conflicts.at:43 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y:4.9: warning: rule never reduced because of conflicts: e: /* empty */
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:43: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  59 ) # 59. conflicts.at:52: %nonassoc and eof
-    at_setup_line='conflicts.at:52'
-    at_desc='%nonassoc and eof'
-    $at_quiet $ECHO_N " 59: %nonassoc and eof                            $ECHO_C"
-    at_xfail=no
-    (
-      echo "59. conflicts.at:52: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-%{
-#include <stdio.h>
-#include <stdlib.h>
-
-#define YYERROR_VERBOSE 1
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-/* The current argument. */
-static const char *input = NULL;
-
-static int
-yylex (void)
-{
-  /* No token stands for end of file. */
-  if (input && *input)
-    return *input++;
-  else
-    return 0;
-}
-
-%}
-
-%nonassoc '<' '>'
-
-%%
-expr: expr '<' expr
-    | expr '>' expr
-    | '0'
-    ;
-%%
-int
-main (int argc, const char *argv[])
-{
-  if (argc > 1)
-    input = argv[1];
-  return yyparse ();
-}
-_ATEOF
-
-
-
-# Specify the output files to avoid problems on different file systems.
-$at_traceoff
-echo "conflicts.at:100: bison -o input.c input.y"
-echo conflicts.at:100 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:100: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "conflicts.at:101: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o input input.c \$LIBS"
-echo conflicts.at:101 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o input input.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:101: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "conflicts.at:103: \$PREPARSER ./input '0<0'"
-echo conflicts.at:103 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '0<0' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:103: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# FIXME: This is an actual bug, but a new one, in the sense that
-# no one has ever spotted it!  The messages are *wrong*: there should
-# be nothing there, it should be expected eof.
-$at_traceoff
-echo "conflicts.at:109: \$PREPARSER ./input '0<0<0'"
-echo conflicts.at:109 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '0<0<0' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error, unexpected '<', expecting '<' or '>'
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "conflicts.at:109: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "conflicts.at:111: \$PREPARSER ./input '0>0'"
-echo conflicts.at:111 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '0>0' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:111: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "conflicts.at:114: \$PREPARSER ./input '0>0>0'"
-echo conflicts.at:114 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '0>0>0' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error, unexpected '>', expecting '<' or '>'
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "conflicts.at:114: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "conflicts.at:118: \$PREPARSER ./input '0<0>0'"
-echo conflicts.at:118 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input '0<0>0' ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error, unexpected '>', expecting '<' or '>'
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "conflicts.at:118: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  60 ) # 60. conflicts.at:128: Unresolved SR Conflicts
-    at_setup_line='conflicts.at:128'
-    at_desc='Unresolved SR Conflicts'
-    $at_quiet $ECHO_N " 60: Unresolved SR Conflicts                      $ECHO_C"
-    at_xfail=no
-    (
-      echo "60. conflicts.at:128: testing ..."
-      $at_traceon
-
-
-
-
-cat >input.y <<'_ATEOF'
-%token NUM OP
-%%
-exp: exp OP exp | NUM;
-_ATEOF
-
-
-$at_traceoff
-echo "conflicts.at:140: bison -o input.c --report=all input.y"
-echo conflicts.at:140 >$at_check_line_file
-( $at_traceon; bison -o input.c --report=all input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y: conflicts: 1 shift/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:140: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Check the contents of the report.
-$at_traceoff
-echo "conflicts.at:225: cat input.output"
-echo conflicts.at:225 >$at_check_line_file
-( $at_traceon; cat input.output ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "State 5 conflicts: 1 shift/reduce
-
-
-Grammar
-
-    0 \$accept: exp \$end
-
-    1 exp: exp OP exp
-    2    | NUM
-
-
-Terminals, with rules where they appear
-
-\$end (0) 0
-error (256)
-NUM (258) 2
-OP (259) 1
-
-
-Nonterminals, with rules where they appear
-
-\$accept (5)
-    on left: 0
-exp (6)
-    on left: 1 2, on right: 0 1
-
-
-state 0
-
-    0 \$accept: . exp \$end
-    1 exp: . exp OP exp
-    2    | . NUM
-
-    NUM  shift, and go to state 1
-
-    exp  go to state 2
-
-
-state 1
-
-    2 exp: NUM .
-
-    \$default  reduce using rule 2 (exp)
-
-
-state 2
-
-    0 \$accept: exp . \$end
-    1 exp: exp . OP exp
-
-    \$end  shift, and go to state 3
-    OP    shift, and go to state 4
-
-
-state 3
-
-    0 \$accept: exp \$end .
-
-    \$default  accept
-
-
-state 4
-
-    1 exp: . exp OP exp
-    1    | exp OP . exp
-    2    | . NUM
-
-    NUM  shift, and go to state 1
-
-    exp  go to state 5
-
-
-state 5
-
-    1 exp: exp . OP exp  [\$end, OP]
-    1    | exp OP exp .  [\$end, OP]
-
-    OP  shift, and go to state 4
-
-    OP        [reduce using rule 1 (exp)]
-    \$default  reduce using rule 1 (exp)
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:225: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  61 ) # 61. conflicts.at:235: Resolved SR Conflicts
-    at_setup_line='conflicts.at:235'
-    at_desc='Resolved SR Conflicts'
-    $at_quiet $ECHO_N " 61: Resolved SR Conflicts                        $ECHO_C"
-    at_xfail=no
-    (
-      echo "61. conflicts.at:235: testing ..."
-      $at_traceon
-
-
-
-
-cat >input.y <<'_ATEOF'
-%token NUM OP
-%left OP
-%%
-exp: exp OP exp | NUM;
-_ATEOF
-
-
-$at_traceoff
-echo "conflicts.at:246: bison -o input.c --report=all input.y"
-echo conflicts.at:246 >$at_check_line_file
-( $at_traceon; bison -o input.c --report=all input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:246: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Check the contents of the report.
-$at_traceoff
-echo "conflicts.at:327: cat input.output"
-echo conflicts.at:327 >$at_check_line_file
-( $at_traceon; cat input.output ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "Grammar
-
-    0 \$accept: exp \$end
-
-    1 exp: exp OP exp
-    2    | NUM
-
-
-Terminals, with rules where they appear
-
-\$end (0) 0
-error (256)
-NUM (258) 2
-OP (259) 1
-
-
-Nonterminals, with rules where they appear
-
-\$accept (5)
-    on left: 0
-exp (6)
-    on left: 1 2, on right: 0 1
-
-
-state 0
-
-    0 \$accept: . exp \$end
-    1 exp: . exp OP exp
-    2    | . NUM
-
-    NUM  shift, and go to state 1
-
-    exp  go to state 2
-
-
-state 1
-
-    2 exp: NUM .
-
-    \$default  reduce using rule 2 (exp)
-
-
-state 2
-
-    0 \$accept: exp . \$end
-    1 exp: exp . OP exp
-
-    \$end  shift, and go to state 3
-    OP    shift, and go to state 4
-
-
-state 3
-
-    0 \$accept: exp \$end .
-
-    \$default  accept
-
-
-state 4
-
-    1 exp: . exp OP exp
-    1    | exp OP . exp
-    2    | . NUM
-
-    NUM  shift, and go to state 1
-
-    exp  go to state 5
-
-
-state 5
-
-    1 exp: exp . OP exp  [\$end, OP]
-    1    | exp OP exp .  [\$end, OP]
-
-    \$default  reduce using rule 1 (exp)
-
-    Conflict between rule 1 and token OP resolved as reduce (%left OP).
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:327: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  62 ) # 62. conflicts.at:357: Defaulted Conflicted Reduction
-    at_setup_line='conflicts.at:357'
-    at_desc='Defaulted Conflicted Reduction'
-    $at_quiet $ECHO_N " 62: Defaulted Conflicted Reduction               $ECHO_C"
-    at_xfail=no
-    (
-      echo "62. conflicts.at:357: testing ..."
-      $at_traceon
-
-
-
-cat >input.y <<'_ATEOF'
-%%
-exp: num | id;
-num: '0';
-id : '0';
-%%
-_ATEOF
-
-
-$at_traceoff
-echo "conflicts.at:371: bison -o input.c --report=all input.y"
-echo conflicts.at:371 >$at_check_line_file
-( $at_traceon; bison -o input.c --report=all input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y: conflicts: 1 reduce/reduce
-input.y:4.6-8: warning: rule never reduced because of conflicts: id: '0'
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:371: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Check the contents of the report.
-$at_traceoff
-echo "conflicts.at:465: cat input.output"
-echo conflicts.at:465 >$at_check_line_file
-( $at_traceon; cat input.output ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "Rules never reduced
-
-    4 id: '0'
-
-
-State 1 conflicts: 1 reduce/reduce
-
-
-Grammar
-
-    0 \$accept: exp \$end
-
-    1 exp: num
-    2    | id
-
-    3 num: '0'
-
-    4 id: '0'
-
-
-Terminals, with rules where they appear
-
-\$end (0) 0
-'0' (48) 3 4
-error (256)
-
-
-Nonterminals, with rules where they appear
-
-\$accept (4)
-    on left: 0
-exp (5)
-    on left: 1 2, on right: 0
-num (6)
-    on left: 3, on right: 1
-id (7)
-    on left: 4, on right: 2
-
-
-state 0
-
-    0 \$accept: . exp \$end
-    1 exp: . num
-    2    | . id
-    3 num: . '0'
-    4 id: . '0'
-
-    '0'  shift, and go to state 1
-
-    exp  go to state 2
-    num  go to state 3
-    id   go to state 4
-
-
-state 1
-
-    3 num: '0' .  [\$end]
-    4 id: '0' .  [\$end]
-
-    \$end      reduce using rule 3 (num)
-    \$end      [reduce using rule 4 (id)]
-    \$default  reduce using rule 3 (num)
-
-
-state 2
-
-    0 \$accept: exp . \$end
-
-    \$end  shift, and go to state 5
-
-
-state 3
-
-    1 exp: num .
-
-    \$default  reduce using rule 1 (exp)
-
-
-state 4
-
-    2 exp: id .
-
-    \$default  reduce using rule 2 (exp)
-
-
-state 5
-
-    0 \$accept: exp \$end .
-
-    \$default  accept
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:465: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  63 ) # 63. conflicts.at:476: %expect not enough
-    at_setup_line='conflicts.at:476'
-    at_desc='%expect not enough'
-    $at_quiet $ECHO_N " 63: %expect not enough                           $ECHO_C"
-    at_xfail=no
-    (
-      echo "63. conflicts.at:476: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%token NUM OP
-%expect 0
-%%
-exp: exp OP exp | NUM;
-_ATEOF
-
-
-$at_traceoff
-echo "conflicts.at:488: bison -o input.c input.y"
-echo conflicts.at:488 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y: conflicts: 1 shift/reduce
-input.y: expected 0 shift/reduce conflicts
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "conflicts.at:488: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  64 ) # 64. conflicts.at:496: %expect right
-    at_setup_line='conflicts.at:496'
-    at_desc='%expect right'
-    $at_quiet $ECHO_N " 64: %expect right                                $ECHO_C"
-    at_xfail=no
-    (
-      echo "64. conflicts.at:496: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%token NUM OP
-%expect 1
-%%
-exp: exp OP exp | NUM;
-_ATEOF
-
-
-$at_traceoff
-echo "conflicts.at:505: bison -o input.c input.y"
-echo conflicts.at:505 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:505: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  65 ) # 65. conflicts.at:513: %expect too much
-    at_setup_line='conflicts.at:513'
-    at_desc='%expect too much'
-    $at_quiet $ECHO_N " 65: %expect too much                             $ECHO_C"
-    at_xfail=no
-    (
-      echo "65. conflicts.at:513: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%token NUM OP
-%expect 2
-%%
-exp: exp OP exp | NUM;
-_ATEOF
-
-
-$at_traceoff
-echo "conflicts.at:525: bison -o input.c input.y"
-echo conflicts.at:525 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y: conflicts: 1 shift/reduce
-input.y: expected 2 shift/reduce conflicts
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "conflicts.at:525: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  66 ) # 66. conflicts.at:533: %expect with reduce conflicts
-    at_setup_line='conflicts.at:533'
-    at_desc='%expect with reduce conflicts'
-    $at_quiet $ECHO_N " 66: %expect with reduce conflicts                $ECHO_C"
-    at_xfail=no
-    (
-      echo "66. conflicts.at:533: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%expect 0
-%%
-program: a 'a' | a a;
-a: 'a';
-_ATEOF
-
-
-$at_traceoff
-echo "conflicts.at:545: bison -o input.c input.y"
-echo conflicts.at:545 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y: conflicts: 1 reduce/reduce
-input.y: expected 0 reduce/reduce conflicts
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "conflicts.at:545: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  67 ) # 67. conflicts.at:553: %no-default-prec without %prec
-    at_setup_line='conflicts.at:553'
-    at_desc='%no-default-prec without %prec'
-    $at_quiet $ECHO_N " 67: %no-default-prec without %prec               $ECHO_C"
-    at_xfail=no
-    (
-      echo "67. conflicts.at:553: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%left '+'
-%left '*'
-
-%%
-
-%no-default-prec;
-
-e:   e '+' e
-   | e '*' e
-   | '0'
-   ;
-_ATEOF
-
-
-$at_traceoff
-echo "conflicts.at:571: bison -o input.c input.y"
-echo conflicts.at:571 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y: conflicts: 4 shift/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:571: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  68 ) # 68. conflicts.at:579: %no-default-prec with %prec
-    at_setup_line='conflicts.at:579'
-    at_desc='%no-default-prec with %prec'
-    $at_quiet $ECHO_N " 68: %no-default-prec with %prec                  $ECHO_C"
-    at_xfail=no
-    (
-      echo "68. conflicts.at:579: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%left '+'
-%left '*'
-
-%%
-
-%no-default-prec;
-
-e:   e '+' e %prec '+'
-   | e '*' e %prec '*'
-   | '0'
-   ;
-_ATEOF
-
-
-$at_traceoff
-echo "conflicts.at:595: bison -o input.c input.y"
-echo conflicts.at:595 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  69 ) # 69. conflicts.at:603: %default-prec
-    at_setup_line='conflicts.at:603'
-    at_desc='%default-prec'
-    $at_quiet $ECHO_N " 69: %default-prec                                $ECHO_C"
-    at_xfail=no
-    (
-      echo "69. conflicts.at:603: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%left '+'
-%left '*'
-
-%%
-
-%default-prec;
-
-e:   e '+' e
-   | e '*' e
-   | '0'
-   ;
-_ATEOF
-
-
-$at_traceoff
-echo "conflicts.at:619: bison -o input.c input.y"
-echo conflicts.at:619 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "conflicts.at:619: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-9 ) # Banner 9. calc.at:541
-    cat <<\_ATEOF
-
-Simple LALR(1) Calculator.
-
-_ATEOF
-    ;;
-
-  70 ) # 70. calc.at:550: Calculator
-    at_setup_line='calc.at:550'
-    at_desc='Calculator '
-    $at_quiet $ECHO_N " 70: Calculator                                   $ECHO_C"
-    at_xfail=no
-    (
-      echo "70. calc.at:550: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-    }
-
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:550: bison -o calc.c calc.y"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:550: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:550: \$PREPARSER ./calc input"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:550: \$PREPARSER ./calc input"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:550: cat stderr"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:550: \$PREPARSER ./calc input"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:550: cat stderr"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:550: \$PREPARSER ./calc input"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:550: cat stderr"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:550: \$PREPARSER ./calc input"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:550: cat stderr"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:550: \$PREPARSER ./calc input"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:550: cat stderr"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:550: \$PREPARSER ./calc /dev/null"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:550: cat stderr"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:550: \$PREPARSER ./calc input"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:550: cat stderr"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:550: \$PREPARSER ./calc input"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:550: cat stderr"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:550: \$PREPARSER ./calc input"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:550: cat stderr"
-echo calc.at:550 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  71 ) # 71. calc.at:552: Calculator %defines
-    at_setup_line='calc.at:552'
-    at_desc='Calculator %defines'
-    $at_quiet $ECHO_N " 71: Calculator %defines                          $ECHO_C"
-    at_xfail=no
-    (
-      echo "71. calc.at:552: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%defines
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-    }
-
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:552: bison -o calc.c calc.y"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:552: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:552: \$PREPARSER ./calc input"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:552: \$PREPARSER ./calc input"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:552: cat stderr"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:552: \$PREPARSER ./calc input"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:552: cat stderr"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:552: \$PREPARSER ./calc input"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:552: cat stderr"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:552: \$PREPARSER ./calc input"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:552: cat stderr"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:552: \$PREPARSER ./calc input"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:552: cat stderr"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:552: \$PREPARSER ./calc /dev/null"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:552: cat stderr"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:552: \$PREPARSER ./calc input"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:552: cat stderr"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:552: \$PREPARSER ./calc input"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:552: cat stderr"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:552: \$PREPARSER ./calc input"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:552: cat stderr"
-echo calc.at:552 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:552: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  72 ) # 72. calc.at:553: Calculator %locations
-    at_setup_line='calc.at:553'
-    at_desc='Calculator %locations'
-    $at_quiet $ECHO_N " 72: Calculator %locations                        $ECHO_C"
-    at_xfail=no
-    (
-      echo "72. calc.at:553: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%locations
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%d.%d",
-           (yylloc).first_line, (yylloc).first_column);
-  if ((yylloc).first_line != (yylloc).last_line)
-    fprintf (stderr, "-%d.%d",
-	     (yylloc).last_line,  (yylloc).last_column - 1);
-  else if ((yylloc).first_column != (yylloc).last_column - 1)
-    fprintf (stderr, "-%d",
-	     (yylloc).last_column - 1);
-  fprintf (stderr, ": ");
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  last_yylloc = (yylloc);
-  if (res == '\n')
-    {
-      (yylloc).last_line++;
-      (yylloc).last_column = 0;
-    }
-  else
-    (yylloc).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  /* Wrong when C == `\n'. */
-  (yylloc) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (yylloc).last_column = 0;
-      (yylloc).last_line = 1;
-
-    }
-
-
- (yylloc).first_column = (yylloc).last_column;
-  (yylloc).first_line   = (yylloc).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-     (yylloc).first_column = (yylloc).last_column;
-      (yylloc).first_line   = (yylloc).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:553: bison -o calc.c calc.y"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:553: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:553: \$PREPARSER ./calc input"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:553: \$PREPARSER ./calc input"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:553: cat stderr"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:553: \$PREPARSER ./calc input"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:553: cat stderr"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:553: \$PREPARSER ./calc input"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:553: cat stderr"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:553: \$PREPARSER ./calc input"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:553: cat stderr"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:553: \$PREPARSER ./calc input"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:553: cat stderr"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:553: \$PREPARSER ./calc /dev/null"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:553: cat stderr"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:553: \$PREPARSER ./calc input"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:553: cat stderr"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:553: \$PREPARSER ./calc input"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:553: cat stderr"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:553: \$PREPARSER ./calc input"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:553: cat stderr"
-echo calc.at:553 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:553: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  73 ) # 73. calc.at:554: Calculator %name-prefix="calc"
-    at_setup_line='calc.at:554'
-    at_desc='Calculator %name-prefix="calc"'
-    $at_quiet $ECHO_N " 73: Calculator %name-prefix="calc"               $ECHO_C"
-    at_xfail=no
-    (
-      echo "73. calc.at:554: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%name-prefix="calc"
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-    }
-
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:554: bison -o calc.c calc.y"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:554: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:554: \$PREPARSER ./calc input"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:554: \$PREPARSER ./calc input"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:554: cat stderr"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:554: \$PREPARSER ./calc input"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:554: cat stderr"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:554: \$PREPARSER ./calc input"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:554: cat stderr"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:554: \$PREPARSER ./calc input"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:554: cat stderr"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:554: \$PREPARSER ./calc input"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:554: cat stderr"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:554: \$PREPARSER ./calc /dev/null"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:554: cat stderr"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:554: \$PREPARSER ./calc input"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:554: cat stderr"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:554: \$PREPARSER ./calc input"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:554: cat stderr"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:554: \$PREPARSER ./calc input"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:554: cat stderr"
-echo calc.at:554 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:554: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  74 ) # 74. calc.at:555: Calculator %verbose
-    at_setup_line='calc.at:555'
-    at_desc='Calculator %verbose'
-    $at_quiet $ECHO_N " 74: Calculator %verbose                          $ECHO_C"
-    at_xfail=no
-    (
-      echo "74. calc.at:555: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%verbose
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-    }
-
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:555: bison -o calc.c calc.y"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:555: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:555: \$PREPARSER ./calc input"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:555: \$PREPARSER ./calc input"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:555: cat stderr"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:555: \$PREPARSER ./calc input"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:555: cat stderr"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:555: \$PREPARSER ./calc input"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:555: cat stderr"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:555: \$PREPARSER ./calc input"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:555: cat stderr"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:555: \$PREPARSER ./calc input"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:555: cat stderr"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:555: \$PREPARSER ./calc /dev/null"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:555: cat stderr"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:555: \$PREPARSER ./calc input"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:555: cat stderr"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:555: \$PREPARSER ./calc input"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:555: cat stderr"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:555: \$PREPARSER ./calc input"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:555: cat stderr"
-echo calc.at:555 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:555: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  75 ) # 75. calc.at:556: Calculator %yacc
-    at_setup_line='calc.at:556'
-    at_desc='Calculator %yacc'
-    $at_quiet $ECHO_N " 75: Calculator %yacc                             $ECHO_C"
-    at_xfail=no
-    (
-      echo "75. calc.at:556: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%yacc
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-    }
-
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:556: bison -o calc.c calc.y"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:556: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:556: \$PREPARSER ./calc input"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:556: \$PREPARSER ./calc input"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:556: cat stderr"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:556: \$PREPARSER ./calc input"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:556: cat stderr"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:556: \$PREPARSER ./calc input"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:556: cat stderr"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:556: \$PREPARSER ./calc input"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:556: cat stderr"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:556: \$PREPARSER ./calc input"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:556: cat stderr"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:556: \$PREPARSER ./calc /dev/null"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:556: cat stderr"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:556: \$PREPARSER ./calc input"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:556: cat stderr"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:556: \$PREPARSER ./calc input"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:556: cat stderr"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:556: \$PREPARSER ./calc input"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:556: cat stderr"
-echo calc.at:556 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  76 ) # 76. calc.at:557: Calculator %error-verbose
-    at_setup_line='calc.at:557'
-    at_desc='Calculator %error-verbose'
-    $at_quiet $ECHO_N " 76: Calculator %error-verbose                    $ECHO_C"
-    at_xfail=no
-    (
-      echo "76. calc.at:557: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%error-verbose
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-    }
-
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:557: bison -o calc.c calc.y"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:557: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:557: \$PREPARSER ./calc input"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:557: \$PREPARSER ./calc input"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:557: cat stderr"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:557: \$PREPARSER ./calc input"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:557: cat stderr"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:557: \$PREPARSER ./calc input"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:557: cat stderr"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:557: \$PREPARSER ./calc input"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:557: cat stderr"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:557: \$PREPARSER ./calc input"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:557: cat stderr"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:557: \$PREPARSER ./calc /dev/null"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:557: cat stderr"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:557: \$PREPARSER ./calc input"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:557: cat stderr"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:557: \$PREPARSER ./calc input"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:557: cat stderr"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:557: \$PREPARSER ./calc input"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:557: cat stderr"
-echo calc.at:557 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:557: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  77 ) # 77. calc.at:559: Calculator %pure-parser %locations
-    at_setup_line='calc.at:559'
-    at_desc='Calculator %pure-parser %locations'
-    $at_quiet $ECHO_N " 77: Calculator %pure-parser %locations           $ECHO_C"
-    at_xfail=no
-    (
-      echo "77. calc.at:559: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%pure-parser %locations
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-static int get_char (YYSTYPE *lvalp, YYLTYPE *llocp);
-static void unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int res = getc (input);
-  (void) lvalp;(void) llocp;
-
-  last_yylloc = (*llocp);
-  if (res == '\n')
-    {
-      (*llocp).last_line++;
-      (*llocp).last_column = 0;
-    }
-  else
-    (*llocp).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c)
-{
-  (void) lvalp;(void) llocp;
-
-  /* Wrong when C == `\n'. */
-  (*llocp) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int c = get_char (lvalp, llocp);
-  int sign = 1;
-  int n = 0;
-
-  (void) lvalp;(void) llocp;
-  if (c == '-')
-    {
-      c = get_char (lvalp, llocp);
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char (lvalp, llocp);
-    }
-
-  unget_char (lvalp, llocp,  c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (*llocp).last_column = 0;
-      (*llocp).last_line = 1;
-
-    }
-
-
- (*llocp).first_column = (*llocp).last_column;
-  (*llocp).first_line   = (*llocp).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char (lvalp, llocp)) == ' ' || c == '\t')
-    {
-     (*llocp).first_column = (*llocp).last_column;
-      (*llocp).first_line   = (*llocp).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char (lvalp, llocp,  c);
-      (*lvalp).ival = read_signed_integer (lvalp, llocp);
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:559: bison -o calc.c calc.y"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:559: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:559: \$PREPARSER ./calc input"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:559: \$PREPARSER ./calc input"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:559: cat stderr"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:559: \$PREPARSER ./calc input"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:559: cat stderr"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:559: \$PREPARSER ./calc input"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:559: cat stderr"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:559: \$PREPARSER ./calc input"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:559: cat stderr"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:559: \$PREPARSER ./calc input"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:559: cat stderr"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:559: \$PREPARSER ./calc /dev/null"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:559: cat stderr"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:559: \$PREPARSER ./calc input"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:559: cat stderr"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:559: \$PREPARSER ./calc input"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:559: cat stderr"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:559: \$PREPARSER ./calc input"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:559: cat stderr"
-echo calc.at:559 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:559: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  78 ) # 78. calc.at:560: Calculator %error-verbose %locations
-    at_setup_line='calc.at:560'
-    at_desc='Calculator %error-verbose %locations'
-    $at_quiet $ECHO_N " 78: Calculator %error-verbose %locations         $ECHO_C"
-    at_xfail=no
-    (
-      echo "78. calc.at:560: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%error-verbose %locations
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%d.%d",
-           (yylloc).first_line, (yylloc).first_column);
-  if ((yylloc).first_line != (yylloc).last_line)
-    fprintf (stderr, "-%d.%d",
-	     (yylloc).last_line,  (yylloc).last_column - 1);
-  else if ((yylloc).first_column != (yylloc).last_column - 1)
-    fprintf (stderr, "-%d",
-	     (yylloc).last_column - 1);
-  fprintf (stderr, ": ");
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  last_yylloc = (yylloc);
-  if (res == '\n')
-    {
-      (yylloc).last_line++;
-      (yylloc).last_column = 0;
-    }
-  else
-    (yylloc).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  /* Wrong when C == `\n'. */
-  (yylloc) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (yylloc).last_column = 0;
-      (yylloc).last_line = 1;
-
-    }
-
-
- (yylloc).first_column = (yylloc).last_column;
-  (yylloc).first_line   = (yylloc).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-     (yylloc).first_column = (yylloc).last_column;
-      (yylloc).first_line   = (yylloc).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:560: bison -o calc.c calc.y"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:560: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:560: \$PREPARSER ./calc input"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:560: \$PREPARSER ./calc input"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:560: cat stderr"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:560: \$PREPARSER ./calc input"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:560: cat stderr"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:560: \$PREPARSER ./calc input"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:560: cat stderr"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:560: \$PREPARSER ./calc input"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:560: cat stderr"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:560: \$PREPARSER ./calc input"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:560: cat stderr"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:560: \$PREPARSER ./calc /dev/null"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:560: cat stderr"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:560: \$PREPARSER ./calc input"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:560: cat stderr"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:560: \$PREPARSER ./calc input"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:560: cat stderr"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:560: \$PREPARSER ./calc input"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:560: cat stderr"
-echo calc.at:560 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:560: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  79 ) # 79. calc.at:562: Calculator %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc
-    at_setup_line='calc.at:562'
-    at_desc='Calculator %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc'
-    $at_quiet $ECHO_N " 79: Calculator %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C"
-    at_xfail=no
-    (
-      echo "79. calc.at:562: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%error-verbose %locations %defines %name-prefix="calc" %verbose %yacc
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%d.%d",
-           (yylloc).first_line, (yylloc).first_column);
-  if ((yylloc).first_line != (yylloc).last_line)
-    fprintf (stderr, "-%d.%d",
-	     (yylloc).last_line,  (yylloc).last_column - 1);
-  else if ((yylloc).first_column != (yylloc).last_column - 1)
-    fprintf (stderr, "-%d",
-	     (yylloc).last_column - 1);
-  fprintf (stderr, ": ");
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  last_yylloc = (yylloc);
-  if (res == '\n')
-    {
-      (yylloc).last_line++;
-      (yylloc).last_column = 0;
-    }
-  else
-    (yylloc).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  /* Wrong when C == `\n'. */
-  (yylloc) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (yylloc).last_column = 0;
-      (yylloc).last_line = 1;
-
-    }
-
-
- (yylloc).first_column = (yylloc).last_column;
-  (yylloc).first_line   = (yylloc).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-     (yylloc).first_column = (yylloc).last_column;
-      (yylloc).first_line   = (yylloc).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:562: bison -o calc.c calc.y"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:562: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:562: \$PREPARSER ./calc input"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:562: \$PREPARSER ./calc input"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:562: cat stderr"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:562: \$PREPARSER ./calc input"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:562: cat stderr"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:562: \$PREPARSER ./calc input"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:562: cat stderr"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:562: \$PREPARSER ./calc input"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:562: cat stderr"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:562: \$PREPARSER ./calc input"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:562: cat stderr"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:562: \$PREPARSER ./calc /dev/null"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:562: cat stderr"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:562: \$PREPARSER ./calc input"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:562: cat stderr"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:562: \$PREPARSER ./calc input"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:562: cat stderr"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:562: \$PREPARSER ./calc input"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:562: cat stderr"
-echo calc.at:562 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:562: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  80 ) # 80. calc.at:564: Calculator %debug
-    at_setup_line='calc.at:564'
-    at_desc='Calculator %debug'
-    $at_quiet $ECHO_N " 80: Calculator %debug                            $ECHO_C"
-    at_xfail=no
-    (
-      echo "80. calc.at:564: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%debug
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-    }
-
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-  yydebug = 1;
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:564: bison -o calc.c calc.y"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:564: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:564: \$PREPARSER ./calc input"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:564: \$PREPARSER ./calc input"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:564: cat stderr"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:564: \$PREPARSER ./calc input"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:564: cat stderr"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:564: \$PREPARSER ./calc input"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:564: cat stderr"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:564: \$PREPARSER ./calc input"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:564: cat stderr"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:564: \$PREPARSER ./calc input"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:564: cat stderr"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:564: \$PREPARSER ./calc /dev/null"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:564: cat stderr"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:564: \$PREPARSER ./calc input"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:564: cat stderr"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:564: \$PREPARSER ./calc input"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:564: cat stderr"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:564: \$PREPARSER ./calc input"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:564: cat stderr"
-echo calc.at:564 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:564: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  81 ) # 81. calc.at:565: Calculator %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc
-    at_setup_line='calc.at:565'
-    at_desc='Calculator %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc'
-    $at_quiet $ECHO_N " 81: Calculator %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C"
-    at_xfail=no
-    (
-      echo "81. calc.at:565: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%d.%d",
-           (yylloc).first_line, (yylloc).first_column);
-  if ((yylloc).first_line != (yylloc).last_line)
-    fprintf (stderr, "-%d.%d",
-	     (yylloc).last_line,  (yylloc).last_column - 1);
-  else if ((yylloc).first_column != (yylloc).last_column - 1)
-    fprintf (stderr, "-%d",
-	     (yylloc).last_column - 1);
-  fprintf (stderr, ": ");
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  last_yylloc = (yylloc);
-  if (res == '\n')
-    {
-      (yylloc).last_line++;
-      (yylloc).last_column = 0;
-    }
-  else
-    (yylloc).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  /* Wrong when C == `\n'. */
-  (yylloc) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (yylloc).last_column = 0;
-      (yylloc).last_line = 1;
-
-    }
-
-
- (yylloc).first_column = (yylloc).last_column;
-  (yylloc).first_line   = (yylloc).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-     (yylloc).first_column = (yylloc).last_column;
-      (yylloc).first_line   = (yylloc).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-  yydebug = 1;
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:565: bison -o calc.c calc.y"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:565: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:565: \$PREPARSER ./calc input"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:565: \$PREPARSER ./calc input"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:565: cat stderr"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:565: \$PREPARSER ./calc input"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:565: cat stderr"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:565: \$PREPARSER ./calc input"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:565: cat stderr"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:565: \$PREPARSER ./calc input"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:565: cat stderr"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:565: \$PREPARSER ./calc input"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:565: cat stderr"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:565: \$PREPARSER ./calc /dev/null"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:565: cat stderr"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:565: \$PREPARSER ./calc input"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:565: cat stderr"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:565: \$PREPARSER ./calc input"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:565: cat stderr"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:565: \$PREPARSER ./calc input"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:565: cat stderr"
-echo calc.at:565 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:565: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  82 ) # 82. calc.at:567: Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc
-    at_setup_line='calc.at:567'
-    at_desc='Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc'
-    $at_quiet $ECHO_N " 82: Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C"
-    at_xfail=no
-    (
-      echo "82. calc.at:567: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-static int get_char (YYSTYPE *lvalp, YYLTYPE *llocp);
-static void unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int res = getc (input);
-  (void) lvalp;(void) llocp;
-
-  last_yylloc = (*llocp);
-  if (res == '\n')
-    {
-      (*llocp).last_line++;
-      (*llocp).last_column = 0;
-    }
-  else
-    (*llocp).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c)
-{
-  (void) lvalp;(void) llocp;
-
-  /* Wrong when C == `\n'. */
-  (*llocp) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int c = get_char (lvalp, llocp);
-  int sign = 1;
-  int n = 0;
-
-  (void) lvalp;(void) llocp;
-  if (c == '-')
-    {
-      c = get_char (lvalp, llocp);
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char (lvalp, llocp);
-    }
-
-  unget_char (lvalp, llocp,  c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (*llocp).last_column = 0;
-      (*llocp).last_line = 1;
-
-    }
-
-
- (*llocp).first_column = (*llocp).last_column;
-  (*llocp).first_line   = (*llocp).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char (lvalp, llocp)) == ' ' || c == '\t')
-    {
-     (*llocp).first_column = (*llocp).last_column;
-      (*llocp).first_line   = (*llocp).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char (lvalp, llocp,  c);
-      (*lvalp).ival = read_signed_integer (lvalp, llocp);
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-  yydebug = 1;
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:567: bison -o calc.c calc.y"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:567: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:567: \$PREPARSER ./calc input"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:567: \$PREPARSER ./calc input"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:567: cat stderr"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:567: \$PREPARSER ./calc input"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:567: cat stderr"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:567: \$PREPARSER ./calc input"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:567: cat stderr"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:567: \$PREPARSER ./calc input"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:567: cat stderr"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:567: \$PREPARSER ./calc input"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:567: cat stderr"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:567: \$PREPARSER ./calc /dev/null"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:567: cat stderr"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:567: \$PREPARSER ./calc input"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:567: cat stderr"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:567: \$PREPARSER ./calc input"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:567: cat stderr"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:567: \$PREPARSER ./calc input"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:567: cat stderr"
-echo calc.at:567 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:567: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  83 ) # 83. calc.at:569: Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}
-    at_setup_line='calc.at:569'
-    at_desc='Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}'
-    $at_quiet $ECHO_N " 83: Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}$ECHO_C"
-    at_xfail=no
-    (
-      echo "83. calc.at:569: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (YYLTYPE *llocp,
-                     semantic_value *result, int *count,
-                     const char *s
-                     );
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-static int get_char (YYSTYPE *lvalp, YYLTYPE *llocp);
-static void unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         { ++*count; ++global_count; }
-;
-
-line:
-  '\n'
-| exp '\n'           { *result = global_result = $1; }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (YYLTYPE *llocp,
-         semantic_value *result, int *count,
-         const char *s)
-{
-(void) result; (void) count;
-
-  fprintf (stderr, "%d.%d",
-           (*llocp).first_line, (*llocp).first_column);
-  if ((*llocp).first_line != (*llocp).last_line)
-    fprintf (stderr, "-%d.%d",
-	     (*llocp).last_line,  (*llocp).last_column - 1);
-  else if ((*llocp).first_column != (*llocp).last_column - 1)
-    fprintf (stderr, "-%d",
-	     (*llocp).last_column - 1);
-  fprintf (stderr, ": ");
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int res = getc (input);
-  (void) lvalp;(void) llocp;
-
-  last_yylloc = (*llocp);
-  if (res == '\n')
-    {
-      (*llocp).last_line++;
-      (*llocp).last_column = 0;
-    }
-  else
-    (*llocp).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c)
-{
-  (void) lvalp;(void) llocp;
-
-  /* Wrong when C == `\n'. */
-  (*llocp) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int c = get_char (lvalp, llocp);
-  int sign = 1;
-  int n = 0;
-
-  (void) lvalp;(void) llocp;
-  if (c == '-')
-    {
-      c = get_char (lvalp, llocp);
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char (lvalp, llocp);
-    }
-
-  unget_char (lvalp, llocp,  c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (*llocp).last_column = 0;
-      (*llocp).last_line = 1;
-
-    }
-
-
- (*llocp).first_column = (*llocp).last_column;
-  (*llocp).first_line   = (*llocp).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char (lvalp, llocp)) == ' ' || c == '\t')
-    {
-     (*llocp).first_column = (*llocp).last_column;
-      (*llocp).first_line   = (*llocp).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char (lvalp, llocp,  c);
-      (*lvalp).ival = read_signed_integer (lvalp, llocp);
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-  yydebug = 1;
-  status = yyparse (&result, &count);
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:569: bison -o calc.c calc.y"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:569: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:569: \$PREPARSER ./calc input"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:569: \$PREPARSER ./calc input"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:569: cat stderr"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:569: \$PREPARSER ./calc input"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:569: cat stderr"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:569: \$PREPARSER ./calc input"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:569: cat stderr"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:569: \$PREPARSER ./calc input"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:569: cat stderr"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:569: \$PREPARSER ./calc input"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:569: cat stderr"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:569: \$PREPARSER ./calc /dev/null"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:569: cat stderr"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:569: \$PREPARSER ./calc input"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:569: cat stderr"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:569: \$PREPARSER ./calc input"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:569: cat stderr"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:569: \$PREPARSER ./calc input"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:569: cat stderr"
-echo calc.at:569 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:569: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-10 ) # Banner 10. calc.at:576
-    cat <<\_ATEOF
-
-Simple GLR Calculator.
-
-_ATEOF
-    ;;
-
-  84 ) # 84. calc.at:586: Calculator %glr-parser
-    at_setup_line='calc.at:586'
-    at_desc='Calculator %glr-parser '
-    $at_quiet $ECHO_N " 84: Calculator %glr-parser                       $ECHO_C"
-    at_xfail=no
-    (
-      echo "84. calc.at:586: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%glr-parser
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-    }
-
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:586: bison -o calc.c calc.y"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:586: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:586: \$PREPARSER ./calc input"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:586: \$PREPARSER ./calc input"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:586: cat stderr"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:586: \$PREPARSER ./calc input"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:586: cat stderr"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:586: \$PREPARSER ./calc input"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:586: cat stderr"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:586: \$PREPARSER ./calc input"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:586: cat stderr"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:586: \$PREPARSER ./calc input"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:586: cat stderr"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:586: \$PREPARSER ./calc /dev/null"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:586: cat stderr"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:586: \$PREPARSER ./calc input"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:586: cat stderr"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:586: \$PREPARSER ./calc input"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:586: cat stderr"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:586: \$PREPARSER ./calc input"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:586: cat stderr"
-echo calc.at:586 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:586: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  85 ) # 85. calc.at:588: Calculator %glr-parser %defines
-    at_setup_line='calc.at:588'
-    at_desc='Calculator %glr-parser %defines'
-    $at_quiet $ECHO_N " 85: Calculator %glr-parser %defines              $ECHO_C"
-    at_xfail=no
-    (
-      echo "85. calc.at:588: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%glr-parser %defines
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-    }
-
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:588: bison -o calc.c calc.y"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:588: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:588: \$PREPARSER ./calc input"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:588: \$PREPARSER ./calc input"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:588: cat stderr"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:588: \$PREPARSER ./calc input"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:588: cat stderr"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:588: \$PREPARSER ./calc input"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:588: cat stderr"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:588: \$PREPARSER ./calc input"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:588: cat stderr"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:588: \$PREPARSER ./calc input"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:588: cat stderr"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:588: \$PREPARSER ./calc /dev/null"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:588: cat stderr"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:588: \$PREPARSER ./calc input"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:588: cat stderr"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:588: \$PREPARSER ./calc input"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:588: cat stderr"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:588: \$PREPARSER ./calc input"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:588: cat stderr"
-echo calc.at:588 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:588: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  86 ) # 86. calc.at:589: Calculator %glr-parser %locations
-    at_setup_line='calc.at:589'
-    at_desc='Calculator %glr-parser %locations'
-    $at_quiet $ECHO_N " 86: Calculator %glr-parser %locations            $ECHO_C"
-    at_xfail=no
-    (
-      echo "86. calc.at:589: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%glr-parser %locations
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%d.%d",
-           (yylloc).first_line, (yylloc).first_column);
-  if ((yylloc).first_line != (yylloc).last_line)
-    fprintf (stderr, "-%d.%d",
-	     (yylloc).last_line,  (yylloc).last_column - 1);
-  else if ((yylloc).first_column != (yylloc).last_column - 1)
-    fprintf (stderr, "-%d",
-	     (yylloc).last_column - 1);
-  fprintf (stderr, ": ");
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  last_yylloc = (yylloc);
-  if (res == '\n')
-    {
-      (yylloc).last_line++;
-      (yylloc).last_column = 0;
-    }
-  else
-    (yylloc).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  /* Wrong when C == `\n'. */
-  (yylloc) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (yylloc).last_column = 0;
-      (yylloc).last_line = 1;
-
-    }
-
-
- (yylloc).first_column = (yylloc).last_column;
-  (yylloc).first_line   = (yylloc).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-     (yylloc).first_column = (yylloc).last_column;
-      (yylloc).first_line   = (yylloc).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:589: bison -o calc.c calc.y"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:589: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:589: \$PREPARSER ./calc input"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:589: \$PREPARSER ./calc input"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:589: cat stderr"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:589: \$PREPARSER ./calc input"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:589: cat stderr"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:589: \$PREPARSER ./calc input"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:589: cat stderr"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:589: \$PREPARSER ./calc input"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:589: cat stderr"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:589: \$PREPARSER ./calc input"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:589: cat stderr"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:589: \$PREPARSER ./calc /dev/null"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:589: cat stderr"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:589: \$PREPARSER ./calc input"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:589: cat stderr"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:589: \$PREPARSER ./calc input"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:589: cat stderr"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:589: \$PREPARSER ./calc input"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:589: cat stderr"
-echo calc.at:589 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:589: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  87 ) # 87. calc.at:590: Calculator %glr-parser %name-prefix="calc"
-    at_setup_line='calc.at:590'
-    at_desc='Calculator %glr-parser %name-prefix="calc"'
-    $at_quiet $ECHO_N " 87: Calculator %glr-parser %name-prefix="calc"   $ECHO_C"
-    at_xfail=no
-    (
-      echo "87. calc.at:590: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%glr-parser %name-prefix="calc"
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-    }
-
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:590: bison -o calc.c calc.y"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:590: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:590: \$PREPARSER ./calc input"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:590: \$PREPARSER ./calc input"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:590: cat stderr"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:590: \$PREPARSER ./calc input"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:590: cat stderr"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:590: \$PREPARSER ./calc input"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:590: cat stderr"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:590: \$PREPARSER ./calc input"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:590: cat stderr"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:590: \$PREPARSER ./calc input"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:590: cat stderr"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:590: \$PREPARSER ./calc /dev/null"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:590: cat stderr"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:590: \$PREPARSER ./calc input"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:590: cat stderr"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:590: \$PREPARSER ./calc input"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:590: cat stderr"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:590: \$PREPARSER ./calc input"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:590: cat stderr"
-echo calc.at:590 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:590: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  88 ) # 88. calc.at:591: Calculator %glr-parser %verbose
-    at_setup_line='calc.at:591'
-    at_desc='Calculator %glr-parser %verbose'
-    $at_quiet $ECHO_N " 88: Calculator %glr-parser %verbose              $ECHO_C"
-    at_xfail=no
-    (
-      echo "88. calc.at:591: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%glr-parser %verbose
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-    }
-
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:591: bison -o calc.c calc.y"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:591: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:591: \$PREPARSER ./calc input"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:591: \$PREPARSER ./calc input"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:591: cat stderr"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:591: \$PREPARSER ./calc input"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:591: cat stderr"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:591: \$PREPARSER ./calc input"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:591: cat stderr"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:591: \$PREPARSER ./calc input"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:591: cat stderr"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:591: \$PREPARSER ./calc input"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:591: cat stderr"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:591: \$PREPARSER ./calc /dev/null"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:591: cat stderr"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:591: \$PREPARSER ./calc input"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:591: cat stderr"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:591: \$PREPARSER ./calc input"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:591: cat stderr"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:591: \$PREPARSER ./calc input"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:591: cat stderr"
-echo calc.at:591 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:591: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  89 ) # 89. calc.at:592: Calculator %glr-parser %yacc
-    at_setup_line='calc.at:592'
-    at_desc='Calculator %glr-parser %yacc'
-    $at_quiet $ECHO_N " 89: Calculator %glr-parser %yacc                 $ECHO_C"
-    at_xfail=no
-    (
-      echo "89. calc.at:592: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%glr-parser %yacc
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-    }
-
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:592: bison -o calc.c calc.y"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:592: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:592: \$PREPARSER ./calc input"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:592: \$PREPARSER ./calc input"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:592: cat stderr"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:592: \$PREPARSER ./calc input"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:592: cat stderr"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:592: \$PREPARSER ./calc input"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:592: cat stderr"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:592: \$PREPARSER ./calc input"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:592: cat stderr"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:592: \$PREPARSER ./calc input"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:592: cat stderr"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:592: \$PREPARSER ./calc /dev/null"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:592: cat stderr"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:592: \$PREPARSER ./calc input"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:592: cat stderr"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:592: \$PREPARSER ./calc input"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:592: cat stderr"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:592: \$PREPARSER ./calc input"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:592: cat stderr"
-echo calc.at:592 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:592: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  90 ) # 90. calc.at:593: Calculator %glr-parser %error-verbose
-    at_setup_line='calc.at:593'
-    at_desc='Calculator %glr-parser %error-verbose'
-    $at_quiet $ECHO_N " 90: Calculator %glr-parser %error-verbose        $ECHO_C"
-    at_xfail=no
-    (
-      echo "90. calc.at:593: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%glr-parser %error-verbose
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-    }
-
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:593: bison -o calc.c calc.y"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:593: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:593: \$PREPARSER ./calc input"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:593: \$PREPARSER ./calc input"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:593: cat stderr"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:593: \$PREPARSER ./calc input"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:593: cat stderr"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:593: \$PREPARSER ./calc input"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:593: cat stderr"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:593: \$PREPARSER ./calc input"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:593: cat stderr"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:593: \$PREPARSER ./calc input"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:593: cat stderr"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:593: \$PREPARSER ./calc /dev/null"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:593: cat stderr"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:593: \$PREPARSER ./calc input"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:593: cat stderr"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:593: \$PREPARSER ./calc input"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:593: cat stderr"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:593: \$PREPARSER ./calc input"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:593: cat stderr"
-echo calc.at:593 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:593: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  91 ) # 91. calc.at:595: Calculator %glr-parser %pure-parser %locations
-    at_setup_line='calc.at:595'
-    at_desc='Calculator %glr-parser %pure-parser %locations'
-    $at_quiet $ECHO_N " 91: Calculator %glr-parser %pure-parser %locations$ECHO_C"
-    at_xfail=no
-    (
-      echo "91. calc.at:595: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%glr-parser %pure-parser %locations
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (YYLTYPE *llocp,
-
-                     const char *s
-                     );
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-static int get_char (YYSTYPE *lvalp, YYLTYPE *llocp);
-static void unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (YYLTYPE *llocp,
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%d.%d",
-           (*llocp).first_line, (*llocp).first_column);
-  if ((*llocp).first_line != (*llocp).last_line)
-    fprintf (stderr, "-%d.%d",
-	     (*llocp).last_line,  (*llocp).last_column - 1);
-  else if ((*llocp).first_column != (*llocp).last_column - 1)
-    fprintf (stderr, "-%d",
-	     (*llocp).last_column - 1);
-  fprintf (stderr, ": ");
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int res = getc (input);
-  (void) lvalp;(void) llocp;
-
-  last_yylloc = (*llocp);
-  if (res == '\n')
-    {
-      (*llocp).last_line++;
-      (*llocp).last_column = 0;
-    }
-  else
-    (*llocp).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c)
-{
-  (void) lvalp;(void) llocp;
-
-  /* Wrong when C == `\n'. */
-  (*llocp) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int c = get_char (lvalp, llocp);
-  int sign = 1;
-  int n = 0;
-
-  (void) lvalp;(void) llocp;
-  if (c == '-')
-    {
-      c = get_char (lvalp, llocp);
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char (lvalp, llocp);
-    }
-
-  unget_char (lvalp, llocp,  c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (*llocp).last_column = 0;
-      (*llocp).last_line = 1;
-
-    }
-
-
- (*llocp).first_column = (*llocp).last_column;
-  (*llocp).first_line   = (*llocp).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char (lvalp, llocp)) == ' ' || c == '\t')
-    {
-     (*llocp).first_column = (*llocp).last_column;
-      (*llocp).first_line   = (*llocp).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char (lvalp, llocp,  c);
-      (*lvalp).ival = read_signed_integer (lvalp, llocp);
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:595: bison -o calc.c calc.y"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:595: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:595: \$PREPARSER ./calc input"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:595: \$PREPARSER ./calc input"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:595: cat stderr"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:595: \$PREPARSER ./calc input"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:595: cat stderr"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:595: \$PREPARSER ./calc input"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:595: cat stderr"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:595: \$PREPARSER ./calc input"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:595: cat stderr"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:595: \$PREPARSER ./calc input"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:595: cat stderr"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:595: \$PREPARSER ./calc /dev/null"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:595: cat stderr"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:595: \$PREPARSER ./calc input"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:595: cat stderr"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:595: \$PREPARSER ./calc input"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:595: cat stderr"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:595: \$PREPARSER ./calc input"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:595: cat stderr"
-echo calc.at:595 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:595: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  92 ) # 92. calc.at:596: Calculator %glr-parser %error-verbose %locations
-    at_setup_line='calc.at:596'
-    at_desc='Calculator %glr-parser %error-verbose %locations'
-    $at_quiet $ECHO_N " 92: Calculator %glr-parser %error-verbose %locations$ECHO_C"
-    at_xfail=no
-    (
-      echo "92. calc.at:596: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%glr-parser %error-verbose %locations
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%d.%d",
-           (yylloc).first_line, (yylloc).first_column);
-  if ((yylloc).first_line != (yylloc).last_line)
-    fprintf (stderr, "-%d.%d",
-	     (yylloc).last_line,  (yylloc).last_column - 1);
-  else if ((yylloc).first_column != (yylloc).last_column - 1)
-    fprintf (stderr, "-%d",
-	     (yylloc).last_column - 1);
-  fprintf (stderr, ": ");
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  last_yylloc = (yylloc);
-  if (res == '\n')
-    {
-      (yylloc).last_line++;
-      (yylloc).last_column = 0;
-    }
-  else
-    (yylloc).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  /* Wrong when C == `\n'. */
-  (yylloc) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (yylloc).last_column = 0;
-      (yylloc).last_line = 1;
-
-    }
-
-
- (yylloc).first_column = (yylloc).last_column;
-  (yylloc).first_line   = (yylloc).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-     (yylloc).first_column = (yylloc).last_column;
-      (yylloc).first_line   = (yylloc).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:596: bison -o calc.c calc.y"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:596: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:596: \$PREPARSER ./calc input"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:596: \$PREPARSER ./calc input"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:596: cat stderr"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:596: \$PREPARSER ./calc input"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:596: cat stderr"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:596: \$PREPARSER ./calc input"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:596: cat stderr"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:596: \$PREPARSER ./calc input"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:596: cat stderr"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:596: \$PREPARSER ./calc input"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:596: cat stderr"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:596: \$PREPARSER ./calc /dev/null"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:596: cat stderr"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:596: \$PREPARSER ./calc input"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:596: cat stderr"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:596: \$PREPARSER ./calc input"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:596: cat stderr"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:596: \$PREPARSER ./calc input"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:596: cat stderr"
-echo calc.at:596 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:596: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  93 ) # 93. calc.at:598: Calculator %glr-parser %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc
-    at_setup_line='calc.at:598'
-    at_desc='Calculator %glr-parser %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc'
-    $at_quiet $ECHO_N " 93: Calculator %glr-parser %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C"
-    at_xfail=no
-    (
-      echo "93. calc.at:598: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%glr-parser %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%d.%d",
-           (yylloc).first_line, (yylloc).first_column);
-  if ((yylloc).first_line != (yylloc).last_line)
-    fprintf (stderr, "-%d.%d",
-	     (yylloc).last_line,  (yylloc).last_column - 1);
-  else if ((yylloc).first_column != (yylloc).last_column - 1)
-    fprintf (stderr, "-%d",
-	     (yylloc).last_column - 1);
-  fprintf (stderr, ": ");
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  last_yylloc = (yylloc);
-  if (res == '\n')
-    {
-      (yylloc).last_line++;
-      (yylloc).last_column = 0;
-    }
-  else
-    (yylloc).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  /* Wrong when C == `\n'. */
-  (yylloc) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (yylloc).last_column = 0;
-      (yylloc).last_line = 1;
-
-    }
-
-
- (yylloc).first_column = (yylloc).last_column;
-  (yylloc).first_line   = (yylloc).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-     (yylloc).first_column = (yylloc).last_column;
-      (yylloc).first_line   = (yylloc).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:598: bison -o calc.c calc.y"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:598: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:598: \$PREPARSER ./calc input"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:598: \$PREPARSER ./calc input"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:598: cat stderr"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:598: \$PREPARSER ./calc input"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:598: cat stderr"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:598: \$PREPARSER ./calc input"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:598: cat stderr"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:598: \$PREPARSER ./calc input"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:598: cat stderr"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:598: \$PREPARSER ./calc input"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:598: cat stderr"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:598: \$PREPARSER ./calc /dev/null"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:598: cat stderr"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:598: \$PREPARSER ./calc input"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:598: cat stderr"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:598: \$PREPARSER ./calc input"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:598: cat stderr"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:598: \$PREPARSER ./calc input"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:598: cat stderr"
-echo calc.at:598 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:598: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  94 ) # 94. calc.at:600: Calculator %glr-parser %debug
-    at_setup_line='calc.at:600'
-    at_desc='Calculator %glr-parser %debug'
-    $at_quiet $ECHO_N " 94: Calculator %glr-parser %debug                $ECHO_C"
-    at_xfail=no
-    (
-      echo "94. calc.at:600: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%glr-parser %debug
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-    }
-
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-  yydebug = 1;
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:600: bison -o calc.c calc.y"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:600: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:600: \$PREPARSER ./calc input"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:600: \$PREPARSER ./calc input"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:600: cat stderr"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:600: \$PREPARSER ./calc input"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:600: cat stderr"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:600: \$PREPARSER ./calc input"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:600: cat stderr"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:600: \$PREPARSER ./calc input"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:600: cat stderr"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:600: \$PREPARSER ./calc input"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:600: cat stderr"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:600: \$PREPARSER ./calc /dev/null"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:600: cat stderr"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:600: \$PREPARSER ./calc input"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:600: cat stderr"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:600: \$PREPARSER ./calc input"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:600: cat stderr"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:600: \$PREPARSER ./calc input"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:600: cat stderr"
-echo calc.at:600 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:600: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  95 ) # 95. calc.at:601: Calculator %glr-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc
-    at_setup_line='calc.at:601'
-    at_desc='Calculator %glr-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc'
-    $at_quiet $ECHO_N " 95: Calculator %glr-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C"
-    at_xfail=no
-    (
-      echo "95. calc.at:601: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%glr-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (
-
-                     const char *s
-                     );
-static int yylex (void);
-static int get_char (void);
-static void unget_char ( int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%d.%d",
-           (yylloc).first_line, (yylloc).first_column);
-  if ((yylloc).first_line != (yylloc).last_line)
-    fprintf (stderr, "-%d.%d",
-	     (yylloc).last_line,  (yylloc).last_column - 1);
-  else if ((yylloc).first_column != (yylloc).last_column - 1)
-    fprintf (stderr, "-%d",
-	     (yylloc).last_column - 1);
-  fprintf (stderr, ": ");
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (void)
-{
-  int res = getc (input);
-  ;
-
-  last_yylloc = (yylloc);
-  if (res == '\n')
-    {
-      (yylloc).last_line++;
-      (yylloc).last_column = 0;
-    }
-  else
-    (yylloc).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char ( int c)
-{
-  ;
-
-  /* Wrong when C == `\n'. */
-  (yylloc) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  ;
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char ( c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (void)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (yylloc).last_column = 0;
-      (yylloc).last_line = 1;
-
-    }
-
-
- (yylloc).first_column = (yylloc).last_column;
-  (yylloc).first_line   = (yylloc).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    {
-     (yylloc).first_column = (yylloc).last_column;
-      (yylloc).first_line   = (yylloc).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char ( c);
-      (yylval).ival = read_signed_integer ();
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-  yydebug = 1;
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:601: bison -o calc.c calc.y"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:601: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:601: \$PREPARSER ./calc input"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:601: \$PREPARSER ./calc input"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:601: cat stderr"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:601: \$PREPARSER ./calc input"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:601: cat stderr"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:601: \$PREPARSER ./calc input"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:601: cat stderr"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:601: \$PREPARSER ./calc input"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:601: cat stderr"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:601: \$PREPARSER ./calc input"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:601: cat stderr"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:601: \$PREPARSER ./calc /dev/null"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:601: cat stderr"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:601: \$PREPARSER ./calc input"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:601: cat stderr"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:601: \$PREPARSER ./calc input"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:601: cat stderr"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:601: \$PREPARSER ./calc input"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:601: cat stderr"
-echo calc.at:601 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:601: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  96 ) # 96. calc.at:603: Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc
-    at_setup_line='calc.at:603'
-    at_desc='Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc'
-    $at_quiet $ECHO_N " 96: Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C"
-    at_xfail=no
-    (
-      echo "96. calc.at:603: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (YYLTYPE *llocp,
-
-                     const char *s
-                     );
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-static int get_char (YYSTYPE *lvalp, YYLTYPE *llocp);
-static void unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (YYLTYPE *llocp,
-
-         const char *s)
-{
-
-
-  fprintf (stderr, "%d.%d",
-           (*llocp).first_line, (*llocp).first_column);
-  if ((*llocp).first_line != (*llocp).last_line)
-    fprintf (stderr, "-%d.%d",
-	     (*llocp).last_line,  (*llocp).last_column - 1);
-  else if ((*llocp).first_column != (*llocp).last_column - 1)
-    fprintf (stderr, "-%d",
-	     (*llocp).last_column - 1);
-  fprintf (stderr, ": ");
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int res = getc (input);
-  (void) lvalp;(void) llocp;
-
-  last_yylloc = (*llocp);
-  if (res == '\n')
-    {
-      (*llocp).last_line++;
-      (*llocp).last_column = 0;
-    }
-  else
-    (*llocp).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c)
-{
-  (void) lvalp;(void) llocp;
-
-  /* Wrong when C == `\n'. */
-  (*llocp) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int c = get_char (lvalp, llocp);
-  int sign = 1;
-  int n = 0;
-
-  (void) lvalp;(void) llocp;
-  if (c == '-')
-    {
-      c = get_char (lvalp, llocp);
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char (lvalp, llocp);
-    }
-
-  unget_char (lvalp, llocp,  c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (*llocp).last_column = 0;
-      (*llocp).last_line = 1;
-
-    }
-
-
- (*llocp).first_column = (*llocp).last_column;
-  (*llocp).first_line   = (*llocp).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char (lvalp, llocp)) == ' ' || c == '\t')
-    {
-     (*llocp).first_column = (*llocp).last_column;
-      (*llocp).first_line   = (*llocp).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char (lvalp, llocp,  c);
-      (*lvalp).ival = read_signed_integer (lvalp, llocp);
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-  yydebug = 1;
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:603: bison -o calc.c calc.y"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:603: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:603: \$PREPARSER ./calc input"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:603: \$PREPARSER ./calc input"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:603: cat stderr"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:603: \$PREPARSER ./calc input"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:603: cat stderr"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:603: \$PREPARSER ./calc input"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:603: cat stderr"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:603: \$PREPARSER ./calc input"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:603: cat stderr"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:603: \$PREPARSER ./calc input"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:603: cat stderr"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:603: \$PREPARSER ./calc /dev/null"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:603: cat stderr"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:603: \$PREPARSER ./calc input"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:603: cat stderr"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:603: \$PREPARSER ./calc input"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:603: cat stderr"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:603: \$PREPARSER ./calc input"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:603: cat stderr"
-echo calc.at:603 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:603: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  97 ) # 97. calc.at:605: Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}
-    at_setup_line='calc.at:605'
-    at_desc='Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}'
-    $at_quiet $ECHO_N " 97: Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}$ECHO_C"
-    at_xfail=no
-    (
-      echo "97. calc.at:605: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}
-
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-/* yyerror receives the location if:
-   - %location & %pure & %glr
-   - %location & %pure & %yacc & %parse-param. */
-static void yyerror (YYLTYPE *llocp,
-                     semantic_value *result, int *count,
-                     const char *s
-                     );
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-static int get_char (YYSTYPE *lvalp, YYLTYPE *llocp);
-static void unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c);
-%}
-
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         { ++*count; ++global_count; }
-;
-
-line:
-  '\n'
-| exp '\n'           { *result = global_result = $1; }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-static void
-yyerror (YYLTYPE *llocp,
-         semantic_value *result, int *count,
-         const char *s)
-{
-(void) result; (void) count;
-
-  fprintf (stderr, "%d.%d",
-           (*llocp).first_line, (*llocp).first_column);
-  if ((*llocp).first_line != (*llocp).last_line)
-    fprintf (stderr, "-%d.%d",
-	     (*llocp).last_line,  (*llocp).last_column - 1);
-  else if ((*llocp).first_column != (*llocp).last_column - 1)
-    fprintf (stderr, "-%d",
-	     (*llocp).last_column - 1);
-  fprintf (stderr, ": ");
-  fprintf (stderr, "%s\n", s);
-}
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int res = getc (input);
-  (void) lvalp;(void) llocp;
-
-  last_yylloc = (*llocp);
-  if (res == '\n')
-    {
-      (*llocp).last_line++;
-      (*llocp).last_column = 0;
-    }
-  else
-    (*llocp).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c)
-{
-  (void) lvalp;(void) llocp;
-
-  /* Wrong when C == `\n'. */
-  (*llocp) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int c = get_char (lvalp, llocp);
-  int sign = 1;
-  int n = 0;
-
-  (void) lvalp;(void) llocp;
-  if (c == '-')
-    {
-      c = get_char (lvalp, llocp);
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char (lvalp, llocp);
-    }
-
-  unget_char (lvalp, llocp,  c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (*llocp).last_column = 0;
-      (*llocp).last_line = 1;
-
-    }
-
-
- (*llocp).first_column = (*llocp).last_column;
-  (*llocp).first_line   = (*llocp).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char (lvalp, llocp)) == ' ' || c == '\t')
-    {
-     (*llocp).first_column = (*llocp).last_column;
-      (*llocp).first_line   = (*llocp).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char (lvalp, llocp,  c);
-      (*lvalp).ival = read_signed_integer (lvalp, llocp);
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-  yydebug = 1;
-  status = yyparse (&result, &count);
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:605: bison -o calc.c calc.y"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "calc.at:605: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.c \$LIBS"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o calc calc.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:605: \$PREPARSER ./calc input"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:605: \$PREPARSER ./calc input"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:605: cat stderr"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:605: \$PREPARSER ./calc input"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:605: cat stderr"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:605: \$PREPARSER ./calc input"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:605: cat stderr"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:605: \$PREPARSER ./calc input"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:605: cat stderr"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:605: \$PREPARSER ./calc input"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:605: cat stderr"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:605: \$PREPARSER ./calc /dev/null"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:605: cat stderr"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:605: \$PREPARSER ./calc input"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:605: cat stderr"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:605: \$PREPARSER ./calc input"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:605: cat stderr"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:605: \$PREPARSER ./calc input"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:605: cat stderr"
-echo calc.at:605 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:605: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-11 ) # Banner 11. calc.at:612
-    cat <<\_ATEOF
-
-Simple LALR(1) C++ Calculator.
-
-_ATEOF
-    ;;
-
-  98 ) # 98. calc.at:621: Calculator %skeleton "lalr1.cc" %defines %locations
-    at_setup_line='calc.at:621'
-    at_desc='Calculator %skeleton "lalr1.cc" %defines %locations '
-    $at_quiet $ECHO_N " 98: Calculator %skeleton "lalr1.cc" %defines %locations $ECHO_C"
-    at_xfail=no
-    (
-      echo "98. calc.at:621: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%skeleton "lalr1.cc" %defines %locations
-%define "global_tokens_and_yystype"
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-#ifndef YYLTYPE
-# define YYLTYPE yy::location
-#endif
-#define first_line   begin.line
-#define first_column begin.column
-#define last_line    end.line
-#define last_column  end.column
-
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-static int get_char (YYSTYPE *lvalp, YYLTYPE *llocp);
-static void unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c);
-%}
-
-/* The lalr1.cc skeleton, for backward compatibility, defines
-   a constructor for position that initializes the filename.  The
-   glr.cc skeleton does not (and in fact cannot: location/position
-   are stored in a union, from which objects with constructors are
-   excluded in C++. */
-%initial-action {
-  @$.initialize (0);
-}
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-/* A C++ error reporting function.  */
-void
-yy::parser::error (const location& l, const std::string& m)
-{
-  (void) l;
-  std::cerr << l << ": " << m << std::endl;
-}
-
-int
-yyparse ()
-{
-  yy::parser parser;
-  parser.set_debug_level (!!YYDEBUG);
-  return parser.parse ();
-}
-
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int res = getc (input);
-  (void) lvalp;(void) llocp;
-
-  last_yylloc = (*llocp);
-  if (res == '\n')
-    {
-      (*llocp).last_line++;
-      (*llocp).last_column = 0;
-    }
-  else
-    (*llocp).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c)
-{
-  (void) lvalp;(void) llocp;
-
-  /* Wrong when C == `\n'. */
-  (*llocp) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int c = get_char (lvalp, llocp);
-  int sign = 1;
-  int n = 0;
-
-  (void) lvalp;(void) llocp;
-  if (c == '-')
-    {
-      c = get_char (lvalp, llocp);
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char (lvalp, llocp);
-    }
-
-  unget_char (lvalp, llocp,  c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (*llocp).last_column = 0;
-      (*llocp).last_line = 1;
-
-    }
-
-
- (*llocp).first_column = (*llocp).last_column;
-  (*llocp).first_line   = (*llocp).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char (lvalp, llocp)) == ' ' || c == '\t')
-    {
-     (*llocp).first_column = (*llocp).last_column;
-      (*llocp).first_line   = (*llocp).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char (lvalp, llocp,  c);
-      (*lvalp).ival = read_signed_integer (lvalp, llocp);
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:621: bison -o calc.cc calc.y"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; bison -o calc.cc calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "calc.at:621: \$BISON_CXX_WORKS"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; $BISON_CXX_WORKS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "calc.at:621: \$CXX \$CXXFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.cc \$LIBS"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS $LDFLAGS -o calc calc.cc $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:621: \$PREPARSER ./calc input"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:621: \$PREPARSER ./calc input"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:621: cat stderr"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:621: \$PREPARSER ./calc input"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:621: cat stderr"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:621: \$PREPARSER ./calc input"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:621: cat stderr"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:621: \$PREPARSER ./calc input"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:621: cat stderr"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:621: \$PREPARSER ./calc input"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:621: cat stderr"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:621: \$PREPARSER ./calc /dev/null"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:621: cat stderr"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:621: \$PREPARSER ./calc input"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:621: cat stderr"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:621: \$PREPARSER ./calc input"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:621: cat stderr"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:621: \$PREPARSER ./calc input"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout
-# 5. Check
-$at_traceoff
-echo "calc.at:621: cat stderr"
-echo calc.at:621 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:621: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  99 ) # 99. calc.at:622: Calculator %skeleton "lalr1.cc" %defines %locations %error-verbose %name-prefix="calc" %verbose %yacc
-    at_setup_line='calc.at:622'
-    at_desc='Calculator %skeleton "lalr1.cc" %defines %locations %error-verbose %name-prefix="calc" %verbose %yacc'
-    $at_quiet $ECHO_N " 99: Calculator %skeleton "lalr1.cc" %defines %locations %error-verbose %name-prefix="calc" %verbose %yacc$ECHO_C"
-    at_xfail=no
-    (
-      echo "99. calc.at:622: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%skeleton "lalr1.cc" %defines %locations %error-verbose %name-prefix="calc" %verbose %yacc
-%define "global_tokens_and_yystype"
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-#ifndef YYLTYPE
-# define YYLTYPE calc::location
-#endif
-#define first_line   begin.line
-#define first_column begin.column
-#define last_line    end.line
-#define last_column  end.column
-
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-static int get_char (YYSTYPE *lvalp, YYLTYPE *llocp);
-static void unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c);
-%}
-
-/* The lalr1.cc skeleton, for backward compatibility, defines
-   a constructor for position that initializes the filename.  The
-   glr.cc skeleton does not (and in fact cannot: location/position
-   are stored in a union, from which objects with constructors are
-   excluded in C++. */
-%initial-action {
-  @$.initialize (0);
-}
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-/* A C++ error reporting function.  */
-void
-calc::parser::error (const location& l, const std::string& m)
-{
-  (void) l;
-  std::cerr << l << ": " << m << std::endl;
-}
-
-int
-yyparse ()
-{
-  calc::parser parser;
-  parser.set_debug_level (!!YYDEBUG);
-  return parser.parse ();
-}
-
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int res = getc (input);
-  (void) lvalp;(void) llocp;
-
-  last_yylloc = (*llocp);
-  if (res == '\n')
-    {
-      (*llocp).last_line++;
-      (*llocp).last_column = 0;
-    }
-  else
-    (*llocp).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c)
-{
-  (void) lvalp;(void) llocp;
-
-  /* Wrong when C == `\n'. */
-  (*llocp) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int c = get_char (lvalp, llocp);
-  int sign = 1;
-  int n = 0;
-
-  (void) lvalp;(void) llocp;
-  if (c == '-')
-    {
-      c = get_char (lvalp, llocp);
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char (lvalp, llocp);
-    }
-
-  unget_char (lvalp, llocp,  c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (*llocp).last_column = 0;
-      (*llocp).last_line = 1;
-
-    }
-
-
- (*llocp).first_column = (*llocp).last_column;
-  (*llocp).first_line   = (*llocp).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char (lvalp, llocp)) == ' ' || c == '\t')
-    {
-     (*llocp).first_column = (*llocp).last_column;
-      (*llocp).first_line   = (*llocp).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char (lvalp, llocp,  c);
-      (*lvalp).ival = read_signed_integer (lvalp, llocp);
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:622: bison -o calc.cc calc.y"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; bison -o calc.cc calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "calc.at:622: \$BISON_CXX_WORKS"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; $BISON_CXX_WORKS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "calc.at:622: \$CXX \$CXXFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.cc \$LIBS"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS $LDFLAGS -o calc calc.cc $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:622: \$PREPARSER ./calc input"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:622: \$PREPARSER ./calc input"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:622: cat stderr"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:622: \$PREPARSER ./calc input"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:622: cat stderr"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:622: \$PREPARSER ./calc input"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:622: cat stderr"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:622: \$PREPARSER ./calc input"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:622: cat stderr"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:622: \$PREPARSER ./calc input"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:622: cat stderr"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:622: \$PREPARSER ./calc /dev/null"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:622: cat stderr"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:622: \$PREPARSER ./calc input"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:622: cat stderr"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:622: \$PREPARSER ./calc input"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:622: cat stderr"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:622: \$PREPARSER ./calc input"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:622: cat stderr"
-echo calc.at:622 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:622: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  100 ) # 100. calc.at:624: Calculator %skeleton "lalr1.cc" %defines %locations %error-verbose %debug %name-prefix="calc" %verbose %yacc
-    at_setup_line='calc.at:624'
-    at_desc='Calculator %skeleton "lalr1.cc" %defines %locations %error-verbose %debug %name-prefix="calc" %verbose %yacc'
-    $at_quiet $ECHO_N "100: Calculator %skeleton "lalr1.cc" %defines %locations %error-verbose %debug %name-prefix="calc" %verbose %yacc$ECHO_C"
-    at_xfail=no
-    (
-      echo "100. calc.at:624: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%skeleton "lalr1.cc" %defines %locations %error-verbose %debug %name-prefix="calc" %verbose %yacc
-%define "global_tokens_and_yystype"
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-#ifndef YYLTYPE
-# define YYLTYPE calc::location
-#endif
-#define first_line   begin.line
-#define first_column begin.column
-#define last_line    end.line
-#define last_column  end.column
-
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-static int get_char (YYSTYPE *lvalp, YYLTYPE *llocp);
-static void unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c);
-%}
-
-/* The lalr1.cc skeleton, for backward compatibility, defines
-   a constructor for position that initializes the filename.  The
-   glr.cc skeleton does not (and in fact cannot: location/position
-   are stored in a union, from which objects with constructors are
-   excluded in C++. */
-%initial-action {
-  @$.initialize (0);
-}
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-/* A C++ error reporting function.  */
-void
-calc::parser::error (const location& l, const std::string& m)
-{
-  (void) l;
-  std::cerr << l << ": " << m << std::endl;
-}
-
-int
-yyparse ()
-{
-  calc::parser parser;
-  parser.set_debug_level (!!YYDEBUG);
-  return parser.parse ();
-}
-
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int res = getc (input);
-  (void) lvalp;(void) llocp;
-
-  last_yylloc = (*llocp);
-  if (res == '\n')
-    {
-      (*llocp).last_line++;
-      (*llocp).last_column = 0;
-    }
-  else
-    (*llocp).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c)
-{
-  (void) lvalp;(void) llocp;
-
-  /* Wrong when C == `\n'. */
-  (*llocp) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int c = get_char (lvalp, llocp);
-  int sign = 1;
-  int n = 0;
-
-  (void) lvalp;(void) llocp;
-  if (c == '-')
-    {
-      c = get_char (lvalp, llocp);
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char (lvalp, llocp);
-    }
-
-  unget_char (lvalp, llocp,  c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (*llocp).last_column = 0;
-      (*llocp).last_line = 1;
-
-    }
-
-
- (*llocp).first_column = (*llocp).last_column;
-  (*llocp).first_line   = (*llocp).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char (lvalp, llocp)) == ' ' || c == '\t')
-    {
-     (*llocp).first_column = (*llocp).last_column;
-      (*llocp).first_line   = (*llocp).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char (lvalp, llocp,  c);
-      (*lvalp).ival = read_signed_integer (lvalp, llocp);
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:624: bison -o calc.cc calc.y"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; bison -o calc.cc calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "calc.at:624: \$BISON_CXX_WORKS"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; $BISON_CXX_WORKS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "calc.at:624: \$CXX \$CXXFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.cc \$LIBS"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS $LDFLAGS -o calc calc.cc $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:624: \$PREPARSER ./calc input"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:624: \$PREPARSER ./calc input"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:624: cat stderr"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:624: \$PREPARSER ./calc input"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:624: cat stderr"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:624: \$PREPARSER ./calc input"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:624: cat stderr"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:624: \$PREPARSER ./calc input"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:624: cat stderr"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:624: \$PREPARSER ./calc input"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:624: cat stderr"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:624: \$PREPARSER ./calc /dev/null"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:624: cat stderr"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:624: \$PREPARSER ./calc input"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:624: cat stderr"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:624: \$PREPARSER ./calc input"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:624: cat stderr"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:624: \$PREPARSER ./calc input"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:624: cat stderr"
-echo calc.at:624 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:624: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  101 ) # 101. calc.at:626: Calculator %skeleton "lalr1.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc
-    at_setup_line='calc.at:626'
-    at_desc='Calculator %skeleton "lalr1.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc'
-    $at_quiet $ECHO_N "101: Calculator %skeleton "lalr1.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc$ECHO_C"
-    at_xfail=no
-    (
-      echo "101. calc.at:626: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%skeleton "lalr1.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc
-%define "global_tokens_and_yystype"
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-#ifndef YYLTYPE
-# define YYLTYPE calc::location
-#endif
-#define first_line   begin.line
-#define first_column begin.column
-#define last_line    end.line
-#define last_column  end.column
-
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-static int get_char (YYSTYPE *lvalp, YYLTYPE *llocp);
-static void unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c);
-%}
-
-/* The lalr1.cc skeleton, for backward compatibility, defines
-   a constructor for position that initializes the filename.  The
-   glr.cc skeleton does not (and in fact cannot: location/position
-   are stored in a union, from which objects with constructors are
-   excluded in C++. */
-%initial-action {
-  @$.initialize (0);
-}
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-/* A C++ error reporting function.  */
-void
-calc::parser::error (const location& l, const std::string& m)
-{
-  (void) l;
-  std::cerr << l << ": " << m << std::endl;
-}
-
-int
-yyparse ()
-{
-  calc::parser parser;
-  parser.set_debug_level (!!YYDEBUG);
-  return parser.parse ();
-}
-
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int res = getc (input);
-  (void) lvalp;(void) llocp;
-
-  last_yylloc = (*llocp);
-  if (res == '\n')
-    {
-      (*llocp).last_line++;
-      (*llocp).last_column = 0;
-    }
-  else
-    (*llocp).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c)
-{
-  (void) lvalp;(void) llocp;
-
-  /* Wrong when C == `\n'. */
-  (*llocp) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int c = get_char (lvalp, llocp);
-  int sign = 1;
-  int n = 0;
-
-  (void) lvalp;(void) llocp;
-  if (c == '-')
-    {
-      c = get_char (lvalp, llocp);
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char (lvalp, llocp);
-    }
-
-  unget_char (lvalp, llocp,  c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (*llocp).last_column = 0;
-      (*llocp).last_line = 1;
-
-    }
-
-
- (*llocp).first_column = (*llocp).last_column;
-  (*llocp).first_line   = (*llocp).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char (lvalp, llocp)) == ' ' || c == '\t')
-    {
-     (*llocp).first_column = (*llocp).last_column;
-      (*llocp).first_line   = (*llocp).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char (lvalp, llocp,  c);
-      (*lvalp).ival = read_signed_integer (lvalp, llocp);
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:626: bison -o calc.cc calc.y"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; bison -o calc.cc calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "calc.at:626: \$BISON_CXX_WORKS"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; $BISON_CXX_WORKS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "calc.at:626: \$CXX \$CXXFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.cc \$LIBS"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS $LDFLAGS -o calc calc.cc $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:626: \$PREPARSER ./calc input"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:626: \$PREPARSER ./calc input"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:626: cat stderr"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:626: \$PREPARSER ./calc input"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:626: cat stderr"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:626: \$PREPARSER ./calc input"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:626: cat stderr"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:626: \$PREPARSER ./calc input"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:626: cat stderr"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:626: \$PREPARSER ./calc input"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:626: cat stderr"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:626: \$PREPARSER ./calc /dev/null"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:626: cat stderr"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:626: \$PREPARSER ./calc input"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:626: cat stderr"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:626: \$PREPARSER ./calc input"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:626: cat stderr"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:626: \$PREPARSER ./calc input"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:626: cat stderr"
-echo calc.at:626 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:626: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  102 ) # 102. calc.at:628: Calculator %skeleton "lalr1.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}
-    at_setup_line='calc.at:628'
-    at_desc='Calculator %skeleton "lalr1.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}'
-    $at_quiet $ECHO_N "102: Calculator %skeleton "lalr1.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}$ECHO_C"
-    at_xfail=no
-    (
-      echo "102. calc.at:628: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%skeleton "lalr1.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}
-%define "global_tokens_and_yystype"
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-#ifndef YYLTYPE
-# define YYLTYPE calc::location
-#endif
-#define first_line   begin.line
-#define first_column begin.column
-#define last_line    end.line
-#define last_column  end.column
-
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-static int get_char (YYSTYPE *lvalp, YYLTYPE *llocp);
-static void unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c);
-%}
-
-/* The lalr1.cc skeleton, for backward compatibility, defines
-   a constructor for position that initializes the filename.  The
-   glr.cc skeleton does not (and in fact cannot: location/position
-   are stored in a union, from which objects with constructors are
-   excluded in C++. */
-%initial-action {
-  @$.initialize (0);
-}
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         { ++*count; ++global_count; }
-;
-
-line:
-  '\n'
-| exp '\n'           { *result = global_result = $1; }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-/* A C++ error reporting function.  */
-void
-calc::parser::error (const location& l, const std::string& m)
-{
-  (void) l;
-  std::cerr << l << ": " << m << std::endl;
-}
-
-int
-yyparse (semantic_value *result, int *count)
-{
-  calc::parser parser (result, count);
-  parser.set_debug_level (!!YYDEBUG);
-  return parser.parse ();
-}
-
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int res = getc (input);
-  (void) lvalp;(void) llocp;
-
-  last_yylloc = (*llocp);
-  if (res == '\n')
-    {
-      (*llocp).last_line++;
-      (*llocp).last_column = 0;
-    }
-  else
-    (*llocp).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c)
-{
-  (void) lvalp;(void) llocp;
-
-  /* Wrong when C == `\n'. */
-  (*llocp) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int c = get_char (lvalp, llocp);
-  int sign = 1;
-  int n = 0;
-
-  (void) lvalp;(void) llocp;
-  if (c == '-')
-    {
-      c = get_char (lvalp, llocp);
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char (lvalp, llocp);
-    }
-
-  unget_char (lvalp, llocp,  c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (*llocp).last_column = 0;
-      (*llocp).last_line = 1;
-
-    }
-
-
- (*llocp).first_column = (*llocp).last_column;
-  (*llocp).first_line   = (*llocp).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char (lvalp, llocp)) == ' ' || c == '\t')
-    {
-     (*llocp).first_column = (*llocp).last_column;
-      (*llocp).first_line   = (*llocp).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char (lvalp, llocp,  c);
-      (*lvalp).ival = read_signed_integer (lvalp, llocp);
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse (&result, &count);
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:628: bison -o calc.cc calc.y"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; bison -o calc.cc calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "calc.at:628: \$BISON_CXX_WORKS"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; $BISON_CXX_WORKS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "calc.at:628: \$CXX \$CXXFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.cc \$LIBS"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS $LDFLAGS -o calc calc.cc $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:628: \$PREPARSER ./calc input"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:628: \$PREPARSER ./calc input"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:628: cat stderr"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:628: \$PREPARSER ./calc input"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:628: cat stderr"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:628: \$PREPARSER ./calc input"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:628: cat stderr"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:628: \$PREPARSER ./calc input"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:628: cat stderr"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:628: \$PREPARSER ./calc input"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:628: cat stderr"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:628: \$PREPARSER ./calc /dev/null"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:628: cat stderr"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:628: \$PREPARSER ./calc input"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:628: cat stderr"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:628: \$PREPARSER ./calc input"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:628: cat stderr"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:628: \$PREPARSER ./calc input"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:628: cat stderr"
-echo calc.at:628 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-12 ) # Banner 12. calc.at:636
-    cat <<\_ATEOF
-
-Simple GLR C++ Calculator.
-
-_ATEOF
-    ;;
-
-  103 ) # 103. calc.at:651: Calculator %skeleton "glr.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc
-    at_setup_line='calc.at:651'
-    at_desc='Calculator %skeleton "glr.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc'
-    $at_quiet $ECHO_N "103: Calculator %skeleton "glr.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc$ECHO_C"
-    at_xfail=no
-    (
-      echo "103. calc.at:651: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%skeleton "glr.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc
-%define "global_tokens_and_yystype"
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-#ifndef YYLTYPE
-# define YYLTYPE calc::location
-#endif
-#define first_line   begin.line
-#define first_column begin.column
-#define last_line    end.line
-#define last_column  end.column
-
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-static int get_char (YYSTYPE *lvalp, YYLTYPE *llocp);
-static void unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c);
-%}
-
-/* The lalr1.cc skeleton, for backward compatibility, defines
-   a constructor for position that initializes the filename.  The
-   glr.cc skeleton does not (and in fact cannot: location/position
-   are stored in a union, from which objects with constructors are
-   excluded in C++. */
-%initial-action {
-  @$.initialize (0);
-}
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         {  }
-;
-
-line:
-  '\n'
-| exp '\n'           { USE ($1); }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-/* A C++ error reporting function.  */
-void
-calc::parser::error (const location& l, const std::string& m)
-{
-  (void) l;
-  std::cerr << l << ": " << m << std::endl;
-}
-
-int
-yyparse ()
-{
-  calc::parser parser;
-  parser.set_debug_level (!!YYDEBUG);
-  return parser.parse ();
-}
-
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int res = getc (input);
-  (void) lvalp;(void) llocp;
-
-  last_yylloc = (*llocp);
-  if (res == '\n')
-    {
-      (*llocp).last_line++;
-      (*llocp).last_column = 0;
-    }
-  else
-    (*llocp).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c)
-{
-  (void) lvalp;(void) llocp;
-
-  /* Wrong when C == `\n'. */
-  (*llocp) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int c = get_char (lvalp, llocp);
-  int sign = 1;
-  int n = 0;
-
-  (void) lvalp;(void) llocp;
-  if (c == '-')
-    {
-      c = get_char (lvalp, llocp);
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char (lvalp, llocp);
-    }
-
-  unget_char (lvalp, llocp,  c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (*llocp).last_column = 0;
-      (*llocp).last_line = 1;
-
-    }
-
-
- (*llocp).first_column = (*llocp).last_column;
-  (*llocp).first_line   = (*llocp).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char (lvalp, llocp)) == ' ' || c == '\t')
-    {
-     (*llocp).first_column = (*llocp).last_column;
-      (*llocp).first_line   = (*llocp).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char (lvalp, llocp,  c);
-      (*lvalp).ival = read_signed_integer (lvalp, llocp);
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:651: bison -o calc.cc calc.y"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; bison -o calc.cc calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "calc.at:651: \$BISON_CXX_WORKS"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; $BISON_CXX_WORKS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "calc.at:651: \$CXX \$CXXFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.cc \$LIBS"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS $LDFLAGS -o calc calc.cc $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:651: \$PREPARSER ./calc input"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:651: \$PREPARSER ./calc input"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:651: cat stderr"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:651: \$PREPARSER ./calc input"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:651: cat stderr"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:651: \$PREPARSER ./calc input"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:651: cat stderr"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:651: \$PREPARSER ./calc input"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:651: cat stderr"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:651: \$PREPARSER ./calc input"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:651: cat stderr"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:651: \$PREPARSER ./calc /dev/null"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:651: cat stderr"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:651: \$PREPARSER ./calc input"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:651: cat stderr"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:651: \$PREPARSER ./calc input"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:651: cat stderr"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:651: \$PREPARSER ./calc input"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:651: cat stderr"
-echo calc.at:651 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:651: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  104 ) # 104. calc.at:653: Calculator %skeleton "glr.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}
-    at_setup_line='calc.at:653'
-    at_desc='Calculator %skeleton "glr.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}'
-    $at_quiet $ECHO_N "104: Calculator %skeleton "glr.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}$ECHO_C"
-    at_xfail=no
-    (
-      echo "104. calc.at:653: testing ..."
-      $at_traceon
-
-
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >calc.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Infix notation calculator--calc */
-%skeleton "glr.cc" %defines %locations %pure-parser %error-verbose %debug %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}
-%define "global_tokens_and_yystype"
-%{
-#include <stdio.h>
-
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else
-# undef alarm
-# define alarm(seconds) /* empty */
-#endif
-#include <ctype.h>
-#define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
-%}
-
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
-
-%{
-static int power (int base, int exponent);
-#ifndef YYLTYPE
-# define YYLTYPE calc::location
-#endif
-#define first_line   begin.line
-#define first_column begin.column
-#define last_line    end.line
-#define last_column  end.column
-
-static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp);
-static int get_char (YYSTYPE *lvalp, YYLTYPE *llocp);
-static void unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c);
-%}
-
-/* The lalr1.cc skeleton, for backward compatibility, defines
-   a constructor for position that initializes the filename.  The
-   glr.cc skeleton does not (and in fact cannot: location/position
-   are stored in a union, from which objects with constructors are
-   excluded in C++. */
-%initial-action {
-  @$.initialize (0);
-}
-
-
-/* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%nonassoc '=' /* comparison	       */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line         { ++*count; ++global_count; }
-;
-
-line:
-  '\n'
-| exp '\n'           { *result = global_result = $1; }
-;
-
-exp:
-  NUM                { $$ = $1;             }
-| exp '=' exp
-  {
-    if ($1 != $3)
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);
-    $$ = $1;
-  }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
-| exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111;           }
-| '!'                { $$ = 0; YYERROR;     }
-| '-' error          { $$ = 0; YYERROR;     }
-;
-%%
-/* The input.  */
-static FILE *input;
-
-/* A C++ error reporting function.  */
-void
-calc::parser::error (const location& l, const std::string& m)
-{
-  (void) l;
-  std::cerr << l << ": " << m << std::endl;
-}
-
-int
-yyparse (semantic_value *result, int *count)
-{
-  calc::parser parser (result, count);
-  parser.set_debug_level (!!YYDEBUG);
-  return parser.parse ();
-}
-
-
-
-
-static YYLTYPE last_yylloc;
-
-static int
-get_char (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int res = getc (input);
-  (void) lvalp;(void) llocp;
-
-  last_yylloc = (*llocp);
-  if (res == '\n')
-    {
-      (*llocp).last_line++;
-      (*llocp).last_column = 0;
-    }
-  else
-    (*llocp).last_column++;
-
-  return res;
-}
-
-
-static void
-unget_char (YYSTYPE *lvalp, YYLTYPE *llocp,  int c)
-{
-  (void) lvalp;(void) llocp;
-
-  /* Wrong when C == `\n'. */
-  (*llocp) = last_yylloc;
-
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  int c = get_char (lvalp, llocp);
-  int sign = 1;
-  int n = 0;
-
-  (void) lvalp;(void) llocp;
-  if (c == '-')
-    {
-      c = get_char (lvalp, llocp);
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char (lvalp, llocp);
-    }
-
-  unget_char (lvalp, llocp,  c);
-
-  return sign * n;
-}
-
-
-
-/*---------------------------------------------------------------.
-| Lexical analyzer returns an integer on the stack and the token |
-| NUM, or the ASCII character read if not a number.  Skips all   |
-| blanks and tabs, returns 0 for EOF.                            |
-`---------------------------------------------------------------*/
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static int init = 1;
-  int c;
-
-  if (init)
-    {
-      init = 0;
-
-      (*llocp).last_column = 0;
-      (*llocp).last_line = 1;
-
-    }
-
-
- (*llocp).first_column = (*llocp).last_column;
-  (*llocp).first_line   = (*llocp).last_line;
-
-
-  /* Skip white space.  */
-  while ((c = get_char (lvalp, llocp)) == ' ' || c == '\t')
-    {
-     (*llocp).first_column = (*llocp).last_column;
-      (*llocp).first_line   = (*llocp).last_line;
-
-    }
-
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
-    {
-      unget_char (lvalp, llocp,  c);
-      (*lvalp).ival = read_signed_integer (lvalp, llocp);
-      return NUM;
-    }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
-}
-
-static int
-power (int base, int exponent)
-{
-  int res = 1;
-  if (exponent < 0)
-    exit (3);
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
-  /* This used to be alarm (10), but that isn't enough time for
-     a July 1995 vintage DEC Alphastation 200 4/100 system,
-     according to Nelson H. F. Beebe.  100 seconds is enough.  */
-  alarm (100);
-
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
-
-  status = yyparse (&result, &count);
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-  return status;
-}
-_ATEOF
-
-
-
-
-
-$at_traceoff
-echo "calc.at:653: bison -o calc.cc calc.y"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; bison -o calc.cc calc.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "calc.at:653: \$BISON_CXX_WORKS"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; $BISON_CXX_WORKS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "calc.at:653: \$CXX \$CXXFLAGS \$CPPFLAGS \$LDFLAGS -o calc calc.cc \$LIBS"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS $LDFLAGS -o calc calc.cc $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Test the priorities.
-cat >input <<'_ATEOF'
-1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-_ATEOF
-
-$at_traceoff
-echo "calc.at:653: \$PREPARSER ./calc input"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Some syntax errors.
-cat >input <<'_ATEOF'
-0 0
-_ATEOF
-
-$at_traceoff
-echo "calc.at:653: \$PREPARSER ./calc input"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected number
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:653: cat stderr"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1//2
-_ATEOF
-
-$at_traceoff
-echo "calc.at:653: \$PREPARSER ./calc input"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:653: cat stderr"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-error
-_ATEOF
-
-$at_traceoff
-echo "calc.at:653: \$PREPARSER ./calc input"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected $undefined
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:653: cat stderr"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-1 = 2 = 3
-_ATEOF
-
-$at_traceoff
-echo "calc.at:653: \$PREPARSER ./calc input"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.6: syntax error, unexpected '='
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:653: cat stderr"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-
-+1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:653: \$PREPARSER ./calc input"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-2.0: syntax error, unexpected '+'
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:653: cat stderr"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Exercise error messages with EOF: work on an empty file.
-$at_traceoff
-echo "calc.at:653: \$PREPARSER ./calc /dev/null"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.0: syntax error, unexpected end of input
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:653: cat stderr"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to `error'
-#
-# - check the look-ahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the look-ahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-cat >input <<'_ATEOF'
-() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:653: \$PREPARSER ./calc input"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:653: cat stderr"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the look-ahead causing the error should not be discarded.
-cat >input <<'_ATEOF'
-(!) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:653: \$PREPARSER ./calc input"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.9: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:653: cat stderr"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >input <<'_ATEOF'
-(- *) + (0 0) = 1
-_ATEOF
-
-$at_traceoff
-echo "calc.at:653: \$PREPARSER ./calc input"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; tee stderr <$at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Remove the traces from observed.
-sed '/^Starting/d
-/^Entering/d
-/^Stack/d
-/^Reading/d
-/^Reducing/d
-/^Shifting/d
-/^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Discarding/d
-/ \$[0-9$]* = /d
-/^yydestructor:/d' stderr >at-stderr
-mv at-stderr stderr
-# 2. Create the reference error message.
-cat >expout <<'_ATEOF'
-1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected number
-calc: error: 2222 != 1
-_ATEOF
-
-# 3. If locations are not used, remove them.
-
-# 4. If error-verbose is not used, strip the`, unexpected....' part.
-
-# 5. Check
-$at_traceoff
-echo "calc.at:653: cat stderr"
-echo calc.at:653 >$at_check_line_file
-( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff expout $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "calc.at:653: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-13 ) # Banner 13. torture.at:19
-    cat <<\_ATEOF
-
-Torture Tests.
-
-_ATEOF
-    ;;
-
-  105 ) # 105. torture.at:140: Big triangle
-    at_setup_line='torture.at:140'
-    at_desc='Big triangle'
-    $at_quiet $ECHO_N "105: Big triangle                                 $ECHO_C"
-    at_xfail=no
-    (
-      echo "105. torture.at:140: testing ..."
-      $at_traceon
-
-
-# I have been able to go up to 2000 on my machine.
-# I tried 3000, a 29Mb grammar file, but then my system killed bison.
-# With 500 and the new parser, which consume far too much memory,
-# it gets killed too.  Of course the parser is to be cleaned.
-cat >gengram.pl <<'_ATEOF'
-#! /usr/bin/perl -w
-
-use strict;
-my $max = $ARGV[0] || 10;
-
-print <<EOF;
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%error-verbose
-%debug
-%{
-#include <stdio.h>
-#include <stdlib.h>
-
-static int yylex (void);
-static void yyerror (const char *msg);
-%}
-%union
-{
-  int val;
-};
-
-%token END "end"
-%type <val> exp input
-EOF
-
-for my $size (1 .. $max)
-  {
-    print "%token t$size $size \"$size\"\n";
-  };
-
-print <<EOF;
-%%
-input:
-  exp        { if (\$1 != 0) abort (); \$\$ = \$1; }
-| input exp  { if (\$2 != \$1 + 1) abort (); \$\$ = \$2; }
-;
-
-exp:
-  END
-    { \$\$ = 0; }
-EOF
-
-for my $size (1 .. $max)
-  {
-    use Text::Wrap;
-    print wrap ("| ", "   ",
-		(map { "\"$_\"" } (1 .. $size)),
-		" END \n"),
-		  "    { \$\$ = $size; }\n";
-  };
-print ";\n";
-
-print <<EOF;
-%%
-static int
-yylex (void)
-{
-  static int inner = 1;
-  static int outer = 0;
-  if (outer > $max)
-    return 0;
-  else if (inner > outer)
-    {
-      inner = 1;
-      ++outer;
-      return END;
-    }
-  return inner++;
-}
-
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\\n", msg);
-}
-
-int
-main (void)
-{
-  yydebug = !!getenv ("YYDEBUG");
-  return yyparse ();
-}
-EOF
-_ATEOF
-
-
-$at_traceoff
-echo "torture.at:146: perl -w ./gengram.pl 200 || exit 77"
-echo torture.at:146 >$at_check_line_file
-( $at_traceon; perl -w ./gengram.pl 200 || exit 77 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:146: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-mv stdout input.y
-
-$at_traceoff
-echo "torture.at:147: bison -v -o input.c input.y"
-echo torture.at:147 >$at_check_line_file
-( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:147: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "torture.at:148: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o input input.c \$LIBS"
-echo torture.at:148 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o input input.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:148: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "torture.at:149: \$PREPARSER ./input"
-echo torture.at:149 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:149: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  106 ) # 106. torture.at:232: Big horizontal
-    at_setup_line='torture.at:232'
-    at_desc='Big horizontal'
-    $at_quiet $ECHO_N "106: Big horizontal                               $ECHO_C"
-    at_xfail=no
-    (
-      echo "106. torture.at:232: testing ..."
-      $at_traceon
-
-
-# I have been able to go up to 10000 on my machine, but I had to
-# increase the maximum stack size (* 100).  It gave:
-#
-# input.y      263k
-# input.tab.c  1.3M
-# input        453k
-#
-# gengram.pl 10000                 0.70s user 0.01s sys  99% cpu    0.711 total
-# bison input.y                  730.56s user 0.53s sys  99% cpu 12:12.34 total
-# gcc -Wall input.tab.c -o input   5.81s user 0.20s sys 100% cpu     6.01 total
-# ./input                          0.00s user 0.01s sys 108% cpu     0.01 total
-#
-cat >gengram.pl <<'_ATEOF'
-#! /usr/bin/perl -w
-
-use strict;
-my $max = $ARGV[0] || 10;
-
-print <<EOF;
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%error-verbose
-%debug
-%{
-#include <stdio.h>
-#include <stdlib.h>
-
-static int yylex (void);
-static void yyerror (const char *msg);
-%}
-
-%token
-EOF
-for my $size (1 .. $max)
-  {
-    print "    t$size $size \"$size\"\n";
-  };
-
-print <<EOF;
-
-%%
-EOF
-
-use Text::Wrap;
-print
-  wrap ("exp: ", "  ",
-	(map { "\"$_\"" } (1 .. $max)), ";"),
-  "\n";
-
-print <<EOF;
-%%
-static int
-yylex (void)
-{
-  static int counter = 1;
-  if (counter > $max)
-    return 0;
-  else
-  return counter++;
-}
-
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\\n", msg);
-}
-
-int
-main (void)
-{
-  yydebug = !!getenv ("YYDEBUG");
-  return yyparse ();
-}
-EOF
-_ATEOF
-
-
-$at_traceoff
-echo "torture.at:246: perl -w ./gengram.pl 1000 || exit 77"
-echo torture.at:246 >$at_check_line_file
-( $at_traceon; perl -w ./gengram.pl 1000 || exit 77 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:246: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-mv stdout input.y
-
-
-# GNU m4 requires about 70 MiB for this test on a 32-bit host.
-# Ask for 200 MiB, which should be plenty even on a 64-bit host.
-data_limit=`(ulimit -S -d) 2>/dev/null`
-case $data_limit in
-[0-9]*)
-  if test "$data_limit" -lt 204000; then
-    $at_traceoff
-echo "torture.at:250: ulimit -S -d 204000 || exit 77"
-echo torture.at:250 >$at_check_line_file
-( $at_traceon; ulimit -S -d 204000 || exit 77 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:250: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-    ulimit -S -d 204000
-  fi
-esac
-
-$at_traceoff
-echo "torture.at:252: bison -v -o input.c input.y"
-echo torture.at:252 >$at_check_line_file
-( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:252: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "torture.at:253: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o input input.c \$LIBS"
-echo torture.at:253 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o input input.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:253: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "torture.at:254: \$PREPARSER ./input"
-echo torture.at:254 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:254: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  107 ) # 107. torture.at:368: Many look-ahead tokens
-    at_setup_line='torture.at:368'
-    at_desc='Many look-ahead tokens'
-    $at_quiet $ECHO_N "107: Many look-ahead tokens                       $ECHO_C"
-    at_xfail=no
-    (
-      echo "107. torture.at:368: testing ..."
-      $at_traceon
-
-
-cat >gengram.pl <<'_ATEOF'
-#! /usr/bin/perl -w
-
-use strict;
-use Text::Wrap;
-my $max = $ARGV[0] || 10;
-
-print <<EOF;
-%error-verbose
-%debug
-%{
-# include <stdio.h>
-# include <stdlib.h>
-# include <assert.h>
-
-static int yylex (void);
-static void yyerror (const char *msg);
-%}
-%union
-{
-  int val;
-};
-
-%type <val> input exp
-%token token
-EOF
-
-print
-  wrap ("%type <val> ",
-	"            ",
-	map { "n$_" } (1 .. $max)),
-  "\n";
-
-print "%token\n";
-for my $count (1 .. $max)
-  {
-    print "    t$count $count \"$count\"\n";
-  };
-
-print <<EOF;
-%%
-input:
-  exp        { assert (\$1 == 1); \$\$ = \$1; }
-| input exp  { assert (\$2 == \$1 + 1); \$\$ = \$2; }
-;
-
-exp:
-  n1 "1" { assert (\$1 == 1); \$\$ = \$1; }
-EOF
-
-for my $count (2 .. $max)
-  {
-    print "| n$count \"$count\" { assert (\$1 == $count); \$\$ = \$1; }\n";
-  };
-print ";\n";
-
-for my $count (1 .. $max)
-  {
-    print "n$count: token { \$\$ = $count; };\n";
-  };
-
-print <<EOF;
-%%
-static int
-yylex (void)
-{
-  static int return_token = 1;
-  static int counter = 1;
-  if (counter > $max)
-    return 0;
-  if (return_token)
-    {
-      return_token = 0;
-      return token;
-    }
-  return_token = 1;
-  return counter++;
-}
-
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\\n", msg);
-}
-
-int
-main (void)
-{
-  yydebug = !!getenv ("YYDEBUG");
-  return yyparse ();
-}
-EOF
-_ATEOF
-
-
-$at_traceoff
-echo "torture.at:370: perl -w ./gengram.pl 1000 || exit 77"
-echo torture.at:370 >$at_check_line_file
-( $at_traceon; perl -w ./gengram.pl 1000 || exit 77 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; tee stdout <$at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:370: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-mv stdout input.y
-
-
-# GNU m4 requires about 70 MiB for this test on a 32-bit host.
-# Ask for 200 MiB, which should be plenty even on a 64-bit host.
-data_limit=`(ulimit -S -d) 2>/dev/null`
-case $data_limit in
-[0-9]*)
-  if test "$data_limit" -lt 204000; then
-    $at_traceoff
-echo "torture.at:374: ulimit -S -d 204000 || exit 77"
-echo torture.at:374 >$at_check_line_file
-( $at_traceon; ulimit -S -d 204000 || exit 77 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:374: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-    ulimit -S -d 204000
-  fi
-esac
-
-$at_traceoff
-echo "torture.at:376: bison -v -o input.c input.y"
-echo torture.at:376 >$at_check_line_file
-( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:376: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "torture.at:377: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o input input.c \$LIBS"
-echo torture.at:377 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o input input.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:377: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "torture.at:378: \$PREPARSER ./input"
-echo torture.at:378 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:378: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  108 ) # 108. torture.at:445: Exploding the Stack Size with Alloca
-    at_setup_line='torture.at:445'
-    at_desc='Exploding the Stack Size with Alloca'
-    $at_quiet $ECHO_N "108: Exploding the Stack Size with Alloca         $ECHO_C"
-    at_xfail=no
-    (
-      echo "108. torture.at:445: testing ..."
-      $at_traceon
-
-
-# A grammar of parens growing the stack thanks to right recursion.
-# exp:
-cat >input.y <<'_ATEOF'
-%{
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#if (defined __GNUC__ || defined __BUILTIN_VA_ARG_INCR \
-     || defined _AIX || defined _MSC_VER || defined _ALLOCA_H)
-# define YYSTACK_USE_ALLOCA 1
-#endif
-
-  static int yylex (void);
-  static void yyerror (const char *msg);
-%}
-%error-verbose
-%debug
-%token WAIT_FOR_EOF
-%%
-exp: WAIT_FOR_EOF exp | ;
-%%
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  if (yylval--)
-    return WAIT_FOR_EOF;
-  else
-    return EOF;
-}
-
-int
-main (int argc, const char **argv)
-{
-  char *endp;
-  if (argc != 2)
-    abort ();
-  yylval = strtol (argv[1], &endp, 10);
-  if (! (argv[1] != endp
-	 && 0 <= yylval && yylval <= INT_MAX
-	 && errno != ERANGE))
-    abort ();
-  yydebug = 1;
-  return yyparse ();
-}
-_ATEOF
-
-$at_traceoff
-echo "torture.at:452: bison -o input.c input.y"
-echo torture.at:452 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:452: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "torture.at:452: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o input input.c \$LIBS"
-echo torture.at:452 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o input input.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:452: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Below the limit of 200.
-$at_traceoff
-echo "torture.at:455: \$PREPARSER ./input 20"
-echo torture.at:455 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input 20 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:455: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# Two enlargements: 2 * 2 * 200.
-$at_traceoff
-echo "torture.at:457: \$PREPARSER ./input 900"
-echo torture.at:457 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input 900 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:457: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# Fails: beyond the limit of 10,000 (which we don't reach anyway since we
-# multiply by two starting at 200 => 5120 is the last possible).
-$at_traceoff
-echo "torture.at:460: \$PREPARSER ./input 10000"
-echo torture.at:460 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input 10000 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   2) ;;
-   *) echo "torture.at:460: exit code was $at_status, expected 2"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  109 ) # 109. torture.at:471: Exploding the Stack Size with Malloc
-    at_setup_line='torture.at:471'
-    at_desc='Exploding the Stack Size with Malloc'
-    $at_quiet $ECHO_N "109: Exploding the Stack Size with Malloc         $ECHO_C"
-    at_xfail=no
-    (
-      echo "109. torture.at:471: testing ..."
-      $at_traceon
-
-
-# A grammar of parens growing the stack thanks to right recursion.
-# exp:
-cat >input.y <<'_ATEOF'
-%{
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#define YYSTACK_USE_ALLOCA 0
-  static int yylex (void);
-  static void yyerror (const char *msg);
-%}
-%error-verbose
-%debug
-%token WAIT_FOR_EOF
-%%
-exp: WAIT_FOR_EOF exp | ;
-%%
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  if (yylval--)
-    return WAIT_FOR_EOF;
-  else
-    return EOF;
-}
-
-int
-main (int argc, const char **argv)
-{
-  char *endp;
-  if (argc != 2)
-    abort ();
-  yylval = strtol (argv[1], &endp, 10);
-  if (! (argv[1] != endp
-	 && 0 <= yylval && yylval <= INT_MAX
-	 && errno != ERANGE))
-    abort ();
-  yydebug = 1;
-  return yyparse ();
-}
-_ATEOF
-
-$at_traceoff
-echo "torture.at:473: bison -o input.c input.y"
-echo torture.at:473 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:473: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "torture.at:473: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o input input.c \$LIBS"
-echo torture.at:473 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o input input.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:473: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-# Below the limit of 200.
-$at_traceoff
-echo "torture.at:476: \$PREPARSER ./input 20"
-echo torture.at:476 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input 20 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:476: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# Two enlargements: 2 * 2 * 200.
-$at_traceoff
-echo "torture.at:478: \$PREPARSER ./input 900"
-echo torture.at:478 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input 900 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "torture.at:478: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-# Fails: beyond the limit of 10,000 (which we don't reach anyway since we
-# multiply by two starting at 200 => 5120 is the possible).
-$at_traceoff
-echo "torture.at:481: \$PREPARSER ./input 10000"
-echo torture.at:481 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input 10000 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   2) ;;
-   *) echo "torture.at:481: exit code was $at_status, expected 2"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-14 ) # Banner 14. existing.at:21
-    cat <<\_ATEOF
-
-Existing Grammars.
-
-_ATEOF
-    ;;
-
-  110 ) # 110. existing.at:26: GNU AWK Grammar
-    at_setup_line='existing.at:26'
-    at_desc='GNU AWK Grammar'
-    $at_quiet $ECHO_N "110: GNU AWK Grammar                              $ECHO_C"
-    at_xfail=no
-    (
-      echo "110. existing.at:26: testing ..."
-      $at_traceon
-
-
-# We have been careful to strip all the actions excepts the
-# mid-rule actions.  We rely on %expect to check that there are
-# indeed 65 SR conflicts.
-#
-# Bison was once wrong, due to an incorrect computation of nullable.
-# It reported 485 SR conflicts!
-
-cat >input.y <<'_ATEOF'
-%expect 65
-
-%token FUNC_CALL NAME REGEXP
-%token ERROR
-%token YNUMBER YSTRING
-%token RELOP APPEND_OP
-%token ASSIGNOP MATCHOP NEWLINE CONCAT_OP
-%token LEX_BEGIN LEX_END LEX_IF LEX_ELSE LEX_RETURN LEX_DELETE
-%token LEX_WHILE LEX_DO LEX_FOR LEX_BREAK LEX_CONTINUE
-%token LEX_PRINT LEX_PRINTF LEX_NEXT LEX_EXIT LEX_FUNCTION
-%token LEX_GETLINE LEX_NEXTFILE
-%token LEX_IN
-%token LEX_AND LEX_OR INCREMENT DECREMENT
-%token LEX_BUILTIN LEX_LENGTH
-
-/* Lowest to highest */
-%right ASSIGNOP
-%right '?' ':'
-%left LEX_OR
-%left LEX_AND
-%left LEX_GETLINE
-%nonassoc LEX_IN
-%left FUNC_CALL LEX_BUILTIN LEX_LENGTH
-%nonassoc ','
-%nonassoc MATCHOP
-%nonassoc RELOP '<' '>' '|' APPEND_OP TWOWAYIO
-%left CONCAT_OP
-%left YSTRING YNUMBER
-%left '+' '-'
-%left '*' '/' '%'
-%right '!' UNARY
-%right '^'
-%left INCREMENT DECREMENT
-%left '$'
-%left '(' ')'
-%%
-
-start
-	: opt_nls program opt_nls
-	;
-
-program
-	: rule
-	| program rule
-	| error
-	| program error
-	| /* empty */
-	;
-
-rule
-	: LEX_BEGIN {} action
-	| LEX_END {}   action
-	| LEX_BEGIN statement_term
-	| LEX_END statement_term
-	| pattern action
-	| action
-	| pattern statement_term
-	| function_prologue function_body
-	;
-
-func_name
-	: NAME
-	| FUNC_CALL
-	| lex_builtin
-	;
-
-lex_builtin
-	: LEX_BUILTIN
-	| LEX_LENGTH
-	;
-
-function_prologue
-	: LEX_FUNCTION {} func_name '(' opt_param_list r_paren opt_nls
-	;
-
-function_body
-	: l_brace statements r_brace opt_semi opt_nls
-	| l_brace r_brace opt_semi opt_nls
-	;
-
-pattern
-	: exp
-	| exp ',' exp
-	;
-
-regexp
-	/*
-	 * In this rule, want_regexp tells yylex that the next thing
-	 * is a regexp so it should read up to the closing slash.
-	 */
-	: '/' {} REGEXP '/'
-	;
-
-action
-	: l_brace statements r_brace opt_semi opt_nls
-	| l_brace r_brace opt_semi opt_nls
-	;
-
-statements
-	: statement
-	| statements statement
-	| error
-	| statements error
-	;
-
-statement_term
-	: nls
-	| semi opt_nls
-	;
-
-statement
-	: semi opt_nls
-	| l_brace r_brace
-	| l_brace statements r_brace
-	| if_statement
-	| LEX_WHILE '(' exp r_paren opt_nls statement
-	| LEX_DO opt_nls statement LEX_WHILE '(' exp r_paren opt_nls
-	| LEX_FOR '(' NAME LEX_IN NAME r_paren opt_nls statement
-	| LEX_FOR '(' opt_exp semi opt_nls exp semi opt_nls opt_exp r_paren opt_nls statement
-	| LEX_FOR '(' opt_exp semi opt_nls semi opt_nls opt_exp r_paren opt_nls statement
-	| LEX_BREAK statement_term
-	| LEX_CONTINUE statement_term
-	| print '(' expression_list r_paren output_redir statement_term
-	| print opt_rexpression_list output_redir statement_term
-	| LEX_NEXT statement_term
-	| LEX_NEXTFILE statement_term
-	| LEX_EXIT opt_exp statement_term
-	| LEX_RETURN {} opt_exp statement_term
-	| LEX_DELETE NAME '[' expression_list ']' statement_term
-	| LEX_DELETE NAME  statement_term
-	| exp statement_term
-	;
-
-print
-	: LEX_PRINT
-	| LEX_PRINTF
-	;
-
-if_statement
-	: LEX_IF '(' exp r_paren opt_nls statement
-	| LEX_IF '(' exp r_paren opt_nls statement
-	     LEX_ELSE opt_nls statement
-	;
-
-nls
-	: NEWLINE
-	| nls NEWLINE
-	;
-
-opt_nls
-	: /* empty */
-	| nls
-	;
-
-input_redir
-	: /* empty */
-	| '<' simp_exp
-	;
-
-output_redir
-	: /* empty */
-	| '>' exp
-	| APPEND_OP exp
-	| '|' exp
-	| TWOWAYIO exp
-	;
-
-opt_param_list
-	: /* empty */
-	| param_list
-	;
-
-param_list
-	: NAME
-	| param_list comma NAME
-	| error
-	| param_list error
-	| param_list comma error
-	;
-
-/* optional expression, as in for loop */
-opt_exp
-	: /* empty */
-	| exp
-	;
-
-opt_rexpression_list
-	: /* empty */
-	| rexpression_list
-	;
-
-rexpression_list
-	: rexp
-	| rexpression_list comma rexp
-	| error
-	| rexpression_list error
-	| rexpression_list error rexp
-	| rexpression_list comma error
-	;
-
-opt_expression_list
-	: /* empty */
-	| expression_list
-	;
-
-expression_list
-	: exp
-	| expression_list comma exp
-	| error
-	| expression_list error
-	| expression_list error exp
-	| expression_list comma error
-	;
-
-/* Expressions, not including the comma operator.  */
-exp	: variable ASSIGNOP {} exp
-	| '(' expression_list r_paren LEX_IN NAME
-	| exp '|' LEX_GETLINE opt_variable
-	| exp TWOWAYIO LEX_GETLINE opt_variable
-	| LEX_GETLINE opt_variable input_redir
-	| exp LEX_AND exp
-	| exp LEX_OR exp
-	| exp MATCHOP exp
-	| regexp
-	| '!' regexp %prec UNARY
-	| exp LEX_IN NAME
-	| exp RELOP exp
-	| exp '<' exp
-	| exp '>' exp
-	| exp '?' exp ':' exp
-	| simp_exp
-	| exp simp_exp %prec CONCAT_OP
-	;
-
-rexp
-	: variable ASSIGNOP {} rexp
-	| rexp LEX_AND rexp
-	| rexp LEX_OR rexp
-	| LEX_GETLINE opt_variable input_redir
-	| regexp
-	| '!' regexp %prec UNARY
-	| rexp MATCHOP rexp
-	| rexp LEX_IN NAME
-	| rexp RELOP rexp
-	| rexp '?' rexp ':' rexp
-	| simp_exp
-	| rexp simp_exp %prec CONCAT_OP
-	;
-
-simp_exp
-	: non_post_simp_exp
-	/* Binary operators in order of decreasing precedence.  */
-	| simp_exp '^' simp_exp
-	| simp_exp '*' simp_exp
-	| simp_exp '/' simp_exp
-	| simp_exp '%' simp_exp
-	| simp_exp '+' simp_exp
-	| simp_exp '-' simp_exp
-	| variable INCREMENT
-	| variable DECREMENT
-	;
-
-non_post_simp_exp
-	: '!' simp_exp %prec UNARY
-	| '(' exp r_paren
-	| LEX_BUILTIN
-	  '(' opt_expression_list r_paren
-	| LEX_LENGTH '(' opt_expression_list r_paren
-	| LEX_LENGTH
-	| FUNC_CALL '(' opt_expression_list r_paren
-	| variable
-	| INCREMENT variable
-	| DECREMENT variable
-	| YNUMBER
-	| YSTRING
-	| '-' simp_exp    %prec UNARY
-	| '+' simp_exp    %prec UNARY
-	;
-
-opt_variable
-	: /* empty */
-	| variable
-	;
-
-variable
-	: NAME
-	| NAME '[' expression_list ']'
-	| '$' non_post_simp_exp
-	;
-
-l_brace
-	: '{' opt_nls
-	;
-
-r_brace
-	: '}' opt_nls
-	;
-
-r_paren
-	: ')'
-	;
-
-opt_semi
-	: /* empty */
-	| semi
-	;
-
-semi
-	: ';'
-	;
-
-comma	: ',' opt_nls
-	;
-
-%%
-_ATEOF
-
-
-# Pass plenty of options, to exercise plenty of code, even if we
-# don't actually check the output.  But SEGV is watching us, and
-# so might do dmalloc.
-$at_traceoff
-echo "existing.at:356: bison --verbose --defines input.y"
-echo existing.at:356 >$at_check_line_file
-( $at_traceon; bison --verbose --defines input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "existing.at:356: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  111 ) # 111. existing.at:364: GNU Cim Grammar
-    at_setup_line='existing.at:364'
-    at_desc='GNU Cim Grammar'
-    $at_quiet $ECHO_N "111: GNU Cim Grammar                              $ECHO_C"
-    at_xfail=no
-    (
-      echo "111. existing.at:364: testing ..."
-      $at_traceon
-
-
-# GNU Cim, the GNU Simula 87 Compiler.
-
-# Bison was once wrong, due to an incorrect computation of the RR conflicts.
-# It reported 80 SR && 99 RR conflicts instead of 78/10!!!
-
-cat >input.y <<'_ATEOF'
-%union {}
-
-%token
-	HACTIVATE HAFTER /*HAND*/ HARRAY HAT
-	HBEFORE HBEGIN HBOOLEAN
-	HCHARACTER HCLASS /*HCOMMENT*/ HCONC
-	HDELAY HDO
-	HELSE HEND HEQ /*HEQV*/ HEXTERNAL
-	HFOR
-	HGE HGO HGOTO HGT
-	HHIDDEN
-	HIF /*HIMP*/ HIN HINNER HINSPECT HINTEGER HIS
-	HLABEL HLE HLONG HLT
-	HNAME HNE HNEW HNONE /*HNOT*/ HNOTEXT
-	/*HOR*/ HOTHERWISE
-	HPRIOR HPROCEDURE HPROTECTED
-	HQUA
-	HREACTIVATE HREAL HREF
-	HSHORT HSTEP HSWITCH
-	HTEXT HTHEN HTHIS HTO
-	HUNTIL
-	HVALUE HVAR HVIRTUAL
-	HWHEN HWHILE
-
-	HASSIGNVALUE HASSIGNREF
-	/*HDOT*/ HPAREXPSEPARATOR HLABELSEPARATOR HSTATEMENTSEPARATOR
-	HBEGPAR HENDPAR
-	HEQR HNER
-	HADD HSUB HMUL HDIV HINTDIV HEXP
-	HDOTDOTDOT
-
-%token HIDENTIFIER
-%token HBOOLEANKONST HINTEGERKONST HCHARACTERKONST
-%token HREALKONST
-%token HTEXTKONST
-
-
-%right HASSIGN
-%left   HORELSE
-%left   HANDTHEN
-%left   HEQV
-%left   HIMP
-%left   HOR
-%left   HAND
-
-%left   HNOT
-
-%left HVALRELOPERATOR HREFRELOPERATOR HOBJRELOPERATOR
-
-%left	HCONC
-
-%left HTERMOPERATOR
-%left UNEAR
-%left HFACTOROPERATOR
-%left         HPRIMARYOPERATOR
-
-%left   HQUA
-
-%left   HDOT
-
-%start  MAIN_MODULE
-%%
-/* GRAMATIKK FOR PROGRAM MODULES */
-MAIN_MODULE     :       {}
-			MODULS
-		|	error HSTATEMENTSEPARATOR MBEE_DECLSTMS
-		;
-EXT_DECLARATION	:	HEXTERNAL
-			MBEE_TYPE
-			HPROCEDURE
-				{}
-			EXT_LIST
-		|
-			HEXTERNAL
-			HIDENTIFIER
-			HPROCEDURE
-				{}
-			HIDENTIFIER {}
-			EXTERNAL_KIND_ITEM
-		|	HEXTERNAL
-			HCLASS
-				{}
-			EXT_LIST
-
-		;
-EXTERNAL_KIND_ITEM:	EXT_IDENT
-			HOBJRELOPERATOR
-				{}
-			MBEE_TYPE HPROCEDURE
-			HIDENTIFIER
-				{}
-			HEADING EMPTY_BLOCK
-				{}
-/*		|
-			EXT_IDENT
-				{}
-			MBEE_REST_EXT_LIST
-		;
-MBEE_REST_EXT_LIST:	/* EMPTY
-		|	HPAREXPSEPARATOR EXT_KIND_LIST
-		;
-EXT_KIND_LIST	:	EXT_KIND_ITEM
-		|	EXT_KIND_LIST HPAREXPSEPARATOR EXT_KIND_ITEM
-		;
-EXT_KIND_ITEM	:	HIDENTIFIER
-			EXT_IDENT
-				{}*/
-		;
-EMPTY_BLOCK	:	/*EMPT*/
-		|	HBEGIN HEND
-		;
-EXT_LIST	:	EXT_ITEM
-		|	EXT_LIST HPAREXPSEPARATOR EXT_ITEM
-		;
-EXT_ITEM	:	HIDENTIFIER
-			EXT_IDENT
-		;
-EXT_IDENT	:	/* EMPTY */
-		|	HVALRELOPERATOR {}
-			HTEXTKONST
-		;
-/* GRAMATIKK FOR TYPER */
-NO_TYPE         :       /*EMPT*/
-		;
-MBEE_TYPE       :       NO_TYPE
-		|       TYPE
-		;
-TYPE            :       HREF HBEGPAR
-			HIDENTIFIER
-				{}
-			HENDPAR
-		|       HTEXT
-		|       HBOOLEAN
-		|       HCHARACTER
-		|       HSHORT HINTEGER
-		|       HINTEGER
-		|       HREAL
-		|       HLONG HREAL
-		;
-
-/* GRAMATIKK FOR DEL AV SETNINGER */
-MBEE_ELSE_PART  :       /*EMPT*/
-/*		|	HELSE
-			HIF
-			EXPRESSION
-			HTHEN   {}
-			BLOCK   {}
-			MBEE_ELSE_PART          {}*/
-		|       HELSE   {}
-			BLOCK
-		;
-FOR_LIST        :       FOR_LIST_ELEMENT
-		|       FOR_LIST_ELEMENT
-			HPAREXPSEPARATOR
-			FOR_LIST
-		;
-FOR_LIST_ELEMENT:       EXPRESSION
-			MBEE_F_L_EL_R_PT
-		;
-MBEE_F_L_EL_R_PT:       /*EMPT*/
-		|       HWHILE
-			EXPRESSION
-		|       HSTEP
-			EXPRESSION
-			HUNTIL
-			EXPRESSION
-		;
-GOTO            :       HGO
-			HTO
-		|       HGOTO
-		;
-CONN_STATE_R_PT :       WHEN_CLAUSE_LIST
-		|       HDO   {}
-			BLOCK
-		;
-WHEN_CLAUSE_LIST:       HWHEN
-			HIDENTIFIER
-			HDO    {}
-			BLOCK
-		|       WHEN_CLAUSE_LIST
-			HWHEN
-			HIDENTIFIER
-			HDO    {}
-			BLOCK
-		;
-MBEE_OTWI_CLAUS :       /*EMPT*/
-		|       HOTHERWISE {}
-
-			BLOCK
-		;
-ACTIVATOR	:	HACTIVATE
-		|	HREACTIVATE
-		;
-SCHEDULE	:	/*EMPT*/
-		|	ATDELAY EXPRESSION	{}
-			PRIOR
-		|	BEFOREAFTER		{}
-			EXPRESSION
-		;
-ATDELAY		:	HAT
-		|	HDELAY
-		;
-BEFOREAFTER	:	HBEFORE
-		|	HAFTER
-		;
-PRIOR		:	/*EMPT*/
-		|	HPRIOR
-		;
-/* GRAMATIKK FOR SETNINGER OG DEKLARASJONER */
-MODULSTATEMENT  :       HWHILE
-			EXPRESSION
-			HDO     {}
-			BLOCK
-		|       HIF
-			EXPRESSION
-			HTHEN   {}
-			BLOCK   {}
-			MBEE_ELSE_PART
-		|       HFOR
-			HIDENTIFIER
-			HASSIGN {}
-			FOR_LIST
-			HDO     {}
-			BLOCK
-		|       GOTO
-			EXPRESSION
-		|       HINSPECT
-			EXPRESSION              {}
-			CONN_STATE_R_PT
-				{}
-			MBEE_OTWI_CLAUS
-		|       HINNER
-		|       HIDENTIFIER
-			HLABELSEPARATOR
-				{}
-			DECLSTATEMENT
-		|       EXPRESSION_SIMP
-			HBEGIN
-				{}
-			IMPORT_SPEC_MODULE
-				{}
-			MBEE_DECLSTMS
-			HEND
-		|	EXPRESSION_SIMP HBEGIN error HSTATEMENTSEPARATOR
-			MBEE_DECLSTMS HEND
-		|	EXPRESSION_SIMP HBEGIN error HEND
-		|       EXPRESSION_SIMP
-		|	ACTIVATOR EXPRESSION SCHEDULE
-		|       HBEGIN
-				{}
-			MBEE_DECLSTMS
-			HEND
-		|       MBEE_TYPE HPROCEDURE
-			HIDENTIFIER
-				{}
-			HEADING BLOCK
-		|       HIDENTIFIER
-			HCLASS
-			NO_TYPE
-				{}
-			IMPORT_SPEC_MODULE
-			HIDENTIFIER
-				{}
-			HEADING
-			BLOCK
-		|       HCLASS
-			NO_TYPE
-			HIDENTIFIER
-				{}
-			HEADING
-			BLOCK
-		|       EXT_DECLARATION
-		|       /*EMPT*/
-		;
-IMPORT_SPEC_MODULE:
-		;
-DECLSTATEMENT	:	MODULSTATEMENT
-		|       TYPE
-			HIDENTIFIER
-			MBEE_CONSTANT
-			HPAREXPSEPARATOR
-				{}
-			IDENTIFIER_LISTC
-		|       TYPE
-			HIDENTIFIER
-			MBEE_CONSTANT
-		|       MBEE_TYPE
-			HARRAY  {}
-			ARR_SEGMENT_LIST
-		|       HSWITCH
-			HIDENTIFIER
-			HASSIGN {}
-			SWITCH_LIST
-		;
-BLOCK           :       DECLSTATEMENT
-		|       HBEGIN MBEE_DECLSTMS HEND
-		|	HBEGIN error HSTATEMENTSEPARATOR MBEE_DECLSTMS HEND
-		|	HBEGIN error HEND
-		;
-MBEE_DECLSTMS   :       MBEE_DECLSTMSU
-		;
-MBEE_DECLSTMSU  :       DECLSTATEMENT
-		|       MBEE_DECLSTMSU
-			HSTATEMENTSEPARATOR
-			DECLSTATEMENT
-		;
-MODULS		:	MODULSTATEMENT
-		|	MODULS HSTATEMENTSEPARATOR MODULSTATEMENT
-		;
-/* GRAMATIKK FOR DEL AV DEKLARASJONER */
-ARR_SEGMENT_LIST:       ARR_SEGMENT
-		|       ARR_SEGMENT_LIST
-			HPAREXPSEPARATOR
-			ARR_SEGMENT
-		;
-ARR_SEGMENT	:       ARRAY_SEGMENT
-			HBEGPAR
-			BAUND_PAIR_LIST HENDPAR
-		;
-ARRAY_SEGMENT   :       ARRAY_SEGMENT_EL        {}
-
-		|       ARRAY_SEGMENT_EL
-			HPAREXPSEPARATOR
-			ARRAY_SEGMENT
-		;
-ARRAY_SEGMENT_EL:       HIDENTIFIER
-		;
-BAUND_PAIR_LIST :       BAUND_PAIR
-		|       BAUND_PAIR
-			HPAREXPSEPARATOR
-			BAUND_PAIR_LIST
-		;
-BAUND_PAIR      :       EXPRESSION
-			HLABELSEPARATOR
-			EXPRESSION
-		;
-SWITCH_LIST     :       EXPRESSION
-		|       EXPRESSION
-			HPAREXPSEPARATOR
-			SWITCH_LIST
-		;
-HEADING         :       MBEE_FMAL_PAR_P HSTATEMENTSEPARATOR {}
-			MBEE_MODE_PART  {}
-			MBEE_SPEC_PART  {}
-			MBEE_PROT_PART  {}
-			MBEE_VIRT_PART
-		;
-MBEE_FMAL_PAR_P :       /*EMPT*/
-		|       FMAL_PAR_PART
-		;
-FMAL_PAR_PART   :       HBEGPAR NO_TYPE
-			MBEE_LISTV HENDPAR
-		;
-MBEE_LISTV      :       /*EMPT*/
-		|       LISTV
-		;
-LISTV           :       HIDENTIFIER
-		|	FPP_CATEG HDOTDOTDOT
-		|       HIDENTIFIER     {}
-			HPAREXPSEPARATOR LISTV
-		|       FPP_SPEC
-		|       FPP_SPEC
-			HPAREXPSEPARATOR LISTV
-		;
-FPP_HEADING     :       HBEGPAR NO_TYPE
-			FPP_MBEE_LISTV HENDPAR
-		;
-FPP_MBEE_LISTV  :       /*EMPT*/
-		|       FPP_LISTV
-		;
-FPP_LISTV       :	FPP_CATEG HDOTDOTDOT
-		|       FPP_SPEC
-		|       FPP_SPEC
-			HPAREXPSEPARATOR LISTV
-		;
-FPP_SPEC        :       FPP_CATEG SPECIFIER HIDENTIFIER
-		|	FPP_CATEG FPP_PROC_DECL_IN_SPEC
-		;
-FPP_CATEG       :       HNAME HLABELSEPARATOR
-		|       HVALUE HLABELSEPARATOR
-		|       HVAR HLABELSEPARATOR
-		|       /*EMPT*/
-		;
-FPP_PROC_DECL_IN_SPEC:	MBEE_TYPE HPROCEDURE
-			HIDENTIFIER
-					{}
-			FPP_HEADING {} { /* Yes, two "final" actions. */ }
-		;
-IDENTIFIER_LISTV:       HIDENTIFIER
-		|	HDOTDOTDOT
-		|       HIDENTIFIER     {}
-			HPAREXPSEPARATOR IDENTIFIER_LISTV
-		;
-MBEE_MODE_PART  :       /*EMPT*/
-		|       MODE_PART
-		;
-MODE_PART       :       NAME_PART
-		|       VALUE_PART
-		|       VAR_PART
-		|       NAME_PART VALUE_PART
-		|       VALUE_PART NAME_PART
-		|       NAME_PART VAR_PART
-		|       VAR_PART NAME_PART
-		|       VALUE_PART VAR_PART
-		|       VAR_PART VALUE_PART
-		|       VAR_PART NAME_PART VALUE_PART
-		|       NAME_PART VAR_PART VALUE_PART
-		|       NAME_PART VALUE_PART VAR_PART
-		|       VAR_PART VALUE_PART NAME_PART
-		|       VALUE_PART VAR_PART NAME_PART
-		|       VALUE_PART NAME_PART VAR_PART
-		;
-NAME_PART       :       HNAME           {}
-			IDENTIFIER_LISTV
-			HSTATEMENTSEPARATOR
-		;
-VAR_PART        :       HVAR            {}
-			IDENTIFIER_LISTV
-			HSTATEMENTSEPARATOR
-		;
-VALUE_PART      :       HVALUE          {}
-			IDENTIFIER_LISTV HSTATEMENTSEPARATOR
-		;
-MBEE_SPEC_PART  :       /*EMPT*/
-		|       SPEC_PART
-		;
-SPEC_PART       :       ONE_SPEC
-		|       SPEC_PART ONE_SPEC
-		;
-ONE_SPEC	:	SPECIFIER IDENTIFIER_LIST HSTATEMENTSEPARATOR
-		|	NO_TYPE HPROCEDURE HIDENTIFIER HOBJRELOPERATOR
-			  {}
-			PROC_DECL_IN_SPEC HSTATEMENTSEPARATOR
-		|       FPP_PROC_DECL_IN_SPEC HSTATEMENTSEPARATOR
-		|       MBEE_TYPE HPROCEDURE HIDENTIFIER HSTATEMENTSEPARATOR
-		|       MBEE_TYPE HPROCEDURE HIDENTIFIER HPAREXPSEPARATOR
-			IDENTIFIER_LIST HSTATEMENTSEPARATOR
-		;
-SPECIFIER       :       TYPE
-		|       MBEE_TYPE
-			HARRAY
-		|       HLABEL
-		|       HSWITCH
-		;
-PROC_DECL_IN_SPEC:	MBEE_TYPE HPROCEDURE
-			HIDENTIFIER
-					{}
-			HEADING
-					{}
-			MBEE_BEGIN_END
-		;
-MBEE_BEGIN_END	:	/* EMPTY */
-		|	HBEGIN HEND
-		;
-MBEE_PROT_PART  :       /*EMPT*/
-		|       PROTECTION_PART
-		;
-PROTECTION_PART :       PROT_SPECIFIER IDENTIFIER_LIST
-			HSTATEMENTSEPARATOR
-		|       PROTECTION_PART  PROT_SPECIFIER
-			IDENTIFIER_LIST HSTATEMENTSEPARATOR
-		;
-PROT_SPECIFIER  :       HHIDDEN
-		|       HPROTECTED
-		|       HHIDDEN
-			HPROTECTED
-		|       HPROTECTED
-			HHIDDEN
-		;
-MBEE_VIRT_PART  :       /*EMPT*/
-		|       VIRTUAL_PART
-		;
-VIRTUAL_PART    :       HVIRTUAL
-			HLABELSEPARATOR
-			MBEE_SPEC_PART
-		;
-IDENTIFIER_LIST :       HIDENTIFIER
-		|       IDENTIFIER_LIST HPAREXPSEPARATOR
-			HIDENTIFIER
-		;
-IDENTIFIER_LISTC:       HIDENTIFIER
-			MBEE_CONSTANT
-		|       IDENTIFIER_LISTC HPAREXPSEPARATOR
-			HIDENTIFIER
-			MBEE_CONSTANT
-		;
-MBEE_CONSTANT	:	/* EMPTY */
-		|	HVALRELOPERATOR
-				{}
-			EXPRESSION
-		;
-
-/* GRAMATIKK FOR UTTRYKK */
-EXPRESSION      :       EXPRESSION_SIMP
-		|       HIF
-			EXPRESSION
-			HTHEN
-			EXPRESSION
-			HELSE
-			EXPRESSION
-		;
-EXPRESSION_SIMP :	EXPRESSION_SIMP
-			HASSIGN
-			EXPRESSION
-		|
-
-			EXPRESSION_SIMP
-			HCONC
-			EXPRESSION_SIMP
-		|       EXPRESSION_SIMP HOR
-			HELSE
-			EXPRESSION_SIMP
-			%prec HORELSE
-		|       EXPRESSION_SIMP HAND
-			HTHEN
-			EXPRESSION_SIMP
-			%prec HANDTHEN
-		|       EXPRESSION_SIMP
-			HEQV EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HIMP EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HOR EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HAND EXPRESSION_SIMP
-		|       HNOT EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HVALRELOPERATOR
-			EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HREFRELOPERATOR
-			EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HOBJRELOPERATOR
-			EXPRESSION_SIMP
-		|       HTERMOPERATOR
-			EXPRESSION_SIMP %prec UNEAR
-		|       EXPRESSION_SIMP
-			HTERMOPERATOR
-			EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HFACTOROPERATOR
-			EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HPRIMARYOPERATOR
-			EXPRESSION_SIMP
-		|       HBEGPAR
-			EXPRESSION HENDPAR
-		|       HTEXTKONST
-		|       HCHARACTERKONST
-		|       HREALKONST
-		|       HINTEGERKONST
-		|       HBOOLEANKONST
-		|       HNONE
-		|       HIDENTIFIER
-				{}
-			MBEE_ARG_R_PT
-		|       HTHIS HIDENTIFIER
-		|       HNEW
-			HIDENTIFIER
-			ARG_R_PT
-		|       EXPRESSION_SIMP
-			HDOT
-			EXPRESSION_SIMP
-		|       EXPRESSION_SIMP
-			HQUA HIDENTIFIER
-		;
-ARG_R_PT        :       /*EMPTY*/
-		|       HBEGPAR
-			ARGUMENT_LIST HENDPAR
-		;
-MBEE_ARG_R_PT   :       /*EMPTY*/
-		|       HBEGPAR
-			ARGUMENT_LIST HENDPAR
-		;
-ARGUMENT_LIST   :       EXPRESSION
-		|       EXPRESSION
-			HPAREXPSEPARATOR
-			ARGUMENT_LIST
-		;
-%%
-_ATEOF
-
-
-# Pass plenty of options, to exercise plenty of code, even if we
-# don't actually check the output.  But SEGV is watching us, and
-# so might do dmalloc.
-$at_traceoff
-echo "existing.at:960: bison --verbose --defines input.y"
-echo existing.at:960 >$at_check_line_file
-( $at_traceon; bison --verbose --defines input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y: conflicts: 78 shift/reduce, 10 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "existing.at:960: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "existing.at:972: grep '^State.*conflicts:' input.output"
-echo existing.at:972 >$at_check_line_file
-( $at_traceon; grep '^State.*conflicts:' input.output ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "State 64 conflicts: 14 shift/reduce
-State 164 conflicts: 1 shift/reduce
-State 201 conflicts: 33 shift/reduce, 4 reduce/reduce
-State 206 conflicts: 1 shift/reduce
-State 240 conflicts: 1 shift/reduce
-State 335 conflicts: 9 shift/reduce, 2 reduce/reduce
-State 356 conflicts: 1 shift/reduce
-State 360 conflicts: 9 shift/reduce, 2 reduce/reduce
-State 427 conflicts: 9 shift/reduce, 2 reduce/reduce
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "existing.at:972: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  112 ) # 112. existing.at:980: GNU pic Grammar
-    at_setup_line='existing.at:980'
-    at_desc='GNU pic Grammar'
-    $at_quiet $ECHO_N "112: GNU pic Grammar                              $ECHO_C"
-    at_xfail=no
-    (
-      echo "112. existing.at:980: testing ..."
-      $at_traceon
-
-
-# GNU pic, part of groff.
-
-# Bison once reported shift/reduce conflicts that it shouldn't have.
-
-cat >input.y <<'_ATEOF'
-%union {}
-
-%token LABEL
-%token VARIABLE
-%token NUMBER
-%token TEXT
-%token COMMAND_LINE
-%token DELIMITED
-%token ORDINAL
-%token TH
-%token LEFT_ARROW_HEAD
-%token RIGHT_ARROW_HEAD
-%token DOUBLE_ARROW_HEAD
-%token LAST
-%token UP
-%token DOWN
-%token LEFT
-%token RIGHT
-%token BOX
-%token CIRCLE
-%token ELLIPSE
-%token ARC
-%token LINE
-%token ARROW
-%token MOVE
-%token SPLINE
-%token HEIGHT
-%token RADIUS
-%token WIDTH
-%token DIAMETER
-%token FROM
-%token TO
-%token AT
-%token WITH
-%token BY
-%token THEN
-%token SOLID
-%token DOTTED
-%token DASHED
-%token CHOP
-%token SAME
-%token INVISIBLE
-%token LJUST
-%token RJUST
-%token ABOVE
-%token BELOW
-%token OF
-%token THE
-%token WAY
-%token BETWEEN
-%token AND
-%token HERE
-%token DOT_N
-%token DOT_E
-%token DOT_W
-%token DOT_S
-%token DOT_NE
-%token DOT_SE
-%token DOT_NW
-%token DOT_SW
-%token DOT_C
-%token DOT_START
-%token DOT_END
-%token DOT_X
-%token DOT_Y
-%token DOT_HT
-%token DOT_WID
-%token DOT_RAD
-%token SIN
-%token COS
-%token ATAN2
-%token LOG
-%token EXP
-%token SQRT
-%token K_MAX
-%token K_MIN
-%token INT
-%token RAND
-%token SRAND
-%token COPY
-%token THRU
-%token TOP
-%token BOTTOM
-%token UPPER
-%token LOWER
-%token SH
-%token PRINT
-%token CW
-%token CCW
-%token FOR
-%token DO
-%token IF
-%token ELSE
-%token ANDAND
-%token OROR
-%token NOTEQUAL
-%token EQUALEQUAL
-%token LESSEQUAL
-%token GREATEREQUAL
-%token LEFT_CORNER
-%token RIGHT_CORNER
-%token NORTH
-%token SOUTH
-%token EAST
-%token WEST
-%token CENTER
-%token END
-%token START
-%token RESET
-%token UNTIL
-%token PLOT
-%token THICKNESS
-%token FILL
-%token COLORED
-%token OUTLINED
-%token SHADED
-%token ALIGNED
-%token SPRINTF
-%token COMMAND
-
-%left '.'
-
-/* this ensures that plot 17 "%g" parses as (plot 17 "%g") */
-%left PLOT
-%left TEXT SPRINTF
-
-/* give text adjustments higher precedence than TEXT, so that
-box "foo" above ljust == box ("foo" above ljust)
-*/
-
-%left LJUST RJUST ABOVE BELOW
-
-%left LEFT RIGHT
-/* Give attributes that take an optional expression a higher
-precedence than left and right, so that eg `line chop left'
-parses properly. */
-%left CHOP SOLID DASHED DOTTED UP DOWN FILL COLORED OUTLINED
-%left LABEL
-
-%left VARIABLE NUMBER '(' SIN COS ATAN2 LOG EXP SQRT K_MAX K_MIN INT RAND SRAND LAST
-%left ORDINAL HERE '`'
-
-%left BOX CIRCLE ELLIPSE ARC LINE ARROW SPLINE '[' /* ] */
-
-/* these need to be lower than '-' */
-%left HEIGHT RADIUS WIDTH DIAMETER FROM TO AT THICKNESS
-
-/* these must have higher precedence than CHOP so that `label %prec CHOP'
-works */
-%left DOT_N DOT_E DOT_W DOT_S DOT_NE DOT_SE DOT_NW DOT_SW DOT_C
-%left DOT_START DOT_END TOP BOTTOM LEFT_CORNER RIGHT_CORNER
-%left UPPER LOWER NORTH SOUTH EAST WEST CENTER START END
-
-%left ','
-%left OROR
-%left ANDAND
-%left EQUALEQUAL NOTEQUAL
-%left '<' '>' LESSEQUAL GREATEREQUAL
-
-%left BETWEEN OF
-%left AND
-
-%left '+' '-'
-%left '*' '/' '%'
-%right '!'
-%right '^'
-
-%%
-
-top:
-	optional_separator
-	| element_list
-	;
-
-element_list:
-	optional_separator middle_element_list optional_separator
-	;
-
-middle_element_list:
-	element
-	| middle_element_list separator element
-	;
-
-optional_separator:
-	/* empty */
-	| separator
-	;
-
-separator:
-	';'
-	| separator ';'
-	;
-
-placeless_element:
-	VARIABLE '=' any_expr
-	| VARIABLE ':' '=' any_expr
-	| UP
-	| DOWN
-	| LEFT
-	| RIGHT
-	| COMMAND_LINE
-	| COMMAND print_args
-	| PRINT print_args
-	| SH
-		{}
-	  DELIMITED
-	| COPY TEXT
-	| COPY TEXT THRU
-		{}
-	  DELIMITED
-		{}
-	  until
-	| COPY THRU
-		{}
-	  DELIMITED
-		{}
-	  until
-	| FOR VARIABLE '=' expr TO expr optional_by DO
-		{}
-	  DELIMITED
-	| simple_if
-	| simple_if ELSE
-		{}
-	  DELIMITED
-	| reset_variables
-	| RESET
-	;
-
-reset_variables:
-	RESET VARIABLE
-	| reset_variables VARIABLE
-	| reset_variables ',' VARIABLE
-	;
-
-print_args:
-	print_arg
-	| print_args print_arg
-	;
-
-print_arg:
-	expr							%prec ','
-	| text
-	| position						%prec ','
-	;
-
-simple_if:
-	IF any_expr THEN
-		{}
-	DELIMITED
-	;
-
-until:
-	/* empty */
-	| UNTIL TEXT
-	;
-
-any_expr:
-	expr
-	| text_expr
-	;
-
-text_expr:
-	text EQUALEQUAL text
-	| text NOTEQUAL text
-	| text_expr ANDAND text_expr
-	| text_expr ANDAND expr
-	| expr ANDAND text_expr
-	| text_expr OROR text_expr
-	| text_expr OROR expr
-	| expr OROR text_expr
-	| '!' text_expr
-	;
-
-optional_by:
-	/* empty */
-	| BY expr
-	| BY '*' expr
-	;
-
-element:
-	object_spec
-	| LABEL ':' optional_separator element
-	| LABEL ':' optional_separator position_not_place
-	| LABEL ':' optional_separator place
-	| '{}'
-		{}
-	  optional_element
-	| placeless_element
-	;
-
-optional_element:
-	/* empty */
-	| element
-	;
-
-object_spec:
-	BOX
-	| CIRCLE
-	| ELLIPSE
-	| ARC
-	| LINE
-	| ARROW
-	| MOVE
-	| SPLINE
-	| text							%prec TEXT
-	| PLOT expr
-	| PLOT expr text
-	| '['
-		{}
-	  element_list ']'
-	| object_spec HEIGHT expr
-	| object_spec RADIUS expr
-	| object_spec WIDTH expr
-	| object_spec DIAMETER expr
-	| object_spec expr					%prec HEIGHT
-	| object_spec UP
-	| object_spec UP expr
-	| object_spec DOWN
-	| object_spec DOWN expr
-	| object_spec RIGHT
-	| object_spec RIGHT expr
-	| object_spec LEFT
-	| object_spec LEFT expr
-	| object_spec FROM position
-	| object_spec TO position
-	| object_spec AT position
-	| object_spec WITH path
-	| object_spec WITH position				%prec ','
-	| object_spec BY expr_pair
-	| object_spec THEN
-	| object_spec SOLID
-	| object_spec DOTTED
-	| object_spec DOTTED expr
-	| object_spec DASHED
-	| object_spec DASHED expr
-	| object_spec FILL
-	| object_spec FILL expr
-	| object_spec SHADED text
-	| object_spec COLORED text
-	| object_spec OUTLINED text
-	| object_spec CHOP
-	| object_spec CHOP expr
-	| object_spec SAME
-	| object_spec INVISIBLE
-	| object_spec LEFT_ARROW_HEAD
-	| object_spec RIGHT_ARROW_HEAD
-	| object_spec DOUBLE_ARROW_HEAD
-	| object_spec CW
-	| object_spec CCW
-	| object_spec text					%prec TEXT
-	| object_spec LJUST
-	| object_spec RJUST
-	| object_spec ABOVE
-	| object_spec BELOW
-	| object_spec THICKNESS expr
-	| object_spec ALIGNED
-	;
-
-text:
-	TEXT
-	| SPRINTF '(' TEXT sprintf_args ')'
-	;
-
-sprintf_args:
-	/* empty */
-	| sprintf_args ',' expr
-	;
-
-position:
-	position_not_place
-	| place
-	;
-
-position_not_place:
-	expr_pair
-	| position '+' expr_pair
-	| position '-' expr_pair
-	| '(' position ',' position ')'
-	| expr between position AND position
-	| expr '<' position ',' position '>'
-	;
-
-between:
-	BETWEEN
-	| OF THE WAY BETWEEN
-	;
-
-expr_pair:
-	expr ',' expr
-	| '(' expr_pair ')'
-	;
-
-place:
-	/* line at A left == line (at A) left */
-	label							%prec CHOP
-	| label corner
-	| corner label
-	| corner OF label
-	| HERE
-	;
-
-label:
-	LABEL
-	| nth_primitive
-	| label '.' LABEL
-	;
-
-ordinal:
-	ORDINAL
-	| '`' any_expr TH
-	;
-
-optional_ordinal_last:
-	LAST
-	| ordinal LAST
-	;
-
-nth_primitive:
-	ordinal object_type
-	| optional_ordinal_last object_type
-	;
-
-object_type:
-	BOX
-	| CIRCLE
-	| ELLIPSE
-	| ARC
-	| LINE
-	| ARROW
-	| SPLINE
-	| '[' ']'
-	| TEXT
-	;
-
-label_path:
-	'.' LABEL
-	| label_path '.' LABEL
-	;
-
-relative_path:
-	corner							%prec CHOP
-	/* give this a lower precedence than LEFT and RIGHT so that
-	   [A: box] with .A left == [A: box] with (.A left) */
-	| label_path						%prec TEXT
-	| label_path corner
-	;
-
-path:
-	relative_path
-	| '(' relative_path ',' relative_path ')'
-		{}
-	/* The rest of these rules are a compatibility sop. */
-	| ORDINAL LAST object_type relative_path
-	| LAST object_type relative_path
-	| ORDINAL object_type relative_path
-	| LABEL relative_path
-	;
-
-corner:
-	DOT_N
-	| DOT_E
-	| DOT_W
-	| DOT_S
-	| DOT_NE
-	| DOT_SE
-	| DOT_NW
-	| DOT_SW
-	| DOT_C
-	| DOT_START
-	| DOT_END
-	| TOP
-	| BOTTOM
-	| LEFT
-	| RIGHT
-	| UPPER LEFT
-	| LOWER LEFT
-	| UPPER RIGHT
-	| LOWER RIGHT
-	| LEFT_CORNER
-	| RIGHT_CORNER
-	| UPPER LEFT_CORNER
-	| LOWER LEFT_CORNER
-	| UPPER RIGHT_CORNER
-	| LOWER RIGHT_CORNER
-	| NORTH
-	| SOUTH
-	| EAST
-	| WEST
-	| CENTER
-	| START
-	| END
-	;
-
-expr:
-	VARIABLE
-	| NUMBER
-	| place DOT_X
-	| place DOT_Y
-	| place DOT_HT
-	| place DOT_WID
-	| place DOT_RAD
-	| expr '+' expr
-	| expr '-' expr
-	| expr '*' expr
-	| expr '/' expr
-	| expr '%' expr
-	| expr '^' expr
-	| '-' expr						%prec '!'
-	| '(' any_expr ')'
-	| SIN '(' any_expr ')'
-	| COS '(' any_expr ')'
-	| ATAN2 '(' any_expr ',' any_expr ')'
-	| LOG '(' any_expr ')'
-	| EXP '(' any_expr ')'
-	| SQRT '(' any_expr ')'
-	| K_MAX '(' any_expr ',' any_expr ')'
-	| K_MIN '(' any_expr ',' any_expr ')'
-	| INT '(' any_expr ')'
-	| RAND '(' any_expr ')'
-	| RAND '(' ')'
-	| SRAND '(' any_expr ')'
-	| expr '<' expr
-	| expr LESSEQUAL expr
-	| expr '>' expr
-	| expr GREATEREQUAL expr
-	| expr EQUALEQUAL expr
-	| expr NOTEQUAL expr
-	| expr ANDAND expr
-	| expr OROR expr
-	| '!' expr
-	;
-_ATEOF
-
-
-# Pass plenty of options, to exercise plenty of code, even if we
-# don't actually check the output.  But SEGV is watching us, and
-# so might do dmalloc.
-$at_traceoff
-echo "existing.at:1523: bison --verbose --defines input.y"
-echo existing.at:1523 >$at_check_line_file
-( $at_traceon; bison --verbose --defines input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "existing.at:1523: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-15 ) # Banner 15. regression.at:21
-    cat <<\_ATEOF
-
-Regression tests.
-
-_ATEOF
-    ;;
-
-  113 ) # 113. regression.at:28: Trivial grammars
-    at_setup_line='regression.at:28'
-    at_desc='Trivial grammars'
-    $at_quiet $ECHO_N "113: Trivial grammars                             $ECHO_C"
-    at_xfail=no
-    (
-      echo "113. regression.at:28: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-void yyerror (char const *);
-int yylex (void);
-#define YYSTYPE int *
-%}
-
-%error-verbose
-
-%%
-
-program: 'x';
-_ATEOF
-
-
-
-$at_traceoff
-echo "regression.at:44: bison -o input.c input.y"
-echo regression.at:44 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:44: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:45: \$CC \$CFLAGS \$CPPFLAGS -o input.o -c input.c"
-echo regression.at:45 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -o input.o -c input.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:45: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:46: \$CC \$CFLAGS \$CPPFLAGS -o input.o -DYYDEBUG -c input.c"
-echo regression.at:46 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -o input.o -DYYDEBUG -c input.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:46: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  114 ) # 114. regression.at:57: Early token definitions
-    at_setup_line='regression.at:57'
-    at_desc='Early token definitions'
-    $at_quiet $ECHO_N "114: Early token definitions                      $ECHO_C"
-    at_xfail=no
-    (
-      echo "114. regression.at:57: testing ..."
-      $at_traceon
-
-
-# Found in GCJ: they expect the tokens to be defined before the user
-# prologue, so that they can use the token definitions in it.
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-void yyerror (const char *s);
-int yylex (void);
-%}
-
-%union
-{
-  int val;
-};
-%{
-#ifndef MY_TOKEN
-# error "MY_TOKEN not defined."
-#endif
-%}
-%token MY_TOKEN
-%%
-exp: MY_TOKEN;
-%%
-_ATEOF
-
-
-
-$at_traceoff
-echo "regression.at:83: bison -o input.c input.y"
-echo regression.at:83 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:83: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:84: \$CC \$CFLAGS \$CPPFLAGS -o input.o -c input.c"
-echo regression.at:84 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -o input.o -c input.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:84: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  115 ) # 115. regression.at:95: Braces parsing
-    at_setup_line='regression.at:95'
-    at_desc='Braces parsing'
-    $at_quiet $ECHO_N "115: Braces parsing                               $ECHO_C"
-    at_xfail=no
-    (
-      echo "115. regression.at:95: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-/* Bison used to swallow the character after `}'. */
-
-%%
-exp: { tests = {{{{{{{{{{}}}}}}}}}}; };
-%%
-_ATEOF
-
-
-$at_traceoff
-echo "regression.at:105: bison -v -o input.c input.y"
-echo regression.at:105 >$at_check_line_file
-( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:105: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "regression.at:107: grep 'tests = {{{{{{{{{{}}}}}}}}}};' input.c"
-echo regression.at:107 >$at_check_line_file
-( $at_traceon; grep 'tests = {{{{{{{{{{}}}}}}}}}};' input.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:107: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  116 ) # 116. regression.at:117: Duplicate string
-    at_setup_line='regression.at:117'
-    at_desc='Duplicate string'
-    $at_quiet $ECHO_N "116: Duplicate string                             $ECHO_C"
-    at_xfail=no
-    (
-      echo "116. regression.at:117: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-/* `Bison -v' used to dump core when two tokens are defined with the same
-   string, as LE and GE below. */
-
-%token NUM
-%token LE "<="
-%token GE "<="
-
-%%
-exp: '(' exp ')' | NUM ;
-%%
-_ATEOF
-
-
-$at_traceoff
-echo "regression.at:134: bison -v -o input.c input.y"
-echo regression.at:134 >$at_check_line_file
-( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y:6.8-14: warning: symbol \`\"<=\"' used more than once as a literal string
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:134: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  117 ) # 117. regression.at:143: Rule Line Numbers
-    at_setup_line='regression.at:143'
-    at_desc='Rule Line Numbers'
-    $at_quiet $ECHO_N "117: Rule Line Numbers                            $ECHO_C"
-    at_xfail=no
-    (
-      echo "117. regression.at:143: testing ..."
-      $at_traceon
-
-
-
-
-cat >input.y <<'_ATEOF'
-%%
-expr:
-'a'
-
-{
-
-}
-
-'b'
-
-{
-
-}
-
-|
-
-
-{
-
-
-}
-
-'c'
-
-{
-
-};
-_ATEOF
-
-
-$at_traceoff
-echo "regression.at:177: bison -o input.c -v input.y"
-echo regression.at:177 >$at_check_line_file
-( $at_traceon; bison -o input.c -v input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:177: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Check the contents of the report.
-$at_traceoff
-echo "regression.at:276: cat input.output"
-echo regression.at:276 >$at_check_line_file
-( $at_traceon; cat input.output ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "Grammar
-
-    0 \$accept: expr \$end
-
-    1 @1: /* empty */
-
-    2 expr: 'a' @1 'b'
-
-    3 @2: /* empty */
-
-    4 expr: @2 'c'
-
-
-Terminals, with rules where they appear
-
-\$end (0) 0
-'a' (97) 2
-'b' (98) 2
-'c' (99) 4
-error (256)
-
-
-Nonterminals, with rules where they appear
-
-\$accept (6)
-    on left: 0
-expr (7)
-    on left: 2 4, on right: 0
-@1 (8)
-    on left: 1, on right: 2
-@2 (9)
-    on left: 3, on right: 4
-
-
-state 0
-
-    0 \$accept: . expr \$end
-
-    'a'  shift, and go to state 1
-
-    \$default  reduce using rule 3 (@2)
-
-    expr  go to state 2
-    @2    go to state 3
-
-
-state 1
-
-    2 expr: 'a' . @1 'b'
-
-    \$default  reduce using rule 1 (@1)
-
-    @1  go to state 4
-
-
-state 2
-
-    0 \$accept: expr . \$end
-
-    \$end  shift, and go to state 5
-
-
-state 3
-
-    4 expr: @2 . 'c'
-
-    'c'  shift, and go to state 6
-
-
-state 4
-
-    2 expr: 'a' @1 . 'b'
-
-    'b'  shift, and go to state 7
-
-
-state 5
-
-    0 \$accept: expr \$end .
-
-    \$default  accept
-
-
-state 6
-
-    4 expr: @2 'c' .
-
-    \$default  reduce using rule 4 (expr)
-
-
-state 7
-
-    2 expr: 'a' @1 'b' .
-
-    \$default  reduce using rule 2 (expr)
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:276: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  118 ) # 118. regression.at:287: Mixing %token styles
-    at_setup_line='regression.at:287'
-    at_desc='Mixing %token styles'
-    $at_quiet $ECHO_N "118: Mixing %token styles                         $ECHO_C"
-    at_xfail=no
-    (
-      echo "118. regression.at:287: testing ..."
-      $at_traceon
-
-
-# Taken from the documentation.
-cat >input.y <<'_ATEOF'
-%token  <operator>  OR      "||"
-%token  <operator>  LE 134  "<="
-%left  OR  "<="
-%%
-exp: ;
-%%
-_ATEOF
-
-
-$at_traceoff
-echo "regression.at:299: bison -v -o input.c input.y"
-echo regression.at:299 >$at_check_line_file
-( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:299: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  119 ) # 119. regression.at:310: Invalid inputs
-    at_setup_line='regression.at:310'
-    at_desc='Invalid inputs'
-    $at_quiet $ECHO_N "119: Invalid inputs                               $ECHO_C"
-    at_xfail=no
-    (
-      echo "119. regression.at:310: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%%
-?
-default: 'a' }
-%&
-%a-does-not-exist
-%-
-%{
-_ATEOF
-
-
-$at_traceoff
-echo "regression.at:331: bison input.y"
-echo regression.at:331 >$at_check_line_file
-( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y:2.1: invalid character: \`?'
-input.y:3.14: invalid character: \`}'
-input.y:4.1: invalid character: \`%'
-input.y:4.2: invalid character: \`&'
-input.y:5.1-17: invalid directive: \`%a-does-not-exist'
-input.y:6.1: invalid character: \`%'
-input.y:6.2: invalid character: \`-'
-input.y:7.1-8.0: missing \`%}' at end of file
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "regression.at:331: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  120 ) # 120. regression.at:336: Invalid inputs with {}
-    at_setup_line='regression.at:336'
-    at_desc='Invalid inputs with {}'
-    $at_quiet $ECHO_N "120: Invalid inputs with {}                       $ECHO_C"
-    at_xfail=no
-    (
-      echo "120. regression.at:336: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-
-%destructor
-%initial-action
-%lex-param
-%parse-param
-%printer
-%union
-_ATEOF
-
-
-$at_traceoff
-echo "regression.at:352: bison input.y"
-echo regression.at:352 >$at_check_line_file
-( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "input.y:3.1: missing \`{' in \"%destructor {...}\"
-input.y:4.1: missing \`{' in \"%initial-action {...}\"
-input.y:4.1: syntax error, unexpected %initial-action {...}, expecting string or identifier
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "regression.at:352: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  121 ) # 121. regression.at:363: Token definitions
-    at_setup_line='regression.at:363'
-    at_desc='Token definitions'
-    $at_quiet $ECHO_N "121: Token definitions                            $ECHO_C"
-    at_xfail=no
-    (
-      echo "121. regression.at:363: testing ..."
-      $at_traceon
-
-
-# Bison managed, when fed with `%token 'f' "f"' to #define 'f'!
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-#include <stdio.h>
-void yyerror (const char *s);
-int yylex (void);
-%}
-%error-verbose
-%token MYEOF 0 "end of file"
-%token 'a' "a"
-%token B_TOKEN "b"
-%token C_TOKEN 'c'
-%token 'd' D_TOKEN
-%token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
-%%
-exp: "a" "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!";
-%%
-void
-yyerror (char const *s)
-{
-  fprintf (stderr, "%s\n", s);
-}
-
-int
-yylex (void)
-{
-  return SPECIAL;
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "regression.at:401: bison -o input.c input.y"
-echo regression.at:401 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:401: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:402: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o input input.c \$LIBS"
-echo regression.at:402 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o input input.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:402: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-cat >experr <<'_ATEOF'
-syntax error, unexpected "\\'?\"\a\b\f\n\r\t\v\001\201\001\201?\?!", expecting a
-_ATEOF
-
-$at_traceoff
-echo "regression.at:406: \$PREPARSER ./input"
-echo regression.at:406 >$at_check_line_file
-( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff experr $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "regression.at:406: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  122 ) # 122. regression.at:416: Characters Escapes
-    at_setup_line='regression.at:416'
-    at_desc='Characters Escapes'
-    $at_quiet $ECHO_N "122: Characters Escapes                           $ECHO_C"
-    at_xfail=no
-    (
-      echo "122. regression.at:416: testing ..."
-      $at_traceon
-
-
-cat >input.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-void yyerror (const char *s);
-int yylex (void);
-%}
-%%
-exp:
-  '\'' "\'"
-| '\"' "\""
-| '"'  "'"
-;
-_ATEOF
-
-
-# Pacify font-lock-mode: "
-
-$at_traceoff
-echo "regression.at:432: bison -o input.c input.y"
-echo regression.at:432 >$at_check_line_file
-( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:432: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:433: \$CC \$CFLAGS \$CPPFLAGS -o input.o -c input.c"
-echo regression.at:433 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS -o input.o -c input.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:433: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  123 ) # 123. regression.at:447: Web2c Report
-    at_setup_line='regression.at:447'
-    at_desc='Web2c Report'
-    $at_quiet $ECHO_N "123: Web2c Report                                 $ECHO_C"
-    at_xfail=no
-    (
-      echo "123. regression.at:447: testing ..."
-      $at_traceon
-
-
-
-
-cat >input.y <<'_ATEOF'
-%token	undef_id_tok const_id_tok
-
-%start CONST_DEC_PART
-
-%%
-CONST_DEC_PART:
-         CONST_DEC_LIST
-        ;
-
-CONST_DEC_LIST:
-	  CONST_DEC
-        | CONST_DEC_LIST CONST_DEC
-        ;
-
-CONST_DEC:
-	  { } undef_id_tok '=' const_id_tok ';'
-        ;
-%%
-_ATEOF
-
-
-$at_traceoff
-echo "regression.at:472: bison -v input.y"
-echo regression.at:472 >$at_check_line_file
-( $at_traceon; bison -v input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:472: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:597: cat input.output"
-echo regression.at:597 >$at_check_line_file
-( $at_traceon; cat input.output ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "Grammar
-
-    0 \$accept: CONST_DEC_PART \$end
-
-    1 CONST_DEC_PART: CONST_DEC_LIST
-
-    2 CONST_DEC_LIST: CONST_DEC
-    3               | CONST_DEC_LIST CONST_DEC
-
-    4 @1: /* empty */
-
-    5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';'
-
-
-Terminals, with rules where they appear
-
-\$end (0) 0
-';' (59) 5
-'=' (61) 5
-error (256)
-undef_id_tok (258) 5
-const_id_tok (259) 5
-
-
-Nonterminals, with rules where they appear
-
-\$accept (7)
-    on left: 0
-CONST_DEC_PART (8)
-    on left: 1, on right: 0
-CONST_DEC_LIST (9)
-    on left: 2 3, on right: 1 3
-CONST_DEC (10)
-    on left: 5, on right: 2 3
-@1 (11)
-    on left: 4, on right: 5
-
-
-state 0
-
-    0 \$accept: . CONST_DEC_PART \$end
-
-    \$default  reduce using rule 4 (@1)
-
-    CONST_DEC_PART  go to state 1
-    CONST_DEC_LIST  go to state 2
-    CONST_DEC       go to state 3
-    @1              go to state 4
-
-
-state 1
-
-    0 \$accept: CONST_DEC_PART . \$end
-
-    \$end  shift, and go to state 5
-
-
-state 2
-
-    1 CONST_DEC_PART: CONST_DEC_LIST .
-    3 CONST_DEC_LIST: CONST_DEC_LIST . CONST_DEC
-
-    undef_id_tok  reduce using rule 4 (@1)
-    \$default      reduce using rule 1 (CONST_DEC_PART)
-
-    CONST_DEC  go to state 6
-    @1         go to state 4
-
-
-state 3
-
-    2 CONST_DEC_LIST: CONST_DEC .
-
-    \$default  reduce using rule 2 (CONST_DEC_LIST)
-
-
-state 4
-
-    5 CONST_DEC: @1 . undef_id_tok '=' const_id_tok ';'
-
-    undef_id_tok  shift, and go to state 7
-
-
-state 5
-
-    0 \$accept: CONST_DEC_PART \$end .
-
-    \$default  accept
-
-
-state 6
-
-    3 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC .
-
-    \$default  reduce using rule 3 (CONST_DEC_LIST)
-
-
-state 7
-
-    5 CONST_DEC: @1 undef_id_tok . '=' const_id_tok ';'
-
-    '='  shift, and go to state 8
-
-
-state 8
-
-    5 CONST_DEC: @1 undef_id_tok '=' . const_id_tok ';'
-
-    const_id_tok  shift, and go to state 9
-
-
-state 9
-
-    5 CONST_DEC: @1 undef_id_tok '=' const_id_tok . ';'
-
-    ';'  shift, and go to state 10
-
-
-state 10
-
-    5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';' .
-
-    \$default  reduce using rule 5 (CONST_DEC)
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:597: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  124 ) # 124. regression.at:624: Web2c Actions
-    at_setup_line='regression.at:624'
-    at_desc='Web2c Actions'
-    $at_quiet $ECHO_N "124: Web2c Actions                                $ECHO_C"
-    at_xfail=no
-    (
-      echo "124. regression.at:624: testing ..."
-      $at_traceon
-
-
-
-
-cat >input.y <<'_ATEOF'
-%%
-statement:  struct_stat;
-struct_stat:  /* empty. */ | if else;
-if: "if" "const" "then" statement;
-else: "else" statement;
-%%
-_ATEOF
-
-
-$at_traceoff
-echo "regression.at:637: bison -v -o input.c input.y"
-echo regression.at:637 >$at_check_line_file
-( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:637: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-# Check only the tables.  We don't use --no-parser, because it is
-# still to be implemented in the experimental branch of Bison.
-sed -n 's/  *$//;/^static const.*\[\] =/,/^}/p' input.c >tables.c
-
-$at_traceoff
-echo "regression.at:735: cat tables.c"
-echo regression.at:735 >$at_check_line_file
-( $at_traceon; cat tables.c ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "static const yytype_uint8 yytranslate[] =
-{
-       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
-       5,     6
-};
-static const yytype_uint8 yyprhs[] =
-{
-       0,     0,     3,     5,     6,     9,    14
-};
-static const yytype_int8 yyrhs[] =
-{
-       8,     0,    -1,     9,    -1,    -1,    10,    11,    -1,     3,
-       4,     5,     8,    -1,     6,     8,    -1
-};
-static const yytype_uint8 yyrline[] =
-{
-       0,     2,     2,     3,     3,     4,     5
-};
-static const char *const yytname[] =
-{
-  \"\$end\", \"error\", \"\$undefined\", \"\\\"if\\\"\", \"\\\"const\\\"\", \"\\\"then\\\"\",
-  \"\\\"else\\\"\", \"\$accept\", \"statement\", \"struct_stat\", \"if\", \"else\", 0
-};
-static const yytype_uint16 yytoknum[] =
-{
-       0,   256,   257,   258,   259,   260,   261
-};
-static const yytype_uint8 yyr1[] =
-{
-       0,     7,     8,     9,     9,    10,    11
-};
-static const yytype_uint8 yyr2[] =
-{
-       0,     2,     1,     0,     2,     4,     2
-};
-static const yytype_uint8 yydefact[] =
-{
-       3,     0,     0,     2,     0,     0,     1,     3,     4,     3,
-       6,     5
-};
-static const yytype_int8 yydefgoto[] =
-{
-      -1,     2,     3,     4,     8
-};
-static const yytype_int8 yypact[] =
-{
-      -2,    -1,     4,    -8,     0,     2,    -8,    -2,    -8,    -2,
-      -8,    -8
-};
-static const yytype_int8 yypgoto[] =
-{
-      -8,    -7,    -8,    -8,    -8
-};
-static const yytype_uint8 yytable[] =
-{
-      10,     1,    11,     5,     6,     0,     7,     9
-};
-static const yytype_int8 yycheck[] =
-{
-       7,     3,     9,     4,     0,    -1,     6,     5
-};
-static const yytype_uint8 yystos[] =
-{
-       0,     3,     8,     9,    10,     4,     0,     6,    11,     5,
-       8,     8
-};
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:735: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  125 ) # 125. regression.at:866: Dancer
-    at_setup_line='regression.at:866'
-    at_desc='Dancer '
-    $at_quiet $ECHO_N "125: Dancer                                       $ECHO_C"
-    at_xfail=no
-    (
-      echo "125. regression.at:866: testing ..."
-      $at_traceon
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-cat >dancer.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-static int yylex (void);
-#include <stdio.h>
-static void yyerror (const char *);
-%}
-
-%token ARROW INVALID NUMBER STRING DATA
-%defines
-%verbose
-%error-verbose
-/* Grammar follows */
-%%
-line: header body
-   ;
-
-header: '<' from ARROW to '>' type ':'
-   | '<' ARROW to '>' type ':'
-   | ARROW to type ':'
-   | type ':'
-   | '<' '>'
-   ;
-
-from: DATA
-   | STRING
-   | INVALID
-   ;
-
-to: DATA
-   | STRING
-   | INVALID
-   ;
-
-type: DATA
-   | STRING
-   | INVALID
-   ;
-
-body: /* empty */
-   | body member
-   ;
-
-member: STRING
-   | DATA
-   | '+' NUMBER
-   | '-' NUMBER
-   | NUMBER
-   | INVALID
-   ;
-%%
-static void
-yyerror (const char *s)
-{
-  fprintf (stderr, "%s\n", s);
-}
-
-static int
-yylex (void)
-{
-  static int toknum = 0;
-  static int tokens[] =
-    {
-      ':', -1
-    };
-
-  return tokens[toknum++];
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "regression.at:866: bison -o dancer.c dancer.y"
-echo regression.at:866 >$at_check_line_file
-( $at_traceon; bison -o dancer.c dancer.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:866: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:866: bison -o dancer.c dancer.y"
-echo regression.at:866 >$at_check_line_file
-( $at_traceon; bison -o dancer.c dancer.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:866: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "regression.at:866: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o dancer dancer.c \$LIBS"
-echo regression.at:866 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o dancer dancer.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:866: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:866: \$PREPARSER ./dancer"
-echo regression.at:866 >$at_check_line_file
-( $at_traceon; $PREPARSER ./dancer ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error, unexpected ':'
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "regression.at:866: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  126 ) # 126. regression.at:867: Dancer %glr-parser
-    at_setup_line='regression.at:867'
-    at_desc='Dancer %glr-parser'
-    $at_quiet $ECHO_N "126: Dancer %glr-parser                           $ECHO_C"
-    at_xfail=no
-    (
-      echo "126. regression.at:867: testing ..."
-      $at_traceon
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-cat >dancer.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-static int yylex (void);
-#include <stdio.h>
-static void yyerror (const char *);
-%}
-%glr-parser
-%token ARROW INVALID NUMBER STRING DATA
-%defines
-%verbose
-%error-verbose
-/* Grammar follows */
-%%
-line: header body
-   ;
-
-header: '<' from ARROW to '>' type ':'
-   | '<' ARROW to '>' type ':'
-   | ARROW to type ':'
-   | type ':'
-   | '<' '>'
-   ;
-
-from: DATA
-   | STRING
-   | INVALID
-   ;
-
-to: DATA
-   | STRING
-   | INVALID
-   ;
-
-type: DATA
-   | STRING
-   | INVALID
-   ;
-
-body: /* empty */
-   | body member
-   ;
-
-member: STRING
-   | DATA
-   | '+' NUMBER
-   | '-' NUMBER
-   | NUMBER
-   | INVALID
-   ;
-%%
-static void
-yyerror (const char *s)
-{
-  fprintf (stderr, "%s\n", s);
-}
-
-static int
-yylex (void)
-{
-  static int toknum = 0;
-  static int tokens[] =
-    {
-      ':', -1
-    };
-
-  return tokens[toknum++];
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "regression.at:867: bison -o dancer.c dancer.y"
-echo regression.at:867 >$at_check_line_file
-( $at_traceon; bison -o dancer.c dancer.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:867: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:867: bison -o dancer.c dancer.y"
-echo regression.at:867 >$at_check_line_file
-( $at_traceon; bison -o dancer.c dancer.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:867: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "regression.at:867: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o dancer dancer.c \$LIBS"
-echo regression.at:867 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o dancer dancer.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:867: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:867: \$PREPARSER ./dancer"
-echo regression.at:867 >$at_check_line_file
-( $at_traceon; $PREPARSER ./dancer ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error, unexpected ':'
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "regression.at:867: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  127 ) # 127. regression.at:868: Dancer %skeleton "lalr1.cc"
-    at_setup_line='regression.at:868'
-    at_desc='Dancer %skeleton "lalr1.cc"'
-    $at_quiet $ECHO_N "127: Dancer %skeleton "lalr1.cc"                  $ECHO_C"
-    at_xfail=no
-    (
-      echo "127. regression.at:868: testing ..."
-      $at_traceon
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-cat >dancer.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-static int yylex (int *);
-
-%}
-%skeleton "lalr1.cc"
-%token ARROW INVALID NUMBER STRING DATA
-%defines
-%verbose
-%error-verbose
-/* Grammar follows */
-%%
-line: header body
-   ;
-
-header: '<' from ARROW to '>' type ':'
-   | '<' ARROW to '>' type ':'
-   | ARROW to type ':'
-   | type ':'
-   | '<' '>'
-   ;
-
-from: DATA
-   | STRING
-   | INVALID
-   ;
-
-to: DATA
-   | STRING
-   | INVALID
-   ;
-
-type: DATA
-   | STRING
-   | INVALID
-   ;
-
-body: /* empty */
-   | body member
-   ;
-
-member: STRING
-   | DATA
-   | '+' NUMBER
-   | '-' NUMBER
-   | NUMBER
-   | INVALID
-   ;
-%%
-/* A C++ error reporting function. */
-void
-yy::parser::error (const location&, const std::string& m)
-{
-  std::cerr << m << std::endl;
-}
-
-int
-yyparse ()
-{
-  yy::parser parser;
-  parser.set_debug_level (!!YYDEBUG);
-  return parser.parse ();
-}
-
-
-static int
-yylex (int *lval)
-{
-  static int toknum = 0;
-  static int tokens[] =
-    {
-      ':', -1
-    };
-  *lval = 0; /* Pacify GCC.  */
-  return tokens[toknum++];
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "regression.at:868: bison -o dancer.c dancer.y"
-echo regression.at:868 >$at_check_line_file
-( $at_traceon; bison -o dancer.c dancer.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:868: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:868: bison -o dancer.cc dancer.y"
-echo regression.at:868 >$at_check_line_file
-( $at_traceon; bison -o dancer.cc dancer.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:868: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "regression.at:868: \$BISON_CXX_WORKS"
-echo regression.at:868 >$at_check_line_file
-( $at_traceon; $BISON_CXX_WORKS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:868: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:868: \$CXX \$CXXFLAGS \$CPPFLAGS \$LDFLAGS -o dancer dancer.cc \$LIBS"
-echo regression.at:868 >$at_check_line_file
-( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS $LDFLAGS -o dancer dancer.cc $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:868: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:868: \$PREPARSER ./dancer"
-echo regression.at:868 >$at_check_line_file
-( $at_traceon; $PREPARSER ./dancer ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error, unexpected ':'
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "regression.at:868: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  128 ) # 128. regression.at:963: Expecting two tokens
-    at_setup_line='regression.at:963'
-    at_desc='Expecting two tokens '
-    $at_quiet $ECHO_N "128: Expecting two tokens                         $ECHO_C"
-    at_xfail=no
-    (
-      echo "128. regression.at:963: testing ..."
-      $at_traceon
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-cat >expect2.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-static int yylex (void);
-#include <stdio.h>
-static void yyerror (const char *);
-%}
-
-%defines
-%error-verbose
-%token A 1000
-%token B
-
-%%
-program: /* empty */
- | program e ';'
- | program error ';';
-
-e: e '+' t | t;
-t: A | B;
-
-%%
-static void
-yyerror (const char *s)
-{
-  fprintf (stderr, "%s\n", s);
-}
-
-static int
-yylex (void)
-{
-  static int toknum = 0;
-  static int tokens[] =
-    {
-      1000, '+', '+', -1
-    };
-
-  return tokens[toknum++];
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "regression.at:963: bison -o expect2.c expect2.y"
-echo regression.at:963 >$at_check_line_file
-( $at_traceon; bison -o expect2.c expect2.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:963: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:963: bison -o expect2.c expect2.y"
-echo regression.at:963 >$at_check_line_file
-( $at_traceon; bison -o expect2.c expect2.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:963: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "regression.at:963: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o expect2 expect2.c \$LIBS"
-echo regression.at:963 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o expect2 expect2.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:963: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:963: \$PREPARSER ./expect2"
-echo regression.at:963 >$at_check_line_file
-( $at_traceon; $PREPARSER ./expect2 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error, unexpected '+', expecting A or B
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "regression.at:963: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  129 ) # 129. regression.at:964: Expecting two tokens %glr-parser
-    at_setup_line='regression.at:964'
-    at_desc='Expecting two tokens %glr-parser'
-    $at_quiet $ECHO_N "129: Expecting two tokens %glr-parser             $ECHO_C"
-    at_xfail=no
-    (
-      echo "129. regression.at:964: testing ..."
-      $at_traceon
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-cat >expect2.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-static int yylex (void);
-#include <stdio.h>
-static void yyerror (const char *);
-%}
-%glr-parser
-%defines
-%error-verbose
-%token A 1000
-%token B
-
-%%
-program: /* empty */
- | program e ';'
- | program error ';';
-
-e: e '+' t | t;
-t: A | B;
-
-%%
-static void
-yyerror (const char *s)
-{
-  fprintf (stderr, "%s\n", s);
-}
-
-static int
-yylex (void)
-{
-  static int toknum = 0;
-  static int tokens[] =
-    {
-      1000, '+', '+', -1
-    };
-
-  return tokens[toknum++];
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "regression.at:964: bison -o expect2.c expect2.y"
-echo regression.at:964 >$at_check_line_file
-( $at_traceon; bison -o expect2.c expect2.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:964: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:964: bison -o expect2.c expect2.y"
-echo regression.at:964 >$at_check_line_file
-( $at_traceon; bison -o expect2.c expect2.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:964: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-   $at_traceoff
-echo "regression.at:964: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o expect2 expect2.c \$LIBS"
-echo regression.at:964 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o expect2 expect2.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:964: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:964: \$PREPARSER ./expect2"
-echo regression.at:964 >$at_check_line_file
-( $at_traceon; $PREPARSER ./expect2 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error, unexpected '+', expecting A or B
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "regression.at:964: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  130 ) # 130. regression.at:965: Expecting two tokens %skeleton "lalr1.cc"
-    at_setup_line='regression.at:965'
-    at_desc='Expecting two tokens %skeleton "lalr1.cc"'
-    $at_quiet $ECHO_N "130: Expecting two tokens %skeleton "lalr1.cc"    $ECHO_C"
-    at_xfail=no
-    (
-      echo "130. regression.at:965: testing ..."
-      $at_traceon
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-cat >expect2.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-%{
-static int yylex (int *);
-
-%}
-%skeleton "lalr1.cc"
-%defines
-%error-verbose
-%token A 1000
-%token B
-
-%%
-program: /* empty */
- | program e ';'
- | program error ';';
-
-e: e '+' t | t;
-t: A | B;
-
-%%
-/* A C++ error reporting function. */
-void
-yy::parser::error (const location&, const std::string& m)
-{
-  std::cerr << m << std::endl;
-}
-
-int
-yyparse ()
-{
-  yy::parser parser;
-  return parser.parse ();
-}
-
-
-static int
-yylex (int *lval)
-{
-  static int toknum = 0;
-  static int tokens[] =
-    {
-      1000, '+', '+', -1
-    };
-  *lval = 0; /* Pacify GCC.  */
-  return tokens[toknum++];
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "regression.at:965: bison -o expect2.c expect2.y"
-echo regression.at:965 >$at_check_line_file
-( $at_traceon; bison -o expect2.c expect2.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:965: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:965: bison -o expect2.cc expect2.y"
-echo regression.at:965 >$at_check_line_file
-( $at_traceon; bison -o expect2.cc expect2.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:965: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "regression.at:965: \$BISON_CXX_WORKS"
-echo regression.at:965 >$at_check_line_file
-( $at_traceon; $BISON_CXX_WORKS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:965: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:965: \$CXX \$CXXFLAGS \$CPPFLAGS \$LDFLAGS -o expect2 expect2.cc \$LIBS"
-echo regression.at:965 >$at_check_line_file
-( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS $LDFLAGS -o expect2 expect2.cc $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "regression.at:965: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "regression.at:965: \$PREPARSER ./expect2"
-echo regression.at:965 >$at_check_line_file
-( $at_traceon; $PREPARSER ./expect2 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error, unexpected '+', expecting A or B
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   1) ;;
-   *) echo "regression.at:965: exit code was $at_status, expected 1"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-16 ) # Banner 16. c++.at:19
-    cat <<\_ATEOF
-
-C++ Features.
-
-_ATEOF
-    ;;
-
-  131 ) # 131. c++.at:102: Doxygen Public Documentation
-    at_setup_line='c++.at:102'
-    at_desc='Doxygen Public Documentation'
-    $at_quiet $ECHO_N "131: Doxygen Public Documentation                 $ECHO_C"
-    at_xfail=no
-    (
-      echo "131. c++.at:102: testing ..."
-      $at_traceon
-
-
-cat >input.yy <<'_ATEOF'
-%skeleton "lalr1.cc"
-%locations
-%debug
-%defines
-%%
-exp:;
-%%
-yy::parser::error (const location& l, const std::string& m)
-{
-  std::cerr << l << s << std::endl;
-}
-_ATEOF
-
-
-$at_traceoff
-echo "c++.at:102: bison -o input.cc input.yy"
-echo c++.at:102 >$at_check_line_file
-( $at_traceon; bison -o input.cc input.yy ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "c++.at:102: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >Doxyfile <<'_ATEOF'
-# The PROJECT_NAME tag is a single word (or a sequence of words
-# surrounded by quotes) that should identify the project.
-PROJECT_NAME = "Bison C++ Parser"
-
-# The QUIET tag can be used to turn on/off the messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-QUIET = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages
-# that are generated by doxygen. Possible values are YES and NO. If
-# left blank NO is used.
-WARNINGS     = YES
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate
-# warnings for undocumented members. If EXTRACT_ALL is set to YES then
-# this flag will automatically be disabled.
-WARN_IF_UNDOCUMENTED   = YES
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings
-# for potential errors in the documentation, such as not documenting
-# some parameters in a documented function, or documenting parameters
-# that don't exist or using markup commands wrongly.
-WARN_IF_DOC_ERROR      = YES
-# The WARN_FORMAT tag determines the format of the warning messages
-# that doxygen can produce. The string should contain the $file,
-# $line, and $text tags, which will be replaced by the file and line
-# number from which the warning originated and the warning text.
-WARN_FORMAT            = "$file:$line: $text"
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all
-# entities in documentation are documented, even if no documentation
-# was available.  Private class members and static file members will
-# be hidden unless the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set
-# to YES
-EXTRACT_ALL            = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a
-# class will be included in the documentation.
-EXTRACT_PRIVATE        = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-EXTRACT_STATIC         = NO
-_ATEOF
-
-
-$at_traceoff
-echo "c++.at:102: doxygen --version || exit 77"
-echo c++.at:102 >$at_check_line_file
-( $at_traceon; doxygen --version || exit 77 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "c++.at:102: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "c++.at:102: doxygen"
-echo c++.at:102 >$at_check_line_file
-( $at_traceon; doxygen ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "c++.at:102: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  132 ) # 132. c++.at:103: Doxygen Private Documentation
-    at_setup_line='c++.at:103'
-    at_desc='Doxygen Private Documentation'
-    $at_quiet $ECHO_N "132: Doxygen Private Documentation                $ECHO_C"
-    at_xfail=no
-    (
-      echo "132. c++.at:103: testing ..."
-      $at_traceon
-
-
-cat >input.yy <<'_ATEOF'
-%skeleton "lalr1.cc"
-%locations
-%debug
-%defines
-%%
-exp:;
-%%
-yy::parser::error (const location& l, const std::string& m)
-{
-  std::cerr << l << s << std::endl;
-}
-_ATEOF
-
-
-$at_traceoff
-echo "c++.at:103: bison -o input.cc input.yy"
-echo c++.at:103 >$at_check_line_file
-( $at_traceon; bison -o input.cc input.yy ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "c++.at:103: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-cat >Doxyfile <<'_ATEOF'
-# The PROJECT_NAME tag is a single word (or a sequence of words
-# surrounded by quotes) that should identify the project.
-PROJECT_NAME = "Bison C++ Parser"
-
-# The QUIET tag can be used to turn on/off the messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-QUIET = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages
-# that are generated by doxygen. Possible values are YES and NO. If
-# left blank NO is used.
-WARNINGS     = YES
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate
-# warnings for undocumented members. If EXTRACT_ALL is set to YES then
-# this flag will automatically be disabled.
-WARN_IF_UNDOCUMENTED   = YES
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings
-# for potential errors in the documentation, such as not documenting
-# some parameters in a documented function, or documenting parameters
-# that don't exist or using markup commands wrongly.
-WARN_IF_DOC_ERROR      = YES
-# The WARN_FORMAT tag determines the format of the warning messages
-# that doxygen can produce. The string should contain the $file,
-# $line, and $text tags, which will be replaced by the file and line
-# number from which the warning originated and the warning text.
-WARN_FORMAT            = "$file:$line: $text"
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all
-# entities in documentation are documented, even if no documentation
-# was available.  Private class members and static file members will
-# be hidden unless the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set
-# to YES
-EXTRACT_ALL            = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a
-# class will be included in the documentation.
-EXTRACT_PRIVATE        = YES
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-EXTRACT_STATIC         = YES
-_ATEOF
-
-
-$at_traceoff
-echo "c++.at:103: doxygen --version || exit 77"
-echo c++.at:103 >$at_check_line_file
-( $at_traceon; doxygen --version || exit 77 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "c++.at:103: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "c++.at:103: doxygen"
-echo c++.at:103 >$at_check_line_file
-( $at_traceon; doxygen ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "c++.at:103: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-17 ) # Banner 17. cxx-type.at:19
-    cat <<\_ATEOF
-
-C++ Type Syntax (GLR).
-
-_ATEOF
-    ;;
-
-  133 ) # 133. cxx-type.at:412: GLR: Resolve ambiguity, impure, no locations
-    at_setup_line='cxx-type.at:412'
-    at_desc='GLR: Resolve ambiguity, impure, no locations'
-    $at_quiet $ECHO_N "133: GLR: Resolve ambiguity, impure, no locations $ECHO_C"
-    at_xfail=no
-    (
-      echo "133. cxx-type.at:412: testing ..."
-      $at_traceon
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >types.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Simplified C++ Type and Expression Grammar.  */
-
-
-
-%{
-  #include <stdio.h>
-  union Node {
-    struct {
-      int isNterm;
-      int parents;
-    } nodeInfo;
-    struct {
-      int isNterm; /* 1 */
-      int parents;
-      char const *form;
-      union Node *children[3];
-    } nterm;
-    struct {
-      int isNterm; /* 0 */
-      int parents;
-      char *text;
-    } term;
-  };
-  typedef union Node Node;
-  static Node *new_nterm (char const *, Node *, Node *, Node *);
-  static Node *new_term (char *);
-  static void free_node (Node *);
-  static char *node_to_string (Node *);
-  #define YYSTYPE Node *
-
-  #define YYINITDEPTH 10
-  #define YYSTACKEXPANDABLE 1
-  struct YYLTYPE;
-#if YYPURE
-# if YYLSP_NEEDED
-#  define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp
-#  define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s
-# else
-#  define LEX_PARAMETERS YYSTYPE *lvalp
-# endif
-#endif
-#ifndef LEX_PARAMETERS
-# define LEX_PARAMETERS void
-#endif
-#ifndef ERROR_PARAMETERS
-# define ERROR_PARAMETERS char const *s
-#endif
-  int yylex (LEX_PARAMETERS);
-  void yyerror (ERROR_PARAMETERS);
-%}
-
-%token TYPENAME ID
-
-%right '='
-%left '+'
-
-%glr-parser
-
-%destructor { free_node ($$); } stmt expr decl declarator TYPENAME ID
-
-%%
-
-prog :
-     | prog stmt   {
-			char *output;
-			output = node_to_string ($2);
-			printf ("%s\n", output);
-			free (output);
-			free_node ($2);
-		   }
-     ;
-
-stmt : expr ';'  %dprec 1	{ $$ = $1; }
-     | decl      %dprec 2
-     | error ';'	{ $$ = new_nterm ("<error>", 0, 0, 0); }
-     | '@'		{ YYACCEPT; }
-     ;
-
-expr : ID
-     | TYPENAME '(' expr ')'
-			{ $$ = new_nterm ("<cast>(%s,%s)", $3, $1, 0); }
-     | expr '+' expr	{ $$ = new_nterm ("+(%s,%s)", $1, $3, 0); }
-     | expr '=' expr    { $$ = new_nterm ("=(%s,%s)", $1, $3, 0); }
-     ;
-
-decl : TYPENAME declarator ';'
-			{ $$ = new_nterm ("<declare>(%s,%s)", $1, $2, 0); }
-     | TYPENAME declarator '=' expr ';'
-			{ $$ = new_nterm ("<init-declare>(%s,%s,%s)", $1,
-					  $2, $4); }
-     ;
-
-declarator : ID
-     | '(' declarator ')' { $$ = $2; }
-     ;
-
-%%
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-int
-main (int argc, char **argv)
-{
-  if (argc != 2)
-    abort ();
-  if (!freopen (argv[1], "r", stdin))
-    return 3;
-  return yyparse ();
-}
-
-int
-yylex (LEX_PARAMETERS)
-{
-  char buffer[256];
-  int c;
-  unsigned int i;
-  static int lineNum = 1;
-  static int colNum = 0;
-
-#if YYPURE
-# undef yylloc
-# define yylloc (*llocp)
-# undef yylval
-# define yylval (*lvalp)
-#endif
-
-  while (1)
-    {
-      c = getchar ();
-      switch (c)
-	{
-	case EOF:
-	  return 0;
-	case '\t':
-	  colNum = (colNum + 7) & ~7;
-	  break;
-	case ' ': case '\f':
-	  colNum += 1;
-	  break;
-	case '\n':
-	  lineNum += 1;
-	  colNum = 0;
-	  break;
-	default:
-	  {
-	    int tok;
-#if YYLSP_NEEDED
-	    yylloc.first_line = yylloc.last_line = lineNum;
-	    yylloc.first_column = colNum;
-#endif
-	    if (isalpha (c))
-	      {
-		i = 0;
-
-		do
-		  {
-		    buffer[i++] = c;
-		    colNum += 1;
-		    if (i == sizeof buffer - 1)
-		      abort ();
-		    c = getchar ();
-		  }
-		while (isalnum (c) || c == '_');
-
-		ungetc (c, stdin);
-		buffer[i++] = 0;
-		tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID;
-		yylval = new_term (strcpy ((char *) malloc (i), buffer));
-	      }
-	    else
-	      {
-		colNum += 1;
-		tok = c;
-		yylval = 0;
-	      }
-#if YYLSP_NEEDED
-	    yylloc.last_column = colNum-1;
-#endif
-	    return tok;
-	  }
-	}
-    }
-}
-
-void
-yyerror (ERROR_PARAMETERS)
-{
-#if YYPURE && YYLSP_NEEDED
-  /* Pacify GCC by using llocp.  */
-  if (! llocp)
-    abort ();
-#endif
-  fprintf (stderr, "%s\n", s);
-}
-
-static Node *
-new_nterm (char const *form, Node *child0, Node *child1, Node *child2)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->nterm.isNterm = 1;
-  node->nterm.parents = 0;
-  node->nterm.form = form;
-  node->nterm.children[0] = child0;
-  if (child0)
-    child0->nodeInfo.parents += 1;
-  node->nterm.children[1] = child1;
-  if (child1)
-    child1->nodeInfo.parents += 1;
-  node->nterm.children[2] = child2;
-  if (child2)
-    child2->nodeInfo.parents += 1;
-  return node;
-}
-
-static Node *
-new_term (char *text)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->term.isNterm = 0;
-  node->term.parents = 0;
-  node->term.text = text;
-  return node;
-}
-
-static void
-free_node (Node *node)
-{
-  if (!node)
-    return;
-  node->nodeInfo.parents -= 1;
-  /* Free only if 0 (last parent) or -1 (no parents).  */
-  if (node->nodeInfo.parents > 0)
-    return;
-  if (node->nodeInfo.isNterm == 1)
-    {
-      free_node (node->nterm.children[0]);
-      free_node (node->nterm.children[1]);
-      free_node (node->nterm.children[2]);
-    }
-  else
-    free (node->term.text);
-  free (node);
-}
-
-static char *
-node_to_string (Node *node)
-{
-  char *child0;
-  char *child1;
-  char *child2;
-  char *buffer;
-  if (!node)
-    {
-      buffer = (char *) malloc (1);
-      buffer[0] = 0;
-    }
-  else if (node->nodeInfo.isNterm == 1)
-    {
-      child0 = node_to_string (node->nterm.children[0]);
-      child1 = node_to_string (node->nterm.children[1]);
-      child2 = node_to_string (node->nterm.children[2]);
-      buffer = (char *) malloc (strlen (node->nterm.form) + strlen (child0)
-				+ strlen (child1) + strlen (child2) + 1);
-      sprintf (buffer, node->nterm.form, child0, child1, child2);
-      free (child0);
-      free (child1);
-      free (child2);
-    }
-  else
-    buffer = strdup (node->term.text);
-  return buffer;
-}
-
-
-
-_ATEOF
-
-
-
-cat >test-input <<'_ATEOF'
-
-
-z + q;
-
-T x;
-
-T x = y;
-
-x = y;
-
-T (x) + y;
-
-T (x);
-
-T (y) = z + q;
-
-T (y y) = z + q;
-
-z + q;
-
-@
-
-This is total garbage, but it should be ignored.
-_ATEOF
-
-
-$at_traceoff
-echo "cxx-type.at:414: bison -o types.c types.y"
-echo cxx-type.at:414 >$at_check_line_file
-( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:414: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "cxx-type.at:414: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o types types.c \$LIBS"
-echo cxx-type.at:414 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o types types.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:414: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-$at_traceoff
-echo "cxx-type.at:416: \$PREPARSER ./types test-input"
-echo cxx-type.at:416 >$at_check_line_file
-( $at_traceon; $PREPARSER ./types test-input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error
-" | $at_diff - $at_stderr || at_failed=:
-echo >>$at_stdout; echo "+(z,q)
-<declare>(T,x)
-<init-declare>(T,x,y)
-=(x,y)
-+(<cast>(x,T),y)
-<declare>(T,x)
-<init-declare>(T,y,+(z,q))
-<error>
-+(z,q)
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:416: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  134 ) # 134. cxx-type.at:419: GLR: Resolve ambiguity, impure, locations
-    at_setup_line='cxx-type.at:419'
-    at_desc='GLR: Resolve ambiguity, impure, locations'
-    $at_quiet $ECHO_N "134: GLR: Resolve ambiguity, impure, locations    $ECHO_C"
-    at_xfail=no
-    (
-      echo "134. cxx-type.at:419: testing ..."
-      $at_traceon
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >types.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Simplified C++ Type and Expression Grammar.  */
-
-%locations
-
-%{
-  #include <stdio.h>
-  union Node {
-    struct {
-      int isNterm;
-      int parents;
-    } nodeInfo;
-    struct {
-      int isNterm; /* 1 */
-      int parents;
-      char const *form;
-      union Node *children[3];
-    } nterm;
-    struct {
-      int isNterm; /* 0 */
-      int parents;
-      char *text;
-    } term;
-  };
-  typedef union Node Node;
-  static Node *new_nterm (char const *, Node *, Node *, Node *);
-  static Node *new_term (char *);
-  static void free_node (Node *);
-  static char *node_to_string (Node *);
-  #define YYSTYPE Node *
-
-  #define YYINITDEPTH 10
-  #define YYSTACKEXPANDABLE 1
-  struct YYLTYPE;
-#if YYPURE
-# if YYLSP_NEEDED
-#  define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp
-#  define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s
-# else
-#  define LEX_PARAMETERS YYSTYPE *lvalp
-# endif
-#endif
-#ifndef LEX_PARAMETERS
-# define LEX_PARAMETERS void
-#endif
-#ifndef ERROR_PARAMETERS
-# define ERROR_PARAMETERS char const *s
-#endif
-  int yylex (LEX_PARAMETERS);
-  void yyerror (ERROR_PARAMETERS);
-%}
-
-%token TYPENAME ID
-
-%right '='
-%left '+'
-
-%glr-parser
-
-%destructor { free_node ($$); } stmt expr decl declarator TYPENAME ID
-
-%%
-
-prog :
-     | prog stmt   {
-			char *output;
-			printf ("%d.%d-%d.%d: ",
-			     @2.first_line, @2.first_column,
-			     @2.last_line, @2.last_column);
-			output = node_to_string ($2);
-			printf ("%s\n", output);
-			free (output);
-			free_node ($2);
-		   }
-     ;
-
-stmt : expr ';'  %dprec 1	{ $$ = $1; }
-     | decl      %dprec 2
-     | error ';'	{ $$ = new_nterm ("<error>", 0, 0, 0); }
-     | '@'		{ YYACCEPT; }
-     ;
-
-expr : ID
-     | TYPENAME '(' expr ')'
-			{ $$ = new_nterm ("<cast>(%s,%s)", $3, $1, 0); }
-     | expr '+' expr	{ $$ = new_nterm ("+(%s,%s)", $1, $3, 0); }
-     | expr '=' expr    { $$ = new_nterm ("=(%s,%s)", $1, $3, 0); }
-     ;
-
-decl : TYPENAME declarator ';'
-			{ $$ = new_nterm ("<declare>(%s,%s)", $1, $2, 0); }
-     | TYPENAME declarator '=' expr ';'
-			{ $$ = new_nterm ("<init-declare>(%s,%s,%s)", $1,
-					  $2, $4); }
-     ;
-
-declarator : ID
-     | '(' declarator ')' { $$ = $2; }
-     ;
-
-%%
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-int
-main (int argc, char **argv)
-{
-  if (argc != 2)
-    abort ();
-  if (!freopen (argv[1], "r", stdin))
-    return 3;
-  return yyparse ();
-}
-
-int
-yylex (LEX_PARAMETERS)
-{
-  char buffer[256];
-  int c;
-  unsigned int i;
-  static int lineNum = 1;
-  static int colNum = 0;
-
-#if YYPURE
-# undef yylloc
-# define yylloc (*llocp)
-# undef yylval
-# define yylval (*lvalp)
-#endif
-
-  while (1)
-    {
-      c = getchar ();
-      switch (c)
-	{
-	case EOF:
-	  return 0;
-	case '\t':
-	  colNum = (colNum + 7) & ~7;
-	  break;
-	case ' ': case '\f':
-	  colNum += 1;
-	  break;
-	case '\n':
-	  lineNum += 1;
-	  colNum = 0;
-	  break;
-	default:
-	  {
-	    int tok;
-#if YYLSP_NEEDED
-	    yylloc.first_line = yylloc.last_line = lineNum;
-	    yylloc.first_column = colNum;
-#endif
-	    if (isalpha (c))
-	      {
-		i = 0;
-
-		do
-		  {
-		    buffer[i++] = c;
-		    colNum += 1;
-		    if (i == sizeof buffer - 1)
-		      abort ();
-		    c = getchar ();
-		  }
-		while (isalnum (c) || c == '_');
-
-		ungetc (c, stdin);
-		buffer[i++] = 0;
-		tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID;
-		yylval = new_term (strcpy ((char *) malloc (i), buffer));
-	      }
-	    else
-	      {
-		colNum += 1;
-		tok = c;
-		yylval = 0;
-	      }
-#if YYLSP_NEEDED
-	    yylloc.last_column = colNum-1;
-#endif
-	    return tok;
-	  }
-	}
-    }
-}
-
-void
-yyerror (ERROR_PARAMETERS)
-{
-#if YYPURE && YYLSP_NEEDED
-  /* Pacify GCC by using llocp.  */
-  if (! llocp)
-    abort ();
-#endif
-  fprintf (stderr, "%s\n", s);
-}
-
-static Node *
-new_nterm (char const *form, Node *child0, Node *child1, Node *child2)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->nterm.isNterm = 1;
-  node->nterm.parents = 0;
-  node->nterm.form = form;
-  node->nterm.children[0] = child0;
-  if (child0)
-    child0->nodeInfo.parents += 1;
-  node->nterm.children[1] = child1;
-  if (child1)
-    child1->nodeInfo.parents += 1;
-  node->nterm.children[2] = child2;
-  if (child2)
-    child2->nodeInfo.parents += 1;
-  return node;
-}
-
-static Node *
-new_term (char *text)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->term.isNterm = 0;
-  node->term.parents = 0;
-  node->term.text = text;
-  return node;
-}
-
-static void
-free_node (Node *node)
-{
-  if (!node)
-    return;
-  node->nodeInfo.parents -= 1;
-  /* Free only if 0 (last parent) or -1 (no parents).  */
-  if (node->nodeInfo.parents > 0)
-    return;
-  if (node->nodeInfo.isNterm == 1)
-    {
-      free_node (node->nterm.children[0]);
-      free_node (node->nterm.children[1]);
-      free_node (node->nterm.children[2]);
-    }
-  else
-    free (node->term.text);
-  free (node);
-}
-
-static char *
-node_to_string (Node *node)
-{
-  char *child0;
-  char *child1;
-  char *child2;
-  char *buffer;
-  if (!node)
-    {
-      buffer = (char *) malloc (1);
-      buffer[0] = 0;
-    }
-  else if (node->nodeInfo.isNterm == 1)
-    {
-      child0 = node_to_string (node->nterm.children[0]);
-      child1 = node_to_string (node->nterm.children[1]);
-      child2 = node_to_string (node->nterm.children[2]);
-      buffer = (char *) malloc (strlen (node->nterm.form) + strlen (child0)
-				+ strlen (child1) + strlen (child2) + 1);
-      sprintf (buffer, node->nterm.form, child0, child1, child2);
-      free (child0);
-      free (child1);
-      free (child2);
-    }
-  else
-    buffer = strdup (node->term.text);
-  return buffer;
-}
-
-
-
-_ATEOF
-
-
-
-cat >test-input <<'_ATEOF'
-
-
-z + q;
-
-T x;
-
-T x = y;
-
-x = y;
-
-T (x) + y;
-
-T (x);
-
-T (y) = z + q;
-
-T (y y) = z + q;
-
-z + q;
-
-@
-
-This is total garbage, but it should be ignored.
-_ATEOF
-
-
-$at_traceoff
-echo "cxx-type.at:420: bison -o types.c types.y"
-echo cxx-type.at:420 >$at_check_line_file
-( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:420: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "cxx-type.at:420: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o types types.c \$LIBS"
-echo cxx-type.at:420 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o types types.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:420: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-$at_traceoff
-echo "cxx-type.at:422: \$PREPARSER ./types test-input"
-echo cxx-type.at:422 >$at_check_line_file
-( $at_traceon; $PREPARSER ./types test-input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error
-" | $at_diff - $at_stderr || at_failed=:
-echo >>$at_stdout; echo "3.0-3.5: +(z,q)
-5.0-5.3: <declare>(T,x)
-7.0-7.7: <init-declare>(T,x,y)
-9.0-9.5: =(x,y)
-11.0-11.9: +(<cast>(x,T),y)
-13.0-13.5: <declare>(T,x)
-15.0-15.13: <init-declare>(T,y,+(z,q))
-17.0-17.15: <error>
-19.0-19.5: +(z,q)
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:422: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  135 ) # 135. cxx-type.at:425: GLR: Resolve ambiguity, pure, no locations
-    at_setup_line='cxx-type.at:425'
-    at_desc='GLR: Resolve ambiguity, pure, no locations'
-    $at_quiet $ECHO_N "135: GLR: Resolve ambiguity, pure, no locations   $ECHO_C"
-    at_xfail=no
-    (
-      echo "135. cxx-type.at:425: testing ..."
-      $at_traceon
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >types.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Simplified C++ Type and Expression Grammar.  */
-
-%pure-parser
-
-%{
-  #include <stdio.h>
-  union Node {
-    struct {
-      int isNterm;
-      int parents;
-    } nodeInfo;
-    struct {
-      int isNterm; /* 1 */
-      int parents;
-      char const *form;
-      union Node *children[3];
-    } nterm;
-    struct {
-      int isNterm; /* 0 */
-      int parents;
-      char *text;
-    } term;
-  };
-  typedef union Node Node;
-  static Node *new_nterm (char const *, Node *, Node *, Node *);
-  static Node *new_term (char *);
-  static void free_node (Node *);
-  static char *node_to_string (Node *);
-  #define YYSTYPE Node *
-
-  #define YYINITDEPTH 10
-  #define YYSTACKEXPANDABLE 1
-  struct YYLTYPE;
-#if YYPURE
-# if YYLSP_NEEDED
-#  define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp
-#  define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s
-# else
-#  define LEX_PARAMETERS YYSTYPE *lvalp
-# endif
-#endif
-#ifndef LEX_PARAMETERS
-# define LEX_PARAMETERS void
-#endif
-#ifndef ERROR_PARAMETERS
-# define ERROR_PARAMETERS char const *s
-#endif
-  int yylex (LEX_PARAMETERS);
-  void yyerror (ERROR_PARAMETERS);
-%}
-
-%token TYPENAME ID
-
-%right '='
-%left '+'
-
-%glr-parser
-
-%destructor { free_node ($$); } stmt expr decl declarator TYPENAME ID
-
-%%
-
-prog :
-     | prog stmt   {
-			char *output;
-			output = node_to_string ($2);
-			printf ("%s\n", output);
-			free (output);
-			free_node ($2);
-		   }
-     ;
-
-stmt : expr ';'  %dprec 1	{ $$ = $1; }
-     | decl      %dprec 2
-     | error ';'	{ $$ = new_nterm ("<error>", 0, 0, 0); }
-     | '@'		{ YYACCEPT; }
-     ;
-
-expr : ID
-     | TYPENAME '(' expr ')'
-			{ $$ = new_nterm ("<cast>(%s,%s)", $3, $1, 0); }
-     | expr '+' expr	{ $$ = new_nterm ("+(%s,%s)", $1, $3, 0); }
-     | expr '=' expr    { $$ = new_nterm ("=(%s,%s)", $1, $3, 0); }
-     ;
-
-decl : TYPENAME declarator ';'
-			{ $$ = new_nterm ("<declare>(%s,%s)", $1, $2, 0); }
-     | TYPENAME declarator '=' expr ';'
-			{ $$ = new_nterm ("<init-declare>(%s,%s,%s)", $1,
-					  $2, $4); }
-     ;
-
-declarator : ID
-     | '(' declarator ')' { $$ = $2; }
-     ;
-
-%%
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-int
-main (int argc, char **argv)
-{
-  if (argc != 2)
-    abort ();
-  if (!freopen (argv[1], "r", stdin))
-    return 3;
-  return yyparse ();
-}
-
-int
-yylex (LEX_PARAMETERS)
-{
-  char buffer[256];
-  int c;
-  unsigned int i;
-  static int lineNum = 1;
-  static int colNum = 0;
-
-#if YYPURE
-# undef yylloc
-# define yylloc (*llocp)
-# undef yylval
-# define yylval (*lvalp)
-#endif
-
-  while (1)
-    {
-      c = getchar ();
-      switch (c)
-	{
-	case EOF:
-	  return 0;
-	case '\t':
-	  colNum = (colNum + 7) & ~7;
-	  break;
-	case ' ': case '\f':
-	  colNum += 1;
-	  break;
-	case '\n':
-	  lineNum += 1;
-	  colNum = 0;
-	  break;
-	default:
-	  {
-	    int tok;
-#if YYLSP_NEEDED
-	    yylloc.first_line = yylloc.last_line = lineNum;
-	    yylloc.first_column = colNum;
-#endif
-	    if (isalpha (c))
-	      {
-		i = 0;
-
-		do
-		  {
-		    buffer[i++] = c;
-		    colNum += 1;
-		    if (i == sizeof buffer - 1)
-		      abort ();
-		    c = getchar ();
-		  }
-		while (isalnum (c) || c == '_');
-
-		ungetc (c, stdin);
-		buffer[i++] = 0;
-		tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID;
-		yylval = new_term (strcpy ((char *) malloc (i), buffer));
-	      }
-	    else
-	      {
-		colNum += 1;
-		tok = c;
-		yylval = 0;
-	      }
-#if YYLSP_NEEDED
-	    yylloc.last_column = colNum-1;
-#endif
-	    return tok;
-	  }
-	}
-    }
-}
-
-void
-yyerror (ERROR_PARAMETERS)
-{
-#if YYPURE && YYLSP_NEEDED
-  /* Pacify GCC by using llocp.  */
-  if (! llocp)
-    abort ();
-#endif
-  fprintf (stderr, "%s\n", s);
-}
-
-static Node *
-new_nterm (char const *form, Node *child0, Node *child1, Node *child2)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->nterm.isNterm = 1;
-  node->nterm.parents = 0;
-  node->nterm.form = form;
-  node->nterm.children[0] = child0;
-  if (child0)
-    child0->nodeInfo.parents += 1;
-  node->nterm.children[1] = child1;
-  if (child1)
-    child1->nodeInfo.parents += 1;
-  node->nterm.children[2] = child2;
-  if (child2)
-    child2->nodeInfo.parents += 1;
-  return node;
-}
-
-static Node *
-new_term (char *text)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->term.isNterm = 0;
-  node->term.parents = 0;
-  node->term.text = text;
-  return node;
-}
-
-static void
-free_node (Node *node)
-{
-  if (!node)
-    return;
-  node->nodeInfo.parents -= 1;
-  /* Free only if 0 (last parent) or -1 (no parents).  */
-  if (node->nodeInfo.parents > 0)
-    return;
-  if (node->nodeInfo.isNterm == 1)
-    {
-      free_node (node->nterm.children[0]);
-      free_node (node->nterm.children[1]);
-      free_node (node->nterm.children[2]);
-    }
-  else
-    free (node->term.text);
-  free (node);
-}
-
-static char *
-node_to_string (Node *node)
-{
-  char *child0;
-  char *child1;
-  char *child2;
-  char *buffer;
-  if (!node)
-    {
-      buffer = (char *) malloc (1);
-      buffer[0] = 0;
-    }
-  else if (node->nodeInfo.isNterm == 1)
-    {
-      child0 = node_to_string (node->nterm.children[0]);
-      child1 = node_to_string (node->nterm.children[1]);
-      child2 = node_to_string (node->nterm.children[2]);
-      buffer = (char *) malloc (strlen (node->nterm.form) + strlen (child0)
-				+ strlen (child1) + strlen (child2) + 1);
-      sprintf (buffer, node->nterm.form, child0, child1, child2);
-      free (child0);
-      free (child1);
-      free (child2);
-    }
-  else
-    buffer = strdup (node->term.text);
-  return buffer;
-}
-
-
-
-_ATEOF
-
-
-
-cat >test-input <<'_ATEOF'
-
-
-z + q;
-
-T x;
-
-T x = y;
-
-x = y;
-
-T (x) + y;
-
-T (x);
-
-T (y) = z + q;
-
-T (y y) = z + q;
-
-z + q;
-
-@
-
-This is total garbage, but it should be ignored.
-_ATEOF
-
-
-$at_traceoff
-echo "cxx-type.at:427: bison -o types.c types.y"
-echo cxx-type.at:427 >$at_check_line_file
-( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:427: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "cxx-type.at:427: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o types types.c \$LIBS"
-echo cxx-type.at:427 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o types types.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:427: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-$at_traceoff
-echo "cxx-type.at:429: \$PREPARSER ./types test-input"
-echo cxx-type.at:429 >$at_check_line_file
-( $at_traceon; $PREPARSER ./types test-input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error
-" | $at_diff - $at_stderr || at_failed=:
-echo >>$at_stdout; echo "+(z,q)
-<declare>(T,x)
-<init-declare>(T,x,y)
-=(x,y)
-+(<cast>(x,T),y)
-<declare>(T,x)
-<init-declare>(T,y,+(z,q))
-<error>
-+(z,q)
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:429: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  136 ) # 136. cxx-type.at:432: GLR: Resolve ambiguity, pure, locations
-    at_setup_line='cxx-type.at:432'
-    at_desc='GLR: Resolve ambiguity, pure, locations'
-    $at_quiet $ECHO_N "136: GLR: Resolve ambiguity, pure, locations      $ECHO_C"
-    at_xfail=no
-    (
-      echo "136. cxx-type.at:432: testing ..."
-      $at_traceon
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >types.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Simplified C++ Type and Expression Grammar.  */
-
-%pure-parser %locations
-
-%{
-  #include <stdio.h>
-  union Node {
-    struct {
-      int isNterm;
-      int parents;
-    } nodeInfo;
-    struct {
-      int isNterm; /* 1 */
-      int parents;
-      char const *form;
-      union Node *children[3];
-    } nterm;
-    struct {
-      int isNterm; /* 0 */
-      int parents;
-      char *text;
-    } term;
-  };
-  typedef union Node Node;
-  static Node *new_nterm (char const *, Node *, Node *, Node *);
-  static Node *new_term (char *);
-  static void free_node (Node *);
-  static char *node_to_string (Node *);
-  #define YYSTYPE Node *
-
-  #define YYINITDEPTH 10
-  #define YYSTACKEXPANDABLE 1
-  struct YYLTYPE;
-#if YYPURE
-# if YYLSP_NEEDED
-#  define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp
-#  define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s
-# else
-#  define LEX_PARAMETERS YYSTYPE *lvalp
-# endif
-#endif
-#ifndef LEX_PARAMETERS
-# define LEX_PARAMETERS void
-#endif
-#ifndef ERROR_PARAMETERS
-# define ERROR_PARAMETERS char const *s
-#endif
-  int yylex (LEX_PARAMETERS);
-  void yyerror (ERROR_PARAMETERS);
-%}
-
-%token TYPENAME ID
-
-%right '='
-%left '+'
-
-%glr-parser
-
-%destructor { free_node ($$); } stmt expr decl declarator TYPENAME ID
-
-%%
-
-prog :
-     | prog stmt   {
-			char *output;
-			printf ("%d.%d-%d.%d: ",
-			     @2.first_line, @2.first_column,
-			     @2.last_line, @2.last_column);
-			output = node_to_string ($2);
-			printf ("%s\n", output);
-			free (output);
-			free_node ($2);
-		   }
-     ;
-
-stmt : expr ';'  %dprec 1	{ $$ = $1; }
-     | decl      %dprec 2
-     | error ';'	{ $$ = new_nterm ("<error>", 0, 0, 0); }
-     | '@'		{ YYACCEPT; }
-     ;
-
-expr : ID
-     | TYPENAME '(' expr ')'
-			{ $$ = new_nterm ("<cast>(%s,%s)", $3, $1, 0); }
-     | expr '+' expr	{ $$ = new_nterm ("+(%s,%s)", $1, $3, 0); }
-     | expr '=' expr    { $$ = new_nterm ("=(%s,%s)", $1, $3, 0); }
-     ;
-
-decl : TYPENAME declarator ';'
-			{ $$ = new_nterm ("<declare>(%s,%s)", $1, $2, 0); }
-     | TYPENAME declarator '=' expr ';'
-			{ $$ = new_nterm ("<init-declare>(%s,%s,%s)", $1,
-					  $2, $4); }
-     ;
-
-declarator : ID
-     | '(' declarator ')' { $$ = $2; }
-     ;
-
-%%
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-int
-main (int argc, char **argv)
-{
-  if (argc != 2)
-    abort ();
-  if (!freopen (argv[1], "r", stdin))
-    return 3;
-  return yyparse ();
-}
-
-int
-yylex (LEX_PARAMETERS)
-{
-  char buffer[256];
-  int c;
-  unsigned int i;
-  static int lineNum = 1;
-  static int colNum = 0;
-
-#if YYPURE
-# undef yylloc
-# define yylloc (*llocp)
-# undef yylval
-# define yylval (*lvalp)
-#endif
-
-  while (1)
-    {
-      c = getchar ();
-      switch (c)
-	{
-	case EOF:
-	  return 0;
-	case '\t':
-	  colNum = (colNum + 7) & ~7;
-	  break;
-	case ' ': case '\f':
-	  colNum += 1;
-	  break;
-	case '\n':
-	  lineNum += 1;
-	  colNum = 0;
-	  break;
-	default:
-	  {
-	    int tok;
-#if YYLSP_NEEDED
-	    yylloc.first_line = yylloc.last_line = lineNum;
-	    yylloc.first_column = colNum;
-#endif
-	    if (isalpha (c))
-	      {
-		i = 0;
-
-		do
-		  {
-		    buffer[i++] = c;
-		    colNum += 1;
-		    if (i == sizeof buffer - 1)
-		      abort ();
-		    c = getchar ();
-		  }
-		while (isalnum (c) || c == '_');
-
-		ungetc (c, stdin);
-		buffer[i++] = 0;
-		tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID;
-		yylval = new_term (strcpy ((char *) malloc (i), buffer));
-	      }
-	    else
-	      {
-		colNum += 1;
-		tok = c;
-		yylval = 0;
-	      }
-#if YYLSP_NEEDED
-	    yylloc.last_column = colNum-1;
-#endif
-	    return tok;
-	  }
-	}
-    }
-}
-
-void
-yyerror (ERROR_PARAMETERS)
-{
-#if YYPURE && YYLSP_NEEDED
-  /* Pacify GCC by using llocp.  */
-  if (! llocp)
-    abort ();
-#endif
-  fprintf (stderr, "%s\n", s);
-}
-
-static Node *
-new_nterm (char const *form, Node *child0, Node *child1, Node *child2)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->nterm.isNterm = 1;
-  node->nterm.parents = 0;
-  node->nterm.form = form;
-  node->nterm.children[0] = child0;
-  if (child0)
-    child0->nodeInfo.parents += 1;
-  node->nterm.children[1] = child1;
-  if (child1)
-    child1->nodeInfo.parents += 1;
-  node->nterm.children[2] = child2;
-  if (child2)
-    child2->nodeInfo.parents += 1;
-  return node;
-}
-
-static Node *
-new_term (char *text)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->term.isNterm = 0;
-  node->term.parents = 0;
-  node->term.text = text;
-  return node;
-}
-
-static void
-free_node (Node *node)
-{
-  if (!node)
-    return;
-  node->nodeInfo.parents -= 1;
-  /* Free only if 0 (last parent) or -1 (no parents).  */
-  if (node->nodeInfo.parents > 0)
-    return;
-  if (node->nodeInfo.isNterm == 1)
-    {
-      free_node (node->nterm.children[0]);
-      free_node (node->nterm.children[1]);
-      free_node (node->nterm.children[2]);
-    }
-  else
-    free (node->term.text);
-  free (node);
-}
-
-static char *
-node_to_string (Node *node)
-{
-  char *child0;
-  char *child1;
-  char *child2;
-  char *buffer;
-  if (!node)
-    {
-      buffer = (char *) malloc (1);
-      buffer[0] = 0;
-    }
-  else if (node->nodeInfo.isNterm == 1)
-    {
-      child0 = node_to_string (node->nterm.children[0]);
-      child1 = node_to_string (node->nterm.children[1]);
-      child2 = node_to_string (node->nterm.children[2]);
-      buffer = (char *) malloc (strlen (node->nterm.form) + strlen (child0)
-				+ strlen (child1) + strlen (child2) + 1);
-      sprintf (buffer, node->nterm.form, child0, child1, child2);
-      free (child0);
-      free (child1);
-      free (child2);
-    }
-  else
-    buffer = strdup (node->term.text);
-  return buffer;
-}
-
-
-
-_ATEOF
-
-
-
-cat >test-input <<'_ATEOF'
-
-
-z + q;
-
-T x;
-
-T x = y;
-
-x = y;
-
-T (x) + y;
-
-T (x);
-
-T (y) = z + q;
-
-T (y y) = z + q;
-
-z + q;
-
-@
-
-This is total garbage, but it should be ignored.
-_ATEOF
-
-
-$at_traceoff
-echo "cxx-type.at:434: bison -o types.c types.y"
-echo cxx-type.at:434 >$at_check_line_file
-( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:434: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "cxx-type.at:434: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o types types.c \$LIBS"
-echo cxx-type.at:434 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o types types.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:434: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-$at_traceoff
-echo "cxx-type.at:436: \$PREPARSER ./types test-input"
-echo cxx-type.at:436 >$at_check_line_file
-( $at_traceon; $PREPARSER ./types test-input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error
-" | $at_diff - $at_stderr || at_failed=:
-echo >>$at_stdout; echo "3.0-3.5: +(z,q)
-5.0-5.3: <declare>(T,x)
-7.0-7.7: <init-declare>(T,x,y)
-9.0-9.5: =(x,y)
-11.0-11.9: +(<cast>(x,T),y)
-13.0-13.5: <declare>(T,x)
-15.0-15.13: <init-declare>(T,y,+(z,q))
-17.0-17.15: <error>
-19.0-19.5: +(z,q)
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:436: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  137 ) # 137. cxx-type.at:439: GLR: Merge conflicting parses, impure, no locations
-    at_setup_line='cxx-type.at:439'
-    at_desc='GLR: Merge conflicting parses, impure, no locations'
-    $at_quiet $ECHO_N "137: GLR: Merge conflicting parses, impure, no locations$ECHO_C"
-    at_xfail=no
-    (
-      echo "137. cxx-type.at:439: testing ..."
-      $at_traceon
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >types.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Simplified C++ Type and Expression Grammar.  */
-
-
-
-%{
-  #include <stdio.h>
-  union Node {
-    struct {
-      int isNterm;
-      int parents;
-    } nodeInfo;
-    struct {
-      int isNterm; /* 1 */
-      int parents;
-      char const *form;
-      union Node *children[3];
-    } nterm;
-    struct {
-      int isNterm; /* 0 */
-      int parents;
-      char *text;
-    } term;
-  };
-  typedef union Node Node;
-  static Node *new_nterm (char const *, Node *, Node *, Node *);
-  static Node *new_term (char *);
-  static void free_node (Node *);
-  static char *node_to_string (Node *);
-  #define YYSTYPE Node *
- static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);
-  #define YYINITDEPTH 10
-  #define YYSTACKEXPANDABLE 1
-  struct YYLTYPE;
-#if YYPURE
-# if YYLSP_NEEDED
-#  define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp
-#  define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s
-# else
-#  define LEX_PARAMETERS YYSTYPE *lvalp
-# endif
-#endif
-#ifndef LEX_PARAMETERS
-# define LEX_PARAMETERS void
-#endif
-#ifndef ERROR_PARAMETERS
-# define ERROR_PARAMETERS char const *s
-#endif
-  int yylex (LEX_PARAMETERS);
-  void yyerror (ERROR_PARAMETERS);
-%}
-
-%token TYPENAME ID
-
-%right '='
-%left '+'
-
-%glr-parser
-
-%destructor { free_node ($$); } stmt expr decl declarator TYPENAME ID
-
-%%
-
-prog :
-     | prog stmt   {
-			char *output;
-			output = node_to_string ($2);
-			printf ("%s\n", output);
-			free (output);
-			free_node ($2);
-		   }
-     ;
-
-stmt : expr ';'  %merge <stmtMerge>	{ $$ = $1; }
-     | decl      %merge <stmtMerge>
-     | error ';'	{ $$ = new_nterm ("<error>", 0, 0, 0); }
-     | '@'		{ YYACCEPT; }
-     ;
-
-expr : ID
-     | TYPENAME '(' expr ')'
-			{ $$ = new_nterm ("<cast>(%s,%s)", $3, $1, 0); }
-     | expr '+' expr	{ $$ = new_nterm ("+(%s,%s)", $1, $3, 0); }
-     | expr '=' expr    { $$ = new_nterm ("=(%s,%s)", $1, $3, 0); }
-     ;
-
-decl : TYPENAME declarator ';'
-			{ $$ = new_nterm ("<declare>(%s,%s)", $1, $2, 0); }
-     | TYPENAME declarator '=' expr ';'
-			{ $$ = new_nterm ("<init-declare>(%s,%s,%s)", $1,
-					  $2, $4); }
-     ;
-
-declarator : ID
-     | '(' declarator ')' { $$ = $2; }
-     ;
-
-%%
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-int
-main (int argc, char **argv)
-{
-  if (argc != 2)
-    abort ();
-  if (!freopen (argv[1], "r", stdin))
-    return 3;
-  return yyparse ();
-}
-
-int
-yylex (LEX_PARAMETERS)
-{
-  char buffer[256];
-  int c;
-  unsigned int i;
-  static int lineNum = 1;
-  static int colNum = 0;
-
-#if YYPURE
-# undef yylloc
-# define yylloc (*llocp)
-# undef yylval
-# define yylval (*lvalp)
-#endif
-
-  while (1)
-    {
-      c = getchar ();
-      switch (c)
-	{
-	case EOF:
-	  return 0;
-	case '\t':
-	  colNum = (colNum + 7) & ~7;
-	  break;
-	case ' ': case '\f':
-	  colNum += 1;
-	  break;
-	case '\n':
-	  lineNum += 1;
-	  colNum = 0;
-	  break;
-	default:
-	  {
-	    int tok;
-#if YYLSP_NEEDED
-	    yylloc.first_line = yylloc.last_line = lineNum;
-	    yylloc.first_column = colNum;
-#endif
-	    if (isalpha (c))
-	      {
-		i = 0;
-
-		do
-		  {
-		    buffer[i++] = c;
-		    colNum += 1;
-		    if (i == sizeof buffer - 1)
-		      abort ();
-		    c = getchar ();
-		  }
-		while (isalnum (c) || c == '_');
-
-		ungetc (c, stdin);
-		buffer[i++] = 0;
-		tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID;
-		yylval = new_term (strcpy ((char *) malloc (i), buffer));
-	      }
-	    else
-	      {
-		colNum += 1;
-		tok = c;
-		yylval = 0;
-	      }
-#if YYLSP_NEEDED
-	    yylloc.last_column = colNum-1;
-#endif
-	    return tok;
-	  }
-	}
-    }
-}
-
-void
-yyerror (ERROR_PARAMETERS)
-{
-#if YYPURE && YYLSP_NEEDED
-  /* Pacify GCC by using llocp.  */
-  if (! llocp)
-    abort ();
-#endif
-  fprintf (stderr, "%s\n", s);
-}
-
-static Node *
-new_nterm (char const *form, Node *child0, Node *child1, Node *child2)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->nterm.isNterm = 1;
-  node->nterm.parents = 0;
-  node->nterm.form = form;
-  node->nterm.children[0] = child0;
-  if (child0)
-    child0->nodeInfo.parents += 1;
-  node->nterm.children[1] = child1;
-  if (child1)
-    child1->nodeInfo.parents += 1;
-  node->nterm.children[2] = child2;
-  if (child2)
-    child2->nodeInfo.parents += 1;
-  return node;
-}
-
-static Node *
-new_term (char *text)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->term.isNterm = 0;
-  node->term.parents = 0;
-  node->term.text = text;
-  return node;
-}
-
-static void
-free_node (Node *node)
-{
-  if (!node)
-    return;
-  node->nodeInfo.parents -= 1;
-  /* Free only if 0 (last parent) or -1 (no parents).  */
-  if (node->nodeInfo.parents > 0)
-    return;
-  if (node->nodeInfo.isNterm == 1)
-    {
-      free_node (node->nterm.children[0]);
-      free_node (node->nterm.children[1]);
-      free_node (node->nterm.children[2]);
-    }
-  else
-    free (node->term.text);
-  free (node);
-}
-
-static char *
-node_to_string (Node *node)
-{
-  char *child0;
-  char *child1;
-  char *child2;
-  char *buffer;
-  if (!node)
-    {
-      buffer = (char *) malloc (1);
-      buffer[0] = 0;
-    }
-  else if (node->nodeInfo.isNterm == 1)
-    {
-      child0 = node_to_string (node->nterm.children[0]);
-      child1 = node_to_string (node->nterm.children[1]);
-      child2 = node_to_string (node->nterm.children[2]);
-      buffer = (char *) malloc (strlen (node->nterm.form) + strlen (child0)
-				+ strlen (child1) + strlen (child2) + 1);
-      sprintf (buffer, node->nterm.form, child0, child1, child2);
-      free (child0);
-      free (child1);
-      free (child2);
-    }
-  else
-    buffer = strdup (node->term.text);
-  return buffer;
-}
-
-
-static YYSTYPE
-stmtMerge (YYSTYPE x0, YYSTYPE x1)
-{
-  return new_nterm ("<OR>(%s,%s)", x0, x1, 0);
-}
-
-_ATEOF
-
-
-
-cat >test-input <<'_ATEOF'
-
-
-z + q;
-
-T x;
-
-T x = y;
-
-x = y;
-
-T (x) + y;
-
-T (x);
-
-T (y) = z + q;
-
-T (y y) = z + q;
-
-z + q;
-
-@
-
-This is total garbage, but it should be ignored.
-_ATEOF
-
-
-$at_traceoff
-echo "cxx-type.at:441: bison -o types.c types.y"
-echo cxx-type.at:441 >$at_check_line_file
-( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:441: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "cxx-type.at:441: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o types types.c \$LIBS"
-echo cxx-type.at:441 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o types types.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:441: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-$at_traceoff
-echo "cxx-type.at:443: \$PREPARSER ./types test-input"
-echo cxx-type.at:443 >$at_check_line_file
-( $at_traceon; $PREPARSER ./types test-input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error
-" | $at_diff - $at_stderr || at_failed=:
-echo >>$at_stdout; echo "+(z,q)
-<declare>(T,x)
-<init-declare>(T,x,y)
-=(x,y)
-+(<cast>(x,T),y)
-<OR>(<declare>(T,x),<cast>(x,T))
-<OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
-<error>
-+(z,q)
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:443: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  138 ) # 138. cxx-type.at:446: GLR: Merge conflicting parses, impure, locations
-    at_setup_line='cxx-type.at:446'
-    at_desc='GLR: Merge conflicting parses, impure, locations'
-    $at_quiet $ECHO_N "138: GLR: Merge conflicting parses, impure, locations$ECHO_C"
-    at_xfail=no
-    (
-      echo "138. cxx-type.at:446: testing ..."
-      $at_traceon
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >types.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Simplified C++ Type and Expression Grammar.  */
-
-%locations
-
-%{
-  #include <stdio.h>
-  union Node {
-    struct {
-      int isNterm;
-      int parents;
-    } nodeInfo;
-    struct {
-      int isNterm; /* 1 */
-      int parents;
-      char const *form;
-      union Node *children[3];
-    } nterm;
-    struct {
-      int isNterm; /* 0 */
-      int parents;
-      char *text;
-    } term;
-  };
-  typedef union Node Node;
-  static Node *new_nterm (char const *, Node *, Node *, Node *);
-  static Node *new_term (char *);
-  static void free_node (Node *);
-  static char *node_to_string (Node *);
-  #define YYSTYPE Node *
- static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);
-  #define YYINITDEPTH 10
-  #define YYSTACKEXPANDABLE 1
-  struct YYLTYPE;
-#if YYPURE
-# if YYLSP_NEEDED
-#  define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp
-#  define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s
-# else
-#  define LEX_PARAMETERS YYSTYPE *lvalp
-# endif
-#endif
-#ifndef LEX_PARAMETERS
-# define LEX_PARAMETERS void
-#endif
-#ifndef ERROR_PARAMETERS
-# define ERROR_PARAMETERS char const *s
-#endif
-  int yylex (LEX_PARAMETERS);
-  void yyerror (ERROR_PARAMETERS);
-%}
-
-%token TYPENAME ID
-
-%right '='
-%left '+'
-
-%glr-parser
-
-%destructor { free_node ($$); } stmt expr decl declarator TYPENAME ID
-
-%%
-
-prog :
-     | prog stmt   {
-			char *output;
-			printf ("%d.%d-%d.%d: ",
-			     @2.first_line, @2.first_column,
-			     @2.last_line, @2.last_column);
-			output = node_to_string ($2);
-			printf ("%s\n", output);
-			free (output);
-			free_node ($2);
-		   }
-     ;
-
-stmt : expr ';'  %merge <stmtMerge>	{ $$ = $1; }
-     | decl      %merge <stmtMerge>
-     | error ';'	{ $$ = new_nterm ("<error>", 0, 0, 0); }
-     | '@'		{ YYACCEPT; }
-     ;
-
-expr : ID
-     | TYPENAME '(' expr ')'
-			{ $$ = new_nterm ("<cast>(%s,%s)", $3, $1, 0); }
-     | expr '+' expr	{ $$ = new_nterm ("+(%s,%s)", $1, $3, 0); }
-     | expr '=' expr    { $$ = new_nterm ("=(%s,%s)", $1, $3, 0); }
-     ;
-
-decl : TYPENAME declarator ';'
-			{ $$ = new_nterm ("<declare>(%s,%s)", $1, $2, 0); }
-     | TYPENAME declarator '=' expr ';'
-			{ $$ = new_nterm ("<init-declare>(%s,%s,%s)", $1,
-					  $2, $4); }
-     ;
-
-declarator : ID
-     | '(' declarator ')' { $$ = $2; }
-     ;
-
-%%
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-int
-main (int argc, char **argv)
-{
-  if (argc != 2)
-    abort ();
-  if (!freopen (argv[1], "r", stdin))
-    return 3;
-  return yyparse ();
-}
-
-int
-yylex (LEX_PARAMETERS)
-{
-  char buffer[256];
-  int c;
-  unsigned int i;
-  static int lineNum = 1;
-  static int colNum = 0;
-
-#if YYPURE
-# undef yylloc
-# define yylloc (*llocp)
-# undef yylval
-# define yylval (*lvalp)
-#endif
-
-  while (1)
-    {
-      c = getchar ();
-      switch (c)
-	{
-	case EOF:
-	  return 0;
-	case '\t':
-	  colNum = (colNum + 7) & ~7;
-	  break;
-	case ' ': case '\f':
-	  colNum += 1;
-	  break;
-	case '\n':
-	  lineNum += 1;
-	  colNum = 0;
-	  break;
-	default:
-	  {
-	    int tok;
-#if YYLSP_NEEDED
-	    yylloc.first_line = yylloc.last_line = lineNum;
-	    yylloc.first_column = colNum;
-#endif
-	    if (isalpha (c))
-	      {
-		i = 0;
-
-		do
-		  {
-		    buffer[i++] = c;
-		    colNum += 1;
-		    if (i == sizeof buffer - 1)
-		      abort ();
-		    c = getchar ();
-		  }
-		while (isalnum (c) || c == '_');
-
-		ungetc (c, stdin);
-		buffer[i++] = 0;
-		tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID;
-		yylval = new_term (strcpy ((char *) malloc (i), buffer));
-	      }
-	    else
-	      {
-		colNum += 1;
-		tok = c;
-		yylval = 0;
-	      }
-#if YYLSP_NEEDED
-	    yylloc.last_column = colNum-1;
-#endif
-	    return tok;
-	  }
-	}
-    }
-}
-
-void
-yyerror (ERROR_PARAMETERS)
-{
-#if YYPURE && YYLSP_NEEDED
-  /* Pacify GCC by using llocp.  */
-  if (! llocp)
-    abort ();
-#endif
-  fprintf (stderr, "%s\n", s);
-}
-
-static Node *
-new_nterm (char const *form, Node *child0, Node *child1, Node *child2)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->nterm.isNterm = 1;
-  node->nterm.parents = 0;
-  node->nterm.form = form;
-  node->nterm.children[0] = child0;
-  if (child0)
-    child0->nodeInfo.parents += 1;
-  node->nterm.children[1] = child1;
-  if (child1)
-    child1->nodeInfo.parents += 1;
-  node->nterm.children[2] = child2;
-  if (child2)
-    child2->nodeInfo.parents += 1;
-  return node;
-}
-
-static Node *
-new_term (char *text)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->term.isNterm = 0;
-  node->term.parents = 0;
-  node->term.text = text;
-  return node;
-}
-
-static void
-free_node (Node *node)
-{
-  if (!node)
-    return;
-  node->nodeInfo.parents -= 1;
-  /* Free only if 0 (last parent) or -1 (no parents).  */
-  if (node->nodeInfo.parents > 0)
-    return;
-  if (node->nodeInfo.isNterm == 1)
-    {
-      free_node (node->nterm.children[0]);
-      free_node (node->nterm.children[1]);
-      free_node (node->nterm.children[2]);
-    }
-  else
-    free (node->term.text);
-  free (node);
-}
-
-static char *
-node_to_string (Node *node)
-{
-  char *child0;
-  char *child1;
-  char *child2;
-  char *buffer;
-  if (!node)
-    {
-      buffer = (char *) malloc (1);
-      buffer[0] = 0;
-    }
-  else if (node->nodeInfo.isNterm == 1)
-    {
-      child0 = node_to_string (node->nterm.children[0]);
-      child1 = node_to_string (node->nterm.children[1]);
-      child2 = node_to_string (node->nterm.children[2]);
-      buffer = (char *) malloc (strlen (node->nterm.form) + strlen (child0)
-				+ strlen (child1) + strlen (child2) + 1);
-      sprintf (buffer, node->nterm.form, child0, child1, child2);
-      free (child0);
-      free (child1);
-      free (child2);
-    }
-  else
-    buffer = strdup (node->term.text);
-  return buffer;
-}
-
-
-static YYSTYPE
-stmtMerge (YYSTYPE x0, YYSTYPE x1)
-{
-  return new_nterm ("<OR>(%s,%s)", x0, x1, 0);
-}
-
-_ATEOF
-
-
-
-cat >test-input <<'_ATEOF'
-
-
-z + q;
-
-T x;
-
-T x = y;
-
-x = y;
-
-T (x) + y;
-
-T (x);
-
-T (y) = z + q;
-
-T (y y) = z + q;
-
-z + q;
-
-@
-
-This is total garbage, but it should be ignored.
-_ATEOF
-
-
-$at_traceoff
-echo "cxx-type.at:448: bison -o types.c types.y"
-echo cxx-type.at:448 >$at_check_line_file
-( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:448: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "cxx-type.at:448: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o types types.c \$LIBS"
-echo cxx-type.at:448 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o types types.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:448: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-$at_traceoff
-echo "cxx-type.at:450: \$PREPARSER ./types test-input"
-echo cxx-type.at:450 >$at_check_line_file
-( $at_traceon; $PREPARSER ./types test-input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error
-" | $at_diff - $at_stderr || at_failed=:
-echo >>$at_stdout; echo "3.0-3.5: +(z,q)
-5.0-5.3: <declare>(T,x)
-7.0-7.7: <init-declare>(T,x,y)
-9.0-9.5: =(x,y)
-11.0-11.9: +(<cast>(x,T),y)
-13.0-13.5: <OR>(<declare>(T,x),<cast>(x,T))
-15.0-15.13: <OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
-17.0-17.15: <error>
-19.0-19.5: +(z,q)
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:450: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  139 ) # 139. cxx-type.at:453: GLR: Merge conflicting parses, pure, no locations
-    at_setup_line='cxx-type.at:453'
-    at_desc='GLR: Merge conflicting parses, pure, no locations'
-    $at_quiet $ECHO_N "139: GLR: Merge conflicting parses, pure, no locations$ECHO_C"
-    at_xfail=no
-    (
-      echo "139. cxx-type.at:453: testing ..."
-      $at_traceon
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >types.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Simplified C++ Type and Expression Grammar.  */
-
-%pure-parser
-
-%{
-  #include <stdio.h>
-  union Node {
-    struct {
-      int isNterm;
-      int parents;
-    } nodeInfo;
-    struct {
-      int isNterm; /* 1 */
-      int parents;
-      char const *form;
-      union Node *children[3];
-    } nterm;
-    struct {
-      int isNterm; /* 0 */
-      int parents;
-      char *text;
-    } term;
-  };
-  typedef union Node Node;
-  static Node *new_nterm (char const *, Node *, Node *, Node *);
-  static Node *new_term (char *);
-  static void free_node (Node *);
-  static char *node_to_string (Node *);
-  #define YYSTYPE Node *
- static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);
-  #define YYINITDEPTH 10
-  #define YYSTACKEXPANDABLE 1
-  struct YYLTYPE;
-#if YYPURE
-# if YYLSP_NEEDED
-#  define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp
-#  define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s
-# else
-#  define LEX_PARAMETERS YYSTYPE *lvalp
-# endif
-#endif
-#ifndef LEX_PARAMETERS
-# define LEX_PARAMETERS void
-#endif
-#ifndef ERROR_PARAMETERS
-# define ERROR_PARAMETERS char const *s
-#endif
-  int yylex (LEX_PARAMETERS);
-  void yyerror (ERROR_PARAMETERS);
-%}
-
-%token TYPENAME ID
-
-%right '='
-%left '+'
-
-%glr-parser
-
-%destructor { free_node ($$); } stmt expr decl declarator TYPENAME ID
-
-%%
-
-prog :
-     | prog stmt   {
-			char *output;
-			output = node_to_string ($2);
-			printf ("%s\n", output);
-			free (output);
-			free_node ($2);
-		   }
-     ;
-
-stmt : expr ';'  %merge <stmtMerge>	{ $$ = $1; }
-     | decl      %merge <stmtMerge>
-     | error ';'	{ $$ = new_nterm ("<error>", 0, 0, 0); }
-     | '@'		{ YYACCEPT; }
-     ;
-
-expr : ID
-     | TYPENAME '(' expr ')'
-			{ $$ = new_nterm ("<cast>(%s,%s)", $3, $1, 0); }
-     | expr '+' expr	{ $$ = new_nterm ("+(%s,%s)", $1, $3, 0); }
-     | expr '=' expr    { $$ = new_nterm ("=(%s,%s)", $1, $3, 0); }
-     ;
-
-decl : TYPENAME declarator ';'
-			{ $$ = new_nterm ("<declare>(%s,%s)", $1, $2, 0); }
-     | TYPENAME declarator '=' expr ';'
-			{ $$ = new_nterm ("<init-declare>(%s,%s,%s)", $1,
-					  $2, $4); }
-     ;
-
-declarator : ID
-     | '(' declarator ')' { $$ = $2; }
-     ;
-
-%%
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-int
-main (int argc, char **argv)
-{
-  if (argc != 2)
-    abort ();
-  if (!freopen (argv[1], "r", stdin))
-    return 3;
-  return yyparse ();
-}
-
-int
-yylex (LEX_PARAMETERS)
-{
-  char buffer[256];
-  int c;
-  unsigned int i;
-  static int lineNum = 1;
-  static int colNum = 0;
-
-#if YYPURE
-# undef yylloc
-# define yylloc (*llocp)
-# undef yylval
-# define yylval (*lvalp)
-#endif
-
-  while (1)
-    {
-      c = getchar ();
-      switch (c)
-	{
-	case EOF:
-	  return 0;
-	case '\t':
-	  colNum = (colNum + 7) & ~7;
-	  break;
-	case ' ': case '\f':
-	  colNum += 1;
-	  break;
-	case '\n':
-	  lineNum += 1;
-	  colNum = 0;
-	  break;
-	default:
-	  {
-	    int tok;
-#if YYLSP_NEEDED
-	    yylloc.first_line = yylloc.last_line = lineNum;
-	    yylloc.first_column = colNum;
-#endif
-	    if (isalpha (c))
-	      {
-		i = 0;
-
-		do
-		  {
-		    buffer[i++] = c;
-		    colNum += 1;
-		    if (i == sizeof buffer - 1)
-		      abort ();
-		    c = getchar ();
-		  }
-		while (isalnum (c) || c == '_');
-
-		ungetc (c, stdin);
-		buffer[i++] = 0;
-		tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID;
-		yylval = new_term (strcpy ((char *) malloc (i), buffer));
-	      }
-	    else
-	      {
-		colNum += 1;
-		tok = c;
-		yylval = 0;
-	      }
-#if YYLSP_NEEDED
-	    yylloc.last_column = colNum-1;
-#endif
-	    return tok;
-	  }
-	}
-    }
-}
-
-void
-yyerror (ERROR_PARAMETERS)
-{
-#if YYPURE && YYLSP_NEEDED
-  /* Pacify GCC by using llocp.  */
-  if (! llocp)
-    abort ();
-#endif
-  fprintf (stderr, "%s\n", s);
-}
-
-static Node *
-new_nterm (char const *form, Node *child0, Node *child1, Node *child2)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->nterm.isNterm = 1;
-  node->nterm.parents = 0;
-  node->nterm.form = form;
-  node->nterm.children[0] = child0;
-  if (child0)
-    child0->nodeInfo.parents += 1;
-  node->nterm.children[1] = child1;
-  if (child1)
-    child1->nodeInfo.parents += 1;
-  node->nterm.children[2] = child2;
-  if (child2)
-    child2->nodeInfo.parents += 1;
-  return node;
-}
-
-static Node *
-new_term (char *text)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->term.isNterm = 0;
-  node->term.parents = 0;
-  node->term.text = text;
-  return node;
-}
-
-static void
-free_node (Node *node)
-{
-  if (!node)
-    return;
-  node->nodeInfo.parents -= 1;
-  /* Free only if 0 (last parent) or -1 (no parents).  */
-  if (node->nodeInfo.parents > 0)
-    return;
-  if (node->nodeInfo.isNterm == 1)
-    {
-      free_node (node->nterm.children[0]);
-      free_node (node->nterm.children[1]);
-      free_node (node->nterm.children[2]);
-    }
-  else
-    free (node->term.text);
-  free (node);
-}
-
-static char *
-node_to_string (Node *node)
-{
-  char *child0;
-  char *child1;
-  char *child2;
-  char *buffer;
-  if (!node)
-    {
-      buffer = (char *) malloc (1);
-      buffer[0] = 0;
-    }
-  else if (node->nodeInfo.isNterm == 1)
-    {
-      child0 = node_to_string (node->nterm.children[0]);
-      child1 = node_to_string (node->nterm.children[1]);
-      child2 = node_to_string (node->nterm.children[2]);
-      buffer = (char *) malloc (strlen (node->nterm.form) + strlen (child0)
-				+ strlen (child1) + strlen (child2) + 1);
-      sprintf (buffer, node->nterm.form, child0, child1, child2);
-      free (child0);
-      free (child1);
-      free (child2);
-    }
-  else
-    buffer = strdup (node->term.text);
-  return buffer;
-}
-
-
-static YYSTYPE
-stmtMerge (YYSTYPE x0, YYSTYPE x1)
-{
-  return new_nterm ("<OR>(%s,%s)", x0, x1, 0);
-}
-
-_ATEOF
-
-
-
-cat >test-input <<'_ATEOF'
-
-
-z + q;
-
-T x;
-
-T x = y;
-
-x = y;
-
-T (x) + y;
-
-T (x);
-
-T (y) = z + q;
-
-T (y y) = z + q;
-
-z + q;
-
-@
-
-This is total garbage, but it should be ignored.
-_ATEOF
-
-
-$at_traceoff
-echo "cxx-type.at:455: bison -o types.c types.y"
-echo cxx-type.at:455 >$at_check_line_file
-( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:455: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "cxx-type.at:455: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o types types.c \$LIBS"
-echo cxx-type.at:455 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o types types.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:455: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-$at_traceoff
-echo "cxx-type.at:457: \$PREPARSER ./types test-input"
-echo cxx-type.at:457 >$at_check_line_file
-( $at_traceon; $PREPARSER ./types test-input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error
-" | $at_diff - $at_stderr || at_failed=:
-echo >>$at_stdout; echo "+(z,q)
-<declare>(T,x)
-<init-declare>(T,x,y)
-=(x,y)
-+(<cast>(x,T),y)
-<OR>(<declare>(T,x),<cast>(x,T))
-<OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
-<error>
-+(z,q)
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:457: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  140 ) # 140. cxx-type.at:459: GLR: Merge conflicting parses, pure, locations
-    at_setup_line='cxx-type.at:459'
-    at_desc='GLR: Merge conflicting parses, pure, locations'
-    $at_quiet $ECHO_N "140: GLR: Merge conflicting parses, pure, locations$ECHO_C"
-    at_xfail=no
-    (
-      echo "140. cxx-type.at:459: testing ..."
-      $at_traceon
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >types.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Simplified C++ Type and Expression Grammar.  */
-
-%pure-parser %locations
-
-%{
-  #include <stdio.h>
-  union Node {
-    struct {
-      int isNterm;
-      int parents;
-    } nodeInfo;
-    struct {
-      int isNterm; /* 1 */
-      int parents;
-      char const *form;
-      union Node *children[3];
-    } nterm;
-    struct {
-      int isNterm; /* 0 */
-      int parents;
-      char *text;
-    } term;
-  };
-  typedef union Node Node;
-  static Node *new_nterm (char const *, Node *, Node *, Node *);
-  static Node *new_term (char *);
-  static void free_node (Node *);
-  static char *node_to_string (Node *);
-  #define YYSTYPE Node *
- static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);
-  #define YYINITDEPTH 10
-  #define YYSTACKEXPANDABLE 1
-  struct YYLTYPE;
-#if YYPURE
-# if YYLSP_NEEDED
-#  define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp
-#  define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s
-# else
-#  define LEX_PARAMETERS YYSTYPE *lvalp
-# endif
-#endif
-#ifndef LEX_PARAMETERS
-# define LEX_PARAMETERS void
-#endif
-#ifndef ERROR_PARAMETERS
-# define ERROR_PARAMETERS char const *s
-#endif
-  int yylex (LEX_PARAMETERS);
-  void yyerror (ERROR_PARAMETERS);
-%}
-
-%token TYPENAME ID
-
-%right '='
-%left '+'
-
-%glr-parser
-
-%destructor { free_node ($$); } stmt expr decl declarator TYPENAME ID
-
-%%
-
-prog :
-     | prog stmt   {
-			char *output;
-			printf ("%d.%d-%d.%d: ",
-			     @2.first_line, @2.first_column,
-			     @2.last_line, @2.last_column);
-			output = node_to_string ($2);
-			printf ("%s\n", output);
-			free (output);
-			free_node ($2);
-		   }
-     ;
-
-stmt : expr ';'  %merge <stmtMerge>	{ $$ = $1; }
-     | decl      %merge <stmtMerge>
-     | error ';'	{ $$ = new_nterm ("<error>", 0, 0, 0); }
-     | '@'		{ YYACCEPT; }
-     ;
-
-expr : ID
-     | TYPENAME '(' expr ')'
-			{ $$ = new_nterm ("<cast>(%s,%s)", $3, $1, 0); }
-     | expr '+' expr	{ $$ = new_nterm ("+(%s,%s)", $1, $3, 0); }
-     | expr '=' expr    { $$ = new_nterm ("=(%s,%s)", $1, $3, 0); }
-     ;
-
-decl : TYPENAME declarator ';'
-			{ $$ = new_nterm ("<declare>(%s,%s)", $1, $2, 0); }
-     | TYPENAME declarator '=' expr ';'
-			{ $$ = new_nterm ("<init-declare>(%s,%s,%s)", $1,
-					  $2, $4); }
-     ;
-
-declarator : ID
-     | '(' declarator ')' { $$ = $2; }
-     ;
-
-%%
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-int
-main (int argc, char **argv)
-{
-  if (argc != 2)
-    abort ();
-  if (!freopen (argv[1], "r", stdin))
-    return 3;
-  return yyparse ();
-}
-
-int
-yylex (LEX_PARAMETERS)
-{
-  char buffer[256];
-  int c;
-  unsigned int i;
-  static int lineNum = 1;
-  static int colNum = 0;
-
-#if YYPURE
-# undef yylloc
-# define yylloc (*llocp)
-# undef yylval
-# define yylval (*lvalp)
-#endif
-
-  while (1)
-    {
-      c = getchar ();
-      switch (c)
-	{
-	case EOF:
-	  return 0;
-	case '\t':
-	  colNum = (colNum + 7) & ~7;
-	  break;
-	case ' ': case '\f':
-	  colNum += 1;
-	  break;
-	case '\n':
-	  lineNum += 1;
-	  colNum = 0;
-	  break;
-	default:
-	  {
-	    int tok;
-#if YYLSP_NEEDED
-	    yylloc.first_line = yylloc.last_line = lineNum;
-	    yylloc.first_column = colNum;
-#endif
-	    if (isalpha (c))
-	      {
-		i = 0;
-
-		do
-		  {
-		    buffer[i++] = c;
-		    colNum += 1;
-		    if (i == sizeof buffer - 1)
-		      abort ();
-		    c = getchar ();
-		  }
-		while (isalnum (c) || c == '_');
-
-		ungetc (c, stdin);
-		buffer[i++] = 0;
-		tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID;
-		yylval = new_term (strcpy ((char *) malloc (i), buffer));
-	      }
-	    else
-	      {
-		colNum += 1;
-		tok = c;
-		yylval = 0;
-	      }
-#if YYLSP_NEEDED
-	    yylloc.last_column = colNum-1;
-#endif
-	    return tok;
-	  }
-	}
-    }
-}
-
-void
-yyerror (ERROR_PARAMETERS)
-{
-#if YYPURE && YYLSP_NEEDED
-  /* Pacify GCC by using llocp.  */
-  if (! llocp)
-    abort ();
-#endif
-  fprintf (stderr, "%s\n", s);
-}
-
-static Node *
-new_nterm (char const *form, Node *child0, Node *child1, Node *child2)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->nterm.isNterm = 1;
-  node->nterm.parents = 0;
-  node->nterm.form = form;
-  node->nterm.children[0] = child0;
-  if (child0)
-    child0->nodeInfo.parents += 1;
-  node->nterm.children[1] = child1;
-  if (child1)
-    child1->nodeInfo.parents += 1;
-  node->nterm.children[2] = child2;
-  if (child2)
-    child2->nodeInfo.parents += 1;
-  return node;
-}
-
-static Node *
-new_term (char *text)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->term.isNterm = 0;
-  node->term.parents = 0;
-  node->term.text = text;
-  return node;
-}
-
-static void
-free_node (Node *node)
-{
-  if (!node)
-    return;
-  node->nodeInfo.parents -= 1;
-  /* Free only if 0 (last parent) or -1 (no parents).  */
-  if (node->nodeInfo.parents > 0)
-    return;
-  if (node->nodeInfo.isNterm == 1)
-    {
-      free_node (node->nterm.children[0]);
-      free_node (node->nterm.children[1]);
-      free_node (node->nterm.children[2]);
-    }
-  else
-    free (node->term.text);
-  free (node);
-}
-
-static char *
-node_to_string (Node *node)
-{
-  char *child0;
-  char *child1;
-  char *child2;
-  char *buffer;
-  if (!node)
-    {
-      buffer = (char *) malloc (1);
-      buffer[0] = 0;
-    }
-  else if (node->nodeInfo.isNterm == 1)
-    {
-      child0 = node_to_string (node->nterm.children[0]);
-      child1 = node_to_string (node->nterm.children[1]);
-      child2 = node_to_string (node->nterm.children[2]);
-      buffer = (char *) malloc (strlen (node->nterm.form) + strlen (child0)
-				+ strlen (child1) + strlen (child2) + 1);
-      sprintf (buffer, node->nterm.form, child0, child1, child2);
-      free (child0);
-      free (child1);
-      free (child2);
-    }
-  else
-    buffer = strdup (node->term.text);
-  return buffer;
-}
-
-
-static YYSTYPE
-stmtMerge (YYSTYPE x0, YYSTYPE x1)
-{
-  return new_nterm ("<OR>(%s,%s)", x0, x1, 0);
-}
-
-_ATEOF
-
-
-
-cat >test-input <<'_ATEOF'
-
-
-z + q;
-
-T x;
-
-T x = y;
-
-x = y;
-
-T (x) + y;
-
-T (x);
-
-T (y) = z + q;
-
-T (y y) = z + q;
-
-z + q;
-
-@
-
-This is total garbage, but it should be ignored.
-_ATEOF
-
-
-$at_traceoff
-echo "cxx-type.at:461: bison -o types.c types.y"
-echo cxx-type.at:461 >$at_check_line_file
-( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:461: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "cxx-type.at:461: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o types types.c \$LIBS"
-echo cxx-type.at:461 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o types types.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:461: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-$at_traceoff
-echo "cxx-type.at:463: \$PREPARSER ./types test-input"
-echo cxx-type.at:463 >$at_check_line_file
-( $at_traceon; $PREPARSER ./types test-input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error
-" | $at_diff - $at_stderr || at_failed=:
-echo >>$at_stdout; echo "3.0-3.5: +(z,q)
-5.0-5.3: <declare>(T,x)
-7.0-7.7: <init-declare>(T,x,y)
-9.0-9.5: =(x,y)
-11.0-11.9: +(<cast>(x,T),y)
-13.0-13.5: <OR>(<declare>(T,x),<cast>(x,T))
-15.0-15.13: <OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
-17.0-17.15: <error>
-19.0-19.5: +(z,q)
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:463: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  141 ) # 141. cxx-type.at:466: GLR: Verbose messages, resolve ambiguity, impure, no locations
-    at_setup_line='cxx-type.at:466'
-    at_desc='GLR: Verbose messages, resolve ambiguity, impure, no locations'
-    $at_quiet $ECHO_N "141: GLR: Verbose messages, resolve ambiguity, impure, no locations$ECHO_C"
-    at_xfail=no
-    (
-      echo "141. cxx-type.at:466: testing ..."
-      $at_traceon
-
-
-
-
-
-
-# Using yacc.c?
-
-
-
-
-
-
-
-# yyerror receives the location if %location & %pure & (%glr or %parse-param).
-
-# yyerror always sees the locations (when activated), except if
-# yacc & pure & !param.
-
-
-# The interface is pure: either because %pure-parser, or because we
-# are using the C++ parsers.
-
-
-
-
-
-
-
-
-
-
-
-
-cat >types.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Simplified C++ Type and Expression Grammar.  */
-
-%error-verbose
-
-%{
-  #include <stdio.h>
-  union Node {
-    struct {
-      int isNterm;
-      int parents;
-    } nodeInfo;
-    struct {
-      int isNterm; /* 1 */
-      int parents;
-      char const *form;
-      union Node *children[3];
-    } nterm;
-    struct {
-      int isNterm; /* 0 */
-      int parents;
-      char *text;
-    } term;
-  };
-  typedef union Node Node;
-  static Node *new_nterm (char const *, Node *, Node *, Node *);
-  static Node *new_term (char *);
-  static void free_node (Node *);
-  static char *node_to_string (Node *);
-  #define YYSTYPE Node *
- static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);
-  #define YYINITDEPTH 10
-  #define YYSTACKEXPANDABLE 1
-  struct YYLTYPE;
-#if YYPURE
-# if YYLSP_NEEDED
-#  define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp
-#  define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s
-# else
-#  define LEX_PARAMETERS YYSTYPE *lvalp
-# endif
-#endif
-#ifndef LEX_PARAMETERS
-# define LEX_PARAMETERS void
-#endif
-#ifndef ERROR_PARAMETERS
-# define ERROR_PARAMETERS char const *s
-#endif
-  int yylex (LEX_PARAMETERS);
-  void yyerror (ERROR_PARAMETERS);
-%}
-
-%token TYPENAME ID
-
-%right '='
-%left '+'
-
-%glr-parser
-
-%destructor { free_node ($$); } stmt expr decl declarator TYPENAME ID
-
-%%
-
-prog :
-     | prog stmt   {
-			char *output;
-			output = node_to_string ($2);
-			printf ("%s\n", output);
-			free (output);
-			free_node ($2);
-		   }
-     ;
-
-stmt : expr ';'  %merge <stmtMerge>	{ $$ = $1; }
-     | decl      %merge <stmtMerge>
-     | error ';'	{ $$ = new_nterm ("<error>", 0, 0, 0); }
-     | '@'		{ YYACCEPT; }
-     ;
-
-expr : ID
-     | TYPENAME '(' expr ')'
-			{ $$ = new_nterm ("<cast>(%s,%s)", $3, $1, 0); }
-     | expr '+' expr	{ $$ = new_nterm ("+(%s,%s)", $1, $3, 0); }
-     | expr '=' expr    { $$ = new_nterm ("=(%s,%s)", $1, $3, 0); }
-     ;
-
-decl : TYPENAME declarator ';'
-			{ $$ = new_nterm ("<declare>(%s,%s)", $1, $2, 0); }
-     | TYPENAME declarator '=' expr ';'
-			{ $$ = new_nterm ("<init-declare>(%s,%s,%s)", $1,
-					  $2, $4); }
-     ;
-
-declarator : ID
-     | '(' declarator ')' { $$ = $2; }
-     ;
-
-%%
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-int
-main (int argc, char **argv)
-{
-  if (argc != 2)
-    abort ();
-  if (!freopen (argv[1], "r", stdin))
-    return 3;
-  return yyparse ();
-}
-
-int
-yylex (LEX_PARAMETERS)
-{
-  char buffer[256];
-  int c;
-  unsigned int i;
-  static int lineNum = 1;
-  static int colNum = 0;
-
-#if YYPURE
-# undef yylloc
-# define yylloc (*llocp)
-# undef yylval
-# define yylval (*lvalp)
-#endif
-
-  while (1)
-    {
-      c = getchar ();
-      switch (c)
-	{
-	case EOF:
-	  return 0;
-	case '\t':
-	  colNum = (colNum + 7) & ~7;
-	  break;
-	case ' ': case '\f':
-	  colNum += 1;
-	  break;
-	case '\n':
-	  lineNum += 1;
-	  colNum = 0;
-	  break;
-	default:
-	  {
-	    int tok;
-#if YYLSP_NEEDED
-	    yylloc.first_line = yylloc.last_line = lineNum;
-	    yylloc.first_column = colNum;
-#endif
-	    if (isalpha (c))
-	      {
-		i = 0;
-
-		do
-		  {
-		    buffer[i++] = c;
-		    colNum += 1;
-		    if (i == sizeof buffer - 1)
-		      abort ();
-		    c = getchar ();
-		  }
-		while (isalnum (c) || c == '_');
-
-		ungetc (c, stdin);
-		buffer[i++] = 0;
-		tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID;
-		yylval = new_term (strcpy ((char *) malloc (i), buffer));
-	      }
-	    else
-	      {
-		colNum += 1;
-		tok = c;
-		yylval = 0;
-	      }
-#if YYLSP_NEEDED
-	    yylloc.last_column = colNum-1;
-#endif
-	    return tok;
-	  }
-	}
-    }
-}
-
-void
-yyerror (ERROR_PARAMETERS)
-{
-#if YYPURE && YYLSP_NEEDED
-  /* Pacify GCC by using llocp.  */
-  if (! llocp)
-    abort ();
-#endif
-  fprintf (stderr, "%s\n", s);
-}
-
-static Node *
-new_nterm (char const *form, Node *child0, Node *child1, Node *child2)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->nterm.isNterm = 1;
-  node->nterm.parents = 0;
-  node->nterm.form = form;
-  node->nterm.children[0] = child0;
-  if (child0)
-    child0->nodeInfo.parents += 1;
-  node->nterm.children[1] = child1;
-  if (child1)
-    child1->nodeInfo.parents += 1;
-  node->nterm.children[2] = child2;
-  if (child2)
-    child2->nodeInfo.parents += 1;
-  return node;
-}
-
-static Node *
-new_term (char *text)
-{
-  Node *node = (Node *) malloc (sizeof (Node));
-  node->term.isNterm = 0;
-  node->term.parents = 0;
-  node->term.text = text;
-  return node;
-}
-
-static void
-free_node (Node *node)
-{
-  if (!node)
-    return;
-  node->nodeInfo.parents -= 1;
-  /* Free only if 0 (last parent) or -1 (no parents).  */
-  if (node->nodeInfo.parents > 0)
-    return;
-  if (node->nodeInfo.isNterm == 1)
-    {
-      free_node (node->nterm.children[0]);
-      free_node (node->nterm.children[1]);
-      free_node (node->nterm.children[2]);
-    }
-  else
-    free (node->term.text);
-  free (node);
-}
-
-static char *
-node_to_string (Node *node)
-{
-  char *child0;
-  char *child1;
-  char *child2;
-  char *buffer;
-  if (!node)
-    {
-      buffer = (char *) malloc (1);
-      buffer[0] = 0;
-    }
-  else if (node->nodeInfo.isNterm == 1)
-    {
-      child0 = node_to_string (node->nterm.children[0]);
-      child1 = node_to_string (node->nterm.children[1]);
-      child2 = node_to_string (node->nterm.children[2]);
-      buffer = (char *) malloc (strlen (node->nterm.form) + strlen (child0)
-				+ strlen (child1) + strlen (child2) + 1);
-      sprintf (buffer, node->nterm.form, child0, child1, child2);
-      free (child0);
-      free (child1);
-      free (child2);
-    }
-  else
-    buffer = strdup (node->term.text);
-  return buffer;
-}
-
-
-static YYSTYPE
-stmtMerge (YYSTYPE x0, YYSTYPE x1)
-{
-  return new_nterm ("<OR>(%s,%s)", x0, x1, 0);
-}
-
-_ATEOF
-
-
-
-cat >test-input <<'_ATEOF'
-
-
-z + q;
-
-T x;
-
-T x = y;
-
-x = y;
-
-T (x) + y;
-
-T (x);
-
-T (y) = z + q;
-
-T (y y) = z + q;
-
-z + q;
-
-@
-
-This is total garbage, but it should be ignored.
-_ATEOF
-
-
-$at_traceoff
-echo "cxx-type.at:468: bison -o types.c types.y"
-echo cxx-type.at:468 >$at_check_line_file
-( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:468: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "cxx-type.at:468: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o types types.c \$LIBS"
-echo cxx-type.at:468 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o types types.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:468: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-$at_traceoff
-echo "cxx-type.at:470: \$PREPARSER ./types test-input"
-echo cxx-type.at:470 >$at_check_line_file
-( $at_traceon; $PREPARSER ./types test-input ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error, unexpected ID, expecting '=' or '+' or ')'
-" | $at_diff - $at_stderr || at_failed=:
-echo >>$at_stdout; echo "+(z,q)
-<declare>(T,x)
-<init-declare>(T,x,y)
-=(x,y)
-+(<cast>(x,T),y)
-<OR>(<declare>(T,x),<cast>(x,T))
-<OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
-<error>
-+(z,q)
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "cxx-type.at:470: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  banner-18 ) # Banner 18. glr-regression.at:19
-    cat <<\_ATEOF
-
-GLR Regression Tests
-
-_ATEOF
-    ;;
-
-  142 ) # 142. glr-regression.at:25: Badly Collapsed GLR States
-    at_setup_line='glr-regression.at:25'
-    at_desc='Badly Collapsed GLR States'
-    $at_quiet $ECHO_N "142: Badly Collapsed GLR States                   $ECHO_C"
-    at_xfail=no
-    (
-      echo "142. glr-regression.at:25: testing ..."
-      $at_traceon
-
-
-cat >glr-regr1.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Regression Test: Improper state compression */
-/* Reported by Scott McPeak */
-
-%{
-#include <stdio.h>
-
-#define YYSTYPE int
-static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1);
-int yylex (void);
-void yyerror (char const *msg);
-%}
-
-
-%glr-parser
-
-
-/* -------- productions ------ */
-%%
-
-StartSymbol: E  { $$=0; }                   %merge <exprMerge>
-           ;
-
-E: E 'P' E { $$=1; printf("E -> E 'P' E\n"); }  %merge <exprMerge>
- | 'B'     { $$=2; printf("E -> 'B'\n"); }      %merge <exprMerge>
- ;
-
-
-
-/* ---------- C code ----------- */
-%%
-
-static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1)
-{
-  (void) x0;
-  (void) x1;
-  printf ("<OR>\n");
-  return 0;
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-
-void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-
-int
-yylex (void)
-{
-  for (;;)
-    {
-      int ch = getchar ();
-      if (ch == EOF)
-	return 0;
-      else if (ch == 'B' || ch == 'P')
-	return ch;
-    }
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:96: bison -o glr-regr1.c glr-regr1.y"
-echo glr-regression.at:96 >$at_check_line_file
-( $at_traceon; bison -o glr-regr1.c glr-regr1.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr1.y: conflicts: 1 shift/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:96: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:97: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr1 glr-regr1.c \$LIBS"
-echo glr-regression.at:97 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr1 glr-regr1.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:97: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:108: echo BPBPB | ./glr-regr1"
-echo glr-regression.at:108 >$at_check_line_file
-( $at_traceon; echo BPBPB | ./glr-regr1 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "E -> 'B'
-E -> 'B'
-E -> E 'P' E
-E -> 'B'
-E -> E 'P' E
-E -> 'B'
-E -> E 'P' E
-E -> E 'P' E
-<OR>
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:108: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  143 ) # 143. glr-regression.at:116: Improper handling of embedded actions and dollar(-N) in GLR parsers
-    at_setup_line='glr-regression.at:116'
-    at_desc='Improper handling of embedded actions and dollar(-N) in GLR parsers'
-    $at_quiet $ECHO_N "143: Improper handling of embedded actions and dollar(-N) in GLR parsers$ECHO_C"
-    at_xfail=no
-    (
-      echo "143. glr-regression.at:116: testing ..."
-      $at_traceon
-
-
-cat >glr-regr2a.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Regression Test: Improper handling of embedded actions and $-N  */
-/* Reported by S. Eken */
-
-%{
-  #define YYSTYPE char *
-
-  #include <ctype.h>
-  #include <stdio.h>
-  #include <stdlib.h>
-  #include <string.h>
-  int yylex (void);
-  void yyerror (char const *);
-%}
-
-%glr-parser
-
-%%
-
-command:
-    's' var 't'
-       { printf ("Variable: '%s'\n", $2); }
-    'v' 'x' 'q'
-       { free ($2); }
-  | 's' var_list 't' 'e'
-       { printf ("Varlist: '%s'\n", $2); free ($2); }
-  | 's' var 't' var_printer 'x'
-       { free ($2); }
-  ;
-
-var:
-  'V'
-     { $$ = $1; }
-  ;
-
-var_list:
-  var
-    { $$ = $1; }
-  | var ',' var_list
-    {
-      char *s = (char *) realloc ($1, strlen ($1) + 1 + strlen ($3) + 1);
-      strcat (s, ",");
-      strcat (s, $3);
-      free ($3);
-      $$ = s;
-    }
-  ;
-
-var_printer: 'v'
-   { printf ("Variable: '%s'\n", $-1); }
-
-%%
-
-FILE *input = NULL;
-
-int
-yylex (void)
-{
-  char buf[50];
-  char *s;
-  switch (fscanf (input, " %1[a-z,]", buf)) {
-  case 1:
-    return buf[0];
-  case EOF:
-    return 0;
-  default:
-    break;
-  }
-  if (fscanf (input, "%49s", buf) != 1)
-    return 0;
-  if (sizeof buf - 1 <= strlen (buf))
-    abort ();
-  s = (char *) malloc (strlen (buf) + 1);
-  strcpy (s, buf);
-  yylval = s;
-  return 'V';
-}
-
-void
-yyerror (char const *s)
-{ printf ("%s\n", s);
-}
-
-int
-main (int argc, char **argv)
-{
-  input = stdin;
-  if (argc == 2 && !(input = fopen (argv[1], "r"))) return 3;
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:212: bison -o glr-regr2a.c glr-regr2a.y"
-echo glr-regression.at:212 >$at_check_line_file
-( $at_traceon; bison -o glr-regr2a.c glr-regr2a.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr2a.y: conflicts: 2 shift/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:212: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:213: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr2a glr-regr2a.c \$LIBS"
-echo glr-regression.at:213 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr2a glr-regr2a.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:213: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:217: echo s VARIABLE_1 t v x q | ./glr-regr2a"
-echo glr-regression.at:217 >$at_check_line_file
-( $at_traceon; echo s VARIABLE_1 t v x q | ./glr-regr2a ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "Variable: 'VARIABLE_1'
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:217: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:220: echo s VARIABLE_1 , ANOTHER_VARIABLE_2 t e | ./glr-regr2a"
-echo glr-regression.at:220 >$at_check_line_file
-( $at_traceon; echo s VARIABLE_1 , ANOTHER_VARIABLE_2 t e | ./glr-regr2a ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "Varlist: 'VARIABLE_1,ANOTHER_VARIABLE_2'
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:220: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:223: echo s VARIABLE_3 t v x | ./glr-regr2a"
-echo glr-regression.at:223 >$at_check_line_file
-( $at_traceon; echo s VARIABLE_3 t v x | ./glr-regr2a ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "Variable: 'VARIABLE_3'
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:223: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  144 ) # 144. glr-regression.at:232: Improper merging of GLR delayed action sets
-    at_setup_line='glr-regression.at:232'
-    at_desc='Improper merging of GLR delayed action sets'
-    $at_quiet $ECHO_N "144: Improper merging of GLR delayed action sets  $ECHO_C"
-    at_xfail=no
-    (
-      echo "144. glr-regression.at:232: testing ..."
-      $at_traceon
-
-
-cat >glr-regr3.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-/* Regression Test: Improper merging of GLR delayed action sets.  */
-/* Reported by M. Rosien */
-
-%{
-#include <stdio.h>
-#include <stdarg.h>
-
-static int MergeRule (int x0, int x1);
-static void yyerror (char const * s);
-int yylex (void);
-
-#define RULE(x) (1 << (x))
-
-%}
-
-%glr-parser
-
-%token BAD_CHAR
-%token P1 P2 T1 T2 T3 T4 O1 O2
-
-%%
-
-S : P1 T4 O2 NT6 P2  { printf ("Result: %x\n", $4); }
-;
-
-NT1 : P1 T1 O1 T2 P2 { $$ = RULE(2); }  %merge<MergeRule>
-;
-
-NT2 : NT1             { $$ = RULE(3); } %merge<MergeRule>
-    | P1 NT1 O1 T3 P2 { $$ = RULE(4); } %merge<MergeRule>
-;
-
-NT3 : T3              { $$ = RULE(5); } %merge<MergeRule>
-    | P1 NT1 O1 T3 P2 { $$ = RULE(6); } %merge<MergeRule>
-;
-
-NT4 : NT3              { $$ = RULE(7); } %merge<MergeRule>
-    | NT2              { $$ = RULE(8); } %merge<MergeRule>
-    | P1 NT2 O1 NT3 P2 { $$ = RULE(9); } %merge<MergeRule>
-;
-
-NT5 : NT4              { $$ = RULE(10); } %merge<MergeRule>
-;
-
-NT6 : P1 NT1 O1 T3 P2  { $$ = RULE(11) | $2; } %merge<MergeRule>
-    | NT5              { $$ = RULE(12) | $1; } %merge<MergeRule>
-;
-
-%%
-
-static int MergeRule (int x0, int x1) {
-  return x0 | x1;
-}
-
-static void yyerror(char const * s) {
-  fprintf(stderr,"error: %s\n",s);
-}
-
-FILE *input = NULL;
-
-int P[] = { P1, P2 };
-int O[] = { O1, O2 };
-int T[] = { T1, T2, T3, T4 };
-
-int yylex (void)
-{
-  char inp[3];
-  if (fscanf (input, "%2s", inp) == EOF)
-    return 0;
-  switch (inp[0])
-    {
-    case 'p': return P[inp[1] - '1'];
-    case 't': return T[inp[1] - '1'];
-    case 'o': return O[inp[1] - '1'];
-    }
-  return BAD_CHAR;
-}
-
-int main(int argc, char* argv[]) {
-  input = stdin;
-  if (argc == 2 && !(input = fopen (argv[1], "r"))) return 3;
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:322: bison -o glr-regr3.c glr-regr3.y"
-echo glr-regression.at:322 >$at_check_line_file
-( $at_traceon; bison -o glr-regr3.c glr-regr3.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr3.y: conflicts: 1 shift/reduce, 1 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:322: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:323: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr3 glr-regr3.c \$LIBS"
-echo glr-regression.at:323 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr3 glr-regr3.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:323: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:327: echo p1 t4 o2 p1 p1 t1 o1 t2 p2 o1 t3 p2 p2 | ./glr-regr3"
-echo glr-regression.at:327 >$at_check_line_file
-( $at_traceon; echo p1 t4 o2 p1 p1 t1 o1 t2 p2 o1 t3 p2 p2 | ./glr-regr3 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "Result: 1c04
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:327: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  145 ) # 145. glr-regression.at:337: Duplicate representation of merged trees
-    at_setup_line='glr-regression.at:337'
-    at_desc='Duplicate representation of merged trees'
-    $at_quiet $ECHO_N "145: Duplicate representation of merged trees     $ECHO_C"
-    at_xfail=no
-    (
-      echo "145. glr-regression.at:337: testing ..."
-      $at_traceon
-
-
-cat >glr-regr4.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-%union { char *ptr; }
-%type <ptr> S A A1 A2 B
-%glr-parser
-
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
-  #include <string.h>
-  static char *merge (YYSTYPE, YYSTYPE);
-  static char *make_value (char const *, char const *);
-  static void yyerror (char const *);
-  static int yylex (void);
-%}
-
-%%
-
-tree: S { printf ("%s\n", $1); } ;
-
-S:
-  A   %merge<merge> { $$ = make_value ("S", $1); }
-  | B %merge<merge> { $$ = make_value ("S", $1); }
-  ;
-
-A:
-  A1   %merge<merge> { $$ = make_value ("A", $1); }
-  | A2 %merge<merge> { $$ = make_value ("A", $1); }
-  ;
-
-A1: 'a' { $$ = make_value ("A1", "'a'"); } ;
-A2: 'a' { $$ = make_value ("A2", "'a'"); } ;
-B:  'a' { $$ = make_value ("B", "'a'");  } ;
-
-%%
-
-static int
-yylex (void)
-{
-  static char const *input = "a";
-  return *input++;
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-
-static char *
-make_value (char const *parent, char const *child)
-{
-  char const format[] = "%s <- %s";
-  char *value =
-    (char *) malloc (strlen (parent) + strlen (child) + sizeof format);
-  sprintf (value, format, parent, child);
-  return value;
-}
-
-static char *
-merge (YYSTYPE s1, YYSTYPE s2)
-{
-  char const format[] = "merge{ %s and %s }";
-  char *value =
-    (char *) malloc (strlen (s1.ptr) + strlen (s2.ptr) + sizeof format);
-  sprintf (value, format, s1.ptr, s2.ptr);
-  return value;
-}
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:417: bison -o glr-regr4.c glr-regr4.y"
-echo glr-regression.at:417 >$at_check_line_file
-( $at_traceon; bison -o glr-regr4.c glr-regr4.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr4.y: conflicts: 1 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:417: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:418: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr4 glr-regr4.c \$LIBS"
-echo glr-regression.at:418 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr4 glr-regr4.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:418: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:422: ./glr-regr4"
-echo glr-regression.at:422 >$at_check_line_file
-( $at_traceon; ./glr-regr4 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "merge{ S <- merge{ A <- A1 <- 'a' and A <- A2 <- 'a' } and S <- B <- 'a' }
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:422: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  146 ) # 146. glr-regression.at:432: User destructor for unresolved GLR semantic value
-    at_setup_line='glr-regression.at:432'
-    at_desc='User destructor for unresolved GLR semantic value'
-    $at_quiet $ECHO_N "146: User destructor for unresolved GLR semantic value$ECHO_C"
-    at_xfail=no
-    (
-      echo "146. glr-regression.at:432: testing ..."
-      $at_traceon
-
-
-cat >glr-regr5.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  enum { MAGIC_VALUE = -1057808125 }; /* originally chosen at random */
-%}
-
-%glr-parser
-%union { int value; }
-%type <value> start
-
-%destructor {
-  if ($$ != MAGIC_VALUE)
-    {
-      fprintf (stderr, "Bad destructor call.\n");
-      exit (EXIT_FAILURE);
-    }
-} start
-
-%%
-
-start:
-   'a' { $$ = MAGIC_VALUE; }
-   | 'a' { $$ = MAGIC_VALUE; }
-   ;
-
-%%
-
-static int
-yylex (void)
-{
-  static char const *input = "a";
-  return *input++;
-}
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-int
-main (void)
-{
-  return yyparse () != 1;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:487: bison -o glr-regr5.c glr-regr5.y"
-echo glr-regression.at:487 >$at_check_line_file
-( $at_traceon; bison -o glr-regr5.c glr-regr5.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr5.y: conflicts: 1 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:487: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:488: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr5 glr-regr5.c \$LIBS"
-echo glr-regression.at:488 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr5 glr-regr5.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:488: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:492: ./glr-regr5"
-echo glr-regression.at:492 >$at_check_line_file
-( $at_traceon; ./glr-regr5 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax is ambiguous
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:492: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  147 ) # 147. glr-regression.at:502: User destructor after an error during a split parse
-    at_setup_line='glr-regression.at:502'
-    at_desc='User destructor after an error during a split parse'
-    $at_quiet $ECHO_N "147: User destructor after an error during a split parse$ECHO_C"
-    at_xfail=no
-    (
-      echo "147. glr-regression.at:502: testing ..."
-      $at_traceon
-
-
-cat >glr-regr6.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-%}
-
-%glr-parser
-%union { int value; }
-%type <value> 'a'
-
-%destructor {
-  printf ("Destructor called.\n");
-} 'a'
-
-%%
-
-start: 'a' | 'a' ;
-
-%%
-
-static int
-yylex (void)
-{
-  static char const *input = "a";
-  return *input++;
-}
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-int
-main (void)
-{
-  return yyparse () != 1;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:549: bison -o glr-regr6.c glr-regr6.y"
-echo glr-regression.at:549 >$at_check_line_file
-( $at_traceon; bison -o glr-regr6.c glr-regr6.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr6.y: conflicts: 1 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:549: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:550: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr6 glr-regr6.c \$LIBS"
-echo glr-regression.at:550 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr6 glr-regr6.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:550: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:556: ./glr-regr6"
-echo glr-regression.at:556 >$at_check_line_file
-( $at_traceon; ./glr-regr6 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax is ambiguous
-" | $at_diff - $at_stderr || at_failed=:
-echo >>$at_stdout; echo "Destructor called.
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:556: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  148 ) # 148. glr-regression.at:566: Duplicated user destructor for lookahead
-    at_setup_line='glr-regression.at:566'
-    at_desc='Duplicated user destructor for lookahead'
-    $at_quiet $ECHO_N "148: Duplicated user destructor for lookahead     $ECHO_C"
-    at_xfail=no
-    (
-      echo "148. glr-regression.at:566: testing ..."
-      $at_traceon
-
-
-cat >glr-regr7.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  #define YYSTACKEXPANDABLE 0
-%}
-
-%glr-parser
-%union { int *count; }
-%type <count> 'a'
-
-%destructor {
-  if ((*$$)++)
-    fprintf (stderr, "Destructor called on same value twice.\n");
-} 'a'
-
-%%
-
-start:
-    stack1 start
-  | stack2 start
-  | /* empty */
-  ;
-stack1: 'a' ;
-stack2: 'a' ;
-
-%%
-
-static int
-yylex (void)
-{
-  yylval.count = (int *) malloc (sizeof (int));
-  if (!yylval.count)
-    {
-      fprintf (stderr, "Test inconclusive.\n");
-      exit (EXIT_FAILURE);
-    }
-  *yylval.count = 0;
-  return 'a';
-}
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-int
-main (void)
-{
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:627: bison -o glr-regr7.c glr-regr7.y"
-echo glr-regression.at:627 >$at_check_line_file
-( $at_traceon; bison -o glr-regr7.c glr-regr7.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr7.y: conflicts: 2 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:627: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:628: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr7 glr-regr7.c \$LIBS"
-echo glr-regression.at:628 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr7 glr-regr7.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:628: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:632: ./glr-regr7"
-echo glr-regression.at:632 >$at_check_line_file
-( $at_traceon; ./glr-regr7 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "memory exhausted
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   2) ;;
-   *) echo "glr-regression.at:632: exit code was $at_status, expected 2"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  149 ) # 149. glr-regression.at:644: Incorrectly initialized location for empty right-hand side in GLR
-    at_setup_line='glr-regression.at:644'
-    at_desc='Incorrectly initialized location for empty right-hand side in GLR'
-    $at_quiet $ECHO_N "149: Incorrectly initialized location for empty right-hand side in GLR$ECHO_C"
-    at_xfail=no
-    (
-      echo "149. glr-regression.at:644: testing ..."
-      $at_traceon
-
-
-cat >glr-regr8.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  static void yyerror (char const *msg);
-%}
-
-%token T_CONSTANT
-%token T_PORT
-%token T_SIGNAL
-
-%glr-parser
-
-%%
-
-
-PortClause	: T_PORT InterfaceDeclaration T_PORT
-		{ printf("%d/%d - %d/%d - %d/%d\n",
-			 @1.first_column, @1.last_column,
-			 @2.first_column, @2.last_column,
-			 @3.first_column, @3.last_column); }
-	;
-
-InterfaceDeclaration	: OptConstantWord	%dprec 1
-	| OptSignalWord	%dprec 2
-	;
-
-OptConstantWord	: /* empty */
-	| T_CONSTANT
-	;
-
-OptSignalWord	: /* empty */
-		{ printf("empty: %d/%d\n", @$.first_column, @$.last_column); }
-	| T_SIGNAL
-	;
-
-%%
-
-void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int lexIndex;
-
-int yylex (void)
-{
-  lexIndex += 1;
-  switch (lexIndex)
-    {
-    case 1:
-      yylloc.first_column = 1;
-      yylloc.last_column = 9;
-      return T_PORT;
-    case 2:
-      yylloc.first_column = 13;
-      yylloc.last_column = 17;
-      return T_PORT;
-    default:
-      return 0;
-    }
-}
-
-int
-main (void)
-{
-  yyparse();
-  return 0;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:723: bison -o glr-regr8.c glr-regr8.y"
-echo glr-regression.at:723 >$at_check_line_file
-( $at_traceon; bison -o glr-regr8.c glr-regr8.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr8.y: conflicts: 1 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:723: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:724: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr8 glr-regr8.c \$LIBS"
-echo glr-regression.at:724 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr8 glr-regr8.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:724: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:730: ./glr-regr8"
-echo glr-regression.at:730 >$at_check_line_file
-( $at_traceon; ./glr-regr8 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "empty: 9/9
-1/9 - 9/9 - 13/17
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:730: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  150 ) # 150. glr-regression.at:740: No users destructors if stack 0 deleted
-    at_setup_line='glr-regression.at:740'
-    at_desc='No users destructors if stack 0 deleted'
-    $at_quiet $ECHO_N "150: No users destructors if stack 0 deleted      $ECHO_C"
-    at_xfail=no
-    (
-      echo "150. glr-regression.at:740: testing ..."
-      $at_traceon
-
-
-cat >glr-regr9.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-%{
-# include <stdio.h>
-# include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-# define YYSTACKEXPANDABLE 0
-  static int tokens = 0;
-  static int destructors = 0;
-# define USE(Var)
-%}
-
-%glr-parser
-%union { int dummy; }
-%type <dummy> 'a'
-
-%destructor {
-  destructors += 1;
-} 'a'
-
-%%
-
-start:
-    ambig0 'a'   { destructors += 2; USE ($2); }
-  | ambig1 start { destructors += 1; }
-  | ambig2 start { destructors += 1; }
-  ;
-
-ambig0: 'a' ;
-ambig1: 'a' ;
-ambig2: 'a' ;
-
-%%
-
-static int
-yylex (void)
-{
-  tokens += 1;
-  return 'a';
-}
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-int
-main (void)
-{
-  int exit_status;
-  exit_status = yyparse ();
-  if (tokens != destructors)
-    {
-      fprintf (stderr, "Tokens = %d, Destructors = %d\n", tokens, destructors);
-      return 1;
-    }
-  return !exit_status;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:806: bison -o glr-regr9.c glr-regr9.y"
-echo glr-regression.at:806 >$at_check_line_file
-( $at_traceon; bison -o glr-regr9.c glr-regr9.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr9.y: conflicts: 1 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:806: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:807: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr9 glr-regr9.c \$LIBS"
-echo glr-regression.at:807 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr9 glr-regr9.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:807: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:811: ./glr-regr9"
-echo glr-regression.at:811 >$at_check_line_file
-( $at_traceon; ./glr-regr9 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "memory exhausted
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:811: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  151 ) # 151. glr-regression.at:820: Corrupted semantic options if user action cuts parse
-    at_setup_line='glr-regression.at:820'
-    at_desc='Corrupted semantic options if user action cuts parse'
-    $at_quiet $ECHO_N "151: Corrupted semantic options if user action cuts parse$ECHO_C"
-    at_xfail=no
-    (
-      echo "151. glr-regression.at:820: testing ..."
-      $at_traceon
-
-
-cat >glr-regr10.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-%{
-# include <stdio.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  #define GARBAGE_SIZE 50
-  static char garbage[GARBAGE_SIZE];
-%}
-
-%glr-parser
-%union { char *ptr; }
-%type <ptr> start
-
-%%
-
-start:
-    %dprec 2 { $$ = garbage; YYACCEPT; }
-  | %dprec 1 { $$ = garbage; YYACCEPT; }
-  ;
-
-%%
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  return 0;
-}
-
-int
-main (void)
-{
-  int i;
-  for (i = 0; i < GARBAGE_SIZE; i+=1)
-    garbage[i] = 108;
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:869: bison -o glr-regr10.c glr-regr10.y"
-echo glr-regression.at:869 >$at_check_line_file
-( $at_traceon; bison -o glr-regr10.c glr-regr10.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr10.y: conflicts: 1 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:869: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:870: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr10 glr-regr10.c \$LIBS"
-echo glr-regression.at:870 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr10 glr-regr10.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:870: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:872: ./glr-regr10"
-echo glr-regression.at:872 >$at_check_line_file
-( $at_traceon; ./glr-regr10 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:872: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  152 ) # 152. glr-regression.at:881: Undesirable destructors if user action cuts parse
-    at_setup_line='glr-regression.at:881'
-    at_desc='Undesirable destructors if user action cuts parse'
-    $at_quiet $ECHO_N "152: Undesirable destructors if user action cuts parse$ECHO_C"
-    at_xfail=no
-    (
-      echo "152. glr-regression.at:881: testing ..."
-      $at_traceon
-
-
-cat >glr-regr11.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-%{
-# include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  static int destructors = 0;
-# define USE(val)
-%}
-
-%glr-parser
-%union { int dummy; }
-%type <int> 'a'
-%destructor { destructors += 1; } 'a'
-
-%%
-
-start:
-    'a' %dprec 2 { USE ($1); destructors += 1; YYACCEPT; }
-  | 'a' %dprec 1 { USE ($1); destructors += 1; YYACCEPT; }
-  ;
-
-%%
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  static char const *input = "a";
-  return *input++;
-}
-
-int
-main (void)
-{
-  int exit_status = yyparse ();
-  if (destructors != 1)
-    {
-      fprintf (stderr, "Destructor calls: %d\n", destructors);
-      return 1;
-    }
-  return exit_status;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:935: bison -o glr-regr11.c glr-regr11.y"
-echo glr-regression.at:935 >$at_check_line_file
-( $at_traceon; bison -o glr-regr11.c glr-regr11.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr11.y: conflicts: 1 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:935: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:936: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr11 glr-regr11.c \$LIBS"
-echo glr-regression.at:936 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr11 glr-regr11.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:936: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:938: ./glr-regr11"
-echo glr-regression.at:938 >$at_check_line_file
-( $at_traceon; ./glr-regr11 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:938: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  153 ) # 153. glr-regression.at:947: Leaked semantic values if user action cuts parse
-    at_setup_line='glr-regression.at:947'
-    at_desc='Leaked semantic values if user action cuts parse'
-    $at_quiet $ECHO_N "153: Leaked semantic values if user action cuts parse$ECHO_C"
-    at_xfail=no
-    (
-      echo "153. glr-regression.at:947: testing ..."
-      $at_traceon
-
-
-cat >glr-regr12.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-%glr-parser
-%union { int dummy; }
-%token PARENT_RHS_AFTER
-%type <dummy> parent_rhs_before merged PARENT_RHS_AFTER
-%destructor { parent_rhs_before_value = 0; } parent_rhs_before
-%destructor { merged_value = 0; } merged
-%destructor { parent_rhs_after_value = 0; } PARENT_RHS_AFTER
-
-%{
-# include <stdlib.h>
-  static int merge (YYSTYPE, YYSTYPE);
-  static void yyerror (char const *);
-  static int yylex (void);
-  static int parent_rhs_before_value = 0;
-  static int merged_value = 0;
-  static int parent_rhs_after_value = 0;
-# define USE(val)
-%}
-
-%%
-
-start:
-  alt1 %dprec 1
-  | alt2 %dprec 2
-  ;
-
-alt1:
-  PARENT_RHS_AFTER {
-    USE ($1);
-    parent_rhs_after_value = 0;
-  }
-  ;
-
-alt2:
-  parent_rhs_before merged PARENT_RHS_AFTER {
-    USE (($1, $2, $3));
-    parent_rhs_before_value = 0;
-    merged_value = 0;
-    parent_rhs_after_value = 0;
-  }
-  ;
-
-parent_rhs_before:
-  {
-    USE ($$);
-    parent_rhs_before_value = 1;
-  }
-  ;
-
-merged:
-  %merge<merge> {
-    USE ($$);
-    merged_value = 1;
-  }
-  | cut %merge<merge> {
-    USE ($$);
-    merged_value = 1;
-  }
-  ;
-
-cut: { YYACCEPT; } ;
-
-%%
-
-static int
-merge (YYSTYPE s1, YYSTYPE s2)
-{
-  /* Not invoked. */
-  char dummy = s1.dummy + s2.dummy;
-  return dummy;
-}
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  static int const input[] = { PARENT_RHS_AFTER, 0 };
-  static const int *inputp = input;
-  if (*inputp == PARENT_RHS_AFTER)
-    parent_rhs_after_value = 1;
-  return *inputp++;
-}
-
-int
-main (void)
-{
-  int exit_status = yyparse ();
-  if (parent_rhs_before_value)
-    {
-      fprintf (stderr, "`parent_rhs_before' destructor not called.\n");
-      exit_status = 1;
-    }
-  if (merged_value)
-    {
-      fprintf (stderr, "`merged' destructor not called.\n");
-      exit_status = 1;
-    }
-  if (parent_rhs_after_value)
-    {
-      fprintf (stderr, "`PARENT_RHS_AFTER' destructor not called.\n");
-      exit_status = 1;
-    }
-  return exit_status;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:1064: bison -o glr-regr12.c glr-regr12.y"
-echo glr-regression.at:1064 >$at_check_line_file
-( $at_traceon; bison -o glr-regr12.c glr-regr12.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr12.y: conflicts: 1 shift/reduce, 1 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1064: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:1065: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr12 glr-regr12.c \$LIBS"
-echo glr-regression.at:1065 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr12 glr-regr12.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1065: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:1067: ./glr-regr12"
-echo glr-regression.at:1067 >$at_check_line_file
-( $at_traceon; ./glr-regr12 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1067: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  154 ) # 154. glr-regression.at:1078: Incorrect lookahead during deterministic GLR
-    at_setup_line='glr-regression.at:1078'
-    at_desc='Incorrect lookahead during deterministic GLR'
-    $at_quiet $ECHO_N "154: Incorrect lookahead during deterministic GLR $ECHO_C"
-    at_xfail=no
-    (
-      echo "154. glr-regression.at:1078: testing ..."
-      $at_traceon
-
-
-cat >glr-regr13.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-/* Tests:
-     - Defaulted state with initial yychar: yychar == YYEMPTY.
-     - Nondefaulted state: yychar != YYEMPTY.
-     - Defaulted state after lookahead: yychar != YYEMPTY.
-     - Defaulted state after shift: yychar == YYEMPTY.
-     - User action changing the lookahead.  */
-
-%{
-  #include <stdio.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  static void print_look_ahead (char const *);
-  #define USE(value)
-%}
-
-%union { char value; }
-%type <value> 'a' 'b'
-%glr-parser
-%locations
-
-%%
-
-start:
-  defstate_init defstate_shift 'b' change_lookahead 'a' {
-    USE ($3);
-    print_look_ahead ("start <- defstate_init defstate_shift 'b'");
-  }
-  ;
-defstate_init:
-  {
-    print_look_ahead ("defstate_init <- empty string");
-  }
-  ;
-defstate_shift:
-  nondefstate defstate_look 'a' {
-    USE ($3);
-    print_look_ahead ("defstate_shift <- nondefstate defstate_look 'a'");
-  }
-  ;
-defstate_look:
-  {
-    print_look_ahead ("defstate_look <- empty string");
-  }
-  ;
-nondefstate:
-  {
-    print_look_ahead ("nondefstate <- empty string");
-  }
-  | 'b' {
-    USE ($1);
-    print_look_ahead ("nondefstate <- 'b'");
-  }
-  ;
-change_lookahead:
-  {
-    yychar = 'a';
-  }
-  ;
-
-%%
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  static char const *input = "ab";
-  static int i = 0;
-  yylloc.first_line = yylloc.last_line = 1;
-  yylloc.first_column = yylloc.last_column = i + 1;
-  yylval.value = input[i] + 'A' - 'a';
-  return input[i++];
-}
-
-static void
-print_look_ahead (char const *reduction)
-{
-  printf ("%s:\n  yychar=", reduction);
-  if (yychar == YYEMPTY)
-    printf ("YYEMPTY");
-  else if (yychar == YYEOF)
-    printf ("YYEOF");
-  else
-    {
-      printf ("'%c', yylval='", yychar);
-      if (yylval.value > ' ')
-	printf ("%c", yylval.value);
-      printf ("', yylloc=(%d,%d),(%d,%d)",
-	      yylloc.first_line, yylloc.first_column,
-	      yylloc.last_line, yylloc.last_column);
-    }
-  printf ("\n");
-}
-
-int
-main (void)
-{
-  yychar = '#'; /* Not a token in the grammar.  */
-  yylval.value = '!';
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:1189: bison -o glr-regr13.c glr-regr13.y"
-echo glr-regression.at:1189 >$at_check_line_file
-( $at_traceon; bison -o glr-regr13.c glr-regr13.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1189: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:1190: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr13 glr-regr13.c \$LIBS"
-echo glr-regression.at:1190 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr13 glr-regr13.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1190: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:1203: ./glr-regr13"
-echo glr-regression.at:1203 >$at_check_line_file
-( $at_traceon; ./glr-regr13 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "defstate_init <- empty string:
-  yychar=YYEMPTY
-nondefstate <- empty string:
-  yychar='a', yylval='A', yylloc=(1,1),(1,1)
-defstate_look <- empty string:
-  yychar='a', yylval='A', yylloc=(1,1),(1,1)
-defstate_shift <- nondefstate defstate_look 'a':
-  yychar=YYEMPTY
-start <- defstate_init defstate_shift 'b':
-  yychar=YYEMPTY
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1203: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  155 ) # 155. glr-regression.at:1212: Incorrect lookahead during nondeterministic GLR
-    at_setup_line='glr-regression.at:1212'
-    at_desc='Incorrect lookahead during nondeterministic GLR'
-    $at_quiet $ECHO_N "155: Incorrect lookahead during nondeterministic GLR$ECHO_C"
-    at_xfail=no
-    (
-      echo "155. glr-regression.at:1212: testing ..."
-      $at_traceon
-
-
-cat >glr-regr14.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-/* Tests:
-     - Conflicting actions (split-off parse, which copies lookahead need,
-       which is necessarily yytrue) and nonconflicting actions (non-split-off
-       parse) for nondefaulted state: yychar != YYEMPTY.
-     - Merged deferred actions (lookahead need and RHS from different stack
-       than the target state) and nonmerged deferred actions (same stack).
-     - Defaulted state after lookahead: yychar != YYEMPTY.
-     - Defaulted state after shift: yychar == YYEMPTY.
-     - yychar != YYEMPTY but lookahead need is yyfalse (a previous stack has
-       seen the lookahead but current stack has not).
-     - Exceeding stack capacity (stack explosion), and thus reallocating
-       lookahead need array.
-   Note that it does not seem possible to see the initial yychar value during
-   nondeterministic operation since:
-     - In order to preserve the initial yychar, only defaulted states may be
-       entered.
-     - If only defaulted states are entered, there are no conflicts, so
-       nondeterministic operation does not start.  */
-
-%union { char value; }
-
-%{
-  #include <stdio.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  static void print_look_ahead (char const *);
-  static char merge (union YYSTYPE, union YYSTYPE);
-  #define USE(value)
-%}
-
-%type <value> 'a' 'b' 'c' 'd' stack_explosion
-%glr-parser
-%locations
-
-%%
-
-start:
-  merge 'c' stack_explosion {
-    USE ($2); USE ($3);
-    print_look_ahead ("start <- merge 'c' stack_explosion");
-  }
-  ;
-
-/* When merging the 2 deferred actions, the lookahead needs are different.  */
-merge:
-  nonconflict1 'a' 'b' nonconflict2 %dprec 1 {
-    USE ($2); USE ($3);
-    print_look_ahead ("merge <- nonconflict1 'a' 'b' nonconflict2");
-  }
-  | conflict defstate_look 'a' nonconflict2 'b' defstate_shift %dprec 2 {
-    USE ($3); USE ($5);
-    print_look_ahead ("merge <- conflict defstate_look 'a' nonconflict2 'b'"
-		      " defstate_shift");
-  }
-  ;
-
-nonconflict1:
-  {
-    print_look_ahead ("nonconflict1 <- empty string");
-  }
-  ;
-nonconflict2:
-  {
-    print_look_ahead ("nonconflict2 <- empty string");
-  }
-  | 'a' {
-    USE ($1);
-    print_look_ahead ("nonconflict2 <- 'a'");
-  }
-  ;
-conflict:
-  {
-    print_look_ahead ("conflict <- empty string");
-  }
-  ;
-defstate_look:
-  {
-    print_look_ahead ("defstate_look <- empty string");
-  }
-  ;
-
-/* yychar != YYEMPTY but lookahead need is yyfalse.  */
-defstate_shift:
-  {
-    print_look_ahead ("defstate_shift <- empty string");
-  }
-  ;
-
-stack_explosion:
-  { $$ = '\0'; }
-  | alt1 stack_explosion %merge<merge> { $$ = $2; }
-  | alt2 stack_explosion %merge<merge> { $$ = $2; }
-  | alt3 stack_explosion %merge<merge> { $$ = $2; }
-  ;
-alt1:
-  'd' no_look {
-    USE ($1);
-    if (yychar != 'd' && yychar != YYEOF)
-      {
-	fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
-      }
-  }
-  ;
-alt2:
-  'd' no_look {
-    USE ($1);
-    if (yychar != 'd' && yychar != YYEOF)
-      {
-	fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
-      }
-  }
-  ;
-alt3:
-  'd' no_look {
-    USE ($1);
-    if (yychar != 'd' && yychar != YYEOF)
-      {
-	fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
-      }
-  }
-  ;
-no_look:
-  {
-    if (yychar != YYEMPTY)
-      {
-	fprintf (stderr,
-		 "Found lookahead where shouldn't during stack explosion.\n");
-      }
-  }
-  ;
-
-%%
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  static char const *input = "abcdddd";
-  static int i = 0;
-  yylloc.first_line = yylloc.last_line = 1;
-  yylloc.first_column = yylloc.last_column = i + 1;
-  yylval.value = input[i] + 'A' - 'a';
-  return input[i++];
-}
-
-static void
-print_look_ahead (char const *reduction)
-{
-  printf ("%s:\n  yychar=", reduction);
-  if (yychar == YYEMPTY)
-    printf ("YYEMPTY");
-  else if (yychar == YYEOF)
-    printf ("YYEOF");
-  else
-    {
-      printf ("'%c', yylval='", yychar);
-      if (yylval.value > ' ')
-	printf ("%c", yylval.value);
-      printf ("', yylloc=(%d,%d),(%d,%d)",
-	      yylloc.first_line, yylloc.first_column,
-	      yylloc.last_line, yylloc.last_column);
-    }
-  printf ("\n");
-}
-
-static char
-merge (union YYSTYPE s1, union YYSTYPE s2)
-{
-  char dummy = s1.value + s2.value;
-  return dummy;
-}
-
-int
-main (void)
-{
-  yychar = '#'; /* Not a token in the grammar.  */
-  yylval.value = '!';
-  return yyparse ();
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:1404: bison -o glr-regr14.c glr-regr14.y"
-echo glr-regression.at:1404 >$at_check_line_file
-( $at_traceon; bison -o glr-regr14.c glr-regr14.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr14.y: conflicts: 3 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1404: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:1405: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr14 glr-regr14.c \$LIBS"
-echo glr-regression.at:1405 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr14 glr-regr14.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1405: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:1420: ./glr-regr14"
-echo glr-regression.at:1420 >$at_check_line_file
-( $at_traceon; ./glr-regr14 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-$at_diff $at_devnull $at_stderr || at_failed=:
-echo >>$at_stdout; echo "conflict <- empty string:
-  yychar='a', yylval='A', yylloc=(1,1),(1,1)
-defstate_look <- empty string:
-  yychar='a', yylval='A', yylloc=(1,1),(1,1)
-nonconflict2 <- empty string:
-  yychar='b', yylval='B', yylloc=(1,2),(1,2)
-defstate_shift <- empty string:
-  yychar=YYEMPTY
-merge <- conflict defstate_look 'a' nonconflict2 'b' defstate_shift:
-  yychar=YYEMPTY
-start <- merge 'c' stack_explosion:
-  yychar=YYEOF
-" | $at_diff - $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1420: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  156 ) # 156. glr-regression.at:1429: Leaked semantic values when reporting ambiguity
-    at_setup_line='glr-regression.at:1429'
-    at_desc='Leaked semantic values when reporting ambiguity'
-    $at_quiet $ECHO_N "156: Leaked semantic values when reporting ambiguity$ECHO_C"
-    at_xfail=no
-    (
-      echo "156. glr-regression.at:1429: testing ..."
-      $at_traceon
-
-
-cat >glr-regr15.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-%glr-parser
-%destructor { parent_rhs_before_value = 0; } parent_rhs_before
-
-%{
-# include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  static int parent_rhs_before_value = 0;
-# define USE(val)
-%}
-
-%%
-
-start:
-  alt1 %dprec 1
-  | alt2 %dprec 2
-  ;
-
-/* This stack must be merged into the other stacks *last* (added at the
-   beginning of the semantic options list) so that yyparse will choose to clean
-   it up rather than the tree for which some semantic actions have been
-   performed.  Thus, if yyreportAmbiguity longjmp's to yyparse, the values from
-   those other trees are not cleaned up.  */
-alt1: ;
-
-alt2:
-  parent_rhs_before ambiguity {
-    USE ($1);
-    parent_rhs_before_value = 0;
-  }
-  ;
-
-parent_rhs_before:
-  {
-    USE ($$);
-    parent_rhs_before_value = 1;
-  }
-  ;
-
-ambiguity: ambiguity1 | ambiguity2 ;
-ambiguity1: ;
-ambiguity2: ;
-
-%%
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  return 0;
-}
-
-int
-main (void)
-{
-  int exit_status = yyparse () != 1;
-  if (parent_rhs_before_value)
-    {
-      fprintf (stderr, "`parent_rhs_before' destructor not called.\n");
-      exit_status = 1;
-    }
-  return exit_status;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:1505: bison -o glr-regr15.c glr-regr15.y"
-echo glr-regression.at:1505 >$at_check_line_file
-( $at_traceon; bison -o glr-regr15.c glr-regr15.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr15.y: conflicts: 2 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1505: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:1506: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr15 glr-regr15.c \$LIBS"
-echo glr-regression.at:1506 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr15 glr-regr15.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1506: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:1510: ./glr-regr15"
-echo glr-regression.at:1510 >$at_check_line_file
-( $at_traceon; ./glr-regr15 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax is ambiguous
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1510: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  157 ) # 157. glr-regression.at:1519: Leaked lookahead after nondeterministic parse syntax error
-    at_setup_line='glr-regression.at:1519'
-    at_desc='Leaked lookahead after nondeterministic parse syntax error'
-    $at_quiet $ECHO_N "157: Leaked lookahead after nondeterministic parse syntax error$ECHO_C"
-    at_xfail=no
-    (
-      echo "157. glr-regression.at:1519: testing ..."
-      $at_traceon
-
-cat >glr-regr16.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-%glr-parser
-%destructor { lookahead_value = 0; } 'b'
-
-%{
-# include <stdlib.h>
-  static void yyerror (char const *);
-  static int yylex (void);
-  static int lookahead_value = 0;
-# define USE(val)
-%}
-
-%%
-
-start: alt1 'a' | alt2 'a' ;
-alt1: ;
-alt2: ;
-
-%%
-
-static void
-yyerror (char const *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  static char const *input = "ab";
-  if (*input == 'b')
-    lookahead_value = 1;
-  return *input++;
-}
-
-int
-main (void)
-{
-  int exit_status = yyparse () != 1;
-  if (lookahead_value)
-    {
-      fprintf (stderr, "Lookahead destructor not called.\n");
-      exit_status = 1;
-    }
-  return exit_status;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:1571: bison -o glr-regr16.c glr-regr16.y"
-echo glr-regression.at:1571 >$at_check_line_file
-( $at_traceon; bison -o glr-regr16.c glr-regr16.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr16.y: conflicts: 1 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1571: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:1572: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr16 glr-regr16.c \$LIBS"
-echo glr-regression.at:1572 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr16 glr-regr16.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1572: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:1576: ./glr-regr16"
-echo glr-regression.at:1576 >$at_check_line_file
-( $at_traceon; ./glr-regr16 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "syntax error
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1576: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-  158 ) # 158. glr-regression.at:1585: Uninitialized location when reporting ambiguity
-    at_setup_line='glr-regression.at:1585'
-    at_desc='Uninitialized location when reporting ambiguity'
-    $at_quiet $ECHO_N "158: Uninitialized location when reporting ambiguity$ECHO_C"
-    at_xfail=no
-    (
-      echo "158. glr-regression.at:1585: testing ..."
-      $at_traceon
-
-cat >glr-regr17.y <<'_ATEOF'
-%{
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-  /* We don't need perfect functions for these tests. */
-# undef malloc
-# undef memcmp
-# undef realloc
-#endif
-%}
-
-
-%glr-parser
-%locations
-%pure-parser
-%error-verbose
-
-%union { int dummy; }
-
-%{
-  static void yyerror (YYLTYPE *, char const *);
-  static int yylex (YYSTYPE *, YYLTYPE *);
-%}
-
-%initial-action {
-  @$.first_line = 1;
-  @$.first_column = 1;
-  @$.last_line = 1;
-  @$.last_column = 1;
-}
-
-%%
-
-/* Tests the case of an empty RHS that has inherited the location of the
-   previous nonterminal, which is unresolved.  That location is reported as the
-   last position of the ambiguity.  */
-start: ambig1 empty1 | ambig2 empty2 ;
-
-/* Tests multiple levels of yyresolveLocations recursion.  */
-ambig1: sub_ambig1 | sub_ambig2 ;
-ambig2: sub_ambig1 | sub_ambig2 ;
-
-/* Tests the case of a non-empty RHS as well as the case of an empty RHS that
-   has inherited the initial location.  The empty RHS's location is reported as
-   the first position in the ambiguity.  */
-sub_ambig1: empty1 'a' 'b' ;
-sub_ambig2: empty2 'a' 'b' ;
-empty1: ;
-empty2: ;
-
-%%
-
-static void
-yyerror (YYLTYPE *locp, char const *msg)
-{
-  fprintf (stderr, "Error at %d.%d-%d.%d: %s.\n", locp->first_line,
-	   locp->first_column, locp->last_line, locp->last_column, msg);
-}
-
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
-{
-  static char const input[] = "ab";
-  static char const *inputp = input;
-  lvalp->dummy = 0;
-  llocp->first_line = llocp->last_line = 2;
-  llocp->first_column = inputp - input + 1;
-  llocp->last_column = llocp->first_column + 1;
-  return *inputp++;
-}
-
-int
-main (void)
-{
-  return yyparse () != 1;
-}
-_ATEOF
-
-
-
-$at_traceoff
-echo "glr-regression.at:1656: bison -o glr-regr17.c glr-regr17.y"
-echo glr-regression.at:1656 >$at_check_line_file
-( $at_traceon; bison -o glr-regr17.c glr-regr17.y ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "glr-regr17.y: conflicts: 3 reduce/reduce
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1656: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-$at_traceoff
-echo "glr-regression.at:1657: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS -o glr-regr17 glr-regr17.c \$LIBS"
-echo glr-regression.at:1657 >$at_check_line_file
-( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS -o glr-regr17 glr-regr17.c $LIBS ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo stderr:; cat $at_stderr
-echo stdout:; cat $at_stdout
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1657: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-$at_traceoff
-echo "glr-regression.at:1661: ./glr-regr17"
-echo glr-regression.at:1661 >$at_check_line_file
-( $at_traceon; ./glr-regr17 ) >$at_stdout 2>$at_stder1
-at_status=$?
-grep '^ *+' $at_stder1 >&2
-grep -v '^ *+' $at_stder1 >$at_stderr
-at_failed=false
-echo >>$at_stderr; echo "Error at 1.1-2.3: syntax is ambiguous.
-" | $at_diff - $at_stderr || at_failed=:
-$at_diff $at_devnull $at_stdout || at_failed=:
-case $at_status in
-   77) echo 77 > $at_status_file
-            exit 77;;
-   0) ;;
-   *) echo "glr-regression.at:1661: exit code was $at_status, expected 0"
-      at_failed=:;;
-esac
-if $at_failed; then
-
-  echo 1 > $at_status_file
-  exit 1
-fi
-
-$at_traceon
-
-
-      $at_traceoff
-      $at_times_p && times >$at_times_file
-    ) 5>&1 2>&1 | eval $at_tee_pipe
-    at_status=`cat $at_status_file`
-    ;;
-
-
-  * )
-    echo "$as_me: no such test group: $at_group" >&2
-    continue
-    ;;
-  esac
-
-  # Be sure to come back to the suite directory, in particular
-  # since below we might `rm' the group directory we are in currently.
-  cd $at_suite_dir
-
-  case $at_group in
-    banner-*) ;;
-    *)
-      if test ! -f $at_check_line_file; then
-	sed "s/^ */$as_me: warning: /" <<_ATEOF
-	A failure happened in a test group before any test could be
-	run. This means that test suite is improperly designed.  Please
-	report this failure to <bug-bison@gnu.org>.
-_ATEOF
-    	echo "$at_setup_line" >$at_check_line_file
-      fi
-      at_group_count=`expr 1 + $at_group_count`
-      $at_verbose $ECHO_N "$at_group. $at_setup_line: $ECHO_C"
-      echo $ECHO_N "$at_group. $at_setup_line: $ECHO_C" >> $at_group_log
-      case $at_xfail:$at_status in
-	yes:0)
-	    at_msg="UNEXPECTED PASS"
-	    at_xpass_list="$at_xpass_list $at_group"
-	    at_errexit=$at_errexit_p
-	    ;;
-	no:0)
-	    at_msg="ok"
-	    at_pass_list="$at_pass_list $at_group"
-	    at_errexit=false
-	    ;;
-	*:77)
-	    at_msg="skipped (`cat $at_check_line_file`)"
-	    at_skip_list="$at_skip_list $at_group"
-	    at_errexit=false
-	    ;;
-	yes:*)
-	    at_msg="expected failure (`cat $at_check_line_file`)"
-	    at_xfail_list="$at_xfail_list $at_group"
-	    at_errexit=false
-	    ;;
-	no:*)
-	    at_msg="FAILED (`cat $at_check_line_file`)"
-	    at_fail_list="$at_fail_list $at_group"
-	    at_errexit=$at_errexit_p
-	    ;;
-      esac
-      echo $at_msg
-      at_log_msg="$at_group. $at_desc ($at_setup_line): $at_msg"
-      case $at_status in
-	0|77)
-	  # $at_times_file is only available if the group succeeded.
-	  # We're not including the group log, so the success message
-	  # is written in the global log separately.  But we also
-	  # write to the group log in case they're using -d.
-	  if test -f $at_times_file; then
-	    at_log_msg="$at_log_msg	(`sed 1d $at_times_file`)"
-	    rm -f $at_times_file
-          fi
-	  echo "$at_log_msg" >> $at_group_log
-	  echo "$at_log_msg" >&5
-
-	  # Cleanup the group directory, unless the user wants the files.
-	  $at_debug_p || rm -rf $at_group_dir
-	  ;;
-	*)
-	  # Upon failure, include the log into the testsuite's global
-	  # log.  The failure message is written in the group log.  It
-	  # is later included in the global log.
-	  echo "$at_log_msg" >> $at_group_log
-
-	  # Upon failure, keep the group directory for autopsy, and
-	  # create the debugging script.
-	  {
-	    echo "#! /bin/sh"
-	    echo 'test "${ZSH_VERSION+set}" = set && alias -g '\''${1+"$@"}'\''='\''"$@"'\'''
-	    echo "cd $at_dir"
-	    echo 'exec ${CONFIG_SHELL-'"$SHELL"'}' "$0" \
-	         '-v -d' "$at_debug_args" "$at_group" '${1+"$@"}'
-	    echo 'exit 1'
-	  } >$at_group_dir/run
-	  chmod +x $at_group_dir/run
-	  $at_errexit && break
-	  ;;
-      esac
-      ;;
-  esac
-done
-
-# Back to the top directory.
-cd $at_dir
-
-# Compute the duration of the suite.
-at_stop_date=`date`
-at_stop_time=`(date +%s) 2>/dev/null`
-echo "$as_me: ending at: $at_stop_date" >&5
-at_duration_s=`(expr $at_stop_time - $at_start_time) 2>/dev/null`
-at_duration_m=`(expr $at_duration_s / 60) 2>/dev/null`
-at_duration_h=`(expr $at_duration_m / 60) 2>/dev/null`
-at_duration_s=`(expr $at_duration_s % 60) 2>/dev/null`
-at_duration_m=`(expr $at_duration_m % 60) 2>/dev/null`
-at_duration="${at_duration_h}h ${at_duration_m}m ${at_duration_s}s"
-if test "$at_duration" != "h m s"; then
-  echo "$as_me: test suite duration: $at_duration" >&5
-fi
-
-# Wrap up the test suite with summary statistics.
-at_skip_count=`set dummy $at_skip_list; shift; echo $#`
-at_fail_count=`set dummy $at_fail_list; shift; echo $#`
-at_xpass_count=`set dummy $at_xpass_list; shift; echo $#`
-at_xfail_count=`set dummy $at_xfail_list; shift; echo $#`
-
-at_run_count=`expr $at_group_count - $at_skip_count`
-at_unexpected_count=`expr $at_xpass_count + $at_fail_count`
-at_total_fail_count=`expr $at_xfail_count + $at_fail_count`
-
-echo
-cat <<\_ASBOX
-## ------------- ##
-## Test results. ##
-## ------------- ##
-_ASBOX
-echo
-{
-  echo
-  cat <<\_ASBOX
-## ------------- ##
-## Test results. ##
-## ------------- ##
-_ASBOX
-  echo
-} >&5
-
-if test $at_run_count = 1; then
-  at_result="1 test"
-  at_were=was
-else
-  at_result="$at_run_count tests"
-  at_were=were
-fi
-if $at_errexit_p && test $at_unexpected_count != 0; then
-  if test $at_xpass_count = 1; then
-    at_result="$at_result $at_were run, one passed"
-  else
-    at_result="$at_result $at_were run, one failed"
-  fi
-  at_result="$at_result unexpectedly and inhibited subsequent tests."
-else
-  # Don't you just love exponential explosion of the number of cases?
-  case $at_xpass_count:$at_fail_count:$at_xfail_count in
-    # So far, so good.
-    0:0:0) at_result="$at_result $at_were successful." ;;
-    0:0:*) at_result="$at_result behaved as expected." ;;
-
-    # Some unexpected failures
-    0:*:0) at_result="$at_result $at_were run,
-$at_fail_count failed unexpectedly." ;;
-
-    # Some failures, both expected and unexpected
-    0:*:1) at_result="$at_result $at_were run,
-$at_total_fail_count failed ($at_xfail_count expected failure)." ;;
-    0:*:*) at_result="$at_result $at_were run,
-$at_total_fail_count failed ($at_xfail_count expected failures)." ;;
-
-    # No unexpected failures, but some xpasses
-    *:0:*) at_result="$at_result $at_were run,
-$at_xpass_count passed unexpectedly." ;;
-
-    # No expected failures, but failures and xpasses
-    *:1:0) at_result="$at_result $at_were run,
-$at_unexpected_count did not behave as expected ($at_fail_count unexpected failure)." ;;
-    *:*:0) at_result="$at_result $at_were run,
-$at_unexpected_count did not behave as expected ($at_fail_count unexpected failures)." ;;
-
-    # All of them.
-    *:*:1) at_result="$at_result $at_were run,
-$at_xpass_count passed unexpectedly,
-$at_total_fail_count failed ($at_xfail_count expected failure)." ;;
-    *:*:*) at_result="$at_result $at_were run,
-$at_xpass_count passed unexpectedly,
-$at_total_fail_count failed ($at_xfail_count expected failures)." ;;
-  esac
-
-  if test $at_skip_count = 0 && test $at_run_count -gt 1; then
-    at_result="All $at_result"
-  fi
-fi
-
-# Now put skips in the mix.
-case $at_skip_count in
-  0) ;;
-  1) at_result="$at_result
-1 test was skipped." ;;
-  *) at_result="$at_result
-$at_skip_count tests were skipped." ;;
-esac
-
-if test $at_unexpected_count = 0; then
-  echo "$at_result"
-  echo "$at_result" >&5
-else
-  echo "ERROR: $at_result" >&2
-  echo "ERROR: $at_result" >&5
-  {
-    echo
-    cat <<\_ASBOX
-## ------------------------ ##
-## Summary of the failures. ##
-## ------------------------ ##
-_ASBOX
-
-    # Summary of failed and skipped tests.
-    if test $at_fail_count != 0; then
-      echo "Failed tests:"
-      $SHELL $0 $at_fail_list --list
-      echo
-    fi
-    if test $at_skip_count != 0; then
-      echo "Skipped tests:"
-      $SHELL $0 $at_skip_list --list
-      echo
-    fi
-    if test $at_xpass_count != 0; then
-      echo "Unexpected passes:"
-      $SHELL $0 $at_xpass_list --list
-      echo
-    fi
-    if test $at_fail_count != 0; then
-      cat <<\_ASBOX
-## ---------------------- ##
-## Detailed failed tests. ##
-## ---------------------- ##
-_ASBOX
-      echo
-      for at_group in $at_fail_list
-      do
-        # Normalize the test group number.
-        at_group_normalized=`expr "00000$at_group" : ".*\($at_format\)"`
-        # Create a fresh directory for the next test group, and enter.
-        at_group_dir=$at_suite_dir/$at_group_normalized
-        at_group_log=$at_group_dir/$as_me.log
-        cat $at_group_log
-        echo
-      done
-      echo
-    fi
-    if test -n "$at_top_srcdir"; then
-      sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## $at_top_builddir/config.log ##
-_ASBOX
-      sed 's/^/| /' $at_top_builddir/config.log
-      echo
-    fi
-  } >&5
-
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## $as_me.log was created. ##
-_ASBOX
-
-  echo
-  echo "Please send \`$as_me.log' and all information you think might help:"
-  echo
-  echo "   To: <bug-bison@gnu.org>"
-  echo "   Subject: [GNU Bison 2.3] $as_me:$at_fail_list${at_fail_list:+ failed${at_xpass_list:+,}}$at_xpass_list${at_xpass_list:+ passed unexpectedly}"
-  echo
-  if test $at_debug_p = false; then
-    echo
-    echo 'You may investigate any problem if you feel able to do so, in which'
-    echo 'case the test suite provides a good starting point.'
-    echo
-  fi
-    exit 1
-fi
-
-exit 0
-
-
diff --git a/tests/testsuite.at b/tests/testsuite.at
deleted file mode 100644
index 10bb3d8..0000000
--- a/tests/testsuite.at
+++ /dev/null
@@ -1,66 +0,0 @@
-# Process this file with autom4te to create testsuite. -*- Autotest -*-
-
-# Test suite for GNU Bison.
-# Copyright (C) 2000, 2001, 2002, 2003, 2004 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.
-
-
-# Testing resistance to user bugs.
-m4_include([input.at])
-
-# Testing output file names.
-m4_include([output.at])
-
-# Testing the part of the engine that computes FOLLOW etc.
-m4_include([sets.at])
-
-# Testing grammar reduction.
-m4_include([reduce.at])
-
-# Testing that #lines are correct.
-m4_include([synclines.at])
-
-# Testing that headers are sane.
-m4_include([headers.at])
-
-# Testing that user actions are properly performed.
-m4_include([actions.at])
-
-# Testing conflicts detection and resolution.
-m4_include([conflicts.at])
-
-# Fulling testing (compilation and execution of the parser) on calc.
-m4_include([calc.at])
-
-# Huge artificial grammars.
-# Torturing the stack expansion at runtime.
-m4_include([torture.at])
-
-# Checking big, real world grammars.
-m4_include([existing.at])
-
-# Some old bugs.
-m4_include([regression.at])
-
-# Some C++ specific tests.
-m4_include([c++.at])
-
-# GLR tests:
-# C++ types, simplified
-m4_include([cxx-type.at])
-# Regression tests
-m4_include([glr-regression.at])
diff --git a/tests/torture.at b/tests/torture.at
deleted file mode 100644
index ff373c2..0000000
--- a/tests/torture.at
+++ /dev/null
@@ -1,483 +0,0 @@
-# Torturing Bison.                                    -*- Autotest -*-
-# Copyright (C) 2001, 2002, 2004, 2005 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.
-
-AT_BANNER([[Torture Tests.]])
-
-
-# AT_INCREASE_DATA_SIZE(SIZE)
-# ---------------------------
-# Try to increase the data size to SIZE KiB if possible.
-m4_define([AT_INCREASE_DATA_SIZE],
-[data_limit=`(ulimit -S -d) 2>/dev/null`
-case $data_limit in
-[[0-9]]*)
-  if test "$data_limit" -lt $1; then
-    AT_CHECK([ulimit -S -d $1 || exit 77])
-    ulimit -S -d $1
-  fi
-esac])
-
-
-## ------------------------------------- ##
-## Creating a large artificial grammar.  ##
-## ------------------------------------- ##
-
-# AT_DATA_TRIANGULAR_GRAMMAR(FILE-NAME, SIZE)
-# -------------------------------------------
-# Create FILE-NAME, containing a self checking parser for a huge
-# triangular grammar.
-m4_define([AT_DATA_TRIANGULAR_GRAMMAR],
-[AT_DATA([[gengram.pl]],
-[[#! /usr/bin/perl -w
-
-use strict;
-my $max = $ARGV[0] || 10;
-
-print <<EOF;
-]AT_DATA_GRAMMAR_PROLOGUE[
-%error-verbose
-%debug
-%{
-#include <stdio.h>
-#include <stdlib.h>
-
-static int yylex (void);
-static void yyerror (const char *msg);
-%}
-%union
-{
-  int val;
-};
-
-%token END "end"
-%type <val> exp input
-EOF
-
-for my $size (1 .. $max)
-  {
-    print "%token t$size $size \"$size\"\n";
-  };
-
-print <<EOF;
-%%
-input:
-  exp        { if (\@S|@1 != 0) abort (); \$\$ = \@S|@1; }
-| input exp  { if (\@S|@2 != \@S|@1 + 1) abort (); \$\$ = \@S|@2; }
-;
-
-exp:
-  END
-    { \$\$ = 0; }
-EOF
-
-for my $size (1 .. $max)
-  {
-    use Text::Wrap;
-    print wrap ("| ", "   ",
-		(map { "\"$_\"" } (1 .. $size)),
-		" END \n"),
-		  "    { \$\$ = $size; }\n";
-  };
-print ";\n";
-
-print <<EOF;
-%%
-static int
-yylex (void)
-{
-  static int inner = 1;
-  static int outer = 0;
-  if (outer > $max)
-    return 0;
-  else if (inner > outer)
-    {
-      inner = 1;
-      ++outer;
-      return END;
-    }
-  return inner++;
-}
-
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\\n", msg);
-}
-
-int
-main (void)
-{
-  yydebug = !!getenv ("YYDEBUG");
-  return yyparse ();
-}
-EOF
-]])
-
-AT_CHECK([perl -w ./gengram.pl $2 || exit 77], 0, [stdout])
-mv stdout $1
-])
-
-
-## -------------- ##
-## Big triangle.  ##
-## -------------- ##
-
-AT_SETUP([Big triangle])
-
-# I have been able to go up to 2000 on my machine.
-# I tried 3000, a 29Mb grammar file, but then my system killed bison.
-# With 500 and the new parser, which consume far too much memory,
-# it gets killed too.  Of course the parser is to be cleaned.
-AT_DATA_TRIANGULAR_GRAMMAR([input.y], [200])
-AT_CHECK([bison -v -o input.c input.y])
-AT_COMPILE([input])
-AT_PARSER_CHECK([./input])
-
-AT_CLEANUP
-
-
-
-# AT_DATA_HORIZONTAL_GRAMMAR(FILE-NAME, SIZE)
-# -------------------------------------------
-# Create FILE-NAME, containing a self checking parser for a huge
-# horizontal grammar.
-m4_define([AT_DATA_HORIZONTAL_GRAMMAR],
-[AT_DATA([[gengram.pl]],
-[[#! /usr/bin/perl -w
-
-use strict;
-my $max = $ARGV[0] || 10;
-
-print <<EOF;
-]AT_DATA_GRAMMAR_PROLOGUE[
-%error-verbose
-%debug
-%{
-#include <stdio.h>
-#include <stdlib.h>
-
-static int yylex (void);
-static void yyerror (const char *msg);
-%}
-
-%token
-EOF
-for my $size (1 .. $max)
-  {
-    print "    t$size $size \"$size\"\n";
-  };
-
-print <<EOF;
-
-%%
-EOF
-
-use Text::Wrap;
-print
-  wrap ("exp: ", "  ",
-	(map { "\"$_\"" } (1 .. $max)), ";"),
-  "\n";
-
-print <<EOF;
-%%
-static int
-yylex (void)
-{
-  static int counter = 1;
-  if (counter > $max)
-    return 0;
-  else
-  return counter++;
-}
-
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\\n", msg);
-}
-
-int
-main (void)
-{
-  yydebug = !!getenv ("YYDEBUG");
-  return yyparse ();
-}
-EOF
-]])
-
-AT_CHECK([perl -w ./gengram.pl $2 || exit 77], 0, [stdout])
-mv stdout $1
-])
-
-
-## ---------------- ##
-## Big horizontal.  ##
-## ---------------- ##
-
-AT_SETUP([Big horizontal])
-
-# I have been able to go up to 10000 on my machine, but I had to
-# increase the maximum stack size (* 100).  It gave:
-#
-# input.y      263k
-# input.tab.c  1.3M
-# input        453k
-#
-# gengram.pl 10000                 0.70s user 0.01s sys  99% cpu    0.711 total
-# bison input.y                  730.56s user 0.53s sys  99% cpu 12:12.34 total
-# gcc -Wall input.tab.c -o input   5.81s user 0.20s sys 100% cpu     6.01 total
-# ./input                          0.00s user 0.01s sys 108% cpu     0.01 total
-#
-AT_DATA_HORIZONTAL_GRAMMAR([input.y], [1000])
-
-# GNU m4 requires about 70 MiB for this test on a 32-bit host.
-# Ask for 200 MiB, which should be plenty even on a 64-bit host.
-AT_INCREASE_DATA_SIZE(204000)
-
-AT_CHECK([bison -v -o input.c input.y])
-AT_COMPILE([input])
-AT_PARSER_CHECK([./input])
-
-AT_CLEANUP
-
-
-
-# AT_DATA_LOOK_AHEAD_TOKENS_GRAMMAR(FILE-NAME, SIZE)
-# --------------------------------------------------
-# Create FILE-NAME, containing a self checking parser for a grammar
-# requiring SIZE look-ahead tokens.
-m4_define([AT_DATA_LOOK_AHEAD_TOKENS_GRAMMAR],
-[AT_DATA([[gengram.pl]],
-[[#! /usr/bin/perl -w
-
-use strict;
-use Text::Wrap;
-my $max = $ARGV[0] || 10;
-
-print <<EOF;
-%error-verbose
-%debug
-%{
-# include <stdio.h>
-# include <stdlib.h>
-# include <assert.h>
-
-static int yylex (void);
-static void yyerror (const char *msg);
-%}
-%union
-{
-  int val;
-};
-
-%type <val> input exp
-%token token
-EOF
-
-print
-  wrap ("%type <val> ",
-	"            ",
-	map { "n$_" } (1 .. $max)),
-  "\n";
-
-print "%token\n";
-for my $count (1 .. $max)
-  {
-    print "    t$count $count \"$count\"\n";
-  };
-
-print <<EOF;
-%%
-input:
-  exp        { assert (\@S|@1 == 1); \$\$ = \@S|@1; }
-| input exp  { assert (\@S|@2 == \@S|@1 + 1); \$\$ = \@S|@2; }
-;
-
-exp:
-  n1 "1" { assert (\@S|@1 == 1); \@S|@\@S|@ = \@S|@1; }
-EOF
-
-for my $count (2 .. $max)
-  {
-    print "| n$count \"$count\" { assert (\@S|@1 == $count); \@S|@\@S|@ = \@S|@1; }\n";
-  };
-print ";\n";
-
-for my $count (1 .. $max)
-  {
-    print "n$count: token { \$\$ = $count; };\n";
-  };
-
-print <<EOF;
-%%
-static int
-yylex (void)
-{
-  static int return_token = 1;
-  static int counter = 1;
-  if (counter > $max)
-    return 0;
-  if (return_token)
-    {
-      return_token = 0;
-      return token;
-    }
-  return_token = 1;
-  return counter++;
-}
-
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\\n", msg);
-}
-
-int
-main (void)
-{
-  yydebug = !!getenv ("YYDEBUG");
-  return yyparse ();
-}
-EOF
-]])
-
-AT_CHECK([perl -w ./gengram.pl $2 || exit 77], 0, [stdout])
-mv stdout $1
-])
-
-
-## ------------------------ ##
-## Many look-ahead tokens.  ##
-## ------------------------ ##
-
-AT_SETUP([Many look-ahead tokens])
-
-AT_DATA_LOOK_AHEAD_TOKENS_GRAMMAR([input.y], [1000])
-
-# GNU m4 requires about 70 MiB for this test on a 32-bit host.
-# Ask for 200 MiB, which should be plenty even on a 64-bit host.
-AT_INCREASE_DATA_SIZE(204000)
-
-AT_CHECK([bison -v -o input.c input.y])
-AT_COMPILE([input])
-AT_PARSER_CHECK([./input])
-
-AT_CLEANUP
-
-
-
-# AT_DATA_STACK_TORTURE(C-PROLOGUE)
-# ---------------------------------
-# A parser specialized in torturing the stack size.
-m4_define([AT_DATA_STACK_TORTURE],
-[# A grammar of parens growing the stack thanks to right recursion.
-# exp:
-AT_DATA([input.y],
-[[%{
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-]$1[
-  static int yylex (void);
-  static void yyerror (const char *msg);
-%}
-%error-verbose
-%debug
-%token WAIT_FOR_EOF
-%%
-exp: WAIT_FOR_EOF exp | ;
-%%
-static void
-yyerror (const char *msg)
-{
-  fprintf (stderr, "%s\n", msg);
-}
-
-static int
-yylex (void)
-{
-  if (yylval--)
-    return WAIT_FOR_EOF;
-  else
-    return EOF;
-}
-
-int
-main (int argc, const char **argv)
-{
-  char *endp;
-  if (argc != 2)
-    abort ();
-  yylval = strtol (argv[1], &endp, 10);
-  if (! (argv[1] != endp
-	 && 0 <= yylval && yylval <= INT_MAX
-	 && errno != ERANGE))
-    abort ();
-  yydebug = 1;
-  return yyparse ();
-}
-]])
-AT_CHECK([bison -o input.c input.y])
-AT_COMPILE([input])
-])
-
-
-## -------------------------------------- ##
-## Exploding the Stack Size with Alloca.  ##
-## -------------------------------------- ##
-
-AT_SETUP([Exploding the Stack Size with Alloca])
-
-AT_DATA_STACK_TORTURE([[
-#if (defined __GNUC__ || defined __BUILTIN_VA_ARG_INCR \
-     || defined _AIX || defined _MSC_VER || defined _ALLOCA_H)
-# define YYSTACK_USE_ALLOCA 1
-#endif
-]])
-
-# Below the limit of 200.
-AT_PARSER_CHECK([./input 20], 0, [], [ignore])
-# Two enlargements: 2 * 2 * 200.
-AT_PARSER_CHECK([./input 900], 0, [], [ignore])
-# Fails: beyond the limit of 10,000 (which we don't reach anyway since we
-# multiply by two starting at 200 => 5120 is the last possible).
-AT_PARSER_CHECK([./input 10000], 2, [], [ignore])
-
-AT_CLEANUP
-
-
-
-
-## -------------------------------------- ##
-## Exploding the Stack Size with Malloc.  ##
-## -------------------------------------- ##
-
-AT_SETUP([Exploding the Stack Size with Malloc])
-
-AT_DATA_STACK_TORTURE([[#define YYSTACK_USE_ALLOCA 0]])
-
-# Below the limit of 200.
-AT_PARSER_CHECK([./input 20], 0, [], [ignore])
-# Two enlargements: 2 * 2 * 200.
-AT_PARSER_CHECK([./input 900], 0, [], [ignore])
-# Fails: beyond the limit of 10,000 (which we don't reach anyway since we
-# multiply by two starting at 200 => 5120 is the possible).
-AT_PARSER_CHECK([./input 10000], 2, [], [ignore])
-
-AT_CLEANUP
