diff options
author | Baptiste Daroussin <bapt@FreeBSD.org> | 2011-11-28 14:58:51 +0000 |
---|---|---|
committer | Baptiste Daroussin <bapt@FreeBSD.org> | 2011-11-28 14:58:51 +0000 |
commit | 6916e47018a8c6788dae5b227a259d86ccd41e52 (patch) | |
tree | 93011a9698a938afd35d12023fbf979584ed1463 | |
parent | 112e4e871cc4a49e5a8f41355bdf4cefe3bbb6bf (diff) |
import vanilla flex version 2.5.35vendor/flex/2.5.35
Reviewed by: cognet
Approved by: cognet
Notes
Notes:
svn path=/vendor/flex/dist/; revision=228072
svn path=/vendor/flex/2.5.35/; revision=228075; tag=vendor/flex/2.5.35
-rw-r--r-- | ABOUT-NLS | 625 | ||||
-rw-r--r-- | AUTHORS | 16 | ||||
-rw-r--r-- | COPYING | 42 | ||||
-rw-r--r-- | ChangeLog | 7439 | ||||
-rw-r--r-- | FlexLexer.h (renamed from usr.bin/lex/FlexLexer.h) | 93 | ||||
-rw-r--r-- | INSTALL | 236 | ||||
-rw-r--r-- | Makefile.am | 208 | ||||
-rw-r--r-- | Makefile.in | 1096 | ||||
-rw-r--r-- | NEWS | 488 | ||||
-rw-r--r-- | ONEWS (renamed from usr.bin/lex/NEWS) | 14 | ||||
-rw-r--r-- | README | 79 | ||||
-rw-r--r-- | README-alpha | 2 | ||||
-rw-r--r-- | README.cvs | 46 | ||||
-rw-r--r-- | THANKS | 53 | ||||
-rw-r--r-- | TODO | 101 | ||||
-rwxr-xr-x | autogen.sh | 32 | ||||
-rw-r--r-- | buf.c | 258 | ||||
-rw-r--r-- | ccl.c | 310 | ||||
-rwxr-xr-x | compile | 142 | ||||
-rw-r--r-- | conf.in | 197 | ||||
-rwxr-xr-x | config.guess | 1466 | ||||
-rwxr-xr-x | config.rpath | 548 | ||||
-rwxr-xr-x | config.sub | 1579 | ||||
-rwxr-xr-x | configure | 11131 | ||||
-rw-r--r-- | configure.in | 173 | ||||
-rwxr-xr-x | depcomp | 530 | ||||
-rw-r--r-- | dfa.c (renamed from usr.bin/lex/dfa.c) | 954 | ||||
-rw-r--r-- | doc/Makefile.am | 16 | ||||
-rw-r--r-- | doc/Makefile.in | 560 | ||||
-rw-r--r-- | doc/flex.1 | 165 | ||||
-rw-r--r-- | doc/flex.info | 282 | ||||
-rw-r--r-- | doc/flex.info-1 | 7683 | ||||
-rw-r--r-- | doc/flex.info-2 | bin | 0 -> 52175 bytes | |||
-rwxr-xr-x | doc/mdate-sh | 201 | ||||
-rw-r--r-- | doc/stamp-vti | 4 | ||||
-rw-r--r-- | ecs.c (renamed from usr.bin/lex/ecs.c) | 154 | ||||
-rw-r--r-- | filter.c | 427 | ||||
-rw-r--r-- | flex.skl | 3430 | ||||
-rw-r--r-- | flexdef.h (renamed from usr.bin/lex/flexdef.h) | 641 | ||||
-rw-r--r-- | flexint.h | 63 | ||||
-rw-r--r-- | gen.c | 2169 | ||||
-rw-r--r-- | gettext.h | 59 | ||||
-rwxr-xr-x | install-sh | 323 | ||||
-rw-r--r-- | libmain.c | 33 | ||||
-rw-r--r-- | libyywrap.c | 27 | ||||
-rw-r--r-- | m4/Makefile.am | 1 | ||||
-rw-r--r-- | m4/Makefile.in | 316 | ||||
-rw-r--r-- | main.c | 1857 | ||||
-rw-r--r-- | misc.c | 1095 | ||||
-rwxr-xr-x | missing | 360 | ||||
-rwxr-xr-x | mkinstalldirs | 111 | ||||
-rwxr-xr-x | mkskel.sh | 37 | ||||
-rw-r--r-- | nfa.c (renamed from usr.bin/lex/nfa.c) | 633 | ||||
-rw-r--r-- | options.c | 280 | ||||
-rw-r--r-- | options.h | 134 | ||||
-rw-r--r-- | parse.c | 2830 | ||||
-rw-r--r-- | parse.h | 139 | ||||
-rw-r--r-- | parse.y (renamed from usr.bin/lex/parse.y) | 458 | ||||
-rw-r--r-- | regex.c | 164 | ||||
-rw-r--r-- | scan.c | 5201 | ||||
-rw-r--r-- | scan.l | 1029 | ||||
-rw-r--r-- | scanflags.c | 66 | ||||
-rw-r--r-- | scanopt.c | 874 | ||||
-rw-r--r-- | scanopt.h | 132 | ||||
-rw-r--r-- | skel.c | 3713 | ||||
-rw-r--r-- | sym.c | 272 | ||||
-rw-r--r-- | tables.c | 497 | ||||
-rw-r--r-- | tables.h | 85 | ||||
-rw-r--r-- | tables_shared.c | 70 | ||||
-rw-r--r-- | tables_shared.h | 144 | ||||
-rw-r--r-- | tblcmp.c (renamed from usr.bin/lex/tblcmp.c) | 580 | ||||
-rw-r--r-- | usr.bin/lex/COPYING | 38 | ||||
-rw-r--r-- | usr.bin/lex/Makefile | 57 | ||||
-rw-r--r-- | usr.bin/lex/README | 60 | ||||
-rw-r--r-- | usr.bin/lex/ccl.c | 149 | ||||
-rw-r--r-- | usr.bin/lex/config.h | 26 | ||||
-rw-r--r-- | usr.bin/lex/flex.skl | 1541 | ||||
-rw-r--r-- | usr.bin/lex/gen.c | 1625 | ||||
-rw-r--r-- | usr.bin/lex/initscan.c | 3697 | ||||
-rw-r--r-- | usr.bin/lex/lex.1 | 4060 | ||||
-rw-r--r-- | usr.bin/lex/lib/Makefile | 20 | ||||
-rw-r--r-- | usr.bin/lex/lib/libmain.c | 15 | ||||
-rw-r--r-- | usr.bin/lex/lib/libyywrap.c | 8 | ||||
-rw-r--r-- | usr.bin/lex/main.c | 1177 | ||||
-rw-r--r-- | usr.bin/lex/misc.c | 886 | ||||
-rwxr-xr-x | usr.bin/lex/mkskel.sh | 16 | ||||
-rw-r--r-- | usr.bin/lex/scan.l | 710 | ||||
-rw-r--r-- | usr.bin/lex/skel.c | 1548 | ||||
-rw-r--r-- | usr.bin/lex/sym.c | 262 | ||||
-rw-r--r-- | usr.bin/lex/version.h | 1 | ||||
-rw-r--r-- | usr.bin/lex/yylex.c | 216 | ||||
-rw-r--r-- | version.h | 1 | ||||
-rw-r--r-- | yylex.c | 211 |
93 files changed, 63788 insertions, 17709 deletions
diff --git a/ABOUT-NLS b/ABOUT-NLS new file mode 100644 index 000000000000..47d5e39f0e1a --- /dev/null +++ b/ABOUT-NLS @@ -0,0 +1,625 @@ +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 new file mode 100644 index 000000000000..93b35287a263 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,16 @@ + +In 2001, Will Estes took over as maintainer of flex. + +John Millaway is a co-author of the current version of flex. He has +contributed a large number of new features, fixed a large number of +outstanding bugs and has made significant contributions to the flex +documentation. + +Aaron Stone has contributed several bug fixes to the flex codebase. + +Vern Paxson wrote flex with the help of many ideas and much +inspiration from Van Jacobson. Original version by Jef Poskanzer. + +The fast table representation is a partial implementation of a design +done by Van Jacobson. The implementation was done by Kevin Gong and +Vern Paxson. diff --git a/COPYING b/COPYING new file mode 100644 index 000000000000..684b011026dd --- /dev/null +++ b/COPYING @@ -0,0 +1,42 @@ +Flex carries the copyright used for BSD software, slightly modified +because it originated at the Lawrence Berkeley (not Livermore!) Laboratory, +which operates under a contract with the Department of Energy: + +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007 The Flex Project. + +Copyright (c) 1990, 1997 The Regents of the University of California. +All rights reserved. + +This code is derived from software contributed to Berkeley by +Vern Paxson. + +The United States Government has rights in this work pursuant +to contract no. DE-AC03-76SF00098 between the United States +Department of Energy and the University of California. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +Neither the name of the University nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. + +This basically says "do whatever you please with this software except +remove this notice or take advantage of the University's (or the flex +authors') name". + +Note that the "flex.skl" scanner skeleton carries no copyright notice. +You are free to do whatever you please with scanners generated using flex; +for them, you are not even bound by the above copyright. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 000000000000..6cf7e1c8a6dd --- /dev/null +++ b/ChangeLog @@ -0,0 +1,7439 @@ +2008-02-26 15:36 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: add date of release + +2008-02-15 07:37 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, parse.y: fix bug that prevented comments from working + properly + +2008-02-12 07:57 Will Estes <wlestes@users.sourceforge.net> + + * po/de.po: new de translation + +2008-02-10 06:08 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/vi.po: new vi translation + +2008-02-09 19:22 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/nl.po: new nl translation + +2008-02-09 14:59 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/pl.po: new pl translation + +2008-02-09 14:19 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/de.po, po/pt_BR.po: new de, pt_br translations + +2008-02-09 13:54 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, flex.skl: generate headers for all functions (resolves bug + #1628314) + +2008-02-09 10:49 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, flex.skl: change yy_size_t to be size_t (resolves bug + #1849812) + +2008-02-09 10:46 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: start work on version 2.5.35 + +2007-12-12 16:00 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: revert NEWS and configure.in to version + 2.5.34 + +2007-09-12 11:28 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: update version number to 2.5.35 + +2007-09-10 02:17 Aaron Stone <sodabrew@users.sourceforge.net> + + * tests/test-alloc-extra/scanner.l: Use %option extra-type. + +2007-09-10 02:16 Aaron Stone <sodabrew@users.sourceforge.net> + + * NEWS, flex.skl, flexdef.h, main.c, parse.y, scan.l, + doc/flex.texi: Introduce %option extra-type="your_type *" (resolves + bug #1744505). + +2007-08-15 08:28 Will Estes <wlestes@users.sourceforge.net> + + * po/nl.po: new nl translations from the translation project + +2007-06-28 16:28 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: change release date + +2007-06-27 21:59 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: adjustment for prefix classes; patch submitted by Petr + Machata <pmachata@redhat.com> + +2007-06-27 21:53 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: NEWS item for yy_init_extra + +2007-06-12 12:33 Aaron Stone <sodabrew@users.sourceforge.net> + + * doc/flex.texi: Docs and example for yylex_init_extra. + +2007-05-31 20:22 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-alloc-extra/.cvsignore: ignore OUTPUT file in + test-alloc-extra + +2007-05-31 20:21 Will Estes <wlestes@users.sourceforge.net> + + * tests/descriptions: add description of concatenated options test + +2007-05-31 16:20 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-alloc-extra/.cvsignore: add missing .cvsignore to + test-alloc-extra + +2007-05-31 02:21 Aaron Stone <sodabrew@users.sourceforge.net> + + * configure.in, flex.skl, gen.c, main.c: Changes to resolve SF bugs + 1568325 and 1563589. + +2007-05-31 02:09 Aaron Stone <sodabrew@users.sourceforge.net> + + * tests/: Makefile.am, descriptions, test-alloc-extra/Makefile.am, + test-alloc-extra/scanner.l, test-alloc-extra/test.input: Adding + test cases for yylex_init_extra. + +2007-05-12 11:27 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, tests/test-pthread/scanner.l: fixes to test-pthread + +2007-05-12 09:13 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: NEWS item for concatenated options + +2007-05-12 09:13 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, tests/Makefile.am, + tests/test-concatenated-options/.cvsignore, + tests/test-concatenated-options/Makefile.am: unit test to verify + concatenated options parsing + +2007-05-12 09:11 Will Estes <wlestes@users.sourceforge.net> + + * scanopt.c: parse multiple short concatenated options; patch + submitted by Petr Machata <pmachata@redhat.com + +2007-05-11 16:52 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: remove --force option from autogen.sh; much faster + without it + +2007-05-11 14:35 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.34 + +2007-05-08 00:23 Aaron Stone <sodabrew@users.sourceforge.net> + + * NEWS, flex.skl: Better checking after yyalloc/yyrealloc (resolves + bug #1595967) + +2007-05-01 08:10 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: change title of manual to 'Lexical Analysis with + Flex' + +2007-04-25 14:16 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: c++ memory leak plug + +2007-04-23 09:29 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: roll back c++ memory patch as it causes the test suite + no end of grief + +2007-04-23 08:42 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: fix function definitions for non-ANSI environments + (from Manoj Srivastava from Debian patchset) + +2007-04-23 08:37 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: fix c++ memory leak (from Manoj Srivastava from Debian + patchset) + +2007-04-23 06:59 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: fix parameter name in comment (patch from Manoj + Srivastava from the debian patchset + +2007-04-23 06:57 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: add a size_t cast (patch from Manoj Srivastava from the + debian patchset + +2007-04-16 17:06 Will Estes <wlestes@users.sourceforge.net> + + * tests/: test-extended/Makefile.am, test-quotes/Makefile.am: + cleanups to handle VPATH builds better; passifies make distcheck + +2007-04-16 16:42 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: drop using the \ in \ escaping as it throws pdf + generation for a loop + +2007-04-14 08:33 Will Estes <wlestes@users.sourceforge.net> + + * .cvsignore: add compile and *.tar.bz2 to .cvsignore + +2007-04-14 08:27 Will Estes <wlestes@users.sourceforge.net> + + * main.c: add call to setlocale for ctype as per debian patchset + +2007-04-14 08:25 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, NEWS: provide for a PIC version of libfl.a for + shared libraries using flex scanners + +2007-04-13 13:24 Will Estes <wlestes@users.sourceforge.net> + + * FlexLexer.h: annotate endifs since they're a bit far from their + opening #if statements + +2007-04-13 12:55 Will Estes <wlestes@users.sourceforge.net> + + * flexdef.h, parse.y: refactor and slightly redo alloca testing, + resolves bug #1675899 + +2007-04-13 12:50 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: overhaul configure.in: use octathorps for comments + so they're passed through m4 processing; better bracketing of m4 + arguments; retool checks as per suggestions from autoscan(1) + +2007-04-13 12:43 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: better handling of class that use the prefix + functionality; from submitted patch + +2007-04-13 12:32 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: fix skeleton for reentrant scanners + +2007-04-12 21:50 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: remove homegrown tags target; automake does that for + us + +2007-04-12 15:12 Will Estes <wlestes@users.sourceforge.net> + + * FlexLexer.h: declare some const where missing in c++ header file + +2007-04-12 15:12 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: fix skeleton for reentrant scanners, resolves bug + #1694318 + +2007-04-10 15:20 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: corrections to the manual as per suggestions from + flex-help@ + +2007-04-03 15:16 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: include author names in online versions of the + manual + +2007-04-03 15:07 Will Estes <wlestes@users.sourceforge.net> + + * COPYING: update copyright notice + +2007-04-03 14:54 Will Estes <wlestes@users.sourceforge.net> + + * AUTHORS: rearrange and update AUTHORS + +2007-03-29 11:45 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: note sf feature request 1658379 in NEWS + +2007-03-29 11:36 Will Estes <wlestes@users.sourceforge.net> + + * tools/cvsauthors: add sodabrew to cvsauthors file + +2007-03-29 11:25 Aaron Stone <sodabrew@users.sourceforge.net> + + * flex.skl: + SourceForge feature request #1658379: Expose YY_BUF_SIZE in the + header file. + +2007-03-07 16:50 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, filter.c, flex.skl: apply patches submitted by sodabrew + +2007-03-07 16:20 Will Estes <wlestes@users.sourceforge.net> + + * README.cvs: more changes describing building flex from cvs + +2007-03-07 16:16 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, README.cvs, README.cvs-snapshot: rename + README.cvs-snapshot to README.cvs + +2007-03-07 16:14 Will Estes <wlestes@users.sourceforge.net> + + * README.cvs-snapshot: update to explain where flex cvs lives + +2007-03-07 15:45 Will Estes <wlestes@users.sourceforge.net> + + * README, doc/flex.texi: correct how to submit bugs + +2007-02-16 10:38 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: clarify NEWS item re man page and pdf manual + +2007-02-14 12:03 Will Estes <wlestes@users.sourceforge.net> + + * po/Makevars: update bug address to point to flex-devel instead of + lex-help + +2007-02-13 12:54 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, doc/Makefile.am: make better use of AC_INIT; clean + up, simplify and make more robust the generation of the man page + +2007-02-13 12:08 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: remove option check-news from call to + AM_INIT_AUTOMAKE as gnits implies check-news + +2007-02-13 10:07 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, configure.in: move automake options from Makefile.am + to configure.in + +2007-02-13 10:04 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: restore --install option to autogen.sh since --force + does not imply --install + +2007-02-13 10:04 Will Estes <wlestes@users.sourceforge.net> + + * tools/cvsauthors: add john43 to cvsauthors file + +2007-02-13 09:50 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: call autoreconf with --force instead of --install + +2007-02-13 09:48 Will Estes <wlestes@users.sourceforge.net> + + * doc/.cvsignore: remove texinfo.tex from cvs tree + +2007-02-12 20:15 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: updates to NEWS file to reflect recent changes + +2007-02-12 20:14 Will Estes <wlestes@users.sourceforge.net> + + * doc/Makefile.am: add flex.pdf to EXTRA_DIST + +2007-02-12 19:45 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: remove flex.spec + +2007-02-12 19:44 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: remove maintainercleanfiles + +2007-02-01 15:56 Will Estes <wlestes@users.sourceforge.net> + + * doc/Makefile.am: more changes to build system to distribute man + page + +2007-02-01 12:10 Will Estes <wlestes@users.sourceforge.net> + + * doc/Makefile.am: add flex man page to distribution + +2007-02-01 12:09 Will Estes <wlestes@users.sourceforge.net> + + * .cvsignore, flex.spec.in: remove flex spec file + +2006-11-17 10:14 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-table-opts/Makefile.am: make test target depend on + test groupings, which in turn depend on building executables; + cygwin portability fix + +2006-11-10 16:00 Will Estes <wlestes@users.sourceforge.net> + + * tests/create-test: change create-test script to edit files in + place + +2006-11-09 15:14 Will Estes <wlestes@users.sourceforge.net> + + * tests/: test-array-nr/Makefile.am, test-array-r/Makefile.am, + test-basic-nr/Makefile.am, test-basic-r/Makefile.am, + test-bison-nr/Makefile.am, test-bison-yylloc/Makefile.am, + test-bison-yylval/Makefile.am, test-c++-basic/Makefile.am, + test-c++-multiple-scanners/Makefile.am, + test-c++-yywrap/Makefile.am, test-c-cpp-nr/Makefile.am, + test-c-cpp-r/Makefile.am, test-ccl/Makefile.am, + test-debug-nr/Makefile.am, test-debug-r/Makefile.am, + test-extended/Makefile.am, test-header-nr/Makefile.am, + test-header-r/Makefile.am, test-include-by-buffer/Makefile.am, + test-include-by-push/Makefile.am, + test-include-by-reentrant/Makefile.am, test-linedir-r/Makefile.am, + test-lineno-nr/Makefile.am, test-lineno-r/Makefile.am, + test-mem-nr/Makefile.am, test-mem-r/Makefile.am, + test-multiple-scanners-nr/Makefile.am, + test-multiple-scanners-r/Makefile.am, test-noansi-nr/Makefile.am, + test-noansi-r/Makefile.am, test-posix/Makefile.am, + test-posixly-correct/Makefile.am, test-prefix-nr/Makefile.am, + test-prefix-r/Makefile.am, test-pthread/Makefile.am, + test-quotes/Makefile.am, test-reject/Makefile.am, + test-rescan-nr/Makefile.am, test-rescan-r/Makefile.am, + test-string-nr/Makefile.am, test-string-r/Makefile.am, + test-top/Makefile.am, test-yyextra/Makefile.am: change CLEANFILES + to include instead of just the testname for the executable + +2006-11-09 09:44 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: fix typos in manual; resolves bug #1592857 + +2006-11-09 09:39 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am: change test template to remove test + executable when that executable has an extension, e.g. under Cygwin + +2006-11-08 10:28 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.am: test names weren't displaying in test + success/failure messages (from #1591672 + +2006-10-30 15:28 Will Estes <wlestes@users.sourceforge.net> + + * doc/.cvsignore: add flex.html to .cvsignore in doc directory + +2006-10-22 18:42 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: update NEWS file for the work that millaway did + +2006-10-22 18:17 Will Estes <wlestes@users.sourceforge.net> + + * FlexLexer.h, NEWS, main.c, + tests/test-c++-multiple-scanners/scanner-2.l: make yywrap work with + c++ scanners as per sf bug report + +2006-10-20 15:16 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl, tests/test-c++-multiple-scanners/main.cpp, + tests/test-c-cpp-nr/scanner.l, NEWS: memory leak issues in c++ + scanner + +2006-10-20 13:10 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, tests/Makefile.am, tests/descriptions, + tests/test-c++-yywrap/.cvsignore, + tests/test-c++-yywrap/Makefile.am, tests/test-c++-yywrap/scanner.l, + tests/test-c++-yywrap/test.input, NEWS: add unit test for c++ with + yywrap + +2006-10-20 12:08 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, tests/test-c++-basic/Makefile.am, + tests/test-linedir-r/Makefile.am: use configure-provided awk + variable for portability; add loadlibes variable to c++ test + +2006-10-17 09:41 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: add noyywrap option to example; use whitespace to + clarify example + +2006-08-02 10:43 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/ca.po, po/vi.po: new translations + +2006-04-11 12:54 John Millaway <john43@users.sourceforge.net> + + * tables.c: Casted away signedness to appease -Werror freaks. + +2006-03-28 15:47 John Millaway <john43@users.sourceforge.net> + + * ccl.c, flexdef.h, parse.y, scan.l, sym.c, doc/flex.texi, + tests/test-ccl/scanner.l, tests/test-ccl/test.input: Added ccl + union operator. Added test in test suite for ccl union operator. + Documented ccl union operator. Removed crufty ccl cache to prevent + parser problems. + +2006-03-28 12:56 John Millaway <john43@users.sourceforge.net> + + * scan.l, doc/flex.texi, tests/test-extended/scanner.l, + tests/test-extended/test.input: Extended syntax excluded for + lex/posix compat mode. Comments discarded inside (?x:) patterns. + Added test in test suite for comments in extended patterns. + Documented syntax additions. + +2006-03-27 17:48 John Millaway <john43@users.sourceforge.net> + + * scan.l, tests/test-ccl/scanner.l, tests/test-ccl/test.input: + Implemented (?x:) syntax to allow whitespace in patterns. Added + test for (?x:) syntax in test suite. + +2006-03-27 17:04 John Millaway <john43@users.sourceforge.net> + + * parse.y, tests/test-ccl/scanner.l, tests/test-ccl/test.input: + Implemented dot-all syntax. Added test for dot-all syntax in test + suite. + +2006-03-27 15:59 John Millaway <john43@users.sourceforge.net> + + * dfa.c, flexdef.h, gen.c, main.c, parse.y, scan.l, scanflags.c, + doc/flex.texi, tests/test-ccl/scanner.l, tests/test-ccl/test.input: + Removed global variable caseins. Added scanner stack flags for + case-insensitivity. Moved case-folding code from DFA-generation to + parse time read-macros. Added localized case-sensitivity syntax + from Perl. Added test for new syntax in test suite. Documented + new syntax. + +2006-03-27 14:00 John Millaway <john43@users.sourceforge.net> + + * Makefile.am, configure.in, flexdef.h, scanflags.c: Added + configure check for assert.h. Added scanner flags stack. + +2006-03-25 14:03 John Millaway <john43@users.sourceforge.net> + + * configure.in, scan.l, doc/flex.texi, tests/Makefile.am, + tests/descriptions, tests/test-extended/.cvsignore, + tests/test-extended/Makefile.am, tests/test-extended/scanner.l, + tests/test-extended/test.input: Added extended, perl-compatible + comment syntax. Added test for extended comment syntax. + Documented extended comment syntax. + +2006-03-25 12:57 John Millaway <john43@users.sourceforge.net> + + * parse.y, doc/flex.texi: Changed explicit 'A'-'Z' to isupper(), + where correct to do so. Documentation. + +2006-03-24 17:33 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Documentation. + +2006-03-24 13:57 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Added appendix of patterns to manual. + +2006-03-23 18:34 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: [no log message] + +2006-03-22 15:06 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Documentation. + +2006-03-22 15:03 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Documented set difference operator {-}. + +2006-03-22 14:06 John Millaway <john43@users.sourceforge.net> + + * ccl.c, flexdef.h, parse.y, scan.l, tests/test-ccl/scanner.l, + tests/test-ccl/test.input: Added set difference operator {-} for + character classes. + +2006-03-22 11:04 John Millaway <john43@users.sourceforge.net> + + * configure.in, parse.y, scan.l, doc/flex.texi, tests/Makefile.am, + tests/descriptions, tests/test-ccl/.cvsignore, + tests/test-ccl/Makefile.am, tests/test-ccl/scanner.l, + tests/test-ccl/test.input: Added negated character class + expressions. Documented negated character class expressions. + Added regression test for negated character class expressions. + +2006-03-22 07:49 John Millaway <john43@users.sourceforge.net> + + * buf.c, filter.c, gen.c, main.c, misc.c, nfa.c, parse.y, regex.c: + Replaced sprintf with snprintf everywhere. + +2006-03-21 19:15 John Millaway <john43@users.sourceforge.net> + + * Makefile.am: Removed includedir from AM_CPPFLAGS #1439351. + +2006-03-21 18:49 John Millaway <john43@users.sourceforge.net> + + * configure.in, tests/Makefile.am, tests/descriptions, + tests/test-quotes/.cvsignore, tests/test-quotes/Makefile.am, + tests/test-quotes/scanner.l, tests/test-quotes/test.input: Added + test to verify user code is unmangled. + +2006-03-21 16:39 John Millaway <john43@users.sourceforge.net> + + * flexdef.h, misc.c, scan.l: Fixed escape in actions. + +2006-03-21 16:22 John Millaway <john43@users.sourceforge.net> + + * filter.c, flexdef.h, main.c, scan.l: Reverted previous input + filter changes. Added noop macro to scanner output. Modified + scan.l to escape m4 quotes found in user code. + +2006-03-21 16:18 John Millaway <john43@users.sourceforge.net> + + * tests/test-table-opts/: Makefile.am, scanner.l: Removed m4 from + test-table-opts + +2006-03-21 15:58 John Millaway <john43@users.sourceforge.net> + + * tests/test-reject/: Makefile.am, scanner.l: Removed m4 from + test-reject + +2006-03-21 13:23 John Millaway <john43@users.sourceforge.net> + + * filter.c, flexdef.h, main.c, scan.l: Moved set_input_file to + different file. + +2006-03-20 21:17 John Millaway <john43@users.sourceforge.net> + + * flex.skl, flexdef.h, flexint.h, misc.c: Relaxed tests for + __STDC__ and __STDC_VERSION__ to cope with bugs in GCC and Sun cc. + +2006-03-19 20:50 John Millaway <john43@users.sourceforge.net> + + * filter.c: Documented filter chain. Removed fdopen. Added no-op + fseek. + +2006-03-13 16:21 John Millaway <john43@users.sourceforge.net> + + * gen.c: Fixed another -Wall report. + +2006-03-10 09:59 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/vi.po: new vi translation + +2006-03-09 08:45 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/ga.po, po/nl.po: new nl, ga translations + +2006-02-20 20:54 Will Estes <wlestes@users.sourceforge.net> + + * m4/Makefile.am: add po.m4 to extra_dist in m4/ so it gets picked + up by distributions + +2006-02-20 20:42 Will Estes <wlestes@users.sourceforge.net> + + * m4/Makefile.am: add nls.m4 to extra_dist in m4/ so it will get + picked up in distribution tarballs + +2006-02-20 20:10 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: remove website directory from configure.in + +2006-02-20 14:22 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.33 marks in NEWS and configure.in + +2006-02-20 13:21 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: change email address in configure.in to point to + flex-help@sourceforge.net + +2006-02-20 12:30 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Documentation. + +2006-02-20 12:17 John Millaway <john43@users.sourceforge.net> + + * BUGS: Appended to BUGS file. + +2006-02-18 14:09 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: remove website directory (since it now has its own + module in the flex project + +2006-02-16 17:20 John Millaway <john43@users.sourceforge.net> + + * flex.skl, doc/flex.texi: Fixed buffer overflow in reject state + buffer. Corrected documentation on the state buffer. + +2006-02-16 10:02 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Reverted num_read from size_t back to int. + +2006-02-15 18:58 John Millaway <john43@users.sourceforge.net> + + * Makefile.am, configure.in: Removed reference to RoadMap in + Makefile.am. Added website directory. + +2006-02-15 16:08 Will Estes <wlestes@users.sourceforge.net> + + * README, RoadMap: remove RoadMap and reference to it in README + +2006-02-15 13:35 John Millaway <john43@users.sourceforge.net> + + * BUGS, README, doc/flex.texi, doc/flex.xml: Eliminated references + to lex.sf.net. + +2006-02-15 13:31 John Millaway <john43@users.sourceforge.net> + + * BUGS, flex.skl: Transfered bugs list from lex.sf.net to BUGS + file. + +2006-02-15 13:11 John Millaway <john43@users.sourceforge.net> + + * tests/: test-rescan-nr/.cvsignore, test-rescan-nr/Makefile.am, + test-rescan-nr/scanner.l, test-rescan-nr/test.input, + test-rescan-r/.cvsignore, test-rescan-r/Makefile.am, + test-rescan-r/scanner.l, test-rescan-r/test.input: Recommit of last + commit -- broken pipe. + +2006-02-15 13:06 John Millaway <john43@users.sourceforge.net> + + * configure.in, flex.skl, tests/Makefile.am, tests/descriptions: + yy_lex_destroy calls yy_init_globals to reset everything for next + call to yylex. Added two new tests for reusing scanners. + +2006-02-14 15:28 John Millaway <john43@users.sourceforge.net> + + * flex.spec.in: Patched rpm spec file. + +2006-02-14 15:23 John Millaway <john43@users.sourceforge.net> + + * configure.in, flexint.h: Added C99 macro for inttypes, just to be + conformant. + +2006-02-14 14:38 John Millaway <john43@users.sourceforge.net> + + * flexdef.h, nfa.c, parse.y: Changed symbol INFINITE to fix + conflict with C math symbol. + +2006-02-14 14:28 John Millaway <john43@users.sourceforge.net> + + * scan.l: Omitting parens for named rules in trailing context. + +2006-02-14 13:55 John Millaway <john43@users.sourceforge.net> + + * configure.in, main.c, po/ca.po, po/da.po, po/de.po, po/es.po, + po/fr.po, po/ga.po, po/ko.po, po/nl.po, po/pl.po, po/pt_BR.po, + po/ro.po, po/ru.po, po/sv.po, po/tr.po, po/vi.po, po/zh_CN.po, + tests/test-mem-nr/scanner.l, tests/test-mem-r/scanner.l: Added + check for locale.h and libintl.h in configure script. + +2006-02-14 13:36 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Removed unused local vars. + +2006-02-14 13:25 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Removed certain offending #undefs. + +2006-02-14 13:07 John Millaway <john43@users.sourceforge.net> + + * flexint.h: Removed logical and from preprocessor statement. + +2006-02-14 06:40 Will Estes <wlestes@users.sourceforge.net> + + * po/: nl.po, nl.po.1: remove eroneously named nl.po.1; update + nl.po + +2006-02-14 01:38 John Millaway <john43@users.sourceforge.net> + + * dfa.c: [no log message] + +2006-02-14 00:27 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Included <sys/types.h> for serialized tables. + +2006-02-14 00:22 John Millaway <john43@users.sourceforge.net> + + * configure.in: Minor patch to call to head in configure script. + +2006-02-14 00:12 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Documentation patch. + +2006-02-13 22:32 John Millaway <john43@users.sourceforge.net> + + * filter.c, gen.c, libyywrap.c, main.c: Patch for full file system + failure. + +2006-02-13 16:45 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Documentation. + +2006-02-13 16:18 John Millaway <john43@users.sourceforge.net> + + * main.c: Fixed double-fclose when input file is empty. + +2006-02-10 18:17 Will Estes <wlestes@users.sourceforge.net> + + * po/: ca.po, da.po, de.po, es.po, fr.po, ga.po, ko.po, nl.po.1, + pl.po, pt_BR.po, ro.po, ru.po, sv.po, tr.po, vi.po, zh_CN.po: + newtranslations + +2005-12-21 19:24 John Millaway <john43@users.sourceforge.net> + + * buf.c, main.c: Improvement request 1069716 log vs. log10 + +2005-12-21 19:16 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Fixed bug 1257093 yy_init_globals in header file + +2005-04-14 16:45 Will Estes <wlestes@users.sourceforge.net> + + * po/nl.po: new nl translation + +2005-04-07 08:49 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/LINGUAS, po/nl.po, po/vi.po: new nl and vi translations + +2004-07-20 16:32 Will Estes <wlestes@users.sourceforge.net> + + * filter.c: correct improper stdin assignment + +2004-05-22 18:42 Will Estes <wlestes@users.sourceforge.net> + + * po/tr.po, NEWS: new tr translation + +2004-05-11 20:44 Will Estes <wlestes@users.sourceforge.net> + + * .indent.pro, .cvsignore: .cvsignore and .indent.pro got missed + in the import to sourceforge; replace them + +2004-05-11 09:28 Will Estes <wlestes@users.sourceforge.net> + + * po/fr.po: new fr translation + +2004-05-03 10:52 Will Estes <wlestes@users.sourceforge.net> + + * po/LINGUAS: polish is pl, not po + +2004-03-22 08:10 Will Estes <wlestes@users.sourceforge.net> + + * po/sv.po: yet another sweedish update + +2004-03-19 09:27 Will Estes <wlestes@users.sourceforge.net> + + * po/sv.po, NEWS: new sv translation + +2003-12-10 20:43 John Millaway <millaway@acm.org> + + * configure.in, filter.c, main.c: Configure checks for GNU m4. + Environment variable M4 overrides built-in m4 path. Generated m4 + does a late check for GNU m4. + +2003-12-08 21:17 John Millaway <millaway@acm.org> + + * doc/flex.texi: added 3 faqs + +2003-11-24 08:12 Will Estes <wlestes@users.sourceforge.net> + + * po/ro.po: new ro translation + +2003-11-07 13:38 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/fr.po: new french translation + +2003-11-07 08:57 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/ca.po: new catalan translation from the translation + project + +2003-11-07 08:50 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/LINGUAS, po/ga.po, po/pl.po: new polish translation; + updated irish translation from translation project + +2003-10-10 08:47 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/LINGUAS, po/ga.po: new Irish translation + +2003-08-25 07:57 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/LINGUAS, po/ro.po: add romanian translation + +2003-07-16 11:05 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: flex_*int* type fixes + +2003-07-16 10:45 Will Estes <wlestes@users.sourceforge.net> + + * tools/cvsauthors: change wlestes email address + +2003-07-16 10:43 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: undef yytext_ptr has some bad side effects + +2003-07-07 13:32 John Millaway <millaway@acm.org> + + * doc/flex.texi: Documented m4 incompatibility with lex. + +2003-05-21 13:57 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: upgrade to gettext 0.12 + +2003-05-20 16:25 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl, gen.c: patches from manoj via sourceforge + +2003-05-20 16:09 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, po/.cvsignore, po/Makevars: upgrade gettext to + 0.12; this allows running make pdf and make ps to be successful + +2003-05-20 13:41 Will Estes <wlestes@users.sourceforge.net> + + * doc/.cvsignore: cvs should ignore flex.pdf and flex.ps + +2003-04-25 15:45 John Millaway <millaway@acm.org> + + * TODO: Added yylineno bugs to TODO list. + +2003-04-02 20:01 John Millaway <millaway@acm.org> + + * doc/flex.xml: Docbook. + +2003-04-02 19:22 John Millaway <millaway@acm.org> + + * doc/flex.xml: xml now validates. + +2003-04-02 18:20 John Millaway <millaway@acm.org> + + * doc/flex.xml: Began conversion to DocBook. + +2003-04-01 11:17 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.31 + +2003-04-01 11:14 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: remove --enable-maintainer-mode configure option + +2003-04-01 11:08 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: remove AM_MAINTAINER_MODE + +2003-03-31 20:51 John Millaway <millaway@acm.org> + + * flex.skl, flexdef.h, main.c, misc.c, scan.l: Renamed some + internal variables. + +2003-03-31 08:21 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: yylineno is now per-buffer in reentrant scanners + +2003-03-30 21:04 John Millaway <millaway@acm.org> + + * TODO: Added TODO item. + +2003-03-30 14:58 John Millaway <millaway@acm.org> + + * flex.skl, gen.c: yylineno is per-buffer in the reentrant scanner. + support for yycolumn exists, but is not yet developed. + +2003-03-28 16:08 John Millaway <millaway@acm.org> + + * flex.skl: Minor documentation. + +2003-03-28 09:17 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: added %top directive + +2003-03-27 13:02 John Millaway <millaway@acm.org> + + * buf.c, configure.in, flexdef.h, main.c, scan.l, doc/flex.texi, + tests/Makefile.am, tests/descriptions, tests/test-top/.cvsignore, + tests/test-top/Makefile.am, tests/test-top/main.c, + tests/test-top/scanner.l, tests/test-top/test.input: Added %top + block syntax. Added test for %top block. Documented %top block. + +2003-03-26 23:02 John Millaway <millaway@acm.org> + + * TODO, doc/flex.texi: Documented the m4 dependency. + +2003-03-26 16:43 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, flexdef.h: check for sys/wait.h since we use + wait(2) + +2003-03-26 16:35 Will Estes <wlestes@users.sourceforge.net> + + * flexdef.h: reorder include directives so as to catch system + integer types before flex defined values for same + +2003-03-26 14:19 Will Estes <wlestes@users.sourceforge.net> + + * TODO: assign tasks due before major release can happen; remove + --enable-maintainer-mode entry + +2003-03-26 14:15 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: only rebuild the ChangeLog if we're inside a cvs + working directory + +2003-03-26 14:05 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, tools/.cvsignore, tools/Makefile.am: add tools/ + subdirectory to distribution + +2003-03-26 14:05 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: remove maintainer_mode conditional; add filter.c and + regex.c to indentfiles; reformat and sort indentfiles so it's + easier to add files in the future + +2003-03-26 14:04 Will Estes <wlestes@users.sourceforge.net> + + * doc/Makefile.am: clean up flex.texi processing leftovers with + cleanfiles + +2003-03-26 13:29 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-linedir-r/Makefile.am: an awk script wasn't included + in the distribution + +2003-03-26 11:52 John Millaway <millaway@acm.org> + + * TODO, configure.in, tests/Makefile.am, tests/descriptions, + tests/test-include-by-push/.cvsignore, + tests/test-include-by-push/Makefile.am, + tests/test-include-by-push/scanner.l, + tests/test-include-by-push/test-1.input, + tests/test-include-by-push/test-2.input, + tests/test-include-by-push/test-3.input: Added test for + yypush_buffer_state and yypop_buffer_state. + +2003-03-25 22:27 John Millaway <millaway@acm.org> + + * TODO: Removed items from TODO list. + +2003-03-25 22:26 John Millaway <millaway@acm.org> + + * configure.in, tests/Makefile.am, tests/descriptions, + tests/test-linedir-r/.cvsignore, tests/test-linedir-r/Makefile.am, + tests/test-linedir-r/check-lines.awk, tests/test-linedir-r/main.c, + tests/test-linedir-r/scanner.l, tests/test-linedir-r/test.input: + Added test for #line directives. + +2003-03-25 20:37 John Millaway <millaway@acm.org> + + * configure.in, tests/Makefile.am, tests/test-noansi-nr/.cvsignore, + tests/test-noansi-nr/Makefile.am, tests/test-noansi-nr/scanner.l, + tests/test-noansi-nr/test.input, tests/test-noansi-r/.cvsignore, + tests/test-noansi-r/Makefile.am, tests/test-noansi-r/scanner.l, + tests/test-noansi-r/test.input: Added test for noansi (traditional) + options. Reordered the tests so the basic ones are first. + +2003-03-25 15:51 Will Estes <wlestes@users.sourceforge.net> + + * TODO, doc/Makefile.am: remove maintainer-mode conditional around + rebuilding of manpage + +2003-03-25 15:45 Will Estes <wlestes@users.sourceforge.net> + + * README: mention doc/ for user documentation + +2003-03-25 15:45 Will Estes <wlestes@users.sourceforge.net> + + * TODO: rework distribution items + +2003-03-25 15:45 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: mention m4 processing + +2003-03-25 15:44 Will Estes <wlestes@users.sourceforge.net> + + * tests/README: update instructions for running test suite + +2003-03-25 11:39 Will Estes <wlestes@users.sourceforge.net> + + * FlexLexer.h, Makefile.am, TODO, buf.c, configure.in, filter.c, + flex.skl, flexdef.h, gen.c, main.c, misc.c, options.c, options.h, + regex.c, scan.l, sym.c, doc/flex.texi, + tests/test-bison-nr/scanner.l, tests/test-bison-yylloc/scanner.l, + tests/test-reject/scanner.l, tests/test-table-opts/scanner.l: merge + millaway's m4 branch work + +2003-03-20 15:10 Will Estes <wlestes@users.sourceforge.net> + + * TODO: we want to move the contents of to.do/Wishlist to top level + TODO + +2003-03-20 13:09 John Millaway <millaway@acm.org> + + * to.do/Wish-List: Assessment of every item in Wish-List. + +2003-03-17 04:57 John Millaway <millaway@acm.org> + + * regex.c: file regex.c was initially added on branch m4. + +2003-03-10 15:00 John Millaway <millaway@acm.org> + + * filter.c: file filter.c was initially added on branch m4. + +2003-03-05 14:52 Will Estes <wlestes@users.sourceforge.net> + + * texinfo.tex, doc/.cvsignore: move texinfo.tex to doc/ + +2003-03-05 14:37 Will Estes <wlestes@users.sourceforge.net> + + * TODO: update TODO + +2003-03-05 14:37 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.29 + +2003-03-04 18:43 John Millaway <millaway@acm.org> + + * FlexLexer.h, flex.skl: Added growable buffer stack to C++ scanner + as well. yyensure_buffer_stack is now static. + +2003-03-01 20:45 John Millaway <millaway@acm.org> + + * flex.skl, misc.c: Removed awkward %push %pop syntax from + skeleton. + +2003-03-01 19:34 John Millaway <millaway@acm.org> + + * flex.skl: Renamed YY_CURRENT_BUFFER_FAST to + YY_CURRENT_BUFFER_LVALUE to better reflect its purpose. + +2003-02-28 15:19 John Millaway <millaway@acm.org> + + * NEWS: made entry on input buffer stacks. + +2003-02-28 09:23 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, doc/Makefile.am: build on . in top level first; this + will simplify calling help2man + +2003-02-28 06:27 John Millaway <millaway@acm.org> + + * TODO, flex.skl, gen.c, main.c, doc/flex.texi: Removed + yy_current_buffer from the planet. Input buffer states are now in + an internal unbounded stack. Added new internal function, + yyensure_buffer_stack. Added new API function, + yypush_buffer_state. Added new API function, yypop_buffer_state. + Documented the new API calls in the manual. Macro YY_BUFFER_STATE + now refers to top of stack. This revision breaks the C++ scanner + (again.) + +2003-02-28 04:02 John Millaway <millaway@acm.org> + + * main.c: Removed some symbols from the undef list. They are needed + for multiple headers to coexist. + +2003-02-27 10:37 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, NEWS, configure.in, flex.texi, doc/.cvsignore, + doc/Makefile.am, doc/flex.texi: move flex.texi and flex.1 to new + doc/ subdirectory + +2003-02-27 09:44 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: namespace cleanups + +2003-02-26 18:23 John Millaway <millaway@acm.org> + + * main.c: Added a few macros to the undef list. + +2003-02-26 18:17 John Millaway <millaway@acm.org> + + * main.c: Put the undef macros in an array. + +2003-02-12 16:54 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.28 + +2003-02-10 09:11 Will Estes <wlestes@users.sourceforge.net> + + * README, TODO, configure.in, flex.texi: update documentation to + reflect the sourceforge move + +2003-02-06 16:00 Will Estes <wlestes@users.sourceforge.net> + + * TODO: update according to current thinking + +2003-02-06 15:12 Will Estes <wlestes@users.sourceforge.net> + + * TODO: mcvs reviewed + +2003-02-06 09:06 Will Estes <wlestes@users.sourceforge.net> + + * TODO: sourceforge migration tasks + +2003-02-04 09:10 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: Flex now warns if always-interactive is specified with fast + or full; Fixed trailing slash bug in YY_INPUT macro def + +2003-01-31 17:30 John Millaway <millaway@acm.org> + + * scan.l: Flex now warns if always-interactive is specified with + fast or full. + +2003-01-31 12:37 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: switch to using cvs2cl.pl to generate the ChangeLog + +2003-01-31 12:12 Will Estes <wlestes@users.sourceforge.net> + + * tools/: cvs2cl.pl, cvsauthors: we're going to be switching how we + handle our ChangeLog + +2003-01-29 15:16 John Millaway <millaway@acm.org> + + * gen.c, misc.c: Fixed trailing slash bug in YY_INPUT macro def. + +2003-01-29 13:09 Will Estes <wlestes@users.sourceforge.net> + + * README.cvs-snapshot: upgrade texinfo to 4.3d + +2003-01-29 13:07 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: the @copying construct works now; thanks to the + texinfo maintainers for finding the problem + +2003-01-21 08:33 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.27 + +2003-01-21 08:32 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: flex now works with recent bison versions + +2003-01-18 13:54 John Millaway <millaway@acm.org> + + * flex.skl: Check for YYLTYPE_IS_DECLARED. This fixes bison-bridge + with latest bison. + +2003-01-15 08:33 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/pt_BR.po: new pt_br translation + +2003-01-14 10:51 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.26 + +2003-01-14 09:12 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: Fixed table deserialization bug on big-endian archs. Patch + sent from Bryce Nichols <bryce@bnichols.org> + +2003-01-11 22:30 John Millaway <millaway@acm.org> + + * tables_shared.h: Fixed table deserialization bug on big-endian + archs. Patch sent from Bryce Nichols <bryce@bnichols.org>. + +2003-01-10 09:05 Will Estes <wlestes@users.sourceforge.net> + + * README.cvs-snapshot: add version numbers for some tools and + explain about version.texi and --enable-maintainer-mode + +2003-01-10 08:59 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: catch news up + +2003-01-09 18:06 John Millaway <millaway@acm.org> + + * tests/: test-mem-nr/scanner.l, test-mem-r/scanner.l: Changed + size_t to yy_size_t in yyalloc() and yyrealloc(). Is this really + what we want? + +2003-01-09 17:20 John Millaway <millaway@acm.org> + + * flex.skl: Changed type of yyleng from size_t to int. This fixes + bug in PostgreSQL compilation. + +2003-01-09 11:15 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: catch news up + +2003-01-09 11:15 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: more c++ fixes + +2003-01-09 10:43 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, configure.in, flex.spec.in: add a spec file + +2003-01-09 10:25 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: type cast to pacify c++ compilers; patch from Bruce + Lilly <blilly@erols.com> + +2003-01-08 12:58 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: new es translation + +2003-01-08 12:57 Will Estes <wlestes@users.sourceforge.net> + + * po/es.po: new spanish translation + +2002-12-18 22:17 John Millaway <millaway@acm.org> + + * gen.c: Fixed bug where YY_G(0) sometimes occurs (created by my + previous commit.) + +2002-12-17 18:53 John Millaway <millaway@acm.org> + + * gen.c: Fixed bug submitted by Bojan Smojver <bojan@rexursive.com> + where the use of yylineno, reentrant, and yymore together caused a + compile-time error. + +2002-12-17 16:57 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: update NEWS + +2002-12-17 15:28 John Millaway <millaway@acm.org> + + * flex.texi: Documented new behavior with character ranges. + +2002-12-16 18:33 John Millaway <millaway@acm.org> + + * parse.y: Fixed bug submitted by Bruce Lilly <blilly@erols.com> + where character ranges would yield unexpected behavior in a + caseless scanner. Also, flex now emits a warning if the range + looks like trouble. + +2002-12-16 18:28 John Millaway <millaway@acm.org> + + * flexdef.h, ccl.c: Added utility functions to deal with character + case. + +2002-12-09 09:14 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: we don't really need int64 anyway + +2002-12-09 09:13 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: apparently some lints are happier with fllthrough + without a space + +2002-12-02 15:50 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.25 + +2002-12-02 15:48 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: enclose flex.1 target in MAINTERNER_MODE + +2002-12-02 08:39 Will Estes <wlestes@users.sourceforge.net> + + * po/pt_BR.po: new pt_br translation + +2002-12-01 13:31 John Millaway <millaway@acm.org> + + * flex.texi: Indexed some more faqs. + +2002-11-28 22:34 John Millaway <millaway@acm.org> + + * flex.skl: Fixed bug in SECOND yyless definition where argument + was not enclosed in parentheses. + +2002-11-28 22:29 John Millaway <millaway@acm.org> + + * flex.skl: Fixed bug in yyless definition where argument was not + enclosed in parentheses. + +2002-11-27 13:42 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: flex uses flex_int*_t types + +2002-11-27 13:41 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: integer types for non-C99 systems flexint.h + +2002-11-27 09:43 John Millaway <millaway@acm.org> + + * dfa.c, flexint.h, gen.c, tables.c, tables.h, tables_shared.c, + tables_shared.h: Changed int types to flex_intX_t. The build is now + broken until typedef's are established. + +2002-11-27 09:05 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: MAINTAINERCLEANFILES: new variable: try to make it + so that make maintainer-clean erases everything not under version + control + +2002-11-27 08:53 Will Estes <wlestes@users.sourceforge.net> + + * config.rpath: remove config.rpath + +2002-11-27 08:52 Will Estes <wlestes@users.sourceforge.net> + + * README-alpha: just list location of betas + +2002-11-26 09:46 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: __STDC_VERSION__ needs an L suffix + +2002-11-26 08:22 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/LINGUAS, po/pt_BR.po: new pt_br translation from the + translation project + +2002-11-25 11:19 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: include inttypes.h for folks who really are C99 + +2002-11-25 09:17 Will Estes <wlestes@users.sourceforge.net> + + * TODO: fix a typo + +2002-11-25 08:53 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.24 + +2002-11-23 12:59 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: try to make sure we have GNU m4 + +2002-11-23 12:56 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-c++-multiple-scanners/Makefile.am: include + tests/test-c++-multipl-scanners/test.input + +2002-11-23 12:28 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: more portability fixes + +2002-11-23 11:50 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, flexdef.h: apparently on some BSD systems, we need + sys/params.h; reported by millaway + +2002-11-22 16:04 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: update NEWS + +2002-11-22 15:38 John Millaway <millaway@acm.org> + + * flex.skl, main.c, tests/test-c++-multiple-scanners/Makefile.am: + Fixed prefix of yyalloc,yyfree,yyrealloc in C++ scanner. Removed + yylex_destroy from C++ scanner. + +2002-11-22 15:05 John Millaway <millaway@acm.org> + + * flex.texi: renamed some faqs. + +2002-11-22 08:20 Will Estes <wlestes@users.sourceforge.net> + + * AUTHORS: update wording about authorship + +2002-11-17 17:17 John Millaway <millaway@acm.org> + + * parse.y: Removed space before line num in error messages to look + more like gcc's errors. + +2002-11-06 10:16 Will Estes <wlestes@users.sourceforge.net> + + * po/tr.po, NEWS: new turkish translation from the translation + project + +2002-10-28 07:21 Will Estes <wlestes@users.sourceforge.net> + + * gen.c: applied c++ from lilypond folks for std:: reasons + +2002-10-25 15:18 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: proofreading + +2002-10-24 16:07 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: proofreading + +2002-10-22 10:28 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: use c-style header names in c++ for now; at some point + we'll have a separate c++ skeleton and we can go whole-hog pure c++ + +2002-10-22 10:01 Will Estes <wlestes@users.sourceforge.net> + + * TODO: c++ rants + +2002-10-22 09:37 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: more proofreading + +2002-10-22 09:37 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: include intent.pro; indent target is MAINTAINER_MODE + conditional + +2002-10-22 08:32 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: When we use AC_PATH_PROG, value-if-not-found is the + name of the program we wanted to find; this will generate more + helpful error messages + +2002-10-21 19:52 John Millaway <millaway@acm.org> + + * tables.c: Added a missing function prototype. + +2002-10-21 13:30 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.23 + +2002-10-21 13:27 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: update NEWS on recent changes + +2002-10-21 13:21 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: use sys/types.h and not inttypes.h + +2002-10-21 13:20 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: check for limits.h + +2002-10-21 13:19 Will Estes <wlestes@users.sourceforge.net> + + * TODO: update TODO on recent suggestions + +2002-10-21 11:28 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: titlepage and contents + +2002-10-21 10:45 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: typo + +2002-10-21 10:27 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, README.cvs-snapshot: include README.cvs-snapshot in + the distribution; in README-cvs-snapshot, mention the need for + enable-maintainer-mode + +2002-10-20 22:26 John Millaway <millaway@acm.org> + + * flex.texi: typo. + +2002-10-18 11:25 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: report the current version info that flex provides; + reformat a list of non-posix features + +2002-10-18 11:25 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: report the current version info that flex provides + +2002-10-18 11:23 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: FLEX_BETA defined if flex is beta + +2002-10-16 09:15 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: if we're doing c++, then we can't use long long + +2002-10-14 11:33 Will Estes <wlestes@users.sourceforge.net> + + * TODO: update TODO on several things + +2002-10-11 16:40 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: more proofreading + +2002-10-11 11:26 Will Estes <wlestes@users.sourceforge.net> + + * tests/: TEMPLATE/Makefile.am, test-array-nr/Makefile.am, + test-array-r/Makefile.am, test-basic-nr/Makefile.am, + test-basic-r/Makefile.am, test-bison-nr/Makefile.am, + test-bison-yylloc/Makefile.am, test-bison-yylval/Makefile.am, + test-c++-basic/Makefile.am, test-c++-multiple-scanners/Makefile.am, + test-c-cpp-nr/Makefile.am, test-c-cpp-r/Makefile.am, + test-debug-nr/Makefile.am, test-debug-r/Makefile.am, + test-header-nr/Makefile.am, test-header-r/Makefile.am, + test-include-by-buffer/Makefile.am, + test-include-by-reentrant/Makefile.am, test-lineno-nr/Makefile.am, + test-lineno-r/Makefile.am, test-mem-nr/Makefile.am, + test-mem-r/Makefile.am, test-multiple-scanners-nr/Makefile.am, + test-multiple-scanners-r/Makefile.am, test-posix/Makefile.am, + test-posixly-correct/Makefile.am, test-prefix-nr/Makefile.am, + test-prefix-r/Makefile.am, test-pthread/Makefile.am, + test-reject/Makefile.am, test-string-nr/Makefile.am, + test-string-r/Makefile.am, test-table-opts/Makefile.am, + test-yyextra/Makefile.am: remove BISON assignment as per suggestion + from Akim Demaille + +2002-10-11 11:04 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, configure.in: remove intl from dist + +2002-10-11 10:33 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: we use maintainer mode now + +2002-10-11 10:33 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: include create-test + +2002-10-11 10:23 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.am: rename test to check-local as per Akim + Demaille; test for failed tests so that make check fails if any + tests do + +2002-10-11 08:46 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.am: use dist_noinst_scripts as per email from Akim + Demaille + +2002-10-10 17:42 John Millaway <millaway@acm.org> + + * flex.texi: Documentation. + +2002-10-10 15:54 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.22; portability fixes and attn to + the test suite + +2002-10-10 15:36 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: ok, this seems to work + +2002-10-10 15:12 Will Estes <wlestes@users.sourceforge.net> + + * tests/: TEMPLATE/Makefile.am, test-bison-nr/Makefile.am, + test-bison-yylloc/Makefile.am, test-bison-yylval/Makefile.am, + test-header-nr/Makefile.am, test-header-r/Makefile.am, + test-multiple-scanners-nr/Makefile.am, + test-multiple-scanners-r/Makefile.am: use builddir in tests that + need it in their include path + +2002-10-10 14:13 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am: sometimes we put header files in the + builddir and so we should account for that + +2002-10-10 14:08 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am: replace the last instance + +2002-10-10 13:02 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: include unistd.h and not cunistd as cunistd only seems + to be present on very recent systems + +2002-10-10 11:34 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, configure.in, flex.skl, flexdef.h, flexint.h: redo + integral types again; add flexint.h; change dependencies caused by + adding flexint.h; remove autoconf wrapper around cunistd; restore + netinet/in.h includes; remove unneded feature checks in + configure.in + +2002-10-08 11:32 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, flex.skl, flexdef.h: current swipe at header magic; + int types be damned + +2002-10-08 11:19 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: change version constant info to reflect change to flex.skl + +2002-10-08 11:15 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: remove README-alpha option; add definitions for + FLEX_{MAJOR,MINOR,SUBMINOR}_VERSION + +2002-10-07 11:29 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl, flexdef.h: ok, here goes; try to handle integral + typedefs in one swell foop + +2002-10-07 11:28 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: we check for {u,}int*_t types; maybe this will + simplify things + +2002-10-07 09:12 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: we create the tests/TEMPLATE/Makefile so that we + can build the dist archives + +2002-10-07 08:38 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: more test suite cleanups + +2002-10-07 08:37 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-c++-multiple-scanners/Makefile.am: we don't use header + files... + +2002-10-07 08:26 Will Estes <wlestes@users.sourceforge.net> + + * flexdef.h: remove include of malloc.h + +2002-10-04 15:33 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: more editing; remove examples index; merge examples + into concept index + +2002-10-04 08:36 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: edited one more faq; used C-u C-c C-u C-a to update + menus and nodes since the other updating commands are somewhat + broken; unfortunately this means that all nodes have all pointers + filled in + +2002-10-04 08:19 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: yesterday's proofreading + +2002-10-02 16:07 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: proofread some more + +2002-10-02 08:38 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: proofread edit begins + +2002-10-01 11:10 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, tests/Makefile.am, + tests/test-c++-multiple-scanners/.cvsignore, + tests/test-c++-multiple-scanners/Makefile.am, + tests/test-c++-multiple-scanners/main.cpp, + tests/test-c++-multiple-scanners/scanner-1.l, + tests/test-c++-multiple-scanners/scanner-2.l, + tests/test-c++-multiple-scanners/test.input: test c++ with multiple + scanners + +2002-09-27 16:58 Will Estes <wlestes@users.sourceforge.net> + + * tests/: test-array-nr/Makefile.am, test-array-r/Makefile.am, + test-basic-nr/Makefile.am, test-basic-r/Makefile.am, + test-bison-nr/Makefile.am, test-bison-yylloc/Makefile.am, + test-bison-yylval/Makefile.am, test-c++-basic/Makefile.am, + test-c-cpp-nr/Makefile.am, test-c-cpp-r/Makefile.am, + test-debug-nr/Makefile.am, test-debug-r/Makefile.am, + test-header-nr/Makefile.am, test-header-r/Makefile.am, + test-include-by-buffer/Makefile.am, + test-include-by-reentrant/Makefile.am, test-lineno-nr/Makefile.am, + test-lineno-r/Makefile.am, test-mem-nr/Makefile.am, + test-mem-r/Makefile.am, test-multiple-scanners-nr/Makefile.am, + test-multiple-scanners-r/Makefile.am, test-posix/Makefile.am, + test-posixly-correct/Makefile.am, test-prefix-nr/Makefile.am, + test-prefix-r/Makefile.am, test-pthread/Makefile.am, + test-reject/Makefile.am, test-string-nr/Makefile.am, + test-string-r/Makefile.am, test-table-opts/Makefile.am, + test-yyextra/Makefile.am: we used INCLUDES in another place in the + Makefile.am files in the test suite + +2002-09-27 16:50 Will Estes <wlestes@users.sourceforge.net> + + * tests/: test-array-nr/Makefile.am, test-array-r/Makefile.am, + test-basic-nr/Makefile.am, test-basic-r/Makefile.am, + test-bison-nr/Makefile.am, test-bison-yylloc/Makefile.am, + test-bison-yylval/Makefile.am, test-c++-basic/Makefile.am, + test-c-cpp-nr/Makefile.am, test-c-cpp-r/Makefile.am, + test-debug-nr/Makefile.am, test-debug-r/Makefile.am, + test-header-nr/Makefile.am, test-header-r/Makefile.am, + test-include-by-buffer/Makefile.am, + test-include-by-reentrant/Makefile.am, test-lineno-nr/Makefile.am, + test-lineno-r/Makefile.am, test-mem-nr/Makefile.am, + test-mem-r/Makefile.am, test-multiple-scanners-nr/Makefile.am, + test-multiple-scanners-r/Makefile.am, test-posix/Makefile.am, + test-posixly-correct/Makefile.am, test-prefix-nr/Makefile.am, + test-prefix-r/Makefile.am, test-pthread/Makefile.am, + test-reject/Makefile.am, test-string-nr/Makefile.am, + test-string-r/Makefile.am, test-table-opts/Makefile.am, + test-yyextra/Makefile.am: oops, I typed that last s/// command to + perl way wrong + +2002-09-27 16:46 Will Estes <wlestes@users.sourceforge.net> + + * tests/: TEMPLATE/Makefile.am, test-array-nr/Makefile.am, + test-array-r/Makefile.am, test-basic-nr/Makefile.am, + test-basic-r/Makefile.am, test-bison-nr/Makefile.am, + test-bison-yylloc/Makefile.am, test-bison-yylval/Makefile.am, + test-c++-basic/Makefile.am, test-c-cpp-nr/Makefile.am, + test-c-cpp-r/Makefile.am, test-debug-nr/Makefile.am, + test-debug-r/Makefile.am, test-header-nr/Makefile.am, + test-header-r/Makefile.am, test-include-by-buffer/Makefile.am, + test-include-by-reentrant/Makefile.am, test-lineno-nr/Makefile.am, + test-lineno-r/Makefile.am, test-mem-nr/Makefile.am, + test-mem-r/Makefile.am, test-multiple-scanners-nr/Makefile.am, + test-multiple-scanners-r/Makefile.am, test-posix/Makefile.am, + test-posixly-correct/Makefile.am, test-prefix-nr/Makefile.am, + test-prefix-r/Makefile.am, test-pthread/Makefile.am, + test-reject/Makefile.am, test-string-nr/Makefile.am, + test-string-r/Makefile.am, test-table-opts/Makefile.am, + test-yyextra/Makefile.am: use AM_CPPFLAGS instead of INCLUDES; + write -I with no space after it for broken compilers + +2002-09-27 16:28 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: INCLUDES is obsolete; use AM_CPPFLAGS instead + +2002-09-27 13:02 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: apparently, AM_CONFIG_HEADER is obsolete + +2002-09-27 12:30 Will Estes <wlestes@users.sourceforge.net> + + * TODO: integrate test suite into automake + +2002-09-27 12:18 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: since we dont run the template test, we dont need + to generate its Makefile either + +2002-09-27 12:17 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: use autoreconf instead of calling individual + utilities separately + +2002-09-27 09:20 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: check for c++ compiler + +2002-09-27 09:20 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: re-organize according to suggested layout in + autoconf manual + +2002-09-26 08:54 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, NEWS, configure.in: update automake to 1.7 and + autoconf to 2.54 + +2002-09-26 08:48 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: use AM_YFLAGS since YFLAGS is a user variable + +2002-09-25 09:40 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: catch NEWS up on things, some of which happened a long time + ago; correct punctuation; try to remove some editorializing + +2002-09-25 09:39 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, flex.skl, flex.texi: include a single, automatically + generated version number in flex scanners + +2002-09-23 16:39 Will Estes <wlestes@users.sourceforge.net> + + * tests/create-test: complain audibly when argument not supplied; + echo on stderr when writing error messages + +2002-09-23 12:02 Will Estes <wlestes@users.sourceforge.net> + + * tests/: Makefile.am, create-test: DIST_SUBDIRS so we don't have + to run the TEMPLATE test; so we add new tests to SUBDIRS and + DIST_SUBDIRS + +2002-09-23 11:30 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am: not all compilers support '-I dir' so + we write '-Idir' instead + +2002-09-23 10:00 Will Estes <wlestes@users.sourceforge.net> + + * TODO: reorganize faq entries; proofread the manual + +2002-09-23 09:55 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: move c++ experimental warning to top of cxx node + +2002-09-20 13:17 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: move stdint.h include to table-serialization section; + we'll still need to think about stdint.h more though + +2002-09-20 08:30 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: new smarter skeleton/scanner generation + +2002-09-19 20:06 John Millaway <millaway@acm.org> + + * flex.skl, misc.c: bison-bridge skel handled via %if/%endif pairs. + +2002-09-19 19:57 John Millaway <millaway@acm.org> + + * flex.skl, misc.c: reentrant skel handled via %if/%endif pairs. + +2002-09-19 19:20 John Millaway <millaway@acm.org> + + * flex.skl, misc.c: skeleton uses %push/%pop to keep skelout() + scope sane. skel commands are omitted unless --debug enabled. + +2002-09-19 15:46 John Millaway <millaway@acm.org> + + * flex.skl, main.c, misc.c, tables.h: Added %push and %pop + operations to skel processing. + +2002-09-17 08:27 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: flex 2.5.21 + +2002-09-17 00:10 John Millaway <millaway@acm.org> + + * tests/test-reject/Makefile.am: minor fixup for dist. + +2002-09-16 16:26 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.20 + +2002-09-16 16:25 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: correct typo + +2002-09-16 15:59 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: note the new tables functionality + +2002-09-16 14:40 John Millaway <millaway@acm.org> + + * tests/test-multiple-scanners-r/: .cvsignore, Makefile.am: Fixed + `clean' target and .cvsignore. + +2002-09-16 14:38 John Millaway <millaway@acm.org> + + * TODO, flex.skl, flex.texi, main.c, tables_shared.h, + tests/test-multiple-scanners-r/main.c, + tests/test-multiple-scanners-r/scanner-1.l, + tests/test-multiple-scanners-r/scanner-2.l: Serialization works in + headers (%option headers). Serialization code (Tables API) is + complete. + +2002-09-16 08:41 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-reject/scanner.l: replace yytables_load with + yytables_fload as per millaway's other changes + +2002-09-15 19:13 John Millaway <millaway@acm.org> + + * TODO, flex.texi: Created user API for tables deserialization. + Documented API and --tables-* options in manual. + +2002-09-15 19:12 John Millaway <millaway@acm.org> + + * flex.skl, tests/test-table-opts/scanner.l: Tables deserialization + uses yyalloc/yyfree. Changed yytables_load to yytables_fload. + +2002-09-15 18:09 John Millaway <millaway@acm.org> + + * tests/test-bison-nr/.cvsignore: minor upkeep. + +2002-09-15 15:53 John Millaway <millaway@acm.org> + + * flex.texi: Categorized and indexed scanner options in manual. + +2002-09-15 12:47 John Millaway <millaway@acm.org> + + * flex.skl: Initialization of reject vars and %array vars in + reentrant scanner. + +2002-09-13 17:54 John Millaway <millaway@acm.org> + + * TODO, configure.in, dfa.c, flex.skl, flex.texi, gen.c, tables.c, + tables_shared.c, tables_shared.h, devel/tables.pl, + tests/Makefile.am, tests/test-reject/.cvsignore, + tests/test-reject/Makefile.am, tests/test-reject/scanner.l, + tests/test-reject/test.input, tests/test-table-opts/Makefile.am: + Created test for reject. Handled reject-triggered tables in + serialization. + +2002-09-13 08:28 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: millaway has been very busy + +2002-09-13 03:12 John Millaway <millaway@acm.org> + + * flex.skl, tests/test-table-opts/Makefile.am, + tests/test-table-opts/scanner.l: Added test for multiple tables in + one file. + +2002-09-12 21:19 John Millaway <millaway@acm.org> + + * tests/test-bison-nr/.cvsignore: forgot to add .cvsignore on last + commit. + +2002-09-12 21:18 John Millaway <millaway@acm.org> + + * tests/test-bison-nr/: Makefile.am, main.c, parser.y, scanner.l, + test.input: Added test-bison-bridge. + +2002-09-12 21:17 John Millaway <millaway@acm.org> + + * configure.in, flex.skl, flex.texi, flexdef.h, gen.c, main.c, + misc.c, options.c, options.h, scan.l, tables.h, tests/Makefile.am, + tests/descriptions, tests/test-bison-yylloc/scanner.l, + tests/test-bison-yylval/scanner.l, tests/test-table-opts/scanner.l: + Bison bridge code now works for all C scanners and pure/non-pure + bison parsers. Added %option bison-bridge (--bison-bridge). + Removed %option reentrant-bison/--reentrant-bison/-Rb. Scanner + knows the name of its tables. Tables serialization is OK on EOF. + yylineno is present in all scanners. Modified nasty performance + penalty warning w/ yylineno. test-table-opts is now run last + because it's so fat. Updated manual. + +2002-09-12 11:48 John Millaway <millaway@acm.org> + + * flex.texi: documentation of tabels api in manual + +2002-09-12 10:54 John Millaway <millaway@acm.org> + + * TODO, tables.c: Renamed *_fwrite to *_write to reflect writer + abstraction. + +2002-09-11 17:55 John Millaway <millaway@acm.org> + + * devel/tables.pl: Added perl script to read/dump serialized tables + in devel/ + +2002-09-11 17:22 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: the debian patch used strlen(yytext) and similar + constructs--as millaway points out, this is better known as yyleng + +2002-09-11 16:00 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/de.po: new de translation from the translation project + +2002-09-11 08:30 John Millaway <millaway@acm.org> + + * flex.skl: yytbl_load now checks tables set by name. Localized + var scaope in yytbl_load. + +2002-09-10 09:12 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.am: make clean before make test + +2002-09-09 18:06 John Millaway <millaway@acm.org> + + * TODO, flex.skl: Fixed deserialization of --fast tables. + +2002-09-09 16:44 Will Estes <wlestes@users.sourceforge.net> + + * TODO: fix typo; remove the yylineo entry + +2002-09-09 15:25 John Millaway <millaway@acm.org> + + * TODO, buf.c, dfa.c, flex.skl, flexdef.h, gen.c, main.c, misc.c, + options.c, options.h, scan.l, tables.c, tables.h, tables_shared.h, + devel/dump-tables.pl, tests/test-table-opts/.cvsignore, + tests/test-table-opts/Makefile.am, tests/test-table-opts/scanner.l: + Table deserialization works for everything except --fast scanners. + Scanners can auto-verify serialized table integrity via + --tables-verify. Added tables API items to TODO list. + test-table-opts is becoming exhaustive (a good thing). + +2002-09-09 11:54 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: flex has better internal diagnostics + +2002-09-09 11:52 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, flexdef.h: test for presence of __func__ and + compensate if absent + +2002-09-09 09:59 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: include the intl/ subdirectory when searching for + include files + +2002-09-09 08:49 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/ru.po, po/sv.po: new sv, ru translations from the + translation project + +2002-09-07 18:40 John Millaway <millaway@acm.org> + + * flex.skl, misc.c: Changed cryptic skeleton markers to readable + form. + +2002-09-07 00:18 John Millaway <millaway@acm.org> + + * Makefile.am, dfa.c, flex.skl, flex.texi, flexdef.h, gen.c, + main.c, misc.c, parse.y, tables.c, tables.h, tables_shared.c, + tables_shared.h: Members of struct yy_trans_info are now forced to + be the same size. Added shared file tables_shared.c. Separated + tables.h from flexdef.h Bulk of table deserialization code is done. + +2002-09-06 11:42 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/ca.po: new ca translation + +2002-09-06 11:24 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: new fr translation + +2002-09-06 11:22 Will Estes <wlestes@users.sourceforge.net> + + * po/fr.po: new french translation from the translation project + +2002-09-05 14:41 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: c99 function defs by default + +2002-09-05 14:22 John Millaway <millaway@acm.org> + + * flexdef.h, tables.c: Added flex_die macro. May need some autoconf + massaging. Added thorough error checking in tables code. + +2002-09-05 14:21 John Millaway <millaway@acm.org> + + * flex.skl, flex.texi: Flex generates C99 defs now. Documented the + above change in manual. + +2002-09-05 14:12 John Millaway <millaway@acm.org> + + * tests/test-table-opts/: .cvsignore, Makefile.am: Added + serialization test to table-opts test. + +2002-09-05 12:03 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: oops, i made a typo + +2002-09-05 12:01 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.19 + +2002-09-05 10:08 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: use FLEX_EXIT(), not exit() + +2002-09-05 09:53 John Millaway <millaway@acm.org> + + * devel/: 00EXTRACT-ALL-SYMS.sh, README, dump-tables.pl: Added + devel/ directory for junk that we don't want in the distribution, + but that we want in CVS. + +2002-09-05 09:26 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: s/exit(1)/exit(EXIT_FAILURE) + +2002-09-05 09:18 John Millaway <millaway@acm.org> + + * dfa.c, gen.c: Tables are now generated with %option + tables-file=FILE. + +2002-09-05 09:14 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: catch up on a few things + +2002-09-05 09:11 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: prevent segfault on input lines which are longer than the + allocated space (problem report from Manoj Srivastava + <srivasta@golden-gryphon.com>) + +2002-09-05 06:54 John Millaway <millaway@acm.org> + + * flex.texi, main.c, options.c, options.h: Changed option 'header' + to 'header-file'. 'header' still works, though. + +2002-09-05 06:48 John Millaway <millaway@acm.org> + + * flex.texi, flexdef.h, gen.c, main.c, options.c, options.h, + scan.l, tables.c: Tons more work on tables. + +2002-09-05 00:24 John Millaway <millaway@acm.org> + + * flexdef.h, gen.c, tables.c, tables_shared.h: Lots of work on + tables serialization code. + +2002-09-04 08:36 Will Estes <wlestes@users.sourceforge.net> + + * README.cvs-snapshot: mention GNU indent + +2002-09-04 08:33 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: remove the word after from the version line + +2002-09-03 17:02 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.18 + +2002-09-03 09:46 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: catch up on the NEWS + +2002-09-03 09:42 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.am: target test: quote the results echoing so that + the ECHO_C will work on systems where it is used + +2002-09-03 09:08 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: when we don't have GNU indent, the test will + generate output on stderr, so we send that to /dev/null + +2002-09-03 08:56 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: fixed bug whereby bison was reported missing even + when it was found + +2002-09-02 14:44 John Millaway <millaway@acm.org> + + * tables.c: In-code documentation. + +2002-09-02 14:44 John Millaway <millaway@acm.org> + + * flexdef.h: Forgot to indent before previous commit. + +2002-09-02 13:55 John Millaway <millaway@acm.org> + + * flexdef.h: Added known integer limits if undefined. + +2002-08-29 17:12 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: version 2.5.17 + +2002-08-29 17:12 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: more portability fixes; new version number + +2002-08-29 16:30 Will Estes <wlestes@users.sourceforge.net> + + * flexdef.h, main.c, misc.c, scanopt.c: #include fixes; we've + factored out all the system include files and put them in flexdef.h + +2002-08-29 15:02 Will Estes <wlestes@users.sourceforge.net> + + * dfa.c: eat a blank line + +2002-08-29 09:21 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: new config.{sub,guess} files; mention that we use indent on + flex + +2002-08-28 13:12 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: warn if no indent found; version 2.5.16 + +2002-08-28 13:10 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: catch up on recent changes; version 2.5.16 + +2002-08-27 14:07 Will Estes <wlestes@users.sourceforge.net> + + * buf.c, ccl.c, dfa.c, ecs.c, flexdef.h, gen.c, libmain.c, + libyywrap.c, main.c, misc.c, nfa.c, options.c, options.h, + scanopt.c, scanopt.h, sym.c, tables.c, tables_shared.h, tblcmp.c, + yylex.c: ran the indent target; commit the results + +2002-08-27 14:05 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: touch up the indent targeet; it's ready for + production use now + +2002-08-27 14:01 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: test for GNU indent; reorder the tests somewhat + +2002-08-23 10:29 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: automake is smarter about autoconf's versioning + scheme + +2002-08-23 09:18 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: catch NEWS up on what we've been doing + +2002-08-22 13:18 Will Estes <wlestes@users.sourceforge.net> + + * flexdef.h: do some more conditional including for folks without + standard systems + +2002-08-22 13:15 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-c++-basic/Makefile.am: use CXX to link the test + scanner here + +2002-08-22 01:35 John Millaway <millaway@acm.org> + + * flex.texi: Documentation. + +2002-08-21 21:49 John Millaway <millaway@acm.org> + + * Makefile.am: Created 'indent' target and added .indent.pro. + +2002-08-21 21:42 John Millaway <millaway@acm.org> + + * tests/: test-array-nr/Makefile.am, test-array-r/Makefile.am, + test-basic-nr/Makefile.am, test-basic-r/Makefile.am, + test-c-cpp-nr/Makefile.am: Fixed missing 'make clean' files. + +2002-08-21 21:34 John Millaway <millaway@acm.org> + + * tests/: test-bison-yylloc/Makefile.am, + test-bison-yylval/Makefile.am: fixed missing 'clean' file. + +2002-08-21 21:11 John Millaway <millaway@acm.org> + + * flex.skl, tests/test-c++-basic/Makefile.am, + tests/test-c++-basic/scanner.l: Removed core of yylex_destroy from + c++ scanner -- hack! Added -lstdc++ to LDFLAGS (should we have to + do this??) + +2002-08-21 10:15 Will Estes <wlestes@users.sourceforge.net> + + * README: official releases are being hosted by Vern + +2002-08-21 09:42 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: new beta version; more entries in NEWS from + millaway; the top level entry for test-c++-basic + +2002-08-21 09:41 Will Estes <wlestes@users.sourceforge.net> + + * tests/: Makefile.am, test-c++-basic/.cvsignore, + test-c++-basic/Makefile.am, test-c++-basic/scanner.l, + test-c++-basic/test.input: add test-c++-basic + +2002-08-21 02:54 John Millaway <millaway@acm.org> + + * gen.c, nfa.c: More tabels work. + +2002-08-20 21:54 John Millaway <millaway@acm.org> + + * flexdef.h, gen.c, tables.c, tables_shared.h: More work on tables. + +2002-08-20 19:49 John Millaway <millaway@acm.org> + + * dfa.c: Cleaned up macros that took no ';'. + +2002-08-20 19:47 John Millaway <millaway@acm.org> + + * scanopt.c: Fixed oddball '=-'. + +2002-08-20 17:42 John Millaway <millaway@acm.org> + + * flex.skl, flex.texi, gen.c: Dynamically allocate REJECT state + buffer. Mentioned memory usage in docs. Made REJECT buffer + variables reentrant-safe. + +2002-08-20 17:37 John Millaway <millaway@acm.org> + + * tables.c: More work on tables code. + +2002-08-20 10:52 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, NEWS, configure.in: we're using m4 so have configure + test for it + +2002-08-20 00:23 John Millaway <millaway@acm.org> + + * Makefile.am, tables.c: Added tables.c and rebuilt dependencies. + +2002-08-19 20:30 John Millaway <millaway@acm.org> + + * TODO, flex.texi: Dicussed prototypes and header in manual. + +2002-08-19 17:56 John Millaway <millaway@acm.org> + + * Makefile.am, configure.in, flex.skl, flexdef.h, tables_shared.h: + More work on tables serialization. + +2002-08-19 17:15 John Millaway <millaway@acm.org> + + * Makefile.am, mkskel.sh: Skeleton is now passed through m4 (before + dist is built). + +2002-08-19 08:51 Will Estes <wlestes@users.sourceforge.net> + + * po/: LINGUAS, zh_CN.po: add zh_cn translation from the + translation project + +2002-08-19 08:51 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: millaway's done a lot of things which need to be mentioned + in NEWS + +2002-08-18 16:32 John Millaway <millaway@acm.org> + + * main.c: Removed #undef of start conditions. + +2002-08-17 18:24 John Millaway <millaway@acm.org> + + * TODO: todo list + +2002-08-17 16:04 John Millaway <millaway@acm.org> + + * flexdef.h, main.c, misc.c: Start conditions now optional in + header. undef's now optional in header. Start conditions are NOT + prefixed. + +2002-08-17 13:05 John Millaway <millaway@acm.org> + + * flex.skl, flex.texi: Working on tables API. + +2002-08-16 18:32 John Millaway <millaway@acm.org> + + * flexdef.h, main.c, misc.c, options.c, options.h, parse.y, scan.l: + Added --tables option. Omitted tables code from generated scanner + when unused. + +2002-08-16 15:54 John Millaway <millaway@acm.org> + + * flex.skl, flex.texi, misc.c: Prelimary work on tables API. + +2002-08-16 15:45 John Millaway <millaway@acm.org> + + * tests/: TEMPLATE/Makefile.am, test-array-nr/Makefile.am, + test-array-r/Makefile.am, test-basic-nr/Makefile.am, + test-basic-r/Makefile.am, test-bison-yylloc/Makefile.am, + test-bison-yylval/Makefile.am, test-c-cpp-nr/Makefile.am, + test-c-cpp-r/Makefile.am, test-debug-nr/Makefile.am, + test-debug-r/Makefile.am, test-header-nr/Makefile.am, + test-header-r/Makefile.am, test-include-by-buffer/Makefile.am, + test-include-by-reentrant/Makefile.am, test-lineno-nr/Makefile.am, + test-lineno-r/Makefile.am, test-mem-nr/Makefile.am, + test-mem-r/Makefile.am, test-multiple-scanners-nr/Makefile.am, + test-multiple-scanners-r/Makefile.am, test-posix/Makefile.am, + test-posixly-correct/Makefile.am, test-prefix-nr/Makefile.am, + test-prefix-r/Makefile.am, test-pthread/Makefile.am, + test-string-nr/Makefile.am, test-string-r/Makefile.am, + test-table-opts/Makefile.am, test-yyextra/Makefile.am: Tests now + respect CFLAGS, CPPFLAGS, etc.. + +2002-08-16 15:03 John Millaway <millaway@acm.org> + + * tests/: test-basic-nr/scanner.l, test-basic-r/scanner.l, + test-lineno-nr/scanner.l, test-lineno-r/scanner.l: Got rid of flex + -s warnings in tests. + +2002-08-16 14:51 John Millaway <millaway@acm.org> + + * Makefile.am: Updated dependencies list. + +2002-08-15 17:23 John Millaway <millaway@acm.org> + + * main.c: Fixed seg fault bug in ecs. + +2002-08-15 17:18 Will Estes <wlestes@users.sourceforge.net> + + * tests/: test-c-cpp-nr/.cvsignore, test-c-cpp-r/.cvsignore: ignore + .cpp files since we generate them instead of .c + +2002-08-15 11:37 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: version 2.5.14 + +2002-08-15 11:37 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: c-as-c++ tests reworked + +2002-08-15 11:15 John Millaway <millaway@acm.org> + + * tests/: test-c-cpp-nr/Makefile.am, test-c-cpp-nr/scanner.l, + test-c-cpp-r/Makefile.am, test-c-cpp-r/scanner.l: The c++ tests use + .cpp instead of .c extensions just to be on the safe side. + +2002-08-15 10:50 Will Estes <wlestes@users.sourceforge.net> + + * main.c: conditionally include <locale.h>; include config.h as + well + +2002-08-15 10:49 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, flex.skl: only include <cunistd> if we have it + +2002-08-15 10:48 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: portability fixes; added missing punctuation; de + translation now included + +2002-08-15 10:16 Will Estes <wlestes@users.sourceforge.net> + + * po/LINGUAS: we also translate to german + +2002-08-15 09:17 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: require automake at least 1.6 + +2002-08-15 08:32 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.13 + +2002-08-14 10:57 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: reverted away from the @copying as it breaks the info + reader + +2002-08-13 20:46 John Millaway <millaway@acm.org> + + * flex.texi, flexdef.h, main.c, misc.c: Start condition prefixes + attempts to adjust to user preferences. + +2002-08-13 17:19 John Millaway <millaway@acm.org> + + * main.c: Include start condition symbols in header. + +2002-08-13 15:16 John Millaway <millaway@acm.org> + + * flexdef.h, main.c: Omit user code and tables from generated + header file. + +2002-08-13 09:14 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: use @copying construct to display the flex license; + move copying and bug reporting to the front of the manual + +2002-08-13 09:00 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: printf fix and yylex_init reports errors + +2002-08-12 19:15 John Millaway <millaway@acm.org> + + * flex.texi: Updated manual for %option header. + +2002-08-12 15:36 John Millaway <millaway@acm.org> + + * flex.skl, flex.texi, gen.c: Fixed type mismatch in printf. + yylex_init now reports errors. + +2002-08-10 13:22 John Millaway <millaway@acm.org> + + * dfa.c, main.c: Added alignment flag for future use. + +2002-08-10 13:17 John Millaway <millaway@acm.org> + + * tests/test-table-opts/: .cvsignore, Makefile.am: Added options to + test-table-opts + +2002-08-10 12:39 John Millaway <millaway@acm.org> + + * configure.in, tests/Makefile.am, tests/descriptions, + tests/test-c-cpp-nr/Makefile.am, tests/test-table-opts/.cvsignore, + tests/test-table-opts/Makefile.am, tests/test-table-opts/scanner.l, + tests/test-table-opts/test.input: Added a test for various DFA + table options. + +2002-08-09 16:36 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: more faq editing; corrected mistyped nodenames + +2002-08-09 13:41 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: fix typo which propogates out to generated scanners + +2002-08-09 10:42 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: edited a few more faqs + +2002-08-09 10:20 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, faq.texi: remove faq.texi as it's included in + flex.texi + +2002-08-08 17:12 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: a few more faq edits; remove faq-89 + +2002-08-08 16:50 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: cite, not site + +2002-08-08 16:46 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: and get the faq included + +2002-08-08 16:29 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: fix some grammer/typography in the top node and add a + detailed menu + +2002-08-08 13:10 Will Estes <wlestes@users.sourceforge.net> + + * TODO: we've updated gettext + +2002-08-08 13:04 Will Estes <wlestes@users.sourceforge.net> + + * po/.cvsignore: we need to ignore a few more gettext files + +2002-08-08 11:22 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.12 + +2002-08-08 10:53 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: mention gettext; document the non-need for bison/flex in + the build process + +2002-08-08 10:51 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, configure.in: include intl in the distribution and + in the build process + +2002-08-08 10:12 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: builddir in help2man call needed @-signs around it + +2002-08-08 09:54 Will Estes <wlestes@users.sourceforge.net> + + * po/.cvsignore: we can ignore Makefile.in.in + +2002-08-08 09:45 Will Estes <wlestes@users.sourceforge.net> + + * m4/: .cvsignore, Makefile.am: oops, too hasty on deleting this + directory, sigh + +2002-08-08 09:23 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: if autopoint is going to run automatically, it's + going to need to be able to update existing files + +2002-08-08 09:22 Will Estes <wlestes@users.sourceforge.net> + + * ABOUT-NLS, autogen.sh, configure.in, m4/.cvsignore, + m4/Makefile.am, m4/codeset.m4, m4/gettext.m4, m4/glibc21.m4, + m4/iconv.m4, m4/isc-posix.m4, m4/lcmessage.m4, m4/lib-ld.m4, + m4/lib-link.m4, m4/lib-prefix.m4, m4/progtest.m4: autopoint now + works so let's let it run the gettext show + +2002-08-07 13:27 Will Estes <wlestes@users.sourceforge.net> + + * TODO: we need to index the faq entries + +2002-08-07 13:26 Will Estes <wlestes@users.sourceforge.net> + + * faq.texi: proofed "Why do flex scanners call fileno if it is not + ANSI compatible?" + +2002-08-07 13:23 Will Estes <wlestes@users.sourceforge.net> + + * faq.texi: proofed "How do I expand \ escape sequences in C-style + quoted strings?" + +2002-08-07 13:19 Will Estes <wlestes@users.sourceforge.net> + + * README: changes to README to align with GNU coding standards + +2002-08-06 09:05 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: help2man should look in builddir for the flex binary + +2002-08-02 16:23 John Millaway <millaway@acm.org> + + * flex.skl: Fixed yyunput prototype. + +2002-08-01 11:35 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: new fr translation from the translation project + +2002-08-01 10:02 Will Estes <wlestes@users.sourceforge.net> + + * po/fr.po: new fr.po translation from the translation project + +2002-08-01 10:00 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: yylineno performance hit is fixed + +2002-07-31 17:29 John Millaway <millaway@acm.org> + + * TODO, flex.texi: Updated docs on yylineno. + +2002-07-31 15:19 Will Estes <wlestes@users.sourceforge.net> + + * TODO: discuss yylineno performance + +2002-07-31 13:07 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: forgot to say what the date was that we made the release + +2002-07-31 10:52 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.11 + +2002-07-31 10:45 Will Estes <wlestes@users.sourceforge.net> + + * faq.texi: fixed a menu entry and related problems + +2002-07-31 10:38 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: someday, maybe we can use autopoint + +2002-07-31 09:56 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: we need to include texinfo.tex now + +2002-07-31 09:55 Will Estes <wlestes@users.sourceforge.net> + + * texinfo.tex: add texinfo.tex + +2002-07-30 11:59 Will Estes <wlestes@users.sourceforge.net> + + * faq.texi: fix up some fatal bugs in the texinfo of the faq; begin + the clean up; remove trailing and leading white space + +2002-07-30 11:53 Will Estes <wlestes@users.sourceforge.net> + + * TODO: faqs need work + +2002-07-30 09:03 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, TODO: prototypes get airtime these days + +2002-07-28 16:02 John Millaway <millaway@acm.org> + + * flex.skl: Added some comments. + +2002-07-28 14:27 John Millaway <millaway@acm.org> + + * flex.skl: Fixed bug where yyless did not consider yylineno. + +2002-07-28 01:45 John Millaway <millaway@acm.org> + + * scan.l: Fixed bug I created in previous commit. + +2002-07-28 01:38 John Millaway <millaway@acm.org> + + * scan.l: Don't wrap ()s around {NAMEDEFS} at the end of a rule. + +2002-07-27 17:37 John Millaway <millaway@acm.org> + + * flex.skl, tests/test-c-cpp-nr/Makefile.am, + tests/test-c-cpp-r/Makefile.am: Fixed test-c-cpp to actually use + the C++ compiler for the test. Fixed the bug that this exposed. + +2002-07-27 15:34 John Millaway <millaway@acm.org> + + * ccl.c, flex.skl, flexdef.h, gen.c, main.c, nfa.c, parse.y, + scan.l: yylineno check is only performed on rules whose regexs can + match a newline. + +2002-07-24 20:43 John Millaway <millaway@acm.org> + + * flex.skl, tests/TEMPLATE/scanner.l, + tests/test-array-nr/scanner.l, tests/test-array-r/scanner.l, + tests/test-basic-nr/scanner.l, tests/test-basic-r/scanner.l, + tests/test-bison-yylloc/parser.y, tests/test-c-cpp-nr/scanner.l, + tests/test-c-cpp-r/scanner.l, tests/test-debug-nr/scanner.l, + tests/test-debug-r/scanner.l, + tests/test-include-by-buffer/scanner.l, + tests/test-include-by-reentrant/scanner.l, + tests/test-lineno-nr/scanner.l, tests/test-lineno-r/scanner.l, + tests/test-mem-nr/scanner.l, tests/test-mem-r/scanner.l, + tests/test-posix/scanner.l, tests/test-posixly-correct/scanner.l, + tests/test-prefix-nr/scanner.l, tests/test-prefix-r/scanner.l, + tests/test-pthread/scanner.l, tests/test-string-nr/scanner.l, + tests/test-string-r/scanner.l, tests/test-yyextra/scanner.l: All + prototypes were rewritten to depend upon the macro + YY_TRADITIONAL_FUNC_DEFS, which is defined by default. The + generated scanners build cleanly under gcc's traditional strictness + and under C++ compilers. + +2002-07-24 11:58 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: dist-bzip2 and rename yy_globals and yy_globals_t + +2002-07-24 11:57 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: version 2.5.10 + +2002-07-24 11:57 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: add dist-bzip2 to automake_options so we'll start + getting tar.bz2 archives + +2002-07-23 16:11 John Millaway <millaway@acm.org> + + * flex.skl, flex.texi, tests/test-bison-yylval/scanner.l, + tests/test-mem-r/scanner.l, + tests/test-multiple-scanners-r/scanner-1.l, + tests/test-multiple-scanners-r/scanner-2.l, + tests/test-prefix-r/scanner.l, tests/test-pthread/scanner.l, + tests/test-yyextra/scanner.l: s/yy_globals_t/yyguts_t/g + s/yy_globals/yyscanner/g + +2002-07-23 13:55 John Millaway <millaway@acm.org> + + * Makefile.am: typo in tags target + +2002-07-22 12:18 John Millaway <millaway@acm.org> + + * Makefile.am: Removed erroneous $(srcdir) from help2man target. + +2002-07-22 10:03 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: it's version 2.5.9 now + +2002-07-22 09:56 Will Estes <wlestes@users.sourceforge.net> + + * po/.cvsignore: updated gettext to 0.11.3 + +2002-07-22 09:49 Will Estes <wlestes@users.sourceforge.net> + + * ABOUT-NLS, config.rpath, m4/gettext.m4, m4/iconv.m4, + m4/isc-posix.m4, m4/lcmessage.m4, m4/lib-link.m4: updated gettext + to version 0.11.3 + +2002-07-22 09:29 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh, configure.in: rollback on configure.in and autogen.sh + because autpoint is broken + +2002-07-22 09:15 Will Estes <wlestes@users.sourceforge.net> + + * po/ru.po: new russian translation from translation project + +2002-07-19 17:09 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: ok, we're going to start using autopoint, but the + tree is going to undergo some changes after this + +2002-07-19 17:06 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: we're preparing for autopoint + +2002-07-17 11:57 John Millaway <millaway@acm.org> + + * flex.texi: Updated manual. + +2002-07-17 08:53 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: update the NEWS file for lots of things millaway has done + +2002-07-17 02:46 John Millaway <millaway@acm.org> + + * flex.skl, main.c, misc.c, scan.l, scanopt.c, sym.c, + tests/test-mem-nr/scanner.l, tests/test-mem-r/scanner.l: Fixed + prototype/definition conflicts with "traditional" C in skeleton at + request of gcc developer. Removed duplicate prototypes in gen.c, + sym.c, main.c. Added missing prototypes where needed. All + functions in skeleton follow ISO C style protos and defs, instead + of BOTH ISO and new-style. Skeleton now compiles cleanly under + super-strict gcc flags. Flex itself almost compiles cleanly under + strict flags. + +2002-07-15 14:59 John Millaway <millaway@acm.org> + + * faq.texi, flex.texi: Worked on mem mgmt sect of manual. + +2002-07-15 12:55 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: allow blank lines and continuations in more places + +2002-07-12 13:43 Will Estes <wlestes@users.sourceforge.net> + + * TODO: millaway finished the faqs directory + +2002-07-12 13:39 Will Estes <wlestes@users.sourceforge.net> + + * TODO: removed items as per email from millaway + +2002-07-12 12:23 John Millaway <millaway@acm.org> + + * configure.in, tests/Makefile.am, tests/descriptions, + tests/test-posix/.cvsignore, tests/test-posix/Makefile.am, + tests/test-posix/scanner.l, tests/test-posixly-correct/.cvsignore, + tests/test-posixly-correct/Makefile.am, + tests/test-posixly-correct/scanner.l: Added test for %option + posix-compat and repeat operator. Added test for POSIXLY_CORRECT + environment variable and repeat operator. + +2002-07-12 12:21 John Millaway <millaway@acm.org> + + * main.c, scan.l: Fixed POSIXLY_CORRECT detection in scanner. + +2002-07-11 16:27 John Millaway <millaway@acm.org> + + * faq.texi: More work on faq. + +2002-07-11 16:06 John Millaway <millaway@acm.org> + + * faq.texi: Moved all faqs into manual -- but did not evaluate them + yet. Removed the old faq files. + +2002-07-10 17:59 John Millaway <millaway@acm.org> + + * main.c: Removed duplicate definition of FLEX_DEBUG. gcc doesn't + care, but other compilers might. + +2002-07-10 17:55 John Millaway <millaway@acm.org> + + * flex.texi: Wrote some more about memory mgmt in the manual. + +2002-07-10 11:43 John Millaway <millaway@acm.org> + + * flex.texi: flex.texi now works with install-info. + +2002-07-10 10:02 Will Estes <wlestes@users.sourceforge.net> + + * TODO: added items as per email from millaway + +2002-07-10 10:02 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: after we release a version, we have to keep the version + number in NEWS current + +2002-07-09 20:04 John Millaway <millaway@acm.org> + + * flex.skl, flex.texi, main.c, scan.l, tests/test-mem-nr/scanner.l, + tests/test-mem-r/scanner.l: Fixed prefix issue with get/set debug + functions. Fixed prefix issues with memory functions. + +2002-07-09 19:35 John Millaway <millaway@acm.org> + + * flex.skl: Memory functions are no longer static. + +2002-07-09 19:02 John Millaway <millaway@acm.org> + + * tests/test-mem-nr/test.input: Added a missing input file for + test-mem-nr/ + +2002-07-09 18:47 John Millaway <millaway@acm.org> + + * tests/: test-mem-nr/.cvsignore, test-mem-nr/Makefile.am, + test-mem-nr/scanner.l, test-mem-r/.cvsignore, + test-mem-r/Makefile.am, test-mem-r/scanner.l, + test-mem-r/test.input: Added tests for overriding memory. + +2002-07-09 18:45 John Millaway <millaway@acm.org> + + * flex.texi: Added sections in manual for memory management. + +2002-07-09 17:36 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: noted more user visible changes + +2002-07-09 16:52 John Millaway <millaway@acm.org> + + * configure.in, flex.skl, scan.l, tests/Makefile.am: Added + yylex_destroy() to non-reentrant scanner. Added ability to + override memory functions. Added tests for overriding memory + functions. + +2002-07-09 14:41 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: new POSIXLY_CORRECT and new ru translation + +2002-07-09 14:40 Will Estes <wlestes@users.sourceforge.net> + + * po/ru.po: new ru translation from the translation project + +2002-07-09 14:25 John Millaway <millaway@acm.org> + + * flex.texi: Made note of set/get debug in docs. + +2002-07-09 14:11 John Millaway <millaway@acm.org> + + * configure.in, flexdef.h, tests/create-test: Replaced obsolete + macros in configure.in. Modified create-test to handle the above + changes in configure.in. Added support for <stdbool.h>. + +2002-07-09 13:27 John Millaway <millaway@acm.org> + + * main.c: Check POSIXLY_CORRECT env variable. + +2002-07-09 12:43 John Millaway <millaway@acm.org> + + * flex.skl: Added prototypes for the get/set debug functions. + +2002-07-09 12:37 John Millaway <millaway@acm.org> + + * configure.in, flex.skl, gen.c, main.c, scan.l, tests/Makefile.am, + tests/test-debug-nr/.cvsignore, tests/test-debug-nr/Makefile.am, + tests/test-debug-nr/scanner.l, tests/test-debug-nr/test.input, + tests/test-debug-r/.cvsignore, tests/test-debug-r/Makefile.am, + tests/test-debug-r/scanner.l, tests/test-debug-r/test.input: Made + yy_flex_debug non-global in reentrant scanner. Created get/set + functions for yy_flex_debug. Defined prefixes for new + yy_flex_debug symbols. Added tests/ for yy_flex_debug. + +2002-07-09 12:31 John Millaway <millaway@acm.org> + + * tests/create-test: create-test script now modifies .cvsignore + +2002-07-09 12:22 John Millaway <millaway@acm.org> + + * tests/create-test: Improved the error checking. + +2002-07-03 09:12 Will Estes <wlestes@users.sourceforge.net> + + * main.c: fix bug whereby prefix didn't get passed to everybody; + patch by rse@engelschall.com + +2002-07-03 08:47 Will Estes <wlestes@users.sourceforge.net> + + * faq.texi: ~ is an active character, so we'll just use the word + 'about' + +2002-07-02 18:59 John Millaway <millaway@acm.org> + + * Makefile.am: Fixed typo. + +2002-07-02 15:47 John Millaway <millaway@acm.org> + + * faq.texi: Added a faq. + +2002-06-28 19:05 John Millaway <millaway@acm.org> + + * Makefile.am: Added 'tags' target -- something I should have done + long ago. + +2002-06-28 12:18 Will Estes <wlestes@users.sourceforge.net> + + * TODO: add two new items regarding coding; remove tests/ copyright + notice item as it's done + +2002-06-26 08:33 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: note the copyright messages in tests/ + +2002-06-25 15:37 John Millaway <millaway@acm.org> + + * tests/: TEMPLATE/Makefile.am, TEMPLATE/parser.y, + TEMPLATE/scanner.l, test-array-nr/Makefile.am, + test-array-nr/scanner.l, test-array-r/Makefile.am, + test-array-r/scanner.l, test-basic-nr/Makefile.am, + test-basic-nr/scanner.l, test-basic-r/Makefile.am, + test-basic-r/scanner.l, test-bison-yylloc/Makefile.am, + test-bison-yylloc/main.c, test-bison-yylloc/parser.y, + test-bison-yylloc/scanner.l, test-bison-yylval/Makefile.am, + test-bison-yylval/main.c, test-bison-yylval/parser.y, + test-bison-yylval/scanner.l, test-c-cpp-nr/Makefile.am, + test-c-cpp-nr/scanner.l, test-c-cpp-r/Makefile.am, + test-c-cpp-r/scanner.l, test-header-nr/Makefile.am, + test-header-nr/main.c, test-header-nr/scanner.l, + test-header-r/Makefile.am, test-header-r/main.c, + test-header-r/scanner.l, test-include-by-buffer/Makefile.am, + test-include-by-buffer/scanner.l, + test-include-by-reentrant/Makefile.am, + test-include-by-reentrant/scanner.l, test-lineno-nr/Makefile.am, + test-lineno-nr/scanner.l, test-lineno-r/Makefile.am, + test-lineno-r/scanner.l, test-multiple-scanners-nr/Makefile.am, + test-multiple-scanners-nr/main.c, + test-multiple-scanners-nr/scanner-1.l, + test-multiple-scanners-nr/scanner-2.l, + test-multiple-scanners-r/Makefile.am, + test-multiple-scanners-r/main.c, + test-multiple-scanners-r/scanner-1.l, + test-multiple-scanners-r/scanner-2.l, test-prefix-nr/Makefile.am, + test-prefix-nr/scanner.l, test-prefix-r/Makefile.am, + test-prefix-r/scanner.l, test-pthread/Makefile.am, + test-pthread/scanner.l, test-string-nr/Makefile.am, + test-string-nr/scanner.l, test-string-r/Makefile.am, + test-string-r/scanner.l, test-yyextra/Makefile.am, + test-yyextra/scanner.l: Prepended explicit license to all test-*/ + sources. + +2002-06-25 08:56 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/ca.po, po/de.po, po/fr.po, po/sv.po, po/tr.po: new ca, + de, fr, sv, tr translations + +2002-06-19 09:40 Will Estes <wlestes@users.sourceforge.net> + + * TODO: add bootstrapper to the todo list + +2002-06-19 09:38 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: new version number + +2002-06-19 09:38 Will Estes <wlestes@users.sourceforge.net> + + * TODO: update TODO list + +2002-06-19 09:26 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, TODO, flex.texi, flexdef.h, main.c, options.c, options.h, + parse.y, scan.l: address typos in NEWS; add --posix option for ERE + parsing the way posix wants it; update the TODO file + +2002-05-31 13:18 Will Estes <wlestes@users.sourceforge.net> + + * README-alpha: made code quality warning more explicit; gave url + for cvs and beta flex + +2002-05-23 11:53 John Millaway <millaway@acm.org> + + * gen.c: Fixed bug where omission of user section 3 caused + unmatched #ifdef's in generated code. + +2002-05-20 08:39 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: configure.in requires at least autoconf 2.50 + +2002-05-13 14:45 John Millaway <millaway@acm.org> + + * Makefile.am: Updated my email address. + +2002-05-10 15:33 John Millaway <millaway@acm.org> + + * flexdef.h, misc.c: chomp'd lines when reading external skel file. + +2002-05-07 11:00 Will Estes <wlestes@users.sourceforge.net> + + * po/sv.po: new sweedish translation from the translation project + +2002-04-29 11:37 Will Estes <wlestes@users.sourceforge.net> + + * po/ca.po: new catalan translation from the translation project + +2002-04-29 11:37 Will Estes <wlestes@users.sourceforge.net> + + * po/es.po: new spanish translation from the translation project + +2002-04-25 17:54 Will Estes <wlestes@users.sourceforge.net> + + * TODO: note that the lex matching of abc{1,3} is the posix + behavior and so we have a problem + +2002-04-25 17:53 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: note that the lex matching of abc{1,3} is the posix + behavior + +2002-04-23 07:02 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: new version 2.5.7; use autoconf versioning info + +2002-04-23 07:01 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: note changes in 2.5.7 + +2002-04-23 06:23 Will Estes <wlestes@users.sourceforge.net> + + * main.c: conditional compile gettext initialization + +2002-04-22 13:28 Will Estes <wlestes@users.sourceforge.net> + + * po/de.po: new german translation from the translation project + +2002-04-19 18:40 John Millaway <millaway@acm.org> + + * tests/test-include-by-reentrant/Makefile.am: Fixed command line + for test-include-by-reentrant/Makefile.am + +2002-04-19 18:30 John Millaway <millaway@acm.org> + + * tests/: Makefile.am, TEMPLATE/Makefile.am, + test-array-nr/Makefile.am, test-array-r/Makefile.am, + test-basic-nr/Makefile.am, test-basic-r/Makefile.am, + test-bison-yylloc/Makefile.am, test-bison-yylval/Makefile.am, + test-c-cpp-nr/Makefile.am, test-c-cpp-r/Makefile.am, + test-header-nr/Makefile.am, test-header-r/Makefile.am, + test-include-by-buffer/Makefile.am, + test-include-by-reentrant/Makefile.am, test-lineno-nr/Makefile.am, + test-lineno-r/Makefile.am, test-multiple-scanners-nr/Makefile.am, + test-multiple-scanners-r/Makefile.am, test-prefix-nr/Makefile.am, + test-prefix-r/Makefile.am, test-pthread/Makefile.am, + test-string-nr/Makefile.am, test-string-r/Makefile.am, + test-yyextra/Makefile.am: Added -I . to compiler search path in + tests (so it finds the generated parser.h). + +2002-04-19 18:20 John Millaway <millaway@acm.org> + + * flexdef.h, misc.c, parse.y, sym.c: Applied 'const' to a few more + char*, where appropriate. + +2002-04-19 17:54 John Millaway <millaway@acm.org> + + * tests/: TEMPLATE/Makefile.am, test-array-nr/Makefile.am, + test-array-r/Makefile.am, test-basic-nr/Makefile.am, + test-basic-r/Makefile.am, test-bison-yylloc/Makefile.am, + test-bison-yylval/Makefile.am, test-c-cpp-nr/Makefile.am, + test-c-cpp-r/Makefile.am, test-header-nr/Makefile.am, + test-header-r/Makefile.am, test-include-by-buffer/Makefile.am, + test-include-by-reentrant/Makefile.am, test-lineno-nr/Makefile.am, + test-lineno-r/Makefile.am, test-multiple-scanners-nr/Makefile.am, + test-multiple-scanners-r/Makefile.am, test-prefix-nr/Makefile.am, + test-prefix-r/Makefile.am, test-pthread/Makefile.am, + test-string-nr/Makefile.am, test-string-r/Makefile.am, + test-yyextra/Makefile.am: Added top_builddir to -I path. Changed + $(srcdir)/$(testname) to ./$(testname) in 'make test' rule. + +2002-04-19 17:53 John Millaway <millaway@acm.org> + + * flexdef.h, gen.c, misc.c: Changed 'char[]' to 'const char*' + wherever in conflicted with gettext. + +2002-04-19 10:35 Will Estes <wlestes@users.sourceforge.net> + + * po/: fr.po, sv.po: new files from translation after 2.5.6 beta + release + +2002-04-18 19:01 John Millaway <millaway@acm.org> + + * tests/test-lineno-r/Makefile.am: Fixed minor typo/cut and paste + error. + +2002-04-18 18:07 John Millaway <millaway@acm.org> + + * configure.in: Added yylineno test. + +2002-04-18 18:06 John Millaway <millaway@acm.org> + + * tests/Makefile.am: Added yylineno tests. + +2002-04-18 18:06 John Millaway <millaway@acm.org> + + * tests/: test-lineno-nr/.cvsignore, test-lineno-nr/Makefile.am, + test-lineno-nr/scanner.l, test-lineno-nr/test.input, + test-lineno-r/.cvsignore, test-lineno-r/Makefile.am, + test-lineno-r/scanner.l, test-lineno-r/test.input: Created yylineno + tests. + +2002-04-15 16:49 John Millaway <millaway@acm.org> + + * scanopt.c: Applied gettext macros to error messages from scanopt. + +2002-04-15 16:46 John Millaway <millaway@acm.org> + + * buf.c, faq.texi, options.c, options.h, scanopt.c, scanopt.h: + Changed copyright from Millaway to flex? U.S. Gov't? Regents of U. + Cali.? Paxson? + +2002-04-15 10:44 Will Estes <wlestes@users.sourceforge.net> + + * tests/: test-bison-yylloc/Makefile.am, + test-header-nr/Makefile.am, test-header-r/Makefile.am: we missed a + few main.c files in the distribution + +2002-04-15 08:05 Will Estes <wlestes@users.sourceforge.net> + + * TODO: a lot more work has happened to flex; note this by removing + a number of TODO entries + +2002-04-15 07:59 Will Estes <wlestes@users.sourceforge.net> + + * TODO: make sure all gettext modules use gettext translation + facilities + +2002-04-14 15:53 John Millaway <millaway@acm.org> + + * faq.texi: Converted faqs 34-41 to texinfo. + +2002-04-14 14:42 John Millaway <millaway@acm.org> + + * Makefile.am, faq.texi, flex.texi: Added faq.texi to archive. + Added faq.texi to flex_TEXINFOS macro in Makefile.am. flex.texi + now includes faq.texi. + +2002-04-13 00:16 John Millaway <millaway@acm.org> + + * flexdef.h: defined FLEX_EXIT macro to call longjmp on errors. + +2002-04-13 00:08 John Millaway <millaway@acm.org> + + * main.c, misc.c: Replaced exit(2) calls with longjmps (in the form + of FLEX_EXIT macro). Moved main() to flex_main() to allow flex to + be called from a library. + +2002-04-13 00:06 John Millaway <millaway@acm.org> + + * scanopt.c: Fixed minor typo in error message + +2002-04-12 12:23 Will Estes <wlestes@users.sourceforge.net> + + * tests/: test-header-nr/Makefile.am, test-header-r/Makefile.am, + test-multiple-scanners-nr/Makefile.am, + test-multiple-scanners-r/Makefile.am, test-pthread/Makefile.am, + test-string-nr/Makefile.am, test-string-r/Makefile.am, + test-yyextra/Makefile.am: removed eroneous files listed in + EXTRA_DIST + +2002-04-12 12:09 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-yyextra/.cvsignore: ignore Makefile.in + +2002-04-12 12:09 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-string-r/.cvsignore: it's Makefile.in, not makefile.in + +2002-04-12 12:02 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-yyextra/: Makefile.am, Makefile.in: put test-yyextra + under automake + +2002-04-12 11:52 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-string-r/: Makefile.am, Makefile.in: put test-string-r + under automake + +2002-04-12 11:50 Will Estes <wlestes@users.sourceforge.net> + + * tests/: test-string-nr/.cvsignore, test-string-r/.cvsignore: we + can ignore Makefile.in + +2002-04-12 11:49 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-string-nr/: Makefile.am, Makefile.in: put + test-string-nr under automake + +2002-04-12 11:40 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-pthread/.cvsignore: ignore Makefile.in + +2002-04-12 11:37 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-pthread/: Makefile.am, Makefile.in: put test-pthread + under automake + +2002-04-12 11:24 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-prefix-r/.cvsignore: we can ignore Makefile.in + +2002-04-12 11:23 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-prefix-r/: Makefile.am, Makefile.in: put test-prefix-r + under automake + +2002-04-12 11:20 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-prefix-nr/.cvsignore: we can ignore Makefile.in + +2002-04-12 11:19 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-prefix-nr/: Makefile.am, Makefile.in: put + test-prefix-nr under automake + +2002-04-12 08:03 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-multiple-scanners-r/.cvsignore: we can ignore + Makefile.in now + +2002-04-12 08:02 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-multiple-scanners-r/: Makefile.am, Makefile.in: put + test-multiple-scanners-r under automake + +2002-04-12 07:59 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-multiple-scanners-nr/.cvsignore: we can ignore + Makefile.in now + +2002-04-12 07:59 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-multiple-scanners-nr/: Makefile.am, Makefile.in: put + test-multiple-scanners-nr under automake + +2002-04-11 07:44 Will Estes <wlestes@users.sourceforge.net> + + * tests/: test-c-cpp-nr/Makefile.am, test-c-cpp-r/Makefile.am: we + didn't need parser.y + +2002-04-11 07:43 Will Estes <wlestes@users.sourceforge.net> + + * TODO: work done on the test suite; remove relevant entries from + TODO + +2002-04-10 13:06 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-include-by-reentrant/: .cvsignore, Makefile.am, + Makefile.in: put test-include-by-reentrant under automake + +2002-04-09 09:52 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-include-by-buffer/.cvsignore: we have a Makefile.in + which we need to ignore + +2002-04-09 09:33 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-include-by-buffer/: Makefile.am, Makefile.in: + test-include-by-buffer now under automake control + +2002-04-09 09:32 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am: and we want LFLAGS in the rule to + make scanner.c as well + +2002-04-09 09:13 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-header-r/: .cvsignore, Makefile.am, Makefile.in: put + test-header-r under automake + +2002-04-09 09:12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-header-nr/.cvsignore: we now generate a Makefile.in + from automake; cvs should ignore it + +2002-04-09 09:12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-header-nr/Makefile.am: add dependencies for main.o and + scaner.h + +2002-04-09 09:11 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am: We may want to have LFLAGS readily + available + +2002-04-09 08:48 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-header-nr/: Makefile.am, Makefile.in: put + test-header-nr under automake + +2002-04-09 08:47 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am: oops, we need to clean objects too + +2002-04-09 08:35 Will Estes <wlestes@users.sourceforge.net> + + * tests/: TEMPLATE/Makefile.am, test-array-nr/Makefile.am, + test-array-r/Makefile.am, test-basic-nr/Makefile.am, + test-basic-r/Makefile.am, test-bison-yylloc/Makefile.am, + test-bison-yylval/Makefile.am, test-c-cpp-nr/Makefile.am, + test-c-cpp-r/Makefile.am: now that config.h lives in the top-level + directory, we need to tell the testsuite + +2002-04-08 11:06 Will Estes <wlestes@users.sourceforge.net> + + * tests/: test-array-nr/.cvsignore, test-array-r/.cvsignore, + test-basic-nr/.cvsignore, test-basic-r/.cvsignore, + test-bison-yylval/.cvsignore, test-c-cpp-nr/.cvsignore, + test-c-cpp-r/.cvsignore: we can ignore some Makefile.in + +2002-04-08 11:00 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, tests/TEMPLATE/Makefile.am: only one config file + header apparently; this will have consequences in the test suite + +2002-04-08 10:36 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-bison-yylval/: Makefile.am, Makefile.in: adding + automake support + +2002-04-08 10:26 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-bison-yylloc/: .cvsignore, Makefile.am: tuned + Makefile.am to build correctly; ignore Makefile.in now + +2002-04-08 09:22 Will Estes <wlestes@users.sourceforge.net> + + * tests/configure.in: test suite changes + +2002-04-08 09:16 Will Estes <wlestes@users.sourceforge.net> + + * tests/: TEMPLATE/.cvsignore, TEMPLATE/Makefile.am, + TEMPLATE/Makefile.in, test-array-nr/Makefile.am, + test-array-nr/Makefile.in, test-array-r/Makefile.am, + test-array-r/Makefile.in, test-basic-nr/Makefile.am, + test-basic-nr/Makefile.in, test-basic-r/Makefile.am, + test-basic-r/Makefile.in, test-bison-yylloc/Makefile.am, + test-bison-yylloc/Makefile.in, test-c-cpp-nr/Makefile.am, + test-c-cpp-nr/Makefile.in, test-c-cpp-r/Makefile.am, + test-c-cpp-r/Makefile.in: test suite changes + +2002-04-08 09:13 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh, configure.in, tests/.cvsignore, tests/Makefile.am, + tests/Makefile.in, tests/README, tests/configure.in, + tests/create-test, tests/create-test.pl: test suite changes + +2002-04-05 14:18 John Millaway <millaway@acm.org> + + * flex.texi: Corrected error in manual regarding return type for + yy_scan_{string,buffer,bytes}. + +2002-04-05 08:25 Will Estes <wlestes@users.sourceforge.net> + + * po/de.po: new german translations from the translation project + +2002-04-03 13:13 Will Estes <wlestes@users.sourceforge.net> + + * po/es.po: new spanish translations + +2002-04-01 11:47 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: DIST_SUBDIRS: new variable. we can build flex with + SUBDIRS and then build the distribution using DIST_SUBDIRS + +2002-04-01 08:03 Will Estes <wlestes@users.sourceforge.net> + + * main.c: fix typo in comment + +2002-03-31 12:17 John Millaway <millaway@acm.org> + + * main.c: Documented the header file kludge, (in anticipation of + buffering Section 1.) + +2002-03-30 22:26 John Millaway <millaway@acm.org> + + * flex.texi: Created appendix "Makefiles and Flex" in the manual. + +2002-03-29 19:12 John Millaway <millaway@acm.org> + + * flex.texi: updating manual. + +2002-03-29 17:32 Will Estes <wlestes@users.sourceforge.net> + + * po/POTFILES.in: we want parse.y, not parse.c + +2002-03-29 16:37 John Millaway <millaway@acm.org> + + * flex.texi: Indexing the manual (75% done). + +2002-03-29 16:08 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: unlisted intermediate flex/yacc-created files + +2002-03-29 15:59 Will Estes <wlestes@users.sourceforge.net> + + * TODO: millaway has done more work + +2002-03-29 15:03 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, configure.in: ok, one last touch up; users most + likely wont have help2man so we need to insure that's ok + +2002-03-29 14:55 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: fine tune flex.1 some more + +2002-03-29 14:36 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, configure.in: generalize the manpage a bit and tell + autofoo about help2man + +2002-03-29 12:18 Will Estes <wlestes@users.sourceforge.net> + + * po/da.po: new danish from translation project robot + +2002-03-28 16:02 John Millaway <millaway@acm.org> + + * flex.texi: Indexing the manual -- it's only half done. + +2002-03-28 15:57 John Millaway <millaway@acm.org> + + * flex.texi: flex manual now uses automake's versioning info. + +2002-03-28 14:55 John Millaway <millaway@acm.org> + + * README.cvs-snapshot: Mentioned requirements for gettext and + help2man. + +2002-03-28 14:52 John Millaway <millaway@acm.org> + + * Makefile.am, main.c: Output of `flex --version` now matches GNU + coding standards. Makefile.am now uses `help2man` to generate + flex.1 + +2002-03-27 08:58 Will Estes <wlestes@users.sourceforge.net> + + * TODO: millaway has done a lot on the TODO list; remove those + items that he has take care of + +2002-03-27 08:45 Will Estes <wlestes@users.sourceforge.net> + + * README.cvs-snapshot: edited millaway's initial draft + +2002-03-26 20:09 John Millaway <millaway@acm.org> + + * README.cvs-snapshot: Created file. + +2002-03-26 19:28 John Millaway <millaway@acm.org> + + * flex.texi: Fixed case of node names in flex.texi. + +2002-03-24 16:08 Will Estes <wlestes@users.sourceforge.net> + + * TODO: lex- and yacc- generated files + +2002-03-24 14:25 Will Estes <wlestes@users.sourceforge.net> + + * po/fr.po: new french + +2002-03-18 08:27 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: ending periods in news items removed; mention nounistd + options + +2002-03-18 08:00 Will Estes <wlestes@users.sourceforge.net> + + * po/sv.po: updated sweedish translations + +2002-03-18 08:00 Will Estes <wlestes@users.sourceforge.net> + + * po/de.po: german translation + +2002-03-18 02:50 John Millaway <millaway@acm.org> + + * flex.skl, flex.texi, main.c, options.c, options.h, scan.l: + Removed CFront 1.2 -specific code from skeleton, because CFront now + defines __cplusplus properly. Removed TurboC-specific code from + skeleton. Skeleton now includes proper C++ standard headers. + Relocated "unistd.h" code after user section 1 to allow user to + overrid it. New option "nounistd" to suppress unistd.h from being + included. + +2002-03-15 11:29 Will Estes <wlestes@users.sourceforge.net> + + * po/tr.po: new turkish translation + +2002-03-15 10:33 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: mention included translations + +2002-03-15 10:32 Will Estes <wlestes@users.sourceforge.net> + + * TODO: we've done the gettext thing, but sometime we should get + 0.11.1 + +2002-03-15 10:30 Will Estes <wlestes@users.sourceforge.net> + + * po/ca.po: new catalan translation + +2002-03-14 18:23 John Millaway <millaway@acm.org> + + * flex.texi: Added section on format of comments. + +2002-03-14 17:18 John Millaway <millaway@acm.org> + + * flex.texi: Split format chapter into sections. + +2002-03-14 16:51 John Millaway <millaway@acm.org> + + * flex.texi: Removed explicit pointers in node definitions. + +2002-03-14 16:31 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: unistd.h can be problematic + +2002-03-14 09:11 Will Estes <wlestes@users.sourceforge.net> + + * tests/README: editing changes to README + +2002-03-13 15:50 Will Estes <wlestes@users.sourceforge.net> + + * po/POTFILES.in: scan.l, not scan.c because gettext gets confused + +2002-03-13 12:36 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: gettext cruft + +2002-03-13 10:57 Will Estes <wlestes@users.sourceforge.net> + + * tests/descriptions: separate out test descriptions + +2002-03-13 09:34 Will Estes <wlestes@users.sourceforge.net> + + * po/LINGUAS: french and korean dont crash now + +2002-03-12 16:40 Will Estes <wlestes@users.sourceforge.net> + + * po/: fr.po, ko.po: remove duplicate messages as per advice from + Jordi Mallach <jordi@debian.org> + +2002-03-12 14:21 Will Estes <wlestes@users.sourceforge.net> + + * gettext.h: yes, more gettext cruft + +2002-03-12 14:12 Will Estes <wlestes@users.sourceforge.net> + + * m4/codeset.m4, m4/gettext.m4, m4/glibc21.m4, m4/iconv.m4, + m4/isc-posix.m4, m4/lcmessage.m4, m4/lib-ld.m4, m4/lib-link.m4, + m4/lib-prefix.m4, m4/progtest.m4, ABOUT-NLS, config.rpath: this is + gettext cruft + +2002-03-12 13:58 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: gettext and autofoo are now involved + +2002-03-12 13:29 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, autogen.sh, configure.in, flexdef.h, main.c: mostly, + changes for gettext + +2002-03-12 13:29 Will Estes <wlestes@users.sourceforge.net> + + * po/: ca.po, da.po, es.po, ru.po, sv.po, tr.po: these sure change + a lot + +2002-03-12 13:28 Will Estes <wlestes@users.sourceforge.net> + + * TODO: note about cvs documentation + +2002-03-12 13:02 Will Estes <wlestes@users.sourceforge.net> + + * po/LINGUAS: we now have turkish + +2002-03-12 13:01 Will Estes <wlestes@users.sourceforge.net> + + * po/tr.po: updated translations, i think + +2002-03-12 12:42 Will Estes <wlestes@users.sourceforge.net> + + * po/: ca.po, da.po, es.po, fr.po, ko.po, ru.po, sv.po, tr.po: ok, + maybe we do keep these things? + +2002-03-12 12:26 Will Estes <wlestes@users.sourceforge.net> + + * README-alpha: README-alpha for those bad-hair days + +2002-03-12 12:18 Will Estes <wlestes@users.sourceforge.net> + + * m4/: .cvsignore, Makefile.am: ok,now we kinda have a m4/ subdir + for gettext + +2002-03-12 12:13 Will Estes <wlestes@users.sourceforge.net> + + * po/: .cvsignore, LINGUAS, Makevars, POTFILES.in, da.po, es.po, + fr.po, ko.po, ru.po, sv.po: now, we have a po/ subdirectory for + gettext. i hope you're happy + +2002-03-12 12:06 Will Estes <wlestes@users.sourceforge.net> + + * po/ca.po: removing po files, maybe + +2002-03-12 12:01 Will Estes <wlestes@users.sourceforge.net> + + * tests/.cvsignore: ignore autom4te.cache + +2002-03-11 09:27 Will Estes <wlestes@users.sourceforge.net> + + * po/: ca.po, da.po, es.po, fr.po, ko.po, ru.po, sv.po: po files + from debian + +2002-03-08 10:00 Will Estes <wlestes@users.sourceforge.net> + + * TODO: add several notes about tasks which need doing; create a + new top-level entry for generic coding concerns (this is distinct + from specific API or other such issues) + +2002-03-06 16:15 Will Estes <wlestes@users.sourceforge.net> + + * README: eliminate to.do and faqs from the README file + +2002-03-06 16:13 Will Estes <wlestes@users.sourceforge.net> + + * TODO: more notes on tests/ + +2002-03-06 11:32 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: remove subdirectories from EXTRA_DIST; add a SUBDIRS + macro to handle examples/; clean up the dist-hook target + +2002-03-06 11:32 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: we want to generate Makefiles in some more + subdirectories; automake will like this + +2002-03-06 11:26 Will Estes <wlestes@users.sourceforge.net> + + * TODO: notes on subdirectories + +2002-03-05 09:49 Will Estes <wlestes@users.sourceforge.net> + + * examples/: .cvsignore, Makefile.am: now examples/ fits into + automake + +2002-03-05 09:48 Will Estes <wlestes@users.sourceforge.net> + + * examples/fastwc/: .cvsignore, Makefile.am: examples/fastwc now + fits into automake + +2002-03-05 09:47 Will Estes <wlestes@users.sourceforge.net> + + * examples/manual/: .cvsignore, Makefile.am, Makefile.examples, + README: examples/manual directory now fits into automake + +2002-03-05 09:45 Will Estes <wlestes@users.sourceforge.net> + + * examples/manual/Makefile: renamed Makefile to Makefile.examples + for automake's sake + +2002-03-04 10:58 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: add parse.c and scan.c to built_sources + +2002-02-24 17:19 John Millaway <millaway@acm.org> + + * Makefile.am: Removed CVS-specific code from 'dist-hook' target so + anybody with a copy of the tree can build a dist. + +2002-02-22 17:50 John Millaway <millaway@acm.org> + + * tests/Makefile.in: Converted test script to portable /bin/sh. + +2002-02-22 17:47 John Millaway <millaway@acm.org> + + * tests/test-bison-yylloc/Makefile.in: Added some spaces in shell + scripts for portability. + +2002-02-22 16:59 John Millaway <millaway@acm.org> + + * tests/create-test.pl: Fixed #! line for portability. + +2002-02-22 16:58 John Millaway <millaway@acm.org> + + * tests/test-bison-yylloc/Makefile.in: Fixed return status code on + bison-lloc test. + +2002-02-21 00:40 John Millaway <millaway@acm.org> + + * tests/create-test.pl: Added script to auto-create tests. Probably + overkill. + +2002-02-21 00:16 John Millaway <millaway@acm.org> + + * flex.skl: Fixed C++ #ifdef problem. Removed mistyped __CPLUSPLUS + macro. Removed THROW_NIL. Not sure where it came from in the first + place. + +2002-02-21 00:12 John Millaway <millaway@acm.org> + + * tests/: README, configure.in, TEMPLATE/Makefile.in, + test-c-cpp-nr/.cvsignore, test-c-cpp-nr/Makefile.in, + test-c-cpp-nr/scanner.l, test-c-cpp-nr/test.input, + test-c-cpp-r/.cvsignore, test-c-cpp-r/Makefile.in, + test-c-cpp-r/scanner.l, test-c-cpp-r/test.input: Added + test-c-cpp-nr and test-c-cpp-r. + +2002-02-16 15:26 John Millaway <millaway@acm.org> + + * flex.skl: Added missing #endif. + +2002-02-07 10:19 Will Estes <wlestes@users.sourceforge.net> + + * tests/: TEMPLATE/.cvsignore, test-array-nr/.cvsignore, + test-array-r/.cvsignore, test-basic-nr/.cvsignore, + test-basic-r/.cvsignore, test-bison-yylloc/.cvsignore, + test-bison-yylval/.cvsignore, test-header-nr/.cvsignore, + test-header-r/.cvsignore, test-include-by-buffer/.cvsignore, + test-include-by-reentrant/.cvsignore, + test-multiple-scanners-nr/.cvsignore, + test-multiple-scanners-r/.cvsignore, test-prefix-nr/.cvsignore, + test-prefix-r/.cvsignore, test-pthread/.cvsignore, + test-string-nr/.cvsignore, test-string-r/.cvsignore, + test-yyextra/.cvsignore: add OUTPUT to .cvsignore files in test + directories; it's also in the template directory + +2002-02-06 18:30 Will Estes <wlestes@users.sourceforge.net> + + * gen.c: fix interrupted reads and freads; from the debian package + maintainer + +2002-02-06 16:41 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi, flexdef.h, main.c, nfa.c: support large flex tables; + from debian package maintainer + +2002-01-29 08:48 Will Estes <wlestes@users.sourceforge.net> + + * tests/configure.in: add more output files to account for new + tests + +2002-01-03 15:19 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-array-nr/: .cvsignore, Makefile.in, scanner.l, + test.input: add this test + +2002-01-03 15:17 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-array-r/: .cvsignore, Makefile.in, scanner.l, + test.input: add this test suite + +2001-11-20 14:58 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl, main.c: millaway: Fixed yytext_ptr when using %array in + reentrant scanner + +2001-11-20 14:48 Will Estes <wlestes@users.sourceforge.net> + + * buf.c: oops, forgot this one line + +2001-11-19 01:39 John Millaway <millaway@acm.org> + + * tests/: test-array-nr/.cvsignore, test-array-r/.cvsignore: file + .cvsignore was initially added on branch flex-2-5-6-branch. + +2001-11-19 01:39 John Millaway <millaway@acm.org> + + * tests/: test-array-nr/Makefile.in, test-array-r/Makefile.in: file + Makefile.in was initially added on branch flex-2-5-6-branch. + +2001-11-19 01:39 John Millaway <millaway@acm.org> + + * tests/: test-array-nr/scanner.l, test-array-r/scanner.l: file + scanner.l was initially added on branch flex-2-5-6-branch. + +2001-11-19 01:39 John Millaway <millaway@acm.org> + + * tests/: test-array-nr/test.input, test-array-r/test.input: file + test.input was initially added on branch flex-2-5-6-branch. + +2001-11-14 18:09 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-header-r/: .cvsignore, Makefile.in, main.c, scanner.l, + test.input: and more fallout + +2001-11-14 16:13 Will Estes <wlestes@users.sourceforge.net> + + * TODO, flex.skl, flex.texi, flexdef.h, main.c, misc.c, + tests/README, tests/configure.in, tests/TEMPLATE/Makefile.in, + tests/test-basic-r/scanner.l, tests/test-bison-yylloc/.cvsignore, + tests/test-bison-yylloc/Makefile.in, + tests/test-bison-yylloc/parser.y, + tests/test-bison-yylloc/scanner.l, + tests/test-bison-yylval/.cvsignore, + tests/test-bison-yylval/Makefile.in, + tests/test-bison-yylval/parser.y, + tests/test-bison-yylval/scanner.l, + tests/test-include-by-reentrant/scanner.l, + tests/test-prefix-r/scanner.l, tests/test-pthread/scanner.l, + tests/test-string-r/scanner.l, tests/test-yyextra/scanner.l: more + from the same batch + +2001-11-14 16:12 Will Estes <wlestes@users.sourceforge.net> + + * tests/: test-bison-yylloc/main.c, test-bison-yylval/main.c, + test-header-nr/.cvsignore, test-header-nr/Makefile.in, + test-header-nr/main.c, test-header-nr/scanner.l, + test-header-nr/test.input, test-multiple-scanners-nr/.cvsignore, + test-multiple-scanners-nr/Makefile.in, + test-multiple-scanners-nr/main.c, + test-multiple-scanners-nr/scanner-1.l, + test-multiple-scanners-nr/scanner-2.l, + test-multiple-scanners-r/.cvsignore, + test-multiple-scanners-r/Makefile.in, + test-multiple-scanners-r/main.c, + test-multiple-scanners-r/scanner-1.l, + test-multiple-scanners-r/scanner-2.l: a big batch from millaway + +2001-10-28 01:49 John Millaway <millaway@acm.org> + + * tests/: test-bison-yylloc/main.c, test-bison-yylval/main.c: file + main.c was initially added on branch flex-2-5-6-branch. + +2001-10-26 23:59 John Millaway <millaway@acm.org> + + * tests/: test-multiple-scanners-nr/.cvsignore, + test-multiple-scanners-r/.cvsignore: file .cvsignore was initially + added on branch flex-2-5-6-branch. + +2001-10-26 23:59 John Millaway <millaway@acm.org> + + * tests/: test-multiple-scanners-nr/Makefile.in, + test-multiple-scanners-r/Makefile.in: file Makefile.in was + initially added on branch flex-2-5-6-branch. + +2001-10-26 23:59 John Millaway <millaway@acm.org> + + * tests/: test-multiple-scanners-nr/main.c, + test-multiple-scanners-r/main.c: file main.c was initially added on + branch flex-2-5-6-branch. + +2001-10-26 23:59 John Millaway <millaway@acm.org> + + * tests/: test-multiple-scanners-nr/scanner-1.l, + test-multiple-scanners-r/scanner-1.l: file scanner-1.l was + initially added on branch flex-2-5-6-branch. + +2001-10-26 23:59 John Millaway <millaway@acm.org> + + * tests/: test-multiple-scanners-nr/scanner-2.l, + test-multiple-scanners-r/scanner-2.l: file scanner-2.l was + initially added on branch flex-2-5-6-branch. + +2001-10-26 10:30 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: now NEWS has forgotten about the _r variables + +2001-10-26 08:59 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl, flex.texi, gen.c, main.c, + tests/test-bison-yylloc/scanner.l, + tests/test-bison-yylval/scanner.l, + tests/test-include-by-reentrant/scanner.l, + tests/test-prefix-nr/scanner.l, tests/test-pthread/scanner.l, + tests/test-string-r/scanner.l, tests/test-yyextra/scanner.l: + millaway simplified the reentrant api; here's the result + +2001-10-23 17:07 Will Estes <wlestes@users.sourceforge.net> + + * main.c, options.c, options.h: more from millaway + +2001-10-22 10:37 Will Estes <wlestes@users.sourceforge.net> + + * main.c, options.c, options.h: the last checkin was broken; + millaway fixed it + +2001-10-22 09:42 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi, flex.skl, gen.c, main.c, misc.c, options.h, scan.l, + scanopt.c, tests/README, tests/configure.in: phew, millaway's + latest batch + +2001-10-21 13:24 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: flex.skl should come up in C mode + +2001-10-21 13:23 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: apparently, isatty and c++ need help getting along + (from octave) + +2001-10-19 18:56 John Millaway <millaway@acm.org> + + * tests/: test-header-nr/.cvsignore, test-header-r/.cvsignore: file + .cvsignore was initially added on branch flex-2-5-6-branch. + +2001-10-19 18:56 John Millaway <millaway@acm.org> + + * tests/: test-header-nr/Makefile.in, test-header-r/Makefile.in: + file Makefile.in was initially added on branch flex-2-5-6-branch. + +2001-10-19 18:56 John Millaway <millaway@acm.org> + + * tests/: test-header-nr/main.c, test-header-r/main.c: file main.c + was initially added on branch flex-2-5-6-branch. + +2001-10-19 18:56 John Millaway <millaway@acm.org> + + * tests/: test-header-nr/scanner.l, test-header-r/scanner.l: file + scanner.l was initially added on branch flex-2-5-6-branch. + +2001-10-19 18:56 John Millaway <millaway@acm.org> + + * tests/: test-header-nr/test.input, test-header-r/test.input: file + test.input was initially added on branch flex-2-5-6-branch. + +2001-10-19 17:13 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: document new options and new option handling + +2001-10-19 16:58 Will Estes <wlestes@users.sourceforge.net> + + * TODO: tell emacs that TODO is a text/outline mode file + +2001-10-19 16:55 Will Estes <wlestes@users.sourceforge.net> + + * TODO: we have new long options; we need to document that + +2001-10-19 16:36 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: tell emacs that NEWS is text/outline mode + +2001-10-19 14:04 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: oops, lost a line somewhere in the merge process on + millaway's work + +2001-10-17 10:29 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, buf.c, flex.skl, flex.texi, flexdef.h, main.c, + misc.c, options.c, options.h, parse.y, scan.l, scanopt.c, + scanopt.h: merge latest batch of millaway's changes + +2001-10-15 13:26 John Millaway <millaway@acm.org> + + * buf.c: file buf.c was initially added on branch + flex-2-5-6-branch. + +2001-10-12 20:44 John Millaway <millaway@acm.org> + + * options.c: file options.c was initially added on branch + flex-2-5-6-branch. + +2001-10-12 20:44 John Millaway <millaway@acm.org> + + * options.h: file options.h was initially added on branch + flex-2-5-6-branch. + +2001-10-12 20:44 John Millaway <millaway@acm.org> + + * scanopt.c: file scanopt.c was initially added on branch + flex-2-5-6-branch. + +2001-10-12 20:44 John Millaway <millaway@acm.org> + + * scanopt.h: file scanopt.h was initially added on branch + flex-2-5-6-branch. + +2001-09-22 13:50 Will Estes <wlestes@users.sourceforge.net> + + * main.c: Fixed typo in options display + +2001-09-20 15:27 Will Estes <wlestes@users.sourceforge.net> + + * main.c: reentrant and non-reentrant scanners share the same + yywrap MACRO. millaway + +2001-09-20 12:32 Will Estes <wlestes@users.sourceforge.net> + + * TODO: clarify item on comments in lexical files + +2001-09-20 12:29 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, scan.l: now flex recognizes \r as an eol character + +2001-09-20 10:55 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: specify cvsroot so automake distcheck works + +2001-09-19 16:39 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: tex has lost its mind; we remove parentheses to + compensate + +2001-09-19 15:42 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: now that c++ is better supported, let's mention it as a + news item + +2001-09-19 15:37 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl, main.c, examples/fastwc/wc1.l, examples/fastwc/wc2.l, + examples/fastwc/wc3.l, examples/fastwc/wc4.l, + examples/fastwc/wc5.l: commit the backwash from the branch merges + +2001-09-19 15:19 Will Estes <wlestes@users.sourceforge.net> + + * FlexLexer.h, flex.skl, examples/testxxLexer.l: made preliminary + c++ fixes; the intent is to make it work with recent c++ compilers + +2001-08-26 12:14 Will Estes <wlestes@users.sourceforge.net> + + * main.c: remove argv_fixup; fix typo in error message; changes + from millaway's branch + +2001-08-24 11:54 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: mention no more c++ comments in c scanners + +2001-08-21 13:47 John Millaway <millaway@acm.org> + + * flex.skl: Changed // comments to /* */ comments in skeleton. + +2001-08-19 16:34 John Millaway <millaway@acm.org> + + * flex.texi: Changed @var to @code everywhere. + +2001-08-16 14:19 Will Estes <wlestes@users.sourceforge.net> + + * to.do/flex.rmail: more mail + +2001-08-16 11:03 Will Estes <wlestes@users.sourceforge.net> + + * TODO: the manual now has its own section; we're not adding + comments either + +2001-08-03 21:14 John Millaway <millaway@acm.org> + + * tests/: Makefile.in, README, TEMPLATE/Makefile.in, + test-basic-nr/Makefile.in, test-basic-r/Makefile.in, + test-bison-yylloc/Makefile.in, test-bison-yylval/Makefile.in, + test-include-by-buffer/Makefile.in, + test-include-by-reentrant/Makefile.in, test-prefix-nr/Makefile.in, + test-prefix-r/Makefile.in, test-pthread/Makefile.in, + test-string-nr/Makefile.in, test-string-r/Makefile.in, + test-yyextra/Makefile.in: Cleaned up the output of the tests. + +2001-08-03 16:43 Will Estes <wlestes@users.sourceforge.net> + + * TODO: note jason's thoughts on having a manpage + +2001-08-03 16:41 Will Estes <wlestes@users.sourceforge.net> + + * TODO: note millaway's assignment and tests to be under flex + license + +2001-08-01 17:14 John Millaway <millaway@acm.org> + + * tests/test-bison-yylval/scanner.l: Fixed semantics of test (the + success or failure of this test should be unaffected by this + change.) + +2001-08-01 16:13 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: fake automake into believing that ChangeLog already + exists + +2001-08-01 16:06 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: millaway needs to be covered in the ChangeLog + +2001-08-01 15:41 Will Estes <wlestes@users.sourceforge.net> + + * version.h: automake is supplying version info now so we just pick + it up + +2001-08-01 15:40 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: forgot braces on @copyright + +2001-08-01 15:40 John Millaway <millaway@acm.org> + + * flex.skl: Added missing argument to yy_flex_free. + +2001-08-01 10:05 Will Estes <wlestes@users.sourceforge.net> + + * AUTHORS: john millaway wrote the reentrant C support + +2001-08-01 10:05 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: add license node to the manual + +2001-08-01 09:48 Will Estes <wlestes@users.sourceforge.net> + + * TODO: c++ ideas + +2001-07-31 17:31 Will Estes <wlestes@users.sourceforge.net> + + * parse.y: error messages will now show up the way that emacs likes + them + +2001-07-31 15:56 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: oops, left in an extra backslash + +2001-07-31 15:05 Will Estes <wlestes@users.sourceforge.net> + + * TODO: flex.texi is here; clarify tests/ rewrite issue + +2001-07-31 15:04 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: hey, we have texinfo, not man + +2001-07-31 15:03 Will Estes <wlestes@users.sourceforge.net> + + * flex.1: no more manpage + +2001-07-31 15:01 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: remove flex.1 and rewrite the dist-hook so that we + pick up a couple more directories + +2001-07-31 14:15 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: the namual now compiles; hurray + +2001-07-31 06:13 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: first attempt at including the tests/ directory via + automake, dist-hook target added + +2001-07-31 06:12 Will Estes <wlestes@users.sourceforge.net> + + * tests/.cvsignore: ignore config.cache in tests/ directory + +2001-07-31 05:46 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: automake groks the ChangeLog now so we don't have to + remind the maintainer to remake it + +2001-07-30 17:06 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: more corrections to the manual; the end is in site + +2001-07-30 17:06 Will Estes <wlestes@users.sourceforge.net> + + * TODO: auto-generated backup? + +2001-07-27 17:12 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: today's tinkering on the manual + +2001-07-27 10:50 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: if we want flex.1 we have to say so in EXTRA_DIST + +2001-07-27 10:49 Will Estes <wlestes@users.sourceforge.net> + + * TODO: note future issues with flex.texi + +2001-07-27 10:34 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: include flex.1 as it's the only working + documentation for now + +2001-07-27 10:32 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: rearrange to work with automake on building the + ChangeLog + +2001-07-27 09:33 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: automake is unhappy if we specify the outfile + +2001-07-26 17:18 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: more conversions/corrections + +2001-07-26 10:04 Will Estes <wlestes@users.sourceforge.net> + + * README: we removed misc/ so we don't mention it any more + +2001-07-25 16:26 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: begin the manual conversion to texinfo; yes, it's + broken right now + +2001-07-25 16:25 Will Estes <wlestes@users.sourceforge.net> + + * AUTHORS, THANKS: copy in manual author and thanks info + +2001-07-25 10:46 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: how to fake the ChangeLog into showing up in the + distribution + +2001-07-25 09:07 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: add YFLAGS so parse.h gets made + +2001-07-24 16:23 Will Estes <wlestes@users.sourceforge.net> + + * examples/fastwc/: README, mywc.c, wc1.l, wc2.l, wc3.l, wc4.l, + wc5.l: re-add these files + +2001-07-24 15:11 Will Estes <wlestes@users.sourceforge.net> + + * TODO: reflect recent doings + +2001-07-24 15:07 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.in: what with automake, we don't need Makefile.in any + more + +2001-07-24 15:06 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: more rearranging for automake + +2001-07-24 15:04 Will Estes <wlestes@users.sourceforge.net> + + * to.do/flex.rmail: more mail came in + +2001-07-24 12:44 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: adjust to automake's idea of the world + +2001-07-24 12:43 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: add Vern's misc dependencies; noinst_SCRIPTS was + broken?; list a few last files to be included in the distribution + +2001-07-24 10:48 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: rearrange for better order; add automake support as a news + item + +2001-07-24 10:38 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: copyright notice on Makefile.am; document some -D + switches (are they still usable?) + +2001-07-24 10:37 Will Estes <wlestes@users.sourceforge.net> + + * TODO: add lex-replacement issue + +2001-07-24 06:13 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: add EXTRA_DIST + +2001-07-23 17:49 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: we need to do the same thing in each directory + +2001-07-23 17:25 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: introduce automake into the macro calls + +2001-07-23 17:06 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: add AUTOMAKE_OPTIONS, info_TEXINFOS, + include_HEADERS, noinst_HEADERS; it's libfl.a, not libflex.a + +2001-07-23 16:16 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: bin_PROGRAMS and lib_LIBRARIES + +2001-07-23 15:32 Will Estes <wlestes@users.sourceforge.net> + + * to.do/streams.mail: streams.mail has moved here + +2001-07-23 15:12 Will Estes <wlestes@users.sourceforge.net> + + * TODO: add xref for teximanual + +2001-07-19 10:27 Will Estes <wlestes@users.sourceforge.net> + + * flex.1: include typo/punctuation fixes from a patch submitted by + noon@cote-dazur.com (Fabrice Bauzac) + +2001-07-17 14:40 Will Estes <wlestes@users.sourceforge.net> + + * TODO: we want gettext + +2001-06-24 19:45 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: include c++ STD fixes from quanstro@quanstro.net + +2001-06-24 18:33 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl, gen.c: change some int types to size_t as per FreeBSD + 28364 from avn@any.ru + +2001-06-24 18:31 Will Estes <wlestes@users.sourceforge.net> + + * TODO: remove parse.[ch] from make clean target; repackage + distribution (not rework) + +2001-06-19 08:44 Will Estes <wlestes@users.sourceforge.net> + + * TODO: add memory api and reworking of flex.skl reworking + +2001-06-18 13:18 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: remove extraneous notice from flex.skl + +2001-06-18 08:49 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: patch memory leak as per millaway + +2001-06-17 15:23 Will Estes <wlestes@users.sourceforge.net> + + * to.do/flex.rmail: add vern's ok for copyright/license changes and + john's answer on line offsets + +2001-06-17 15:18 Will Estes <wlestes@users.sourceforge.net> + + * TODO: remove creation of .cvsignore files (it's done); add other + notes about the test suite + +2001-06-17 15:16 Will Estes <wlestes@users.sourceforge.net> + + * tests/: TEMPLATE/.cvsignore, test-basic-nr/.cvsignore, + test-basic-r/.cvsignore, test-bison-yylloc/.cvsignore, + test-bison-yylval/.cvsignore, test-include-by-buffer/.cvsignore, + test-include-by-reentrant/.cvsignore, test-prefix-nr/.cvsignore, + test-prefix-r/.cvsignore, test-pthread/.cvsignore, + test-string-nr/.cvsignore, test-string-r/.cvsignore, + test-yyextra/.cvsignore: adding .cvsignore files for existing + tests/ subdirectories + +2001-06-17 15:12 Will Estes <wlestes@users.sourceforge.net> + + * tests/README: reformat, say to add a description to this file and + mention what to do re .cvsignore + +2001-06-17 15:09 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/cvsignore: create template for .cvsignore + +2001-06-17 14:59 Will Estes <wlestes@users.sourceforge.net> + + * TODO: reorganize for logical reasons; test suite now seems to run + out of the box + +2001-06-17 14:28 Will Estes <wlestes@users.sourceforge.net> + + * tests/.cvsignore: we dont want the Makefile either + +2001-06-17 13:40 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-prefix-nr/test.input: test.input was supposed to be + here + +2001-06-17 13:36 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-prefix-r/test.input: test.input was supposed to be + here + +2001-06-17 13:18 Will Estes <wlestes@users.sourceforge.net> + + * tests/.cvsignore: add autoconf legacy files to be ignored + +2001-06-17 13:11 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: clarify usage instructions; prepare tests/ as well + +2001-06-17 13:07 Will Estes <wlestes@users.sourceforge.net> + + * tests/.cvsignore: . cvsignore for tests/ subdirectory + +2001-06-17 13:01 Will Estes <wlestes@users.sourceforge.net> + + * FlexLexer.h: tell emacs that FlexLexer.h is c++ + +2001-06-17 13:00 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: tell emacs scan.l is in C mode + +2001-06-17 12:59 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: added punctuation + +2001-06-17 12:17 Will Estes <wlestes@users.sourceforge.net> + + * FlexLexer.h, Makefile.in, README, RoadMap, autogen.sh, ccl.c, + configure.in, dfa.c, ecs.c, flex.1, flex.skl, flexdef.h, gen.c, + libmain.c, libyywrap.c, main.c, misc.c, mkskel.sh, nfa.c, parse.y, + scan.l, sym.c, tblcmp.c, yylex.c: change copyright/license notices + as per Vern's response to Theo + +2001-06-15 16:22 Will Estes <wlestes@users.sourceforge.net> + + * to.do/flex.rmail: add bill fenlason's emails + +2001-06-15 16:21 Will Estes <wlestes@users.sourceforge.net> + + * COPYING: make changes as per Theo De Raadt; remove tabs + +2001-06-08 08:42 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: save errno as per Theo de Raadt + +2001-06-07 08:44 Will Estes <wlestes@users.sourceforge.net> + + * flex.1: correct hyphenation as per openbsd tree + +2001-06-05 16:39 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.in, configure.in: change references to TESTS/ to tests/ + to account for the directory name changes + +2001-05-27 15:22 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl, gen.c: commit john millaway's YY_G wrapper corrections + +2001-05-21 17:44 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.in: remove || exit calls + +2001-05-21 15:50 Will Estes <wlestes@users.sourceforge.net> + + * gen.c: complete john millaway's reentrant patch + +2001-05-21 13:23 Will Estes <wlestes@users.sourceforge.net> + + * to.do/flex.rmail: more flex messages in the queue + +2001-05-18 17:25 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl, flexdef.h, gen.c, main.c, nfa.c, scan.l: john + millaway's reentrancy patch + +2001-05-18 16:30 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.in: remove || exit from testing loop + +2001-05-18 16:27 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.in: tell make about the tests directory and its + associated targets + +2001-05-18 16:26 Will Estes <wlestes@users.sourceforge.net> + + * TODO: rethink the todo list + +2001-05-18 16:13 Will Estes <wlestes@users.sourceforge.net> + + * flex.1: describe reentrant api changes + +2001-05-18 16:10 Will Estes <wlestes@users.sourceforge.net> + + * TODO: mention work needed for tests/ + +2001-05-18 16:09 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: tell auto* about the test directory + +2001-05-18 16:04 Will Estes <wlestes@users.sourceforge.net> + + * README: make punctuation uniform, mention the new tests/ + directory + +2001-05-18 16:02 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: reformat items; cut out old items and move them to ONEWS + +2001-05-18 16:01 Will Estes <wlestes@users.sourceforge.net> + + * ONEWS: move old NEWS items to ONEWS + +2001-05-18 13:22 Will Estes <wlestes@users.sourceforge.net> + + * tests/: Makefile.in, README, configure.in, TEMPLATE/Makefile.in, + TEMPLATE/parser.y, TEMPLATE/scanner.l, TEMPLATE/test.input, + test-basic-nr/Makefile.in, test-basic-nr/scanner.l, + test-basic-nr/test.input, test-basic-r/Makefile.in, + test-basic-r/scanner.l, test-basic-r/test.input, + test-bison-yylloc/Makefile.in, test-bison-yylloc/parser.y, + test-bison-yylloc/scanner.l, test-bison-yylloc/test.input, + test-bison-yylval/Makefile.in, test-bison-yylval/parser.y, + test-bison-yylval/scanner.l, test-bison-yylval/test.input, + test-include-by-buffer/Makefile.in, + test-include-by-buffer/scanner.l, + test-include-by-buffer/test-1.input, + test-include-by-buffer/test-2.input, + test-include-by-buffer/test-3.input, + test-include-by-reentrant/Makefile.in, + test-include-by-reentrant/scanner.l, + test-include-by-reentrant/test-1.input, + test-include-by-reentrant/test-2.input, + test-include-by-reentrant/test-3.input, test-prefix-nr/Makefile.in, + test-prefix-nr/README, test-prefix-nr/scanner.l, + test-prefix-r/Makefile.in, test-prefix-r/README, + test-prefix-r/scanner.l, test-pthread/Makefile.in, + test-pthread/scanner.l, test-pthread/test-1.input, + test-pthread/test-2.input, test-pthread/test-3.input, + test-pthread/test-4.input, test-pthread/test-5.input, + test-string-nr/Makefile.in, test-string-nr/scanner.l, + test-string-r/Makefile.in, test-string-r/scanner.l, + test-yyextra/Makefile.in, test-yyextra/scanner.l, + test-yyextra/test.input: add john millaway's test directory + +2001-05-04 16:04 Will Estes <wlestes@users.sourceforge.net> + + * to.do/flex.rmail: more mail in flex.rmail + +2001-05-03 15:05 Will Estes <wlestes@users.sourceforge.net> + + * FlexLexer.h, ccl.c, dfa.c, ecs.c, flex.skl, flexdef.h, gen.c, + libmain.c, libyywrap.c, main.c, misc.c, nfa.c, parse.y, scan.l, + sym.c, tblcmp.c, yylex.c: remove extraneous rcs keywords + +2001-05-03 14:54 Will Estes <wlestes@users.sourceforge.net> + + * README: mention RoadMap + +2001-05-01 16:47 Will Estes <wlestes@users.sourceforge.net> + + * examples/README, examples/debflex.awk, examples/testxxLexer.l, + examples/manual/ChangeLog, examples/manual/Makefile, + examples/manual/README, examples/manual/cat.lex, + examples/manual/dates.lex, examples/manual/datetest.dat, + examples/manual/eof_rules.lex, examples/manual/eof_test01.txt, + examples/manual/eof_test02.txt, examples/manual/eof_test03.txt, + examples/manual/expr.lex, examples/manual/expr.y, + examples/manual/front.lex, examples/manual/front.y, + examples/manual/j2t.lex, examples/manual/myname.lex, + examples/manual/myname.txt, examples/manual/myname2.lex, + examples/manual/numbers.lex, examples/manual/pas_include.lex, + examples/manual/pascal.lex, examples/manual/reject.lex, + examples/manual/replace.lex, examples/manual/string1.lex, + examples/manual/string2.lex, examples/manual/strtest.dat, + examples/manual/unput.lex, examples/manual/user_act.lex, + examples/manual/userinit.lex, examples/manual/wc.lex, + examples/manual/yymore.lex, examples/manual/yymore2.lex, + examples/manual/yymoretest.dat, to.do/README, to.do/Wilhelms.todo, + to.do/Wish-List, to.do/flex.rmail, to.do/unicode/FlexLexer.h, + to.do/unicode/ccl.c, to.do/unicode/changes.txt, + to.do/unicode/ecs.c, to.do/unicode/flex.1, to.do/unicode/flex.skl, + to.do/unicode/flexdef.h, to.do/unicode/gen.c, to.do/unicode/main.c, + to.do/unicode/misc.c, to.do/unicode/scan.l, to.do/unicode/tblcmp.c: + adding the rest of vern's files + +2001-05-01 16:36 Will Estes <wlestes@users.sourceforge.net> + + * README: mention misc/ directory + +2001-05-01 16:32 Will Estes <wlestes@users.sourceforge.net> + + * version.h: version is 2.5.5b + +2001-05-01 16:30 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.in: remove header from top; add rule to generate + initscan.c just in case + +2001-05-01 16:28 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: dont check for initscan.c; check for scan.l instead + +2001-05-01 15:12 Will Estes <wlestes@users.sourceforge.net> + + * RoadMap: list of source files + +2001-05-01 15:10 Will Estes <wlestes@users.sourceforge.net> + + * README: rewrite README to reflect changes in layout of + directories + +2001-05-01 15:08 Will Estes <wlestes@users.sourceforge.net> + + * AUTHORS, THANKS, TODO: initial attempt at the files + +2001-05-01 14:03 Will Estes <wlestes@users.sourceforge.net> + + * COPYING: add 2001 copyright notice + +2001-05-01 13:38 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: initial attempt at a bootstrap script for developers + +2001-05-01 13:21 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: texinfo manual, old contributed version + +2000-08-21 12:39 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: fixed some bugs in examples of [[:...:]] ccls + +2000-08-21 12:39 Vern Paxson <vern@ee.lbl.gov> + + * version.h: version shipped to Dick King + +2000-08-21 12:39 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: explicit include of iostream.h + +2000-08-21 12:38 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: if a newline is seen in <ACTION_STRING>, assume it + terminates the string. + +2000-08-21 12:38 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, sym.c: moved symbol table definitions from flexdef.h + into sym.c + +2000-08-21 12:37 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: fixed underallocation for accset + +1997-06-27 15:36 Vern Paxson <vern@ee.lbl.gov> + + * COPYING: revised for rms + +1997-06-23 15:48 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: fixed memory leak + +1997-06-23 15:48 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: input() doesn't destroy yytext + +1997-06-23 15:48 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: wrapped with extern "C++" + +1996-12-13 06:22 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: use delete [] for yy_state_buf + +1996-10-29 09:43 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: fixed %option noinput + +1996-10-29 09:39 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: free(char*) fix ... Sigh ... + +1996-10-11 11:33 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: bug fix for yymore()/yylineno interaction + +1996-10-11 11:13 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: fixed memory leak + +1996-09-10 13:10 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: release 2.5.4 + +1996-09-10 12:59 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: more stuff for distclean + +1996-09-10 12:58 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: "str" -> "yy_str" + +1996-09-10 12:58 Vern Paxson <vern@ee.lbl.gov> + + * version.h: 2.5.4 + +1996-07-02 12:35 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: (attempted) fix for input() crossing a file boundary + +1996-05-29 08:25 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: don't do Acorn diffs + +1996-05-29 08:15 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: some minor additions for 2.5.3 + +1996-05-29 08:02 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.5.3 + +1996-05-29 07:59 Vern Paxson <vern@ee.lbl.gov> + + * version.h: 2.5.3 + +1996-05-25 17:02 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: initialize yy_more_offset etc. for yyFlexLexer class + +1996-05-25 16:54 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: niggling cosmetic tweak + +1996-05-25 16:44 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: bug fixes for yymore (especially with %array) + +1996-05-25 16:43 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: yymore + %array tweaks + +1996-05-25 16:43 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: added yy_{,prev_}more_offset + +1996-05-25 16:42 Vern Paxson <vern@ee.lbl.gov> + + * main.c: removed decl of unused library function + +1996-05-25 11:26 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: snapshot of cscope yymore fixes, prior to switching + yymore-on-%array approach + +1995-12-18 09:20 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: don't stack states on NUL-transitions that are jams + +1995-09-27 08:47 Vern Paxson <vern@ee.lbl.gov> + + * libmain.c: fixed re Esmond Pitt's ancient suggestion + +1995-04-28 07:39 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: ANSI C / Solaris tweak + +1995-04-24 09:26 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: credits + +1995-04-24 09:26 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: multiple FlexLexer.h includes + +1995-04-24 09:25 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: fix multiple inclusions + +1995-04-24 08:17 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: lint tweak + +1995-04-24 07:39 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: typo fixed + +1995-04-24 06:49 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: credits update + +1995-04-24 06:48 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: (char*) cast for realloc + +1995-04-24 06:46 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: (char*) tweak + +1995-04-21 07:53 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: VMS update for 2.5.2 + +1995-04-21 07:53 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: clarify when 8-bit scanners are created by default, + vs. 7-bit + +1995-04-21 07:51 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: reworked alloca() chud, from Francois + +1995-04-20 09:57 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, version.h: 2.5.2 + +1995-04-20 09:57 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: 2.5.2 update + +1995-04-20 09:53 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c, main.c: const -> yyconst + +1995-04-20 09:34 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: fixed some old libfl.a references + +1995-04-20 09:09 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: some (but not all) of Francois' tweaks + +1995-04-20 09:08 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: tweaks from Francois + +1995-04-20 08:46 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: yy_delete_buffer allows nil buffer pointer + +1995-04-20 08:43 Vern Paxson <vern@ee.lbl.gov> + + * main.c: do_stdinit now defaults to false + +1995-04-20 08:43 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: remove first default for yylex(new_in, new_out) + +1995-04-20 08:42 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: rearrange some definitions; fix YY_NO_UNPUT + +1995-04-20 08:42 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: more alloca() bullshit + +1995-04-20 07:35 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: octal escape sequence must have just digits 0-7 + +1995-04-20 07:35 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: '-' means stdin octal escape sequence must just be digits + 0-7 + +1995-04-20 07:34 Vern Paxson <vern@ee.lbl.gov> + + * main.c: -- terminates options + +1995-04-20 07:17 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: added dataflush() prototype + +1995-04-20 07:17 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: move dataflush, otoi prototypes into flexdef.h + +1995-04-20 07:17 Vern Paxson <vern@ee.lbl.gov> + + * gen.c, flex.skl: const -> yyconst + +1995-04-20 06:55 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: fixed bug in needing yy_cp for -Cf w/ backing up + +1995-03-28 05:29 Vern Paxson <vern@ee.lbl.gov> + + * flex.1, README: Stan Adermann credit + +1995-03-27 09:38 Vern Paxson <vern@ee.lbl.gov> + + * README: beta-tester update + +1995-03-27 09:38 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, version.h: 2.5.1 + +1995-03-27 09:37 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: update date for 2.5.1 release, some feedbacker credits + +1995-03-27 09:36 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: fixed lint problem with declaring yy_cp unnecessarily + +1995-03-27 09:35 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: {}'s around full-table initializations + +1995-03-21 09:35 Vern Paxson <vern@ee.lbl.gov> + + * README: for version 2.5 + +1995-03-21 09:13 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: added note regarding yylineno should be maintained on a + per-buffer basis + +1995-03-21 09:12 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: new C++ member functions + +1995-03-21 08:44 Vern Paxson <vern@ee.lbl.gov> + + * flex.1, NEWS: 2.5.0.8 update + +1995-03-21 08:44 Vern Paxson <vern@ee.lbl.gov> + + * main.c: rename yylineno if -P + +1995-03-20 09:03 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: do_yylineno MARKER_DIFFERENCE depends on MAXIMUM_MNS + +1995-03-20 09:02 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: removed redundant skel.c from DISTFILES + +1995-03-20 09:02 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: debug(), setdebug(), lineno() + +1995-03-20 09:02 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: %option yylineno support + +1995-03-20 09:02 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: read up to newline for interactive reads, rather than one + char + +1995-03-20 09:01 Vern Paxson <vern@ee.lbl.gov> + + * scan.l, main.c: added %option yylineno + +1995-03-18 04:27 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: added do_yylineno + +1995-03-06 10:53 Vern Paxson <vern@ee.lbl.gov> + + * flex.1, NEWS: 2.5.0.7 + +1995-03-05 16:37 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: realclean -> maintainer-clean + +1995-03-05 16:35 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added yy_flush_buffer + +1995-03-05 16:35 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: added yy_flush_buffer + +1995-03-05 16:35 Vern Paxson <vern@ee.lbl.gov> + + * main.c: prefix support for yy_flush_buffer + +1995-03-05 15:37 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: added %option yyclass + +1995-03-05 15:37 Vern Paxson <vern@ee.lbl.gov> + + * scan.l, flexdef.h, main.c: added yyclass + +1995-03-05 11:50 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: Added switch_streams + +1995-03-05 11:50 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: added switch_streams + +1995-03-05 11:37 Vern Paxson <vern@ee.lbl.gov> + + * main.c: don't rename yy_flex_debug for C++ + +1995-03-05 11:37 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: yy_flex_debug extern only if not C++ + +1995-03-05 11:37 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: added yy_flex_debug member variable + +1995-03-05 11:36 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: yyFlexLexer initialization of yy_flex_debug + +1995-03-04 13:06 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, main.c: VMS POSIX stuff + +1995-03-04 11:36 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: moved position of yy_init = 0 + +1995-03-04 11:15 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: added YY_EXIT_FAILURE + +1995-03-04 11:14 Vern Paxson <vern@ee.lbl.gov> + + * main.c: removed VMS-specific exit + +1995-03-04 11:09 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, dfa.c, yylex.c, sym.c, scan.l, nfa.c, misc.c, gen.c, + main.c: internationalization aids + +1995-03-04 11:07 Vern Paxson <vern@ee.lbl.gov> + + * main.c: do yy_flex_debug prefix for both C++ and C + +1995-02-06 04:38 Vern Paxson <vern@ee.lbl.gov> + + * main.c: fixed program_name tweak again + +1995-01-11 06:00 Vern Paxson <vern@ee.lbl.gov> + + * main.c: oops, fixed program_name tweak + +1995-01-11 05:53 Vern Paxson <vern@ee.lbl.gov> + + * main.c: program_name is "flex" if argv[0] nil + +1995-01-10 05:43 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.5.0.5 + +1995-01-10 05:43 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Documented YY_NUM_RULES + +1995-01-10 05:42 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: added formatted man page to MISC + +1995-01-10 05:42 Vern Paxson <vern@ee.lbl.gov> + + * main.c: help messages to stdout + +1995-01-09 17:05 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Added YY_NUM_RULES + +1995-01-09 16:02 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: better fix for #pragma problem + +1995-01-09 16:02 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: better fix for #pragma portability problem + +1995-01-09 07:54 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: "# line" -> #line + +1995-01-09 07:41 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, flexdef.h: comment out Turbo C #pragma's + +1995-01-09 07:35 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: reset linenum on new file + +1995-01-09 07:13 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: isatty() extern + +1995-01-09 07:13 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, flex.1: 2.5.0.4 + +1995-01-09 07:12 Vern Paxson <vern@ee.lbl.gov> + + * main.c: long options, VMS tweaks + +1995-01-09 07:12 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added parse.c, parse.h for dist MISC directory + +1995-01-09 07:11 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: some "const" cleansing + +1995-01-09 07:11 Vern Paxson <vern@ee.lbl.gov> + + * mkskel.sh: skel[] is now const + +1995-01-09 07:11 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: some const cleansing + +1995-01-09 07:10 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: #line in section 1 + +1995-01-05 17:04 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: preen + +1994-12-29 10:58 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: config.h from conf.in + +1994-12-29 10:58 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: for VMS, delete -> remove + +1994-12-29 10:57 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: config.h.in -> conf.in rm config.h on distclean + +1994-12-29 10:57 Vern Paxson <vern@ee.lbl.gov> + + * main.c: stdinit tweaks + +1994-12-29 10:48 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: added nostdinit + +1994-12-28 13:47 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: added MS-DOS note for 2.5.0.2 + +1994-12-28 13:16 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: typos, tweaks + +1994-12-28 10:40 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: removed flexdoc + +1994-12-28 10:35 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: flexdoc/flex merge + +1994-12-28 08:50 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: typos + +1994-12-28 08:45 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: typo + +1994-12-28 08:42 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: 2.5 update + +1994-12-28 08:41 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.5.0.2 + +1994-12-28 06:55 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: fixed sense of %option main implying %option noyywrap + +1994-12-28 06:54 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: YY_FLEX_{MAJOR,MINOR}_VERSION fixed bug in unput + trashing yytext even with %array + +1994-12-17 17:08 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: prior to 2.5 update + +1994-12-17 13:41 Vern Paxson <vern@ee.lbl.gov> + + * main.c: C++/-P fixes + +1994-12-17 13:40 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: -P fixes constructor, destructor moved to flex.skl + +1994-12-17 13:40 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: YY_SKIP_YYWRAP yyFlexLexer constructor, destructor + +1994-12-15 09:34 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: formatting + +1994-12-15 09:30 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: fixed bug in adjusting yytext before backing up + +1994-12-10 17:24 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: switched scanner itself over to [:xxx:] + +1994-12-10 12:53 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: added YY_FLEX_VERSION + +1994-12-10 12:53 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed CCL-match pattern for [:whatever:] + +1994-12-10 12:52 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: treat [:upper:] as [:lower:] if -i + +1994-12-06 16:59 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.5.0.1 + +1994-12-06 16:28 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, gen.c: input() maintains BOL + +1994-12-06 16:20 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: check size of buffer in yy_scan_buffer + +1994-12-06 16:08 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: added %option main, fixed missing %* + +1994-12-06 16:08 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: added ccl exprs + +1994-12-06 16:07 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: added ccl exprs, %option main + +1994-12-06 16:07 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: added %options, ccl exprs + +1994-12-05 16:18 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: undid previous change + +1994-12-04 10:30 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Makefile.in from srcdir + +1994-12-04 04:14 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: added skel.c to DISTFILES + +1994-12-04 03:56 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: added YYSTATE alias + +1994-12-04 03:28 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: NL is now \r?\n + +1994-12-04 03:28 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: use cerr for C++ diagnostics + +1994-12-03 15:16 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: undid YY_UNIX_NEWLINE + +1994-12-03 08:44 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: STDC_HEADERS to check for stdlib + +1994-12-03 08:43 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: AC_STDC_HEADERS -> AC_HEADER_STDC + +1994-12-03 08:43 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: \n -> '\012' + +1994-12-03 07:20 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added YY_UNIX_NEWLINE + +1994-12-03 06:29 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: BOL changes + +1994-12-03 06:29 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: fixed bug with caseins but not ecs + +1994-12-03 06:27 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: BOL changes some casts for Turbo C + +1994-12-03 06:27 Vern Paxson <vern@ee.lbl.gov> + + * main.c: messages identify filenames + +1994-12-03 06:26 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Increase slowly if realloc double overflows + +1994-12-03 06:26 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: YY_RULE_SETUP + +1994-12-03 06:26 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Added yy_XX_state %option's Added yy_set_bol + +1994-11-29 11:14 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: don't remove ~ files + +1994-11-24 11:50 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: get CFLAGS from autoconf + +1994-11-24 11:42 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c, flex.skl, flexdef.h, gen.c, misc.c, parse.y, scan.l, + sym.c: Brian Madsen's tweaks for Borland + +1994-11-24 10:50 Vern Paxson <vern@ee.lbl.gov> + + * version.h: 2.5.0 + +1994-11-24 10:50 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added do_stdinit + +1994-11-24 10:49 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: Added yy_delete_buffer() in destructor + +1994-11-24 10:48 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added yy_set_interactive, YY_ALWAYS_INTERACTIVE, + YY_NEVER_INTERACTIVE, YY_NO_INPUT, YY_NO_UNPUT, YY_NO_*_STATE + +1994-11-24 10:48 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Added do_stdinit, Think C hacks + +1994-11-24 10:47 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Added %options for input, always-interactive, + never-interactive, yy_scan_{buffer,bytes,string} + +1994-11-05 12:13 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: size_t #ifdef's for not compiling some statics + +1994-11-05 12:13 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: $(FLEX) config.h + +1994-11-05 12:11 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: config.h, size_t, malloc.h, sys/types.h + +1994-11-05 12:10 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: config.h, size_t + +1994-11-05 12:10 Vern Paxson <vern@ee.lbl.gov> + + * main.c: yywrap option, no stdin/out init for VMS, mundane tweaks + +1994-11-05 12:09 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: alloca, lint tweaks + +1994-11-05 12:09 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: %option yywrap size_t tweaks + +1994-11-05 12:08 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: size_t tweaks + +1994-11-05 12:08 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: size_t, STDC tweaks + +1994-11-05 10:17 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added yy_scan_{buffer,bytes,string}, plus tweaks + +1994-10-12 17:13 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: made stack code conditional on "stack" option + +1994-10-12 17:13 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: added use of "stack" %option + +1994-08-03 07:38 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Fixed fencepost in call to yy_flex_strncpy + +1994-07-25 18:05 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: yy_eof_status -> yy_buffer_status + +1994-07-25 17:22 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: yy_flex_strcpy -> yy_flex_strncpy minor prototype tweak + +1994-07-25 17:21 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Bug fix for matching NUL's at end of token when + interactive. yy_flex_strcpy -> yy_flex_strncpy + +1994-07-25 16:49 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: No YY_USER_ACTION if continued action + +1994-03-16 07:18 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added fix for 8-bit chars returned by input() + +1994-03-16 07:09 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Move definition of yy_flex_strcpy to come after #define + of yytext_ptr + +1994-01-08 05:17 Vern Paxson <vern@ee.lbl.gov> + + * mkskel.sh: flex.skel -> flex.skl + +1994-01-08 05:13 Vern Paxson <vern@ee.lbl.gov> + + * mkskel.sh: Initial revision + +1993-12-29 12:09 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Fixed scan.c target so "make" detects flex failure + +1993-12-27 10:14 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Added %option's + +1993-12-27 09:57 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Nuked FLEX_FLAGS that are now done using %option + +1993-12-27 09:41 Vern Paxson <vern@ee.lbl.gov> + + * parse.y, scan.l: %option + +1993-12-27 09:41 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Reworked for %option + +1993-12-27 09:40 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added "unspecified", globals for %option + +1993-12-27 09:40 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: start condition #define's go to action file + +1993-12-27 09:40 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added action_define() + +1993-12-27 05:59 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Minor consolidation using scon scopes etc + +1993-12-27 05:36 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Modified to use scon scopes + +1993-12-27 05:20 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: indented rules + +1993-12-26 17:22 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Added scon_stk stuff, format_warn + +1993-12-26 17:22 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added format_warn + +1993-12-26 10:04 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Working checkpoint prior to adding <scon>{ stuff + +1993-12-26 10:04 Vern Paxson <vern@ee.lbl.gov> + + * main.c, flexdef.h: Added in_rule, deleted actvsc + +1993-12-26 10:03 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added doubling of '\'s in filenames + +1993-12-26 10:02 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Added in_rule, doing_rule_action + +1993-12-26 10:02 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: Removed actvsc + +1993-12-23 15:44 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: -ooutput #line directives credits + +1993-12-23 15:43 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Fixsed sense of test for %array + +1993-12-23 15:42 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.5.0 snapshot for Craig + +1993-12-23 15:41 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Added beginnings of <SCON>{ ... } + +1993-12-23 15:41 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Simplified scanning {}'s + +1993-12-20 04:41 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added <stdlib.h> + +1993-12-17 05:31 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: prototypes for alloc/string routines + +1993-12-17 05:06 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: alloc, string routines internal + +1993-12-17 05:05 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Nuked lib{string,alloc}.c, added dependency of + yylex.o on parse.h + +1993-12-17 05:05 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: Check for string.h + +1993-12-17 05:04 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Use autoconf for string/strings.h yy_flex_XXX -> + flex_XXX + +1993-12-17 05:04 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Added flex_XXX -> yy_flex_XXX wrappers + +1993-12-17 05:04 Vern Paxson <vern@ee.lbl.gov> + + * sym.c, misc.c, dfa.c: yy_flex_XXX -> flex_XXX + +1993-12-17 05:03 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: No more WHITESPACE token + +1993-12-16 15:46 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, FlexLexer.h: Added yy_top_state() + +1993-12-16 15:44 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: simplified comment-scanning using push/pop states + +1993-12-16 15:44 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: removed crufty WHITESPACE token, some uses of '\n' token + +1993-12-15 05:23 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: start stack, extern "C++" moved + +1993-12-15 05:23 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: Bug fix for -CF + +1993-12-15 05:23 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, misc.c: alloc routines take unsigned + +1993-12-15 05:23 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: start-state stacks, alloc routines take unsigned + +1993-12-15 05:08 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, misc.c: bracket -CF table elements + +1993-12-13 07:33 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Do #bytes computation in {re,}allocate_array() only once + +1993-12-11 12:06 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, gen.c, main.c, misc.c, scan.l, flex.skl, sym.c: + yy_str*() -> str*() + +1993-12-11 09:40 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in, dfa.c, flexdef.h, gen.c, main.c, misc.c, nfa.c, + parse.y, scan.l, sym.c: -o option + +1993-12-11 06:09 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: lint tweak + +1993-12-11 06:00 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Expanded on extern "C++" news item + +1993-12-11 05:58 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.4.5 + +1993-12-11 05:56 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added yy_fill_buffer + +1993-12-11 05:56 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: is_interactive -> yy_is_interactive + +1993-12-11 05:34 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Updated credits + +1993-12-11 05:33 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Fixed typo in "uninstall" target + +1993-12-11 05:33 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Updated comment regarding 0-based vs. 1-based arrays for + -CF. + +1993-12-11 05:30 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: Initialize dfaacc[0] for -CF representation Fixed minor + memory leak + +1993-12-11 05:29 Vern Paxson <vern@ee.lbl.gov> + + * main.c: #include "FlexLexer.h" -> <FlexLexer.h> + +1993-12-11 05:27 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: Added extern "C++" wrapper + +1993-12-09 08:58 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Detect REJECT etc. before generating YY_USES_REJECT! + +1993-12-09 08:58 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Fixed bug in interactive reads where char is unsigned + +1993-12-09 08:57 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Fixed bug in treating '$' as variable trailing context + +1993-12-09 08:57 Vern Paxson <vern@ee.lbl.gov> + + * version.h: 2.4.5 + +1993-12-07 08:08 Vern Paxson <vern@ee.lbl.gov> + + * README: pretester update + +1993-12-07 06:16 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.4.4 + +1993-12-07 06:15 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: LexError(), C++ experiment warning, credits + +1993-12-07 06:11 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed 8-bit bug + +1993-12-07 06:10 Vern Paxson <vern@ee.lbl.gov> + + * gen.c, flex.skl: Fixed nasty 8-bit bugs + +1993-12-07 05:18 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c, ecs.c, flexdef.h, gen.c, main.c, nfa.c, tblcmp.c: + {min,max,abs} -> {MIN,MAX,ABS} + +1993-12-07 05:11 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h, flex.skl: Support for yyFlexLexer::LexerError + +1993-12-06 04:43 Vern Paxson <vern@ee.lbl.gov> + + * version.h: 2.4.4 + +1993-12-05 12:11 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: credits update + +1993-12-05 12:08 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: very minor "install" tweaks + +1993-12-05 12:07 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, nfa.c: YY_USER_ACTION generated now for each case in + action switch + +1993-12-04 17:02 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Fixed bug in pointing yyin at a new file and resuming + scanning + +1993-12-03 17:45 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Added note regarding g++ 2.5.X + +1993-12-03 17:20 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: updated credits + +1993-12-03 17:20 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: ranlib addition for 2.4.3 + +1993-12-03 17:19 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Minor tweak to last change + +1993-12-03 17:18 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: run ranlib on libfl.a + +1993-12-03 17:02 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Hopefully last update prior to 2.4.3 + +1993-12-03 16:59 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, gen.c, misc.c, sym.c: lint tweaks + +1993-12-03 16:35 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added exec_prefix + +1993-12-03 16:35 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: credit update + +1993-12-03 16:35 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: lint tweak + +1993-12-03 07:50 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: FlexLexer.h fixed for separate inclusion + +1993-12-03 07:49 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, FlexLexer.h, main.c: mods so FlexLexer.h can be + included separately + +1993-12-03 07:47 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: -F incompatible with -+ + +1993-12-02 17:18 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Elaborated comments for 2.4.3 + +1993-12-02 16:59 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.4.3 + +1993-12-02 16:58 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Updated message regarding missing libfl.a routines Added + thanks to Noah Friedman + +1993-12-02 16:52 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added libstring.c Modified "lint" target to use + -Dconst= Added a.out, lex.yy.cc to sundry clean targets + +1993-12-02 16:52 Vern Paxson <vern@ee.lbl.gov> + + * gen.c, scan.l, sym.c, misc.c, main.c, flexdef.h, flex.skl: Use + yy_strXXX() routines instead of <string.h> + +1993-12-01 06:58 Vern Paxson <vern@ee.lbl.gov> + + * version.h: 2.4.3 + +1993-12-01 06:58 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, misc.c: yy_flex_xmalloc() moved to misc.c + +1993-12-01 06:58 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Fixed bug in yy_fatal_error() + +1993-12-01 02:59 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: ... and remove plain tar file after compression + +1993-12-01 02:57 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.4.2 + +1993-12-01 02:56 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Produce both compress'd and gzip'd distribution tar + files + +1993-12-01 02:52 Vern Paxson <vern@ee.lbl.gov> + + * version.h: Release 2.4.2 + +1993-11-30 18:37 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: -a -> -Ca + +1993-11-30 15:59 Vern Paxson <vern@ee.lbl.gov> + + * README: described configuration files in manifest + +1993-11-30 15:58 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added intermediate step of copying MISC/alloca.c -> + alloca.c Included CPPFLAGS when compiling alloca.c + +1993-11-30 10:51 Vern Paxson <vern@ee.lbl.gov> + + * README: Credit to 2.4 pre-testers. + +1993-11-30 08:01 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Fixed nasty bug in short/long decl decision + +1993-11-30 08:01 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Lowered MAX_SHORT out of increased general paranoia. + Added yy_flex_xmalloc() proto + +1993-11-30 08:00 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Fixed very minor typo in -v output + +1993-11-30 08:00 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Removed vestigal cast to (char) in isupper() call + +1993-11-30 07:59 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added casts to unsigned Char for isascii() calls + +1993-11-30 07:59 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Added #ifdef chud for alloca() + +1993-11-30 07:59 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added alloca + +1993-11-30 07:35 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: Add AC_ALLOCA if using bison + +1993-11-29 16:35 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added intermediate file going scan.l -> scan.c + +1993-11-29 12:18 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Removed parse.{c,h} from distribution files, since + they may not be all that portable. + +1993-11-29 12:13 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Fixed %array YYLMAX headaches, added error message if + buffer needs growing but REJECT used + +1993-11-29 12:13 Vern Paxson <vern@ee.lbl.gov> + + * gen.c, main.c: Fixed YYLMAX headaches + +1993-11-29 12:13 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Documented that buffer can't grow if REJECT used + +1993-11-29 12:12 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added parse.{c,h} to dist files + +1993-11-29 11:40 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, flexdef.h, gen.c, main.c, misc.c, scan.l: Fixed to + buffer section 1 definitions + +1993-11-29 11:38 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: Fixed ANSI-C glitch with '%' operator + +1993-11-29 09:57 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed mis-definition of ndlookup() + +1993-11-29 06:04 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.4 -> 2.4.1 + +1993-11-29 06:02 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added install.sh, mkinstalldirs to distribution + files + +1993-11-29 05:51 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Added Nathan Zelle, "promoted" Francois + +1993-11-29 05:37 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: only "realclean" removes flex dist depends on flex + +1993-11-29 05:37 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, misc.c: myctoi takes char[] instead of Char[] + +1993-11-28 11:46 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: -a -> -Ca all_lower, all_upper -> work on char* + +1993-11-28 11:46 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added -Ca to bigcheck + +1993-11-28 11:45 Vern Paxson <vern@ee.lbl.gov> + + * main.c: -a -> -Ca; fixed help output + +1993-11-28 11:45 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c, flex.1: -a -> -Ca + +1993-11-28 11:44 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: all_lower, all_upper work on char* + +1993-11-28 11:44 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed some casts now that yytext is always char* and + never unsigned char* + +1993-11-28 11:42 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Francois' tweaks + +1993-11-28 11:39 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: AC_LN_S, AC_STDC_HEADERS (but not AC_ALLOCA) + +1993-11-27 10:10 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: fixed typo + +1993-11-27 10:03 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Don't remove dist directory + +1993-11-27 10:01 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Include liballoc.c in lint targets + +1993-11-27 10:01 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: lint tweak + +1993-11-27 09:14 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added -l compression to bigcheck + +1993-11-27 09:07 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: permission tweaking for "dist" + +1993-11-27 09:02 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: more "dist" tweaks + +1993-11-27 08:59 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Changed "make dist" to use version.h, include scan.c + in initial dir copy + +1993-11-27 08:44 Vern Paxson <vern@ee.lbl.gov> + + * version.h: 2.4.1 + +1993-11-27 08:44 Vern Paxson <vern@ee.lbl.gov> + + * README: Revised as per Francois Pinard + +1993-11-27 08:41 Vern Paxson <vern@ee.lbl.gov> + + * COPYING: flex.skel -> flex.skl + +1993-11-27 08:37 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Updated date of 2.4 release + +1993-11-27 08:29 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Removed manual & nroff output from distribution + +1993-11-27 08:20 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.4.1 release + +1993-11-27 07:57 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: Initial revision + +1993-11-27 07:56 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Merge w/ 2.4.1 changes added "dist2" target + +1993-11-26 12:02 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Initial revision + +1993-11-26 11:59 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Removed #ifndef FILE protection from include of stdio + +1993-11-26 11:40 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Added Francois Pinard to distribution headache helpers + +1993-11-26 11:10 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Modified C++ scanners to get input a character at a + time for interactive scanners. + +1993-11-26 11:09 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Added YY_INTERACTIVE. + +1993-11-26 11:09 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Put definitions inside ()'s so we can test -l option for + "make bigcheck" + +1993-11-26 11:09 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Documented YY_INTERACTIVE. + +1993-11-26 10:08 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, flexdef.h, flex.1, gen.c, main.c, parse.y, scan.l: -l + lex compatibility flag + +1993-11-20 10:05 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Support for read()/fread() section 1 definitions + precede default macro definitions + +1993-11-20 10:05 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added use_read global + +1993-11-20 10:04 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Cleaner definition for yymore() Fixed string broken across + multiple lines + +1993-11-20 10:04 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Added -Cr + +1993-11-20 10:03 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: K&R declaration for check_char() + +1993-11-20 09:56 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Documented -Cr + +1993-11-20 09:31 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: No need to #undef before redefining prior to -Cr + documentation + +1993-11-10 05:27 Vern Paxson <vern@ee.lbl.gov> + + * README: Heavily massaged for 2.4 + +1993-11-10 05:27 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Added Landon Noll to thanks. + +1993-11-10 05:07 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.4 release + +1993-11-10 05:06 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: 2.4 documentation + +1993-11-10 05:05 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Added global to remember -P prefix so it can be written + in -v summary. Alphabetized prefix generation, added yywrap + +1993-11-09 16:11 Vern Paxson <vern@ee.lbl.gov> + + * version.h: updated date for 2.4.0 :-( + +1993-10-10 11:28 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: Whitespace tweaking + +1993-10-10 10:52 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Use DEFAULT_CSIZE only if not using equivalence classes. + +1993-10-10 10:47 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Checkpoint prior to final 2.4 update + +1993-10-04 17:15 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Raw 2.4 changes + +1993-10-04 12:44 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: osfcn.h -> unistd.h + +1993-10-04 06:56 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added "static" to definition of yy_fatal_error as well + as fwd decl. + +1993-10-04 06:17 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added yy_fatal_error function. + +1993-10-03 13:38 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Got rid of (char *) casts of yytext, no longer needed. + +1993-10-03 13:34 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Got rid of (char *) casts of yytext, no longer needed. + +1993-10-03 12:05 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: YY_CHAR -> char added YYText(), YYLeng() + +1993-10-03 12:01 Vern Paxson <vern@ee.lbl.gov> + + * gen.c, flex.skl: Minimized use of YY_CHAR + +1993-10-03 12:01 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Added "flex++" feature Minimized use of YY_CHAR + +1993-10-02 11:25 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Clarified help message for -S + +1993-10-02 11:23 Vern Paxson <vern@ee.lbl.gov> + + * libyywrap.c, version.h: Initial revision + +1993-10-02 11:20 Vern Paxson <vern@ee.lbl.gov> + + * main.c: If -+ used, output to lex.yy.cc + +1993-10-02 11:19 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h, flex.skl: Switched from FILE*'s to stream's + +1993-10-02 09:44 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added expand_nxt_chk() extern. + +1993-10-02 09:38 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added dynamic buffer growing. Added yyless() for + section 3. + +1993-10-02 09:37 Vern Paxson <vern@ee.lbl.gov> + + * main.c, flexdef.h, dfa.c, gen.c: Added -a option for long-align. + +1993-10-02 09:36 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: formfeed no longer considered whitespace + +1993-09-21 16:45 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Nuked FILENAMESIZE + +1993-09-21 16:45 Vern Paxson <vern@ee.lbl.gov> + + * main.c: yyflexlexer.h -> FlexLexer.h minor portability tweak + +1993-09-21 16:45 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Added start condition to EOF trace output + +1993-09-21 16:44 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added YY_START changed yyFlexLexer to define yylex() + +1993-09-21 16:44 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Minor portability tweaks + +1993-09-21 16:43 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: Split into two classes, one fully abstract. yylex() + no longer abstract in yyFlexLexer + +1993-09-21 16:42 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: PC lint tweak + +1993-09-21 16:42 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: YYSTYPE #define'd to int + +1993-09-21 16:42 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: minor lint tweak + +1993-09-16 16:53 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: Initial revision + +1993-09-16 16:38 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Delete prototypes for Unix system calls. + +1993-09-16 16:31 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c, tblcmp.c, sym.c, nfa.c, misc.c, main.c, gen.c, ecs.c, + ccl.c, dfa.c, scan.l, parse.y: nuked static RCS string + +1993-09-16 16:28 Vern Paxson <vern@ee.lbl.gov> + + * main.c: %array not allowed with C++ scanners + +1993-09-16 16:27 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed bugs regarding %{%} code in section 2 prolog %array + not allowed with C++ scanners + +1993-08-25 13:11 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added C_plus_plus flag. + +1993-08-25 13:11 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: First version of C/C++ skeleton + +1993-08-25 13:10 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: yy_state_type declared earlier. Made a bunch of statics + only output if not -+ + +1993-08-25 12:59 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Added -+ option, updated usage() output, rearranged some + generated code to come at the right point in the output for + yyflexlexer.h. + +1993-08-25 12:52 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added %+/%-/%* to skelout() + +1993-08-25 12:51 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: EOF in section 2 prolog leads to section 0, not section 3 + +1993-08-25 12:40 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: Dump promotion of EOF in section 2 to turn on section 3; + instead just treat it like a final EOF + +1993-08-25 12:40 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: yy_nxt table should be "const" + +1993-08-24 16:46 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Removed a lot of #ifdef chud "backtracking" -> + "backing up" + +1993-08-24 16:45 Vern Paxson <vern@ee.lbl.gov> + + * main.c: "backtracking" -> "backing up" got rid of time reports + +1993-08-24 16:44 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: "backtracking" -> "backing up" some portability tweaks + fixed to only call flexscan() when done if known to be in section 3 + +1993-08-24 16:43 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: isascii() moved to flexdef.h nuked flex_gettime() + +1993-08-24 16:43 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed bug with empty section 2 + +1993-08-24 16:42 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: Chucked definition of isascii() + +1993-08-24 16:40 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: preserve yytext on input() bug fix when combining + yyless() with yymore() checkpoint prior to C++ option + +1993-08-24 16:37 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: "backtracking" -> "backing up" + +1993-07-09 15:47 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Fixed to not generate extra EOF's after reading one. + +1993-07-05 17:52 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Spit out definition of YY_CHAR early + +1993-07-05 17:52 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Some rearranging to make sure things get declared in + the right order + +1993-07-05 17:37 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: Some comment fixes as per Wilhelms + +1993-07-05 17:37 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Nuked #undef of yywrap, now that it's a function + +1993-07-05 17:36 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Fixed bug with Z-a character classes as per Wilhelms + +1993-07-05 17:36 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: added check_char call in mkstate() to prevent bad xtion + chars + +1993-07-05 17:35 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added check_char() + +1993-07-05 17:35 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Fixed some reallocation bugs, etc. as per Wilhelms + +1993-07-05 17:34 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added check_char(), readable_form() + +1993-07-05 17:34 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added #ifndef's around #define's to let user override + Moved a bunch of definitions prior to section 1 + +1993-07-05 17:32 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: Wilhems bug fixes. + +1993-07-05 17:31 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: Added check_char() + +1993-06-12 09:44 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Changed to use yy_flex_alloc() and friends + +1993-06-12 09:43 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Added -P flag + +1993-06-12 09:42 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed bug in lex % directives + +1993-06-12 09:42 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Modified to use yy_flex_alloc() and friends + +1993-06-12 09:42 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: Modified to use yy_flex_alloc() + +1993-06-12 09:41 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Modified to use yy_flex_alloc() and friends Moved some + globals earlier in the file to permit access in section 1 + +1993-06-12 09:40 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: Got rid of code needed for %t + +1993-04-14 18:41 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c, dfa.c, ecs.c, flex.skl, flexdef.h, gen.c, libmain.c, + main.c, misc.c, nfa.c, parse.y, scan.l, sym.c, tblcmp.c, yylex.c: + Reformatting. + +1993-04-05 16:38 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Fixed bug in description of backtracking + +1993-04-05 16:37 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.3.8 + +1993-04-05 16:37 Vern Paxson <vern@ee.lbl.gov> + + * main.c, flex.skl: %array support + +1993-04-05 16:36 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added non-STDC clause for '\a' + +1993-04-05 16:35 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed subtle problems regarding '*'s in comments + %pointer/%array match entire lines + +1993-04-05 16:35 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Added %array support + +1993-02-06 16:08 Vern Paxson <vern@ee.lbl.gov> + + * README: Finally updated email addr + +1993-02-06 16:08 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Mostly .LP -> .PP + +1993-02-06 16:06 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: [no log message] + +1993-02-06 16:05 Vern Paxson <vern@ee.lbl.gov> + + * main.c, scan.l: A lot of tweaks ... + +1993-02-06 16:04 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: reallocate_character_array -> reallocate_Character_array + +1993-02-06 16:04 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Bug/lint fixes Modified to work with "action" array + instead of temp file + +1993-02-06 16:03 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: Fixed bug in 8-bit hashing + +1993-02-06 16:03 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: numerous bug fixes extra formatting of error/warning + messages added support of <*>, partial support for nested start + conditions + +1993-02-06 16:01 Vern Paxson <vern@ee.lbl.gov> + + * ecs.c: Remove %t cruft + +1993-02-06 16:01 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Beginning of %pointer/%array support + +1993-02-06 16:00 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: Added keeping track of which rules are useful fixed a + fencepost error in checking for scanners that require -8 + +1993-02-06 15:59 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: Added checking for whether rules are useful modified to + work with internal "action" array + +1993-02-06 15:58 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added internal "action" array, internal skeleton, + zero_out() in lieu of bzero + +1993-02-06 15:58 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: Fixed a bunch of fencepost errors in increasing tables. + +1993-02-06 15:57 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: -Wall fix + +1991-03-28 07:01 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Fixed out-of-bounds access bug; patch #7 for release 2.3 + +1991-03-28 07:00 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Patch #7 for 2.3 + +1990-10-23 10:51 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: fixed missing "rule_type" entry for end-of-buffer action + +1990-08-29 08:11 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Fixed yymore() but in not resetting yy_more_len + +1990-08-29 08:10 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Patch #6 for 2.3 + +1990-08-16 16:22 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Patch #5 + +1990-08-13 20:10 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: fixed comment in myesc() + +1990-08-13 20:07 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: fixed date in patch #4 + +1990-08-13 20:05 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: patch #4 + +1990-08-13 20:01 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: fixed hexadecimal escapes; added is_hex_digit() + +1990-08-03 10:12 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Patch #3 + +1990-08-03 10:09 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, flexdef.h: changed to include <stddef.h> for __GNUC__ + +1990-08-01 21:03 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.3 patch #2 + +1990-08-01 21:01 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Another try at getting the malloc() definitions + correct; this time for g++, too + +1990-08-01 20:30 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, flexdef.h: fixed to declare malloc() and free() by hand + if __GNUC__ + +1990-07-28 12:53 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Changed to get malloc definition in identical fashion + to that used by flex.skel + +1990-06-27 20:43 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: [no log message] + +1990-06-27 20:40 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Fixed bug in mini-scanner examle Fixed bug in YY_INPUT + redefinition yylineno defense reentrancy documentation Something + else which I forget. + +1990-06-27 19:47 Vern Paxson <vern@ee.lbl.gov> + + * COPYING, ccl.c, dfa.c, ecs.c, flexdef.h, gen.c, main.c, misc.c, + nfa.c, parse.y, scan.l, sym.c, tblcmp.c, yylex.c: 4.4 BSD copyright + +1990-05-26 13:31 Vern Paxson <vern@ee.lbl.gov> + + * README: Changed prolog to reflect 2.3 release. + +1990-05-26 13:29 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: pointed reader at Makefile instead of README for porting + considerations added Makefile comments: support for SCO Unix; + parameterization + +1990-05-26 13:24 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added DONT_HAVE_STDLIB_H and declarations of malloc() + +1990-05-26 13:16 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.3 changes + +1990-05-26 13:02 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: documentation on new features Comment regarding Ove's + work ^foo|bar difference between flex / lex yyin initialization + difference documented that yy_switch_to_buffer can be used in + yywrap() documented that # comments are deprecated + +1990-05-26 12:56 Vern Paxson <vern@ee.lbl.gov> + + * main.c: declared void functions as such added prototypes for + forward references changed to check for error status when closing + files + +1990-05-26 12:54 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: Added macro definition for isascii() if not already + present + +1990-05-26 12:53 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: declared void functions as such added prototypes for + forward references changed to use format_pinpoint_message where + appropriate + +1990-05-26 12:53 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: declared void functions as such changed to strip # + comments, as documented moved #undef of yywrap() to before include + of flexdef, so prototype doesn't get screwed up + +1990-05-26 12:52 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: introduced format_pinpoint_message() declared void + functions as such changed lone <<EOF>> to apply to all outstanding + start conditions + +1990-05-26 12:51 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c, tblcmp.c: declared void functions as such added prototypes + for forward references + +1990-05-26 12:50 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: declared void functions as such prototypes for forward + references shuffled around some routines to make the order perhaps + a little more logical changed memory references to use void* + instead of char* + +1990-05-26 12:50 Vern Paxson <vern@ee.lbl.gov> + + * libmain.c: Added declaration of arguments made yylex() a function + +1990-05-26 12:48 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: prototypes for forward references declared void functions + as such yy_flex_debug testing of error on file closes casts to void + for sprintf() and strcpy() + +1990-05-26 12:42 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added prototypes changed memory allocation routines to + deal with void*'s instead of char*'s some rearranging for VMS + +1990-05-26 12:40 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added YY_USER_INIT Added yy_new_buffer() alias for + yy_create_buffer() fixed (hopefully) malloc declaration headaches + +1990-05-26 12:40 Vern Paxson <vern@ee.lbl.gov> + + * ecs.c: declared void functions as such declared void functions as + such + +1990-05-26 12:39 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: prototypes for forward references declared void functions + as such + +1990-05-26 12:38 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: Declared void functions as such + +1990-04-12 07:03 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: added fix for allowing yy_switch_to_buffer() in + yywrap() + +1990-04-03 10:09 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: patch #3 - -I fix + +1990-03-29 21:43 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Changed generation of archaic "continue" to "goto + yy_find_action" + +1990-03-27 07:06 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Patch #2 changes + +1990-03-27 07:03 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: fixed fencepost errors with yy_buf_size and detecting + NUL's + +1990-03-26 11:41 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: [no log message] + +1990-03-26 11:38 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: g++ tweaks + +1990-03-23 09:25 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Changes for Patch #1. + +1990-03-23 09:20 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: fix for g++ + +1990-03-23 09:18 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: minor typos and formatting changes. Removed BITNET + address. + +1990-03-23 09:16 Vern Paxson <vern@ee.lbl.gov> + + * README: nuked BITNET address. + +1990-03-20 09:54 Vern Paxson <vern@ee.lbl.gov> + + * README: 2.2 README + +1990-03-20 09:33 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: USG alias. + +1990-03-20 09:32 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added USG alias for SYS_V + +1990-03-20 09:25 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: [no log message] + +1990-03-20 09:17 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Added Earle Horton for 8-bit chars. + +1990-03-20 08:52 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Tweaks for lint and C++ + +1990-03-20 08:52 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: -ll => -lfl + +1990-03-20 08:52 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.2 changes + +1990-03-20 08:17 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Changed to use YY_BUFFER_STATE everywhere. + +1990-03-20 08:16 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: [no log message] + +1990-03-20 08:16 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: "associated rules" changed to "associated rule line + numbers". + +1990-03-20 08:15 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: cast added to malloc() call to keep lint happy. + +1990-03-20 06:36 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: Fixed handling of premature EOF's. + +1990-03-20 06:36 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: Removed declaration of malloc() + +1990-03-20 06:36 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Removed malloc() declaration. Added detection of EOF in + actions. + +1990-03-20 06:35 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Rules rewritten so '/' and '$' parsed correctly. + +1990-03-20 06:34 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: Corrected line numbers for continued actions. + +1990-03-20 06:33 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Removed declarations of malloc() and realloc(). + +1990-03-20 06:32 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Summary of generation flags. Minor -8 tweaks. + +1990-03-20 06:32 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: full support for -d + +1990-03-20 06:31 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: defines for malloc() and realloc() conditional defines + for abs(), min(), and max() + +1990-03-20 06:31 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Many multiple-buffer additions. + +1990-03-20 06:30 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: -8 tweaks. + +1990-03-19 11:34 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Proto hacks. NUL hacks. Debugging hacks. C++ hacks. + +1990-03-16 12:40 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: RCS won't let me unedit! gets "Missing access list" + +1990-03-16 11:55 Vern Paxson <vern@ee.lbl.gov> + + * ecs.c: Many hacks for NUL's. Hope they're right. + +1990-03-16 11:53 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: Minor tweaks for NUL's. + +1990-03-16 11:53 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: no changes -- had checked out for testing smaller read + buffer sizes + +1990-03-16 11:52 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Nuked some extraneous whitespace. NUL's hacks. + +1990-03-16 11:52 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: hack for NUL's. + +1990-03-16 11:51 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Hack to cshell for NUL's. + +1990-03-16 11:51 Vern Paxson <vern@ee.lbl.gov> + + * main.c: NUL's. -8 + +1990-03-16 11:51 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: NUL's. + +1990-03-16 11:50 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: NUL's. 8-bit chars. + +1990-03-16 11:50 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: NUL's; indenting + +1990-03-16 11:50 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: more thrashing around with NUL's + +1990-03-16 11:49 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: removed NUL hack + +1990-03-14 08:41 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: Added <<EOF>> token + +1990-03-14 08:39 Vern Paxson <vern@ee.lbl.gov> + + * ecs.c, flexdef.h: Tweaks for NUL chars. + +1990-03-14 08:39 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c, gen.c, main.c, misc.c, parse.y, scan.l, tblcmp.c: Tweaks + for NUL chars. + +1990-03-14 08:39 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: Tweaks for handling NUL's. + +1990-02-28 13:10 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: [no log message] + +1990-02-28 11:59 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Changed .so options.man to inlined version since flex.1 + will have a different (shorter) options description. + +1990-02-28 10:09 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: [no log message] + +1990-02-28 06:10 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: [no log message] + +1990-02-26 12:59 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: [no log message] + +1990-02-25 14:47 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: [no log message] + +1990-02-24 20:28 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Initial revision + +1990-01-16 06:17 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Restored EOB accepting list for REJECT. Second try at 2.2 + Release. + +1990-01-16 05:39 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added missing ',' in error message. 2.2 Release, second + try. + +1990-01-16 05:29 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: 8-bit char support. 2.2 Release. + +1990-01-15 13:02 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: 8-bit char support. Arbitrary indented/%{} code allowed + in section 2. \x escapes. %t support. Minor POSIX-compliance + changes. BEGIN(0) -> BEGIN(INITIAL). yywrap() and + set_input_file() for multiple input files. C_COMMENT_2 removed. + 2.2 Release. + +1990-01-15 13:00 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: 8-bit char support. SYS_V / Atari portability fixes. + Removed generated array names. CSIZE now only defined if not + already defined. Added "csize" global. Added "input_files", + "num_input_files", and "program_name" globals. %t support globals. + 2.2 Release. + +1990-01-15 12:58 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Removed unused EOB_accepting_list array. 2.2 Release. + +1990-01-15 12:53 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Bug in -F table generation fixed. 8-bit char support. + Hardwired generated array names. "const"'s added to generated + code. Fixed yymore() / trailing context bug. + +1990-01-15 12:53 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: 8-bit char support. Error-message pinpointing. 2.2 + Release. + +1990-01-15 12:49 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Unsigned char support. %t support. Removed hard-wiring + of program name "flex". -c changed to -C; -c now deprecated. -n + added. :-( Multiple input files. SYSV tmpnam() use. Removed old + #define's from output. Identified error messages w/ filename and + line. 2.2 Release. + +1990-01-15 12:49 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: Unsigned char support. 2.2 Release. + +1990-01-15 12:48 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: Removed redundant test. 2.2 Release. + +1990-01-15 12:48 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Unsigned char support. \x support. 2.2 Release. + +1990-01-15 12:47 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: 8-bit char support. 2.2 Release. + +1990-01-15 12:44 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: C++ support. Turbo-C support. 8-bit char support. + yyleng is an int. unput() callable in section 3. yymore hacks. + yyrestart() no longer closes stdin. 2.2 Release. + +1990-01-15 12:41 Vern Paxson <vern@ee.lbl.gov> + + * ecs.c: %t support. 8-bit/unsigned char support. 2.2 Release. + +1990-01-15 12:40 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: %t hacks. minor cosmetics. 2.2 Relase. + +1990-01-15 12:37 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: Changes for unsigned/8-bit chars. 2.2 Release. + +1990-01-10 10:10 Vern Paxson <vern@ee.lbl.gov> + + * libmain.c: Initial revision + +1989-12-30 10:34 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: removed gratuitous trailing context code + +1989-12-30 10:34 Vern Paxson <vern@ee.lbl.gov> + + * main.c: made -c<compression flags> case-sensitive + +1989-12-30 10:33 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: unput() bug fix + +1989-12-30 10:32 Vern Paxson <vern@ee.lbl.gov> + + * README: [no log message] + +1989-06-20 13:24 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: changed to not use '|' and trailing context combo so + users can test using -F ... + +1989-06-20 13:23 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: made trailing context combined with '|' warning always + come out + +1989-06-20 13:12 Vern Paxson <vern@ee.lbl.gov> + + * README: [no log message] + +1989-06-20 12:47 Vern Paxson <vern@ee.lbl.gov> + + * COPYING: Initial revision + +1989-06-20 12:36 Vern Paxson <vern@ee.lbl.gov> + + * main.c, README, NEWS: [no log message] + +1989-06-20 12:27 Vern Paxson <vern@ee.lbl.gov> + + * README: [no log message] + +1989-06-20 12:02 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, README, main.c: [no log message] + +1989-06-20 11:49 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c, dfa.c, ecs.c, flex.skl, flexdef.h, gen.c, misc.c, nfa.c, + parse.y, scan.l, sym.c, tblcmp.c, yylex.c: Beta release + +1989-06-20 11:48 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, README, main.c: 2.1 beta release + +1989-06-20 11:44 Vern Paxson <vern@ee.lbl.gov> + + * main.c, NEWS: [no log message] + +1989-06-20 11:38 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, flexdef.h, gen.c, misc.c, nfa.c, parse.y, scan.l, + sym.c: 2.0.1 beta + +1989-06-20 11:37 Vern Paxson <vern@ee.lbl.gov> + + * README: [no log message] + +1989-05-25 08:21 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: fixsed bug with -I and backtracking + +1989-05-25 07:49 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Cleaned up forward declarations of yyunput() and + input() + +1989-05-25 07:48 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Split copyright string. + +1989-05-25 07:48 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: Split copyright string. Added check for empty machine in + dupmachine(). + +1989-05-25 07:46 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c, main.c, misc.c, scan.l, ecs.c, sym.c, yylex.c, dfa.c, + tblcmp.c, gen.c: Split copyright string into two to avoid tempting + fate with \<newline> sequences ... + +1989-05-24 08:48 Vern Paxson <vern@ee.lbl.gov> + + * README: updated for 2nd release Beta test added RCS header + +1989-05-24 07:48 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: removed static char copyright + +1989-05-24 07:45 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added BSD copyright notice. Removed + FAST_SKELETON_FILE. + +1989-05-24 07:44 Vern Paxson <vern@ee.lbl.gov> + + * main.c: added BSD copyright notice. Removed references to + FAST_SKELETON_FILE. + +1989-05-24 07:44 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c, gen.c, ecs.c: Added BSD copyright notice + +1989-05-24 07:42 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c, dfa.c, misc.c, yylex.c, sym.c, tblcmp.c, scan.l, parse.y: + added BSD copyright notice + +1989-05-23 20:32 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Initial revision + +1989-05-19 10:13 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: renamed accnum to num_rules + +1989-05-19 10:12 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: moved table generation code to gen.c moved ntod() to + dfa.c + +1989-05-19 10:11 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: the most piddling format change imaginable + +1989-05-19 10:10 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: changed to look for yymore, REJECT, %used and %unused + removed gross magic for dealing with section 3 + +1989-05-19 10:08 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c, parse.y: changes for variable trailing context + +1989-05-19 10:07 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: added all_lower() and all_upper() + +1989-05-19 10:07 Vern Paxson <vern@ee.lbl.gov> + + * main.c: added checking for features being Really used + backtracking, performance reports misc. cleanup + +1989-05-19 10:06 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: major overhaul for merged skeleton + +1989-05-19 10:05 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: a zillion changes/additions/cleanups + +1989-05-19 10:01 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: added backtrack report added checking for dangerous + trailing context considerable minor cleanup + +1989-05-19 09:56 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: list_character_set() modified to take a FILE to write to + ... + +1989-05-19 09:56 Vern Paxson <vern@ee.lbl.gov> + + * README: updated for beta release + +1988-11-25 16:30 Vern Paxson <vern@ee.lbl.gov> + + * main.c: added -p flag generation of #define's for scanner + +1988-11-25 16:28 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added END_OF_BUFFER_ACTION and bol_needed + +1988-11-25 16:27 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: added ntod() + +1988-05-09 13:01 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Initial revision + +1988-05-08 16:13 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: RCS header changed display style of non-printings from + ^x to \0xx + +1988-05-08 16:08 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: RCS header MAX_XTIONS_FOR_FULL_INTERIOR_FIT -> + MAX_XTIONS_FULL_INTERIOR_FIT made back-tracking accepting number be + one greater than the last legit accepting number, instead of 0. + This way, end-of-buffer can take 0 and no negative accepting + numbers are needed. added genftbl() changed last ftl references to + C added check for UNSIGNED_CHAR's added back-track logic to + make_tables() added checking and report for backtracking fixed + fence-post error with onesp stack pointer + +1988-05-08 16:08 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: RCS header changed "entry" to "sym_entry" to avoid + conflict with old keyword + +1988-05-08 16:07 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: RCS header removed \^ from ESCSEQ + +1988-05-08 16:06 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: RCS header bug fix due to missing default rule, could + have to backtrack when backtrack variables haven't been set up + +1988-05-08 16:05 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: RCS ident yy_cp, yy_bp support name shortenings assoc_rule + support + +1988-05-08 16:04 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: RCS header check before malloc()'ing for 16 bit overflow + MS_DOS, VMS ifdef's removed commented-out \^ code removed FTLSOURCE + code added readable_form() + +1988-05-08 16:03 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Added RCS header removed revision history misc additions + and fixes to globals VMS ifdef's backtracking statistics -p flag + name shortenings + +1988-05-08 15:59 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: removed revision history added RCS header added VMS, + MS_DOS ifdef's removed DEFAULT_ACTION, changed END_OF_BUFFER_ACTION + shortened MAX_XTIONS_FOR_FULL_INTERIOR_FIT to + MAX_XTIONS_FULL_INTERIOR_FIT added MAX_ASSOC_RULES added + performance_report, assoc_rule gloabls added num_backtracking + gloabl shortened allocate_integer_pointer_array, + reallocate_integer_pointer_array + +1988-05-08 15:53 Vern Paxson <vern@ee.lbl.gov> + + * ecs.c: added RCS id added PROCFLG to avoid assumption of signed + char's + +1988-05-08 15:51 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: added RCS id added check_for_backtracking() added + dump_associated_rules() added dump_transitions() shortened + reallocate_integer_pointer_array to reallocate_int_ptr_array + removed some dfaacc_{state,set} abuses + +1988-05-08 15:51 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: Added list_character_set() + +1988-05-06 20:06 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: added RCS id + +1988-04-10 17:57 Vern Paxson <vern@ee.lbl.gov> + + * README: minor tweaks + +1988-04-10 17:42 Vern Paxson <vern@ee.lbl.gov> + + * README: forgot sh flex.shar + +1988-04-10 17:27 Vern Paxson <vern@ee.lbl.gov> + + * README: final tweaking + +1988-04-10 17:27 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: removed minor lint fluff + +1988-04-10 17:27 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: [no log message] + +1988-04-10 16:55 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, README: Initial revision + +1988-04-10 16:54 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: added identifying comment. changed to include "parse.h" + instead of "y.tab.h" + +1988-04-10 16:53 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: Changed name from flexcmp.c -> tblcmp.c fixed misc. + typos made generating ec tables be a routine + +1988-04-10 16:52 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: changed name from flexsym.c -> sym.c revamped calling + sequences, etc., for extended table struct definition which now + has both char * and int fields. + +1988-04-10 16:51 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Changed name from flexscan.l -> scan.l fixed bug in + <RECOVER> added block comments between rules. + +1988-04-10 16:50 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: changed name from flexparse.y -> parse.y added start + condition "INITIAL" made a{3} have "variable length" + +1988-04-10 16:48 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: changed name from flexnfa.c -> nfa.c corrected some typos. + +1988-04-10 16:48 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: changed name from flexmisc.c -> misc.c + +1988-04-10 16:46 Vern Paxson <vern@ee.lbl.gov> + + * main.c: fixed bug causing core dumps if skeleton files could not + be opened. Added -cF. Added fullspd to be equivalent to fulltbl + for which options is cannot be mixed with. + +1988-04-10 16:45 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: fixed typos, enhanced symbol table definition. + +1988-04-10 16:42 Vern Paxson <vern@ee.lbl.gov> + + * ecs.c: changed name from flexecs.c to ecs.c + +1988-04-10 16:42 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: changed name from flexdfa.c to dfa.c + +1988-04-10 16:42 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: changed name from flexccl.c -> ccl.c + +1988-02-13 06:00 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c, tblcmp.c, dfa.c, ecs.c, main.c, misc.c, nfa.c, sym.c, + yylex.c, flexdef.h, parse.y, scan.l: Beta Release. + +1987-11-08 17:24 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c, tblcmp.c, flexdef.h, dfa.c, ecs.c, main.c, misc.c, nfa.c, + parse.y, scan.l, sym.c, yylex.c: Initial revision + diff --git a/usr.bin/lex/FlexLexer.h b/FlexLexer.h index 6c9a950008e2..bad4ce03fb65 100644 --- a/usr.bin/lex/FlexLexer.h +++ b/FlexLexer.h @@ -1,7 +1,6 @@ -// $Header: /home/daffy/u0/vern/flex/RCS/FlexLexer.h,v 1.19 96/05/25 20:43:02 vern Exp $ - +// -*-C++-*- // FlexLexer.h -- define interfaces for lexical analyzer classes generated -// by flex +// by flex // Copyright (c) 1993 The Regents of the University of California. // All rights reserved. @@ -9,19 +8,24 @@ // This code is derived from software contributed to Berkeley by // Kent Williams and Tom Epperly. // -// Redistribution and use in source and binary forms are permitted provided -// that: (1) source distributions retain this entire copyright notice and -// comment, and (2) distributions including binaries display the following -// acknowledgement: ``This product includes software developed by the -// University of California, Berkeley and its contributors'' in the -// documentation or other materials provided with the distribution and in -// all advertising materials mentioning features or use of this software. -// Neither the name of the University nor the names of its contributors may -// be used to endorse or promote products derived from this software without -// specific prior written permission. -// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: + +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. + +// Neither the name of the University nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. + +// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE. // This file defines FlexLexer, an abstract class which specifies the // external interface provided to flex C++ lexer objects, and yyFlexLexer, @@ -43,7 +47,11 @@ #ifndef __FLEX_LEXER_H // Never included before - need to define base class. #define __FLEX_LEXER_H -#include <iostream.h> + +#include <iostream> +# ifndef FLEX_STD +# define FLEX_STD std:: +# endif extern "C++" { @@ -54,20 +62,20 @@ class FlexLexer { public: virtual ~FlexLexer() { } - const char* YYText() { return yytext; } - int YYLeng() { return yyleng; } + const char* YYText() const { return yytext; } + int YYLeng() const { return yyleng; } virtual void yy_switch_to_buffer( struct yy_buffer_state* new_buffer ) = 0; virtual struct yy_buffer_state* - yy_create_buffer( istream* s, int size ) = 0; + yy_create_buffer( FLEX_STD istream* s, int size ) = 0; virtual void yy_delete_buffer( struct yy_buffer_state* b ) = 0; - virtual void yyrestart( istream* s ) = 0; + virtual void yyrestart( FLEX_STD istream* s ) = 0; virtual int yylex() = 0; // Call yylex with new input/output sources. - int yylex( istream* new_in, ostream* new_out = 0 ) + int yylex( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 ) { switch_streams( new_in, new_out ); return yylex(); @@ -75,8 +83,8 @@ public: // Switch to new input/output streams. A nil stream pointer // indicates "keep the current one". - virtual void switch_streams( istream* new_in = 0, - ostream* new_out = 0 ) = 0; + virtual void switch_streams( FLEX_STD istream* new_in = 0, + FLEX_STD ostream* new_out = 0 ) = 0; int lineno() const { return yylineno; } @@ -91,29 +99,35 @@ protected: }; } -#endif +#endif // FLEXLEXER_H #if defined(yyFlexLexer) || ! defined(yyFlexLexerOnce) // Either this is the first time through (yyFlexLexerOnce not defined), // or this is a repeated include to define a different flavor of -// yyFlexLexer, as discussed in the flex man page. +// yyFlexLexer, as discussed in the flex manual. #define yyFlexLexerOnce +extern "C++" { + class yyFlexLexer : public FlexLexer { public: // arg_yyin and arg_yyout default to the cin and cout, but we // only make that assignment when initializing in yylex(). - yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 ); + yyFlexLexer( FLEX_STD istream* arg_yyin = 0, FLEX_STD ostream* arg_yyout = 0 ); virtual ~yyFlexLexer(); void yy_switch_to_buffer( struct yy_buffer_state* new_buffer ); - struct yy_buffer_state* yy_create_buffer( istream* s, int size ); + struct yy_buffer_state* yy_create_buffer( FLEX_STD istream* s, int size ); void yy_delete_buffer( struct yy_buffer_state* b ); - void yyrestart( istream* s ); + void yyrestart( FLEX_STD istream* s ); + + void yypush_buffer_state( struct yy_buffer_state* new_buffer ); + void yypop_buffer_state(); virtual int yylex(); - virtual void switch_streams( istream* new_in, ostream* new_out ); + virtual void switch_streams( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 ); + virtual int yywrap(); protected: virtual int LexerInput( char* buf, int max_size ); @@ -124,7 +138,7 @@ protected: int yyinput(); void yy_load_buffer_state(); - void yy_init_buffer( struct yy_buffer_state* b, istream* s ); + void yy_init_buffer( struct yy_buffer_state* b, FLEX_STD istream* s ); void yy_flush_buffer( struct yy_buffer_state* b ); int yy_start_stack_ptr; @@ -139,10 +153,8 @@ protected: yy_state_type yy_try_NUL_trans( yy_state_type current_state ); int yy_get_next_buffer(); - istream* yyin; // input source for default LexerInput - ostream* yyout; // output sink for default LexerOutput - - struct yy_buffer_state* yy_current_buffer; + FLEX_STD istream* yyin; // input source for default LexerInput + FLEX_STD ostream* yyout; // output sink for default LexerOutput // yy_hold_char holds the character lost when yytext is formed. char yy_hold_char; @@ -160,6 +172,12 @@ protected: // instead of setting up a fresh yyin. A bit of a hack ... int yy_did_buffer_switch_on_eof; + + size_t yy_buffer_stack_top; /**< index of top of stack. */ + size_t yy_buffer_stack_max; /**< capacity of stack. */ + struct yy_buffer_state ** yy_buffer_stack; /**< Stack as an array. */ + void yyensure_buffer_stack(void); + // The following are not always needed, but may be depending // on use of certain flex features (like REJECT or yymore()). @@ -182,4 +200,7 @@ protected: int yy_prev_more_offset; }; -#endif +} + +#endif // yyFlexLexer || ! yyFlexLexerOnce + diff --git a/INSTALL b/INSTALL new file mode 100644 index 000000000000..23e5f25d0e5f --- /dev/null +++ b/INSTALL @@ -0,0 +1,236 @@ +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.am b/Makefile.am new file mode 100644 index 000000000000..5bad6071e80e --- /dev/null +++ b/Makefile.am @@ -0,0 +1,208 @@ +# This file is part of flex. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: + +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. + +# Neither the name of the University nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE. + +# Notes on building: + +# Possible values for DEFS: +# +# By default, flex generates 8-bit scanners when using table compression, +# and 7-bit scanners when using uncompressed tables (-f or -F options). +# For flex to always generate 8-bit scanners, add "-DDEFAULT_CSIZE=256" +# to DEFS. +# +# For Vax/VMS, add "-DVMS" to DEFS. +# +# For MS-DOS, add "-DMS_DOS" to DEFS. See the directory MISC/MSDOS for +# additional info. + +AM_YFLAGS = -d +ACLOCAL_AMFLAGS = -I m4 +m4 = @M4@ +indent = @INDENT@ + +bin_PROGRAMS = flex +lib_LIBRARIES = \ + libfl.a \ + libfl_pic.a + +flex_SOURCES = \ + ccl.c \ + dfa.c \ + ecs.c \ + scanflags.c \ + gen.c \ + main.c \ + misc.c \ + nfa.c \ + parse.y \ + scan.l \ + skel.c \ + sym.c \ + tblcmp.c \ + yylex.c \ + options.c \ + scanopt.c \ + buf.c \ + tables.c \ + tables_shared.c \ + filter.c \ + regex.c + +libfl_a_SOURCES = \ + libmain.c \ + libyywrap.c + +libfl_pic_a_SOURCES = \ + libmain.c \ + libyywrap.c + +libfl_pic_a_CFLAGS = \ + -fPIC \ + $(AM_CFLAGS) + +noinst_HEADERS = \ + flexdef.h \ + flexint.h \ + version.h \ + options.h \ + scanopt.h \ + tables.h \ + tables_shared.h + +include_HEADERS = \ + FlexLexer.h + +EXTRA_DIST = \ + .indent.pro \ + AUTHORS \ + COPYING \ + INSTALL \ + NEWS \ + ONEWS \ + README \ + README.cvs \ + THANKS \ + TODO \ + autogen.sh \ + flex.skl \ + mkskel.sh \ + ABOUT-NLS \ + config.rpath \ + gettext.h + +BUILT_SOURCES = \ + skel.c + +SUBDIRS = \ + . \ + doc \ + m4 \ + examples \ + po \ + tools \ + tests + +localedir = $(datadir)/locale +AM_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" -I$(top_srcdir)/intl +LIBS = @LIBINTL@ @LIBS@ + +skel.c: flex.skl mkskel.sh flexint.h tables_shared.h + sed 's/m4_/m4postproc_/g; s/m4preproc_/m4_/g' $(srcdir)/flex.skl | $(m4) -P -DFLEX_MAJOR_VERSION=`echo $(VERSION)|cut -f 1 -d .` -DFLEX_MINOR_VERSION=`echo $(VERSION)|cut -f 2 -d .` -DFLEX_SUBMINOR_VERSION=`echo $(VERSION)|cut -f 3 -d .` | sed 's/m4postproc_/m4_/g' | $(SHELL) $(srcdir)/mkskel.sh >skel.c + +# Explicitly describe dependencies. +# You can recreate this with `gcc -I. -MM *.c' +buf.o: buf.c flexdef.h flexint.h +ccl.o: ccl.c flexdef.h flexint.h +dfa.o: dfa.c flexdef.h flexint.h tables.h tables_shared.h +ecs.o: ecs.c flexdef.h flexint.h +scanflags.o: scanflags.c flexdef.h flexint.h +gen.o: gen.c flexdef.h flexint.h tables.h tables_shared.h +libmain.o: libmain.c +libyywrap.o: libyywrap.c +main.o: main.c flexdef.h flexint.h version.h options.h scanopt.h \ + tables.h tables_shared.h +misc.o: misc.c flexdef.h flexint.h tables.h tables_shared.h +nfa.o: nfa.c flexdef.h flexint.h +options.o: options.c options.h scanopt.h flexdef.h flexint.h +parse.o: parse.c flexdef.h flexint.h tables.h tables_shared.h +scan.o: scan.c flexdef.h flexint.h parse.h +scanopt.o: scanopt.c flexdef.h flexint.h scanopt.h +skel.o: skel.c flexdef.h flexint.h +sym.o: sym.c flexdef.h flexint.h +tables.o: tables.c flexdef.h flexint.h tables.h tables_shared.h +tables_shared.o: tables_shared.c flexdef.h flexint.h tables.h \ + tables_shared.h +tblcmp.o: tblcmp.c flexdef.h flexint.h +yylex.o: yylex.c flexdef.h flexint.h parse.h +filter.o: filter.c flexdef.h flexint.h + +# Create the ChangeLog, but only if we're inside a cvs working directory + +ChangeLog: $(srcdir)/tools/cvsauthors $(srcdir)/tools/cvs2cl.pl + if [ -d CVS ] ; then \ + sh $(srcdir)/tools/cvs2cl.pl -F trunk -U $(srcdir)/tools/cvsauthors \ + ; fi + +# Run GNU indent on sources. Don't run this unless all the sources compile cleanly. +# +# Whole idea: +# 1. Check for .indent.pro, otherwise indent will use unknown +# settings, or worse, the GNU defaults.) +# 2. Check that this is GNU indent. +# 3. Make sure to process only the NON-generated .c and .h files. +# 4. Run indent twice per file. The first time is a test. +# Otherwise, indent overwrites your file even if it fails! +indentfiles = \ + buf.c \ + ccl.c \ + dfa.c \ + ecs.c \ + scanflags.c \ + filter.c \ + flexdef.h \ + gen.c \ + libmain.c \ + libyywrap.c \ + main.c \ + misc.c \ + nfa.c \ + options.c \ + options.h \ + regex.c \ + scanopt.c \ + scanopt.h \ + sym.c \ + tables.c \ + tables.h \ + tables_shared.c \ + tables_shared.h \ + tblcmp.c + +indent: + if [ -f .indent.pro ] ; then \ + for f in $(indentfiles);\ + do\ + echo indenting $$f ;\ + $(indent) < $$f >/dev/null && indent $$f || echo $$f FAILED to indent ;\ + done \ + fi + +.PHONY: ChangeLog tags indent diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 000000000000..2f8d444dc261 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,1096 @@ +# 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@ + +# This file is part of flex. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: + +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. + +# Neither the name of the University nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE. + +# Notes on building: + +# Possible values for DEFS: +# +# By default, flex generates 8-bit scanners when using table compression, +# and 7-bit scanners when using uncompressed tables (-f or -F options). +# For flex to always generate 8-bit scanners, add "-DDEFAULT_CSIZE=256" +# to DEFS. +# +# For Vax/VMS, add "-DVMS" to DEFS. +# +# For MS-DOS, add "-DMS_DOS" to DEFS. See the directory MISC/MSDOS for +# additional info. + + + +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 = flex$(EXEEXT) +DIST_COMMON = README $(am__configure_deps) $(include_HEADERS) \ + $(noinst_HEADERS) $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/conf.in $(top_srcdir)/configure ABOUT-NLS AUTHORS \ + COPYING ChangeLog INSTALL NEWS README-alpha THANKS TODO \ + compile config.guess config.rpath config.sub depcomp \ + install-sh missing mkinstalldirs parse.c parse.h scan.c +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.in +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)/mkinstalldirs +CONFIG_HEADER = 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)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(includedir)" +libLIBRARIES_INSTALL = $(INSTALL_DATA) +LIBRARIES = $(lib_LIBRARIES) +AR = ar +ARFLAGS = cru +libfl_a_AR = $(AR) $(ARFLAGS) +libfl_a_LIBADD = +am_libfl_a_OBJECTS = libmain.$(OBJEXT) libyywrap.$(OBJEXT) +libfl_a_OBJECTS = $(am_libfl_a_OBJECTS) +libfl_pic_a_AR = $(AR) $(ARFLAGS) +libfl_pic_a_LIBADD = +am_libfl_pic_a_OBJECTS = libfl_pic_a-libmain.$(OBJEXT) \ + libfl_pic_a-libyywrap.$(OBJEXT) +libfl_pic_a_OBJECTS = $(am_libfl_pic_a_OBJECTS) +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(bin_PROGRAMS) +am_flex_OBJECTS = ccl.$(OBJEXT) dfa.$(OBJEXT) ecs.$(OBJEXT) \ + scanflags.$(OBJEXT) gen.$(OBJEXT) main.$(OBJEXT) \ + misc.$(OBJEXT) nfa.$(OBJEXT) parse.$(OBJEXT) scan.$(OBJEXT) \ + skel.$(OBJEXT) sym.$(OBJEXT) tblcmp.$(OBJEXT) yylex.$(OBJEXT) \ + options.$(OBJEXT) scanopt.$(OBJEXT) buf.$(OBJEXT) \ + tables.$(OBJEXT) tables_shared.$(OBJEXT) filter.$(OBJEXT) \ + regex.$(OBJEXT) +flex_OBJECTS = $(am_flex_OBJECTS) +flex_LDADD = $(LDADD) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I. +depcomp = $(SHELL) $(top_srcdir)/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) +YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) +SOURCES = $(libfl_a_SOURCES) $(libfl_pic_a_SOURCES) $(flex_SOURCES) +DIST_SOURCES = $(libfl_a_SOURCES) $(libfl_pic_a_SOURCES) \ + $(flex_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 +includeHEADERS_INSTALL = $(INSTALL_HEADER) +HEADERS = $(include_HEADERS) $(noinst_HEADERS) +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@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BISON = @BISON@ +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@ +GMSGFMT = @GMSGFMT@ +HELP2MAN = @HELP2MAN@ +INDENT = @INDENT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBINTL@ @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +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@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +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_YFLAGS = -d +ACLOCAL_AMFLAGS = -I m4 +m4 = @M4@ +indent = @INDENT@ +lib_LIBRARIES = \ + libfl.a \ + libfl_pic.a + +flex_SOURCES = \ + ccl.c \ + dfa.c \ + ecs.c \ + scanflags.c \ + gen.c \ + main.c \ + misc.c \ + nfa.c \ + parse.y \ + scan.l \ + skel.c \ + sym.c \ + tblcmp.c \ + yylex.c \ + options.c \ + scanopt.c \ + buf.c \ + tables.c \ + tables_shared.c \ + filter.c \ + regex.c + +libfl_a_SOURCES = \ + libmain.c \ + libyywrap.c + +libfl_pic_a_SOURCES = \ + libmain.c \ + libyywrap.c + +libfl_pic_a_CFLAGS = \ + -fPIC \ + $(AM_CFLAGS) + +noinst_HEADERS = \ + flexdef.h \ + flexint.h \ + version.h \ + options.h \ + scanopt.h \ + tables.h \ + tables_shared.h + +include_HEADERS = \ + FlexLexer.h + +EXTRA_DIST = \ + .indent.pro \ + AUTHORS \ + COPYING \ + INSTALL \ + NEWS \ + ONEWS \ + README \ + README.cvs \ + THANKS \ + TODO \ + autogen.sh \ + flex.skl \ + mkskel.sh \ + ABOUT-NLS \ + config.rpath \ + gettext.h + +BUILT_SOURCES = \ + skel.c + +SUBDIRS = \ + . \ + doc \ + m4 \ + examples \ + po \ + tools \ + tests + +localedir = $(datadir)/locale +AM_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" -I$(top_srcdir)/intl + +# Run GNU indent on sources. Don't run this unless all the sources compile cleanly. +# +# Whole idea: +# 1. Check for .indent.pro, otherwise indent will use unknown +# settings, or worse, the GNU defaults.) +# 2. Check that this is GNU indent. +# 3. Make sure to process only the NON-generated .c and .h files. +# 4. Run indent twice per file. The first time is a test. +# Otherwise, indent overwrites your file even if it fails! +indentfiles = \ + buf.c \ + ccl.c \ + dfa.c \ + ecs.c \ + scanflags.c \ + filter.c \ + flexdef.h \ + gen.c \ + libmain.c \ + libyywrap.c \ + main.c \ + misc.c \ + nfa.c \ + options.c \ + options.h \ + regex.c \ + scanopt.c \ + scanopt.h \ + sym.c \ + tables.c \ + tables.h \ + tables_shared.c \ + tables_shared.h \ + tblcmp.c + +all: $(BUILT_SOURCES) config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .l .o .obj .y +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) --gnits '; \ + cd $(srcdir) && $(AUTOMAKE) --gnits \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnits 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)/conf.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/conf.in: $(am__configure_deps) + cd $(top_srcdir) && $(AUTOHEADER) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +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) +libfl.a: $(libfl_a_OBJECTS) $(libfl_a_DEPENDENCIES) + -rm -f libfl.a + $(libfl_a_AR) libfl.a $(libfl_a_OBJECTS) $(libfl_a_LIBADD) + $(RANLIB) libfl.a +libfl_pic.a: $(libfl_pic_a_OBJECTS) $(libfl_pic_a_DEPENDENCIES) + -rm -f libfl_pic.a + $(libfl_pic_a_AR) libfl_pic.a $(libfl_pic_a_OBJECTS) $(libfl_pic_a_LIBADD) + $(RANLIB) libfl_pic.a +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) + +installcheck-binPROGRAMS: $(bin_PROGRAMS) + bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \ + case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \ + *" $$p "* | *" $(srcdir)/$$p "*) continue;; \ + esac; \ + f=`echo "$$p" | \ + sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + for opt in --help --version; do \ + if "$(DESTDIR)$(bindir)/$$f" $$opt >c$${pid}_.out \ + 2>c$${pid}_.err </dev/null \ + && test -n "`cat c$${pid}_.out`" \ + && test -z "`cat c$${pid}_.err`"; then :; \ + else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \ + done; \ + done; rm -f c$${pid}_.???; exit $$bad +parse.h: parse.c + @if test ! -f $@; then \ + rm -f parse.c; \ + $(MAKE) parse.c; \ + else :; fi +flex$(EXEEXT): $(flex_OBJECTS) $(flex_DEPENDENCIES) + @rm -f flex$(EXEEXT) + $(LINK) $(flex_LDFLAGS) $(flex_OBJECTS) $(flex_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ccl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dfa.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfl_pic_a-libmain.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfl_pic_a-libyywrap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmain.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libyywrap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nfa.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/options.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scan.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scanflags.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scanopt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skel.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sym.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tables.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tables_shared.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tblcmp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yylex.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) '$<'` + +libfl_pic_a-libmain.o: libmain.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfl_pic_a_CFLAGS) $(CFLAGS) -MT libfl_pic_a-libmain.o -MD -MP -MF "$(DEPDIR)/libfl_pic_a-libmain.Tpo" -c -o libfl_pic_a-libmain.o `test -f 'libmain.c' || echo '$(srcdir)/'`libmain.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libfl_pic_a-libmain.Tpo" "$(DEPDIR)/libfl_pic_a-libmain.Po"; else rm -f "$(DEPDIR)/libfl_pic_a-libmain.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libmain.c' object='libfl_pic_a-libmain.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfl_pic_a_CFLAGS) $(CFLAGS) -c -o libfl_pic_a-libmain.o `test -f 'libmain.c' || echo '$(srcdir)/'`libmain.c + +libfl_pic_a-libmain.obj: libmain.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfl_pic_a_CFLAGS) $(CFLAGS) -MT libfl_pic_a-libmain.obj -MD -MP -MF "$(DEPDIR)/libfl_pic_a-libmain.Tpo" -c -o libfl_pic_a-libmain.obj `if test -f 'libmain.c'; then $(CYGPATH_W) 'libmain.c'; else $(CYGPATH_W) '$(srcdir)/libmain.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libfl_pic_a-libmain.Tpo" "$(DEPDIR)/libfl_pic_a-libmain.Po"; else rm -f "$(DEPDIR)/libfl_pic_a-libmain.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libmain.c' object='libfl_pic_a-libmain.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfl_pic_a_CFLAGS) $(CFLAGS) -c -o libfl_pic_a-libmain.obj `if test -f 'libmain.c'; then $(CYGPATH_W) 'libmain.c'; else $(CYGPATH_W) '$(srcdir)/libmain.c'; fi` + +libfl_pic_a-libyywrap.o: libyywrap.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfl_pic_a_CFLAGS) $(CFLAGS) -MT libfl_pic_a-libyywrap.o -MD -MP -MF "$(DEPDIR)/libfl_pic_a-libyywrap.Tpo" -c -o libfl_pic_a-libyywrap.o `test -f 'libyywrap.c' || echo '$(srcdir)/'`libyywrap.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libfl_pic_a-libyywrap.Tpo" "$(DEPDIR)/libfl_pic_a-libyywrap.Po"; else rm -f "$(DEPDIR)/libfl_pic_a-libyywrap.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libyywrap.c' object='libfl_pic_a-libyywrap.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfl_pic_a_CFLAGS) $(CFLAGS) -c -o libfl_pic_a-libyywrap.o `test -f 'libyywrap.c' || echo '$(srcdir)/'`libyywrap.c + +libfl_pic_a-libyywrap.obj: libyywrap.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfl_pic_a_CFLAGS) $(CFLAGS) -MT libfl_pic_a-libyywrap.obj -MD -MP -MF "$(DEPDIR)/libfl_pic_a-libyywrap.Tpo" -c -o libfl_pic_a-libyywrap.obj `if test -f 'libyywrap.c'; then $(CYGPATH_W) 'libyywrap.c'; else $(CYGPATH_W) '$(srcdir)/libyywrap.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libfl_pic_a-libyywrap.Tpo" "$(DEPDIR)/libfl_pic_a-libyywrap.Po"; else rm -f "$(DEPDIR)/libfl_pic_a-libyywrap.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libyywrap.c' object='libfl_pic_a-libyywrap.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfl_pic_a_CFLAGS) $(CFLAGS) -c -o libfl_pic_a-libyywrap.obj `if test -f 'libyywrap.c'; then $(CYGPATH_W) 'libyywrap.c'; else $(CYGPATH_W) '$(srcdir)/libyywrap.c'; fi` + +.l.c: + $(LEXCOMPILE) $< + sed '/^#/ s|$(LEX_OUTPUT_ROOT)\.c|$@|' $(LEX_OUTPUT_ROOT).c >$@ + rm -f $(LEX_OUTPUT_ROOT).c + +.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: +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)" + @list='$(include_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ + $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ + rm -f "$(DESTDIR)$(includedir)/$$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) conf.in $(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) conf.in $(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) conf.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) conf.in $(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)/m4 $(distdir)/po + @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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(HEADERS) config.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) 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." + -rm -f parse.c + -rm -f parse.h + -rm -f scan.c + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic clean-libLIBRARIES \ + mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: install-includeHEADERS + +install-exec-am: install-binPROGRAMS install-libLIBRARIES + +install-info: install-info-recursive + +install-man: + +installcheck-am: installcheck-binPROGRAMS + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ + uninstall-info-am uninstall-libLIBRARIES + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ + check-am clean clean-binPROGRAMS clean-generic \ + clean-libLIBRARIES clean-recursive ctags ctags-recursive dist \ + dist-all dist-bzip2 dist-gzip dist-shar dist-tarZ dist-zip \ + distcheck distclean distclean-compile distclean-generic \ + distclean-hdr distclean-recursive distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-exec install-exec-am \ + install-includeHEADERS install-info install-info-am \ + install-libLIBRARIES install-man install-strip installcheck \ + installcheck-am installcheck-binPROGRAMS installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-recursive pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-includeHEADERS \ + uninstall-info-am uninstall-libLIBRARIES + + +skel.c: flex.skl mkskel.sh flexint.h tables_shared.h + sed 's/m4_/m4postproc_/g; s/m4preproc_/m4_/g' $(srcdir)/flex.skl | $(m4) -P -DFLEX_MAJOR_VERSION=`echo $(VERSION)|cut -f 1 -d .` -DFLEX_MINOR_VERSION=`echo $(VERSION)|cut -f 2 -d .` -DFLEX_SUBMINOR_VERSION=`echo $(VERSION)|cut -f 3 -d .` | sed 's/m4postproc_/m4_/g' | $(SHELL) $(srcdir)/mkskel.sh >skel.c + +# Explicitly describe dependencies. +# You can recreate this with `gcc -I. -MM *.c' +buf.o: buf.c flexdef.h flexint.h +ccl.o: ccl.c flexdef.h flexint.h +dfa.o: dfa.c flexdef.h flexint.h tables.h tables_shared.h +ecs.o: ecs.c flexdef.h flexint.h +scanflags.o: scanflags.c flexdef.h flexint.h +gen.o: gen.c flexdef.h flexint.h tables.h tables_shared.h +libmain.o: libmain.c +libyywrap.o: libyywrap.c +main.o: main.c flexdef.h flexint.h version.h options.h scanopt.h \ + tables.h tables_shared.h +misc.o: misc.c flexdef.h flexint.h tables.h tables_shared.h +nfa.o: nfa.c flexdef.h flexint.h +options.o: options.c options.h scanopt.h flexdef.h flexint.h +parse.o: parse.c flexdef.h flexint.h tables.h tables_shared.h +scan.o: scan.c flexdef.h flexint.h parse.h +scanopt.o: scanopt.c flexdef.h flexint.h scanopt.h +skel.o: skel.c flexdef.h flexint.h +sym.o: sym.c flexdef.h flexint.h +tables.o: tables.c flexdef.h flexint.h tables.h tables_shared.h +tables_shared.o: tables_shared.c flexdef.h flexint.h tables.h \ + tables_shared.h +tblcmp.o: tblcmp.c flexdef.h flexint.h +yylex.o: yylex.c flexdef.h flexint.h parse.h +filter.o: filter.c flexdef.h flexint.h + +# Create the ChangeLog, but only if we're inside a cvs working directory + +ChangeLog: $(srcdir)/tools/cvsauthors $(srcdir)/tools/cvs2cl.pl + if [ -d CVS ] ; then \ + sh $(srcdir)/tools/cvs2cl.pl -F trunk -U $(srcdir)/tools/cvsauthors \ + ; fi + +indent: + if [ -f .indent.pro ] ; then \ + for f in $(indentfiles);\ + do\ + echo indenting $$f ;\ + $(indent) < $$f >/dev/null && indent $$f || echo $$f FAILED to indent ;\ + done \ + fi + +.PHONY: ChangeLog tags indent +# 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: @@ -0,0 +1,488 @@ +This is the file NEWS for the flex package. It records user -visible +changes between releases of flex. + +See the file COPYING for copying conditions. + +* version 2.5.35 released 2008-02-26 + +** fixed bug that prevented flex from accepting certain comments in the + scanner file (resolves bugs #1849809 and #1849805) + +** fix bug that prevented headers for all functions from being generated + (resolves bug #1628314) + +** change yy_size_t to be size_t (resolves bug #1849812) + +** new de, nl, pl, pt_br, vi translations from the translation project + +* version 2.5.34 released 2007-12-12 + +** introduce yylex_init_extra; see the manual for details + +** introduce %option extra-type="your_type *" (resolves bug #1744505) + +** The flex program now parses multiple short concatenated options (resolves bug + #1619820). Thanks to Petr Machata of Red Hat on this issue. + +** better checking after yyalloc/yyrealloc (resolves bug #1595967) + +** flex now provides for a libfl_pic.a compiled with position + independent code. Particularly useful when including a flex scanner + in a shared library and with more recent versions of gcc. Thanks to the Debian project for the idea. + +** SourceForge feature request #1658379: Expose YY_BUF_SIZE in the + header file. + +** flex better escapes filenames with special characters in them + (resolves bug #1623600) + +** a memory leak was plugged(resolves bug #1601111) + +** pattern language expanded; see the manual for details on the below + highlights + +*** pattern options added to specify patterns as case-insensitive or + case-sensitive + +*** pattern options to specify whether the "." character should match + the newline character + +*** pattern options added to allow ignoring of whitespace in patterns + +*** POSIX character classes may be negated in patterns + +*** patterns may now use set difference, union operators + +** the manual now contains an appendix listing various common patterns + which may be useful when writing scanners + +** some memory leaks were removed from the C++ scanner (but the C++ + scanner is still experimental and may change radically without + notice) + +** c++ scanners can now use yywrap + +** added new unit test for c++ and yywrap + +** portability fixes to some unit tests + +** flex man page and flex manual in pdf now distributed in the flex +distribution + +** new ca, vi, ga, nl translations from the translation project + +** flex no longer comes with an rpm spec file + +** flex development now happens with automake 1.9.6 + +* version 2.5.33 released 2006-2-20 + +** all flex resources are now to be found from the website at + http://flex.sourceforge.net/ + +** there was no release 2.5.32 published + +** numerous bug and security fixes + +** new nl, vi, sv, ro, po, ga, ca, fr, tr translations from the translation project + +** upgrade to use gettext 0.12 (this now makes the "pdf" and "ps" + targets in the build system able to be run successfully) + +* version 2.5.31 released 2003-4-1 + +** remove --enable-maintainer-mode configure option; none of the + Makefiles were using it and it can be unduely confusing + +* version 2.5.30 released 2003-4-1 + +** yylineno is per-buffer in reentrant scanners + +** added %top directive for placing code at the top of the generated + scanner; see manual for details + +** flex now uses m4 to generate scanners; while this means that + scanners are more readable, it means that flex requires m4 to be + installed; see manual for details + +* version 2.5.29 released 2003-3-5 + +** Automatic stack management for multiple input buffers in C and C++ scanners + +** moved the flex documentation to a new doc/ subdirectory + +** cleanups to the yy namespace + +* version 2.5.28 released 2003-2-12 + +** flex is now hosted at sourceforge + +** Fixed trailing slash bug in YY_INPUT macro def + +** Flex now warns if always-interactive is specified with fast or full + +* version 2.5.27 released 2003-1-21 + +** flex now works with recent bison versions + +** new pt_br translation from the translation project + +* version 2.5.26 released 2003-1-14 + +** Fixed table deserialization bug on big-endian archs. Patch sent from Bryce Nichols <bryce@bnichols.org> + +** yyleng has proper declarations now; this caused flex to generate + unusable scanners for some programs + +** the flex distribution now includes a spec file suitable for use + with rpm + +** some more c++ fixes + +** new es translation from the translation project + +** slight tweeks to the flex_int*_t types + +** flex now warns about pattern ranges that might be ambiguous when + generating a case-insensitive scanner + + +* version 2.5.25 released 2002-12-2 + +** flex now uses flex_int*_t types. For C99 systems, they are just the + int*_t types; for non-C99 systems, we just make some typedefs + +** new pt_br translation from the translation project + +* version 2.5.24 released 2002-11-25 + +* more portability fixes + +** the manual continues to be updated and edited, but it's still got a + ways to go + +** it is possible to have multiple c++ scanners in the same program again + +** new turkish translation from the translation project + +* version 2.5.23 released 2002-10-21 + +** more portability fixes + +** the manual includes a title page and a table-of-contents when printed + +** the test suite can be run with "make check" from the top-level + directory + +** configure now accepts the --enable-maintainer-mode option + +** gettext functionality is now only available externally + +** the constant FLEX_BETA is defined if flex is a beta release + +** the script create-test was not included in the distribution and it + should have been + +* version 2.5.22 released 2002-10-10 + +** more portability fixes around how we get ahold of the integral + types; there is a constant FLEX_NEED_INTEGRAL_TYPE_DEFINITIONS + which you should define if you don't have the <inttypes.h> header + file (after you complain to your C vendor for not providing a + reasonable C environment) + +** more test suite cleanups; in particular, the test suite should run + correctly when build from a different directory + +** upgraded automake to 1.7 and consequently autoconf to 2.54; this + means, among other things, that there is some support for +formatting the manual in postscript and pdf in the distributed + Makefile.in (and therefore in the Makefile built by configure) + +** the flex.1 manpage is generated by help2man; (this has been true + for quite a while but was not listed here) + +** flex now includes three defined constants to indicate which version + of flex generated a scanner (YY_FLEX_{MAJOR,MINOR,SUBMINOR}_VERSION) + +** flex tries its best to output only the relevant portions of the + skeleton when generating a scanner, thus avoiding as much + conditional compilation as possible + +* version 2.5.21 released 2002-9-17 + +** one of the tests in the test suite broke the dist target + +* version 2.5.20 released 2002-9-16 + +** A flex scanner has the ability to save the DFA tables to a file, + and load them at runtime when needed; see the manual for details + +** Added %option bison-bridge (--bison-bridge) + +** Removed %option reentrant-bison/--reentrant-bison/-Rb + +** yylineno is present in all scanners; Modified nasty performance + penalty warning with yylineno in documentation + +** test-table-opts is now run last in the test suite because it's so fat + +** flex can, to some extent, diagnose where internal problems occur + +** new translations from the translation project: fr, ca, de, ru, sv + +**Flex generates C99 defs now; see YY_TRADITIONAL_FUNC_DEFS in the + manual if that's not a good thing for you + +* version 2.5.19 released 2002-9-5 + +** prevent segfault on input lines which are longer than the allocated + space (problem report from Manoj Srivastava + <srivasta@golden-gryphon.com>) + +** Changed option 'header' to 'header-file' + +* version 2.5.18 released 2002-9-4 + +** portability fixes for integer constants and in the way the test + suite reports its results + +** the test for bison was reporting bison missing when it was, in + fact, found + +** if we don't find GNU indent, we're more careful when we're not + finding it + +* version 2.5.17 released 2002-8-29 + +** more portability fixes + +** updated config.sub and config.guess + +** flex is indented by GNU indent (this was done earlier but not + explicitly documented) + +* version 2.5.16 released 2002-8-28 + +** c++ scanners compile again + +** there is now an indent target in the top-level Makefile; configure + checks for GNU indent which is required for proper operation of the + indent target + +** some more portability fixes were made + +** %options and invocation sections of manual merged + +** a c++ test was added to the test suite + +** we're trying to clean up more files in the test suite's make clean + targets + +* version 2.5.15 released 2002-8-21 + +** reject-state buffer is now dynamically allocated and REJECT buffer + variables are reentrant-safe + +** manual now discusses memory usage + +** skeleton now processed by m4 before mkskel.sh; (this only matters + if you want to change the skeleton or if you're doing flex development) + +** zh_cn translation added from translation project + +** a bug that caused a segfault has now been fixed + +** the test suite now respects the usual CFLAGS, etc. variables + +** removed some warnings which some tests trigggered with the -s option + +** the flex-generated header file now tries to be smarter about + conditionally including start conditions + +** tables code omitted from generated scanner when not used + +* version 2.5.14 released 2002-8-15 + +** the tests using the reentrant c scanner as c++ were reworked + slightly to be sure that the c++ was enforced + +** de translation now included in the distribution + +** various portability fixes regarding nls support, c++ include + headers, etc. + +* version 2.5.13 released 2002-8-15 + +** the header file output with %option header is now much smaller + +** Fixed type mismatch in printf in scanner skeleton + +** yylex_init now reports errors + +* version 2.5.12 released 2002-8-8 + +** updated gettext support to 0.11.5 + +** new fr translation from the translation project + +** bison is no longer needed to build flex; If you are building flex + from a release (i.e., not from a cvs snapshot), then you don't need + to have a pre-built lex around either (unless you modify scan.l, of + course); (This has been true for some time, but was not mentioned + here.) + +* version 2.5.11 released 2002-7-31 + +** Fixed bug where yyless did not consider yylineno + +** the yylineno performance hit is now gone + +** fixed some typos in the manual and we now include texinfo.tex in + the distribution + +** traditional prototypes output for C scanners, controlled by a + preprocessor symbol; see documentation for details + +* version 2.5.10 released 2002-7-24 + +** yy_globals renamed to yyscanner and yy_globals_t renamed to + yy_guts_t + +** added dist-bzip2 option to Makefile.am so we now produce a bzip2'd + archive in addition to the standard gzip archive + +* version 2.5.9 + +** new tests in test suite: test-mem-{nr,r}, test-posix, + test-posixly-correct, test-debug-{nr,r} + +** made changes to work with gcc-3.2 development code + +** ability to choose which memory functions are used in flex + +** new yylex_destroy() function for the non-reentrant scanner + +** new handling of POSIXLY_CORRECT environment variable + +** the test suite now has its copyrights explicitly described + +** new ca, de, fr, ru, sv, tr translations + +* version 2.5.8 + +** a new --posix option generates scanners with posix-style abc{1,3} + compatible parsing, see manual for the screwy details + +* version 2.5.7 + +** configure.in now includes a call to AC_PREREQ to enforce the + requirement for autoconf at least 2.50 (This only effects you if + you're doing flex development.) + +** configure now uses autoconf's versioning information and configure + --help reports the bug-reporting address for flex + +** test suite now only reports success versus failure; reporting + skipped is problematic under the current setup + +** compilation with --disable-nls now works + +** flex can now be built in a separate directory + +* version 2.5.6 + +** gettext support added (from gettext 0.11) + +*** translations for ca, da, de, es, fr, ko, ru, sv, tr included + +** distribution now built under automake 1.6 and autoconf 2.53 + +** command-line option parsing happens differently now: + +*** Added long option parsing + +*** Options -n and -c, previously deprecated, now simply do nothing + +*** Options are now parsed left to right + +** added a number of new options + +*** All positive %options are now accessible from the command line + +*** Added option -D, to define a preprocessor symbol + +*** Added option --header=FILE to specify a C .h file to generate + +*** added option --yywrap to call yywrap on EOF + +*** added option --yylineno to track line count in yylineno + +*** --yyclass=NAME name of C++ class when generating c++ scanners + +*** for long option names which are associated with existing short +options, see accompanying documentation + +*** new %option nounistd or command-line --nounistd added to prevent + flex from generating #include <unistd.h> on systems that don't + have that include file + +** Support for reentrant C scanners has been added + +*** Updated the manual with the new reentrant API + +*** Two new options %option reentrant (-R) and +%option reentrant-bison (-Rb) + +*** All globals optionally placed into struct yyglobals_t + +*** All access to globals replaced by macro invocations + +*** All functions optionally take one additional +argument, yy_globals + +*** New style for invoking reentrant scanner: +yylex_init(void** scanner ); +yylex( scanner ); +yylex_destroy( scanner ); + +*** Added get/set functions for members of struct yy_globals_t +e.g., yyget_text, yyget_leng, etc + +*** Prefix substitution added for new functions + +*** Macro shortcuts to the lengthy get/set functions +provided for use in actions, e.g., yytext, yyleng, etc + +*** Arbitrary, user-defined data, "yyextra", may be added to scanner + +** %option nomain no longer implies %option yywrap +But the inverse is still true + +** Developer test suite added + +*** TESTS/ directory has been added. Users can +'make test' in the TESTS directory to execute the test suite + +** Support for bison variables yylval and yylloc added + +** automake support for the build process + +** manual is now in texinfo/info format + +*** flex.1 removed from distribution + +** flex no longer generates C-language scanners with C++-style + comments + +** flex now generates scanners in c++ which are compatible with + recent c++ compilers + +** flex input scanner now recognizes '\r' as an EOL character + +See the file ONEWS for changes in earlier releases. + +Local Variables: +mode: text +mode: outline-minor +end: diff --git a/usr.bin/lex/NEWS b/ONEWS index 3e23e7d9f623..33415772185b 100644 --- a/usr.bin/lex/NEWS +++ b/ONEWS @@ -936,7 +936,7 @@ Changes between 2.3 Patch #2 (02Aug90) and original 2.3 release: Changes between 2.3 (full) release of 28Jun90 and 2.2 (alpha) release: - User-visible: +User-visible: - A lone <<EOF>> rule (that is, one which is not qualified with a list of start conditions) now specifies the EOF action for @@ -974,7 +974,7 @@ Changes between 2.3 (full) release of 28Jun90 and 2.2 (alpha) release: be the most common source of headaches. - Things which didn't used to be documented but now are: +Things which didn't used to be documented but now are: - flex interprets "^foo|bar" differently from lex. flex interprets it as "match either a 'foo' or a 'bar', providing it comes at the @@ -998,7 +998,7 @@ Changes between 2.3 (full) release of 28Jun90 and 2.2 (alpha) release: with a suggestion on how to convert scanners which rely on it. - Other changes: +Other changes: - Prototypes and proper declarations of void routines have been added to the flex source code, courtesy of Kevin B. Kenny. @@ -1050,7 +1050,7 @@ Changes between 2.2 Patch #1 (23Mar90) and 2.2 (alpha) release: Changes between 2.2 (alpha) release of March '90 and previous release: - User-visible: +User-visible: - Full user documentation now available. @@ -1105,7 +1105,7 @@ Changes between 2.2 (alpha) release of March '90 and previous release: may go away soon. - Other changes: +Other changes: - Makefile enhanced for easier testing and installation. - The parser has been tweaked to detect some erroneous @@ -1136,7 +1136,7 @@ Changes between 2.2 (alpha) release of March '90 and previous release: Changes between 2.1 beta-test release of June '89 and previous release: - User-visible: +User-visible: - -p flag generates a performance report to stderr. The report consists of comments regarding features of the scanner rules @@ -1216,7 +1216,7 @@ Changes between 2.1 beta-test release of June '89 and previous release: - Other changes: +Other changes: - Some portability-related bugs fixed, in particular for machines with unsigned characters or sizeof( int* ) != sizeof( int ). diff --git a/README b/README new file mode 100644 index 000000000000..0a6a70c1a021 --- /dev/null +++ b/README @@ -0,0 +1,79 @@ +This is flex, the fast lexical analyzer generator. + +flex is a tool for generating scanners: programs which recognize +lexical patterns in text. + +More information about flex as well as the latest official release of +flex can be found at: + +http://flex.sourceforge.net/ + +Bug reports should be submitted using the SourceForge Bug Tracker +facilities which can be found from flex's SourceForge project page at: + +http://sourceforge.net/projects/flex + +There are several mailing lists available as well: + +flex-announce@lists.sourceforge.net - where posts will be made +announcing new releases of flex. + +flex-help@lists.sourceforge.net - where you can post questions about +using flex + +flex-devel@lists.sourceforge.net - where you can discuss development of +flex itself + +Note that flex is distributed under a copyright very similar to that of +BSD Unix, and not under the GNU General Public License (GPL). + +This file is part of flex. + +This code is derived from software contributed to Berkeley by +Vern Paxson. + +The United States Government has rights in this work pursuant +to contract no. DE-AC03-76SF00098 between the United States +Department of Energy and the University of California. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +Neither the name of the University nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. + +The flex distribution contains the following files which may be of interest: + +README - This file. + +NEWS - current version number and list of user-visible changes. + +INSTALL - basic installation information. + +ABOUT-NLS - description of internationalization support in flex. + +COPYING - flex's copyright and license. + +doc/ - user documentation. + +examples/ - containing examples of some possible flex scanners and a +few other things. See the file examples/README for more details. + +TODO - outstanding bug reports, desired features, etc. + +tests/ - regression tests. See TESTS/README for details. + +po/ - internationalization support files. diff --git a/README-alpha b/README-alpha new file mode 100644 index 000000000000..ef3b82f2aeaf --- /dev/null +++ b/README-alpha @@ -0,0 +1,2 @@ +Beta versions and cvs snapshots of flex can be had at +ftp://ftp.uncg.edu/people/wlestes/. diff --git a/README.cvs b/README.cvs new file mode 100644 index 000000000000..65d557617ad3 --- /dev/null +++ b/README.cvs @@ -0,0 +1,46 @@ +This file gives information regarding the cvs tree of flex. The cvs +tree of flex contains the files which are under version control by +the flex maintainers for the flex project. + +You can learn about the details of retrieving a copy of the cvs flex +tree from flex's SourceForge project page at: + +http://sourceforge.net/projects/flex + +If you are not interested in flex development or you are not in need +of the latest bleeding-edge features, then the cvs flex tree is +not for you. + +When you get a distribution of flex, a large number of intermediate +files needed to make building flex easy are included. You don't have +that in the cvs tree. + +You will need various external tools in order to build the distribution. Here is +a (hopefully complete and correct) list of the required tools. Always get the latest +version of each tool; we list the versions used in development of +flex, but the listed versions may not work for you. + +compiler suite; e.g., gcc +bash or some other fairly robust sh-style shell +GNU bison; to generate parse.c from parse.y +GNU m4 1.4; required by GNU autoconf (yes, it *must* be GNU m4) +GNU autoconf 2.59 and GNU automake 1.9.6; for generating Makefiles etc. +GNU gettext 0.14.5; for i18n +flex (latest beta release); for bootstrap of scan.l +help2man 1.36; to generate the flex man page +tar, gzip, etc.; for packaging of the source distribution +GNU texinfo 4.8; to build and test the flex manual +perl; GNU automake and GNU autoconf now depend on perl to run +GNU indent 2.8; for indenting the flex source the way we want it done + +Once you have all the necessary tools installed, life becomes +simple. To prepare the flex tree for building, run the script: + +$ ./autogen.sh + +in the top level of the flex source tree. +This script calls the various tools needed to get flex ready for the +GNU-style configure script to be able to work. + +From this point on, building flex follows the usual configure, make, +make install routine. diff --git a/THANKS b/THANKS new file mode 100644 index 000000000000..ac91ef62f782 --- /dev/null +++ b/THANKS @@ -0,0 +1,53 @@ +Vern had the following things to say: + +Many thanks to the 2.5 beta-testers for finding bugs and helping test and +increase portability: Stan Adermann, Scott David Daniels, Charles Elliott, +Joe Gayda, Chris Meier, James Nordby, Terrence O'Kane, Karsten Pahnke, +Francois Pinard, Pat Rankin, Andreas Scherer, Marc Wiese, Nathan Zelle. + +Thanks to the many flex beta-testers, feedbackers, and contributors, +especially Francois Pinard, Casey Leedom, Robert Abramovitz, Stan +Adermann, Terry Allen, David Barker-Plummer, John Basrai, Neal Becker, +Nelson H.F. Beebe, benson@odi.com, Karl Berry, Peter A. Bigot, Simon +Blanchard, Keith Bostic, Frederic Brehm, Ian Brockbank, Kin Cho, Nick +Christopher, Brian Clapper, J.T. Conklin, Jason Coughlin, Bill Cox, +Nick Cropper, Dave Curtis, Scott David Daniels, Chris G. Demetriou, +Theo Deraadt, Mike Donahue, Chuck Doucette, Tom Epperly, Leo Eskin, +Chris Faylor, Chris Flatters, Jon Forrest, Jeffrey Friedl, Joe Gayda, +Kaveh R. Ghazi, Wolfgang Glunz, Eric Goldman, Christopher M. Gould, +Ulrich Grepel, Peer Griebel, Jan Hajic, Charles Hemphill, NORO Hideo, +Jarkko Hietaniemi, Scott Hofmann, Jeff Honig, Dana Hudes, Eric Hughes, +John Interrante, Ceriel Jacobs, Michal Jaegermann, Sakari Jalovaara, +Jeffrey R. Jones, Henry Juengst, Klaus Kaempf, Jonathan I. Kamens, +Terrence O Kane, Amir Katz, ken@ken.hilco.com, Kevin B. Kenny, Steve +Kirsch, Winfried Koenig, Marq Kole, Ronald Lamprecht, Greg Lee, Rohan +Lenard, Craig Leres, John Levine, Steve Liddle, David Loffredo, Mike +Long, Mohamed el Lozy, Brian Madsen, Malte, Joe Marshall, Bengt +Martensson, Chris Metcalf, Luke Mewburn, Jim Meyering, R. Alexander +Milowski, Erik Naggum, G.T. Nicol, Landon Noll, James Nordby, Marc +Nozell, Richard Ohnemus, Karsten Pahnke, Sven Panne, Roland Pesch, +Walter Pelissero, Gaumond Pierre, Esmond Pitt, Jef Poskanzer, Joe +Rahmeh, Jarmo Raiha, Frederic Raimbault, Pat Rankin, Rick Richardson, +Kevin Rodgers, Kai Uwe Rommel, Jim Roskind, Alberto Santini, Andreas +Scherer, Darrell Schiebel, Raf Schietekat, Doug Schmidt, Philippe +Schnoebelen, Andreas Schwab, Larry Schwimmer, Alex Siegel, Eckehard +Stolz, Jan-Erik Strvmquist, Mike Stump, Paul Stuart, Dave Tallman, Ian +Lance Taylor, Chris Thewalt, Richard M. Timoney, Jodi Tsai, Paul +Tuinenga, Gary Weik, Frank Whaley, Gerhard Wilhelms, Kent Williams, +Ken Yap, Ron Zellar, Nathan Zelle, David Zuhn, and those whose names +have slipped my marginal mail-archiving skills but whose contributions +are appreciated all the same. + +Thanks to Keith Bostic, Jon Forrest, Noah Friedman, +John Gilmore, Craig Leres, John Levine, Bob Mulcahy, G.T. +Nicol, Francois Pinard, Rich Salz, and Richard Stallman for help with various +distribution headaches. + +Thanks to Esmond Pitt and Earle Horton for 8-bit character support; to +Benson Margulies and Fred Burke for C++ support; to Kent Williams and Tom +Epperly for C++ class support; to Ove Ewerlid for support of NUL's; and to +Eric Hughes for support of multiple buffers. + +This work was primarily done when I was with the Real Time Systems Group +at the Lawrence Berkeley Laboratory in Berkeley, CA. Many thanks to all there +for the support I received. @@ -0,0 +1,101 @@ +* sourceforge migration + +** Move CVS to sourceforge (estes) %% + +** test the mailing lists (estes) %% + +** inform GNU folks about changeover (estes) %% + +* resolve the items in the to.do directory + +** expand the above into individual requests and handle those requests + +** transfer to.do/Wishlist contents to top level TODO file + +* the manual: + +** do an end-to-end proofread of the manual (this is under way, but is + going slowly) + +** pretty up the dvi output; overflows, etc. + +** faq + +*** clean up the faqs section. The information is good; the texinfo + could use some touching up. + +*** index the faq entries + +*** mention that it's possible to use a variable to scan matching + brackets, nested comments etc. + +*** include something about lexing/parsing fortran + +** create a section on flex design, features, etc. + +* address lex-replacement: document or provide an option through + configure for creating lex and libl.a files (but remember this has + posix implications) + +* getext + +** make sure all flex modules use gettext translation facilities + +*subdirectories + +** in examples/manual, integrate the Makefile.examples into the + Makefile.am + +* test suite + +** integrate the test suite into automake's framework (note that the + test suite can be run from the top level directory with "make + check". Still, we want to get it completely under automake's control.) + +** make test suite more complete + +* generic coding + +** move as much skeleton code as possible out of gen.c and into + flex.skl + +** figure out whether we want to add the capability to have + auto-generated backout rules + +** token-type and token buffer support + +** check if we still need to #undef macros at the end of a header + +** merge yylineno into support for location tracking + +** bug where yylineno is not decremented on REJECT + +** bug where yylineno is counted in trailing context + +* C++ + +** have a separate skeleton for c++ + +** c++ is getting so broken and different from C, that we need to + reevaluate the usefuleness of c++ in flex + +** revisit the C++ API. We get requests to make it more complete. + +* distribution + +** use bootstrapper + +** remove texinfo.tex from the cvs tree; it only needs to be present + on the system where the flex release is put together + +** use clcommit to manage ChangeLog + +Legend: + +*, **, ***: outline depth +%% at end of item: must be adressed before next major release + +Local Variables: +Mode: text +mode: outline-minor +End: diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 000000000000..20e82fdb06f5 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +# This file is part of flex. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: + +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. + +# Neither the name of the University nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE. + +# If you see no configure script, then run ./autogen.sh to create it +# and procede with the "normal" build procedures. + +#if we pretend to have a ChangeLog, then automake is less +#worried. (Don't worry, we *do* have a ChangeLog, we just need the +#Makefile first.) + +touch ChangeLog +autoreconf --install --verbose diff --git a/buf.c b/buf.c new file mode 100644 index 000000000000..33a5a9f0b2b3 --- /dev/null +++ b/buf.c @@ -0,0 +1,258 @@ +/* flex - tool to generate fast lexical analyzers */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" + +/* Take note: The buffer object is sometimes used as a String buffer (one + * continuous string), and sometimes used as a list of strings, usually line by + * line. + * + * The type is specified in buf_init by the elt_size. If the elt_size is + * sizeof(char), then the buffer should be treated as string buffer. If the + * elt_size is sizeof(char*), then the buffer should be treated as a list of + * strings. + * + * Certain functions are only appropriate for one type or the other. + */ + +/* global buffers. */ +struct Buf userdef_buf; /**< for user #definitions triggered by cmd-line. */ +struct Buf defs_buf; /**< for #define's autogenerated. List of strings. */ +struct Buf yydmap_buf; /**< string buffer to hold yydmap elements */ +struct Buf m4defs_buf; /**< m4 definitions. List of strings. */ +struct Buf top_buf; /**< contains %top code. String buffer. */ + +struct Buf *buf_print_strings(struct Buf * buf, FILE* out) +{ + int i; + + if(!buf || !out) + return buf; + + for (i=0; i < buf->nelts; i++){ + const char * s = ((char**)buf->elts)[i]; + if(s) + fprintf(out, "%s", s); + } + return buf; +} + +/* Append a "%s" formatted string to a string buffer */ +struct Buf *buf_prints (struct Buf *buf, const char *fmt, const char *s) +{ + char *t; + size_t tsz; + + t = flex_alloc (tsz = strlen (fmt) + strlen (s) + 1); + snprintf (t, tsz, fmt, s); + buf = buf_strappend (buf, t); + flex_free (t); + return buf; +} + +/** Append a line directive to the string buffer. + * @param buf A string buffer. + * @param filename file name + * @param lineno line number + * @return buf + */ +struct Buf *buf_linedir (struct Buf *buf, const char* filename, int lineno) +{ + char *t, *fmt = "#line %d \"%s\"\n"; + size_t tsz; + + t = flex_alloc (tsz = strlen (fmt) + strlen (filename) + (int)(1 + log10(lineno>=0?lineno:-lineno)) + 1); + snprintf (t, tsz, fmt, lineno, filename); + buf = buf_strappend (buf, t); + flex_free (t); + return buf; +} + + +/** Append the contents of @a src to @a dest. + * @param @a dest the destination buffer + * @param @a dest the source buffer + * @return @a dest + */ +struct Buf *buf_concat(struct Buf* dest, const struct Buf* src) +{ + buf_append(dest, src->elts, src->nelts); + return dest; +} + + +/* Appends n characters in str to buf. */ +struct Buf *buf_strnappend (buf, str, n) + struct Buf *buf; + const char *str; + int n; +{ + buf_append (buf, str, n + 1); + + /* "undo" the '\0' character that buf_append() already copied. */ + buf->nelts--; + + return buf; +} + +/* Appends characters in str to buf. */ +struct Buf *buf_strappend (buf, str) + struct Buf *buf; + const char *str; +{ + return buf_strnappend (buf, str, strlen (str)); +} + +/* appends "#define str def\n" */ +struct Buf *buf_strdefine (buf, str, def) + struct Buf *buf; + const char *str; + const char *def; +{ + buf_strappend (buf, "#define "); + buf_strappend (buf, " "); + buf_strappend (buf, str); + buf_strappend (buf, " "); + buf_strappend (buf, def); + buf_strappend (buf, "\n"); + return buf; +} + +/** Pushes "m4_define( [[def]], [[val]])m4_dnl" to end of buffer. + * @param buf A buffer as a list of strings. + * @param def The m4 symbol to define. + * @param val The definition; may be NULL. + * @return buf + */ +struct Buf *buf_m4_define (struct Buf *buf, const char* def, const char* val) +{ + const char * fmt = "m4_define( [[%s]], [[%s]])m4_dnl\n"; + char * str; + size_t strsz; + + val = val?val:""; + str = (char*)flex_alloc(strsz = strlen(fmt) + strlen(def) + strlen(val) + 2); + + snprintf(str, strsz, fmt, def, val); + buf_append(buf, &str, 1); + return buf; +} + +/** Pushes "m4_undefine([[def]])m4_dnl" to end of buffer. + * @param buf A buffer as a list of strings. + * @param def The m4 symbol to undefine. + * @return buf + */ +struct Buf *buf_m4_undefine (struct Buf *buf, const char* def) +{ + const char * fmt = "m4_undefine( [[%s]])m4_dnl\n"; + char * str; + size_t strsz; + + str = (char*)flex_alloc(strsz = strlen(fmt) + strlen(def) + 2); + + snprintf(str, strsz, fmt, def); + buf_append(buf, &str, 1); + return buf; +} + +/* create buf with 0 elements, each of size elem_size. */ +void buf_init (buf, elem_size) + struct Buf *buf; + size_t elem_size; +{ + buf->elts = (void *) 0; + buf->nelts = 0; + buf->elt_size = elem_size; + buf->nmax = 0; +} + +/* frees memory */ +void buf_destroy (buf) + struct Buf *buf; +{ + if (buf && buf->elts) + flex_free (buf->elts); + buf->elts = (void *) 0; +} + + +/* appends ptr[] to buf, grow if necessary. + * n_elem is number of elements in ptr[], NOT bytes. + * returns buf. + * We grow by mod(512) boundaries. + */ + +struct Buf *buf_append (buf, ptr, n_elem) + struct Buf *buf; + const void *ptr; + int n_elem; +{ + int n_alloc = 0; + + if (!ptr || n_elem == 0) + return buf; + + /* May need to alloc more. */ + if (n_elem + buf->nelts > buf->nmax) { + + /* exact amount needed... */ + n_alloc = (n_elem + buf->nelts) * buf->elt_size; + + /* ...plus some extra */ + if (((n_alloc * buf->elt_size) % 512) != 0 + && buf->elt_size < 512) + n_alloc += + (512 - + ((n_alloc * buf->elt_size) % 512)) / + buf->elt_size; + + if (!buf->elts) + buf->elts = + allocate_array (n_alloc, buf->elt_size); + else + buf->elts = + reallocate_array (buf->elts, n_alloc, + buf->elt_size); + + buf->nmax = n_alloc; + } + + memcpy ((char *) buf->elts + buf->nelts * buf->elt_size, ptr, + n_elem * buf->elt_size); + buf->nelts += n_elem; + + return buf; +} + +/* vim:set tabstop=8 softtabstop=4 shiftwidth=4: */ diff --git a/ccl.c b/ccl.c new file mode 100644 index 000000000000..8d66bb62b18f --- /dev/null +++ b/ccl.c @@ -0,0 +1,310 @@ +/* ccl - routines for character classes */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ + /* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" + +/* return true if the chr is in the ccl. Takes negation into account. */ +static bool +ccl_contains (const int cclp, const int ch) +{ + int ind, len, i; + + len = ccllen[cclp]; + ind = cclmap[cclp]; + + for (i = 0; i < len; ++i) + if (ccltbl[ind + i] == ch) + return !cclng[cclp]; + + return cclng[cclp]; +} + + +/* ccladd - add a single character to a ccl */ + +void ccladd (cclp, ch) + int cclp; + int ch; +{ + int ind, len, newpos, i; + + check_char (ch); + + len = ccllen[cclp]; + ind = cclmap[cclp]; + + /* check to see if the character is already in the ccl */ + + for (i = 0; i < len; ++i) + if (ccltbl[ind + i] == ch) + return; + + /* mark newlines */ + if (ch == nlch) + ccl_has_nl[cclp] = true; + + newpos = ind + len; + + if (newpos >= current_max_ccl_tbl_size) { + current_max_ccl_tbl_size += MAX_CCL_TBL_SIZE_INCREMENT; + + ++num_reallocs; + + ccltbl = reallocate_Character_array (ccltbl, + current_max_ccl_tbl_size); + } + + ccllen[cclp] = len + 1; + ccltbl[newpos] = ch; +} + +/* dump_cclp - same thing as list_character_set, but for cclps. */ + +static void dump_cclp (FILE* file, int cclp) +{ + register int i; + + putc ('[', file); + + for (i = 0; i < csize; ++i) { + if (ccl_contains(cclp, i)){ + register int start_char = i; + + putc (' ', file); + + fputs (readable_form (i), file); + + while (++i < csize && ccl_contains(cclp,i)) ; + + if (i - 1 > start_char) + /* this was a run */ + fprintf (file, "-%s", + readable_form (i - 1)); + + putc (' ', file); + } + } + + putc (']', file); +} + + + +/* ccl_set_diff - create a new ccl as the set difference of the two given ccls. */ +int +ccl_set_diff (int a, int b) +{ + int d, ch; + + /* create new class */ + d = cclinit(); + + /* In order to handle negation, we spin through all possible chars, + * addding each char in a that is not in b. + * (This could be O(n^2), but n is small and bounded.) + */ + for ( ch = 0; ch < csize; ++ch ) + if (ccl_contains (a, ch) && !ccl_contains(b, ch)) + ccladd (d, ch); + + /* debug */ + if (0){ + fprintf(stderr, "ccl_set_diff ("); + fprintf(stderr, "\n "); + dump_cclp (stderr, a); + fprintf(stderr, "\n "); + dump_cclp (stderr, b); + fprintf(stderr, "\n "); + dump_cclp (stderr, d); + fprintf(stderr, "\n)\n"); + } + return d; +} + +/* ccl_set_union - create a new ccl as the set union of the two given ccls. */ +int +ccl_set_union (int a, int b) +{ + int d, i; + + /* create new class */ + d = cclinit(); + + /* Add all of a */ + for (i = 0; i < ccllen[a]; ++i) + ccladd (d, ccltbl[cclmap[a] + i]); + + /* Add all of b */ + for (i = 0; i < ccllen[b]; ++i) + ccladd (d, ccltbl[cclmap[b] + i]); + + /* debug */ + if (0){ + fprintf(stderr, "ccl_set_union (%d + %d = %d", a, b, d); + fprintf(stderr, "\n "); + dump_cclp (stderr, a); + fprintf(stderr, "\n "); + dump_cclp (stderr, b); + fprintf(stderr, "\n "); + dump_cclp (stderr, d); + fprintf(stderr, "\n)\n"); + } + return d; +} + + +/* cclinit - return an empty ccl */ + +int cclinit () +{ + if (++lastccl >= current_maxccls) { + current_maxccls += MAX_CCLS_INCREMENT; + + ++num_reallocs; + + cclmap = + reallocate_integer_array (cclmap, current_maxccls); + ccllen = + reallocate_integer_array (ccllen, current_maxccls); + cclng = reallocate_integer_array (cclng, current_maxccls); + ccl_has_nl = + reallocate_bool_array (ccl_has_nl, + current_maxccls); + } + + if (lastccl == 1) + /* we're making the first ccl */ + cclmap[lastccl] = 0; + + else + /* The new pointer is just past the end of the last ccl. + * Since the cclmap points to the \first/ character of a + * ccl, adding the length of the ccl to the cclmap pointer + * will produce a cursor to the first free space. + */ + cclmap[lastccl] = + cclmap[lastccl - 1] + ccllen[lastccl - 1]; + + ccllen[lastccl] = 0; + cclng[lastccl] = 0; /* ccl's start out life un-negated */ + ccl_has_nl[lastccl] = false; + + return lastccl; +} + + +/* cclnegate - negate the given ccl */ + +void cclnegate (cclp) + int cclp; +{ + cclng[cclp] = 1; + ccl_has_nl[cclp] = !ccl_has_nl[cclp]; +} + + +/* list_character_set - list the members of a set of characters in CCL form + * + * Writes to the given file a character-class representation of those + * characters present in the given CCL. A character is present if it + * has a non-zero value in the cset array. + */ + +void list_character_set (file, cset) + FILE *file; + int cset[]; +{ + register int i; + + putc ('[', file); + + for (i = 0; i < csize; ++i) { + if (cset[i]) { + register int start_char = i; + + putc (' ', file); + + fputs (readable_form (i), file); + + while (++i < csize && cset[i]) ; + + if (i - 1 > start_char) + /* this was a run */ + fprintf (file, "-%s", + readable_form (i - 1)); + + putc (' ', file); + } + } + + putc (']', file); +} + +/** Determines if the range [c1-c2] is unambiguous in a case-insensitive + * scanner. Specifically, if a lowercase or uppercase character, x, is in the + * range [c1-c2], then we require that UPPERCASE(x) and LOWERCASE(x) must also + * be in the range. If not, then this range is ambiguous, and the function + * returns false. For example, [@-_] spans [a-z] but not [A-Z]. Beware that + * [a-z] will be labeled ambiguous because it does not include [A-Z]. + * + * @param c1 the lower end of the range + * @param c2 the upper end of the range + * @return true if [c1-c2] is not ambiguous for a caseless scanner. + */ +bool range_covers_case (int c1, int c2) +{ + int i, o; + + for (i = c1; i <= c2; i++) { + if (has_case (i)) { + o = reverse_case (i); + if (o < c1 || c2 < o) + return false; + } + } + return true; +} + +/** Reverse the case of a character, if possible. + * @return c if case-reversal does not apply. + */ +int reverse_case (int c) +{ + return isupper (c) ? tolower (c) : (islower (c) ? toupper (c) : c); +} + +/** Return true if c is uppercase or lowercase. */ +bool has_case (int c) +{ + return (isupper (c) || islower (c)) ? true : false; +} diff --git a/compile b/compile new file mode 100755 index 000000000000..1b1d23216958 --- /dev/null +++ b/compile @@ -0,0 +1,142 @@ +#! /bin/sh +# Wrapper for compilers which do not understand `-c -o'. + +scriptversion=2005-05-14.22 + +# Copyright (C) 1999, 2000, 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 command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand `-c -o'. +Remove `-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file `INSTALL'. + +Report bugs to <bug-automake@gnu.org>. +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; +esac + +ofile= +cfile= +eat= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as `compile cc -o foo foo.c'. + # So we strip `-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no `-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # `.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` + +# Create the lock directory. +# Note: use `[/.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +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/conf.in b/conf.in new file mode 100644 index 000000000000..7f73b843a07d --- /dev/null +++ b/conf.in @@ -0,0 +1,197 @@ +/* conf.in. Generated from configure.in by autoheader. */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#undef ENABLE_NLS + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#undef HAVE_DCGETTEXT + +/* 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 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 to 1 if you have the `isascii' function. */ +#undef HAVE_ISASCII + +/* Define to 1 if you have the <libintl.h> header file. */ +#undef HAVE_LIBINTL_H + +/* Define to 1 if you have the `m' library (-lm). */ +#undef HAVE_LIBM + +/* pthread library */ +#undef HAVE_LIBPTHREAD + +/* Define to 1 if you have the <limits.h> header file. */ +#undef HAVE_LIMITS_H + +/* 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 you have the <malloc.h> header file. */ +#undef HAVE_MALLOC_H + +/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the <netinet/in.h> header file. */ +#undef HAVE_NETINET_IN_H + +/* Define to 1 if you have the `pow' function. */ +#undef HAVE_POW + +/* Define to 1 if you have the <pthread.h> header file. */ +#undef HAVE_PTHREAD_H + +/* Define to 1 if your system has a GNU libc compatible `realloc' function, + and to 0 otherwise. */ +#undef HAVE_REALLOC + +/* Define to 1 if you have the `regcomp' function. */ +#undef HAVE_REGCOMP + +/* 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 <stddef.h> header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the <stdint.h> header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the <stdlib.h> header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strchr' function. */ +#undef HAVE_STRCHR + +/* 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 to 1 if you have the `strtol' function. */ +#undef HAVE_STRTOL + +/* 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/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 <unistd.h> header file. */ +#undef HAVE_UNISTD_H + +/* 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 `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 + +/* 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 + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +#undef YYTEXT_POINTER + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to rpl_malloc if the replacement function should be used. */ +#undef malloc + +/* Define to `int' if <sys/types.h> does not define. */ +#undef pid_t + +/* Define to rpl_realloc if the replacement function should be used. */ +#undef realloc + +/* Define to `unsigned' if <sys/types.h> does not define. */ +#undef size_t + +/* Define as `fork' if `vfork' does not work. */ +#undef vfork diff --git a/config.guess b/config.guess new file mode 100755 index 000000000000..ad5281e66e9d --- /dev/null +++ b/config.guess @@ -0,0 +1,1466 @@ +#! /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-08-03' + +# 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*:*:* | x86_64: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; } + ;; + or32:Linux:*:*) + echo or32-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/config.rpath b/config.rpath new file mode 100755 index 000000000000..fa24bfc2d785 --- /dev/null +++ b/config.rpath @@ -0,0 +1,548 @@ +#! /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-2003 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 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 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. +# +# 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. +# +# 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 M$VC, +# 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 AC_LIBTOOL_PROG_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + mingw* | pw32* | os2*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux*) + case $CC in + icc|ecc) + wl='-Wl,' + ;; + ccc) + wl='-Wl,' + ;; + 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*) + ;; + 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 + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + 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 can use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | egrep ': 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 + ;; + netbsd*) + ;; + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = yes; then + # 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' + 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 + ;; + bsdi4*) + ;; + 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*) + if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then + hardcode_direct=no + 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*) + 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* | hpux11*) + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=no + ;; + ia64*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=no + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + *) + 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 + ;; + 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=: + ;; + sco3.2v5*) + ;; + 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.2uw2*) + hardcode_direct=yes + hardcode_minus_L=no + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + ;; + sysv5*) + hardcode_libdir_flag_spec= + ;; + 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*) + ;; + bsdi4*) + ;; + cygwin* | mingw* | pw32*) + shrext=.dll + ;; + darwin* | rhapsody*) + shrext=.dylib + ;; + dgux*) + ;; + freebsd1*) + ;; + freebsd*) + ;; + gnu*) + ;; + hpux9* | hpux10* | hpux11*) + case "$host_cpu" in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + ;; + 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*) + ;; + netbsd*) + ;; + newsos6) + ;; + nto-qnx) + ;; + openbsd*) + ;; + os2*) + libname_spec='$name' + shrext=.dll + ;; + osf3* | osf4* | osf5*) + ;; + sco3.2v5*) + ;; + solaris*) + ;; + sunos4*) + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + ;; + sysv4*MP*) + ;; + 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"` + +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/config.sub b/config.sub new file mode 100755 index 000000000000..1c366dfde9ab --- /dev/null +++ b/config.sub @@ -0,0 +1,1579 @@ +#! /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/configure b/configure new file mode 100755 index 000000000000..5fefb23eefaa --- /dev/null +++ b/configure @@ -0,0 +1,11131 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.59 for the fast lexical analyser generator 2.5.35. +# +# Report bugs to <flex-help@lists.sourceforge.net>. +# +# 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='the fast lexical analyser generator' +PACKAGE_TARNAME='flex' +PACKAGE_VERSION='2.5.35' +PACKAGE_STRING='the fast lexical analyser generator 2.5.35' +PACKAGE_BUGREPORT='flex-help@lists.sourceforge.net' + +ac_unique_file="scan.l" +# 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" + +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 MKINSTALLDIRS USE_NLS MSGFMT GMSGFMT XGETTEXT MSGMERGE 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 build build_cpu build_vendor build_os host host_cpu host_vendor host_os LIBICONV LTLIBICONV INTLLIBS LIBINTL LTLIBINTL POSUB YACC LEX LEXLIB LEX_OUTPUT_ROOT CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE LN_S RANLIB ac_ct_RANLIB BISON HELP2MAN M4 INDENT ALLOCA CPP EGREP LIBOBJS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CXX_set=${CXX+set} +ac_env_CXX_value=$CXX +ac_cv_env_CXX_set=${CXX+set} +ac_cv_env_CXX_value=$CXX +ac_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_env_CXXFLAGS_value=$CXXFLAGS +ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_cv_env_CXXFLAGS_value=$CXXFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# 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 the fast lexical analyser generator 2.5.35 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 the fast lexical analyser generator 2.5.35:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-nls do not use Native Language Support + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --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-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> + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to <flex-help@lists.sourceforge.net>. +_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 +the fast lexical analyser generator configure 2.5.35 +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 the fast lexical analyser generator $as_me 2.5.35, 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +am__api_version="1.9" +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; 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 $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&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. + +# 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='flex' + VERSION='2.5.35' + + +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:conf.in" + + +# checks for programs + + + 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 + if $ac_dir/$ac_word --statistics /dev/null >/dev/null 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 + if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 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 + if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 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" + +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 + + +# 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. + if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + 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. +if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then + acl_cv_prog_gnu_ld=yes +else + acl_cv_prog_gnu_ld=no +fi +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; + + + + + + + + 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/lib" + 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/lib"; 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 + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + 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*) 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/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) 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 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 (int) 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/lib" + 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/lib"; 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 + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + 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*) 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/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) 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 (); +int +main () +{ +bindtextdomain ("", ""); +return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (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 + 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 (); +int +main () +{ +bindtextdomain ("", ""); +return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (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 + 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 "$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" + + + + + + + + +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" + +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 +if test "$LEX" = :; then + LEX=${am_missing_run}flex +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 + + +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 ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6 +fi + +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 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 + +# 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' + + +# Extract the first word of "bison", so it can be a program name with args. +set dummy bison; 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_BISON+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $BISON in + [\\/]* | ?:[\\/]*) + ac_cv_path_BISON="$BISON" # 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_BISON="$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_BISON" && ac_cv_path_BISON="bison" + ;; +esac +fi +BISON=$ac_cv_path_BISON + +if test -n "$BISON"; then + echo "$as_me:$LINENO: result: $BISON" >&5 +echo "${ECHO_T}$BISON" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +# Extract the first word of "help2man", so it can be a program name with args. +set dummy help2man; 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_HELP2MAN+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $HELP2MAN in + [\\/]* | ?:[\\/]*) + ac_cv_path_HELP2MAN="$HELP2MAN" # 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_HELP2MAN="$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_HELP2MAN" && ac_cv_path_HELP2MAN="help2man" + ;; +esac +fi +HELP2MAN=$ac_cv_path_HELP2MAN + +if test -n "$HELP2MAN"; then + echo "$as_me:$LINENO: result: $HELP2MAN" >&5 +echo "${ECHO_T}$HELP2MAN" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + +# Check for a GNU m4 that supports --prefix-builtins + +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" + + +if test x"$M4" != x; then + echo "$as_me:$LINENO: checking for GNU m4" >&5 +echo $ECHO_N "checking for GNU m4... $ECHO_C" >&6 + case `$M4 --help < /dev/null 2>&1` in + *prefix-builtins*) echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 ;; + *) echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 ; + { { 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; }; } ;; + esac +else + { { 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 + + +# Extract the first word of "indent", so it can be a program name with args. +set dummy indent; 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_INDENT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $INDENT in + [\\/]* | ?:[\\/]*) + ac_cv_path_INDENT="$INDENT" # 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_INDENT="$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_INDENT" && ac_cv_path_INDENT="indent" + ;; +esac +fi +INDENT=$ac_cv_path_INDENT + +if test -n "$INDENT"; then + echo "$as_me:$LINENO: result: $INDENT" >&5 +echo "${ECHO_T}$INDENT" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +# if INDENT is set to 'indent' then we didn't find indent +if test "$INDENT" != indent ; then + echo "$as_me:$LINENO: checking if $INDENT is GNU indent" >&5 +echo $ECHO_N "checking if $INDENT is GNU indent... $ECHO_C" >&6 + if $INDENT --version 2>/dev/null | head -n 1|grep "GNU indent" > /dev/null ; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: WARNING: $INDENT does not appear to be GNU indent." >&5 +echo "$as_me: WARNING: $INDENT does not appear to be GNU indent." >&2;} + fi +else + { echo "$as_me:$LINENO: WARNING: no indent program found: make indent target will not function" >&5 +echo "$as_me: WARNING: no indent program found: make indent target will not function" >&2;} +fi + +# checks for libraries + +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 + + +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +echo "$as_me:$LINENO: checking for working alloca.h" >&5 +echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6 +if test "${ac_cv_working_alloca_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 <alloca.h> +int +main () +{ +char *p = (char *) alloca (2 * sizeof (int)); + ; + 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_working_alloca_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_working_alloca_h=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5 +echo "${ECHO_T}$ac_cv_working_alloca_h" >&6 +if test $ac_cv_working_alloca_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA_H 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for alloca" >&5 +echo $ECHO_N "checking for alloca... $ECHO_C" >&6 +if test "${ac_cv_func_alloca_works+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. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include <malloc.h> +# define alloca _alloca +# else +# if HAVE_ALLOCA_H +# include <alloca.h> +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +int +main () +{ +char *p = (char *) alloca (1); + ; + 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_alloca_works=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_alloca_works=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5 +echo "${ECHO_T}$ac_cv_func_alloca_works" >&6 + +if test $ac_cv_func_alloca_works = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA 1 +_ACEOF + +else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +# that cause trouble. Some versions do not even contain alloca or +# contain a buggy version. If you still want to use their alloca, +# use ar to extract alloca.o from them instead of compiling alloca.c. + +ALLOCA=alloca.$ac_objext + +cat >>confdefs.h <<\_ACEOF +#define C_ALLOCA 1 +_ACEOF + + +echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5 +echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6 +if test "${ac_cv_os_cray+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 defined(CRAY) && ! defined(CRAY2) +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then + ac_cv_os_cray=yes +else + ac_cv_os_cray=no +fi +rm -f conftest* + +fi +echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 +echo "${ECHO_T}$ac_cv_os_cray" >&6 +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; 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 CRAY_STACKSEG_END $ac_func +_ACEOF + + break +fi + + done +fi + +echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 +echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6 +if test "${ac_cv_c_stack_direction+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_c_stack_direction=0 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +int +find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} + +int +main () +{ + exit (find_stack_direction () < 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_c_stack_direction=1 +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_c_stack_direction=-1 +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_c_stack_direction" >&5 +echo "${ECHO_T}$ac_cv_c_stack_direction" >&6 + +cat >>confdefs.h <<_ACEOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +_ACEOF + + +fi + +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 + +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 + +# 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 + + + + + + + + + + + + + +for ac_header in inttypes.h libintl.h limits.h locale.h malloc.h netinet/in.h stddef.h stdlib.h string.h strings.h 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 flex-help@lists.sourceforge.net ## +## ---------------------------------------------- ## +_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 log10 in -lm" >&5 +echo $ECHO_N "checking for log10 in -lm... $ECHO_C" >&6 +if test "${ac_cv_lib_m_log10+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any 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 log10 (); +int +main () +{ +log10 (); + ; + 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_m_log10=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_m_log10=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_m_log10" >&5 +echo "${ECHO_T}$ac_cv_lib_m_log10" >&6 +if test $ac_cv_lib_m_log10 = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBM 1 +_ACEOF + + LIBS="-lm $LIBS" + +fi + + +# The test test-pthread uses libpthread, so we check for it here, but +# all we need is the preprocessor symbol defined since we don't need +# LIBS to include libpthread for building flex. + +echo "$as_me:$LINENO: checking for pthread_mutex_lock in -lpthread" >&5 +echo $ECHO_N "checking for pthread_mutex_lock in -lpthread... $ECHO_C" >&6 +if test "${ac_cv_lib_pthread_pthread_mutex_lock+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $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 pthread_mutex_lock (); +int +main () +{ +pthread_mutex_lock (); + ; + 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_pthread_pthread_mutex_lock=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_pthread_pthread_mutex_lock=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_pthread_pthread_mutex_lock" >&5 +echo "${ECHO_T}$ac_cv_lib_pthread_pthread_mutex_lock" >&6 +if test $ac_cv_lib_pthread_pthread_mutex_lock = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LIBPTHREAD 1 +_ACEOF + +else + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LIBPTHREAD 0 +_ACEOF + + +fi + + +for ac_header in pthread.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 flex-help@lists.sourceforge.net ## +## ---------------------------------------------- ## +_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 + + +# Checks for typedefs, structures, and compiler characteristics. + +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]; + +int +main () +{ + return !a + !b + !c + !d + !e + !f + !g + !h + !i; + ; + 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 + +echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 +if test "${ac_cv_c_const+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 () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset x; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *ccp; + char **p; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + ccp = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++ccp; + p = (char**) ccp; + ccp = (char const *const *) p; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + } +#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_c_const=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_c_const=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6 +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for size_t" >&5 +echo $ECHO_N "checking for size_t... $ECHO_C" >&6 +if test "${ac_cv_type_size_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 ((size_t *) 0) + return 0; +if (sizeof (size_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_size_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_size_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +echo "${ECHO_T}$ac_cv_type_size_t" >&6 +if test $ac_cv_type_size_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned +_ACEOF + +fi + + +# Checks for library functions. + +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 + + + +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 flex-help@lists.sourceforge.net ## +## ---------------------------------------------- ## +_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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* By Ruediger Kuhlmann. */ + if (fork() < 0) + 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_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 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 flex-help@lists.sourceforge.net ## +## ---------------------------------------------- ## +_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_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 flex-help@lists.sourceforge.net ## +## ---------------------------------------------- ## +_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 realloc" >&5 +echo $ECHO_N "checking for GNU libc compatible realloc... $ECHO_C" >&6 +if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_realloc_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 *realloc (); +#endif + +int +main () +{ +exit (realloc (0, 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_realloc_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_realloc_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_realloc_0_nonnull" >&5 +echo "${ECHO_T}$ac_cv_func_realloc_0_nonnull" >&6 +if test $ac_cv_func_realloc_0_nonnull = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_REALLOC 1 +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define HAVE_REALLOC 0 +_ACEOF + + case $LIBOBJS in + "realloc.$ac_objext" | \ + *" realloc.$ac_objext" | \ + "realloc.$ac_objext "* | \ + *" realloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;; +esac + + +cat >>confdefs.h <<\_ACEOF +#define realloc rpl_realloc +_ACEOF + +fi + + + + + + + + + + + +for ac_func in dup2 isascii memset pow regcomp setlocale strchr 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 + +fi +done + + + ac_config_files="$ac_config_files Makefile doc/Makefile examples/Makefile examples/fastwc/Makefile examples/manual/Makefile m4/Makefile po/Makefile.in tools/Makefile tests/Makefile tests/TEMPLATE/Makefile tests/test-array-nr/Makefile tests/test-array-r/Makefile tests/test-basic-nr/Makefile tests/test-basic-r/Makefile tests/test-bison-yylloc/Makefile tests/test-bison-yylval/Makefile tests/test-c-cpp-nr/Makefile tests/test-c-cpp-r/Makefile tests/test-header-nr/Makefile tests/test-header-r/Makefile tests/test-include-by-buffer/Makefile tests/test-include-by-push/Makefile tests/test-include-by-reentrant/Makefile tests/test-multiple-scanners-nr/Makefile tests/test-multiple-scanners-r/Makefile tests/test-noansi-nr/Makefile tests/test-noansi-r/Makefile tests/test-prefix-nr/Makefile tests/test-prefix-r/Makefile tests/test-pthread/Makefile tests/test-string-nr/Makefile tests/test-string-r/Makefile tests/test-yyextra/Makefile tests/test-alloc-extra/Makefile tests/test-lineno-nr/Makefile tests/test-lineno-r/Makefile tests/test-linedir-r/Makefile tests/test-debug-r/Makefile tests/test-debug-nr/Makefile tests/test-mem-nr/Makefile tests/test-mem-r/Makefile tests/test-posix/Makefile tests/test-posixly-correct/Makefile tests/test-table-opts/Makefile tests/test-c++-basic/Makefile tests/test-bison-nr/Makefile tests/test-reject/Makefile tests/test-c++-multiple-scanners/Makefile tests/test-top/Makefile tests/test-rescan-nr/Makefile tests/test-rescan-r/Makefile tests/test-quotes/Makefile tests/test-ccl/Makefile tests/test-extended/Makefile tests/test-c++-yywrap/Makefile tests/test-concatenated-options/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__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 + +: ${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 the fast lexical analyser generator $as_me 2.5.35, 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="\\ +the fast lexical analyser generator config.status 2.5.35 +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. +# + +# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, 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%}" + +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; + "examples/fastwc/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/fastwc/Makefile" ;; + "examples/manual/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/manual/Makefile" ;; + "m4/Makefile" ) CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; + "po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; + "tools/Makefile" ) CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;; + "tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; + "tests/TEMPLATE/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/TEMPLATE/Makefile" ;; + "tests/test-array-nr/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-array-nr/Makefile" ;; + "tests/test-array-r/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-array-r/Makefile" ;; + "tests/test-basic-nr/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-basic-nr/Makefile" ;; + "tests/test-basic-r/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-basic-r/Makefile" ;; + "tests/test-bison-yylloc/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-bison-yylloc/Makefile" ;; + "tests/test-bison-yylval/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-bison-yylval/Makefile" ;; + "tests/test-c-cpp-nr/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-c-cpp-nr/Makefile" ;; + "tests/test-c-cpp-r/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-c-cpp-r/Makefile" ;; + "tests/test-header-nr/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-header-nr/Makefile" ;; + "tests/test-header-r/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-header-r/Makefile" ;; + "tests/test-include-by-buffer/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-include-by-buffer/Makefile" ;; + "tests/test-include-by-push/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-include-by-push/Makefile" ;; + "tests/test-include-by-reentrant/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-include-by-reentrant/Makefile" ;; + "tests/test-multiple-scanners-nr/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-multiple-scanners-nr/Makefile" ;; + "tests/test-multiple-scanners-r/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-multiple-scanners-r/Makefile" ;; + "tests/test-noansi-nr/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-noansi-nr/Makefile" ;; + "tests/test-noansi-r/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-noansi-r/Makefile" ;; + "tests/test-prefix-nr/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-prefix-nr/Makefile" ;; + "tests/test-prefix-r/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-prefix-r/Makefile" ;; + "tests/test-pthread/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-pthread/Makefile" ;; + "tests/test-string-nr/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-string-nr/Makefile" ;; + "tests/test-string-r/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-string-r/Makefile" ;; + "tests/test-yyextra/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-yyextra/Makefile" ;; + "tests/test-alloc-extra/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-alloc-extra/Makefile" ;; + "tests/test-lineno-nr/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-lineno-nr/Makefile" ;; + "tests/test-lineno-r/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-lineno-r/Makefile" ;; + "tests/test-linedir-r/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-linedir-r/Makefile" ;; + "tests/test-debug-r/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-debug-r/Makefile" ;; + "tests/test-debug-nr/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-debug-nr/Makefile" ;; + "tests/test-mem-nr/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-mem-nr/Makefile" ;; + "tests/test-mem-r/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-mem-r/Makefile" ;; + "tests/test-posix/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-posix/Makefile" ;; + "tests/test-posixly-correct/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-posixly-correct/Makefile" ;; + "tests/test-table-opts/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-table-opts/Makefile" ;; + "tests/test-c++-basic/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-c++-basic/Makefile" ;; + "tests/test-bison-nr/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-bison-nr/Makefile" ;; + "tests/test-reject/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-reject/Makefile" ;; + "tests/test-c++-multiple-scanners/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-c++-multiple-scanners/Makefile" ;; + "tests/test-top/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-top/Makefile" ;; + "tests/test-rescan-nr/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-rescan-nr/Makefile" ;; + "tests/test-rescan-r/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-rescan-r/Makefile" ;; + "tests/test-quotes/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-quotes/Makefile" ;; + "tests/test-ccl/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-ccl/Makefile" ;; + "tests/test-extended/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-extended/Makefile" ;; + "tests/test-c++-yywrap/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-c++-yywrap/Makefile" ;; + "tests/test-concatenated-options/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/test-concatenated-options/Makefile" ;; + "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; + "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h:conf.in" ;; + *) { { 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,@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,@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,@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,@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,@YACC@,$YACC,;t t +s,@LEX@,$LEX,;t t +s,@LEXLIB@,$LEXLIB,;t t +s,@LEX_OUTPUT_ROOT@,$LEX_OUTPUT_ROOT,;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,@LN_S@,$LN_S,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@BISON@,$BISON,;t t +s,@HELP2MAN@,$HELP2MAN,;t t +s,@M4@,$M4,;t t +s,@INDENT@,$INDENT,;t t +s,@ALLOCA@,$ALLOCA,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# 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 + +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 + 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 + 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, GMOFILES, UPDATEPOFILES, DUMMYPOFILES 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" "$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 + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + GMOFILES= + UPDATEPOFILES= + DUMMYPOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + 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|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|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 ;; + 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 + ;; + 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.in b/configure.in new file mode 100644 index 000000000000..8f3aa958bd1d --- /dev/null +++ b/configure.in @@ -0,0 +1,173 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +# This file is part of flex. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: + +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. + +# Neither the name of the University nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE. + +# autoconf requirements and initialization + +AC_PREREQ(2.59) +AC_INIT([the fast lexical analyser generator], [2.5.35], +[flex-help@lists.sourceforge.net], [flex]) +AC_CONFIG_SRCDIR([scan.l]) +AM_INIT_AUTOMAKE([gnits dist-bzip2]) +AC_CONFIG_HEADER([config.h:conf.in]) + +# checks for programs + +AM_GNU_GETTEXT([external]) +AM_GNU_GETTEXT_VERSION(0.12) + +AC_PROG_YACC +AM_PROG_LEX +AC_PROG_CC +AC_PROG_CXX +AC_PROG_LN_S +AC_PROG_RANLIB +AC_PROG_AWK +AC_PROG_INSTALL + +AC_PATH_PROG(BISON, bison,bison) +AC_PATH_PROG(HELP2MAN, help2man, help2man) + +# Check for a GNU m4 that supports --prefix-builtins + +AC_PATH_PROGS(M4, gm4 gnum4 m4, m4) + +if test x"$M4" != x; then + AC_MSG_CHECKING([for GNU m4]) + case `$M4 --help < /dev/null 2>&1` in + *prefix-builtins*) AC_MSG_RESULT(yes) ;; + *) AC_MSG_RESULT(no) ; + AC_MSG_ERROR([GNU M4 1.4 is required]) ;; + esac +else + AC_MSG_ERROR([GNU M4 1.4 is required]) ; +fi + +AC_DEFINE_UNQUOTED([M4], ["$M4"], [Define to the GNU M4 executable name.]) + +AC_PATH_PROG(INDENT, indent, indent) +# if INDENT is set to 'indent' then we didn't find indent +if test "$INDENT" != indent ; then + AC_MSG_CHECKING(if $INDENT is GNU indent) + if $INDENT --version 2>/dev/null | head -n 1|grep "GNU indent" > /dev/null ; then + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + AC_MSG_WARN($INDENT does not appear to be GNU indent.) + fi +else + AC_MSG_WARN(no indent program found: make indent target will not function) +fi + +# checks for libraries + +AC_FUNC_ALLOCA +AC_HEADER_STDC +AC_HEADER_SYS_WAIT +AC_CHECK_HEADERS([inttypes.h libintl.h limits.h locale.h malloc.h netinet/in.h stddef.h stdlib.h string.h strings.h unistd.h]) +AC_CHECK_LIB(m, log10) + +# The test test-pthread uses libpthread, so we check for it here, but +# all we need is the preprocessor symbol defined since we don't need +# LIBS to include libpthread for building flex. + +AC_CHECK_LIB(pthread, pthread_mutex_lock, +AC_DEFINE([HAVE_LIBPTHREAD], 1, [pthread library] ), +AC_DEFINE([HAVE_LIBPTHREAD], 0, [pthread library] ) +) +AC_CHECK_HEADERS([pthread.h]) + +# Checks for typedefs, structures, and compiler characteristics. + +AC_HEADER_STDBOOL +AC_C_CONST +AC_TYPE_SIZE_T + +# Checks for library functions. + +AC_FUNC_FORK +AC_FUNC_MALLOC +AC_FUNC_REALLOC +AC_CHECK_FUNCS([dup2 isascii memset pow regcomp setlocale strchr strtol]) + +AC_CONFIG_FILES( +Makefile +doc/Makefile +examples/Makefile +examples/fastwc/Makefile +examples/manual/Makefile +m4/Makefile +po/Makefile.in +tools/Makefile +tests/Makefile +tests/TEMPLATE/Makefile +tests/test-array-nr/Makefile +tests/test-array-r/Makefile +tests/test-basic-nr/Makefile +tests/test-basic-r/Makefile +tests/test-bison-yylloc/Makefile +tests/test-bison-yylval/Makefile +tests/test-c-cpp-nr/Makefile +tests/test-c-cpp-r/Makefile +tests/test-header-nr/Makefile +tests/test-header-r/Makefile +tests/test-include-by-buffer/Makefile +tests/test-include-by-push/Makefile +tests/test-include-by-reentrant/Makefile +tests/test-multiple-scanners-nr/Makefile +tests/test-multiple-scanners-r/Makefile +tests/test-noansi-nr/Makefile +tests/test-noansi-r/Makefile +tests/test-prefix-nr/Makefile +tests/test-prefix-r/Makefile +tests/test-pthread/Makefile +tests/test-string-nr/Makefile +tests/test-string-r/Makefile +tests/test-yyextra/Makefile +tests/test-alloc-extra/Makefile +tests/test-lineno-nr/Makefile +tests/test-lineno-r/Makefile +tests/test-linedir-r/Makefile +tests/test-debug-r/Makefile +tests/test-debug-nr/Makefile +tests/test-mem-nr/Makefile +tests/test-mem-r/Makefile +tests/test-posix/Makefile +tests/test-posixly-correct/Makefile +tests/test-table-opts/Makefile +tests/test-c++-basic/Makefile +tests/test-bison-nr/Makefile +tests/test-reject/Makefile +tests/test-c++-multiple-scanners/Makefile +tests/test-top/Makefile +tests/test-rescan-nr/Makefile +tests/test-rescan-r/Makefile +tests/test-quotes/Makefile +tests/test-ccl/Makefile +tests/test-extended/Makefile +tests/test-c++-yywrap/Makefile +tests/test-concatenated-options/Makefile +dnl --new-test-here-- This line is processed by tests/create-test. +) + +AC_OUTPUT diff --git a/depcomp b/depcomp new file mode 100755 index 000000000000..04701da536f3 --- /dev/null +++ b/depcomp @@ -0,0 +1,530 @@ +#! /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/usr.bin/lex/dfa.c b/dfa.c index cccd52f30294..8613d75b02c7 100644 --- a/usr.bin/lex/dfa.c +++ b/dfa.c @@ -1,42 +1,43 @@ /* dfa - DFA construction routines */ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ -/* $Header: /home/daffy/u0/vern/flex/RCS/dfa.c,v 2.26 95/04/20 13:53:14 vern Exp $ */ +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ -#include "flexdef.h" +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" +#include "tables.h" /* declare functions that have forward references */ -void dump_associated_rules PROTO((FILE*, int)); -void dump_transitions PROTO((FILE*, int[])); -void sympartition PROTO((int[], int, int[], int[])); -int symfollowset PROTO((int[], int, int, int[])); +void dump_associated_rules PROTO ((FILE *, int)); +void dump_transitions PROTO ((FILE *, int[])); +void sympartition PROTO ((int[], int, int[], int[])); +int symfollowset PROTO ((int[], int, int, int[])); /* check_for_backing_up - check a DFA state for backing up @@ -48,32 +49,29 @@ int symfollowset PROTO((int[], int, int, int[])); * indexed by equivalence class. */ -void check_for_backing_up( ds, state ) -int ds; -int state[]; - { - if ( (reject && ! dfaacc[ds].dfaacc_set) || - (! reject && ! dfaacc[ds].dfaacc_state) ) - { /* state is non-accepting */ +void check_for_backing_up (ds, state) + int ds; + int state[]; +{ + if ((reject && !dfaacc[ds].dfaacc_set) || (!reject && !dfaacc[ds].dfaacc_state)) { /* state is non-accepting */ ++num_backing_up; - if ( backing_up_report ) - { - fprintf( backing_up_file, - _( "State #%d is non-accepting -\n" ), ds ); + if (backing_up_report) { + fprintf (backing_up_file, + _("State #%d is non-accepting -\n"), ds); /* identify the state */ - dump_associated_rules( backing_up_file, ds ); + dump_associated_rules (backing_up_file, ds); /* Now identify it further using the out- and * jam-transitions. */ - dump_transitions( backing_up_file, state ); + dump_transitions (backing_up_file, state); - putc( '\n', backing_up_file ); - } + putc ('\n', backing_up_file); } } +} /* check_trailing_context - check to see if NFA state set constitutes @@ -98,42 +96,38 @@ int state[]; * accset[1 .. nacc] is the list of accepting numbers for the DFA state. */ -void check_trailing_context( nfa_states, num_states, accset, nacc ) -int *nfa_states, num_states; -int *accset; -int nacc; - { +void check_trailing_context (nfa_states, num_states, accset, nacc) + int *nfa_states, num_states; + int *accset; + int nacc; +{ register int i, j; - for ( i = 1; i <= num_states; ++i ) - { - int ns = nfa_states[i]; + for (i = 1; i <= num_states; ++i) { + int ns = nfa_states[i]; register int type = state_type[ns]; register int ar = assoc_rule[ns]; - if ( type == STATE_NORMAL || rule_type[ar] != RULE_VARIABLE ) - { /* do nothing */ - } + if (type == STATE_NORMAL || rule_type[ar] != RULE_VARIABLE) { /* do nothing */ + } - else if ( type == STATE_TRAILING_CONTEXT ) - { + else if (type == STATE_TRAILING_CONTEXT) { /* Potential trouble. Scan set of accepting numbers * for the one marking the end of the "head". We * assume that this looping will be fairly cheap * since it's rare that an accepting number set * is large. */ - for ( j = 1; j <= nacc; ++j ) - if ( accset[j] & YY_TRAILING_HEAD_MASK ) - { - line_warning( - _( "dangerous trailing context" ), - rule_linenum[ar] ); + for (j = 1; j <= nacc; ++j) + if (accset[j] & YY_TRAILING_HEAD_MASK) { + line_warning (_ + ("dangerous trailing context"), + rule_linenum[ar]); return; - } - } + } } } +} /* dump_associated_rules - list the rules associated with a DFA state @@ -143,46 +137,44 @@ int nacc; * and writes a report to the given file. */ -void dump_associated_rules( file, ds ) -FILE *file; -int ds; - { +void dump_associated_rules (file, ds) + FILE *file; + int ds; +{ register int i, j; register int num_associated_rules = 0; - int rule_set[MAX_ASSOC_RULES + 1]; - int *dset = dss[ds]; - int size = dfasiz[ds]; + int rule_set[MAX_ASSOC_RULES + 1]; + int *dset = dss[ds]; + int size = dfasiz[ds]; - for ( i = 1; i <= size; ++i ) - { + for (i = 1; i <= size; ++i) { register int rule_num = rule_linenum[assoc_rule[dset[i]]]; - for ( j = 1; j <= num_associated_rules; ++j ) - if ( rule_num == rule_set[j] ) + for (j = 1; j <= num_associated_rules; ++j) + if (rule_num == rule_set[j]) break; - if ( j > num_associated_rules ) - { /* new rule */ - if ( num_associated_rules < MAX_ASSOC_RULES ) - rule_set[++num_associated_rules] = rule_num; - } + if (j > num_associated_rules) { /* new rule */ + if (num_associated_rules < MAX_ASSOC_RULES) + rule_set[++num_associated_rules] = + rule_num; } + } - bubble( rule_set, num_associated_rules ); - - fprintf( file, _( " associated rule line numbers:" ) ); + bubble (rule_set, num_associated_rules); - for ( i = 1; i <= num_associated_rules; ++i ) - { - if ( i % 8 == 1 ) - putc( '\n', file ); + fprintf (file, _(" associated rule line numbers:")); - fprintf( file, "\t%d", rule_set[i] ); - } + for (i = 1; i <= num_associated_rules; ++i) { + if (i % 8 == 1) + putc ('\n', file); - putc( '\n', file ); + fprintf (file, "\t%d", rule_set[i]); } + putc ('\n', file); +} + /* dump_transitions - list the transitions associated with a DFA state * @@ -195,33 +187,32 @@ int ds; * is done to the given file. */ -void dump_transitions( file, state ) -FILE *file; -int state[]; - { +void dump_transitions (file, state) + FILE *file; + int state[]; +{ register int i, ec; - int out_char_set[CSIZE]; + int out_char_set[CSIZE]; - for ( i = 0; i < csize; ++i ) - { - ec = ABS( ecgroup[i] ); + for (i = 0; i < csize; ++i) { + ec = ABS (ecgroup[i]); out_char_set[i] = state[ec]; - } + } - fprintf( file, _( " out-transitions: " ) ); + fprintf (file, _(" out-transitions: ")); - list_character_set( file, out_char_set ); + list_character_set (file, out_char_set); /* now invert the members of the set to get the jam transitions */ - for ( i = 0; i < csize; ++i ) - out_char_set[i] = ! out_char_set[i]; + for (i = 0; i < csize; ++i) + out_char_set[i] = !out_char_set[i]; - fprintf( file, _( "\n jam-transitions: EOF " ) ); + fprintf (file, _("\n jam-transitions: EOF ")); - list_character_set( file, out_char_set ); + list_character_set (file, out_char_set); - putc( '\n', file ); - } + putc ('\n', file); +} /* epsclosure - construct the epsilon closure of a set of ndfa states @@ -244,146 +235,141 @@ int state[]; * hashval is the hash value for the dfa corresponding to the state set. */ -int *epsclosure( t, ns_addr, accset, nacc_addr, hv_addr ) -int *t, *ns_addr, accset[], *nacc_addr, *hv_addr; - { +int *epsclosure (t, ns_addr, accset, nacc_addr, hv_addr) + int *t, *ns_addr, accset[], *nacc_addr, *hv_addr; +{ register int stkpos, ns, tsp; - int numstates = *ns_addr, nacc, hashval, transsym, nfaccnum; - int stkend, nstate; - static int did_stk_init = false, *stk; + int numstates = *ns_addr, nacc, hashval, transsym, nfaccnum; + int stkend, nstate; + static int did_stk_init = false, *stk; #define MARK_STATE(state) \ -trans1[state] = trans1[state] - MARKER_DIFFERENCE; +do{ trans1[state] = trans1[state] - MARKER_DIFFERENCE;} while(0) #define IS_MARKED(state) (trans1[state] < 0) #define UNMARK_STATE(state) \ -trans1[state] = trans1[state] + MARKER_DIFFERENCE; +do{ trans1[state] = trans1[state] + MARKER_DIFFERENCE;} while(0) #define CHECK_ACCEPT(state) \ -{ \ +do{ \ nfaccnum = accptnum[state]; \ if ( nfaccnum != NIL ) \ accset[++nacc] = nfaccnum; \ -} +}while(0) -#define DO_REALLOCATION \ -{ \ +#define DO_REALLOCATION() \ +do { \ current_max_dfa_size += MAX_DFA_SIZE_INCREMENT; \ ++num_reallocs; \ t = reallocate_integer_array( t, current_max_dfa_size ); \ stk = reallocate_integer_array( stk, current_max_dfa_size ); \ -} \ +}while(0) \ #define PUT_ON_STACK(state) \ -{ \ +do { \ if ( ++stkend >= current_max_dfa_size ) \ -DO_REALLOCATION \ +DO_REALLOCATION(); \ stk[stkend] = state; \ -MARK_STATE(state) \ -} +MARK_STATE(state); \ +}while(0) #define ADD_STATE(state) \ -{ \ +do { \ if ( ++numstates >= current_max_dfa_size ) \ -DO_REALLOCATION \ +DO_REALLOCATION(); \ t[numstates] = state; \ hashval += state; \ -} +}while(0) #define STACK_STATE(state) \ -{ \ -PUT_ON_STACK(state) \ -CHECK_ACCEPT(state) \ +do { \ +PUT_ON_STACK(state); \ +CHECK_ACCEPT(state); \ if ( nfaccnum != NIL || transchar[state] != SYM_EPSILON ) \ -ADD_STATE(state) \ -} +ADD_STATE(state); \ +}while(0) - if ( ! did_stk_init ) - { - stk = allocate_integer_array( current_max_dfa_size ); + if (!did_stk_init) { + stk = allocate_integer_array (current_max_dfa_size); did_stk_init = true; - } + } nacc = stkend = hashval = 0; - for ( nstate = 1; nstate <= numstates; ++nstate ) - { + for (nstate = 1; nstate <= numstates; ++nstate) { ns = t[nstate]; /* The state could be marked if we've already pushed it onto * the stack. */ - if ( ! IS_MARKED(ns) ) - { - PUT_ON_STACK(ns) - CHECK_ACCEPT(ns) + if (!IS_MARKED (ns)) { + PUT_ON_STACK (ns); + CHECK_ACCEPT (ns); hashval += ns; - } } + } - for ( stkpos = 1; stkpos <= stkend; ++stkpos ) - { + for (stkpos = 1; stkpos <= stkend; ++stkpos) { ns = stk[stkpos]; transsym = transchar[ns]; - if ( transsym == SYM_EPSILON ) - { + if (transsym == SYM_EPSILON) { tsp = trans1[ns] + MARKER_DIFFERENCE; - if ( tsp != NO_TRANSITION ) - { - if ( ! IS_MARKED(tsp) ) - STACK_STATE(tsp) + if (tsp != NO_TRANSITION) { + if (!IS_MARKED (tsp)) + STACK_STATE (tsp); tsp = trans2[ns]; - if ( tsp != NO_TRANSITION && ! IS_MARKED(tsp) ) - STACK_STATE(tsp) - } + if (tsp != NO_TRANSITION + && !IS_MARKED (tsp)) + STACK_STATE (tsp); } } + } /* Clear out "visit" markers. */ - for ( stkpos = 1; stkpos <= stkend; ++stkpos ) - { - if ( IS_MARKED(stk[stkpos]) ) - UNMARK_STATE(stk[stkpos]) + for (stkpos = 1; stkpos <= stkend; ++stkpos) { + if (IS_MARKED (stk[stkpos])) + UNMARK_STATE (stk[stkpos]); else - flexfatal( - _( "consistency check failed in epsclosure()" ) ); - } + flexfatal (_ + ("consistency check failed in epsclosure()")); + } *ns_addr = numstates; *hv_addr = hashval; *nacc_addr = nacc; return t; - } +} /* increase_max_dfas - increase the maximum number of DFAs */ -void increase_max_dfas() - { +void increase_max_dfas () +{ current_max_dfas += MAX_DFAS_INCREMENT; ++num_reallocs; - base = reallocate_integer_array( base, current_max_dfas ); - def = reallocate_integer_array( def, current_max_dfas ); - dfasiz = reallocate_integer_array( dfasiz, current_max_dfas ); - accsiz = reallocate_integer_array( accsiz, current_max_dfas ); - dhash = reallocate_integer_array( dhash, current_max_dfas ); - dss = reallocate_int_ptr_array( dss, current_max_dfas ); - dfaacc = reallocate_dfaacc_union( dfaacc, current_max_dfas ); + base = reallocate_integer_array (base, current_max_dfas); + def = reallocate_integer_array (def, current_max_dfas); + dfasiz = reallocate_integer_array (dfasiz, current_max_dfas); + accsiz = reallocate_integer_array (accsiz, current_max_dfas); + dhash = reallocate_integer_array (dhash, current_max_dfas); + dss = reallocate_int_ptr_array (dss, current_max_dfas); + dfaacc = reallocate_dfaacc_union (dfaacc, current_max_dfas); - if ( nultrans ) + if (nultrans) nultrans = - reallocate_integer_array( nultrans, current_max_dfas ); - } + reallocate_integer_array (nultrans, + current_max_dfas); +} /* ntod - convert an ndfa to a dfa @@ -392,16 +378,19 @@ void increase_max_dfas() * dfa starts out in state #1. */ -void ntod() - { - int *accset, ds, nacc, newds; - int sym, hashval, numstates, dsize; - int num_full_table_rows; /* used only for -f */ - int *nset, *dset; - int targptr, totaltrans, i, comstate, comfreq, targ; - int symlist[CSIZE + 1]; - int num_start_states; - int todo_head, todo_next; +void ntod () +{ + int *accset, ds, nacc, newds; + int sym, hashval, numstates, dsize; + int num_full_table_rows=0; /* used only for -f */ + int *nset, *dset; + int targptr, totaltrans, i, comstate, comfreq, targ; + int symlist[CSIZE + 1]; + int num_start_states; + int todo_head, todo_next; + + struct yytbl_data *yynxt_tbl = 0; + flex_int32_t *yynxt_data = 0, yynxt_curr = 0; /* Note that the following are indexed by *equivalence classes* * and not by characters. Since equivalence classes are indexed @@ -410,11 +399,14 @@ void ntod() * equivalence class) these arrays must have room for indices * from 1 to CSIZE, so their size must be CSIZE + 1. */ - int duplist[CSIZE + 1], state[CSIZE + 1]; - int targfreq[CSIZE + 1], targstate[CSIZE + 1]; + int duplist[CSIZE + 1], state[CSIZE + 1]; + int targfreq[CSIZE + 1], targstate[CSIZE + 1]; - accset = allocate_integer_array( num_rules + 1 ); - nset = allocate_integer_array( current_max_dfa_size ); + /* accset needs to be large enough to hold all of the rules present + * in the input, *plus* their YY_TRAILING_HEAD_MASK variants. + */ + accset = allocate_integer_array ((num_rules + 1) * 2); + nset = allocate_integer_array (current_max_dfa_size); /* The "todo" queue is represented by the head, which is the DFA * state currently being processed, and the "next", which is the @@ -424,22 +416,20 @@ void ntod() */ todo_head = todo_next = 0; - for ( i = 0; i <= csize; ++i ) - { + for (i = 0; i <= csize; ++i) { duplist[i] = NIL; symlist[i] = false; - } + } - for ( i = 0; i <= num_rules; ++i ) + for (i = 0; i <= num_rules; ++i) accset[i] = NIL; - if ( trace ) - { - dumpnfa( scset[1] ); - fputs( _( "\n\nDFA Dump:\n\n" ), stderr ); - } + if (trace) { + dumpnfa (scset[1]); + fputs (_("\n\nDFA Dump:\n\n"), stderr); + } - inittbl(); + inittbl (); /* Check to see whether we should build a separate table for * transitions on NUL characters. We don't do this for full-speed @@ -473,50 +463,46 @@ void ntod() /* Note that the test for ecgroup[0] == numecs below accomplishes * both (1) and (2) above */ - if ( ! fullspd && ecgroup[0] == numecs ) - { + if (!fullspd && ecgroup[0] == numecs) { /* NUL is alone in its equivalence class, which is the * last one. */ - int use_NUL_table = (numecs == csize); + int use_NUL_table = (numecs == csize); - if ( fulltbl && ! use_NUL_table ) - { + if (fulltbl && !use_NUL_table) { /* We still may want to use the table if numecs * is a power of 2. */ - int power_of_two; + int power_of_two; - for ( power_of_two = 1; power_of_two <= csize; - power_of_two *= 2 ) - if ( numecs == power_of_two ) - { + for (power_of_two = 1; power_of_two <= csize; + power_of_two *= 2) + if (numecs == power_of_two) { use_NUL_table = true; break; - } - } + } + } - if ( use_NUL_table ) - nultrans = allocate_integer_array( current_max_dfas ); + if (use_NUL_table) + nultrans = + allocate_integer_array (current_max_dfas); /* From now on, nultrans != nil indicates that we're * saving null transitions for later, separate encoding. */ - } + } - if ( fullspd ) - { - for ( i = 0; i <= numecs; ++i ) + if (fullspd) { + for (i = 0; i <= numecs; ++i) state[i] = 0; - place_state( state, 0, 0 ); + place_state (state, 0, 0); dfaacc[0].dfaacc_state = 0; - } + } - else if ( fulltbl ) - { - if ( nultrans ) + else if (fulltbl) { + if (nultrans) /* We won't be including NUL's transitions in the * table, so build it for entries from 0 .. numecs - 1. */ @@ -529,72 +515,105 @@ void ntod() */ num_full_table_rows = numecs + 1; + /* Begin generating yy_nxt[][] + * This spans the entire LONG function. + * This table is tricky because we don't know how big it will be. + * So we'll have to realloc() on the way... + * we'll wait until we can calculate yynxt_tbl->td_hilen. + */ + yynxt_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct + yytbl_data)); + yytbl_data_init (yynxt_tbl, YYTD_ID_NXT); + yynxt_tbl->td_hilen = 1; + yynxt_tbl->td_lolen = num_full_table_rows; + yynxt_tbl->td_data = yynxt_data = + (flex_int32_t *) calloc (yynxt_tbl->td_lolen * + yynxt_tbl->td_hilen, + sizeof (flex_int32_t)); + yynxt_curr = 0; + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_NXT, (void**)&yy_nxt, sizeof(%s)},\n", + long_align ? "flex_int32_t" : "flex_int16_t"); + /* Unless -Ca, declare it "short" because it's a real * long-shot that that won't be large enough. */ - out_str_dec( "static yyconst %s yy_nxt[][%d] =\n {\n", - /* '}' so vi doesn't get too confused */ - long_align ? "long" : "short", num_full_table_rows ); + if (gentables) + out_str_dec + ("static yyconst %s yy_nxt[][%d] =\n {\n", + long_align ? "flex_int32_t" : "flex_int16_t", + num_full_table_rows); + else { + out_dec ("#undef YY_NXT_LOLEN\n#define YY_NXT_LOLEN (%d)\n", num_full_table_rows); + out_str ("static yyconst %s *yy_nxt =0;\n", + long_align ? "flex_int32_t" : "flex_int16_t"); + } - outn( " {" ); - /* Generate 0 entries for state #0. */ - for ( i = 0; i < num_full_table_rows; ++i ) - mk2data( 0 ); + if (gentables) + outn (" {"); - dataflush(); - outn( " },\n" ); + /* Generate 0 entries for state #0. */ + for (i = 0; i < num_full_table_rows; ++i) { + mk2data (0); + yynxt_data[yynxt_curr++] = 0; } + dataflush (); + if (gentables) + outn (" },\n"); + } + /* Create the first states. */ num_start_states = lastsc * 2; - for ( i = 1; i <= num_start_states; ++i ) - { + for (i = 1; i <= num_start_states; ++i) { numstates = 1; /* For each start condition, make one state for the case when * we're at the beginning of the line (the '^' operator) and * one for the case when we're not. */ - if ( i % 2 == 1 ) + if (i % 2 == 1) nset[numstates] = scset[(i / 2) + 1]; else nset[numstates] = - mkbranch( scbol[i / 2], scset[i / 2] ); + mkbranch (scbol[i / 2], scset[i / 2]); - nset = epsclosure( nset, &numstates, accset, &nacc, &hashval ); + nset = epsclosure (nset, &numstates, accset, &nacc, + &hashval); - if ( snstods( nset, numstates, accset, nacc, hashval, &ds ) ) - { + if (snstods (nset, numstates, accset, nacc, hashval, &ds)) { numas += nacc; totnst += numstates; ++todo_next; - if ( variable_trailing_context_rules && nacc > 0 ) - check_trailing_context( nset, numstates, - accset, nacc ); - } + if (variable_trailing_context_rules && nacc > 0) + check_trailing_context (nset, numstates, + accset, nacc); } + } - if ( ! fullspd ) - { - if ( ! snstods( nset, 0, accset, 0, 0, &end_of_buffer_state ) ) - flexfatal( - _( "could not create unique end-of-buffer state" ) ); + if (!fullspd) { + if (!snstods (nset, 0, accset, 0, 0, &end_of_buffer_state)) + flexfatal (_ + ("could not create unique end-of-buffer state")); ++numas; ++num_start_states; ++todo_next; - } + } + - while ( todo_head < todo_next ) - { + while (todo_head < todo_next) { targptr = 0; totaltrans = 0; - for ( i = 1; i <= numecs; ++i ) + for (i = 1; i <= numecs; ++i) state[i] = 0; ds = ++todo_head; @@ -602,53 +621,54 @@ void ntod() dset = dss[ds]; dsize = dfasiz[ds]; - if ( trace ) - fprintf( stderr, _( "state # %d:\n" ), ds ); + if (trace) + fprintf (stderr, _("state # %d:\n"), ds); - sympartition( dset, dsize, symlist, duplist ); + sympartition (dset, dsize, symlist, duplist); - for ( sym = 1; sym <= numecs; ++sym ) - { - if ( symlist[sym] ) - { + for (sym = 1; sym <= numecs; ++sym) { + if (symlist[sym]) { symlist[sym] = 0; - if ( duplist[sym] == NIL ) - { + if (duplist[sym] == NIL) { /* Symbol has unique out-transitions. */ - numstates = symfollowset( dset, dsize, - sym, nset ); - nset = epsclosure( nset, &numstates, - accset, &nacc, &hashval ); - - if ( snstods( nset, numstates, accset, - nacc, hashval, &newds ) ) - { - totnst = totnst + numstates; + numstates = + symfollowset (dset, dsize, + sym, nset); + nset = epsclosure (nset, + &numstates, + accset, &nacc, + &hashval); + + if (snstods + (nset, numstates, accset, nacc, + hashval, &newds)) { + totnst = totnst + + numstates; ++todo_next; numas += nacc; - if ( - variable_trailing_context_rules && - nacc > 0 ) - check_trailing_context( - nset, numstates, - accset, nacc ); - } + if (variable_trailing_context_rules && nacc > 0) + check_trailing_context + (nset, + numstates, + accset, + nacc); + } state[sym] = newds; - if ( trace ) - fprintf( stderr, "\t%d\t%d\n", - sym, newds ); + if (trace) + fprintf (stderr, + "\t%d\t%d\n", sym, + newds); targfreq[++targptr] = 1; targstate[targptr] = newds; ++numuniq; - } + } - else - { + else { /* sym's equivalence class has the same * transitions as duplist(sym)'s * equivalence class. @@ -656,87 +676,89 @@ void ntod() targ = state[duplist[sym]]; state[sym] = targ; - if ( trace ) - fprintf( stderr, "\t%d\t%d\n", - sym, targ ); + if (trace) + fprintf (stderr, + "\t%d\t%d\n", sym, + targ); /* Update frequency count for * destination state. */ i = 0; - while ( targstate[++i] != targ ) - ; + while (targstate[++i] != targ) ; ++targfreq[i]; ++numdup; - } + } ++totaltrans; duplist[sym] = NIL; - } } + } - if ( caseins && ! useecs ) - { - register int j; - - for ( i = 'A', j = 'a'; i <= 'Z'; ++i, ++j ) - { - if ( state[i] == 0 && state[j] != 0 ) - /* We're adding a transition. */ - ++totaltrans; - - else if ( state[i] != 0 && state[j] == 0 ) - /* We're taking away a transition. */ - --totaltrans; - - state[i] = state[j]; - } - } numsnpairs += totaltrans; - if ( ds > num_start_states ) - check_for_backing_up( ds, state ); + if (ds > num_start_states) + check_for_backing_up (ds, state); - if ( nultrans ) - { + if (nultrans) { nultrans[ds] = state[NUL_ec]; state[NUL_ec] = 0; /* remove transition */ - } + } + + if (fulltbl) { - if ( fulltbl ) - { - outn( " {" ); + /* Each time we hit here, it's another td_hilen, so we realloc. */ + yynxt_tbl->td_hilen++; + yynxt_tbl->td_data = yynxt_data = + (flex_int32_t *) realloc (yynxt_data, + yynxt_tbl->td_hilen * + yynxt_tbl->td_lolen * + sizeof (flex_int32_t)); + + + if (gentables) + outn (" {"); /* Supply array's 0-element. */ - if ( ds == end_of_buffer_state ) - mk2data( -end_of_buffer_state ); - else - mk2data( end_of_buffer_state ); + if (ds == end_of_buffer_state) { + mk2data (-end_of_buffer_state); + yynxt_data[yynxt_curr++] = + -end_of_buffer_state; + } + else { + mk2data (end_of_buffer_state); + yynxt_data[yynxt_curr++] = + end_of_buffer_state; + } - for ( i = 1; i < num_full_table_rows; ++i ) + for (i = 1; i < num_full_table_rows; ++i) { /* Jams are marked by negative of state * number. */ - mk2data( state[i] ? state[i] : -ds ); - - dataflush(); - outn( " },\n" ); + mk2data (state[i] ? state[i] : -ds); + yynxt_data[yynxt_curr++] = + state[i] ? state[i] : -ds; } - else if ( fullspd ) - place_state( state, ds, totaltrans ); + dataflush (); + if (gentables) + outn (" },\n"); + } + + else if (fullspd) + place_state (state, ds, totaltrans); - else if ( ds == end_of_buffer_state ) + else if (ds == end_of_buffer_state) /* Special case this state to make sure it does what * it's supposed to, i.e., jam on end-of-buffer. */ - stack1( ds, 0, 0, JAMSTATE ); + stack1 (ds, 0, 0, JAMSTATE); + + else { /* normal, compressed state */ - else /* normal, compressed state */ - { /* Determine which destination state is the most * common, and how many transitions to it there are. */ @@ -744,41 +766,49 @@ void ntod() comfreq = 0; comstate = 0; - for ( i = 1; i <= targptr; ++i ) - if ( targfreq[i] > comfreq ) - { + for (i = 1; i <= targptr; ++i) + if (targfreq[i] > comfreq) { comfreq = targfreq[i]; comstate = targstate[i]; - } + } - bldtbl( state, ds, totaltrans, comstate, comfreq ); - } + bldtbl (state, ds, totaltrans, comstate, comfreq); } + } - if ( fulltbl ) - dataend(); + if (fulltbl) { + dataend (); + if (tablesext) { + yytbl_data_compress (yynxt_tbl); + if (yytbl_data_fwrite (&tableswr, yynxt_tbl) < 0) + flexerror (_ + ("Could not write yynxt_tbl[][]")); + } + if (yynxt_tbl) { + yytbl_data_destroy (yynxt_tbl); + yynxt_tbl = 0; + } + } - else if ( ! fullspd ) - { - cmptmps(); /* create compressed template entries */ + else if (!fullspd) { + cmptmps (); /* create compressed template entries */ /* Create tables for all the states with only one * out-transition. */ - while ( onesp > 0 ) - { - mk1tbl( onestate[onesp], onesym[onesp], onenext[onesp], - onedef[onesp] ); + while (onesp > 0) { + mk1tbl (onestate[onesp], onesym[onesp], + onenext[onesp], onedef[onesp]); --onesp; - } - - mkdeftbl(); } - flex_free( (void *) accset ); - flex_free( (void *) nset ); + mkdeftbl (); } + flex_free ((void *) accset); + flex_free ((void *) nset); +} + /* snstods - converts a set of ndfa states into a dfa state * @@ -790,129 +820,122 @@ void ntod() * On return, the dfa state number is in newds. */ -int snstods( sns, numstates, accset, nacc, hashval, newds_addr ) -int sns[], numstates, accset[], nacc, hashval, *newds_addr; - { - int didsort = 0; +int snstods (sns, numstates, accset, nacc, hashval, newds_addr) + int sns[], numstates, accset[], nacc, hashval, *newds_addr; +{ + int didsort = 0; register int i, j; - int newds, *oldsns; + int newds, *oldsns; - for ( i = 1; i <= lastdfa; ++i ) - if ( hashval == dhash[i] ) - { - if ( numstates == dfasiz[i] ) - { + for (i = 1; i <= lastdfa; ++i) + if (hashval == dhash[i]) { + if (numstates == dfasiz[i]) { oldsns = dss[i]; - if ( ! didsort ) - { + if (!didsort) { /* We sort the states in sns so we * can compare it to oldsns quickly. * We use bubble because there probably * aren't very many states. */ - bubble( sns, numstates ); + bubble (sns, numstates); didsort = 1; - } + } - for ( j = 1; j <= numstates; ++j ) - if ( sns[j] != oldsns[j] ) + for (j = 1; j <= numstates; ++j) + if (sns[j] != oldsns[j]) break; - if ( j > numstates ) - { + if (j > numstates) { ++dfaeql; *newds_addr = i; return 0; - } + } ++hshcol; - } + } else ++hshsave; - } + } /* Make a new dfa. */ - if ( ++lastdfa >= current_max_dfas ) - increase_max_dfas(); + if (++lastdfa >= current_max_dfas) + increase_max_dfas (); newds = lastdfa; - dss[newds] = allocate_integer_array( numstates + 1 ); + dss[newds] = allocate_integer_array (numstates + 1); /* If we haven't already sorted the states in sns, we do so now, * so that future comparisons with it can be made quickly. */ - if ( ! didsort ) - bubble( sns, numstates ); + if (!didsort) + bubble (sns, numstates); - for ( i = 1; i <= numstates; ++i ) + for (i = 1; i <= numstates; ++i) dss[newds][i] = sns[i]; dfasiz[newds] = numstates; dhash[newds] = hashval; - if ( nacc == 0 ) - { - if ( reject ) + if (nacc == 0) { + if (reject) dfaacc[newds].dfaacc_set = (int *) 0; else dfaacc[newds].dfaacc_state = 0; accsiz[newds] = 0; - } + } - else if ( reject ) - { + else if (reject) { /* We sort the accepting set in increasing order so the * disambiguating rule that the first rule listed is considered * match in the event of ties will work. We use a bubble * sort since the list is probably quite small. */ - bubble( accset, nacc ); + bubble (accset, nacc); - dfaacc[newds].dfaacc_set = allocate_integer_array( nacc + 1 ); + dfaacc[newds].dfaacc_set = + allocate_integer_array (nacc + 1); /* Save the accepting set for later */ - for ( i = 1; i <= nacc; ++i ) - { + for (i = 1; i <= nacc; ++i) { dfaacc[newds].dfaacc_set[i] = accset[i]; - if ( accset[i] <= num_rules ) + if (accset[i] <= num_rules) /* Who knows, perhaps a REJECT can yield * this rule. */ rule_useful[accset[i]] = true; - } + } accsiz[newds] = nacc; - } + } - else - { + else { /* Find lowest numbered rule so the disambiguating rule * will work. */ j = num_rules + 1; - for ( i = 1; i <= nacc; ++i ) - if ( accset[i] < j ) + for (i = 1; i <= nacc; ++i) + if (accset[i] < j) j = accset[i]; dfaacc[newds].dfaacc_state = j; - if ( j <= num_rules ) + if (j <= num_rules) rule_useful[j] = true; - } + } *newds_addr = newds; return 1; - } +} /* symfollowset - follow the symbol transitions one step @@ -922,85 +945,75 @@ int sns[], numstates, accset[], nacc, hashval, *newds_addr; * int transsym, int nset[current_max_dfa_size] ); */ -int symfollowset( ds, dsize, transsym, nset ) -int ds[], dsize, transsym, nset[]; - { - int ns, tsp, sym, i, j, lenccl, ch, numstates, ccllist; +int symfollowset (ds, dsize, transsym, nset) + int ds[], dsize, transsym, nset[]; +{ + int ns, tsp, sym, i, j, lenccl, ch, numstates, ccllist; numstates = 0; - for ( i = 1; i <= dsize; ++i ) - { /* for each nfa state ns in the state set of ds */ + for (i = 1; i <= dsize; ++i) { /* for each nfa state ns in the state set of ds */ ns = ds[i]; sym = transchar[ns]; tsp = trans1[ns]; - if ( sym < 0 ) - { /* it's a character class */ + if (sym < 0) { /* it's a character class */ sym = -sym; ccllist = cclmap[sym]; lenccl = ccllen[sym]; - if ( cclng[sym] ) - { - for ( j = 0; j < lenccl; ++j ) - { + if (cclng[sym]) { + for (j = 0; j < lenccl; ++j) { /* Loop through negated character * class. */ ch = ccltbl[ccllist + j]; - if ( ch == 0 ) + if (ch == 0) ch = NUL_ec; - if ( ch > transsym ) + if (ch > transsym) /* Transsym isn't in negated * ccl. */ break; - else if ( ch == transsym ) - /* next 2 */ goto bottom; - } + else if (ch == transsym) + /* next 2 */ + goto bottom; + } /* Didn't find transsym in ccl. */ nset[++numstates] = tsp; - } + } else - for ( j = 0; j < lenccl; ++j ) - { + for (j = 0; j < lenccl; ++j) { ch = ccltbl[ccllist + j]; - if ( ch == 0 ) + if (ch == 0) ch = NUL_ec; - if ( ch > transsym ) + if (ch > transsym) break; - else if ( ch == transsym ) - { + else if (ch == transsym) { nset[++numstates] = tsp; break; - } } - } - - else if ( sym >= 'A' && sym <= 'Z' && caseins ) - flexfatal( - _( "consistency check failed in symfollowset" ) ); + } + } - else if ( sym == SYM_EPSILON ) - { /* do nothing */ - } + else if (sym == SYM_EPSILON) { /* do nothing */ + } - else if ( ABS( ecgroup[sym] ) == transsym ) + else if (ABS (ecgroup[sym]) == transsym) nset[++numstates] = tsp; - bottom: ; - } + bottom:; + } return numstates; - } +} /* sympartition - partition characters with same out-transitions @@ -1010,86 +1023,77 @@ int ds[], dsize, transsym, nset[]; * int symlist[numecs], int duplist[numecs] ); */ -void sympartition( ds, numstates, symlist, duplist ) -int ds[], numstates; -int symlist[], duplist[]; - { - int tch, i, j, k, ns, dupfwd[CSIZE + 1], lenccl, cclp, ich; +void sympartition (ds, numstates, symlist, duplist) + int ds[], numstates; + int symlist[], duplist[]; +{ + int tch, i, j, k, ns, dupfwd[CSIZE + 1], lenccl, cclp, ich; /* Partitioning is done by creating equivalence classes for those * characters which have out-transitions from the given state. Thus * we are really creating equivalence classes of equivalence classes. */ - for ( i = 1; i <= numecs; ++i ) - { /* initialize equivalence class list */ + for (i = 1; i <= numecs; ++i) { /* initialize equivalence class list */ duplist[i] = i - 1; dupfwd[i] = i + 1; - } + } duplist[1] = NIL; dupfwd[numecs] = NIL; - for ( i = 1; i <= numstates; ++i ) - { + for (i = 1; i <= numstates; ++i) { ns = ds[i]; tch = transchar[ns]; - if ( tch != SYM_EPSILON ) - { - if ( tch < -lastccl || tch >= csize ) - { - flexfatal( - _( "bad transition character detected in sympartition()" ) ); - } + if (tch != SYM_EPSILON) { + if (tch < -lastccl || tch >= csize) { + flexfatal (_ + ("bad transition character detected in sympartition()")); + } - if ( tch >= 0 ) - { /* character transition */ - int ec = ecgroup[tch]; + if (tch >= 0) { /* character transition */ + int ec = ecgroup[tch]; - mkechar( ec, dupfwd, duplist ); + mkechar (ec, dupfwd, duplist); symlist[ec] = 1; - } + } - else - { /* character class */ + else { /* character class */ tch = -tch; lenccl = ccllen[tch]; cclp = cclmap[tch]; - mkeccl( ccltbl + cclp, lenccl, dupfwd, - duplist, numecs, NUL_ec ); + mkeccl (ccltbl + cclp, lenccl, dupfwd, + duplist, numecs, NUL_ec); - if ( cclng[tch] ) - { + if (cclng[tch]) { j = 0; - for ( k = 0; k < lenccl; ++k ) - { + for (k = 0; k < lenccl; ++k) { ich = ccltbl[cclp + k]; - if ( ich == 0 ) + if (ich == 0) ich = NUL_ec; - for ( ++j; j < ich; ++j ) + for (++j; j < ich; ++j) symlist[j] = 1; - } + } - for ( ++j; j <= numecs; ++j ) + for (++j; j <= numecs; ++j) symlist[j] = 1; - } + } else - for ( k = 0; k < lenccl; ++k ) - { + for (k = 0; k < lenccl; ++k) { ich = ccltbl[cclp + k]; - if ( ich == 0 ) + if (ich == 0) ich = NUL_ec; symlist[ich] = 1; - } - } + } } } } +} diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 000000000000..bfed30d32602 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,16 @@ +help2man = @HELP2MAN@ + +info_TEXINFOS = flex.texi +dist_man_MANS = flex.1 +EXTRA_DIST = flex.pdf + +CLEANFILES = \ + flex.hks \ + flex.ops + +$(dist_man_MANS): $(top_srcdir)/main.c + for i in $(dist_man_MANS) ; do \ + $(help2man) --name='$(PACKAGE_NAME)' \ + --section=`echo $$i | sed -e 's/.*\.\([^.]*\)$$/\1/'` \ + ../flex$(EXEEXT) > $$i || rm -f $$i ; \ + done diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 000000000000..b5a7f5ba7759 --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,560 @@ +# 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 = $(dist_man_MANS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/stamp-vti \ + $(srcdir)/version.texi mdate-sh texinfo.tex +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +INFO_DEPS = $(srcdir)/flex.info +am__TEXINFO_TEX_DIR = $(srcdir) +DVIS = flex.dvi +PDFS = flex.pdf +PSS = flex.ps +HTMLS = flex.html +TEXINFOS = flex.texi +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 = $(dist_man_MANS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BISON = @BISON@ +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@ +GMSGFMT = @GMSGFMT@ +HELP2MAN = @HELP2MAN@ +INDENT = @INDENT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +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@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +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@ +help2man = @HELP2MAN@ +info_TEXINFOS = flex.texi +dist_man_MANS = flex.1 +EXTRA_DIST = flex.pdf +CLEANFILES = \ + flex.hks \ + flex.ops + +all: all-am + +.SUFFIXES: +.SUFFIXES: .dvi .html .info .pdf .ps .texi +$(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) --gnits doc/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnits 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 + +.texi.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 + +.texi.dvi: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2DVI) $< + +.texi.pdf: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2PDF) $< + +.texi.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)/flex.info: flex.texi $(srcdir)/version.texi +flex.dvi: flex.texi $(srcdir)/version.texi +flex.pdf: flex.texi $(srcdir)/version.texi +flex.html: flex.texi $(srcdir)/version.texi +$(srcdir)/version.texi: $(srcdir)/stamp-vti +$(srcdir)/stamp-vti: flex.texi $(top_srcdir)/configure + @(dir=.; test -f ./flex.texi || dir=$(srcdir); \ + set `$(SHELL) $(srcdir)/mdate-sh $$dir/flex.texi`; \ + 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 flex.aux flex.cp flex.cps flex.fn flex.fns flex.hk flex.hks flex.ky \ + flex.kys flex.log flex.op flex.ops flex.pg flex.pgs flex.tmp \ + flex.toc flex.tp flex.tps flex.vr flex.vrs flex.dvi flex.pdf \ + flex.ps flex.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 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 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 + + +$(dist_man_MANS): $(top_srcdir)/main.c + for i in $(dist_man_MANS) ; do \ + $(help2man) --name='$(PACKAGE_NAME)' \ + --section=`echo $$i | sed -e 's/.*\.\([^.]*\)$$/\1/'` \ + ../flex$(EXEEXT) > $$i || rm -f $$i ; \ + done +# 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/flex.1 b/doc/flex.1 new file mode 100644 index 000000000000..a55e8b8e0460 --- /dev/null +++ b/doc/flex.1 @@ -0,0 +1,165 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36. +.TH FLEX "1" "February 2008" "flex 2.5.35" "User Commands" +.SH NAME +flex \- the fast lexical analyser generator +.SH SYNOPSIS +.B flex +[\fIOPTIONS\fR] [\fIFILE\fR]... +.SH DESCRIPTION +Generates programs that perform pattern\-matching on text. +.SS "Table Compression:" +.TP +\fB\-Ca\fR, \fB\-\-align\fR +trade off larger tables for better memory alignment +.TP +\fB\-Ce\fR, \fB\-\-ecs\fR +construct equivalence classes +.TP +\fB\-Cf\fR +do not compress tables; use \fB\-f\fR representation +.TP +\fB\-CF\fR +do not compress tables; use \fB\-F\fR representation +.TP +\fB\-Cm\fR, \fB\-\-meta\-ecs\fR +construct meta\-equivalence classes +.TP +\fB\-Cr\fR, \fB\-\-read\fR +use read() instead of stdio for scanner input +.TP +\fB\-f\fR, \fB\-\-full\fR +generate fast, large scanner. Same as \fB\-Cfr\fR +.TP +\fB\-F\fR, \fB\-\-fast\fR +use alternate table representation. Same as \fB\-CFr\fR +.TP +\fB\-Cem\fR +default compression (same as \fB\-\-ecs\fR \fB\-\-meta\-ecs\fR) +.SS "Debugging:" +.TP +\fB\-d\fR, \fB\-\-debug\fR +enable debug mode in scanner +.TP +\fB\-b\fR, \fB\-\-backup\fR +write backing\-up information to lex.backup +.TP +\fB\-p\fR, \fB\-\-perf\-report\fR +write performance report to stderr +.TP +\fB\-s\fR, \fB\-\-nodefault\fR +suppress default rule to ECHO unmatched text +.TP +\fB\-T\fR, \fB\-\-trace\fR +flex should run in trace mode +.TP +\fB\-w\fR, \fB\-\-nowarn\fR +do not generate warnings +.TP +\fB\-v\fR, \fB\-\-verbose\fR +write summary of scanner statistics to stdout +.SS "Files:" +.TP +\fB\-o\fR, \fB\-\-outfile\fR=\fIFILE\fR +specify output filename +.TP +\fB\-S\fR, \fB\-\-skel\fR=\fIFILE\fR +specify skeleton file +.TP +\fB\-t\fR, \fB\-\-stdout\fR +write scanner on stdout instead of lex.yy.c +.TP +\fB\-\-yyclass\fR=\fINAME\fR +name of C++ class +.TP +\fB\-\-header\-file\fR=\fIFILE\fR +create a C header file in addition to the scanner +.HP +\fB\-\-tables\-file\fR[=\fIFILE\fR] write tables to FILE +.SS "Scanner behavior:" +.TP +\fB\-7\fR, \fB\-\-7bit\fR +generate 7\-bit scanner +.TP +\fB\-8\fR, \fB\-\-8bit\fR +generate 8\-bit scanner +.TP +\fB\-B\fR, \fB\-\-batch\fR +generate batch scanner (opposite of \fB\-I\fR) +.TP +\fB\-i\fR, \fB\-\-case\-insensitive\fR +ignore case in patterns +.TP +\fB\-l\fR, \fB\-\-lex\-compat\fR +maximal compatibility with original lex +.TP +\fB\-X\fR, \fB\-\-posix\-compat\fR +maximal compatibility with POSIX lex +.TP +\fB\-I\fR, \fB\-\-interactive\fR +generate interactive scanner (opposite of \fB\-B\fR) +.TP +\fB\-\-yylineno\fR +track line count in yylineno +.SS "Generated code:" +.TP +\-+, \fB\-\-c\fR++ +generate C++ scanner class +.TP +\fB\-Dmacro\fR[=\fIdefn\fR] +#define macro defn (default defn is '1') +.TP +\fB\-L\fR, \fB\-\-noline\fR +suppress #line directives in scanner +.TP +\fB\-P\fR, \fB\-\-prefix\fR=\fISTRING\fR +use STRING as prefix instead of "yy" +.TP +\fB\-R\fR, \fB\-\-reentrant\fR +generate a reentrant C scanner +.TP +\fB\-\-bison\-bridge\fR +scanner for bison pure parser. +.TP +\fB\-\-bison\-locations\fR +include yylloc support. +.TP +\fB\-\-stdinit\fR +initialize yyin/yyout to stdin/stdout +.HP +\fB\-\-noansi\-definitions\fR old\-style function definitions +.TP +\fB\-\-noansi\-prototypes\fR +empty parameter list in prototypes +.TP +\fB\-\-nounistd\fR +do not include <unistd.h> +.TP +\fB\-\-noFUNCTION\fR +do not generate a particular FUNCTION +.SS "Miscellaneous:" +.TP +\fB\-c\fR +do\-nothing POSIX option +.TP +\fB\-n\fR +do\-nothing POSIX option +.HP +\-? +.TP +\fB\-h\fR, \fB\-\-help\fR +produce this help message +.TP +\fB\-V\fR, \fB\-\-version\fR +report flex version +.SH "SEE ALSO" +The full documentation for +.B flex +is maintained as a Texinfo manual. If the +.B info +and +.B flex +programs are properly installed at your site, the command +.IP +.B info flex +.PP +should give you access to the complete manual. diff --git a/doc/flex.info b/doc/flex.info new file mode 100644 index 000000000000..fddd79212223 --- /dev/null +++ b/doc/flex.info @@ -0,0 +1,282 @@ +This is flex.info, produced by makeinfo version 4.8 from flex.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* flex: (flex). Fast lexical analyzer generator (lex replacement). +END-INFO-DIR-ENTRY + + The flex manual is placed under the same licensing conditions as the +rest of flex: + + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 The Flex +Project. + + Copyright (C) 1990, 1997 The Regents of the University of California. +All rights reserved. + + This code is derived from software contributed to Berkeley by Vern +Paxson. + + The United States Government has rights in this work pursuant to +contract no. DE-AC03-76SF00098 between the United States Department of +Energy and the University of California. + + Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. + + Neither the name of the University nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + + THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + +Indirect: +flex.info-1: 1620 +flex.info-2: 287921 + +Tag Table: +(Indirect) +Node: Top1620 +Node: Copyright7690 +Node: Reporting Bugs9203 +Node: Introduction9508 +Node: Simple Examples10336 +Node: Format13646 +Node: Definitions Section14060 +Ref: Definitions Section-Footnote-116323 +Node: Rules Section16391 +Node: User Code Section17549 +Node: Comments in the Input17987 +Node: Patterns19355 +Ref: case and character ranges26186 +Node: Matching30201 +Node: Actions33487 +Node: Generated Scanner42466 +Node: Start Conditions47484 +Node: Multiple Input Buffers58043 +Ref: Scanning Strings64581 +Node: EOF66211 +Node: Misc Macros67799 +Node: User Values70653 +Node: Yacc72984 +Node: Scanner Options73880 +Node: Options for Specifying Filenames76638 +Ref: option-header76864 +Ref: option-outfile77576 +Ref: option-stdout77901 +Node: Options Affecting Scanner Behavior78883 +Ref: option-case-insensitive79124 +Ref: option-lex-compat79557 +Ref: option-batch80089 +Ref: option-interactive80613 +Ref: option-7bit81967 +Ref: option-8bit83271 +Ref: option-default83683 +Ref: option-always-interactive83747 +Ref: option-posix84351 +Ref: option-stack85498 +Ref: option-stdinit85606 +Ref: option-yylineno86084 +Ref: option-yywrap86527 +Node: Code-Level And API Options86795 +Ref: option-ansi-definitions87022 +Ref: option-ansi-prototypes87274 +Ref: option-bison-bridge87521 +Ref: option-bison-locations87860 +Ref: option-noline88120 +Ref: option-reentrant88634 +Ref: option-c++89245 +Ref: option-array89371 +Ref: option-pointer89469 +Ref: option-prefix89597 +Ref: option-main91126 +Ref: option-nounistd91310 +Ref: option-yyclass91818 +Node: Options for Scanner Speed and Size92304 +Ref: option-align92853 +Ref: option-ecs93354 +Ref: option-meta-ecs94390 +Ref: option-read94877 +Ref: option-full96760 +Ref: option-fast96955 +Node: Debugging Options97881 +Ref: option-backup98068 +Ref: option-debug98613 +Ref: option-perf-report99336 +Ref: option-nodefault99962 +Ref: option-trace100280 +Ref: option-nowarn100571 +Ref: option-verbose100639 +Ref: option-warn101068 +Node: Miscellaneous Options101287 +Node: Performance101744 +Node: Cxx112008 +Node: Reentrant119531 +Node: Reentrant Uses120208 +Node: Reentrant Overview121771 +Node: Reentrant Example122570 +Node: Reentrant Detail123345 +Node: Specify Reentrant123778 +Node: Extra Reentrant Argument124425 +Node: Global Replacement125677 +Node: Init and Destroy Functions126906 +Node: Accessor Methods129418 +Node: Extra Data130762 +Node: About yyscan_t133029 +Node: Reentrant Functions133425 +Ref: bison-functions134909 +Node: Lex and Posix135650 +Node: Memory Management143034 +Ref: memory-management143180 +Node: The Default Memory Management143408 +Ref: The Default Memory Management-Footnote-1147217 +Node: Overriding The Default Memory Management147370 +Ref: Overriding The Default Memory Management-Footnote-1149769 +Node: A Note About yytext And Memory149933 +Node: Serialized Tables151166 +Ref: serialization151310 +Node: Creating Serialized Tables152075 +Node: Loading and Unloading Serialized Tables153685 +Node: Tables File Format155453 +Node: Diagnostics162468 +Node: Limitations165879 +Node: Bibliography167828 +Node: FAQ168501 +Node: When was flex born?172741 +Node: How do I expand backslash-escape sequences in C-style quoted strings?173118 +Node: Why do flex scanners call fileno if it is not ANSI compatible?174422 +Node: Does flex support recursive pattern definitions?175217 +Node: How do I skip huge chunks of input (tens of megabytes) while using flex?176064 +Node: Flex is not matching my patterns in the same order that I defined them.176531 +Node: My actions are executing out of order or sometimes not at all.178277 +Node: How can I have multiple input sources feed into the same scanner at the same time?179052 +Node: Can I build nested parsers that work with the same input file?181040 +Node: How can I match text only at the end of a file?182046 +Node: How can I make REJECT cascade across start condition boundaries?182851 +Node: Why cant I use fast or full tables with interactive mode?183866 +Node: How much faster is -F or -f than -C?185124 +Node: If I have a simple grammar cant I just parse it with flex?185436 +Node: Why doesn't yyrestart() set the start state back to INITIAL?185917 +Node: How can I match C-style comments?186544 +Node: The period isn't working the way I expected.187358 +Node: Can I get the flex manual in another format?188605 +Node: Does there exist a "faster" NDFA->DFA algorithm?189094 +Node: How does flex compile the DFA so quickly?189604 +Node: How can I use more than 8192 rules?190571 +Node: How do I abandon a file in the middle of a scan and switch to a new file?191983 +Node: How do I execute code only during initialization (only before the first scan)?192536 +Node: How do I execute code at termination?193314 +Node: Where else can I find help?193640 +Node: Can I include comments in the "rules" section of the file?194013 +Node: I get an error about undefined yywrap().194392 +Node: How can I change the matching pattern at run time?194869 +Node: How can I expand macros in the input?195231 +Node: How can I build a two-pass scanner?196264 +Node: How do I match any string not matched in the preceding rules?197180 +Node: I am trying to port code from AT&T lex that uses yysptr and yysbuf.198090 +Node: Is there a way to make flex treat NULL like a regular character?198885 +Node: Whenever flex can not match the input it says "flex scanner jammed".199406 +Node: Why doesn't flex have non-greedy operators like perl does?200050 +Node: Memory leak - 16386 bytes allocated by malloc.201403 +Ref: faq-memory-leak201701 +Node: How do I track the byte offset for lseek()?202669 +Node: How do I use my own I/O classes in a C++ scanner?204180 +Node: How do I skip as many chars as possible?205023 +Node: deleteme00206100 +Node: Are certain equivalent patterns faster than others?206541 +Node: Is backing up a big deal?209960 +Node: Can I fake multi-byte character support?211867 +Node: deleteme01213309 +Node: Can you discuss some flex internals?214419 +Node: unput() messes up yy_at_bol216664 +Node: The | operator is not doing what I want217767 +Node: Why can't flex understand this variable trailing context pattern?219314 +Node: The ^ operator isn't working220564 +Node: Trailing context is getting confused with trailing optional patterns221800 +Node: Is flex GNU or not?223044 +Node: ERASEME53224718 +Node: I need to scan if-then-else blocks and while loops225489 +Node: ERASEME55226689 +Node: ERASEME56227788 +Node: ERASEME57229147 +Node: Is there a repository for flex scanners?230146 +Node: How can I conditionally compile or preprocess my flex input file?230461 +Node: Where can I find grammars for lex and yacc?230934 +Node: I get an end-of-buffer message for each character scanned.231281 +Node: unnamed-faq-62231876 +Node: unnamed-faq-63232895 +Node: unnamed-faq-64234193 +Node: unnamed-faq-65235160 +Node: unnamed-faq-66235947 +Node: unnamed-faq-67237063 +Node: unnamed-faq-68238051 +Node: unnamed-faq-69239194 +Node: unnamed-faq-70239908 +Node: unnamed-faq-71240670 +Node: unnamed-faq-72241880 +Node: unnamed-faq-73242924 +Node: unnamed-faq-74243849 +Node: unnamed-faq-75244795 +Node: unnamed-faq-76245928 +Node: unnamed-faq-77246635 +Node: unnamed-faq-78247529 +Node: unnamed-faq-79248528 +Node: unnamed-faq-80250229 +Node: unnamed-faq-81251548 +Node: unnamed-faq-82254349 +Node: unnamed-faq-83255307 +Node: unnamed-faq-84257088 +Node: unnamed-faq-85258192 +Node: unnamed-faq-86259200 +Node: unnamed-faq-87260139 +Node: unnamed-faq-88260786 +Node: unnamed-faq-90261618 +Node: unnamed-faq-91262882 +Node: unnamed-faq-92265311 +Node: unnamed-faq-93265811 +Node: unnamed-faq-94266739 +Node: unnamed-faq-95268152 +Node: unnamed-faq-96269671 +Node: unnamed-faq-97270431 +Node: unnamed-faq-98271099 +Node: unnamed-faq-99271765 +Node: unnamed-faq-100272695 +Node: unnamed-faq-101273406 +Node: What is the difference between YYLEX_PARAM and YY_DECL?274220 +Node: Why do I get "conflicting types for yylex" error?274742 +Node: How do I access the values set in a Flex action from within a Bison action?275272 +Node: Appendices275703 +Node: Makefiles and Flex275912 +Ref: Makefiles and Flex-Footnote-1279112 +Ref: Makefiles and Flex-Footnote-2279229 +Ref: Makefiles and Flex-Footnote-3279415 +Node: Bison Bridge279466 +Ref: Bison Bridge-Footnote-1282135 +Node: M4 Dependency282327 +Ref: M4 Dependency-Footnote-1283732 +Node: Common Patterns283867 +Node: Numbers284158 +Node: Identifiers285135 +Node: Quoted Constructs285964 +Node: Addresses287017 +Node: Indices287683 +Node: Concept Index287921 +Node: Index of Functions and Macros313204 +Node: Index of Variables318100 +Node: Index of Data Types319766 +Node: Index of Hooks320654 +Node: Index of Scanner Options321222 + +End Tag Table diff --git a/doc/flex.info-1 b/doc/flex.info-1 new file mode 100644 index 000000000000..25f61b352a56 --- /dev/null +++ b/doc/flex.info-1 @@ -0,0 +1,7683 @@ +This is flex.info, produced by makeinfo version 4.8 from flex.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* flex: (flex). Fast lexical analyzer generator (lex replacement). +END-INFO-DIR-ENTRY + + The flex manual is placed under the same licensing conditions as the +rest of flex: + + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 The Flex +Project. + + Copyright (C) 1990, 1997 The Regents of the University of California. +All rights reserved. + + This code is derived from software contributed to Berkeley by Vern +Paxson. + + The United States Government has rights in this work pursuant to +contract no. DE-AC03-76SF00098 between the United States Department of +Energy and the University of California. + + Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. + + Neither the name of the University nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + + THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + +File: flex.info, Node: Top, Next: Copyright, Prev: (dir), Up: (dir) + +flex +**** + +This manual describes `flex', a tool for generating programs that +perform pattern-matching on text. The manual includes both tutorial and +reference sections. + + This edition of `The flex Manual' documents `flex' version 2.5.35. +It was last updated on 10 September 2007. + + This manual was written by Vern Paxson, Will Estes and John Millaway. + +* Menu: + +* Copyright:: +* Reporting Bugs:: +* Introduction:: +* Simple Examples:: +* Format:: +* Patterns:: +* Matching:: +* Actions:: +* Generated Scanner:: +* Start Conditions:: +* Multiple Input Buffers:: +* EOF:: +* Misc Macros:: +* User Values:: +* Yacc:: +* Scanner Options:: +* Performance:: +* Cxx:: +* Reentrant:: +* Lex and Posix:: +* Memory Management:: +* Serialized Tables:: +* Diagnostics:: +* Limitations:: +* Bibliography:: +* FAQ:: +* Appendices:: +* Indices:: + + --- The Detailed Node Listing --- + +Format of the Input File + +* Definitions Section:: +* Rules Section:: +* User Code Section:: +* Comments in the Input:: + +Scanner Options + +* Options for Specifying Filenames:: +* Options Affecting Scanner Behavior:: +* Code-Level And API Options:: +* Options for Scanner Speed and Size:: +* Debugging Options:: +* Miscellaneous Options:: + +Reentrant C Scanners + +* Reentrant Uses:: +* Reentrant Overview:: +* Reentrant Example:: +* Reentrant Detail:: +* Reentrant Functions:: + +The Reentrant API in Detail + +* Specify Reentrant:: +* Extra Reentrant Argument:: +* Global Replacement:: +* Init and Destroy Functions:: +* Accessor Methods:: +* Extra Data:: +* About yyscan_t:: + +Memory Management + +* The Default Memory Management:: +* Overriding The Default Memory Management:: +* A Note About yytext And Memory:: + +Serialized Tables + +* Creating Serialized Tables:: +* Loading and Unloading Serialized Tables:: +* Tables File Format:: + +FAQ + +* When was flex born?:: +* How do I expand backslash-escape sequences in C-style quoted strings?:: +* Why do flex scanners call fileno if it is not ANSI compatible?:: +* Does flex support recursive pattern definitions?:: +* How do I skip huge chunks of input (tens of megabytes) while using flex?:: +* Flex is not matching my patterns in the same order that I defined them.:: +* My actions are executing out of order or sometimes not at all.:: +* How can I have multiple input sources feed into the same scanner at the same time?:: +* Can I build nested parsers that work with the same input file?:: +* How can I match text only at the end of a file?:: +* How can I make REJECT cascade across start condition boundaries?:: +* Why cant I use fast or full tables with interactive mode?:: +* How much faster is -F or -f than -C?:: +* If I have a simple grammar cant I just parse it with flex?:: +* Why doesn't yyrestart() set the start state back to INITIAL?:: +* How can I match C-style comments?:: +* The period isn't working the way I expected.:: +* Can I get the flex manual in another format?:: +* Does there exist a "faster" NDFA->DFA algorithm?:: +* How does flex compile the DFA so quickly?:: +* How can I use more than 8192 rules?:: +* How do I abandon a file in the middle of a scan and switch to a new file?:: +* How do I execute code only during initialization (only before the first scan)?:: +* How do I execute code at termination?:: +* Where else can I find help?:: +* Can I include comments in the "rules" section of the file?:: +* I get an error about undefined yywrap().:: +* How can I change the matching pattern at run time?:: +* How can I expand macros in the input?:: +* How can I build a two-pass scanner?:: +* How do I match any string not matched in the preceding rules?:: +* I am trying to port code from AT&T lex that uses yysptr and yysbuf.:: +* Is there a way to make flex treat NULL like a regular character?:: +* Whenever flex can not match the input it says "flex scanner jammed".:: +* Why doesn't flex have non-greedy operators like perl does?:: +* Memory leak - 16386 bytes allocated by malloc.:: +* How do I track the byte offset for lseek()?:: +* How do I use my own I/O classes in a C++ scanner?:: +* How do I skip as many chars as possible?:: +* deleteme00:: +* Are certain equivalent patterns faster than others?:: +* Is backing up a big deal?:: +* Can I fake multi-byte character support?:: +* deleteme01:: +* Can you discuss some flex internals?:: +* unput() messes up yy_at_bol:: +* The | operator is not doing what I want:: +* Why can't flex understand this variable trailing context pattern?:: +* The ^ operator isn't working:: +* Trailing context is getting confused with trailing optional patterns:: +* Is flex GNU or not?:: +* ERASEME53:: +* I need to scan if-then-else blocks and while loops:: +* ERASEME55:: +* ERASEME56:: +* ERASEME57:: +* Is there a repository for flex scanners?:: +* How can I conditionally compile or preprocess my flex input file?:: +* Where can I find grammars for lex and yacc?:: +* I get an end-of-buffer message for each character scanned.:: +* unnamed-faq-62:: +* unnamed-faq-63:: +* unnamed-faq-64:: +* unnamed-faq-65:: +* unnamed-faq-66:: +* unnamed-faq-67:: +* unnamed-faq-68:: +* unnamed-faq-69:: +* unnamed-faq-70:: +* unnamed-faq-71:: +* unnamed-faq-72:: +* unnamed-faq-73:: +* unnamed-faq-74:: +* unnamed-faq-75:: +* unnamed-faq-76:: +* unnamed-faq-77:: +* unnamed-faq-78:: +* unnamed-faq-79:: +* unnamed-faq-80:: +* unnamed-faq-81:: +* unnamed-faq-82:: +* unnamed-faq-83:: +* unnamed-faq-84:: +* unnamed-faq-85:: +* unnamed-faq-86:: +* unnamed-faq-87:: +* unnamed-faq-88:: +* unnamed-faq-90:: +* unnamed-faq-91:: +* unnamed-faq-92:: +* unnamed-faq-93:: +* unnamed-faq-94:: +* unnamed-faq-95:: +* unnamed-faq-96:: +* unnamed-faq-97:: +* unnamed-faq-98:: +* unnamed-faq-99:: +* unnamed-faq-100:: +* unnamed-faq-101:: +* What is the difference between YYLEX_PARAM and YY_DECL?:: +* Why do I get "conflicting types for yylex" error?:: +* How do I access the values set in a Flex action from within a Bison action?:: + +Appendices + +* Makefiles and Flex:: +* Bison Bridge:: +* M4 Dependency:: +* Common Patterns:: + +Indices + +* Concept Index:: +* Index of Functions and Macros:: +* Index of Variables:: +* Index of Data Types:: +* Index of Hooks:: +* Index of Scanner Options:: + + +File: flex.info, Node: Copyright, Next: Reporting Bugs, Prev: Top, Up: Top + +1 Copyright +*********** + +The flex manual is placed under the same licensing conditions as the +rest of flex: + + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 The Flex +Project. + + Copyright (C) 1990, 1997 The Regents of the University of California. +All rights reserved. + + This code is derived from software contributed to Berkeley by Vern +Paxson. + + The United States Government has rights in this work pursuant to +contract no. DE-AC03-76SF00098 between the United States Department of +Energy and the University of California. + + Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. + + Neither the name of the University nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + + THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + +File: flex.info, Node: Reporting Bugs, Next: Introduction, Prev: Copyright, Up: Top + +2 Reporting Bugs +**************** + +If you find a bug in `flex', please report it using the SourceForge Bug +Tracking facilities which can be found on flex's SourceForge Page +(http://sourceforge.net/projects/flex). + + +File: flex.info, Node: Introduction, Next: Simple Examples, Prev: Reporting Bugs, Up: Top + +3 Introduction +************** + +`flex' is a tool for generating "scanners". A scanner is a program +which recognizes lexical patterns in text. The `flex' program reads +the given input files, or its standard input if no file names are +given, for a description of a scanner to generate. The description is +in the form of pairs of regular expressions and C code, called "rules". +`flex' generates as output a C source file, `lex.yy.c' by default, +which defines a routine `yylex()'. This file can be compiled and +linked with the flex runtime library to produce an executable. When +the executable is run, it analyzes its input for occurrences of the +regular expressions. Whenever it finds one, it executes the +corresponding C code. + + +File: flex.info, Node: Simple Examples, Next: Format, Prev: Introduction, Up: Top + +4 Some Simple Examples +********************** + +First some simple examples to get the flavor of how one uses `flex'. + + The following `flex' input specifies a scanner which, when it +encounters the string `username' will replace it with the user's login +name: + + + %% + username printf( "%s", getlogin() ); + + By default, any text not matched by a `flex' scanner is copied to +the output, so the net effect of this scanner is to copy its input file +to its output with each occurrence of `username' expanded. In this +input, there is just one rule. `username' is the "pattern" and the +`printf' is the "action". The `%%' symbol marks the beginning of the +rules. + + Here's another simple example: + + + int num_lines = 0, num_chars = 0; + + %% + \n ++num_lines; ++num_chars; + . ++num_chars; + + %% + main() + { + yylex(); + printf( "# of lines = %d, # of chars = %d\n", + num_lines, num_chars ); + } + + This scanner counts the number of characters and the number of lines +in its input. It produces no output other than the final report on the +character and line counts. The first line declares two globals, +`num_lines' and `num_chars', which are accessible both inside `yylex()' +and in the `main()' routine declared after the second `%%'. There are +two rules, one which matches a newline (`\n') and increments both the +line count and the character count, and one which matches any character +other than a newline (indicated by the `.' regular expression). + + A somewhat more complicated example: + + + /* scanner for a toy Pascal-like language */ + + %{ + /* need this for the call to atof() below */ + #include math.h> + %} + + DIGIT [0-9] + ID [a-z][a-z0-9]* + + %% + + {DIGIT}+ { + printf( "An integer: %s (%d)\n", yytext, + atoi( yytext ) ); + } + + {DIGIT}+"."{DIGIT}* { + printf( "A float: %s (%g)\n", yytext, + atof( yytext ) ); + } + + if|then|begin|end|procedure|function { + printf( "A keyword: %s\n", yytext ); + } + + {ID} printf( "An identifier: %s\n", yytext ); + + "+"|"-"|"*"|"/" printf( "An operator: %s\n", yytext ); + + "{"[\^{}}\n]*"}" /* eat up one-line comments */ + + [ \t\n]+ /* eat up whitespace */ + + . printf( "Unrecognized character: %s\n", yytext ); + + %% + + main( argc, argv ) + int argc; + char **argv; + { + ++argv, --argc; /* skip over program name */ + if ( argc > 0 ) + yyin = fopen( argv[0], "r" ); + else + yyin = stdin; + + yylex(); + } + + This is the beginnings of a simple scanner for a language like +Pascal. It identifies different types of "tokens" and reports on what +it has seen. + + The details of this example will be explained in the following +sections. + + +File: flex.info, Node: Format, Next: Patterns, Prev: Simple Examples, Up: Top + +5 Format of the Input File +************************** + +The `flex' input file consists of three sections, separated by a line +containing only `%%'. + + + definitions + %% + rules + %% + user code + +* Menu: + +* Definitions Section:: +* Rules Section:: +* User Code Section:: +* Comments in the Input:: + + +File: flex.info, Node: Definitions Section, Next: Rules Section, Prev: Format, Up: Format + +5.1 Format of the Definitions Section +===================================== + +The "definitions section" contains declarations of simple "name" +definitions to simplify the scanner specification, and declarations of +"start conditions", which are explained in a later section. + + Name definitions have the form: + + + name definition + + The `name' is a word beginning with a letter or an underscore (`_') +followed by zero or more letters, digits, `_', or `-' (dash). The +definition is taken to begin at the first non-whitespace character +following the name and continuing to the end of the line. The +definition can subsequently be referred to using `{name}', which will +expand to `(definition)'. For example, + + + DIGIT [0-9] + ID [a-z][a-z0-9]* + + Defines `DIGIT' to be a regular expression which matches a single +digit, and `ID' to be a regular expression which matches a letter +followed by zero-or-more letters-or-digits. A subsequent reference to + + + {DIGIT}+"."{DIGIT}* + + is identical to + + + ([0-9])+"."([0-9])* + + and matches one-or-more digits followed by a `.' followed by +zero-or-more digits. + + An unindented comment (i.e., a line beginning with `/*') is copied +verbatim to the output up to the next `*/'. + + Any _indented_ text or text enclosed in `%{' and `%}' is also copied +verbatim to the output (with the %{ and %} symbols removed). The %{ +and %} symbols must appear unindented on lines by themselves. + + A `%top' block is similar to a `%{' ... `%}' block, except that the +code in a `%top' block is relocated to the _top_ of the generated file, +before any flex definitions (1). The `%top' block is useful when you +want certain preprocessor macros to be defined or certain files to be +included before the generated code. The single characters, `{' and +`}' are used to delimit the `%top' block, as show in the example below: + + + %top{ + /* This code goes at the "top" of the generated file. */ + #include <stdint.h> + #include <inttypes.h> + } + + Multiple `%top' blocks are allowed, and their order is preserved. + + ---------- Footnotes ---------- + + (1) Actually, `yyIN_HEADER' is defined before the `%top' block. + + +File: flex.info, Node: Rules Section, Next: User Code Section, Prev: Definitions Section, Up: Format + +5.2 Format of the Rules Section +=============================== + +The "rules" section of the `flex' input contains a series of rules of +the form: + + + pattern action + + where the pattern must be unindented and the action must begin on +the same line. *Note Patterns::, for a further description of patterns +and actions. + + In the rules section, any indented or %{ %} enclosed text appearing +before the first rule may be used to declare variables which are local +to the scanning routine and (after the declarations) code which is to be +executed whenever the scanning routine is entered. Other indented or +%{ %} text in the rule section is still copied to the output, but its +meaning is not well-defined and it may well cause compile-time errors +(this feature is present for POSIX compliance. *Note Lex and Posix::, +for other such features). + + Any _indented_ text or text enclosed in `%{' and `%}' is copied +verbatim to the output (with the %{ and %} symbols removed). The %{ +and %} symbols must appear unindented on lines by themselves. + + +File: flex.info, Node: User Code Section, Next: Comments in the Input, Prev: Rules Section, Up: Format + +5.3 Format of the User Code Section +=================================== + +The user code section is simply copied to `lex.yy.c' verbatim. It is +used for companion routines which call or are called by the scanner. +The presence of this section is optional; if it is missing, the second +`%%' in the input file may be skipped, too. + + +File: flex.info, Node: Comments in the Input, Prev: User Code Section, Up: Format + +5.4 Comments in the Input +========================= + +Flex supports C-style comments, that is, anything between `/*' and `*/' +is considered a comment. Whenever flex encounters a comment, it copies +the entire comment verbatim to the generated source code. Comments may +appear just about anywhere, but with the following exceptions: + + * Comments may not appear in the Rules Section wherever flex is + expecting a regular expression. This means comments may not appear + at the beginning of a line, or immediately following a list of + scanner states. + + * Comments may not appear on an `%option' line in the Definitions + Section. + + If you want to follow a simple rule, then always begin a comment on a +new line, with one or more whitespace characters before the initial +`/*'). This rule will work anywhere in the input file. + + All the comments in the following example are valid: + + + %{ + /* code block */ + %} + + /* Definitions Section */ + %x STATE_X + + %% + /* Rules Section */ + ruleA /* after regex */ { /* code block */ } /* after code block */ + /* Rules Section (indented) */ + <STATE_X>{ + ruleC ECHO; + ruleD ECHO; + %{ + /* code block */ + %} + } + %% + /* User Code Section */ + + +File: flex.info, Node: Patterns, Next: Matching, Prev: Format, Up: Top + +6 Patterns +********** + +The patterns in the input (see *Note Rules Section::) are written using +an extended set of regular expressions. These are: + +`x' + match the character 'x' + +`.' + any character (byte) except newline + +`[xyz]' + a "character class"; in this case, the pattern matches either an + 'x', a 'y', or a 'z' + +`[abj-oZ]' + a "character class" with a range in it; matches an 'a', a 'b', any + letter from 'j' through 'o', or a 'Z' + +`[^A-Z]' + a "negated character class", i.e., any character but those in the + class. In this case, any character EXCEPT an uppercase letter. + +`[^A-Z\n]' + any character EXCEPT an uppercase letter or a newline + +`[a-z]{-}[aeiou]' + the lowercase consonants + +`r*' + zero or more r's, where r is any regular expression + +`r+' + one or more r's + +`r?' + zero or one r's (that is, "an optional r") + +`r{2,5}' + anywhere from two to five r's + +`r{2,}' + two or more r's + +`r{4}' + exactly 4 r's + +`{name}' + the expansion of the `name' definition (*note Format::). + +`"[xyz]\"foo"' + the literal string: `[xyz]"foo' + +`\X' + if X is `a', `b', `f', `n', `r', `t', or `v', then the ANSI-C + interpretation of `\x'. Otherwise, a literal `X' (used to escape + operators such as `*') + +`\0' + a NUL character (ASCII code 0) + +`\123' + the character with octal value 123 + +`\x2a' + the character with hexadecimal value 2a + +`(r)' + match an `r'; parentheses are used to override precedence (see + below) + +`(?r-s:pattern)' + apply option `r' and omit option `s' while interpreting pattern. + Options may be zero or more of the characters `i', `s', or `x'. + + `i' means case-insensitive. `-i' means case-sensitive. + + `s' alters the meaning of the `.' syntax to match any single byte + whatsoever. `-s' alters the meaning of `.' to match any byte + except `\n'. + + `x' ignores comments and whitespace in patterns. Whitespace is + ignored unless it is backslash-escaped, contained within `""'s, or + appears inside a character class. + + The following are all valid: + + + (?:foo) same as (foo) + (?i:ab7) same as ([aA][bB]7) + (?-i:ab) same as (ab) + (?s:.) same as [\x00-\xFF] + (?-s:.) same as [^\n] + (?ix-s: a . b) same as ([Aa][^\n][bB]) + (?x:a b) same as ("ab") + (?x:a\ b) same as ("a b") + (?x:a" "b) same as ("a b") + (?x:a[ ]b) same as ("a b") + (?x:a + /* comment */ + b + c) same as (abc) + +`(?# comment )' + omit everything within `()'. The first `)' character encountered + ends the pattern. It is not possible to for the comment to contain + a `)' character. The comment may span lines. + +`rs' + the regular expression `r' followed by the regular expression `s'; + called "concatenation" + +`r|s' + either an `r' or an `s' + +`r/s' + an `r' but only if it is followed by an `s'. The text matched by + `s' is included when determining whether this rule is the longest + match, but is then returned to the input before the action is + executed. So the action only sees the text matched by `r'. This + type of pattern is called "trailing context". (There are some + combinations of `r/s' that flex cannot match correctly. *Note + Limitations::, regarding dangerous trailing context.) + +`^r' + an `r', but only at the beginning of a line (i.e., when just + starting to scan, or right after a newline has been scanned). + +`r$' + an `r', but only at the end of a line (i.e., just before a + newline). Equivalent to `r/\n'. + + Note that `flex''s notion of "newline" is exactly whatever the C + compiler used to compile `flex' interprets `\n' as; in particular, + on some DOS systems you must either filter out `\r's in the input + yourself, or explicitly use `r/\r\n' for `r$'. + +`<s>r' + an `r', but only in start condition `s' (see *Note Start + Conditions:: for discussion of start conditions). + +`<s1,s2,s3>r' + same, but in any of start conditions `s1', `s2', or `s3'. + +`<*>r' + an `r' in any start condition, even an exclusive one. + +`<<EOF>>' + an end-of-file. + +`<s1,s2><<EOF>>' + an end-of-file when in start condition `s1' or `s2' + + Note that inside of a character class, all regular expression +operators lose their special meaning except escape (`\') and the +character class operators, `-', `]]', and, at the beginning of the +class, `^'. + + The regular expressions listed above are grouped according to +precedence, from highest precedence at the top to lowest at the bottom. +Those grouped together have equal precedence (see special note on the +precedence of the repeat operator, `{}', under the documentation for +the `--posix' POSIX compliance option). For example, + + + foo|bar* + + is the same as + + + (foo)|(ba(r*)) + + since the `*' operator has higher precedence than concatenation, and +concatenation higher than alternation (`|'). This pattern therefore +matches _either_ the string `foo' _or_ the string `ba' followed by +zero-or-more `r''s. To match `foo' or zero-or-more repetitions of the +string `bar', use: + + + foo|(bar)* + + And to match a sequence of zero or more repetitions of `foo' and +`bar': + + + (foo|bar)* + + In addition to characters and ranges of characters, character classes +can also contain "character class expressions". These are expressions +enclosed inside `[': and `:]' delimiters (which themselves must appear +between the `[' and `]' of the character class. Other elements may +occur inside the character class, too). The valid expressions are: + + + [:alnum:] [:alpha:] [:blank:] + [:cntrl:] [:digit:] [:graph:] + [:lower:] [:print:] [:punct:] + [:space:] [:upper:] [:xdigit:] + + These expressions all designate a set of characters equivalent to the +corresponding standard C `isXXX' function. For example, `[:alnum:]' +designates those characters for which `isalnum()' returns true - i.e., +any alphabetic or numeric character. Some systems don't provide +`isblank()', so flex defines `[:blank:]' as a blank or a tab. + + For example, the following character classes are all equivalent: + + + [[:alnum:]] + [[:alpha:][:digit:]] + [[:alpha:][0-9]] + [a-zA-Z0-9] + + A word of caution. Character classes are expanded immediately when +seen in the `flex' input. This means the character classes are +sensitive to the locale in which `flex' is executed, and the resulting +scanner will not be sensitive to the runtime locale. This may or may +not be desirable. + + * If your scanner is case-insensitive (the `-i' flag), then + `[:upper:]' and `[:lower:]' are equivalent to `[:alpha:]'. + + * Character classes with ranges, such as `[a-Z]', should be used with + caution in a case-insensitive scanner if the range spans upper or + lowercase characters. Flex does not know if you want to fold all + upper and lowercase characters together, or if you want the + literal numeric range specified (with no case folding). When in + doubt, flex will assume that you meant the literal numeric range, + and will issue a warning. The exception to this rule is a + character range such as `[a-z]' or `[S-W]' where it is obvious + that you want case-folding to occur. Here are some examples with + the `-i' flag enabled: + + Range Result Literal Range Alternate Range + `[a-t]' ok `[a-tA-T]' + `[A-T]' ok `[a-tA-T]' + `[A-t]' ambiguous `[A-Z\[\\\]_`a-t]' `[a-tA-T]' + `[_-{]' ambiguous `[_`a-z{]' `[_`a-zA-Z{]' + `[@-C]' ambiguous `[@ABC]' `[@A-Z\[\\\]_`abc]' + + * A negated character class such as the example `[^A-Z]' above + _will_ match a newline unless `\n' (or an equivalent escape + sequence) is one of the characters explicitly present in the + negated character class (e.g., `[^A-Z\n]'). This is unlike how + many other regular expression tools treat negated character + classes, but unfortunately the inconsistency is historically + entrenched. Matching newlines means that a pattern like `[^"]*' + can match the entire input unless there's another quote in the + input. + + Flex allows negation of character class expressions by prepending + `^' to the POSIX character class name. + + + [:^alnum:] [:^alpha:] [:^blank:] + [:^cntrl:] [:^digit:] [:^graph:] + [:^lower:] [:^print:] [:^punct:] + [:^space:] [:^upper:] [:^xdigit:] + + Flex will issue a warning if the expressions `[:^upper:]' and + `[:^lower:]' appear in a case-insensitive scanner, since their + meaning is unclear. The current behavior is to skip them entirely, + but this may change without notice in future revisions of flex. + + * The `{-}' operator computes the difference of two character + classes. For example, `[a-c]{-}[b-z]' represents all the + characters in the class `[a-c]' that are not in the class `[b-z]' + (which in this case, is just the single character `a'). The `{-}' + operator is left associative, so `[abc]{-}[b]{-}[c]' is the same + as `[a]'. Be careful not to accidentally create an empty set, + which will never match. + + * The `{+}' operator computes the union of two character classes. + For example, `[a-z]{+}[0-9]' is the same as `[a-z0-9]'. This + operator is useful when preceded by the result of a difference + operation, as in, `[[:alpha:]]{-}[[:lower:]]{+}[q]', which is + equivalent to `[A-Zq]' in the "C" locale. + + * A rule can have at most one instance of trailing context (the `/' + operator or the `$' operator). The start condition, `^', and + `<<EOF>>' patterns can only occur at the beginning of a pattern, + and, as well as with `/' and `$', cannot be grouped inside + parentheses. A `^' which does not occur at the beginning of a + rule or a `$' which does not occur at the end of a rule loses its + special properties and is treated as a normal character. + + * The following are invalid: + + + foo/bar$ + <sc1>foo<sc2>bar + + Note that the first of these can be written `foo/bar\n'. + + * The following will result in `$' or `^' being treated as a normal + character: + + + foo|(bar$) + foo|^bar + + If the desired meaning is a `foo' or a + `bar'-followed-by-a-newline, the following could be used (the + special `|' action is explained below, *note Actions::): + + + foo | + bar$ /* action goes here */ + + A similar trick will work for matching a `foo' or a + `bar'-at-the-beginning-of-a-line. + + +File: flex.info, Node: Matching, Next: Actions, Prev: Patterns, Up: Top + +7 How the Input Is Matched +************************** + +When the generated scanner is run, it analyzes its input looking for +strings which match any of its patterns. If it finds more than one +match, it takes the one matching the most text (for trailing context +rules, this includes the length of the trailing part, even though it +will then be returned to the input). If it finds two or more matches of +the same length, the rule listed first in the `flex' input file is +chosen. + + Once the match is determined, the text corresponding to the match +(called the "token") is made available in the global character pointer +`yytext', and its length in the global integer `yyleng'. The "action" +corresponding to the matched pattern is then executed (*note +Actions::), and then the remaining input is scanned for another match. + + If no match is found, then the "default rule" is executed: the next +character in the input is considered matched and copied to the standard +output. Thus, the simplest valid `flex' input is: + + + %% + + which generates a scanner that simply copies its input (one +character at a time) to its output. + + Note that `yytext' can be defined in two different ways: either as a +character _pointer_ or as a character _array_. You can control which +definition `flex' uses by including one of the special directives +`%pointer' or `%array' in the first (definitions) section of your flex +input. The default is `%pointer', unless you use the `-l' lex +compatibility option, in which case `yytext' will be an array. The +advantage of using `%pointer' is substantially faster scanning and no +buffer overflow when matching very large tokens (unless you run out of +dynamic memory). The disadvantage is that you are restricted in how +your actions can modify `yytext' (*note Actions::), and calls to the +`unput()' function destroys the present contents of `yytext', which can +be a considerable porting headache when moving between different `lex' +versions. + + The advantage of `%array' is that you can then modify `yytext' to +your heart's content, and calls to `unput()' do not destroy `yytext' +(*note Actions::). Furthermore, existing `lex' programs sometimes +access `yytext' externally using declarations of the form: + + + extern char yytext[]; + + This definition is erroneous when used with `%pointer', but correct +for `%array'. + + The `%array' declaration defines `yytext' to be an array of `YYLMAX' +characters, which defaults to a fairly large value. You can change the +size by simply #define'ing `YYLMAX' to a different value in the first +section of your `flex' input. As mentioned above, with `%pointer' +yytext grows dynamically to accommodate large tokens. While this means +your `%pointer' scanner can accommodate very large tokens (such as +matching entire blocks of comments), bear in mind that each time the +scanner must resize `yytext' it also must rescan the entire token from +the beginning, so matching such tokens can prove slow. `yytext' +presently does _not_ dynamically grow if a call to `unput()' results in +too much text being pushed back; instead, a run-time error results. + + Also note that you cannot use `%array' with C++ scanner classes +(*note Cxx::). + + +File: flex.info, Node: Actions, Next: Generated Scanner, Prev: Matching, Up: Top + +8 Actions +********* + +Each pattern in a rule has a corresponding "action", which can be any +arbitrary C statement. The pattern ends at the first non-escaped +whitespace character; the remainder of the line is its action. If the +action is empty, then when the pattern is matched the input token is +simply discarded. For example, here is the specification for a program +which deletes all occurrences of `zap me' from its input: + + + %% + "zap me" + + This example will copy all other characters in the input to the +output since they will be matched by the default rule. + + Here is a program which compresses multiple blanks and tabs down to a +single blank, and throws away whitespace found at the end of a line: + + + %% + [ \t]+ putchar( ' ' ); + [ \t]+$ /* ignore this token */ + + If the action contains a `{', then the action spans till the +balancing `}' is found, and the action may cross multiple lines. +`flex' knows about C strings and comments and won't be fooled by braces +found within them, but also allows actions to begin with `%{' and will +consider the action to be all the text up to the next `%}' (regardless +of ordinary braces inside the action). + + An action consisting solely of a vertical bar (`|') means "same as +the action for the next rule". See below for an illustration. + + Actions can include arbitrary C code, including `return' statements +to return a value to whatever routine called `yylex()'. Each time +`yylex()' is called it continues processing tokens from where it last +left off until it either reaches the end of the file or executes a +return. + + Actions are free to modify `yytext' except for lengthening it +(adding characters to its end-these will overwrite later characters in +the input stream). This however does not apply when using `%array' +(*note Matching::). In that case, `yytext' may be freely modified in +any way. + + Actions are free to modify `yyleng' except they should not do so if +the action also includes use of `yymore()' (see below). + + There are a number of special directives which can be included +within an action: + +`ECHO' + copies yytext to the scanner's output. + +`BEGIN' + followed by the name of a start condition places the scanner in the + corresponding start condition (see below). + +`REJECT' + directs the scanner to proceed on to the "second best" rule which + matched the input (or a prefix of the input). The rule is chosen + as described above in *Note Matching::, and `yytext' and `yyleng' + set up appropriately. It may either be one which matched as much + text as the originally chosen rule but came later in the `flex' + input file, or one which matched less text. For example, the + following will both count the words in the input and call the + routine `special()' whenever `frob' is seen: + + + int word_count = 0; + %% + + frob special(); REJECT; + [^ \t\n]+ ++word_count; + + Without the `REJECT', any occurrences of `frob' in the input would + not be counted as words, since the scanner normally executes only + one action per token. Multiple uses of `REJECT' are allowed, each + one finding the next best choice to the currently active rule. For + example, when the following scanner scans the token `abcd', it will + write `abcdabcaba' to the output: + + + %% + a | + ab | + abc | + abcd ECHO; REJECT; + .|\n /* eat up any unmatched character */ + + The first three rules share the fourth's action since they use the + special `|' action. + + `REJECT' is a particularly expensive feature in terms of scanner + performance; if it is used in _any_ of the scanner's actions it + will slow down _all_ of the scanner's matching. Furthermore, + `REJECT' cannot be used with the `-Cf' or `-CF' options (*note + Scanner Options::). + + Note also that unlike the other special actions, `REJECT' is a + _branch_. Code immediately following it in the action will _not_ + be executed. + +`yymore()' + tells the scanner that the next time it matches a rule, the + corresponding token should be _appended_ onto the current value of + `yytext' rather than replacing it. For example, given the input + `mega-kludge' the following will write `mega-mega-kludge' to the + output: + + + %% + mega- ECHO; yymore(); + kludge ECHO; + + First `mega-' is matched and echoed to the output. Then `kludge' + is matched, but the previous `mega-' is still hanging around at the + beginning of `yytext' so the `ECHO' for the `kludge' rule will + actually write `mega-kludge'. + + Two notes regarding use of `yymore()'. First, `yymore()' depends on +the value of `yyleng' correctly reflecting the size of the current +token, so you must not modify `yyleng' if you are using `yymore()'. +Second, the presence of `yymore()' in the scanner's action entails a +minor performance penalty in the scanner's matching speed. + + `yyless(n)' returns all but the first `n' characters of the current +token back to the input stream, where they will be rescanned when the +scanner looks for the next match. `yytext' and `yyleng' are adjusted +appropriately (e.g., `yyleng' will now be equal to `n'). For example, +on the input `foobar' the following will write out `foobarbar': + + + %% + foobar ECHO; yyless(3); + [a-z]+ ECHO; + + An argument of 0 to `yyless()' will cause the entire current input +string to be scanned again. Unless you've changed how the scanner will +subsequently process its input (using `BEGIN', for example), this will +result in an endless loop. + + Note that `yyless()' is a macro and can only be used in the flex +input file, not from other source files. + + `unput(c)' puts the character `c' back onto the input stream. It +will be the next character scanned. The following action will take the +current token and cause it to be rescanned enclosed in parentheses. + + + { + int i; + /* Copy yytext because unput() trashes yytext */ + char *yycopy = strdup( yytext ); + unput( ')' ); + for ( i = yyleng - 1; i >= 0; --i ) + unput( yycopy[i] ); + unput( '(' ); + free( yycopy ); + } + + Note that since each `unput()' puts the given character back at the +_beginning_ of the input stream, pushing back strings must be done +back-to-front. + + An important potential problem when using `unput()' is that if you +are using `%pointer' (the default), a call to `unput()' _destroys_ the +contents of `yytext', starting with its rightmost character and +devouring one character to the left with each call. If you need the +value of `yytext' preserved after a call to `unput()' (as in the above +example), you must either first copy it elsewhere, or build your +scanner using `%array' instead (*note Matching::). + + Finally, note that you cannot put back `EOF' to attempt to mark the +input stream with an end-of-file. + + `input()' reads the next character from the input stream. For +example, the following is one way to eat up C comments: + + + %% + "/*" { + register int c; + + for ( ; ; ) + { + while ( (c = input()) != '*' && + c != EOF ) + ; /* eat up text of comment */ + + if ( c == '*' ) + { + while ( (c = input()) == '*' ) + ; + if ( c == '/' ) + break; /* found the end */ + } + + if ( c == EOF ) + { + error( "EOF in comment" ); + break; + } + } + } + + (Note that if the scanner is compiled using `C++', then `input()' is +instead referred to as yyinput(), in order to avoid a name clash with +the `C++' stream by the name of `input'.) + + `YY_FLUSH_BUFFER()' flushes the scanner's internal buffer so that +the next time the scanner attempts to match a token, it will first +refill the buffer using `YY_INPUT()' (*note Generated Scanner::). This +action is a special case of the more general `yy_flush_buffer()' +function, described below (*note Multiple Input Buffers::) + + `yyterminate()' can be used in lieu of a return statement in an +action. It terminates the scanner and returns a 0 to the scanner's +caller, indicating "all done". By default, `yyterminate()' is also +called when an end-of-file is encountered. It is a macro and may be +redefined. + + +File: flex.info, Node: Generated Scanner, Next: Start Conditions, Prev: Actions, Up: Top + +9 The Generated Scanner +*********************** + +The output of `flex' is the file `lex.yy.c', which contains the +scanning routine `yylex()', a number of tables used by it for matching +tokens, and a number of auxiliary routines and macros. By default, +`yylex()' is declared as follows: + + + int yylex() + { + ... various definitions and the actions in here ... + } + + (If your environment supports function prototypes, then it will be +`int yylex( void )'.) This definition may be changed by defining the +`YY_DECL' macro. For example, you could use: + + + #define YY_DECL float lexscan( a, b ) float a, b; + + to give the scanning routine the name `lexscan', returning a float, +and taking two floats as arguments. Note that if you give arguments to +the scanning routine using a K&R-style/non-prototyped function +declaration, you must terminate the definition with a semi-colon (;). + + `flex' generates `C99' function definitions by default. However flex +does have the ability to generate obsolete, er, `traditional', function +definitions. This is to support bootstrapping gcc on old systems. +Unfortunately, traditional definitions prevent us from using any +standard data types smaller than int (such as short, char, or bool) as +function arguments. For this reason, future versions of `flex' may +generate standard C99 code only, leaving K&R-style functions to the +historians. Currently, if you do *not* want `C99' definitions, then +you must use `%option noansi-definitions'. + + Whenever `yylex()' is called, it scans tokens from the global input +file `yyin' (which defaults to stdin). It continues until it either +reaches an end-of-file (at which point it returns the value 0) or one +of its actions executes a `return' statement. + + If the scanner reaches an end-of-file, subsequent calls are undefined +unless either `yyin' is pointed at a new input file (in which case +scanning continues from that file), or `yyrestart()' is called. +`yyrestart()' takes one argument, a `FILE *' pointer (which can be +NULL, if you've set up `YY_INPUT' to scan from a source other than +`yyin'), and initializes `yyin' for scanning from that file. +Essentially there is no difference between just assigning `yyin' to a +new input file or using `yyrestart()' to do so; the latter is available +for compatibility with previous versions of `flex', and because it can +be used to switch input files in the middle of scanning. It can also +be used to throw away the current input buffer, by calling it with an +argument of `yyin'; but it would be better to use `YY_FLUSH_BUFFER' +(*note Actions::). Note that `yyrestart()' does _not_ reset the start +condition to `INITIAL' (*note Start Conditions::). + + If `yylex()' stops scanning due to executing a `return' statement in +one of the actions, the scanner may then be called again and it will +resume scanning where it left off. + + By default (and for purposes of efficiency), the scanner uses +block-reads rather than simple `getc()' calls to read characters from +`yyin'. The nature of how it gets its input can be controlled by +defining the `YY_INPUT' macro. The calling sequence for `YY_INPUT()' +is `YY_INPUT(buf,result,max_size)'. Its action is to place up to +`max_size' characters in the character array `buf' and return in the +integer variable `result' either the number of characters read or the +constant `YY_NULL' (0 on Unix systems) to indicate `EOF'. The default +`YY_INPUT' reads from the global file-pointer `yyin'. + + Here is a sample definition of `YY_INPUT' (in the definitions +section of the input file): + + + %{ + #define YY_INPUT(buf,result,max_size) \ + { \ + int c = getchar(); \ + result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \ + } + %} + + This definition will change the input processing to occur one +character at a time. + + When the scanner receives an end-of-file indication from YY_INPUT, it +then checks the `yywrap()' function. If `yywrap()' returns false +(zero), then it is assumed that the function has gone ahead and set up +`yyin' to point to another input file, and scanning continues. If it +returns true (non-zero), then the scanner terminates, returning 0 to +its caller. Note that in either case, the start condition remains +unchanged; it does _not_ revert to `INITIAL'. + + If you do not supply your own version of `yywrap()', then you must +either use `%option noyywrap' (in which case the scanner behaves as +though `yywrap()' returned 1), or you must link with `-lfl' to obtain +the default version of the routine, which always returns 1. + + For scanning from in-memory buffers (e.g., scanning strings), see +*Note Scanning Strings::. *Note Multiple Input Buffers::. + + The scanner writes its `ECHO' output to the `yyout' global (default, +`stdout'), which may be redefined by the user simply by assigning it to +some other `FILE' pointer. + + +File: flex.info, Node: Start Conditions, Next: Multiple Input Buffers, Prev: Generated Scanner, Up: Top + +10 Start Conditions +******************* + +`flex' provides a mechanism for conditionally activating rules. Any +rule whose pattern is prefixed with `<sc>' will only be active when the +scanner is in the "start condition" named `sc'. For example, + + + <STRING>[^"]* { /* eat up the string body ... */ + ... + } + + will be active only when the scanner is in the `STRING' start +condition, and + + + <INITIAL,STRING,QUOTE>\. { /* handle an escape ... */ + ... + } + + will be active only when the current start condition is either +`INITIAL', `STRING', or `QUOTE'. + + Start conditions are declared in the definitions (first) section of +the input using unindented lines beginning with either `%s' or `%x' +followed by a list of names. The former declares "inclusive" start +conditions, the latter "exclusive" start conditions. A start condition +is activated using the `BEGIN' action. Until the next `BEGIN' action +is executed, rules with the given start condition will be active and +rules with other start conditions will be inactive. If the start +condition is inclusive, then rules with no start conditions at all will +also be active. If it is exclusive, then _only_ rules qualified with +the start condition will be active. A set of rules contingent on the +same exclusive start condition describe a scanner which is independent +of any of the other rules in the `flex' input. Because of this, +exclusive start conditions make it easy to specify "mini-scanners" +which scan portions of the input that are syntactically different from +the rest (e.g., comments). + + If the distinction between inclusive and exclusive start conditions +is still a little vague, here's a simple example illustrating the +connection between the two. The set of rules: + + + %s example + %% + + <example>foo do_something(); + + bar something_else(); + + is equivalent to + + + %x example + %% + + <example>foo do_something(); + + <INITIAL,example>bar something_else(); + + Without the `<INITIAL,example>' qualifier, the `bar' pattern in the +second example wouldn't be active (i.e., couldn't match) when in start +condition `example'. If we just used `<example>' to qualify `bar', +though, then it would only be active in `example' and not in `INITIAL', +while in the first example it's active in both, because in the first +example the `example' start condition is an inclusive `(%s)' start +condition. + + Also note that the special start-condition specifier `<*>' matches +every start condition. Thus, the above example could also have been +written: + + + %x example + %% + + <example>foo do_something(); + + <*>bar something_else(); + + The default rule (to `ECHO' any unmatched character) remains active +in start conditions. It is equivalent to: + + + <*>.|\n ECHO; + + `BEGIN(0)' returns to the original state where only the rules with +no start conditions are active. This state can also be referred to as +the start-condition `INITIAL', so `BEGIN(INITIAL)' is equivalent to +`BEGIN(0)'. (The parentheses around the start condition name are not +required but are considered good style.) + + `BEGIN' actions can also be given as indented code at the beginning +of the rules section. For example, the following will cause the scanner +to enter the `SPECIAL' start condition whenever `yylex()' is called and +the global variable `enter_special' is true: + + + int enter_special; + + %x SPECIAL + %% + if ( enter_special ) + BEGIN(SPECIAL); + + <SPECIAL>blahblahblah + ...more rules follow... + + To illustrate the uses of start conditions, here is a scanner which +provides two different interpretations of a string like `123.456'. By +default it will treat it as three tokens, the integer `123', a dot +(`.'), and the integer `456'. But if the string is preceded earlier in +the line by the string `expect-floats' it will treat it as a single +token, the floating-point number `123.456': + + + %{ + #include <math.h> + %} + %s expect + + %% + expect-floats BEGIN(expect); + + <expect>[0-9]+@samp{.}[0-9]+ { + printf( "found a float, = %f\n", + atof( yytext ) ); + } + <expect>\n { + /* that's the end of the line, so + * we need another "expect-number" + * before we'll recognize any more + * numbers + */ + BEGIN(INITIAL); + } + + [0-9]+ { + printf( "found an integer, = %d\n", + atoi( yytext ) ); + } + + "." printf( "found a dot\n" ); + + Here is a scanner which recognizes (and discards) C comments while +maintaining a count of the current input line. + + + %x comment + %% + int line_num = 1; + + "/*" BEGIN(comment); + + <comment>[^*\n]* /* eat anything that's not a '*' */ + <comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */ + <comment>\n ++line_num; + <comment>"*"+"/" BEGIN(INITIAL); + + This scanner goes to a bit of trouble to match as much text as +possible with each rule. In general, when attempting to write a +high-speed scanner try to match as much possible in each rule, as it's +a big win. + + Note that start-conditions names are really integer values and can +be stored as such. Thus, the above could be extended in the following +fashion: + + + %x comment foo + %% + int line_num = 1; + int comment_caller; + + "/*" { + comment_caller = INITIAL; + BEGIN(comment); + } + + ... + + <foo>"/*" { + comment_caller = foo; + BEGIN(comment); + } + + <comment>[^*\n]* /* eat anything that's not a '*' */ + <comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */ + <comment>\n ++line_num; + <comment>"*"+"/" BEGIN(comment_caller); + + Furthermore, you can access the current start condition using the +integer-valued `YY_START' macro. For example, the above assignments to +`comment_caller' could instead be written + + + comment_caller = YY_START; + + Flex provides `YYSTATE' as an alias for `YY_START' (since that is +what's used by AT&T `lex'). + + For historical reasons, start conditions do not have their own +name-space within the generated scanner. The start condition names are +unmodified in the generated scanner and generated header. *Note +option-header::. *Note option-prefix::. + + Finally, here's an example of how to match C-style quoted strings +using exclusive start conditions, including expanded escape sequences +(but not including checking for a string that's too long): + + + %x str + + %% + char string_buf[MAX_STR_CONST]; + char *string_buf_ptr; + + + \" string_buf_ptr = string_buf; BEGIN(str); + + <str>\" { /* saw closing quote - all done */ + BEGIN(INITIAL); + *string_buf_ptr = '\0'; + /* return string constant token type and + * value to parser + */ + } + + <str>\n { + /* error - unterminated string constant */ + /* generate error message */ + } + + <str>\\[0-7]{1,3} { + /* octal escape sequence */ + int result; + + (void) sscanf( yytext + 1, "%o", &result ); + + if ( result > 0xff ) + /* error, constant is out-of-bounds */ + + *string_buf_ptr++ = result; + } + + <str>\\[0-9]+ { + /* generate error - bad escape sequence; something + * like '\48' or '\0777777' + */ + } + + <str>\\n *string_buf_ptr++ = '\n'; + <str>\\t *string_buf_ptr++ = '\t'; + <str>\\r *string_buf_ptr++ = '\r'; + <str>\\b *string_buf_ptr++ = '\b'; + <str>\\f *string_buf_ptr++ = '\f'; + + <str>\\(.|\n) *string_buf_ptr++ = yytext[1]; + + <str>[^\\\n\"]+ { + char *yptr = yytext; + + while ( *yptr ) + *string_buf_ptr++ = *yptr++; + } + + Often, such as in some of the examples above, you wind up writing a +whole bunch of rules all preceded by the same start condition(s). Flex +makes this a little easier and cleaner by introducing a notion of start +condition "scope". A start condition scope is begun with: + + + <SCs>{ + + where `SCs' is a list of one or more start conditions. Inside the +start condition scope, every rule automatically has the prefix `SCs>' +applied to it, until a `}' which matches the initial `{'. So, for +example, + + + <ESC>{ + "\\n" return '\n'; + "\\r" return '\r'; + "\\f" return '\f'; + "\\0" return '\0'; + } + + is equivalent to: + + + <ESC>"\\n" return '\n'; + <ESC>"\\r" return '\r'; + <ESC>"\\f" return '\f'; + <ESC>"\\0" return '\0'; + + Start condition scopes may be nested. + + The following routines are available for manipulating stacks of +start conditions: + + -- Function: void yy_push_state ( int `new_state' ) + pushes the current start condition onto the top of the start + condition stack and switches to `new_state' as though you had used + `BEGIN new_state' (recall that start condition names are also + integers). + + -- Function: void yy_pop_state () + pops the top of the stack and switches to it via `BEGIN'. + + -- Function: int yy_top_state () + returns the top of the stack without altering the stack's contents. + + The start condition stack grows dynamically and so has no built-in +size limitation. If memory is exhausted, program execution aborts. + + To use start condition stacks, your scanner must include a `%option +stack' directive (*note Scanner Options::). + + +File: flex.info, Node: Multiple Input Buffers, Next: EOF, Prev: Start Conditions, Up: Top + +11 Multiple Input Buffers +************************* + +Some scanners (such as those which support "include" files) require +reading from several input streams. As `flex' scanners do a large +amount of buffering, one cannot control where the next input will be +read from by simply writing a `YY_INPUT()' which is sensitive to the +scanning context. `YY_INPUT()' is only called when the scanner reaches +the end of its buffer, which may be a long time after scanning a +statement such as an `include' statement which requires switching the +input source. + + To negotiate these sorts of problems, `flex' provides a mechanism +for creating and switching between multiple input buffers. An input +buffer is created by using: + + -- Function: YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ) + + which takes a `FILE' pointer and a size and creates a buffer +associated with the given file and large enough to hold `size' +characters (when in doubt, use `YY_BUF_SIZE' for the size). It returns +a `YY_BUFFER_STATE' handle, which may then be passed to other routines +(see below). The `YY_BUFFER_STATE' type is a pointer to an opaque +`struct yy_buffer_state' structure, so you may safely initialize +`YY_BUFFER_STATE' variables to `((YY_BUFFER_STATE) 0)' if you wish, and +also refer to the opaque structure in order to correctly declare input +buffers in source files other than that of your scanner. Note that the +`FILE' pointer in the call to `yy_create_buffer' is only used as the +value of `yyin' seen by `YY_INPUT'. If you redefine `YY_INPUT()' so it +no longer uses `yyin', then you can safely pass a NULL `FILE' pointer to +`yy_create_buffer'. You select a particular buffer to scan from using: + + -- Function: void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ) + + The above function switches the scanner's input buffer so subsequent +tokens will come from `new_buffer'. Note that `yy_switch_to_buffer()' +may be used by `yywrap()' to set things up for continued scanning, +instead of opening a new file and pointing `yyin' at it. If you are +looking for a stack of input buffers, then you want to use +`yypush_buffer_state()' instead of this function. Note also that +switching input sources via either `yy_switch_to_buffer()' or +`yywrap()' does _not_ change the start condition. + + -- Function: void yy_delete_buffer ( YY_BUFFER_STATE buffer ) + + is used to reclaim the storage associated with a buffer. (`buffer' +can be NULL, in which case the routine does nothing.) You can also +clear the current contents of a buffer using: + + -- Function: void yypush_buffer_state ( YY_BUFFER_STATE buffer ) + + This function pushes the new buffer state onto an internal stack. +The pushed state becomes the new current state. The stack is maintained +by flex and will grow as required. This function is intended to be used +instead of `yy_switch_to_buffer', when you want to change states, but +preserve the current state for later use. + + -- Function: void yypop_buffer_state ( ) + + This function removes the current state from the top of the stack, +and deletes it by calling `yy_delete_buffer'. The next state on the +stack, if any, becomes the new current state. + + -- Function: void yy_flush_buffer ( YY_BUFFER_STATE buffer ) + + This function discards the buffer's contents, so the next time the +scanner attempts to match a token from the buffer, it will first fill +the buffer anew using `YY_INPUT()'. + + -- Function: YY_BUFFER_STATE yy_new_buffer ( FILE *file, int size ) + + is an alias for `yy_create_buffer()', provided for compatibility +with the C++ use of `new' and `delete' for creating and destroying +dynamic objects. + + `YY_CURRENT_BUFFER' macro returns a `YY_BUFFER_STATE' handle to the +current buffer. It should not be used as an lvalue. + + Here are two examples of using these features for writing a scanner +which expands include files (the `<<EOF>>' feature is discussed below). + + This first example uses yypush_buffer_state and yypop_buffer_state. +Flex maintains the stack internally. + + + /* the "incl" state is used for picking up the name + * of an include file + */ + %x incl + %% + include BEGIN(incl); + + [a-z]+ ECHO; + [^a-z\n]*\n? ECHO; + + <incl>[ \t]* /* eat the whitespace */ + <incl>[^ \t\n]+ { /* got the include file name */ + yyin = fopen( yytext, "r" ); + + if ( ! yyin ) + error( ... ); + + yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE )); + + BEGIN(INITIAL); + } + + <<EOF>> { + yypop_buffer_state(); + + if ( !YY_CURRENT_BUFFER ) + { + yyterminate(); + } + } + + The second example, below, does the same thing as the previous +example did, but manages its own input buffer stack manually (instead +of letting flex do it). + + + /* the "incl" state is used for picking up the name + * of an include file + */ + %x incl + + %{ + #define MAX_INCLUDE_DEPTH 10 + YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; + int include_stack_ptr = 0; + %} + + %% + include BEGIN(incl); + + [a-z]+ ECHO; + [^a-z\n]*\n? ECHO; + + <incl>[ \t]* /* eat the whitespace */ + <incl>[^ \t\n]+ { /* got the include file name */ + if ( include_stack_ptr >= MAX_INCLUDE_DEPTH ) + { + fprintf( stderr, "Includes nested too deeply" ); + exit( 1 ); + } + + include_stack[include_stack_ptr++] = + YY_CURRENT_BUFFER; + + yyin = fopen( yytext, "r" ); + + if ( ! yyin ) + error( ... ); + + yy_switch_to_buffer( + yy_create_buffer( yyin, YY_BUF_SIZE ) ); + + BEGIN(INITIAL); + } + + <<EOF>> { + if ( --include_stack_ptr 0 ) + { + yyterminate(); + } + + else + { + yy_delete_buffer( YY_CURRENT_BUFFER ); + yy_switch_to_buffer( + include_stack[include_stack_ptr] ); + } + } + + The following routines are available for setting up input buffers for +scanning in-memory strings instead of files. All of them create a new +input buffer for scanning the string, and return a corresponding +`YY_BUFFER_STATE' handle (which you should delete with +`yy_delete_buffer()' when done with it). They also switch to the new +buffer using `yy_switch_to_buffer()', so the next call to `yylex()' +will start scanning the string. + + -- Function: YY_BUFFER_STATE yy_scan_string ( const char *str ) + scans a NUL-terminated string. + + -- Function: YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int + len ) + scans `len' bytes (including possibly `NUL's) starting at location + `bytes'. + + Note that both of these functions create and scan a _copy_ of the +string or bytes. (This may be desirable, since `yylex()' modifies the +contents of the buffer it is scanning.) You can avoid the copy by +using: + + -- Function: YY_BUFFER_STATE yy_scan_buffer (char *base, yy_size_t + size) + which scans in place the buffer starting at `base', consisting of + `size' bytes, the last two bytes of which _must_ be + `YY_END_OF_BUFFER_CHAR' (ASCII NUL). These last two bytes are not + scanned; thus, scanning consists of `base[0]' through + `base[size-2]', inclusive. + + If you fail to set up `base' in this manner (i.e., forget the final +two `YY_END_OF_BUFFER_CHAR' bytes), then `yy_scan_buffer()' returns a +NULL pointer instead of creating a new input buffer. + + -- Data type: yy_size_t + is an integral type to which you can cast an integer expression + reflecting the size of the buffer. + + +File: flex.info, Node: EOF, Next: Misc Macros, Prev: Multiple Input Buffers, Up: Top + +12 End-of-File Rules +******************** + +The special rule `<<EOF>>' indicates actions which are to be taken when +an end-of-file is encountered and `yywrap()' returns non-zero (i.e., +indicates no further files to process). The action must finish by +doing one of the following things: + + * assigning `yyin' to a new input file (in previous versions of + `flex', after doing the assignment you had to call the special + action `YY_NEW_FILE'. This is no longer necessary.) + + * executing a `return' statement; + + * executing the special `yyterminate()' action. + + * or, switching to a new buffer using `yy_switch_to_buffer()' as + shown in the example above. + + <<EOF>> rules may not be used with other patterns; they may only be +qualified with a list of start conditions. If an unqualified <<EOF>> +rule is given, it applies to _all_ start conditions which do not +already have <<EOF>> actions. To specify an <<EOF>> rule for only the +initial start condition, use: + + + <INITIAL><<EOF>> + + These rules are useful for catching things like unclosed comments. +An example: + + + %x quote + %% + + ...other rules for dealing with quotes... + + <quote><<EOF>> { + error( "unterminated quote" ); + yyterminate(); + } + <<EOF>> { + if ( *++filelist ) + yyin = fopen( *filelist, "r" ); + else + yyterminate(); + } + + +File: flex.info, Node: Misc Macros, Next: User Values, Prev: EOF, Up: Top + +13 Miscellaneous Macros +*********************** + +The macro `YY_USER_ACTION' can be defined to provide an action which is +always executed prior to the matched rule's action. For example, it +could be #define'd to call a routine to convert yytext to lower-case. +When `YY_USER_ACTION' is invoked, the variable `yy_act' gives the +number of the matched rule (rules are numbered starting with 1). +Suppose you want to profile how often each of your rules is matched. +The following would do the trick: + + + #define YY_USER_ACTION ++ctr[yy_act] + + where `ctr' is an array to hold the counts for the different rules. +Note that the macro `YY_NUM_RULES' gives the total number of rules +(including the default rule), even if you use `-s)', so a correct +declaration for `ctr' is: + + + int ctr[YY_NUM_RULES]; + + The macro `YY_USER_INIT' may be defined to provide an action which +is always executed before the first scan (and before the scanner's +internal initializations are done). For example, it could be used to +call a routine to read in a data table or open a logging file. + + The macro `yy_set_interactive(is_interactive)' can be used to +control whether the current buffer is considered "interactive". An +interactive buffer is processed more slowly, but must be used when the +scanner's input source is indeed interactive to avoid problems due to +waiting to fill buffers (see the discussion of the `-I' flag in *Note +Scanner Options::). A non-zero value in the macro invocation marks the +buffer as interactive, a zero value as non-interactive. Note that use +of this macro overrides `%option always-interactive' or `%option +never-interactive' (*note Scanner Options::). `yy_set_interactive()' +must be invoked prior to beginning to scan the buffer that is (or is +not) to be considered interactive. + + The macro `yy_set_bol(at_bol)' can be used to control whether the +current buffer's scanning context for the next token match is done as +though at the beginning of a line. A non-zero macro argument makes +rules anchored with `^' active, while a zero argument makes `^' rules +inactive. + + The macro `YY_AT_BOL()' returns true if the next token scanned from +the current buffer will have `^' rules active, false otherwise. + + In the generated scanner, the actions are all gathered in one large +switch statement and separated using `YY_BREAK', which may be +redefined. By default, it is simply a `break', to separate each rule's +action from the following rule's. Redefining `YY_BREAK' allows, for +example, C++ users to #define YY_BREAK to do nothing (while being very +careful that every rule ends with a `break' or a `return'!) to avoid +suffering from unreachable statement warnings where because a rule's +action ends with `return', the `YY_BREAK' is inaccessible. + + +File: flex.info, Node: User Values, Next: Yacc, Prev: Misc Macros, Up: Top + +14 Values Available To the User +******************************* + +This chapter summarizes the various values available to the user in the +rule actions. + +`char *yytext' + holds the text of the current token. It may be modified but not + lengthened (you cannot append characters to the end). + + If the special directive `%array' appears in the first section of + the scanner description, then `yytext' is instead declared `char + yytext[YYLMAX]', where `YYLMAX' is a macro definition that you can + redefine in the first section if you don't like the default value + (generally 8KB). Using `%array' results in somewhat slower + scanners, but the value of `yytext' becomes immune to calls to + `unput()', which potentially destroy its value when `yytext' is a + character pointer. The opposite of `%array' is `%pointer', which + is the default. + + You cannot use `%array' when generating C++ scanner classes (the + `-+' flag). + +`int yyleng' + holds the length of the current token. + +`FILE *yyin' + is the file which by default `flex' reads from. It may be + redefined but doing so only makes sense before scanning begins or + after an EOF has been encountered. Changing it in the midst of + scanning will have unexpected results since `flex' buffers its + input; use `yyrestart()' instead. Once scanning terminates + because an end-of-file has been seen, you can assign `yyin' at the + new input file and then call the scanner again to continue + scanning. + +`void yyrestart( FILE *new_file )' + may be called to point `yyin' at the new input file. The + switch-over to the new file is immediate (any previously + buffered-up input is lost). Note that calling `yyrestart()' with + `yyin' as an argument thus throws away the current input buffer + and continues scanning the same input file. + +`FILE *yyout' + is the file to which `ECHO' actions are done. It can be reassigned + by the user. + +`YY_CURRENT_BUFFER' + returns a `YY_BUFFER_STATE' handle to the current buffer. + +`YY_START' + returns an integer value corresponding to the current start + condition. You can subsequently use this value with `BEGIN' to + return to that start condition. + + +File: flex.info, Node: Yacc, Next: Scanner Options, Prev: User Values, Up: Top + +15 Interfacing with Yacc +************************ + +One of the main uses of `flex' is as a companion to the `yacc' +parser-generator. `yacc' parsers expect to call a routine named +`yylex()' to find the next input token. The routine is supposed to +return the type of the next token as well as putting any associated +value in the global `yylval'. To use `flex' with `yacc', one specifies +the `-d' option to `yacc' to instruct it to generate the file `y.tab.h' +containing definitions of all the `%tokens' appearing in the `yacc' +input. This file is then included in the `flex' scanner. For example, +if one of the tokens is `TOK_NUMBER', part of the scanner might look +like: + + + %{ + #include "y.tab.h" + %} + + %% + + [0-9]+ yylval = atoi( yytext ); return TOK_NUMBER; + + +File: flex.info, Node: Scanner Options, Next: Performance, Prev: Yacc, Up: Top + +16 Scanner Options +****************** + +The various `flex' options are categorized by function in the following +menu. If you want to lookup a particular option by name, *Note Index of +Scanner Options::. + +* Menu: + +* Options for Specifying Filenames:: +* Options Affecting Scanner Behavior:: +* Code-Level And API Options:: +* Options for Scanner Speed and Size:: +* Debugging Options:: +* Miscellaneous Options:: + + Even though there are many scanner options, a typical scanner might +only specify the following options: + + + %option 8bit reentrant bison-bridge + %option warn nodefault + %option yylineno + %option outfile="scanner.c" header-file="scanner.h" + + The first line specifies the general type of scanner we want. The +second line specifies that we are being careful. The third line asks +flex to track line numbers. The last line tells flex what to name the +files. (The options can be specified in any order. We just divided +them.) + + `flex' also provides a mechanism for controlling options within the +scanner specification itself, rather than from the flex command-line. +This is done by including `%option' directives in the first section of +the scanner specification. You can specify multiple options with a +single `%option' directive, and multiple directives in the first +section of your flex input file. + + Most options are given simply as names, optionally preceded by the +word `no' (with no intervening whitespace) to negate their meaning. +The names are the same as their long-option equivalents (but without the +leading `--' ). + + `flex' scans your rule actions to determine whether you use the +`REJECT' or `yymore()' features. The `REJECT' and `yymore' options are +available to override its decision as to whether you use the options, +either by setting them (e.g., `%option reject)' to indicate the feature +is indeed used, or unsetting them to indicate it actually is not used +(e.g., `%option noyymore)'. + + A number of options are available for lint purists who want to +suppress the appearance of unneeded routines in the generated scanner. +Each of the following, if unset (e.g., `%option nounput'), results in +the corresponding routine not appearing in the generated scanner: + + + input, unput + yy_push_state, yy_pop_state, yy_top_state + yy_scan_buffer, yy_scan_bytes, yy_scan_string + + yyget_extra, yyset_extra, yyget_leng, yyget_text, + yyget_lineno, yyset_lineno, yyget_in, yyset_in, + yyget_out, yyset_out, yyget_lval, yyset_lval, + yyget_lloc, yyset_lloc, yyget_debug, yyset_debug + + (though `yy_push_state()' and friends won't appear anyway unless you +use `%option stack)'. + + +File: flex.info, Node: Options for Specifying Filenames, Next: Options Affecting Scanner Behavior, Prev: Scanner Options, Up: Scanner Options + +16.1 Options for Specifying Filenames +===================================== + +`--header-file=FILE, `%option header-file="FILE"'' + instructs flex to write a C header to `FILE'. This file contains + function prototypes, extern variables, and types used by the + scanner. Only the external API is exported by the header file. + Many macros that are usable from within scanner actions are not + exported to the header file. This is due to namespace problems and + the goal of a clean external API. + + While in the header, the macro `yyIN_HEADER' is defined, where `yy' + is substituted with the appropriate prefix. + + The `--header-file' option is not compatible with the `--c++' + option, since the C++ scanner provides its own header in + `yyFlexLexer.h'. + +`-oFILE, --outfile=FILE, `%option outfile="FILE"'' + directs flex to write the scanner to the file `FILE' instead of + `lex.yy.c'. If you combine `--outfile' with the `--stdout' option, + then the scanner is written to `stdout' but its `#line' directives + (see the `-l' option above) refer to the file `FILE'. + +`-t, --stdout, `%option stdout'' + instructs `flex' to write the scanner it generates to standard + output instead of `lex.yy.c'. + +`-SFILE, --skel=FILE' + overrides the default skeleton file from which `flex' constructs + its scanners. You'll never need this option unless you are doing + `flex' maintenance or development. + +`--tables-file=FILE' + Write serialized scanner dfa tables to FILE. The generated scanner + will not contain the tables, and requires them to be loaded at + runtime. *Note serialization::. + +`--tables-verify' + This option is for flex development. We document it here in case + you stumble upon it by accident or in case you suspect some + inconsistency in the serialized tables. Flex will serialize the + scanner dfa tables but will also generate the in-code tables as it + normally does. At runtime, the scanner will verify that the + serialized tables match the in-code tables, instead of loading + them. + + + +File: flex.info, Node: Options Affecting Scanner Behavior, Next: Code-Level And API Options, Prev: Options for Specifying Filenames, Up: Scanner Options + +16.2 Options Affecting Scanner Behavior +======================================= + +`-i, --case-insensitive, `%option case-insensitive'' + instructs `flex' to generate a "case-insensitive" scanner. The + case of letters given in the `flex' input patterns will be ignored, + and tokens in the input will be matched regardless of case. The + matched text given in `yytext' will have the preserved case (i.e., + it will not be folded). For tricky behavior, see *Note case and + character ranges::. + +`-l, --lex-compat, `%option lex-compat'' + turns on maximum compatibility with the original AT&T `lex' + implementation. Note that this does not mean _full_ compatibility. + Use of this option costs a considerable amount of performance, and + it cannot be used with the `--c++', `--full', `--fast', `-Cf', or + `-CF' options. For details on the compatibilities it provides, see + *Note Lex and Posix::. This option also results in the name + `YY_FLEX_LEX_COMPAT' being `#define''d in the generated scanner. + +`-B, --batch, `%option batch'' + instructs `flex' to generate a "batch" scanner, the opposite of + _interactive_ scanners generated by `--interactive' (see below). + In general, you use `-B' when you are _certain_ that your scanner + will never be used interactively, and you want to squeeze a + _little_ more performance out of it. If your goal is instead to + squeeze out a _lot_ more performance, you should be using the + `-Cf' or `-CF' options, which turn on `--batch' automatically + anyway. + +`-I, --interactive, `%option interactive'' + instructs `flex' to generate an interactive scanner. An + interactive scanner is one that only looks ahead to decide what + token has been matched if it absolutely must. It turns out that + always looking one extra character ahead, even if the scanner has + already seen enough text to disambiguate the current token, is a + bit faster than only looking ahead when necessary. But scanners + that always look ahead give dreadful interactive performance; for + example, when a user types a newline, it is not recognized as a + newline token until they enter _another_ token, which often means + typing in another whole line. + + `flex' scanners default to `interactive' unless you use the `-Cf' + or `-CF' table-compression options (*note Performance::). That's + because if you're looking for high-performance you should be using + one of these options, so if you didn't, `flex' assumes you'd + rather trade off a bit of run-time performance for intuitive + interactive behavior. Note also that you _cannot_ use + `--interactive' in conjunction with `-Cf' or `-CF'. Thus, this + option is not really needed; it is on by default for all those + cases in which it is allowed. + + You can force a scanner to _not_ be interactive by using `--batch' + +`-7, --7bit, `%option 7bit'' + instructs `flex' to generate a 7-bit scanner, i.e., one which can + only recognize 7-bit characters in its input. The advantage of + using `--7bit' is that the scanner's tables can be up to half the + size of those generated using the `--8bit'. The disadvantage is + that such scanners often hang or crash if their input contains an + 8-bit character. + + Note, however, that unless you generate your scanner using the + `-Cf' or `-CF' table compression options, use of `--7bit' will + save only a small amount of table space, and make your scanner + considerably less portable. `Flex''s default behavior is to + generate an 8-bit scanner unless you use the `-Cf' or `-CF', in + which case `flex' defaults to generating 7-bit scanners unless + your site was always configured to generate 8-bit scanners (as will + often be the case with non-USA sites). You can tell whether flex + generated a 7-bit or an 8-bit scanner by inspecting the flag + summary in the `--verbose' output as described above. + + Note that if you use `-Cfe' or `-CFe' `flex' still defaults to + generating an 8-bit scanner, since usually with these compression + options full 8-bit tables are not much more expensive than 7-bit + tables. + +`-8, --8bit, `%option 8bit'' + instructs `flex' to generate an 8-bit scanner, i.e., one which can + recognize 8-bit characters. This flag is only needed for scanners + generated using `-Cf' or `-CF', as otherwise flex defaults to + generating an 8-bit scanner anyway. + + See the discussion of `--7bit' above for `flex''s default behavior + and the tradeoffs between 7-bit and 8-bit scanners. + +`--default, `%option default'' + generate the default rule. + +`--always-interactive, `%option always-interactive'' + instructs flex to generate a scanner which always considers its + input _interactive_. Normally, on each new input file the scanner + calls `isatty()' in an attempt to determine whether the scanner's + input source is interactive and thus should be read a character at + a time. When this option is used, however, then no such call is + made. + +`--never-interactive, `--never-interactive'' + instructs flex to generate a scanner which never considers its + input interactive. This is the opposite of `always-interactive'. + +`-X, --posix, `%option posix'' + turns on maximum compatibility with the POSIX 1003.2-1992 + definition of `lex'. Since `flex' was originally designed to + implement the POSIX definition of `lex' this generally involves + very few changes in behavior. At the current writing the known + differences between `flex' and the POSIX standard are: + + * In POSIX and AT&T `lex', the repeat operator, `{}', has lower + precedence than concatenation (thus `ab{3}' yields `ababab'). + Most POSIX utilities use an Extended Regular Expression (ERE) + precedence that has the precedence of the repeat operator + higher than concatenation (which causes `ab{3}' to yield + `abbb'). By default, `flex' places the precedence of the + repeat operator higher than concatenation which matches the + ERE processing of other POSIX utilities. When either + `--posix' or `-l' are specified, `flex' will use the + traditional AT&T and POSIX-compliant precedence for the + repeat operator where concatenation has higher precedence + than the repeat operator. + +`--stack, `%option stack'' + enables the use of start condition stacks (*note Start + Conditions::). + +`--stdinit, `%option stdinit'' + if set (i.e., %option stdinit) initializes `yyin' and `yyout' to + `stdin' and `stdout', instead of the default of `NULL'. Some + existing `lex' programs depend on this behavior, even though it is + not compliant with ANSI C, which does not require `stdin' and + `stdout' to be compile-time constant. In a reentrant scanner, + however, this is not a problem since initialization is performed + in `yylex_init' at runtime. + +`--yylineno, `%option yylineno'' + directs `flex' to generate a scanner that maintains the number of + the current line read from its input in the global variable + `yylineno'. This option is implied by `%option lex-compat'. In a + reentrant C scanner, the macro `yylineno' is accessible regardless + of the value of `%option yylineno', however, its value is not + modified by `flex' unless `%option yylineno' is enabled. + +`--yywrap, `%option yywrap'' + if unset (i.e., `--noyywrap)', makes the scanner not call + `yywrap()' upon an end-of-file, but simply assume that there are no + more files to scan (until the user points `yyin' at a new file and + calls `yylex()' again). + + + +File: flex.info, Node: Code-Level And API Options, Next: Options for Scanner Speed and Size, Prev: Options Affecting Scanner Behavior, Up: Scanner Options + +16.3 Code-Level And API Options +=============================== + +`--ansi-definitions, `%option ansi-definitions'' + instruct flex to generate ANSI C99 definitions for functions. + This option is enabled by default. If `%option + noansi-definitions' is specified, then the obsolete style is + generated. + +`--ansi-prototypes, `%option ansi-prototypes'' + instructs flex to generate ANSI C99 prototypes for functions. + This option is enabled by default. If `noansi-prototypes' is + specified, then prototypes will have empty parameter lists. + +`--bison-bridge, `%option bison-bridge'' + instructs flex to generate a C scanner that is meant to be called + by a `GNU bison' parser. The scanner has minor API changes for + `bison' compatibility. In particular, the declaration of `yylex' + is modified to take an additional parameter, `yylval'. *Note + Bison Bridge::. + +`--bison-locations, `%option bison-locations'' + instruct flex that `GNU bison' `%locations' are being used. This + means `yylex' will be passed an additional parameter, `yylloc'. + This option implies `%option bison-bridge'. *Note Bison Bridge::. + +`-L, --noline, `%option noline'' + instructs `flex' not to generate `#line' directives. Without this + option, `flex' peppers the generated scanner with `#line' + directives so error messages in the actions will be correctly + located with respect to either the original `flex' input file (if + the errors are due to code in the input file), or `lex.yy.c' (if + the errors are `flex''s fault - you should report these sorts of + errors to the email address given in *Note Reporting Bugs::). + +`-R, --reentrant, `%option reentrant'' + instructs flex to generate a reentrant C scanner. The generated + scanner may safely be used in a multi-threaded environment. The + API for a reentrant scanner is different than for a non-reentrant + scanner *note Reentrant::). Because of the API difference between + reentrant and non-reentrant `flex' scanners, non-reentrant flex + code must be modified before it is suitable for use with this + option. This option is not compatible with the `--c++' option. + + The option `--reentrant' does not affect the performance of the + scanner. + +`-+, --c++, `%option c++'' + specifies that you want flex to generate a C++ scanner class. + *Note Cxx::, for details. + +`--array, `%option array'' + specifies that you want yytext to be an array instead of a char* + +`--pointer, `%option pointer'' + specify that `yytext' should be a `char *', not an array. This + default is `char *'. + +`-PPREFIX, --prefix=PREFIX, `%option prefix="PREFIX"'' + changes the default `yy' prefix used by `flex' for all + globally-visible variable and function names to instead be + `PREFIX'. For example, `--prefix=foo' changes the name of + `yytext' to `footext'. It also changes the name of the default + output file from `lex.yy.c' to `lex.foo.c'. Here is a partial + list of the names affected: + + + yy_create_buffer + yy_delete_buffer + yy_flex_debug + yy_init_buffer + yy_flush_buffer + yy_load_buffer_state + yy_switch_to_buffer + yyin + yyleng + yylex + yylineno + yyout + yyrestart + yytext + yywrap + yyalloc + yyrealloc + yyfree + + (If you are using a C++ scanner, then only `yywrap' and + `yyFlexLexer' are affected.) Within your scanner itself, you can + still refer to the global variables and functions using either + version of their name; but externally, they have the modified name. + + This option lets you easily link together multiple `flex' programs + into the same executable. Note, though, that using this option + also renames `yywrap()', so you now _must_ either provide your own + (appropriately-named) version of the routine for your scanner, or + use `%option noyywrap', as linking with `-lfl' no longer provides + one for you by default. + +`--main, `%option main'' + directs flex to provide a default `main()' program for the + scanner, which simply calls `yylex()'. This option implies + `noyywrap' (see below). + +`--nounistd, `%option nounistd'' + suppresses inclusion of the non-ANSI header file `unistd.h'. This + option is meant to target environments in which `unistd.h' does + not exist. Be aware that certain options may cause flex to + generate code that relies on functions normally found in + `unistd.h', (e.g. `isatty()', `read()'.) If you wish to use these + functions, you will have to inform your compiler where to find + them. *Note option-always-interactive::. *Note option-read::. + +`--yyclass=NAME, `%option yyclass="NAME"'' + only applies when generating a C++ scanner (the `--c++' option). + It informs `flex' that you have derived `NAME' as a subclass of + `yyFlexLexer', so `flex' will place your actions in the member + function `foo::yylex()' instead of `yyFlexLexer::yylex()'. It + also generates a `yyFlexLexer::yylex()' member function that emits + a run-time error (by invoking `yyFlexLexer::LexerError())' if + called. *Note Cxx::. + + + +File: flex.info, Node: Options for Scanner Speed and Size, Next: Debugging Options, Prev: Code-Level And API Options, Up: Scanner Options + +16.4 Options for Scanner Speed and Size +======================================= + +`-C[aefFmr]' + controls the degree of table compression and, more generally, + trade-offs between small scanners and fast scanners. + + `-C' + A lone `-C' specifies that the scanner tables should be + compressed but neither equivalence classes nor + meta-equivalence classes should be used. + + `-Ca, --align, `%option align'' + ("align") instructs flex to trade off larger tables in the + generated scanner for faster performance because the elements + of the tables are better aligned for memory access and + computation. On some RISC architectures, fetching and + manipulating longwords is more efficient than with + smaller-sized units such as shortwords. This option can + quadruple the size of the tables used by your scanner. + + `-Ce, --ecs, `%option ecs'' + directs `flex' to construct "equivalence classes", i.e., sets + of characters which have identical lexical properties (for + example, if the only appearance of digits in the `flex' input + is in the character class "[0-9]" then the digits '0', '1', + ..., '9' will all be put in the same equivalence class). + Equivalence classes usually give dramatic reductions in the + final table/object file sizes (typically a factor of 2-5) and + are pretty cheap performance-wise (one array look-up per + character scanned). + + `-Cf' + specifies that the "full" scanner tables should be generated - + `flex' should not compress the tables by taking advantages of + similar transition functions for different states. + + `-CF' + specifies that the alternate fast scanner representation + (described above under the `--fast' flag) should be used. + This option cannot be used with `--c++'. + + `-Cm, --meta-ecs, `%option meta-ecs'' + directs `flex' to construct "meta-equivalence classes", which + are sets of equivalence classes (or characters, if equivalence + classes are not being used) that are commonly used together. + Meta-equivalence classes are often a big win when using + compressed tables, but they have a moderate performance + impact (one or two `if' tests and one array look-up per + character scanned). + + `-Cr, --read, `%option read'' + causes the generated scanner to _bypass_ use of the standard + I/O library (`stdio') for input. Instead of calling + `fread()' or `getc()', the scanner will use the `read()' + system call, resulting in a performance gain which varies + from system to system, but in general is probably negligible + unless you are also using `-Cf' or `-CF'. Using `-Cr' can + cause strange behavior if, for example, you read from `yyin' + using `stdio' prior to calling the scanner (because the + scanner will miss whatever text your previous reads left in + the `stdio' input buffer). `-Cr' has no effect if you define + `YY_INPUT()' (*note Generated Scanner::). + + The options `-Cf' or `-CF' and `-Cm' do not make sense together - + there is no opportunity for meta-equivalence classes if the table + is not being compressed. Otherwise the options may be freely + mixed, and are cumulative. + + The default setting is `-Cem', which specifies that `flex' should + generate equivalence classes and meta-equivalence classes. This + setting provides the highest degree of table compression. You can + trade off faster-executing scanners at the cost of larger tables + with the following generally being true: + + + slowest & smallest + -Cem + -Cm + -Ce + -C + -C{f,F}e + -C{f,F} + -C{f,F}a + fastest & largest + + Note that scanners with the smallest tables are usually generated + and compiled the quickest, so during development you will usually + want to use the default, maximal compression. + + `-Cfe' is often a good compromise between speed and size for + production scanners. + +`-f, --full, `%option full'' + specifies "fast scanner". No table compression is done and + `stdio' is bypassed. The result is large but fast. This option + is equivalent to `--Cfr' + +`-F, --fast, `%option fast'' + specifies that the _fast_ scanner table representation should be + used (and `stdio' bypassed). This representation is about as fast + as the full table representation `--full', and for some sets of + patterns will be considerably smaller (and for others, larger). In + general, if the pattern set contains both _keywords_ and a + catch-all, _identifier_ rule, such as in the set: + + + "case" return TOK_CASE; + "switch" return TOK_SWITCH; + ... + "default" return TOK_DEFAULT; + [a-z]+ return TOK_ID; + + then you're better off using the full table representation. If + only the _identifier_ rule is present and you then use a hash + table or some such to detect the keywords, you're better off using + `--fast'. + + This option is equivalent to `-CFr'. It cannot be used with + `--c++'. + + + +File: flex.info, Node: Debugging Options, Next: Miscellaneous Options, Prev: Options for Scanner Speed and Size, Up: Scanner Options + +16.5 Debugging Options +====================== + +`-b, --backup, `%option backup'' + Generate backing-up information to `lex.backup'. This is a list of + scanner states which require backing up and the input characters on + which they do so. By adding rules one can remove backing-up + states. If _all_ backing-up states are eliminated and `-Cf' or + `-CF' is used, the generated scanner will run faster (see the + `--perf-report' flag). Only users who wish to squeeze every last + cycle out of their scanners need worry about this option. (*note + Performance::). + +`-d, --debug, `%option debug'' + makes the generated scanner run in "debug" mode. Whenever a + pattern is recognized and the global variable `yy_flex_debug' is + non-zero (which is the default), the scanner will write to + `stderr' a line of the form: + + + -accepting rule at line 53 ("the matched text") + + The line number refers to the location of the rule in the file + defining the scanner (i.e., the file that was fed to flex). + Messages are also generated when the scanner backs up, accepts the + default rule, reaches the end of its input buffer (or encounters a + NUL; at this point, the two look the same as far as the scanner's + concerned), or reaches an end-of-file. + +`-p, --perf-report, `%option perf-report'' + generates a performance report to `stderr'. The report consists of + comments regarding features of the `flex' input file which will + cause a serious loss of performance in the resulting scanner. If + you give the flag twice, you will also get comments regarding + features that lead to minor performance losses. + + Note that the use of `REJECT', and variable trailing context + (*note Limitations::) entails a substantial performance penalty; + use of `yymore()', the `^' operator, and the `--interactive' flag + entail minor performance penalties. + +`-s, --nodefault, `%option nodefault'' + causes the _default rule_ (that unmatched scanner input is echoed + to `stdout)' to be suppressed. If the scanner encounters input + that does not match any of its rules, it aborts with an error. + This option is useful for finding holes in a scanner's rule set. + +`-T, --trace, `%option trace'' + makes `flex' run in "trace" mode. It will generate a lot of + messages to `stderr' concerning the form of the input and the + resultant non-deterministic and deterministic finite automata. + This option is mostly for use in maintaining `flex'. + +`-w, --nowarn, `%option nowarn'' + suppresses warning messages. + +`-v, --verbose, `%option verbose'' + specifies that `flex' should write to `stderr' a summary of + statistics regarding the scanner it generates. Most of the + statistics are meaningless to the casual `flex' user, but the + first line identifies the version of `flex' (same as reported by + `--version'), and the next line the flags used when generating the + scanner, including those that are on by default. + +`--warn, `%option warn'' + warn about certain things. In particular, if the default rule can + be matched but no default rule has been given, the flex will warn + you. We recommend using this option always. + + + +File: flex.info, Node: Miscellaneous Options, Prev: Debugging Options, Up: Scanner Options + +16.6 Miscellaneous Options +========================== + +`-c' + A do-nothing option included for POSIX compliance. + +`-h, -?, --help' + generates a "help" summary of `flex''s options to `stdout' and + then exits. + +`-n' + Another do-nothing option included for POSIX compliance. + +`-V, --version' + prints the version number to `stdout' and exits. + + + +File: flex.info, Node: Performance, Next: Cxx, Prev: Scanner Options, Up: Top + +17 Performance Considerations +***************************** + +The main design goal of `flex' is that it generate high-performance +scanners. It has been optimized for dealing well with large sets of +rules. Aside from the effects on scanner speed of the table compression +`-C' options outlined above, there are a number of options/actions +which degrade performance. These are, from most expensive to least: + + + REJECT + arbitrary trailing context + + pattern sets that require backing up + %option yylineno + %array + + %option interactive + %option always-interactive + + @samp{^} beginning-of-line operator + yymore() + + with the first two all being quite expensive and the last two being +quite cheap. Note also that `unput()' is implemented as a routine call +that potentially does quite a bit of work, while `yyless()' is a +quite-cheap macro. So if you are just putting back some excess text you +scanned, use `yyless()'. + + `REJECT' should be avoided at all costs when performance is +important. It is a particularly expensive option. + + There is one case when `%option yylineno' can be expensive. That is +when your patterns match long tokens that could _possibly_ contain a +newline character. There is no performance penalty for rules that can +not possibly match newlines, since flex does not need to check them for +newlines. In general, you should avoid rules such as `[^f]+', which +match very long tokens, including newlines, and may possibly match your +entire file! A better approach is to separate `[^f]+' into two rules: + + + %option yylineno + %% + [^f\n]+ + \n+ + + The above scanner does not incur a performance penalty. + + Getting rid of backing up is messy and often may be an enormous +amount of work for a complicated scanner. In principal, one begins by +using the `-b' flag to generate a `lex.backup' file. For example, on +the input: + + + %% + foo return TOK_KEYWORD; + foobar return TOK_KEYWORD; + + the file looks like: + + + State #6 is non-accepting - + associated rule line numbers: + 2 3 + out-transitions: [ o ] + jam-transitions: EOF [ \001-n p-\177 ] + + State #8 is non-accepting - + associated rule line numbers: + 3 + out-transitions: [ a ] + jam-transitions: EOF [ \001-` b-\177 ] + + State #9 is non-accepting - + associated rule line numbers: + 3 + out-transitions: [ r ] + jam-transitions: EOF [ \001-q s-\177 ] + + Compressed tables always back up. + + The first few lines tell us that there's a scanner state in which it +can make a transition on an 'o' but not on any other character, and +that in that state the currently scanned text does not match any rule. +The state occurs when trying to match the rules found at lines 2 and 3 +in the input file. If the scanner is in that state and then reads +something other than an 'o', it will have to back up to find a rule +which is matched. With a bit of headscratching one can see that this +must be the state it's in when it has seen `fo'. When this has +happened, if anything other than another `o' is seen, the scanner will +have to back up to simply match the `f' (by the default rule). + + The comment regarding State #8 indicates there's a problem when +`foob' has been scanned. Indeed, on any character other than an `a', +the scanner will have to back up to accept "foo". Similarly, the +comment for State #9 concerns when `fooba' has been scanned and an `r' +does not follow. + + The final comment reminds us that there's no point going to all the +trouble of removing backing up from the rules unless we're using `-Cf' +or `-CF', since there's no performance gain doing so with compressed +scanners. + + The way to remove the backing up is to add "error" rules: + + + %% + foo return TOK_KEYWORD; + foobar return TOK_KEYWORD; + + fooba | + foob | + fo { + /* false alarm, not really a keyword */ + return TOK_ID; + } + + Eliminating backing up among a list of keywords can also be done +using a "catch-all" rule: + + + %% + foo return TOK_KEYWORD; + foobar return TOK_KEYWORD; + + [a-z]+ return TOK_ID; + + This is usually the best solution when appropriate. + + Backing up messages tend to cascade. With a complicated set of rules +it's not uncommon to get hundreds of messages. If one can decipher +them, though, it often only takes a dozen or so rules to eliminate the +backing up (though it's easy to make a mistake and have an error rule +accidentally match a valid token. A possible future `flex' feature +will be to automatically add rules to eliminate backing up). + + It's important to keep in mind that you gain the benefits of +eliminating backing up only if you eliminate _every_ instance of +backing up. Leaving just one means you gain nothing. + + _Variable_ trailing context (where both the leading and trailing +parts do not have a fixed length) entails almost the same performance +loss as `REJECT' (i.e., substantial). So when possible a rule like: + + + %% + mouse|rat/(cat|dog) run(); + + is better written: + + + %% + mouse/cat|dog run(); + rat/cat|dog run(); + + or as + + + %% + mouse|rat/cat run(); + mouse|rat/dog run(); + + Note that here the special '|' action does _not_ provide any +savings, and can even make things worse (*note Limitations::). + + Another area where the user can increase a scanner's performance (and +one that's easier to implement) arises from the fact that the longer the +tokens matched, the faster the scanner will run. This is because with +long tokens the processing of most input characters takes place in the +(short) inner scanning loop, and does not often have to go through the +additional work of setting up the scanning environment (e.g., `yytext') +for the action. Recall the scanner for C comments: + + + %x comment + %% + int line_num = 1; + + "/*" BEGIN(comment); + + <comment>[^*\n]* + <comment>"*"+[^*/\n]* + <comment>\n ++line_num; + <comment>"*"+"/" BEGIN(INITIAL); + + This could be sped up by writing it as: + + + %x comment + %% + int line_num = 1; + + "/*" BEGIN(comment); + + <comment>[^*\n]* + <comment>[^*\n]*\n ++line_num; + <comment>"*"+[^*/\n]* + <comment>"*"+[^*/\n]*\n ++line_num; + <comment>"*"+"/" BEGIN(INITIAL); + + Now instead of each newline requiring the processing of another +action, recognizing the newlines is distributed over the other rules to +keep the matched text as long as possible. Note that _adding_ rules +does _not_ slow down the scanner! The speed of the scanner is +independent of the number of rules or (modulo the considerations given +at the beginning of this section) how complicated the rules are with +regard to operators such as `*' and `|'. + + A final example in speeding up a scanner: suppose you want to scan +through a file containing identifiers and keywords, one per line and +with no other extraneous characters, and recognize all the keywords. A +natural first approach is: + + + %% + asm | + auto | + break | + ... etc ... + volatile | + while /* it's a keyword */ + + .|\n /* it's not a keyword */ + + To eliminate the back-tracking, introduce a catch-all rule: + + + %% + asm | + auto | + break | + ... etc ... + volatile | + while /* it's a keyword */ + + [a-z]+ | + .|\n /* it's not a keyword */ + + Now, if it's guaranteed that there's exactly one word per line, then +we can reduce the total number of matches by a half by merging in the +recognition of newlines with that of the other tokens: + + + %% + asm\n | + auto\n | + break\n | + ... etc ... + volatile\n | + while\n /* it's a keyword */ + + [a-z]+\n | + .|\n /* it's not a keyword */ + + One has to be careful here, as we have now reintroduced backing up +into the scanner. In particular, while _we_ know that there will never +be any characters in the input stream other than letters or newlines, +`flex' can't figure this out, and it will plan for possibly needing to +back up when it has scanned a token like `auto' and then the next +character is something other than a newline or a letter. Previously it +would then just match the `auto' rule and be done, but now it has no +`auto' rule, only a `auto\n' rule. To eliminate the possibility of +backing up, we could either duplicate all rules but without final +newlines, or, since we never expect to encounter such an input and +therefore don't how it's classified, we can introduce one more +catch-all rule, this one which doesn't include a newline: + + + %% + asm\n | + auto\n | + break\n | + ... etc ... + volatile\n | + while\n /* it's a keyword */ + + [a-z]+\n | + [a-z]+ | + .|\n /* it's not a keyword */ + + Compiled with `-Cf', this is about as fast as one can get a `flex' +scanner to go for this particular problem. + + A final note: `flex' is slow when matching `NUL's, particularly when +a token contains multiple `NUL's. It's best to write rules which match +_short_ amounts of text if it's anticipated that the text will often +include `NUL's. + + Another final note regarding performance: as mentioned in *Note +Matching::, dynamically resizing `yytext' to accommodate huge tokens is +a slow process because it presently requires that the (huge) token be +rescanned from the beginning. Thus if performance is vital, you should +attempt to match "large" quantities of text but not "huge" quantities, +where the cutoff between the two is at about 8K characters per token. + + +File: flex.info, Node: Cxx, Next: Reentrant, Prev: Performance, Up: Top + +18 Generating C++ Scanners +************************** + +*IMPORTANT*: the present form of the scanning class is _experimental_ +and may change considerably between major releases. + + `flex' provides two different ways to generate scanners for use with +C++. The first way is to simply compile a scanner generated by `flex' +using a C++ compiler instead of a C compiler. You should not encounter +any compilation errors (*note Reporting Bugs::). You can then use C++ +code in your rule actions instead of C code. Note that the default +input source for your scanner remains `yyin', and default echoing is +still done to `yyout'. Both of these remain `FILE *' variables and not +C++ _streams_. + + You can also use `flex' to generate a C++ scanner class, using the +`-+' option (or, equivalently, `%option c++)', which is automatically +specified if the name of the `flex' executable ends in a '+', such as +`flex++'. When using this option, `flex' defaults to generating the +scanner to the file `lex.yy.cc' instead of `lex.yy.c'. The generated +scanner includes the header file `FlexLexer.h', which defines the +interface to two C++ classes. + + The first class, `FlexLexer', provides an abstract base class +defining the general scanner class interface. It provides the +following member functions: + +`const char* YYText()' + returns the text of the most recently matched token, the + equivalent of `yytext'. + +`int YYLeng()' + returns the length of the most recently matched token, the + equivalent of `yyleng'. + +`int lineno() const' + returns the current input line number (see `%option yylineno)', or + `1' if `%option yylineno' was not used. + +`void set_debug( int flag )' + sets the debugging flag for the scanner, equivalent to assigning to + `yy_flex_debug' (*note Scanner Options::). Note that you must + build the scanner using `%option debug' to include debugging + information in it. + +`int debug() const' + returns the current setting of the debugging flag. + + Also provided are member functions equivalent to +`yy_switch_to_buffer()', `yy_create_buffer()' (though the first +argument is an `istream*' object pointer and not a `FILE*)', +`yy_flush_buffer()', `yy_delete_buffer()', and `yyrestart()' (again, +the first argument is a `istream*' object pointer). + + The second class defined in `FlexLexer.h' is `yyFlexLexer', which is +derived from `FlexLexer'. It defines the following additional member +functions: + +`yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 )' + constructs a `yyFlexLexer' object using the given streams for input + and output. If not specified, the streams default to `cin' and + `cout', respectively. + +`virtual int yylex()' + performs the same role is `yylex()' does for ordinary `flex' + scanners: it scans the input stream, consuming tokens, until a + rule's action returns a value. If you derive a subclass `S' from + `yyFlexLexer' and want to access the member functions and variables + of `S' inside `yylex()', then you need to use `%option + yyclass="S"' to inform `flex' that you will be using that subclass + instead of `yyFlexLexer'. In this case, rather than generating + `yyFlexLexer::yylex()', `flex' generates `S::yylex()' (and also + generates a dummy `yyFlexLexer::yylex()' that calls + `yyFlexLexer::LexerError()' if called). + +`virtual void switch_streams(istream* new_in = 0, ostream* new_out = 0)' + reassigns `yyin' to `new_in' (if non-null) and `yyout' to + `new_out' (if non-null), deleting the previous input buffer if + `yyin' is reassigned. + +`int yylex( istream* new_in, ostream* new_out = 0 )' + first switches the input streams via `switch_streams( new_in, + new_out )' and then returns the value of `yylex()'. + + In addition, `yyFlexLexer' defines the following protected virtual +functions which you can redefine in derived classes to tailor the +scanner: + +`virtual int LexerInput( char* buf, int max_size )' + reads up to `max_size' characters into `buf' and returns the + number of characters read. To indicate end-of-input, return 0 + characters. Note that `interactive' scanners (see the `-B' and + `-I' flags in *Note Scanner Options::) define the macro + `YY_INTERACTIVE'. If you redefine `LexerInput()' and need to take + different actions depending on whether or not the scanner might be + scanning an interactive input source, you can test for the + presence of this name via `#ifdef' statements. + +`virtual void LexerOutput( const char* buf, int size )' + writes out `size' characters from the buffer `buf', which, while + `NUL'-terminated, may also contain internal `NUL's if the + scanner's rules can match text with `NUL's in them. + +`virtual void LexerError( const char* msg )' + reports a fatal error message. The default version of this + function writes the message to the stream `cerr' and exits. + + Note that a `yyFlexLexer' object contains its _entire_ scanning +state. Thus you can use such objects to create reentrant scanners, but +see also *Note Reentrant::. You can instantiate multiple instances of +the same `yyFlexLexer' class, and you can also combine multiple C++ +scanner classes together in the same program using the `-P' option +discussed above. + + Finally, note that the `%array' feature is not available to C++ +scanner classes; you must use `%pointer' (the default). + + Here is an example of a simple C++ scanner: + + + // An example of using the flex C++ scanner class. + + %{ + int mylineno = 0; + %} + + string \"[^\n"]+\" + + ws [ \t]+ + + alpha [A-Za-z] + dig [0-9] + name ({alpha}|{dig}|\$)({alpha}|{dig}|[_.\-/$])* + num1 [-+]?{dig}+\.?([eE][-+]?{dig}+)? + num2 [-+]?{dig}*\.{dig}+([eE][-+]?{dig}+)? + number {num1}|{num2} + + %% + + {ws} /* skip blanks and tabs */ + + "/*" { + int c; + + while((c = yyinput()) != 0) + { + if(c == '\n') + ++mylineno; + + else if(c == @samp{*}) + { + if((c = yyinput()) == '/') + break; + else + unput(c); + } + } + } + + {number} cout "number " YYText() '\n'; + + \n mylineno++; + + {name} cout "name " YYText() '\n'; + + {string} cout "string " YYText() '\n'; + + %% + + int main( int /* argc */, char** /* argv */ ) + { + @code{flex}Lexer* lexer = new yyFlexLexer; + while(lexer->yylex() != 0) + ; + return 0; + } + + If you want to create multiple (different) lexer classes, you use the +`-P' flag (or the `prefix=' option) to rename each `yyFlexLexer' to +some other `xxFlexLexer'. You then can include `<FlexLexer.h>' in your +other sources once per lexer class, first renaming `yyFlexLexer' as +follows: + + + #undef yyFlexLexer + #define yyFlexLexer xxFlexLexer + #include <FlexLexer.h> + + #undef yyFlexLexer + #define yyFlexLexer zzFlexLexer + #include <FlexLexer.h> + + if, for example, you used `%option prefix="xx"' for one of your +scanners and `%option prefix="zz"' for the other. + + +File: flex.info, Node: Reentrant, Next: Lex and Posix, Prev: Cxx, Up: Top + +19 Reentrant C Scanners +*********************** + +`flex' has the ability to generate a reentrant C scanner. This is +accomplished by specifying `%option reentrant' (`-R') The generated +scanner is both portable, and safe to use in one or more separate +threads of control. The most common use for reentrant scanners is from +within multi-threaded applications. Any thread may create and execute +a reentrant `flex' scanner without the need for synchronization with +other threads. + +* Menu: + +* Reentrant Uses:: +* Reentrant Overview:: +* Reentrant Example:: +* Reentrant Detail:: +* Reentrant Functions:: + + +File: flex.info, Node: Reentrant Uses, Next: Reentrant Overview, Prev: Reentrant, Up: Reentrant + +19.1 Uses for Reentrant Scanners +================================ + +However, there are other uses for a reentrant scanner. For example, you +could scan two or more files simultaneously to implement a `diff' at +the token level (i.e., instead of at the character level): + + + /* Example of maintaining more than one active scanner. */ + + do { + int tok1, tok2; + + tok1 = yylex( scanner_1 ); + tok2 = yylex( scanner_2 ); + + if( tok1 != tok2 ) + printf("Files are different."); + + } while ( tok1 && tok2 ); + + Another use for a reentrant scanner is recursion. (Note that a +recursive scanner can also be created using a non-reentrant scanner and +buffer states. *Note Multiple Input Buffers::.) + + The following crude scanner supports the `eval' command by invoking +another instance of itself. + + + /* Example of recursive invocation. */ + + %option reentrant + + %% + "eval(".+")" { + yyscan_t scanner; + YY_BUFFER_STATE buf; + + yylex_init( &scanner ); + yytext[yyleng-1] = ' '; + + buf = yy_scan_string( yytext + 5, scanner ); + yylex( scanner ); + + yy_delete_buffer(buf,scanner); + yylex_destroy( scanner ); + } + ... + %% + + +File: flex.info, Node: Reentrant Overview, Next: Reentrant Example, Prev: Reentrant Uses, Up: Reentrant + +19.2 An Overview of the Reentrant API +===================================== + +The API for reentrant scanners is different than for non-reentrant +scanners. Here is a quick overview of the API: + + `%option reentrant' must be specified. + + * All functions take one additional argument: `yyscanner' + + * All global variables are replaced by their macro equivalents. (We + tell you this because it may be important to you during debugging.) + + * `yylex_init' and `yylex_destroy' must be called before and after + `yylex', respectively. + + * Accessor methods (get/set functions) provide access to common + `flex' variables. + + * User-specific data can be stored in `yyextra'. + + +File: flex.info, Node: Reentrant Example, Next: Reentrant Detail, Prev: Reentrant Overview, Up: Reentrant + +19.3 Reentrant Example +====================== + +First, an example of a reentrant scanner: + + /* This scanner prints "//" comments. */ + + %option reentrant stack noyywrap + %x COMMENT + + %% + + "//" yy_push_state( COMMENT, yyscanner); + .|\n + + <COMMENT>\n yy_pop_state( yyscanner ); + <COMMENT>[^\n]+ fprintf( yyout, "%s\n", yytext); + + %% + + int main ( int argc, char * argv[] ) + { + yyscan_t scanner; + + yylex_init ( &scanner ); + yylex ( scanner ); + yylex_destroy ( scanner ); + return 0; + } + + +File: flex.info, Node: Reentrant Detail, Next: Reentrant Functions, Prev: Reentrant Example, Up: Reentrant + +19.4 The Reentrant API in Detail +================================ + +Here are the things you need to do or know to use the reentrant C API of +`flex'. + +* Menu: + +* Specify Reentrant:: +* Extra Reentrant Argument:: +* Global Replacement:: +* Init and Destroy Functions:: +* Accessor Methods:: +* Extra Data:: +* About yyscan_t:: + + +File: flex.info, Node: Specify Reentrant, Next: Extra Reentrant Argument, Prev: Reentrant Detail, Up: Reentrant Detail + +19.4.1 Declaring a Scanner As Reentrant +--------------------------------------- + +%option reentrant (-reentrant) must be specified. + + Notice that `%option reentrant' is specified in the above example +(*note Reentrant Example::. Had this option not been specified, `flex' +would have happily generated a non-reentrant scanner without +complaining. You may explicitly specify `%option noreentrant', if you +do _not_ want a reentrant scanner, although it is not necessary. The +default is to generate a non-reentrant scanner. + + +File: flex.info, Node: Extra Reentrant Argument, Next: Global Replacement, Prev: Specify Reentrant, Up: Reentrant Detail + +19.4.2 The Extra Argument +------------------------- + +All functions take one additional argument: `yyscanner'. + + Notice that the calls to `yy_push_state' and `yy_pop_state' both +have an argument, `yyscanner' , that is not present in a non-reentrant +scanner. Here are the declarations of `yy_push_state' and +`yy_pop_state' in the reentrant scanner: + + + static void yy_push_state ( int new_state , yyscan_t yyscanner ) ; + static void yy_pop_state ( yyscan_t yyscanner ) ; + + Notice that the argument `yyscanner' appears in the declaration of +both functions. In fact, all `flex' functions in a reentrant scanner +have this additional argument. It is always the last argument in the +argument list, it is always of type `yyscan_t' (which is typedef'd to +`void *') and it is always named `yyscanner'. As you may have guessed, +`yyscanner' is a pointer to an opaque data structure encapsulating the +current state of the scanner. For a list of function declarations, see +*Note Reentrant Functions::. Note that preprocessor macros, such as +`BEGIN', `ECHO', and `REJECT', do not take this additional argument. + + +File: flex.info, Node: Global Replacement, Next: Init and Destroy Functions, Prev: Extra Reentrant Argument, Up: Reentrant Detail + +19.4.3 Global Variables Replaced By Macros +------------------------------------------ + +All global variables in traditional flex have been replaced by macro +equivalents. + + Note that in the above example, `yyout' and `yytext' are not plain +variables. These are macros that will expand to their equivalent lvalue. +All of the familiar `flex' globals have been replaced by their macro +equivalents. In particular, `yytext', `yyleng', `yylineno', `yyin', +`yyout', `yyextra', `yylval', and `yylloc' are macros. You may safely +use these macros in actions as if they were plain variables. We only +tell you this so you don't expect to link to these variables +externally. Currently, each macro expands to a member of an internal +struct, e.g., + + + #define yytext (((struct yyguts_t*)yyscanner)->yytext_r) + + One important thing to remember about `yytext' and friends is that +`yytext' is not a global variable in a reentrant scanner, you can not +access it directly from outside an action or from other functions. You +must use an accessor method, e.g., `yyget_text', to accomplish this. +(See below). + + +File: flex.info, Node: Init and Destroy Functions, Next: Accessor Methods, Prev: Global Replacement, Up: Reentrant Detail + +19.4.4 Init and Destroy Functions +--------------------------------- + +`yylex_init' and `yylex_destroy' must be called before and after +`yylex', respectively. + + + int yylex_init ( yyscan_t * ptr_yy_globals ) ; + int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t * ptr_yy_globals ) ; + int yylex ( yyscan_t yyscanner ) ; + int yylex_destroy ( yyscan_t yyscanner ) ; + + The function `yylex_init' must be called before calling any other +function. The argument to `yylex_init' is the address of an +uninitialized pointer to be filled in by `yylex_init', overwriting any +previous contents. The function `yylex_init_extra' may be used instead, +taking as its first argument a variable of type `YY_EXTRA_TYPE'. See +the section on yyextra, below, for more details. + + The value stored in `ptr_yy_globals' should thereafter be passed to +`yylex' and `yylex_destroy'. Flex does not save the argument passed to +`yylex_init', so it is safe to pass the address of a local pointer to +`yylex_init' so long as it remains in scope for the duration of all +calls to the scanner, up to and including the call to `yylex_destroy'. + + The function `yylex' should be familiar to you by now. The reentrant +version takes one argument, which is the value returned (via an +argument) by `yylex_init'. Otherwise, it behaves the same as the +non-reentrant version of `yylex'. + + Both `yylex_init' and `yylex_init_extra' returns 0 (zero) on success, +or non-zero on failure, in which case errno is set to one of the +following values: + + * ENOMEM Memory allocation error. *Note memory-management::. + + * EINVAL Invalid argument. + + The function `yylex_destroy' should be called to free resources used +by the scanner. After `yylex_destroy' is called, the contents of +`yyscanner' should not be used. Of course, there is no need to destroy +a scanner if you plan to reuse it. A `flex' scanner (both reentrant +and non-reentrant) may be restarted by calling `yyrestart'. + + Below is an example of a program that creates a scanner, uses it, +then destroys it when done: + + + int main () + { + yyscan_t scanner; + int tok; + + yylex_init(&scanner); + + while ((tok=yylex()) > 0) + printf("tok=%d yytext=%s\n", tok, yyget_text(scanner)); + + yylex_destroy(scanner); + return 0; + } + + +File: flex.info, Node: Accessor Methods, Next: Extra Data, Prev: Init and Destroy Functions, Up: Reentrant Detail + +19.4.5 Accessing Variables with Reentrant Scanners +-------------------------------------------------- + +Accessor methods (get/set functions) provide access to common `flex' +variables. + + Many scanners that you build will be part of a larger project. +Portions of your project will need access to `flex' values, such as +`yytext'. In a non-reentrant scanner, these values are global, so +there is no problem accessing them. However, in a reentrant scanner, +there are no global `flex' values. You can not access them directly. +Instead, you must access `flex' values using accessor methods (get/set +functions). Each accessor method is named `yyget_NAME' or `yyset_NAME', +where `NAME' is the name of the `flex' variable you want. For example: + + + /* Set the last character of yytext to NULL. */ + void chop ( yyscan_t scanner ) + { + int len = yyget_leng( scanner ); + yyget_text( scanner )[len - 1] = '\0'; + } + + The above code may be called from within an action like this: + + + %% + .+\n { chop( yyscanner );} + + You may find that `%option header-file' is particularly useful for +generating prototypes of all the accessor functions. *Note +option-header::. + + +File: flex.info, Node: Extra Data, Next: About yyscan_t, Prev: Accessor Methods, Up: Reentrant Detail + +19.4.6 Extra Data +----------------- + +User-specific data can be stored in `yyextra'. + + In a reentrant scanner, it is unwise to use global variables to +communicate with or maintain state between different pieces of your +program. However, you may need access to external data or invoke +external functions from within the scanner actions. Likewise, you may +need to pass information to your scanner (e.g., open file descriptors, +or database connections). In a non-reentrant scanner, the only way to +do this would be through the use of global variables. `Flex' allows +you to store arbitrary, "extra" data in a scanner. This data is +accessible through the accessor methods `yyget_extra' and `yyset_extra' +from outside the scanner, and through the shortcut macro `yyextra' from +within the scanner itself. They are defined as follows: + + + #define YY_EXTRA_TYPE void* + YY_EXTRA_TYPE yyget_extra ( yyscan_t scanner ); + void yyset_extra ( YY_EXTRA_TYPE arbitrary_data , yyscan_t scanner); + + In addition, an extra form of `yylex_init' is provided, +`yylex_init_extra'. This function is provided so that the yyextra value +can be accessed from within the very first yyalloc, used to allocate +the scanner itself. + + By default, `YY_EXTRA_TYPE' is defined as type `void *'. You may +redefine this type using `%option extra-type="your_type"' in the +scanner: + + + /* An example of overriding YY_EXTRA_TYPE. */ + %{ + #include <sys/stat.h> + #include <unistd.h> + %} + %option reentrant + %option extra-type="struct stat *" + %% + + __filesize__ printf( "%ld", yyextra->st_size ); + __lastmod__ printf( "%ld", yyextra->st_mtime ); + %% + void scan_file( char* filename ) + { + yyscan_t scanner; + struct stat buf; + FILE *in; + + in = fopen( filename, "r" ); + stat( filename, &buf ); + + yylex_init_extra( buf, &scanner ); + yyset_in( in, scanner ); + yylex( scanner ); + yylex_destroy( scanner ); + + fclose( in ); + } + + +File: flex.info, Node: About yyscan_t, Prev: Extra Data, Up: Reentrant Detail + +19.4.7 About yyscan_t +--------------------- + +`yyscan_t' is defined as: + + + typedef void* yyscan_t; + + It is initialized by `yylex_init()' to point to an internal +structure. You should never access this value directly. In particular, +you should never attempt to free it (use `yylex_destroy()' instead.) + + +File: flex.info, Node: Reentrant Functions, Prev: Reentrant Detail, Up: Reentrant + +19.5 Functions and Macros Available in Reentrant C Scanners +=========================================================== + +The following Functions are available in a reentrant scanner: + + + char *yyget_text ( yyscan_t scanner ); + int yyget_leng ( yyscan_t scanner ); + FILE *yyget_in ( yyscan_t scanner ); + FILE *yyget_out ( yyscan_t scanner ); + int yyget_lineno ( yyscan_t scanner ); + YY_EXTRA_TYPE yyget_extra ( yyscan_t scanner ); + int yyget_debug ( yyscan_t scanner ); + + void yyset_debug ( int flag, yyscan_t scanner ); + void yyset_in ( FILE * in_str , yyscan_t scanner ); + void yyset_out ( FILE * out_str , yyscan_t scanner ); + void yyset_lineno ( int line_number , yyscan_t scanner ); + void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t scanner ); + + There are no "set" functions for yytext and yyleng. This is +intentional. + + The following Macro shortcuts are available in actions in a reentrant +scanner: + + + yytext + yyleng + yyin + yyout + yylineno + yyextra + yy_flex_debug + + In a reentrant C scanner, support for yylineno is always present +(i.e., you may access yylineno), but the value is never modified by +`flex' unless `%option yylineno' is enabled. This is to allow the user +to maintain the line count independently of `flex'. + + The following functions and macros are made available when `%option +bison-bridge' (`--bison-bridge') is specified: + + + YYSTYPE * yyget_lval ( yyscan_t scanner ); + void yyset_lval ( YYSTYPE * yylvalp , yyscan_t scanner ); + yylval + + The following functions and macros are made available when `%option +bison-locations' (`--bison-locations') is specified: + + + YYLTYPE *yyget_lloc ( yyscan_t scanner ); + void yyset_lloc ( YYLTYPE * yyllocp , yyscan_t scanner ); + yylloc + + Support for yylval assumes that `YYSTYPE' is a valid type. Support +for yylloc assumes that `YYSLYPE' is a valid type. Typically, these +types are generated by `bison', and are included in section 1 of the +`flex' input. + + +File: flex.info, Node: Lex and Posix, Next: Memory Management, Prev: Reentrant, Up: Top + +20 Incompatibilities with Lex and Posix +*************************************** + +`flex' is a rewrite of the AT&T Unix _lex_ tool (the two +implementations do not share any code, though), with some extensions and +incompatibilities, both of which are of concern to those who wish to +write scanners acceptable to both implementations. `flex' is fully +compliant with the POSIX `lex' specification, except that when using +`%pointer' (the default), a call to `unput()' destroys the contents of +`yytext', which is counter to the POSIX specification. In this section +we discuss all of the known areas of incompatibility between `flex', +AT&T `lex', and the POSIX specification. `flex''s `-l' option turns on +maximum compatibility with the original AT&T `lex' implementation, at +the cost of a major loss in the generated scanner's performance. We +note below which incompatibilities can be overcome using the `-l' +option. `flex' is fully compatible with `lex' with the following +exceptions: + + * The undocumented `lex' scanner internal variable `yylineno' is not + supported unless `-l' or `%option yylineno' is used. + + * `yylineno' should be maintained on a per-buffer basis, rather than + a per-scanner (single global variable) basis. + + * `yylineno' is not part of the POSIX specification. + + * The `input()' routine is not redefinable, though it may be called + to read characters following whatever has been matched by a rule. + If `input()' encounters an end-of-file the normal `yywrap()' + processing is done. A "real" end-of-file is returned by `input()' + as `EOF'. + + * Input is instead controlled by defining the `YY_INPUT()' macro. + + * The `flex' restriction that `input()' cannot be redefined is in + accordance with the POSIX specification, which simply does not + specify any way of controlling the scanner's input other than by + making an initial assignment to `yyin'. + + * The `unput()' routine is not redefinable. This restriction is in + accordance with POSIX. + + * `flex' scanners are not as reentrant as `lex' scanners. In + particular, if you have an interactive scanner and an interrupt + handler which long-jumps out of the scanner, and the scanner is + subsequently called again, you may get the following message: + + + fatal @code{flex} scanner internal error--end of buffer missed + + To reenter the scanner, first use: + + + yyrestart( yyin ); + + Note that this call will throw away any buffered input; usually + this isn't a problem with an interactive scanner. *Note + Reentrant::, for `flex''s reentrant API. + + * Also note that `flex' C++ scanner classes _are_ reentrant, so if + using C++ is an option for you, you should use them instead. + *Note Cxx::, and *Note Reentrant:: for details. + + * `output()' is not supported. Output from the ECHO macro is done + to the file-pointer `yyout' (default `stdout)'. + + * `output()' is not part of the POSIX specification. + + * `lex' does not support exclusive start conditions (%x), though they + are in the POSIX specification. + + * When definitions are expanded, `flex' encloses them in parentheses. + With `lex', the following: + + + NAME [A-Z][A-Z0-9]* + %% + foo{NAME}? printf( "Found it\n" ); + %% + + will not match the string `foo' because when the macro is expanded + the rule is equivalent to `foo[A-Z][A-Z0-9]*?' and the precedence + is such that the `?' is associated with `[A-Z0-9]*'. With `flex', + the rule will be expanded to `foo([A-Z][A-Z0-9]*)?' and so the + string `foo' will match. + + * Note that if the definition begins with `^' or ends with `$' then + it is _not_ expanded with parentheses, to allow these operators to + appear in definitions without losing their special meanings. But + the `<s>', `/', and `<<EOF>>' operators cannot be used in a `flex' + definition. + + * Using `-l' results in the `lex' behavior of no parentheses around + the definition. + + * The POSIX specification is that the definition be enclosed in + parentheses. + + * Some implementations of `lex' allow a rule's action to begin on a + separate line, if the rule's pattern has trailing whitespace: + + + %% + foo|bar<space here> + { foobar_action();} + + `flex' does not support this feature. + + * The `lex' `%r' (generate a Ratfor scanner) option is not + supported. It is not part of the POSIX specification. + + * After a call to `unput()', _yytext_ is undefined until the next + token is matched, unless the scanner was built using `%array'. + This is not the case with `lex' or the POSIX specification. The + `-l' option does away with this incompatibility. + + * The precedence of the `{,}' (numeric range) operator is different. + The AT&T and POSIX specifications of `lex' interpret `abc{1,3}' + as match one, two, or three occurrences of `abc'", whereas `flex' + interprets it as "match `ab' followed by one, two, or three + occurrences of `c'". The `-l' and `--posix' options do away with + this incompatibility. + + * The precedence of the `^' operator is different. `lex' interprets + `^foo|bar' as "match either 'foo' at the beginning of a line, or + 'bar' anywhere", whereas `flex' interprets it as "match either + `foo' or `bar' if they come at the beginning of a line". The + latter is in agreement with the POSIX specification. + + * The special table-size declarations such as `%a' supported by + `lex' are not required by `flex' scanners.. `flex' ignores them. + + * The name `FLEX_SCANNER' is `#define''d so scanners may be written + for use with either `flex' or `lex'. Scanners also include + `YY_FLEX_MAJOR_VERSION', `YY_FLEX_MINOR_VERSION' and + `YY_FLEX_SUBMINOR_VERSION' indicating which version of `flex' + generated the scanner. For example, for the 2.5.22 release, these + defines would be 2, 5 and 22 respectively. If the version of + `flex' being used is a beta version, then the symbol `FLEX_BETA' + is defined. + + * The symbols `[[' and `]]' in the code sections of the input may + conflict with the m4 delimiters. *Note M4 Dependency::. + + + The following `flex' features are not included in `lex' or the POSIX +specification: + + * C++ scanners + + * %option + + * start condition scopes + + * start condition stacks + + * interactive/non-interactive scanners + + * yy_scan_string() and friends + + * yyterminate() + + * yy_set_interactive() + + * yy_set_bol() + + * YY_AT_BOL() <<EOF>> + + * <*> + + * YY_DECL + + * YY_START + + * YY_USER_ACTION + + * YY_USER_INIT + + * #line directives + + * %{}'s around actions + + * reentrant C API + + * multiple actions on a line + + * almost all of the `flex' command-line options + + The feature "multiple actions on a line" refers to the fact that +with `flex' you can put multiple actions on the same line, separated +with semi-colons, while with `lex', the following: + + + foo handle_foo(); ++num_foos_seen; + + is (rather surprisingly) truncated to + + + foo handle_foo(); + + `flex' does not truncate the action. Actions that are not enclosed +in braces are simply terminated at the end of the line. + + +File: flex.info, Node: Memory Management, Next: Serialized Tables, Prev: Lex and Posix, Up: Top + +21 Memory Management +******************** + +This chapter describes how flex handles dynamic memory, and how you can +override the default behavior. + +* Menu: + +* The Default Memory Management:: +* Overriding The Default Memory Management:: +* A Note About yytext And Memory:: + + +File: flex.info, Node: The Default Memory Management, Next: Overriding The Default Memory Management, Prev: Memory Management, Up: Memory Management + +21.1 The Default Memory Management +================================== + +Flex allocates dynamic memory during initialization, and once in a +while from within a call to yylex(). Initialization takes place during +the first call to yylex(). Thereafter, flex may reallocate more memory +if it needs to enlarge a buffer. As of version 2.5.9 Flex will clean up +all memory when you call `yylex_destroy' *Note faq-memory-leak::. + + Flex allocates dynamic memory for four purposes, listed below (1) + +16kB for the input buffer. + Flex allocates memory for the character buffer used to perform + pattern matching. Flex must read ahead from the input stream and + store it in a large character buffer. This buffer is typically + the largest chunk of dynamic memory flex consumes. This buffer + will grow if necessary, doubling the size each time. Flex frees + this memory when you call yylex_destroy(). The default size of + this buffer (16384 bytes) is almost always too large. The ideal + size for this buffer is the length of the longest token expected, + in bytes, plus a little more. Flex will allocate a few extra + bytes for housekeeping. Currently, to override the size of the + input buffer you must `#define YY_BUF_SIZE' to whatever number of + bytes you want. We don't plan to change this in the near future, + but we reserve the right to do so if we ever add a more robust + memory management API. + +64kb for the REJECT state. This will only be allocated if you use REJECT. + The size is the large enough to hold the same number of states as + characters in the input buffer. If you override the size of the + input buffer (via `YY_BUF_SIZE'), then you automatically override + the size of this buffer as well. + +100 bytes for the start condition stack. + Flex allocates memory for the start condition stack. This is the + stack used for pushing start states, i.e., with yy_push_state(). + It will grow if necessary. Since the states are simply integers, + this stack doesn't consume much memory. This stack is not present + if `%option stack' is not specified. You will rarely need to tune + this buffer. The ideal size for this stack is the maximum depth + expected. The memory for this stack is automatically destroyed + when you call yylex_destroy(). *Note option-stack::. + +40 bytes for each YY_BUFFER_STATE. + Flex allocates memory for each YY_BUFFER_STATE. The buffer state + itself is about 40 bytes, plus an additional large character + buffer (described above.) The initial buffer state is created + during initialization, and with each call to yy_create_buffer(). + You can't tune the size of this, but you can tune the character + buffer as described above. Any buffer state that you explicitly + create by calling yy_create_buffer() is _NOT_ destroyed + automatically. You must call yy_delete_buffer() to free the + memory. The exception to this rule is that flex will delete the + current buffer automatically when you call yylex_destroy(). If you + delete the current buffer, be sure to set it to NULL. That way, + flex will not try to delete the buffer a second time (possibly + crashing your program!) At the time of this writing, flex does not + provide a growable stack for the buffer states. You have to + manage that yourself. *Note Multiple Input Buffers::. + +84 bytes for the reentrant scanner guts + Flex allocates about 84 bytes for the reentrant scanner structure + when you call yylex_init(). It is destroyed when the user calls + yylex_destroy(). + + + ---------- Footnotes ---------- + + (1) The quantities given here are approximate, and may vary due to +host architecture, compiler configuration, or due to future +enhancements to flex. + + +File: flex.info, Node: Overriding The Default Memory Management, Next: A Note About yytext And Memory, Prev: The Default Memory Management, Up: Memory Management + +21.2 Overriding The Default Memory Management +============================================= + +Flex calls the functions `yyalloc', `yyrealloc', and `yyfree' when it +needs to allocate or free memory. By default, these functions are +wrappers around the standard C functions, `malloc', `realloc', and +`free', respectively. You can override the default implementations by +telling flex that you will provide your own implementations. + + To override the default implementations, you must do two things: + + 1. Suppress the default implementations by specifying one or more of + the following options: + + * `%option noyyalloc' + + * `%option noyyrealloc' + + * `%option noyyfree'. + + 2. Provide your own implementation of the following functions: (1) + + + // For a non-reentrant scanner + void * yyalloc (size_t bytes); + void * yyrealloc (void * ptr, size_t bytes); + void yyfree (void * ptr); + + // For a reentrant scanner + void * yyalloc (size_t bytes, void * yyscanner); + void * yyrealloc (void * ptr, size_t bytes, void * yyscanner); + void yyfree (void * ptr, void * yyscanner); + + + In the following example, we will override all three memory +routines. We assume that there is a custom allocator with garbage +collection. In order to make this example interesting, we will use a +reentrant scanner, passing a pointer to the custom allocator through +`yyextra'. + + + %{ + #include "some_allocator.h" + %} + + /* Suppress the default implementations. */ + %option noyyalloc noyyrealloc noyyfree + %option reentrant + + /* Initialize the allocator. */ + #define YY_EXTRA_TYPE struct allocator* + #define YY_USER_INIT yyextra = allocator_create(); + + %% + .|\n ; + %% + + /* Provide our own implementations. */ + void * yyalloc (size_t bytes, void* yyscanner) { + return allocator_alloc (yyextra, bytes); + } + + void * yyrealloc (void * ptr, size_t bytes, void* yyscanner) { + return allocator_realloc (yyextra, bytes); + } + + void yyfree (void * ptr, void * yyscanner) { + /* Do nothing -- we leave it to the garbage collector. */ + } + + ---------- Footnotes ---------- + + (1) It is not necessary to override all (or any) of the memory +management routines. You may, for example, override `yyrealloc', but +not `yyfree' or `yyalloc'. + + +File: flex.info, Node: A Note About yytext And Memory, Prev: Overriding The Default Memory Management, Up: Memory Management + +21.3 A Note About yytext And Memory +=================================== + +When flex finds a match, `yytext' points to the first character of the +match in the input buffer. The string itself is part of the input +buffer, and is _NOT_ allocated separately. The value of yytext will be +overwritten the next time yylex() is called. In short, the value of +yytext is only valid from within the matched rule's action. + + Often, you want the value of yytext to persist for later processing, +i.e., by a parser with non-zero lookahead. In order to preserve yytext, +you will have to copy it with strdup() or a similar function. But this +introduces some headache because your parser is now responsible for +freeing the copy of yytext. If you use a yacc or bison parser, +(commonly used with flex), you will discover that the error recovery +mechanisms can cause memory to be leaked. + + To prevent memory leaks from strdup'd yytext, you will have to track +the memory somehow. Our experience has shown that a garbage collection +mechanism or a pooled memory mechanism will save you a lot of grief +when writing parsers. + + +File: flex.info, Node: Serialized Tables, Next: Diagnostics, Prev: Memory Management, Up: Top + +22 Serialized Tables +******************** + +A `flex' scanner has the ability to save the DFA tables to a file, and +load them at runtime when needed. The motivation for this feature is +to reduce the runtime memory footprint. Traditionally, these tables +have been compiled into the scanner as C arrays, and are sometimes +quite large. Since the tables are compiled into the scanner, the +memory used by the tables can never be freed. This is a waste of +memory, especially if an application uses several scanners, but none of +them at the same time. + + The serialization feature allows the tables to be loaded at runtime, +before scanning begins. The tables may be discarded when scanning is +finished. + +* Menu: + +* Creating Serialized Tables:: +* Loading and Unloading Serialized Tables:: +* Tables File Format:: + + +File: flex.info, Node: Creating Serialized Tables, Next: Loading and Unloading Serialized Tables, Prev: Serialized Tables, Up: Serialized Tables + +22.1 Creating Serialized Tables +=============================== + +You may create a scanner with serialized tables by specifying: + + + %option tables-file=FILE + or + --tables-file=FILE + + These options instruct flex to save the DFA tables to the file FILE. +The tables will _not_ be embedded in the generated scanner. The scanner +will not function on its own. The scanner will be dependent upon the +serialized tables. You must load the tables from this file at runtime +before you can scan anything. + + If you do not specify a filename to `--tables-file', the tables will +be saved to `lex.yy.tables', where `yy' is the appropriate prefix. + + If your project uses several different scanners, you can concatenate +the serialized tables into one file, and flex will find the correct set +of tables, using the scanner prefix as part of the lookup key. An +example follows: + + + $ flex --tables-file --prefix=cpp cpp.l + $ flex --tables-file --prefix=c c.l + $ cat lex.cpp.tables lex.c.tables > all.tables + + The above example created two scanners, `cpp', and `c'. Since we did +not specify a filename, the tables were serialized to `lex.c.tables' and +`lex.cpp.tables', respectively. Then, we concatenated the two files +together into `all.tables', which we will distribute with our project. +At runtime, we will open the file and tell flex to load the tables from +it. Flex will find the correct tables automatically. (See next +section). + + +File: flex.info, Node: Loading and Unloading Serialized Tables, Next: Tables File Format, Prev: Creating Serialized Tables, Up: Serialized Tables + +22.2 Loading and Unloading Serialized Tables +============================================ + +If you've built your scanner with `%option tables-file', then you must +load the scanner tables at runtime. This can be accomplished with the +following function: + + -- Function: int yytables_fload (FILE* FP [, yyscan_t SCANNER]) + Locates scanner tables in the stream pointed to by FP and loads + them. Memory for the tables is allocated via `yyalloc'. You must + call this function before the first call to `yylex'. The argument + SCANNER only appears in the reentrant scanner. This function + returns `0' (zero) on success, or non-zero on error. + + The loaded tables are *not* automatically destroyed (unloaded) when +you call `yylex_destroy'. The reason is that you may create several +scanners of the same type (in a reentrant scanner), each of which needs +access to these tables. To avoid a nasty memory leak, you must call +the following function: + + -- Function: int yytables_destroy ([yyscan_t SCANNER]) + Unloads the scanner tables. The tables must be loaded again before + you can scan any more data. The argument SCANNER only appears in + the reentrant scanner. This function returns `0' (zero) on + success, or non-zero on error. + + *The functions `yytables_fload' and `yytables_destroy' are not +thread-safe.* You must ensure that these functions are called exactly +once (for each scanner type) in a threaded program, before any thread +calls `yylex'. After the tables are loaded, they are never written to, +and no thread protection is required thereafter - until you destroy +them. + + +File: flex.info, Node: Tables File Format, Prev: Loading and Unloading Serialized Tables, Up: Serialized Tables + +22.3 Tables File Format +======================= + +This section defines the file format of serialized `flex' tables. + + The tables format allows for one or more sets of tables to be +specified, where each set corresponds to a given scanner. Scanners are +indexed by name, as described below. The file format is as follows: + + + TABLE SET 1 + +-------------------------------+ + Header | uint32 th_magic; | + | uint32 th_hsize; | + | uint32 th_ssize; | + | uint16 th_flags; | + | char th_version[]; | + | char th_name[]; | + | uint8 th_pad64[]; | + +-------------------------------+ + Table 1 | uint16 td_id; | + | uint16 td_flags; | + | uint32 td_lolen; | + | uint32 td_hilen; | + | void td_data[]; | + | uint8 td_pad64[]; | + +-------------------------------+ + Table 2 | | + . . . + . . . + . . . + . . . + Table n | | + +-------------------------------+ + TABLE SET 2 + . + . + . + TABLE SET N + + The above diagram shows that a complete set of tables consists of a +header followed by multiple individual tables. Furthermore, multiple +complete sets may be present in the same file, each set with its own +header and tables. The sets are contiguous in the file. The only way to +know if another set follows is to check the next four bytes for the +magic number (or check for EOF). The header and tables sections are +padded to 64-bit boundaries. Below we describe each field in detail. +This format does not specify how the scanner will expand the given +data, i.e., data may be serialized as int8, but expanded to an int32 +array at runtime. This is to reduce the size of the serialized data +where possible. Remember, _all integer values are in network byte +order_. + +Fields of a table header: + +`th_magic' + Magic number, always 0xF13C57B1. + +`th_hsize' + Size of this entire header, in bytes, including all fields plus + any padding. + +`th_ssize' + Size of this entire set, in bytes, including the header, all + tables, plus any padding. + +`th_flags' + Bit flags for this table set. Currently unused. + +`th_version[]' + Flex version in NULL-terminated string format. e.g., `2.5.13a'. + This is the version of flex that was used to create the serialized + tables. + +`th_name[]' + Contains the name of this table set. The default is `yytables', + and is prefixed accordingly, e.g., `footables'. Must be + NULL-terminated. + +`th_pad64[]' + Zero or more NULL bytes, padding the entire header to the next + 64-bit boundary as calculated from the beginning of the header. + +Fields of a table: + +`td_id' + Specifies the table identifier. Possible values are: + `YYTD_ID_ACCEPT (0x01)' + `yy_accept' + + `YYTD_ID_BASE (0x02)' + `yy_base' + + `YYTD_ID_CHK (0x03)' + `yy_chk' + + `YYTD_ID_DEF (0x04)' + `yy_def' + + `YYTD_ID_EC (0x05)' + `yy_ec ' + + `YYTD_ID_META (0x06)' + `yy_meta' + + `YYTD_ID_NUL_TRANS (0x07)' + `yy_NUL_trans' + + `YYTD_ID_NXT (0x08)' + `yy_nxt'. This array may be two dimensional. See the + `td_hilen' field below. + + `YYTD_ID_RULE_CAN_MATCH_EOL (0x09)' + `yy_rule_can_match_eol' + + `YYTD_ID_START_STATE_LIST (0x0A)' + `yy_start_state_list'. This array is handled specially + because it is an array of pointers to structs. See the + `td_flags' field below. + + `YYTD_ID_TRANSITION (0x0B)' + `yy_transition'. This array is handled specially because it + is an array of structs. See the `td_lolen' field below. + + `YYTD_ID_ACCLIST (0x0C)' + `yy_acclist' + +`td_flags' + Bit flags describing how to interpret the data in `td_data'. The + data arrays are one-dimensional by default, but may be two + dimensional as specified in the `td_hilen' field. + + `YYTD_DATA8 (0x01)' + The data is serialized as an array of type int8. + + `YYTD_DATA16 (0x02)' + The data is serialized as an array of type int16. + + `YYTD_DATA32 (0x04)' + The data is serialized as an array of type int32. + + `YYTD_PTRANS (0x08)' + The data is a list of indexes of entries in the expanded + `yy_transition' array. Each index should be expanded to a + pointer to the corresponding entry in the `yy_transition' + array. We count on the fact that the `yy_transition' array + has already been seen. + + `YYTD_STRUCT (0x10)' + The data is a list of yy_trans_info structs, each of which + consists of two integers. There is no padding between struct + elements or between structs. The type of each member is + determined by the `YYTD_DATA*' bits. + +`td_lolen' + Specifies the number of elements in the lowest dimension array. If + this is a one-dimensional array, then it is simply the number of + elements in this array. The element size is determined by the + `td_flags' field. + +`td_hilen' + If `td_hilen' is non-zero, then the data is a two-dimensional + array. Otherwise, the data is a one-dimensional array. `td_hilen' + contains the number of elements in the higher dimensional array, + and `td_lolen' contains the number of elements in the lowest + dimension. + + Conceptually, `td_data' is either `sometype td_data[td_lolen]', or + `sometype td_data[td_hilen][td_lolen]', where `sometype' is + specified by the `td_flags' field. It is possible for both + `td_lolen' and `td_hilen' to be zero, in which case `td_data' is a + zero length array, and no data is loaded, i.e., this table is + simply skipped. Flex does not currently generate tables of zero + length. + +`td_data[]' + The table data. This array may be a one- or two-dimensional array, + of type `int8', `int16', `int32', `struct yy_trans_info', or + `struct yy_trans_info*', depending upon the values in the + `td_flags', `td_lolen', and `td_hilen' fields. + +`td_pad64[]' + Zero or more NULL bytes, padding the entire table to the next + 64-bit boundary as calculated from the beginning of this table. + + +File: flex.info, Node: Diagnostics, Next: Limitations, Prev: Serialized Tables, Up: Top + +23 Diagnostics +************** + +The following is a list of `flex' diagnostic messages: + + * `warning, rule cannot be matched' indicates that the given rule + cannot be matched because it follows other rules that will always + match the same text as it. For example, in the following `foo' + cannot be matched because it comes after an identifier "catch-all" + rule: + + + [a-z]+ got_identifier(); + foo got_foo(); + + Using `REJECT' in a scanner suppresses this warning. + + * `warning, -s option given but default rule can be matched' means + that it is possible (perhaps only in a particular start condition) + that the default rule (match any single character) is the only one + that will match a particular input. Since `-s' was given, + presumably this is not intended. + + * `reject_used_but_not_detected undefined' or + `yymore_used_but_not_detected undefined'. These errors can occur + at compile time. They indicate that the scanner uses `REJECT' or + `yymore()' but that `flex' failed to notice the fact, meaning that + `flex' scanned the first two sections looking for occurrences of + these actions and failed to find any, but somehow you snuck some in + (via a #include file, for example). Use `%option reject' or + `%option yymore' to indicate to `flex' that you really do use + these features. + + * `flex scanner jammed'. a scanner compiled with `-s' has + encountered an input string which wasn't matched by any of its + rules. This error can also occur due to internal problems. + + * `token too large, exceeds YYLMAX'. your scanner uses `%array' and + one of its rules matched a string longer than the `YYLMAX' + constant (8K bytes by default). You can increase the value by + #define'ing `YYLMAX' in the definitions section of your `flex' + input. + + * `scanner requires -8 flag to use the character 'x''. Your scanner + specification includes recognizing the 8-bit character `'x'' and + you did not specify the -8 flag, and your scanner defaulted to + 7-bit because you used the `-Cf' or `-CF' table compression + options. See the discussion of the `-7' flag, *Note Scanner + Options::, for details. + + * `flex scanner push-back overflow'. you used `unput()' to push back + so much text that the scanner's buffer could not hold both the + pushed-back text and the current token in `yytext'. Ideally the + scanner should dynamically resize the buffer in this case, but at + present it does not. + + * `input buffer overflow, can't enlarge buffer because scanner uses + REJECT'. the scanner was working on matching an extremely large + token and needed to expand the input buffer. This doesn't work + with scanners that use `REJECT'. + + * `fatal flex scanner internal error--end of buffer missed'. This can + occur in a scanner which is reentered after a long-jump has jumped + out (or over) the scanner's activation frame. Before reentering + the scanner, use: + + yyrestart( yyin ); + or, as noted above, switch to using the C++ scanner class. + + * `too many start conditions in <> construct!' you listed more start + conditions in a <> construct than exist (so you must have listed at + least one of them twice). + + +File: flex.info, Node: Limitations, Next: Bibliography, Prev: Diagnostics, Up: Top + +24 Limitations +************** + +Some trailing context patterns cannot be properly matched and generate +warning messages (`dangerous trailing context'). These are patterns +where the ending of the first part of the rule matches the beginning of +the second part, such as `zx*/xy*', where the 'x*' matches the 'x' at +the beginning of the trailing context. (Note that the POSIX draft +states that the text matched by such patterns is undefined.) For some +trailing context rules, parts which are actually fixed-length are not +recognized as such, leading to the abovementioned performance loss. In +particular, parts using `|' or `{n}' (such as `foo{3}') are always +considered variable-length. Combining trailing context with the +special `|' action can result in _fixed_ trailing context being turned +into the more expensive _variable_ trailing context. For example, in +the following: + + + %% + abc | + xyz/def + + Use of `unput()' invalidates yytext and yyleng, unless the `%array' +directive or the `-l' option has been used. Pattern-matching of `NUL's +is substantially slower than matching other characters. Dynamic +resizing of the input buffer is slow, as it entails rescanning all the +text matched so far by the current (generally huge) token. Due to both +buffering of input and read-ahead, you cannot intermix calls to +`<stdio.h>' routines, such as, getchar(), with `flex' rules and expect +it to work. Call `input()' instead. The total table entries listed by +the `-v' flag excludes the number of table entries needed to determine +what rule has been matched. The number of entries is equal to the +number of DFA states if the scanner does not use `REJECT', and somewhat +greater than the number of states if it does. `REJECT' cannot be used +with the `-f' or `-F' options. + + The `flex' internal algorithms need documentation. + + +File: flex.info, Node: Bibliography, Next: FAQ, Prev: Limitations, Up: Top + +25 Additional Reading +********************* + +You may wish to read more about the following programs: + * lex + + * yacc + + * sed + + * awk + + The following books may contain material of interest: + + John Levine, Tony Mason, and Doug Brown, _Lex & Yacc_, O'Reilly and +Associates. Be sure to get the 2nd edition. + + M. E. Lesk and E. Schmidt, _LEX - Lexical Analyzer Generator_ + + Alfred Aho, Ravi Sethi and Jeffrey Ullman, _Compilers: Principles, +Techniques and Tools_, Addison-Wesley (1986). Describes the +pattern-matching techniques used by `flex' (deterministic finite +automata). + + +File: flex.info, Node: FAQ, Next: Appendices, Prev: Bibliography, Up: Top + +FAQ +*** + +From time to time, the `flex' maintainer receives certain questions. +Rather than repeat answers to well-understood problems, we publish them +here. + +* Menu: + +* When was flex born?:: +* How do I expand backslash-escape sequences in C-style quoted strings?:: +* Why do flex scanners call fileno if it is not ANSI compatible?:: +* Does flex support recursive pattern definitions?:: +* How do I skip huge chunks of input (tens of megabytes) while using flex?:: +* Flex is not matching my patterns in the same order that I defined them.:: +* My actions are executing out of order or sometimes not at all.:: +* How can I have multiple input sources feed into the same scanner at the same time?:: +* Can I build nested parsers that work with the same input file?:: +* How can I match text only at the end of a file?:: +* How can I make REJECT cascade across start condition boundaries?:: +* Why cant I use fast or full tables with interactive mode?:: +* How much faster is -F or -f than -C?:: +* If I have a simple grammar cant I just parse it with flex?:: +* Why doesn't yyrestart() set the start state back to INITIAL?:: +* How can I match C-style comments?:: +* The period isn't working the way I expected.:: +* Can I get the flex manual in another format?:: +* Does there exist a "faster" NDFA->DFA algorithm?:: +* How does flex compile the DFA so quickly?:: +* How can I use more than 8192 rules?:: +* How do I abandon a file in the middle of a scan and switch to a new file?:: +* How do I execute code only during initialization (only before the first scan)?:: +* How do I execute code at termination?:: +* Where else can I find help?:: +* Can I include comments in the "rules" section of the file?:: +* I get an error about undefined yywrap().:: +* How can I change the matching pattern at run time?:: +* How can I expand macros in the input?:: +* How can I build a two-pass scanner?:: +* How do I match any string not matched in the preceding rules?:: +* I am trying to port code from AT&T lex that uses yysptr and yysbuf.:: +* Is there a way to make flex treat NULL like a regular character?:: +* Whenever flex can not match the input it says "flex scanner jammed".:: +* Why doesn't flex have non-greedy operators like perl does?:: +* Memory leak - 16386 bytes allocated by malloc.:: +* How do I track the byte offset for lseek()?:: +* How do I use my own I/O classes in a C++ scanner?:: +* How do I skip as many chars as possible?:: +* deleteme00:: +* Are certain equivalent patterns faster than others?:: +* Is backing up a big deal?:: +* Can I fake multi-byte character support?:: +* deleteme01:: +* Can you discuss some flex internals?:: +* unput() messes up yy_at_bol:: +* The | operator is not doing what I want:: +* Why can't flex understand this variable trailing context pattern?:: +* The ^ operator isn't working:: +* Trailing context is getting confused with trailing optional patterns:: +* Is flex GNU or not?:: +* ERASEME53:: +* I need to scan if-then-else blocks and while loops:: +* ERASEME55:: +* ERASEME56:: +* ERASEME57:: +* Is there a repository for flex scanners?:: +* How can I conditionally compile or preprocess my flex input file?:: +* Where can I find grammars for lex and yacc?:: +* I get an end-of-buffer message for each character scanned.:: +* unnamed-faq-62:: +* unnamed-faq-63:: +* unnamed-faq-64:: +* unnamed-faq-65:: +* unnamed-faq-66:: +* unnamed-faq-67:: +* unnamed-faq-68:: +* unnamed-faq-69:: +* unnamed-faq-70:: +* unnamed-faq-71:: +* unnamed-faq-72:: +* unnamed-faq-73:: +* unnamed-faq-74:: +* unnamed-faq-75:: +* unnamed-faq-76:: +* unnamed-faq-77:: +* unnamed-faq-78:: +* unnamed-faq-79:: +* unnamed-faq-80:: +* unnamed-faq-81:: +* unnamed-faq-82:: +* unnamed-faq-83:: +* unnamed-faq-84:: +* unnamed-faq-85:: +* unnamed-faq-86:: +* unnamed-faq-87:: +* unnamed-faq-88:: +* unnamed-faq-90:: +* unnamed-faq-91:: +* unnamed-faq-92:: +* unnamed-faq-93:: +* unnamed-faq-94:: +* unnamed-faq-95:: +* unnamed-faq-96:: +* unnamed-faq-97:: +* unnamed-faq-98:: +* unnamed-faq-99:: +* unnamed-faq-100:: +* unnamed-faq-101:: +* What is the difference between YYLEX_PARAM and YY_DECL?:: +* Why do I get "conflicting types for yylex" error?:: +* How do I access the values set in a Flex action from within a Bison action?:: + + +File: flex.info, Node: When was flex born?, Next: How do I expand backslash-escape sequences in C-style quoted strings?, Up: FAQ + +When was flex born? +=================== + +Vern Paxson took over the `Software Tools' lex project from Jef +Poskanzer in 1982. At that point it was written in Ratfor. Around +1987 or so, Paxson translated it into C, and a legend was born :-). + + +File: flex.info, Node: How do I expand backslash-escape sequences in C-style quoted strings?, Next: Why do flex scanners call fileno if it is not ANSI compatible?, Prev: When was flex born?, Up: FAQ + +How do I expand backslash-escape sequences in C-style quoted strings? +===================================================================== + +A key point when scanning quoted strings is that you cannot (easily) +write a single rule that will precisely match the string if you allow +things like embedded escape sequences and newlines. If you try to +match strings with a single rule then you'll wind up having to rescan +the string anyway to find any escape sequences. + + Instead you can use exclusive start conditions and a set of rules, +one for matching non-escaped text, one for matching a single escape, +one for matching an embedded newline, and one for recognizing the end +of the string. Each of these rules is then faced with the question of +where to put its intermediary results. The best solution is for the +rules to append their local value of `yytext' to the end of a "string +literal" buffer. A rule like the escape-matcher will append to the +buffer the meaning of the escape sequence rather than the literal text +in `yytext'. In this way, `yytext' does not need to be modified at all. + + +File: flex.info, Node: Why do flex scanners call fileno if it is not ANSI compatible?, Next: Does flex support recursive pattern definitions?, Prev: How do I expand backslash-escape sequences in C-style quoted strings?, Up: FAQ + +Why do flex scanners call fileno if it is not ANSI compatible? +============================================================== + +Flex scanners call `fileno()' in order to get the file descriptor +corresponding to `yyin'. The file descriptor may be passed to +`isatty()' or `read()', depending upon which `%options' you specified. +If your system does not have `fileno()' support, to get rid of the +`read()' call, do not specify `%option read'. To get rid of the +`isatty()' call, you must specify one of `%option always-interactive' or +`%option never-interactive'. + + +File: flex.info, Node: Does flex support recursive pattern definitions?, Next: How do I skip huge chunks of input (tens of megabytes) while using flex?, Prev: Why do flex scanners call fileno if it is not ANSI compatible?, Up: FAQ + +Does flex support recursive pattern definitions? +================================================ + +e.g., + + + %% + block "{"({block}|{statement})*"}" + + No. You cannot have recursive definitions. The pattern-matching +power of regular expressions in general (and therefore flex scanners, +too) is limited. In particular, regular expressions cannot "balance" +parentheses to an arbitrary degree. For example, it's impossible to +write a regular expression that matches all strings containing the same +number of '{'s as '}'s. For more powerful pattern matching, you need a +parser, such as `GNU bison'. + + +File: flex.info, Node: How do I skip huge chunks of input (tens of megabytes) while using flex?, Next: Flex is not matching my patterns in the same order that I defined them., Prev: Does flex support recursive pattern definitions?, Up: FAQ + +How do I skip huge chunks of input (tens of megabytes) while using flex? +======================================================================== + +Use `fseek()' (or `lseek()') to position yyin, then call `yyrestart()'. + + +File: flex.info, Node: Flex is not matching my patterns in the same order that I defined them., Next: My actions are executing out of order or sometimes not at all., Prev: How do I skip huge chunks of input (tens of megabytes) while using flex?, Up: FAQ + +Flex is not matching my patterns in the same order that I defined them. +======================================================================= + +`flex' picks the rule that matches the most text (i.e., the longest +possible input string). This is because `flex' uses an entirely +different matching technique ("deterministic finite automata") that +actually does all of the matching simultaneously, in parallel. (Seems +impossible, but it's actually a fairly simple technique once you +understand the principles.) + + A side-effect of this parallel matching is that when the input +matches more than one rule, `flex' scanners pick the rule that matched +the _most_ text. This is explained further in the manual, in the +section *Note Matching::. + + If you want `flex' to choose a shorter match, then you can work +around this behavior by expanding your short rule to match more text, +then put back the extra: + + + data_.* yyless( 5 ); BEGIN BLOCKIDSTATE; + + Another fix would be to make the second rule active only during the +`<BLOCKIDSTATE>' start condition, and make that start condition +exclusive by declaring it with `%x' instead of `%s'. + + A final fix is to change the input language so that the ambiguity for +`data_' is removed, by adding characters to it that don't match the +identifier rule, or by removing characters (such as `_') from the +identifier rule so it no longer matches `data_'. (Of course, you might +also not have the option of changing the input language.) + + +File: flex.info, Node: My actions are executing out of order or sometimes not at all., Next: How can I have multiple input sources feed into the same scanner at the same time?, Prev: Flex is not matching my patterns in the same order that I defined them., Up: FAQ + +My actions are executing out of order or sometimes not at all. +============================================================== + +Most likely, you have (in error) placed the opening `{' of the action +block on a different line than the rule, e.g., + + + ^(foo|bar) + { <<<--- WRONG! + + } + + `flex' requires that the opening `{' of an action associated with a +rule begin on the same line as does the rule. You need instead to +write your rules as follows: + + + ^(foo|bar) { // CORRECT! + + } + + +File: flex.info, Node: How can I have multiple input sources feed into the same scanner at the same time?, Next: Can I build nested parsers that work with the same input file?, Prev: My actions are executing out of order or sometimes not at all., Up: FAQ + +How can I have multiple input sources feed into the same scanner at the same time? +================================================================================== + +If ... + * your scanner is free of backtracking (verified using `flex''s `-b' + flag), + + * AND you run your scanner interactively (`-I' option; default + unless using special table compression options), + + * AND you feed it one character at a time by redefining `YY_INPUT' + to do so, + + then every time it matches a token, it will have exhausted its input +buffer (because the scanner is free of backtracking). This means you +can safely use `select()' at the point and only call `yylex()' for +another token if `select()' indicates there's data available. + + That is, move the `select()' out from the input function to a point +where it determines whether `yylex()' gets called for the next token. + + With this approach, you will still have problems if your input can +arrive piecemeal; `select()' could inform you that the beginning of a +token is available, you call `yylex()' to get it, but it winds up +blocking waiting for the later characters in the token. + + Here's another way: Move your input multiplexing inside of +`YY_INPUT'. That is, whenever `YY_INPUT' is called, it `select()''s to +see where input is available. If input is available for the scanner, +it reads and returns the next byte. If input is available from another +source, it calls whatever function is responsible for reading from that +source. (If no input is available, it blocks until some input is +available.) I've used this technique in an interpreter I wrote that +both reads keyboard input using a `flex' scanner and IPC traffic from +sockets, and it works fine. + + +File: flex.info, Node: Can I build nested parsers that work with the same input file?, Next: How can I match text only at the end of a file?, Prev: How can I have multiple input sources feed into the same scanner at the same time?, Up: FAQ + +Can I build nested parsers that work with the same input file? +============================================================== + +This is not going to work without some additional effort. The reason is +that `flex' block-buffers the input it reads from `yyin'. This means +that the "outermost" `yylex()', when called, will automatically slurp +up the first 8K of input available on yyin, and subsequent calls to +other `yylex()''s won't see that input. You might be tempted to work +around this problem by redefining `YY_INPUT' to only return a small +amount of text, but it turns out that that approach is quite difficult. +Instead, the best solution is to combine all of your scanners into one +large scanner, using a different exclusive start condition for each. + + +File: flex.info, Node: How can I match text only at the end of a file?, Next: How can I make REJECT cascade across start condition boundaries?, Prev: Can I build nested parsers that work with the same input file?, Up: FAQ + +How can I match text only at the end of a file? +=============================================== + +There is no way to write a rule which is "match this text, but only if +it comes at the end of the file". You can fake it, though, if you +happen to have a character lying around that you don't allow in your +input. Then you redefine `YY_INPUT' to call your own routine which, if +it sees an `EOF', returns the magic character first (and remembers to +return a real `EOF' next time it's called). Then you could write: + + + <COMMENT>(.|\n)*{EOF_CHAR} /* saw comment at EOF */ + + +File: flex.info, Node: How can I make REJECT cascade across start condition boundaries?, Next: Why cant I use fast or full tables with interactive mode?, Prev: How can I match text only at the end of a file?, Up: FAQ + +How can I make REJECT cascade across start condition boundaries? +================================================================ + +You can do this as follows. Suppose you have a start condition `A', and +after exhausting all of the possible matches in `<A>', you want to try +matches in `<INITIAL>'. Then you could use the following: + + + %x A + %% + <A>rule_that_is_long ...; REJECT; + <A>rule ...; REJECT; /* shorter rule */ + <A>etc. + ... + <A>.|\n { + /* Shortest and last rule in <A>, so + * cascaded REJECTs will eventually + * wind up matching this rule. We want + * to now switch to the initial state + * and try matching from there instead. + */ + yyless(0); /* put back matched text */ + BEGIN(INITIAL); + } + + +File: flex.info, Node: Why cant I use fast or full tables with interactive mode?, Next: How much faster is -F or -f than -C?, Prev: How can I make REJECT cascade across start condition boundaries?, Up: FAQ + +Why can't I use fast or full tables with interactive mode? +========================================================== + +One of the assumptions flex makes is that interactive applications are +inherently slow (they're waiting on a human after all). It has to do +with how the scanner detects that it must be finished scanning a token. +For interactive scanners, after scanning each character the current +state is looked up in a table (essentially) to see whether there's a +chance of another input character possibly extending the length of the +match. If not, the scanner halts. For non-interactive scanners, the +end-of-token test is much simpler, basically a compare with 0, so no +memory bus cycles. Since the test occurs in the innermost scanning +loop, one would like to make it go as fast as possible. + + Still, it seems reasonable to allow the user to choose to trade off +a bit of performance in this area to gain the corresponding +flexibility. There might be another reason, though, why fast scanners +don't support the interactive option. + + +File: flex.info, Node: How much faster is -F or -f than -C?, Next: If I have a simple grammar cant I just parse it with flex?, Prev: Why cant I use fast or full tables with interactive mode?, Up: FAQ + +How much faster is -F or -f than -C? +==================================== + +Much faster (factor of 2-3). + + +File: flex.info, Node: If I have a simple grammar cant I just parse it with flex?, Next: Why doesn't yyrestart() set the start state back to INITIAL?, Prev: How much faster is -F or -f than -C?, Up: FAQ + +If I have a simple grammar can't I just parse it with flex? +=========================================================== + +Is your grammar recursive? That's almost always a sign that you're +better off using a parser/scanner rather than just trying to use a +scanner alone. + + +File: flex.info, Node: Why doesn't yyrestart() set the start state back to INITIAL?, Next: How can I match C-style comments?, Prev: If I have a simple grammar cant I just parse it with flex?, Up: FAQ + +Why doesn't yyrestart() set the start state back to INITIAL? +============================================================ + +There are two reasons. The first is that there might be programs that +rely on the start state not changing across file changes. The second +is that beginning with `flex' version 2.4, use of `yyrestart()' is no +longer required, so fixing the problem there doesn't solve the more +general problem. + + +File: flex.info, Node: How can I match C-style comments?, Next: The period isn't working the way I expected., Prev: Why doesn't yyrestart() set the start state back to INITIAL?, Up: FAQ + +How can I match C-style comments? +================================= + +You might be tempted to try something like this: + + + "/*".*"*/" // WRONG! + + or, worse, this: + + + "/*"(.|\n)"*/" // WRONG! + + The above rules will eat too much input, and blow up on things like: + + + /* a comment */ do_my_thing( "oops */" ); + + Here is one way which allows you to track line information: + + + <INITIAL>{ + "/*" BEGIN(IN_COMMENT); + } + <IN_COMMENT>{ + "*/" BEGIN(INITIAL); + [^*\n]+ // eat comment in chunks + "*" // eat the lone star + \n yylineno++; + } + + +File: flex.info, Node: The period isn't working the way I expected., Next: Can I get the flex manual in another format?, Prev: How can I match C-style comments?, Up: FAQ + +The '.' isn't working the way I expected. +========================================= + +Here are some tips for using `.': + + * A common mistake is to place the grouping parenthesis AFTER an + operator, when you really meant to place the parenthesis BEFORE + the operator, e.g., you probably want this `(foo|bar)+' and NOT + this `(foo|bar+)'. + + The first pattern matches the words `foo' or `bar' any number of + times, e.g., it matches the text `barfoofoobarfoo'. The second + pattern matches a single instance of `foo' or a single instance of + `bar' followed by one or more `r's, e.g., it matches the text + `barrrr' . + + * A `.' inside `[]''s just means a literal`.' (period), and NOT "any + character except newline". + + * Remember that `.' matches any character EXCEPT `\n' (and `EOF'). + If you really want to match ANY character, including newlines, + then use `(.|\n)' Beware that the regex `(.|\n)+' will match your + entire input! + + * Finally, if you want to match a literal `.' (a period), then use + `[.]' or `"."' + + +File: flex.info, Node: Can I get the flex manual in another format?, Next: Does there exist a "faster" NDFA->DFA algorithm?, Prev: The period isn't working the way I expected., Up: FAQ + +Can I get the flex manual in another format? +============================================ + +The `flex' source distribution includes a texinfo manual. You are free +to convert that texinfo into whatever format you desire. The `texinfo' +package includes tools for conversion to a number of formats. + + +File: flex.info, Node: Does there exist a "faster" NDFA->DFA algorithm?, Next: How does flex compile the DFA so quickly?, Prev: Can I get the flex manual in another format?, Up: FAQ + +Does there exist a "faster" NDFA->DFA algorithm? +================================================ + +There's no way around the potential exponential running time - it can +take you exponential time just to enumerate all of the DFA states. In +practice, though, the running time is closer to linear, or sometimes +quadratic. + + +File: flex.info, Node: How does flex compile the DFA so quickly?, Next: How can I use more than 8192 rules?, Prev: Does there exist a "faster" NDFA->DFA algorithm?, Up: FAQ + +How does flex compile the DFA so quickly? +========================================= + +There are two big speed wins that `flex' uses: + + 1. It analyzes the input rules to construct equivalence classes for + those characters that always make the same transitions. It then + rewrites the NFA using equivalence classes for transitions instead + of characters. This cuts down the NFA->DFA computation time + dramatically, to the point where, for uncompressed DFA tables, the + DFA generation is often I/O bound in writing out the tables. + + 2. It maintains hash values for previously computed DFA states, so + testing whether a newly constructed DFA state is equivalent to a + previously constructed state can be done very quickly, by first + comparing hash values. + + +File: flex.info, Node: How can I use more than 8192 rules?, Next: How do I abandon a file in the middle of a scan and switch to a new file?, Prev: How does flex compile the DFA so quickly?, Up: FAQ + +How can I use more than 8192 rules? +=================================== + +`Flex' is compiled with an upper limit of 8192 rules per scanner. If +you need more than 8192 rules in your scanner, you'll have to recompile +`flex' with the following changes in `flexdef.h': + + + < #define YY_TRAILING_MASK 0x2000 + < #define YY_TRAILING_HEAD_MASK 0x4000 + -- + > #define YY_TRAILING_MASK 0x20000000 + > #define YY_TRAILING_HEAD_MASK 0x40000000 + + This should work okay as long as your C compiler uses 32 bit +integers. But you might want to think about whether using such a huge +number of rules is the best way to solve your problem. + + The following may also be relevant: + + With luck, you should be able to increase the definitions in +flexdef.h for: + + + #define JAMSTATE -32766 /* marks a reference to the state that always jams */ + #define MAXIMUM_MNS 31999 + #define BAD_SUBSCRIPT -32767 + + recompile everything, and it'll all work. Flex only has these +16-bit-like values built into it because a long time ago it was +developed on a machine with 16-bit ints. I've given this advice to +others in the past but haven't heard back from them whether it worked +okay or not... + + +File: flex.info, Node: How do I abandon a file in the middle of a scan and switch to a new file?, Next: How do I execute code only during initialization (only before the first scan)?, Prev: How can I use more than 8192 rules?, Up: FAQ + +How do I abandon a file in the middle of a scan and switch to a new file? +========================================================================= + +Just call `yyrestart(newfile)'. Be sure to reset the start state if you +want a "fresh start, since `yyrestart' does NOT reset the start state +back to `INITIAL'. + + +File: flex.info, Node: How do I execute code only during initialization (only before the first scan)?, Next: How do I execute code at termination?, Prev: How do I abandon a file in the middle of a scan and switch to a new file?, Up: FAQ + +How do I execute code only during initialization (only before the first scan)? +============================================================================== + +You can specify an initial action by defining the macro `YY_USER_INIT' +(though note that `yyout' may not be available at the time this macro +is executed). Or you can add to the beginning of your rules section: + + + %% + /* Must be indented! */ + static int did_init = 0; + + if ( ! did_init ){ + do_my_init(); + did_init = 1; + } + + +File: flex.info, Node: How do I execute code at termination?, Next: Where else can I find help?, Prev: How do I execute code only during initialization (only before the first scan)?, Up: FAQ + +How do I execute code at termination? +===================================== + +You can specify an action for the `<<EOF>>' rule. + + +File: flex.info, Node: Where else can I find help?, Next: Can I include comments in the "rules" section of the file?, Prev: How do I execute code at termination?, Up: FAQ + +Where else can I find help? +=========================== + +You can find the flex homepage on the web at +`http://flex.sourceforge.net/'. See that page for details about flex +mailing lists as well. + + +File: flex.info, Node: Can I include comments in the "rules" section of the file?, Next: I get an error about undefined yywrap()., Prev: Where else can I find help?, Up: FAQ + +Can I include comments in the "rules" section of the file? +========================================================== + +Yes, just about anywhere you want to. See the manual for the specific +syntax. + + +File: flex.info, Node: I get an error about undefined yywrap()., Next: How can I change the matching pattern at run time?, Prev: Can I include comments in the "rules" section of the file?, Up: FAQ + +I get an error about undefined yywrap(). +======================================== + +You must supply a `yywrap()' function of your own, or link to `libfl.a' +(which provides one), or use + + + %option noyywrap + + in your source to say you don't want a `yywrap()' function. + + +File: flex.info, Node: How can I change the matching pattern at run time?, Next: How can I expand macros in the input?, Prev: I get an error about undefined yywrap()., Up: FAQ + +How can I change the matching pattern at run time? +================================================== + +You can't, it's compiled into a static table when flex builds the +scanner. + + +File: flex.info, Node: How can I expand macros in the input?, Next: How can I build a two-pass scanner?, Prev: How can I change the matching pattern at run time?, Up: FAQ + +How can I expand macros in the input? +===================================== + +The best way to approach this problem is at a higher level, e.g., in +the parser. + + However, you can do this using multiple input buffers. + + + %% + macro/[a-z]+ { + /* Saw the macro "macro" followed by extra stuff. */ + main_buffer = YY_CURRENT_BUFFER; + expansion_buffer = yy_scan_string(expand(yytext)); + yy_switch_to_buffer(expansion_buffer); + } + + <<EOF>> { + if ( expansion_buffer ) + { + // We were doing an expansion, return to where + // we were. + yy_switch_to_buffer(main_buffer); + yy_delete_buffer(expansion_buffer); + expansion_buffer = 0; + } + else + yyterminate(); + } + + You probably will want a stack of expansion buffers to allow nested +macros. From the above though hopefully the idea is clear. + + +File: flex.info, Node: How can I build a two-pass scanner?, Next: How do I match any string not matched in the preceding rules?, Prev: How can I expand macros in the input?, Up: FAQ + +How can I build a two-pass scanner? +=================================== + +One way to do it is to filter the first pass to a temporary file, then +process the temporary file on the second pass. You will probably see a +performance hit, due to all the disk I/O. + + When you need to look ahead far forward like this, it almost always +means that the right solution is to build a parse tree of the entire +input, then walk it after the parse in order to generate the output. +In a sense, this is a two-pass approach, once through the text and once +through the parse tree, but the performance hit for the latter is +usually an order of magnitude smaller, since everything is already +classified, in binary format, and residing in memory. + + +File: flex.info, Node: How do I match any string not matched in the preceding rules?, Next: I am trying to port code from AT&T lex that uses yysptr and yysbuf., Prev: How can I build a two-pass scanner?, Up: FAQ + +How do I match any string not matched in the preceding rules? +============================================================= + +One way to assign precedence, is to place the more specific rules +first. If two rules would match the same input (same sequence of +characters) then the first rule listed in the `flex' input wins, e.g., + + + %% + foo[a-zA-Z_]+ return FOO_ID; + bar[a-zA-Z_]+ return BAR_ID; + [a-zA-Z_]+ return GENERIC_ID; + + Note that the rule `[a-zA-Z_]+' must come *after* the others. It +will match the same amount of text as the more specific rules, and in +that case the `flex' scanner will pick the first rule listed in your +scanner as the one to match. + + +File: flex.info, Node: I am trying to port code from AT&T lex that uses yysptr and yysbuf., Next: Is there a way to make flex treat NULL like a regular character?, Prev: How do I match any string not matched in the preceding rules?, Up: FAQ + +I am trying to port code from AT&T lex that uses yysptr and yysbuf. +=================================================================== + +Those are internal variables pointing into the AT&T scanner's input +buffer. I imagine they're being manipulated in user versions of the +`input()' and `unput()' functions. If so, what you need to do is +analyze those functions to figure out what they're doing, and then +replace `input()' with an appropriate definition of `YY_INPUT'. You +shouldn't need to (and must not) replace `flex''s `unput()' function. + + +File: flex.info, Node: Is there a way to make flex treat NULL like a regular character?, Next: Whenever flex can not match the input it says "flex scanner jammed"., Prev: I am trying to port code from AT&T lex that uses yysptr and yysbuf., Up: FAQ + +Is there a way to make flex treat NULL like a regular character? +================================================================ + +Yes, `\0' and `\x00' should both do the trick. Perhaps you have an +ancient version of `flex'. The latest release is version 2.5.35. + + +File: flex.info, Node: Whenever flex can not match the input it says "flex scanner jammed"., Next: Why doesn't flex have non-greedy operators like perl does?, Prev: Is there a way to make flex treat NULL like a regular character?, Up: FAQ + +Whenever flex can not match the input it says "flex scanner jammed". +==================================================================== + +You need to add a rule that matches the otherwise-unmatched text, e.g., + + + %option yylineno + %% + [[a bunch of rules here]] + + . printf("bad input character '%s' at line %d\n", yytext, yylineno); + + See `%option default' for more information. + + +File: flex.info, Node: Why doesn't flex have non-greedy operators like perl does?, Next: Memory leak - 16386 bytes allocated by malloc., Prev: Whenever flex can not match the input it says "flex scanner jammed"., Up: FAQ + +Why doesn't flex have non-greedy operators like perl does? +========================================================== + +A DFA can do a non-greedy match by stopping the first time it enters an +accepting state, instead of consuming input until it determines that no +further matching is possible (a "jam" state). This is actually easier +to implement than longest leftmost match (which flex does). + + But it's also much less useful than longest leftmost match. In +general, when you find yourself wishing for non-greedy matching, that's +usually a sign that you're trying to make the scanner do some parsing. +That's generally the wrong approach, since it lacks the power to do a +decent job. Better is to either introduce a separate parser, or to +split the scanner into multiple scanners using (exclusive) start +conditions. + + You might have a separate start state once you've seen the `BEGIN'. +In that state, you might then have a regex that will match `END' (to +kick you out of the state), and perhaps `(.|\n)' to get a single +character within the chunk ... + + This approach also has much better error-reporting properties. + + +File: flex.info, Node: Memory leak - 16386 bytes allocated by malloc., Next: How do I track the byte offset for lseek()?, Prev: Why doesn't flex have non-greedy operators like perl does?, Up: FAQ + +Memory leak - 16386 bytes allocated by malloc. +============================================== + +UPDATED 2002-07-10: As of `flex' version 2.5.9, this leak means that +you did not call `yylex_destroy()'. If you are using an earlier version +of `flex', then read on. + + The leak is about 16426 bytes. That is, (8192 * 2 + 2) for the +read-buffer, and about 40 for `struct yy_buffer_state' (depending upon +alignment). The leak is in the non-reentrant C scanner only (NOT in the +reentrant scanner, NOT in the C++ scanner). Since `flex' doesn't know +when you are done, the buffer is never freed. + + However, the leak won't multiply since the buffer is reused no +matter how many times you call `yylex()'. + + If you want to reclaim the memory when you are completely done +scanning, then you might try this: + + + /* For non-reentrant C scanner only. */ + yy_delete_buffer(YY_CURRENT_BUFFER); + yy_init = 1; + + Note: `yy_init' is an "internal variable", and hasn't been tested in +this situation. It is possible that some other globals may need +resetting as well. + + +File: flex.info, Node: How do I track the byte offset for lseek()?, Next: How do I use my own I/O classes in a C++ scanner?, Prev: Memory leak - 16386 bytes allocated by malloc., Up: FAQ + +How do I track the byte offset for lseek()? +=========================================== + + + > We thought that it would be possible to have this number through the + > evaluation of the following expression: + > + > seek_position = (no_buffers)*YY_READ_BUF_SIZE + yy_c_buf_p - YY_CURRENT_BUFFER->yy_ch_buf + + While this is the right idea, it has two problems. The first is that +it's possible that `flex' will request less than `YY_READ_BUF_SIZE' +during an invocation of `YY_INPUT' (or that your input source will +return less even though `YY_READ_BUF_SIZE' bytes were requested). The +second problem is that when refilling its internal buffer, `flex' keeps +some characters from the previous buffer (because usually it's in the +middle of a match, and needs those characters to construct `yytext' for +the match once it's done). Because of this, `yy_c_buf_p - +YY_CURRENT_BUFFER->yy_ch_buf' won't be exactly the number of characters +already read from the current buffer. + + An alternative solution is to count the number of characters you've +matched since starting to scan. This can be done by using +`YY_USER_ACTION'. For example, + + + #define YY_USER_ACTION num_chars += yyleng; + + (You need to be careful to update your bookkeeping if you use +`yymore('), `yyless()', `unput()', or `input()'.) + + +File: flex.info, Node: How do I use my own I/O classes in a C++ scanner?, Next: How do I skip as many chars as possible?, Prev: How do I track the byte offset for lseek()?, Up: FAQ + +How do I use my own I/O classes in a C++ scanner? +================================================= + +When the flex C++ scanning class rewrite finally happens, then this +sort of thing should become much easier. + + You can do this by passing the various functions (such as +`LexerInput()' and `LexerOutput()') NULL `iostream*''s, and then +dealing with your own I/O classes surreptitiously (i.e., stashing them +in special member variables). This works because the only assumption +about the lexer regarding what's done with the iostream's is that +they're ultimately passed to `LexerInput()' and `LexerOutput', which +then do whatever is necessary with them. + + +File: flex.info, Node: How do I skip as many chars as possible?, Next: deleteme00, Prev: How do I use my own I/O classes in a C++ scanner?, Up: FAQ + +How do I skip as many chars as possible? +======================================== + +How do I skip as many chars as possible - without interfering with the +other patterns? + + In the example below, we want to skip over characters until we see +the phrase "endskip". The following will _NOT_ work correctly (do you +see why not?) + + + /* INCORRECT SCANNER */ + %x SKIP + %% + <INITIAL>startskip BEGIN(SKIP); + ... + <SKIP>"endskip" BEGIN(INITIAL); + <SKIP>.* ; + + The problem is that the pattern .* will eat up the word "endskip." +The simplest (but slow) fix is: + + + <SKIP>"endskip" BEGIN(INITIAL); + <SKIP>. ; + + The fix involves making the second rule match more, without making +it match "endskip" plus something else. So for example: + + + <SKIP>"endskip" BEGIN(INITIAL); + <SKIP>[^e]+ ; + <SKIP>. ;/* so you eat up e's, too */ + + +File: flex.info, Node: deleteme00, Next: Are certain equivalent patterns faster than others?, Prev: How do I skip as many chars as possible?, Up: FAQ + +deleteme00 +========== + + + QUESTION: + When was flex born? + + Vern Paxson took over + the Software Tools lex project from Jef Poskanzer in 1982. At that point it + was written in Ratfor. Around 1987 or so, Paxson translated it into C, and + a legend was born :-). + + +File: flex.info, Node: Are certain equivalent patterns faster than others?, Next: Is backing up a big deal?, Prev: deleteme00, Up: FAQ + +Are certain equivalent patterns faster than others? +=================================================== + + + To: Adoram Rogel <adoram@orna.hybridge.com> + Subject: Re: Flex 2.5.2 performance questions + In-reply-to: Your message of Wed, 18 Sep 96 11:12:17 EDT. + Date: Wed, 18 Sep 96 10:51:02 PDT + From: Vern Paxson <vern> + + [Note, the most recent flex release is 2.5.4, which you can get from + ftp.ee.lbl.gov. It has bug fixes over 2.5.2 and 2.5.3.] + + > 1. Using the pattern + > ([Ff](oot)?)?[Nn](ote)?(\.)? + > instead of + > (((F|f)oot(N|n)ote)|((N|n)ote)|((N|n)\.)|((F|f)(N|n)(\.))) + > (in a very complicated flex program) caused the program to slow from + > 300K+/min to 100K/min (no other changes were done). + + These two are not equivalent. For example, the first can match "footnote." + but the second can only match "footnote". This is almost certainly the + cause in the discrepancy - the slower scanner run is matching more tokens, + and/or having to do more backing up. + + > 2. Which of these two are better: [Ff]oot or (F|f)oot ? + + From a performance point of view, they're equivalent (modulo presumably + minor effects such as memory cache hit rates; and the presence of trailing + context, see below). From a space point of view, the first is slightly + preferable. + + > 3. I have a pattern that look like this: + > pats {p1}|{p2}|{p3}|...|{p50} (50 patterns ORd) + > + > running yet another complicated program that includes the following rule: + > <snext>{and}/{no4}{bb}{pats} + > + > gets me to "too complicated - over 32,000 states"... + + I can't tell from this example whether the trailing context is variable-length + or fixed-length (it could be the latter if {and} is fixed-length). If it's + variable length, which flex -p will tell you, then this reflects a basic + performance problem, and if you can eliminate it by restructuring your + scanner, you will see significant improvement. + + > so I divided {pats} to {pats1}, {pats2},..., {pats5} each consists of about + > 10 patterns and changed the rule to be 5 rules. + > This did compile, but what is the rule of thumb here ? + + The rule is to avoid trailing context other than fixed-length, in which for + a/b, either the 'a' pattern or the 'b' pattern have a fixed length. Use + of the '|' operator automatically makes the pattern variable length, so in + this case '[Ff]oot' is preferred to '(F|f)oot'. + + > 4. I changed a rule that looked like this: + > <snext8>{and}{bb}/{ROMAN}[^A-Za-z] { BEGIN... + > + > to the next 2 rules: + > <snext8>{and}{bb}/{ROMAN}[A-Za-z] { ECHO;} + > <snext8>{and}{bb}/{ROMAN} { BEGIN... + > + > Again, I understand the using [^...] will cause a great performance loss + + Actually, it doesn't cause any sort of performance loss. It's a surprising + fact about regular expressions that they always match in linear time + regardless of how complex they are. + + > but are there any specific rules about it ? + + See the "Performance Considerations" section of the man page, and also + the example in MISC/fastwc/. + + Vern + + +File: flex.info, Node: Is backing up a big deal?, Next: Can I fake multi-byte character support?, Prev: Are certain equivalent patterns faster than others?, Up: FAQ + +Is backing up a big deal? +========================= + + + To: Adoram Rogel <adoram@hybridge.com> + Subject: Re: Flex 2.5.2 performance questions + In-reply-to: Your message of Thu, 19 Sep 96 10:16:04 EDT. + Date: Thu, 19 Sep 96 09:58:00 PDT + From: Vern Paxson <vern> + + > a lot about the backing up problem. + > I believe that there lies my biggest problem, and I'll try to improve + > it. + + Since you have variable trailing context, this is a bigger performance + problem. Fixing it is usually easier than fixing backing up, which in a + complicated scanner (yours seems to fit the bill) can be extremely + difficult to do correctly. + + You also don't mention what flags you are using for your scanner. + -f makes a large speed difference, and -Cfe buys you nearly as much + speed but the resulting scanner is considerably smaller. + + > I have an | operator in {and} and in {pats} so both of them are variable + > length. + + -p should have reported this. + + > Is changing one of them to fixed-length is enough ? + + Yes. + + > Is it possible to change the 32,000 states limit ? + + Yes. I've appended instructions on how. Before you make this change, + though, you should think about whether there are ways to fundamentally + simplify your scanner - those are certainly preferable! + + Vern + + To increase the 32K limit (on a machine with 32 bit integers), you increase + the magnitude of the following in flexdef.h: + + #define JAMSTATE -32766 /* marks a reference to the state that always jams */ + #define MAXIMUM_MNS 31999 + #define BAD_SUBSCRIPT -32767 + #define MAX_SHORT 32700 + + Adding a 0 or two after each should do the trick. + + +File: flex.info, Node: Can I fake multi-byte character support?, Next: deleteme01, Prev: Is backing up a big deal?, Up: FAQ + +Can I fake multi-byte character support? +======================================== + + + To: Heeman_Lee@hp.com + Subject: Re: flex - multi-byte support? + In-reply-to: Your message of Thu, 03 Oct 1996 17:24:04 PDT. + Date: Fri, 04 Oct 1996 11:42:18 PDT + From: Vern Paxson <vern> + + > I assume as long as my *.l file defines the + > range of expected character code values (in octal format), flex will + > scan the file and read multi-byte characters correctly. But I have no + > confidence in this assumption. + + Your lack of confidence is justified - this won't work. + + Flex has in it a widespread assumption that the input is processed + one byte at a time. Fixing this is on the to-do list, but is involved, + so it won't happen any time soon. In the interim, the best I can suggest + (unless you want to try fixing it yourself) is to write your rules in + terms of pairs of bytes, using definitions in the first section: + + X \xfe\xc2 + ... + %% + foo{X}bar found_foo_fe_c2_bar(); + + etc. Definitely a pain - sorry about that. + + By the way, the email address you used for me is ancient, indicating you + have a very old version of flex. You can get the most recent, 2.5.4, from + ftp.ee.lbl.gov. + + Vern + + +File: flex.info, Node: deleteme01, Next: Can you discuss some flex internals?, Prev: Can I fake multi-byte character support?, Up: FAQ + +deleteme01 +========== + + + To: moleary@primus.com + Subject: Re: Flex / Unicode compatibility question + In-reply-to: Your message of Tue, 22 Oct 1996 10:15:42 PDT. + Date: Tue, 22 Oct 1996 11:06:13 PDT + From: Vern Paxson <vern> + + Unfortunately flex at the moment has a widespread assumption within it + that characters are processed 8 bits at a time. I don't see any easy + fix for this (other than writing your rules in terms of double characters - + a pain). I also don't know of a wider lex, though you might try surfing + the Plan 9 stuff because I know it's a Unicode system, and also the PCCT + toolkit (try searching say Alta Vista for "Purdue Compiler Construction + Toolkit"). + + Fixing flex to handle wider characters is on the long-term to-do list. + But since flex is a strictly spare-time project these days, this probably + won't happen for quite a while, unless someone else does it first. + + Vern + + +File: flex.info, Node: Can you discuss some flex internals?, Next: unput() messes up yy_at_bol, Prev: deleteme01, Up: FAQ + +Can you discuss some flex internals? +==================================== + + + To: Johan Linde <jl@theophys.kth.se> + Subject: Re: translation of flex + In-reply-to: Your message of Sun, 10 Nov 1996 09:16:36 PST. + Date: Mon, 11 Nov 1996 10:33:50 PST + From: Vern Paxson <vern> + + > I'm working for the Swedish team translating GNU program, and I'm currently + > working with flex. I have a few questions about some of the messages which + > I hope you can answer. + + All of the things you're wondering about, by the way, concerning flex + internals - probably the only person who understands what they mean in + English is me! So I wouldn't worry too much about getting them right. + That said ... + + > #: main.c:545 + > msgid " %d protos created\n" + > + > Does proto mean prototype? + + Yes - prototypes of state compression tables. + + > #: main.c:539 + > msgid " %d/%d (peak %d) template nxt-chk entries created\n" + > + > Here I'm mainly puzzled by 'nxt-chk'. I guess it means 'next-check'. (?) + > However, 'template next-check entries' doesn't make much sense to me. To be + > able to find a good translation I need to know a little bit more about it. + + There is a scheme in the Aho/Sethi/Ullman compiler book for compressing + scanner tables. It involves creating two pairs of tables. The first has + "base" and "default" entries, the second has "next" and "check" entries. + The "base" entry is indexed by the current state and yields an index into + the next/check table. The "default" entry gives what to do if the state + transition isn't found in next/check. The "next" entry gives the next + state to enter, but only if the "check" entry verifies that this entry is + correct for the current state. Flex creates templates of series of + next/check entries and then encodes differences from these templates as a + way to compress the tables. + + > #: main.c:533 + > msgid " %d/%d base-def entries created\n" + > + > The same problem here for 'base-def'. + + See above. + + Vern + + +File: flex.info, Node: unput() messes up yy_at_bol, Next: The | operator is not doing what I want, Prev: Can you discuss some flex internals?, Up: FAQ + +unput() messes up yy_at_bol +=========================== + + + To: Xinying Li <xli@npac.syr.edu> + Subject: Re: FLEX ? + In-reply-to: Your message of Wed, 13 Nov 1996 17:28:38 PST. + Date: Wed, 13 Nov 1996 19:51:54 PST + From: Vern Paxson <vern> + + > "unput()" them to input flow, question occurs. If I do this after I scan + > a carriage, the variable "YY_CURRENT_BUFFER->yy_at_bol" is changed. That + > means the carriage flag has gone. + + You can control this by calling yy_set_bol(). It's described in the manual. + + > And if in pre-reading it goes to the end of file, is anything done + > to control the end of curren buffer and end of file? + + No, there's no way to put back an end-of-file. + + > By the way I am using flex 2.5.2 and using the "-l". + + The latest release is 2.5.4, by the way. It fixes some bugs in 2.5.2 and + 2.5.3. You can get it from ftp.ee.lbl.gov. + + Vern + + +File: flex.info, Node: The | operator is not doing what I want, Next: Why can't flex understand this variable trailing context pattern?, Prev: unput() messes up yy_at_bol, Up: FAQ + +The | operator is not doing what I want +======================================= + + + To: Alain.ISSARD@st.com + Subject: Re: Start condition with FLEX + In-reply-to: Your message of Mon, 18 Nov 1996 09:45:02 PST. + Date: Mon, 18 Nov 1996 10:41:34 PST + From: Vern Paxson <vern> + + > I am not able to use the start condition scope and to use the | (OR) with + > rules having start conditions. + + The problem is that if you use '|' as a regular expression operator, for + example "a|b" meaning "match either 'a' or 'b'", then it must *not* have + any blanks around it. If you instead want the special '|' *action* (which + from your scanner appears to be the case), which is a way of giving two + different rules the same action: + + foo | + bar matched_foo_or_bar(); + + then '|' *must* be separated from the first rule by whitespace and *must* + be followed by a new line. You *cannot* write it as: + + foo | bar matched_foo_or_bar(); + + even though you might think you could because yacc supports this syntax. + The reason for this unfortunately incompatibility is historical, but it's + unlikely to be changed. + + Your problems with start condition scope are simply due to syntax errors + from your use of '|' later confusing flex. + + Let me know if you still have problems. + + Vern + + +File: flex.info, Node: Why can't flex understand this variable trailing context pattern?, Next: The ^ operator isn't working, Prev: The | operator is not doing what I want, Up: FAQ + +Why can't flex understand this variable trailing context pattern? +================================================================= + + + To: Gregory Margo <gmargo@newton.vip.best.com> + Subject: Re: flex-2.5.3 bug report + In-reply-to: Your message of Sat, 23 Nov 1996 16:50:09 PST. + Date: Sat, 23 Nov 1996 17:07:32 PST + From: Vern Paxson <vern> + + > Enclosed is a lex file that "real" lex will process, but I cannot get + > flex to process it. Could you try it and maybe point me in the right direction? + + Your problem is that some of the definitions in the scanner use the '/' + trailing context operator, and have it enclosed in ()'s. Flex does not + allow this operator to be enclosed in ()'s because doing so allows undefined + regular expressions such as "(a/b)+". So the solution is to remove the + parentheses. Note that you must also be building the scanner with the -l + option for AT&T lex compatibility. Without this option, flex automatically + encloses the definitions in parentheses. + + Vern + + +File: flex.info, Node: The ^ operator isn't working, Next: Trailing context is getting confused with trailing optional patterns, Prev: Why can't flex understand this variable trailing context pattern?, Up: FAQ + +The ^ operator isn't working +============================ + + + To: Thomas Hadig <hadig@toots.physik.rwth-aachen.de> + Subject: Re: Flex Bug ? + In-reply-to: Your message of Tue, 26 Nov 1996 14:35:01 PST. + Date: Tue, 26 Nov 1996 11:15:05 PST + From: Vern Paxson <vern> + + > In my lexer code, i have the line : + > ^\*.* { } + > + > Thus all lines starting with an astrix (*) are comment lines. + > This does not work ! + + I can't get this problem to reproduce - it works fine for me. Note + though that if what you have is slightly different: + + COMMENT ^\*.* + %% + {COMMENT} { } + + then it won't work, because flex pushes back macro definitions enclosed + in ()'s, so the rule becomes + + (^\*.*) { } + + and now that the '^' operator is not at the immediate beginning of the + line, it's interpreted as just a regular character. You can avoid this + behavior by using the "-l" lex-compatibility flag, or "%option lex-compat". + + Vern + + +File: flex.info, Node: Trailing context is getting confused with trailing optional patterns, Next: Is flex GNU or not?, Prev: The ^ operator isn't working, Up: FAQ + +Trailing context is getting confused with trailing optional patterns +==================================================================== + + + To: Adoram Rogel <adoram@hybridge.com> + Subject: Re: Flex 2.5.4 BOF ??? + In-reply-to: Your message of Tue, 26 Nov 1996 16:10:41 PST. + Date: Wed, 27 Nov 1996 10:56:25 PST + From: Vern Paxson <vern> + + > Organization(s)?/[a-z] + > + > This matched "Organizations" (looking in debug mode, the trailing s + > was matched with trailing context instead of the optional (s) in the + > end of the word. + + That should only happen with lex. Flex can properly match this pattern. + (That might be what you're saying, I'm just not sure.) + + > Is there a way to avoid this dangerous trailing context problem ? + + Unfortunately, there's no easy way. On the other hand, I don't see why + it should be a problem. Lex's matching is clearly wrong, and I'd hope + that usually the intent remains the same as expressed with the pattern, + so flex's matching will be correct. + + Vern + + +File: flex.info, Node: Is flex GNU or not?, Next: ERASEME53, Prev: Trailing context is getting confused with trailing optional patterns, Up: FAQ + +Is flex GNU or not? +=================== + + + To: Cameron MacKinnon <mackin@interlog.com> + Subject: Re: Flex documentation bug + In-reply-to: Your message of Mon, 02 Dec 1996 00:07:08 PST. + Date: Sun, 01 Dec 1996 22:29:39 PST + From: Vern Paxson <vern> + + > I'm not sure how or where to submit bug reports (documentation or + > otherwise) for the GNU project stuff ... + + Well, strictly speaking flex isn't part of the GNU project. They just + distribute it because no one's written a decent GPL'd lex replacement. + So you should send bugs directly to me. Those sent to the GNU folks + sometimes find there way to me, but some may drop between the cracks. + + > In GNU Info, under the section 'Start Conditions', and also in the man + > page (mine's dated April '95) is a nice little snippet showing how to + > parse C quoted strings into a buffer, defined to be MAX_STR_CONST in + > size. Unfortunately, no overflow checking is ever done ... + + This is already mentioned in the manual: + + Finally, here's an example of how to match C-style quoted + strings using exclusive start conditions, including expanded + escape sequences (but not including checking for a string + that's too long): + + The reason for not doing the overflow checking is that it will needlessly + clutter up an example whose main purpose is just to demonstrate how to + use flex. + + The latest release is 2.5.4, by the way, available from ftp.ee.lbl.gov. + + Vern + + +File: flex.info, Node: ERASEME53, Next: I need to scan if-then-else blocks and while loops, Prev: Is flex GNU or not?, Up: FAQ + +ERASEME53 +========= + + + To: tsv@cs.UManitoba.CA + Subject: Re: Flex (reg).. + In-reply-to: Your message of Thu, 06 Mar 1997 23:50:16 PST. + Date: Thu, 06 Mar 1997 15:54:19 PST + From: Vern Paxson <vern> + + > [:alpha:] ([:alnum:] | \\_)* + + If your rule really has embedded blanks as shown above, then it won't + work, as the first blank delimits the rule from the action. (It wouldn't + even compile ...) You need instead: + + [:alpha:]([:alnum:]|\\_)* + + and that should work fine - there's no restriction on what can go inside + of ()'s except for the trailing context operator, '/'. + + Vern + + +File: flex.info, Node: I need to scan if-then-else blocks and while loops, Next: ERASEME55, Prev: ERASEME53, Up: FAQ + +I need to scan if-then-else blocks and while loops +================================================== + + + To: "Mike Stolnicki" <mstolnic@ford.com> + Subject: Re: FLEX help + In-reply-to: Your message of Fri, 30 May 1997 13:33:27 PDT. + Date: Fri, 30 May 1997 10:46:35 PDT + From: Vern Paxson <vern> + + > We'd like to add "if-then-else", "while", and "for" statements to our + > language ... + > We've investigated many possible solutions. The one solution that seems + > the most reasonable involves knowing the position of a TOKEN in yyin. + + I strongly advise you to instead build a parse tree (abstract syntax tree) + and loop over that instead. You'll find this has major benefits in keeping + your interpreter simple and extensible. + + That said, the functionality you mention for get_position and set_position + have been on the to-do list for a while. As flex is a purely spare-time + project for me, no guarantees when this will be added (in particular, it + for sure won't be for many months to come). + + Vern + + +File: flex.info, Node: ERASEME55, Next: ERASEME56, Prev: I need to scan if-then-else blocks and while loops, Up: FAQ + +ERASEME55 +========= + + + To: Colin Paul Adams <colin@colina.demon.co.uk> + Subject: Re: Flex C++ classes and Bison + In-reply-to: Your message of 09 Aug 1997 17:11:41 PDT. + Date: Fri, 15 Aug 1997 10:48:19 PDT + From: Vern Paxson <vern> + + > #define YY_DECL int yylex (YYSTYPE *lvalp, struct parser_control + > *parm) + > + > I have been trying to get this to work as a C++ scanner, but it does + > not appear to be possible (warning that it matches no declarations in + > yyFlexLexer, or something like that). + > + > Is this supposed to be possible, or is it being worked on (I DID + > notice the comment that scanner classes are still experimental, so I'm + > not too hopeful)? + + What you need to do is derive a subclass from yyFlexLexer that provides + the above yylex() method, squirrels away lvalp and parm into member + variables, and then invokes yyFlexLexer::yylex() to do the regular scanning. + + Vern + + +File: flex.info, Node: ERASEME56, Next: ERASEME57, Prev: ERASEME55, Up: FAQ + +ERASEME56 +========= + + + To: Mikael.Latvala@lmf.ericsson.se + Subject: Re: Possible mistake in Flex v2.5 document + In-reply-to: Your message of Fri, 05 Sep 1997 16:07:24 PDT. + Date: Fri, 05 Sep 1997 10:01:54 PDT + From: Vern Paxson <vern> + + > In that example you show how to count comment lines when using + > C style /* ... */ comments. My question is, shouldn't you take into + > account a scenario where end of a comment marker occurs inside + > character or string literals? + + The scanner certainly needs to also scan character and string literals. + However it does that (there's an example in the man page for strings), the + lexer will recognize the beginning of the literal before it runs across the + embedded "/*". Consequently, it will finish scanning the literal before it + even considers the possibility of matching "/*". + + Example: + + '([^']*|{ESCAPE_SEQUENCE})' + + will match all the text between the ''s (inclusive). So the lexer + considers this as a token beginning at the first ', and doesn't even + attempt to match other tokens inside it. + + I thinnk this subtlety is not worth putting in the manual, as I suspect + it would confuse more people than it would enlighten. + + Vern + + +File: flex.info, Node: ERASEME57, Next: Is there a repository for flex scanners?, Prev: ERASEME56, Up: FAQ + +ERASEME57 +========= + + + To: "Marty Leisner" <leisner@sdsp.mc.xerox.com> + Subject: Re: flex limitations + In-reply-to: Your message of Sat, 06 Sep 1997 11:27:21 PDT. + Date: Mon, 08 Sep 1997 11:38:08 PDT + From: Vern Paxson <vern> + + > %% + > [a-zA-Z]+ /* skip a line */ + > { printf("got %s\n", yytext); } + > %% + + What version of flex are you using? If I feed this to 2.5.4, it complains: + + "bug.l", line 5: EOF encountered inside an action + "bug.l", line 5: unrecognized rule + "bug.l", line 5: fatal parse error + + Not the world's greatest error message, but it manages to flag the problem. + + (With the introduction of start condition scopes, flex can't accommodate + an action on a separate line, since it's ambiguous with an indented rule.) + + You can get 2.5.4 from ftp.ee.lbl.gov. + + Vern + + +File: flex.info, Node: Is there a repository for flex scanners?, Next: How can I conditionally compile or preprocess my flex input file?, Prev: ERASEME57, Up: FAQ + +Is there a repository for flex scanners? +======================================== + +Not that we know of. You might try asking on comp.compilers. + + +File: flex.info, Node: How can I conditionally compile or preprocess my flex input file?, Next: Where can I find grammars for lex and yacc?, Prev: Is there a repository for flex scanners?, Up: FAQ + +How can I conditionally compile or preprocess my flex input file? +================================================================= + +Flex doesn't have a preprocessor like C does. You might try using m4, +or the C preprocessor plus a sed script to clean up the result. + + +File: flex.info, Node: Where can I find grammars for lex and yacc?, Next: I get an end-of-buffer message for each character scanned., Prev: How can I conditionally compile or preprocess my flex input file?, Up: FAQ + +Where can I find grammars for lex and yacc? +=========================================== + +In the sources for flex and bison. + + +File: flex.info, Node: I get an end-of-buffer message for each character scanned., Next: unnamed-faq-62, Prev: Where can I find grammars for lex and yacc?, Up: FAQ + +I get an end-of-buffer message for each character scanned. +========================================================== + +This will happen if your LexerInput() function returns only one +character at a time, which can happen either if you're scanner is +"interactive", or if the streams library on your platform always +returns 1 for yyin->gcount(). + + Solution: override LexerInput() with a version that returns whole +buffers. + + +File: flex.info, Node: unnamed-faq-62, Next: unnamed-faq-63, Prev: I get an end-of-buffer message for each character scanned., Up: FAQ + +unnamed-faq-62 +============== + + + To: Georg.Rehm@CL-KI.Uni-Osnabrueck.DE + Subject: Re: Flex maximums + In-reply-to: Your message of Mon, 17 Nov 1997 17:16:06 PST. + Date: Mon, 17 Nov 1997 17:16:15 PST + From: Vern Paxson <vern> + + > I took a quick look into the flex-sources and altered some #defines in + > flexdefs.h: + > + > #define INITIAL_MNS 64000 + > #define MNS_INCREMENT 1024000 + > #define MAXIMUM_MNS 64000 + + The things to fix are to add a couple of zeroes to: + + #define JAMSTATE -32766 /* marks a reference to the state that always jams */ + #define MAXIMUM_MNS 31999 + #define BAD_SUBSCRIPT -32767 + #define MAX_SHORT 32700 + + and, if you get complaints about too many rules, make the following change too: + + #define YY_TRAILING_MASK 0x200000 + #define YY_TRAILING_HEAD_MASK 0x400000 + + - Vern + + +File: flex.info, Node: unnamed-faq-63, Next: unnamed-faq-64, Prev: unnamed-faq-62, Up: FAQ + +unnamed-faq-63 +============== + + + To: jimmey@lexis-nexis.com (Jimmey Todd) + Subject: Re: FLEX question regarding istream vs ifstream + In-reply-to: Your message of Mon, 08 Dec 1997 15:54:15 PST. + Date: Mon, 15 Dec 1997 13:21:35 PST + From: Vern Paxson <vern> + + > stdin_handle = YY_CURRENT_BUFFER; + > ifstream fin( "aFile" ); + > yy_switch_to_buffer( yy_create_buffer( fin, YY_BUF_SIZE ) ); + > + > What I'm wanting to do, is pass the contents of a file thru one set + > of rules and then pass stdin thru another set... It works great if, I + > don't use the C++ classes. But since everything else that I'm doing is + > in C++, I thought I'd be consistent. + > + > The problem is that 'yy_create_buffer' is expecting an istream* as it's + > first argument (as stated in the man page). However, fin is a ifstream + > object. Any ideas on what I might be doing wrong? Any help would be + > appreciated. Thanks!! + + You need to pass &fin, to turn it into an ifstream* instead of an ifstream. + Then its type will be compatible with the expected istream*, because ifstream + is derived from istream. + + Vern + + +File: flex.info, Node: unnamed-faq-64, Next: unnamed-faq-65, Prev: unnamed-faq-63, Up: FAQ + +unnamed-faq-64 +============== + + + To: Enda Fadian <fadiane@piercom.ie> + Subject: Re: Question related to Flex man page? + In-reply-to: Your message of Tue, 16 Dec 1997 15:17:34 PST. + Date: Tue, 16 Dec 1997 14:17:09 PST + From: Vern Paxson <vern> + + > Can you explain to me what is ment by a long-jump in relation to flex? + + Using the longjmp() function while inside yylex() or a routine called by it. + + > what is the flex activation frame. + + Just yylex()'s stack frame. + + > As far as I can see yyrestart will bring me back to the sart of the input + > file and using flex++ isnot really an option! + + No, yyrestart() doesn't imply a rewind, even though its name might sound + like it does. It tells the scanner to flush its internal buffers and + start reading from the given file at its present location. + + Vern + + +File: flex.info, Node: unnamed-faq-65, Next: unnamed-faq-66, Prev: unnamed-faq-64, Up: FAQ + +unnamed-faq-65 +============== + + + To: hassan@larc.info.uqam.ca (Hassan Alaoui) + Subject: Re: Need urgent Help + In-reply-to: Your message of Sat, 20 Dec 1997 19:38:19 PST. + Date: Sun, 21 Dec 1997 21:30:46 PST + From: Vern Paxson <vern> + + > /usr/lib/yaccpar: In function `int yyparse()': + > /usr/lib/yaccpar:184: warning: implicit declaration of function `int yylex(...)' + > + > ld: Undefined symbol + > _yylex + > _yyparse + > _yyin + + This is a known problem with Solaris C++ (and/or Solaris yacc). I believe + the fix is to explicitly insert some 'extern "C"' statements for the + corresponding routines/symbols. + + Vern + + +File: flex.info, Node: unnamed-faq-66, Next: unnamed-faq-67, Prev: unnamed-faq-65, Up: FAQ + +unnamed-faq-66 +============== + + + To: mc0307@mclink.it + Cc: gnu@prep.ai.mit.edu + Subject: Re: [mc0307@mclink.it: Help request] + In-reply-to: Your message of Fri, 12 Dec 1997 17:57:29 PST. + Date: Sun, 21 Dec 1997 22:33:37 PST + From: Vern Paxson <vern> + + > This is my definition for float and integer types: + > . . . + > NZD [1-9] + > ... + > I've tested my program on other lex version (on UNIX Sun Solaris an HP + > UNIX) and it work well, so I think that my definitions are correct. + > There are any differences between Lex and Flex? + + There are indeed differences, as discussed in the man page. The one + you are probably running into is that when flex expands a name definition, + it puts parentheses around the expansion, while lex does not. There's + an example in the man page of how this can lead to different matching. + Flex's behavior complies with the POSIX standard (or at least with the + last POSIX draft I saw). + + Vern + + +File: flex.info, Node: unnamed-faq-67, Next: unnamed-faq-68, Prev: unnamed-faq-66, Up: FAQ + +unnamed-faq-67 +============== + + + To: hassan@larc.info.uqam.ca (Hassan Alaoui) + Subject: Re: Thanks + In-reply-to: Your message of Mon, 22 Dec 1997 16:06:35 PST. + Date: Mon, 22 Dec 1997 14:35:05 PST + From: Vern Paxson <vern> + + > Thank you very much for your help. I compile and link well with C++ while + > declaring 'yylex ...' extern, But a little problem remains. I get a + > segmentation default when executing ( I linked with lfl library) while it + > works well when using LEX instead of flex. Do you have some ideas about the + > reason for this ? + + The one possible reason for this that comes to mind is if you've defined + yytext as "extern char yytext[]" (which is what lex uses) instead of + "extern char *yytext" (which is what flex uses). If it's not that, then + I'm afraid I don't know what the problem might be. + + Vern + + +File: flex.info, Node: unnamed-faq-68, Next: unnamed-faq-69, Prev: unnamed-faq-67, Up: FAQ + +unnamed-faq-68 +============== + + + To: "Bart Niswonger" <NISWONGR@almaden.ibm.com> + Subject: Re: flex 2.5: c++ scanners & start conditions + In-reply-to: Your message of Tue, 06 Jan 1998 10:34:21 PST. + Date: Tue, 06 Jan 1998 19:19:30 PST + From: Vern Paxson <vern> + + > The problem is that when I do this (using %option c++) start + > conditions seem to not apply. + + The BEGIN macro modifies the yy_start variable. For C scanners, this + is a static with scope visible through the whole file. For C++ scanners, + it's a member variable, so it only has visible scope within a member + function. Your lexbegin() routine is not a member function when you + build a C++ scanner, so it's not modifying the correct yy_start. The + diagnostic that indicates this is that you found you needed to add + a declaration of yy_start in order to get your scanner to compile when + using C++; instead, the correct fix is to make lexbegin() a member + function (by deriving from yyFlexLexer). + + Vern + + +File: flex.info, Node: unnamed-faq-69, Next: unnamed-faq-70, Prev: unnamed-faq-68, Up: FAQ + +unnamed-faq-69 +============== + + + To: "Boris Zinin" <boris@ippe.rssi.ru> + Subject: Re: current position in flex buffer + In-reply-to: Your message of Mon, 12 Jan 1998 18:58:23 PST. + Date: Mon, 12 Jan 1998 12:03:15 PST + From: Vern Paxson <vern> + + > The problem is how to determine the current position in flex active + > buffer when a rule is matched.... + + You will need to keep track of this explicitly, such as by redefining + YY_USER_ACTION to count the number of characters matched. + + The latest flex release, by the way, is 2.5.4, available from ftp.ee.lbl.gov. + + Vern + + +File: flex.info, Node: unnamed-faq-70, Next: unnamed-faq-71, Prev: unnamed-faq-69, Up: FAQ + +unnamed-faq-70 +============== + + + To: Bik.Dhaliwal@bis.org + Subject: Re: Flex question + In-reply-to: Your message of Mon, 26 Jan 1998 13:05:35 PST. + Date: Tue, 27 Jan 1998 22:41:52 PST + From: Vern Paxson <vern> + + > That requirement involves knowing + > the character position at which a particular token was matched + > in the lexer. + + The way you have to do this is by explicitly keeping track of where + you are in the file, by counting the number of characters scanned + for each token (available in yyleng). It may prove convenient to + do this by redefining YY_USER_ACTION, as described in the manual. + + Vern + + +File: flex.info, Node: unnamed-faq-71, Next: unnamed-faq-72, Prev: unnamed-faq-70, Up: FAQ + +unnamed-faq-71 +============== + + + To: Vladimir Alexiev <vladimir@cs.ualberta.ca> + Subject: Re: flex: how to control start condition from parser? + In-reply-to: Your message of Mon, 26 Jan 1998 05:50:16 PST. + Date: Tue, 27 Jan 1998 22:45:37 PST + From: Vern Paxson <vern> + + > It seems useful for the parser to be able to tell the lexer about such + > context dependencies, because then they don't have to be limited to + > local or sequential context. + + One way to do this is to have the parser call a stub routine that's + included in the scanner's .l file, and consequently that has access ot + BEGIN. The only ugliness is that the parser can't pass in the state + it wants, because those aren't visible - but if you don't have many + such states, then using a different set of names doesn't seem like + to much of a burden. + + While generating a .h file like you suggests is certainly cleaner, + flex development has come to a virtual stand-still :-(, so a workaround + like the above is much more pragmatic than waiting for a new feature. + + Vern + + +File: flex.info, Node: unnamed-faq-72, Next: unnamed-faq-73, Prev: unnamed-faq-71, Up: FAQ + +unnamed-faq-72 +============== + + + To: Barbara Denny <denny@3com.com> + Subject: Re: freebsd flex bug? + In-reply-to: Your message of Fri, 30 Jan 1998 12:00:43 PST. + Date: Fri, 30 Jan 1998 12:42:32 PST + From: Vern Paxson <vern> + + > lex.yy.c:1996: parse error before `=' + + This is the key, identifying this error. (It may help to pinpoint + it by using flex -L, so it doesn't generate #line directives in its + output.) I will bet you heavy money that you have a start condition + name that is also a variable name, or something like that; flex spits + out #define's for each start condition name, mapping them to a number, + so you can wind up with: + + %x foo + %% + ... + %% + void bar() + { + int foo = 3; + } + + and the penultimate will turn into "int 1 = 3" after C preprocessing, + since flex will put "#define foo 1" in the generated scanner. + + Vern + + +File: flex.info, Node: unnamed-faq-73, Next: unnamed-faq-74, Prev: unnamed-faq-72, Up: FAQ + +unnamed-faq-73 +============== + + + To: Maurice Petrie <mpetrie@infoscigroup.com> + Subject: Re: Lost flex .l file + In-reply-to: Your message of Mon, 02 Feb 1998 14:10:01 PST. + Date: Mon, 02 Feb 1998 11:15:12 PST + From: Vern Paxson <vern> + + > I am curious as to + > whether there is a simple way to backtrack from the generated source to + > reproduce the lost list of tokens we are searching on. + + In theory, it's straight-forward to go from the DFA representation + back to a regular-expression representation - the two are isomorphic. + In practice, a huge headache, because you have to unpack all the tables + back into a single DFA representation, and then write a program to munch + on that and translate it into an RE. + + Sorry for the less-than-happy news ... + + Vern + + +File: flex.info, Node: unnamed-faq-74, Next: unnamed-faq-75, Prev: unnamed-faq-73, Up: FAQ + +unnamed-faq-74 +============== + + + To: jimmey@lexis-nexis.com (Jimmey Todd) + Subject: Re: Flex performance question + In-reply-to: Your message of Thu, 19 Feb 1998 11:01:17 PST. + Date: Thu, 19 Feb 1998 08:48:51 PST + From: Vern Paxson <vern> + + > What I have found, is that the smaller the data chunk, the faster the + > program executes. This is the opposite of what I expected. Should this be + > happening this way? + + This is exactly what will happen if your input file has embedded NULs. + From the man page: + + A final note: flex is slow when matching NUL's, particularly + when a token contains multiple NUL's. It's best to write + rules which match short amounts of text if it's anticipated + that the text will often include NUL's. + + So that's the first thing to look for. + + Vern + + +File: flex.info, Node: unnamed-faq-75, Next: unnamed-faq-76, Prev: unnamed-faq-74, Up: FAQ + +unnamed-faq-75 +============== + + + To: jimmey@lexis-nexis.com (Jimmey Todd) + Subject: Re: Flex performance question + In-reply-to: Your message of Thu, 19 Feb 1998 11:01:17 PST. + Date: Thu, 19 Feb 1998 15:42:25 PST + From: Vern Paxson <vern> + + So there are several problems. + + First, to go fast, you want to match as much text as possible, which + your scanners don't in the case that what they're scanning is *not* + a <RN> tag. So you want a rule like: + + [^<]+ + + Second, C++ scanners are particularly slow if they're interactive, + which they are by default. Using -B speeds it up by a factor of 3-4 + on my workstation. + + Third, C++ scanners that use the istream interface are slow, because + of how poorly implemented istream's are. I built two versions of + the following scanner: + + %% + .*\n + .* + %% + + and the C version inhales a 2.5MB file on my workstation in 0.8 seconds. + The C++ istream version, using -B, takes 3.8 seconds. + + Vern + + +File: flex.info, Node: unnamed-faq-76, Next: unnamed-faq-77, Prev: unnamed-faq-75, Up: FAQ + +unnamed-faq-76 +============== + + + To: "Frescatore, David (CRD, TAD)" <frescatore@exc01crdge.crd.ge.com> + Subject: Re: FLEX 2.5 & THE YEAR 2000 + In-reply-to: Your message of Wed, 03 Jun 1998 11:26:22 PDT. + Date: Wed, 03 Jun 1998 10:22:26 PDT + From: Vern Paxson <vern> + + > I am researching the Y2K problem with General Electric R&D + > and need to know if there are any known issues concerning + > the above mentioned software and Y2K regardless of version. + + There shouldn't be, all it ever does with the date is ask the system + for it and then print it out. + + Vern + + +File: flex.info, Node: unnamed-faq-77, Next: unnamed-faq-78, Prev: unnamed-faq-76, Up: FAQ + +unnamed-faq-77 +============== + + + To: "Hans Dermot Doran" <htd@ibhdoran.com> + Subject: Re: flex problem + In-reply-to: Your message of Wed, 15 Jul 1998 21:30:13 PDT. + Date: Tue, 21 Jul 1998 14:23:34 PDT + From: Vern Paxson <vern> + + > To overcome this, I gets() the stdin into a string and lex the string. The + > string is lexed OK except that the end of string isn't lexed properly + > (yy_scan_string()), that is the lexer dosn't recognise the end of string. + + Flex doesn't contain mechanisms for recognizing buffer endpoints. But if + you use fgets instead (which you should anyway, to protect against buffer + overflows), then the final \n will be preserved in the string, and you can + scan that in order to find the end of the string. + + Vern + + +File: flex.info, Node: unnamed-faq-78, Next: unnamed-faq-79, Prev: unnamed-faq-77, Up: FAQ + +unnamed-faq-78 +============== + + + To: soumen@almaden.ibm.com + Subject: Re: Flex++ 2.5.3 instance member vs. static member + In-reply-to: Your message of Mon, 27 Jul 1998 02:10:04 PDT. + Date: Tue, 28 Jul 1998 01:10:34 PDT + From: Vern Paxson <vern> + + > %{ + > int mylineno = 0; + > %} + > ws [ \t]+ + > alpha [A-Za-z] + > dig [0-9] + > %% + > + > Now you'd expect mylineno to be a member of each instance of class + > yyFlexLexer, but is this the case? A look at the lex.yy.cc file seems to + > indicate otherwise; unless I am missing something the declaration of + > mylineno seems to be outside any class scope. + > + > How will this work if I want to run a multi-threaded application with each + > thread creating a FlexLexer instance? + + Derive your own subclass and make mylineno a member variable of it. + + Vern + + +File: flex.info, Node: unnamed-faq-79, Next: unnamed-faq-80, Prev: unnamed-faq-78, Up: FAQ + +unnamed-faq-79 +============== + + + To: Adoram Rogel <adoram@hybridge.com> + Subject: Re: More than 32K states change hangs + In-reply-to: Your message of Tue, 04 Aug 1998 16:55:39 PDT. + Date: Tue, 04 Aug 1998 22:28:45 PDT + From: Vern Paxson <vern> + + > Vern Paxson, + > + > I followed your advice, posted on Usenet bu you, and emailed to me + > personally by you, on how to overcome the 32K states limit. I'm running + > on Linux machines. + > I took the full source of version 2.5.4 and did the following changes in + > flexdef.h: + > #define JAMSTATE -327660 + > #define MAXIMUM_MNS 319990 + > #define BAD_SUBSCRIPT -327670 + > #define MAX_SHORT 327000 + > + > and compiled. + > All looked fine, including check and bigcheck, so I installed. + + Hmmm, you shouldn't increase MAX_SHORT, though looking through my email + archives I see that I did indeed recommend doing so. Try setting it back + to 32700; that should suffice that you no longer need -Ca. If it still + hangs, then the interesting question is - where? + + > Compiling the same hanged program with a out-of-the-box (RedHat 4.2 + > distribution of Linux) + > flex 2.5.4 binary works. + + Since Linux comes with source code, you should diff it against what + you have to see what problems they missed. + + > Should I always compile with the -Ca option now ? even short and simple + > filters ? + + No, definitely not. It's meant to be for those situations where you + absolutely must squeeze every last cycle out of your scanner. + + Vern + + +File: flex.info, Node: unnamed-faq-80, Next: unnamed-faq-81, Prev: unnamed-faq-79, Up: FAQ + +unnamed-faq-80 +============== + + + To: "Schmackpfeffer, Craig" <Craig.Schmackpfeffer@usa.xerox.com> + Subject: Re: flex output for static code portion + In-reply-to: Your message of Tue, 11 Aug 1998 11:55:30 PDT. + Date: Mon, 17 Aug 1998 23:57:42 PDT + From: Vern Paxson <vern> + + > I would like to use flex under the hood to generate a binary file + > containing the data structures that control the parse. + + This has been on the wish-list for a long time. In principle it's + straight-forward - you redirect mkdata() et al's I/O to another file, + and modify the skeleton to have a start-up function that slurps these + into dynamic arrays. The concerns are (1) the scanner generation code + is hairy and full of corner cases, so it's easy to get surprised when + going down this path :-( ; and (2) being careful about buffering so + that when the tables change you make sure the scanner starts in the + correct state and reading at the right point in the input file. + + > I was wondering if you know of anyone who has used flex in this way. + + I don't - but it seems like a reasonable project to undertake (unlike + numerous other flex tweaks :-). + + Vern + + +File: flex.info, Node: unnamed-faq-81, Next: unnamed-faq-82, Prev: unnamed-faq-80, Up: FAQ + +unnamed-faq-81 +============== + + + Received: from 131.173.17.11 (131.173.17.11 [131.173.17.11]) + by ee.lbl.gov (8.9.1/8.9.1) with ESMTP id AAA03838 + for <vern@ee.lbl.gov>; Thu, 20 Aug 1998 00:47:57 -0700 (PDT) + Received: from hal.cl-ki.uni-osnabrueck.de (hal.cl-ki.Uni-Osnabrueck.DE [131.173.141.2]) + by deimos.rz.uni-osnabrueck.de (8.8.7/8.8.8) with ESMTP id JAA34694 + for <vern@ee.lbl.gov>; Thu, 20 Aug 1998 09:47:55 +0200 + Received: (from georg@localhost) by hal.cl-ki.uni-osnabrueck.de (8.6.12/8.6.12) id JAA34834 for vern@ee.lbl.gov; Thu, 20 Aug 1998 09:47:54 +0200 + From: Georg Rehm <georg@hal.cl-ki.uni-osnabrueck.de> + Message-Id: <199808200747.JAA34834@hal.cl-ki.uni-osnabrueck.de> + Subject: "flex scanner push-back overflow" + To: vern@ee.lbl.gov + Date: Thu, 20 Aug 1998 09:47:54 +0200 (MEST) + Reply-To: Georg.Rehm@CL-KI.Uni-Osnabrueck.DE + X-NoJunk: Do NOT send commercial mail, spam or ads to this address! + X-URL: http://www.cl-ki.uni-osnabrueck.de/~georg/ + X-Mailer: ELM [version 2.4ME+ PL28 (25)] + MIME-Version: 1.0 + Content-Type: text/plain; charset=US-ASCII + Content-Transfer-Encoding: 7bit + + Hi Vern, + + Yesterday, I encountered a strange problem: I use the macro processor m4 + to include some lengthy lists into a .l file. Following is a flex macro + definition that causes some serious pain in my neck: + + AUTHOR ("A. Boucard / L. Boucard"|"A. Dastarac / M. Levent"|"A.Boucaud / L.Boucaud"|"Abderrahim Lamchichi"|"Achmat Dangor"|"Adeline Toullier"|"Adewale Maja-Pearce"|"Ahmed Ziri"|"Akram Ellyas"|"Alain Bihr"|"Alain Gresh"|"Alain Guillemoles"|"Alain Joxe"|"Alain Morice"|"Alain Renon"|"Alain Zecchini"|"Albert Memmi"|"Alberto Manguel"|"Alex De Waal"|"Alfonso Artico"| [...]) + + The complete list contains about 10kB. When I try to "flex" this file + (on a Solaris 2.6 machine, using a modified flex 2.5.4 (I only increased + some of the predefined values in flexdefs.h) I get the error: + + myflex/flex -8 sentag.tmp.l + flex scanner push-back overflow + + When I remove the slashes in the macro definition everything works fine. + As I understand it, the double quotes escape the slash-character so it + really means "/" and not "trailing context". Furthermore, I tried to + escape the slashes with backslashes, but with no use, the same error message + appeared when flexing the code. + + Do you have an idea what's going on here? + + Greetings from Germany, + Georg + -- + Georg Rehm georg@cl-ki.uni-osnabrueck.de + Institute for Semantic Information Processing, University of Osnabrueck, FRG + + +File: flex.info, Node: unnamed-faq-82, Next: unnamed-faq-83, Prev: unnamed-faq-81, Up: FAQ + +unnamed-faq-82 +============== + + + To: Georg.Rehm@CL-KI.Uni-Osnabrueck.DE + Subject: Re: "flex scanner push-back overflow" + In-reply-to: Your message of Thu, 20 Aug 1998 09:47:54 PDT. + Date: Thu, 20 Aug 1998 07:05:35 PDT + From: Vern Paxson <vern> + + > myflex/flex -8 sentag.tmp.l + > flex scanner push-back overflow + + Flex itself uses a flex scanner. That scanner is running out of buffer + space when it tries to unput() the humongous macro you've defined. When + you remove the '/'s, you make it small enough so that it fits in the buffer; + removing spaces would do the same thing. + + The fix is to either rethink how come you're using such a big macro and + perhaps there's another/better way to do it; or to rebuild flex's own + scan.c with a larger value for + + #define YY_BUF_SIZE 16384 + + - Vern + + +File: flex.info, Node: unnamed-faq-83, Next: unnamed-faq-84, Prev: unnamed-faq-82, Up: FAQ + +unnamed-faq-83 +============== + + + To: Jan Kort <jan@research.techforce.nl> + Subject: Re: Flex + In-reply-to: Your message of Fri, 04 Sep 1998 12:18:43 +0200. + Date: Sat, 05 Sep 1998 00:59:49 PDT + From: Vern Paxson <vern> + + > %% + > + > "TEST1\n" { fprintf(stderr, "TEST1\n"); yyless(5); } + > ^\n { fprintf(stderr, "empty line\n"); } + > . { } + > \n { fprintf(stderr, "new line\n"); } + > + > %% + > -- input --------------------------------------- + > TEST1 + > -- output -------------------------------------- + > TEST1 + > empty line + > ------------------------------------------------ + + IMHO, it's not clear whether or not this is in fact a bug. It depends + on whether you view yyless() as backing up in the input stream, or as + pushing new characters onto the beginning of the input stream. Flex + interprets it as the latter (for implementation convenience, I'll admit), + and so considers the newline as in fact matching at the beginning of a + line, as after all the last token scanned an entire line and so the + scanner is now at the beginning of a new line. + + I agree that this is counter-intuitive for yyless(), given its + functional description (it's less so for unput(), depending on whether + you're unput()'ing new text or scanned text). But I don't plan to + change it any time soon, as it's a pain to do so. Consequently, + you do indeed need to use yy_set_bol() and YY_AT_BOL() to tweak + your scanner into the behavior you desire. + + Sorry for the less-than-completely-satisfactory answer. + + Vern + + +File: flex.info, Node: unnamed-faq-84, Next: unnamed-faq-85, Prev: unnamed-faq-83, Up: FAQ + +unnamed-faq-84 +============== + + + To: Patrick Krusenotto <krusenot@mac-info-link.de> + Subject: Re: Problems with restarting flex-2.5.2-generated scanner + In-reply-to: Your message of Thu, 24 Sep 1998 10:14:07 PDT. + Date: Thu, 24 Sep 1998 23:28:43 PDT + From: Vern Paxson <vern> + + > I am using flex-2.5.2 and bison 1.25 for Solaris and I am desperately + > trying to make my scanner restart with a new file after my parser stops + > with a parse error. When my compiler restarts, the parser always + > receives the token after the token (in the old file!) that caused the + > parser error. + + I suspect the problem is that your parser has read ahead in order + to attempt to resolve an ambiguity, and when it's restarted it picks + up with that token rather than reading a fresh one. If you're using + yacc, then the special "error" production can sometimes be used to + consume tokens in an attempt to get the parser into a consistent state. + + Vern + + +File: flex.info, Node: unnamed-faq-85, Next: unnamed-faq-86, Prev: unnamed-faq-84, Up: FAQ + +unnamed-faq-85 +============== + + + To: Henric Jungheim <junghelh@pe-nelson.com> + Subject: Re: flex 2.5.4a + In-reply-to: Your message of Tue, 27 Oct 1998 16:41:42 PST. + Date: Tue, 27 Oct 1998 16:50:14 PST + From: Vern Paxson <vern> + + > This brings up a feature request: How about a command line + > option to specify the filename when reading from stdin? That way one + > doesn't need to create a temporary file in order to get the "#line" + > directives to make sense. + + Use -o combined with -t (per the man page description of -o). + + > P.S., Is there any simple way to use non-blocking IO to parse multiple + > streams? + + Simple, no. + + One approach might be to return a magic character on EWOULDBLOCK and + have a rule + + .*<magic-character> // put back .*, eat magic character + + This is off the top of my head, not sure it'll work. + + Vern + + +File: flex.info, Node: unnamed-faq-86, Next: unnamed-faq-87, Prev: unnamed-faq-85, Up: FAQ + +unnamed-faq-86 +============== + + + To: "Repko, Billy D" <billy.d.repko@intel.com> + Subject: Re: Compiling scanners + In-reply-to: Your message of Wed, 13 Jan 1999 10:52:47 PST. + Date: Thu, 14 Jan 1999 00:25:30 PST + From: Vern Paxson <vern> + + > It appears that maybe it cannot find the lfl library. + + The Makefile in the distribution builds it, so you should have it. + It's exceedingly trivial, just a main() that calls yylex() and + a yyrap() that always returns 1. + + > %% + > \n ++num_lines; ++num_chars; + > . ++num_chars; + + You can't indent your rules like this - that's where the errors are coming + from. Flex copies indented text to the output file, it's how you do things + like + + int num_lines_seen = 0; + + to declare local variables. + + Vern + + +File: flex.info, Node: unnamed-faq-87, Next: unnamed-faq-88, Prev: unnamed-faq-86, Up: FAQ + +unnamed-faq-87 +============== + + + To: Erick Branderhorst <Erick.Branderhorst@asml.nl> + Subject: Re: flex input buffer + In-reply-to: Your message of Tue, 09 Feb 1999 13:53:46 PST. + Date: Tue, 09 Feb 1999 21:03:37 PST + From: Vern Paxson <vern> + + > In the flex.skl file the size of the default input buffers is set. Can you + > explain why this size is set and why it is such a high number. + + It's large to optimize performance when scanning large files. You can + safely make it a lot lower if needed. + + Vern + + +File: flex.info, Node: unnamed-faq-88, Next: unnamed-faq-90, Prev: unnamed-faq-87, Up: FAQ + +unnamed-faq-88 +============== + + + To: "Guido Minnen" <guidomi@cogs.susx.ac.uk> + Subject: Re: Flex error message + In-reply-to: Your message of Wed, 24 Feb 1999 15:31:46 PST. + Date: Thu, 25 Feb 1999 00:11:31 PST + From: Vern Paxson <vern> + + > I'm extending a larger scanner written in Flex and I keep running into + > problems. More specifically, I get the error message: + > "flex: input rules are too complicated (>= 32000 NFA states)" + + Increase the definitions in flexdef.h for: + + #define JAMSTATE -32766 /* marks a reference to the state that always j + ams */ + #define MAXIMUM_MNS 31999 + #define BAD_SUBSCRIPT -32767 + + recompile everything, and it should all work. + + Vern + + +File: flex.info, Node: unnamed-faq-90, Next: unnamed-faq-91, Prev: unnamed-faq-88, Up: FAQ + +unnamed-faq-90 +============== + + + To: "Dmitriy Goldobin" <gold@ems.chel.su> + Subject: Re: FLEX trouble + In-reply-to: Your message of Mon, 31 May 1999 18:44:49 PDT. + Date: Tue, 01 Jun 1999 00:15:07 PDT + From: Vern Paxson <vern> + + > I have a trouble with FLEX. Why rule "/*".*"*/" work properly,=20 + > but rule "/*"(.|\n)*"*/" don't work ? + + The second of these will have to scan the entire input stream (because + "(.|\n)*" matches an arbitrary amount of any text) in order to see if + it ends with "*/", terminating the comment. That potentially will overflow + the input buffer. + + > More complex rule "/*"([^*]|(\*/[^/]))*"*/ give an error + > 'unrecognized rule'. + + You can't use the '/' operator inside parentheses. It's not clear + what "(a/b)*" actually means. + + > I now use workaround with state <comment>, but single-rule is + > better, i think. + + Single-rule is nice but will always have the problem of either setting + restrictions on comments (like not allowing multi-line comments) and/or + running the risk of consuming the entire input stream, as noted above. + + Vern + + +File: flex.info, Node: unnamed-faq-91, Next: unnamed-faq-92, Prev: unnamed-faq-90, Up: FAQ + +unnamed-faq-91 +============== + + + Received: from mc-qout4.whowhere.com (mc-qout4.whowhere.com [209.185.123.18]) + by ee.lbl.gov (8.9.3/8.9.3) with SMTP id IAA05100 + for <vern@ee.lbl.gov>; Tue, 15 Jun 1999 08:56:06 -0700 (PDT) + Received: from Unknown/Local ([?.?.?.?]) by my-deja.com; Tue Jun 15 08:55:43 1999 + To: vern@ee.lbl.gov + Date: Tue, 15 Jun 1999 08:55:43 -0700 + From: "Aki Niimura" <neko@my-deja.com> + Message-ID: <KNONDOHDOBGAEAAA@my-deja.com> + Mime-Version: 1.0 + Cc: + X-Sent-Mail: on + Reply-To: + X-Mailer: MailCity Service + Subject: A question on flex C++ scanner + X-Sender-Ip: 12.72.207.61 + Organization: My Deja Email (http://www.my-deja.com:80) + Content-Type: text/plain; charset=us-ascii + Content-Transfer-Encoding: 7bit + + Dear Dr. Paxon, + + I have been using flex for years. + It works very well on many projects. + Most case, I used it to generate a scanner on C language. + However, one project I needed to generate a scanner + on C++ lanuage. Thanks to your enhancement, flex did + the job. + + Currently, I'm working on enhancing my previous project. + I need to deal with multiple input streams (recursive + inclusion) in this scanner (C++). + I did similar thing for another scanner (C) as you + explained in your documentation. + + The generated scanner (C++) has necessary methods: + - switch_to_buffer(struct yy_buffer_state *b) + - yy_create_buffer(istream *is, int sz) + - yy_delete_buffer(struct yy_buffer_state *b) + + However, I couldn't figure out how to access current + buffer (yy_current_buffer). + + yy_current_buffer is a protected member of yyFlexLexer. + I can't access it directly. + Then, I thought yy_create_buffer() with is = 0 might + return current stream buffer. But it seems not as far + as I checked the source. (flex 2.5.4) + + I went through the Web in addition to Flex documentation. + However, it hasn't been successful, so far. + + It is not my intention to bother you, but, can you + comment about how to obtain the current stream buffer? + + Your response would be highly appreciated. + + Best regards, + Aki Niimura + + --== Sent via Deja.com http://www.deja.com/ ==-- + Share what you know. Learn what you don't. + + +File: flex.info, Node: unnamed-faq-92, Next: unnamed-faq-93, Prev: unnamed-faq-91, Up: FAQ + +unnamed-faq-92 +============== + + + To: neko@my-deja.com + Subject: Re: A question on flex C++ scanner + In-reply-to: Your message of Tue, 15 Jun 1999 08:55:43 PDT. + Date: Tue, 15 Jun 1999 09:04:24 PDT + From: Vern Paxson <vern> + + > However, I couldn't figure out how to access current + > buffer (yy_current_buffer). + + Derive your own subclass from yyFlexLexer. + + Vern + + +File: flex.info, Node: unnamed-faq-93, Next: unnamed-faq-94, Prev: unnamed-faq-92, Up: FAQ + +unnamed-faq-93 +============== + + + To: "Stones, Darren" <Darren.Stones@nectech.co.uk> + Subject: Re: You're the man to see? + In-reply-to: Your message of Wed, 23 Jun 1999 11:10:29 PDT. + Date: Wed, 23 Jun 1999 09:01:40 PDT + From: Vern Paxson <vern> + + > I hope you can help me. I am using Flex and Bison to produce an interpreted + > language. However all goes well until I try to implement an IF statement or + > a WHILE. I cannot get this to work as the parser parses all the conditions + > eg. the TRUE and FALSE conditons to check for a rule match. So I cannot + > make a decision!! + + You need to use the parser to build a parse tree (= abstract syntax trwee), + and when that's all done you recursively evaluate the tree, binding variables + to values at that time. + + Vern + + +File: flex.info, Node: unnamed-faq-94, Next: unnamed-faq-95, Prev: unnamed-faq-93, Up: FAQ + +unnamed-faq-94 +============== + + + To: Petr Danecek <petr@ics.cas.cz> + Subject: Re: flex - question + In-reply-to: Your message of Mon, 28 Jun 1999 19:21:41 PDT. + Date: Fri, 02 Jul 1999 16:52:13 PDT + From: Vern Paxson <vern> + + > file, it takes an enormous amount of time. It is funny, because the + > source code has only 12 rules!!! I think it looks like an exponencial + > growth. + + Right, that's the problem - some patterns (those with a lot of + ambiguity, where yours has because at any given time the scanner can + be in the middle of all sorts of combinations of the different + rules) blow up exponentially. + + For your rules, there is an easy fix. Change the ".*" that comes fater + the directory name to "[^ ]*". With that in place, the rules are no + longer nearly so ambiguous, because then once one of the directories + has been matched, no other can be matched (since they all require a + leading blank). + + If that's not an acceptable solution, then you can enter a start state + to pick up the .*\n after each directory is matched. + + Also note that for speed, you'll want to add a ".*" rule at the end, + otherwise rules that don't match any of the patterns will be matched + very slowly, a character at a time. + + Vern + + +File: flex.info, Node: unnamed-faq-95, Next: unnamed-faq-96, Prev: unnamed-faq-94, Up: FAQ + +unnamed-faq-95 +============== + + + To: Tielman Koekemoer <tielman@spi.co.za> + Subject: Re: Please help. + In-reply-to: Your message of Thu, 08 Jul 1999 13:20:37 PDT. + Date: Thu, 08 Jul 1999 08:20:39 PDT + From: Vern Paxson <vern> + + > I was hoping you could help me with my problem. + > + > I tried compiling (gnu)flex on a Solaris 2.4 machine + > but when I ran make (after configure) I got an error. + > + > -------------------------------------------------------------- + > gcc -c -I. -I. -g -O parse.c + > ./flex -t -p ./scan.l >scan.c + > sh: ./flex: not found + > *** Error code 1 + > make: Fatal error: Command failed for target `scan.c' + > ------------------------------------------------------------- + > + > What's strange to me is that I'm only + > trying to install flex now. I then edited the Makefile to + > and changed where it says "FLEX = flex" to "FLEX = lex" + > ( lex: the native Solaris one ) but then it complains about + > the "-p" option. Is there any way I can compile flex without + > using flex or lex? + > + > Thanks so much for your time. + + You managed to step on the bootstrap sequence, which first copies + initscan.c to scan.c in order to build flex. Try fetching a fresh + distribution from ftp.ee.lbl.gov. (Or you can first try removing + ".bootstrap" and doing a make again.) + + Vern + + +File: flex.info, Node: unnamed-faq-96, Next: unnamed-faq-97, Prev: unnamed-faq-95, Up: FAQ + +unnamed-faq-96 +============== + + + To: Tielman Koekemoer <tielman@spi.co.za> + Subject: Re: Please help. + In-reply-to: Your message of Fri, 09 Jul 1999 09:16:14 PDT. + Date: Fri, 09 Jul 1999 00:27:20 PDT + From: Vern Paxson <vern> + + > First I removed .bootstrap (and ran make) - no luck. I downloaded the + > software but I still have the same problem. Is there anything else I + > could try. + + Try: + + cp initscan.c scan.c + touch scan.c + make scan.o + + If this last tries to first build scan.c from scan.l using ./flex, then + your "make" is broken, in which case compile scan.c to scan.o by hand. + + Vern + + +File: flex.info, Node: unnamed-faq-97, Next: unnamed-faq-98, Prev: unnamed-faq-96, Up: FAQ + +unnamed-faq-97 +============== + + + To: Sumanth Kamenani <skamenan@crl.nmsu.edu> + Subject: Re: Error + In-reply-to: Your message of Mon, 19 Jul 1999 23:08:41 PDT. + Date: Tue, 20 Jul 1999 00:18:26 PDT + From: Vern Paxson <vern> + + > I am getting a compilation error. The error is given as "unknown symbol- yylex". + + The parser relies on calling yylex(), but you're instead using the C++ scanning + class, so you need to supply a yylex() "glue" function that calls an instance + scanner of the scanner (e.g., "scanner->yylex()"). + + Vern + + +File: flex.info, Node: unnamed-faq-98, Next: unnamed-faq-99, Prev: unnamed-faq-97, Up: FAQ + +unnamed-faq-98 +============== + + + To: daniel@synchrods.synchrods.COM (Daniel Senderowicz) + Subject: Re: lex + In-reply-to: Your message of Mon, 22 Nov 1999 11:19:04 PST. + Date: Tue, 23 Nov 1999 15:54:30 PST + From: Vern Paxson <vern> + + Well, your problem is the + + switch (yybgin-yysvec-1) { /* witchcraft */ + + at the beginning of lex rules. "witchcraft" == "non-portable". It's + assuming knowledge of the AT&T lex's internal variables. + + For flex, you can probably do the equivalent using a switch on YYSTATE. + + Vern + + +File: flex.info, Node: unnamed-faq-99, Next: unnamed-faq-100, Prev: unnamed-faq-98, Up: FAQ + +unnamed-faq-99 +============== + + + To: archow@hss.hns.com + Subject: Re: Regarding distribution of flex and yacc based grammars + In-reply-to: Your message of Sun, 19 Dec 1999 17:50:24 +0530. + Date: Wed, 22 Dec 1999 01:56:24 PST + From: Vern Paxson <vern> + + > When we provide the customer with an object code distribution, is it + > necessary for us to provide source + > for the generated C files from flex and bison since they are generated by + > flex and bison ? + + For flex, no. I don't know what the current state of this is for bison. + + > Also, is there any requrirement for us to neccessarily provide source for + > the grammar files which are fed into flex and bison ? + + Again, for flex, no. + + See the file "COPYING" in the flex distribution for the legalese. + + Vern + + +File: flex.info, Node: unnamed-faq-100, Next: unnamed-faq-101, Prev: unnamed-faq-99, Up: FAQ + +unnamed-faq-100 +=============== + + + To: Martin Gallwey <gallweym@hyperion.moe.ul.ie> + Subject: Re: Flex, and self referencing rules + In-reply-to: Your message of Sun, 20 Feb 2000 01:01:21 PST. + Date: Sat, 19 Feb 2000 18:33:16 PST + From: Vern Paxson <vern> + + > However, I do not use unput anywhere. I do use self-referencing + > rules like this: + > + > UnaryExpr ({UnionExpr})|("-"{UnaryExpr}) + + You can't do this - flex is *not* a parser like yacc (which does indeed + allow recursion), it is a scanner that's confined to regular expressions. + + Vern + + +File: flex.info, Node: unnamed-faq-101, Next: What is the difference between YYLEX_PARAM and YY_DECL?, Prev: unnamed-faq-100, Up: FAQ + +unnamed-faq-101 +=============== + + + To: slg3@lehigh.edu (SAMUEL L. GULDEN) + Subject: Re: Flex problem + In-reply-to: Your message of Thu, 02 Mar 2000 12:29:04 PST. + Date: Thu, 02 Mar 2000 23:00:46 PST + From: Vern Paxson <vern> + + If this is exactly your program: + + > digit [0-9] + > digits {digit}+ + > whitespace [ \t\n]+ + > + > %% + > "[" { printf("open_brac\n");} + > "]" { printf("close_brac\n");} + > "+" { printf("addop\n");} + > "*" { printf("multop\n");} + > {digits} { printf("NUMBER = %s\n", yytext);} + > whitespace ; + + then the problem is that the last rule needs to be "{whitespace}" ! + + Vern + + +File: flex.info, Node: What is the difference between YYLEX_PARAM and YY_DECL?, Next: Why do I get "conflicting types for yylex" error?, Prev: unnamed-faq-101, Up: FAQ + +What is the difference between YYLEX_PARAM and YY_DECL? +======================================================= + +YYLEX_PARAM is not a flex symbol. It is for Bison. It tells Bison to +pass extra params when it calls yylex() from the parser. + + YY_DECL is the Flex declaration of yylex. The default is similar to +this: + + + #define int yy_lex () + + +File: flex.info, Node: Why do I get "conflicting types for yylex" error?, Next: How do I access the values set in a Flex action from within a Bison action?, Prev: What is the difference between YYLEX_PARAM and YY_DECL?, Up: FAQ + +Why do I get "conflicting types for yylex" error? +================================================= + +This is a compiler error regarding a generated Bison parser, not a Flex +scanner. It means you need a prototype of yylex() in the top of the +Bison file. Be sure the prototype matches YY_DECL. + + +File: flex.info, Node: How do I access the values set in a Flex action from within a Bison action?, Prev: Why do I get "conflicting types for yylex" error?, Up: FAQ + +How do I access the values set in a Flex action from within a Bison action? +=========================================================================== + +With $1, $2, $3, etc. These are called "Semantic Values" in the Bison +manual. See *Note Top: (bison)Top. + + +File: flex.info, Node: Appendices, Next: Indices, Prev: FAQ, Up: Top + +Appendix A Appendices +********************* + +* Menu: + +* Makefiles and Flex:: +* Bison Bridge:: +* M4 Dependency:: +* Common Patterns:: + + +File: flex.info, Node: Makefiles and Flex, Next: Bison Bridge, Prev: Appendices, Up: Appendices + +A.1 Makefiles and Flex +====================== + +In this appendix, we provide tips for writing Makefiles to build your +scanners. + + In a traditional build environment, we say that the `.c' files are +the sources, and the `.o' files are the intermediate files. When using +`flex', however, the `.l' files are the sources, and the generated `.c' +files (along with the `.o' files) are the intermediate files. This +requires you to carefully plan your Makefile. + + Modern `make' programs understand that `foo.l' is intended to +generate `lex.yy.c' or `foo.c', and will behave accordingly(1)(2). The +following Makefile does not explicitly instruct `make' how to build +`foo.c' from `foo.l'. Instead, it relies on the implicit rules of the +`make' program to build the intermediate file, `scan.c': + + + # Basic Makefile -- relies on implicit rules + # Creates "myprogram" from "scan.l" and "myprogram.c" + # + LEX=flex + myprogram: scan.o myprogram.o + scan.o: scan.l + + For simple cases, the above may be sufficient. For other cases, you +may have to explicitly instruct `make' how to build your scanner. The +following is an example of a Makefile containing explicit rules: + + + # Basic Makefile -- provides explicit rules + # Creates "myprogram" from "scan.l" and "myprogram.c" + # + LEX=flex + myprogram: scan.o myprogram.o + $(CC) -o $@ $(LDFLAGS) $^ + + myprogram.o: myprogram.c + $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $^ + + scan.o: scan.c + $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $^ + + scan.c: scan.l + $(LEX) $(LFLAGS) -o $@ $^ + + clean: + $(RM) *.o scan.c + + Notice in the above example that `scan.c' is in the `clean' target. +This is because we consider the file `scan.c' to be an intermediate +file. + + Finally, we provide a realistic example of a `flex' scanner used +with a `bison' parser(3). There is a tricky problem we have to deal +with. Since a `flex' scanner will typically include a header file +(e.g., `y.tab.h') generated by the parser, we need to be sure that the +header file is generated BEFORE the scanner is compiled. We handle this +case in the following example: + + + # Makefile example -- scanner and parser. + # Creates "myprogram" from "scan.l", "parse.y", and "myprogram.c" + # + LEX = flex + YACC = bison -y + YFLAGS = -d + objects = scan.o parse.o myprogram.o + + myprogram: $(objects) + scan.o: scan.l parse.c + parse.o: parse.y + myprogram.o: myprogram.c + + In the above example, notice the line, + + + scan.o: scan.l parse.c + + , which lists the file `parse.c' (the generated parser) as a +dependency of `scan.o'. We want to ensure that the parser is created +before the scanner is compiled, and the above line seems to do the +trick. Feel free to experiment with your specific implementation of +`make'. + + For more details on writing Makefiles, see *Note Top: (make)Top. + + ---------- Footnotes ---------- + + (1) GNU `make' and GNU `automake' are two such programs that provide +implicit rules for flex-generated scanners. + + (2) GNU `automake' may generate code to execute flex in +lex-compatible mode, or to stdout. If this is not what you want, then +you should provide an explicit rule in your Makefile.am + + (3) This example also applies to yacc parsers. + + +File: flex.info, Node: Bison Bridge, Next: M4 Dependency, Prev: Makefiles and Flex, Up: Appendices + +A.2 C Scanners with Bison Parsers +================================= + +This section describes the `flex' features useful when integrating +`flex' with `GNU bison'(1). Skip this section if you are not using +`bison' with your scanner. Here we discuss only the `flex' half of the +`flex' and `bison' pair. We do not discuss `bison' in any detail. For +more information about generating `bison' parsers, see *Note Top: +(bison)Top. + + A compatible `bison' scanner is generated by declaring `%option +bison-bridge' or by supplying `--bison-bridge' when invoking `flex' +from the command line. This instructs `flex' that the macro `yylval' +may be used. The data type for `yylval', `YYSTYPE', is typically +defined in a header file, included in section 1 of the `flex' input +file. For a list of functions and macros available, *Note +bison-functions::. + + The declaration of yylex becomes, + + + int yylex ( YYSTYPE * lvalp, yyscan_t scanner ); + + If `%option bison-locations' is specified, then the declaration +becomes, + + + int yylex ( YYSTYPE * lvalp, YYLTYPE * llocp, yyscan_t scanner ); + + Note that the macros `yylval' and `yylloc' evaluate to pointers. +Support for `yylloc' is optional in `bison', so it is optional in +`flex' as well. The following is an example of a `flex' scanner that is +compatible with `bison'. + + + /* Scanner for "C" assignment statements... sort of. */ + %{ + #include "y.tab.h" /* Generated by bison. */ + %} + + %option bison-bridge bison-locations + % + + [[:digit:]]+ { yylval->num = atoi(yytext); return NUMBER;} + [[:alnum:]]+ { yylval->str = strdup(yytext); return STRING;} + "="|";" { return yytext[0];} + . {} + % + + As you can see, there really is no magic here. We just use `yylval' +as we would any other variable. The data type of `yylval' is generated +by `bison', and included in the file `y.tab.h'. Here is the +corresponding `bison' parser: + + + /* Parser to convert "C" assignments to lisp. */ + %{ + /* Pass the argument to yyparse through to yylex. */ + #define YYPARSE_PARAM scanner + #define YYLEX_PARAM scanner + %} + %locations + %pure_parser + %union { + int num; + char* str; + } + %token <str> STRING + %token <num> NUMBER + %% + assignment: + STRING '=' NUMBER ';' { + printf( "(setf %s %d)", $1, $3 ); + } + ; + + ---------- Footnotes ---------- + + (1) The features described here are purely optional, and are by no +means the only way to use flex with bison. We merely provide some glue +to ease development of your parser-scanner pair. + + +File: flex.info, Node: M4 Dependency, Next: Common Patterns, Prev: Bison Bridge, Up: Appendices + +A.3 M4 Dependency +================= + +The macro processor `m4'(1) must be installed wherever flex is +installed. `flex' invokes `m4', found by searching the directories in +the `PATH' environment variable. Any code you place in section 1 or in +the actions will be sent through m4. Please follow these rules to +protect your code from unwanted `m4' processing. + + * Do not use symbols that begin with, `m4_', such as, `m4_define', + or `m4_include', since those are reserved for `m4' macro names. If + for some reason you need m4_ as a prefix, use a preprocessor + #define to get your symbol past m4 unmangled. + + * Do not use the strings `[[' or `]]' anywhere in your code. The + former is not valid in C, except within comments and strings, but + the latter is valid in code such as `x[y[z]]'. The solution is + simple. To get the literal string `"]]"', use `"]""]"'. To get the + array notation `x[y[z]]', use `x[y[z] ]'. Flex will attempt to + detect these sequences in user code, and escape them. However, + it's best to avoid this complexity where possible, by removing + such sequences from your code. + + + `m4' is only required at the time you run `flex'. The generated +scanner is ordinary C or C++, and does _not_ require `m4'. + + ---------- Footnotes ---------- + + (1) The use of m4 is subject to change in future revisions of flex. +It is not part of the public API of flex. Do not depend on it. + + +File: flex.info, Node: Common Patterns, Prev: M4 Dependency, Up: Appendices + +A.4 Common Patterns +=================== + +This appendix provides examples of common regular expressions you might +use in your scanner. + +* Menu: + +* Numbers:: +* Identifiers:: +* Quoted Constructs:: +* Addresses:: + + +File: flex.info, Node: Numbers, Next: Identifiers, Up: Common Patterns + +A.4.1 Numbers +------------- + +C99 decimal constant + `([[:digit:]]{-}[0])[[:digit:]]*' + +C99 hexadecimal constant + `0[xX][[:xdigit:]]+' + +C99 octal constant + `0[0123456]*' + +C99 floating point constant + + {dseq} ([[:digit:]]+) + {dseq_opt} ([[:digit:]]*) + {frac} (({dseq_opt}"."{dseq})|{dseq}".") + {exp} ([eE][+-]?{dseq}) + {exp_opt} ({exp}?) + {fsuff} [flFL] + {fsuff_opt} ({fsuff}?) + {hpref} (0[xX]) + {hdseq} ([[:xdigit:]]+) + {hdseq_opt} ([[:xdigit:]]*) + {hfrac} (({hdseq_opt}"."{hdseq})|({hdseq}".")) + {bexp} ([pP][+-]?{dseq}) + {dfc} (({frac}{exp_opt}{fsuff_opt})|({dseq}{exp}{fsuff_opt})) + {hfc} (({hpref}{hfrac}{bexp}{fsuff_opt})|({hpref}{hdseq}{bexp}{fsuff_opt})) + + {c99_floating_point_constant} ({dfc}|{hfc}) + + See C99 section 6.4.4.2 for the gory details. + + + +File: flex.info, Node: Identifiers, Next: Quoted Constructs, Prev: Numbers, Up: Common Patterns + +A.4.2 Identifiers +----------------- + +C99 Identifier + + ucn ((\\u([[:xdigit:]]{4}))|(\\U([[:xdigit:]]{8}))) + nondigit [_[:alpha:]] + c99_id ([_[:alpha:]]|{ucn})([_[:alnum:]]|{ucn})* + + Technically, the above pattern does not encompass all possible C99 + identifiers, since C99 allows for "implementation-defined" + characters. In practice, C compilers follow the above pattern, + with the addition of the `$' character. + +UTF-8 Encoded Unicode Code Point + + [\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF]([\x80-\xBF]{2})|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF]([\x80-\xBF]{2})|[\xF1-\xF3]([\x80-\xBF]{3})|\xF4[\x80-\x8F]([\x80-\xBF]{2}) + + + +File: flex.info, Node: Quoted Constructs, Next: Addresses, Prev: Identifiers, Up: Common Patterns + +A.4.3 Quoted Constructs +----------------------- + +C99 String Literal + `L?\"([^\"\\\n]|(\\['\"?\\abfnrtv])|(\\([0123456]{1,3}))|(\\x[[:xdigit:]]+)|(\\u([[:xdigit:]]{4}))|(\\U([[:xdigit:]]{8})))*\"' + +C99 Comment + `("/*"([^*]|"*"[^/])*"*/")|("/"(\\\n)*"/"[^\n]*)' + + Note that in C99, a `//'-style comment may be split across lines, + and, contrary to popular belief, does not include the trailing + `\n' character. + + A better way to scan `/* */' comments is by line, rather than + matching possibly huge comments all at once. This will allow you + to scan comments of unlimited length, as long as line breaks + appear at sane intervals. This is also more efficient when used + with automatic line number processing. *Note option-yylineno::. + + + <INITIAL>{ + "/*" BEGIN(COMMENT); + } + <COMMENT>{ + "*/" BEGIN(0); + [^*\n]+ ; + "*"[^/] ; + \n ; + } + + + +File: flex.info, Node: Addresses, Prev: Quoted Constructs, Up: Common Patterns + +A.4.4 Addresses +--------------- + +IPv4 Address + `(([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3}))' + +IPv6 Address + + hex4 ([[:xdigit:]]{1,4}) + hexseq ({hex4}(:{hex4}*)) + hexpart ({hexseq}|({hexseq}::({hexseq}?))|::{hexseq}) + IPv6address ({hexpart}(":"{IPv4address})?) + + See RFC2373 for details. + +URI + `(([^:/?#]+):)?("//"([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?' + + This pattern is nearly useless, since it allows just about any + character to appear in a URI, including spaces and control + characters. See RFC2396 for details. + + + +File: flex.info, Node: Indices, Prev: Appendices, Up: Top + +Indices +******* + +* Menu: + +* Concept Index:: +* Index of Functions and Macros:: +* Index of Variables:: +* Index of Data Types:: +* Index of Hooks:: +* Index of Scanner Options:: + diff --git a/doc/flex.info-2 b/doc/flex.info-2 Binary files differnew file mode 100644 index 000000000000..27cffbdae392 --- /dev/null +++ b/doc/flex.info-2 diff --git a/doc/mdate-sh b/doc/mdate-sh new file mode 100755 index 000000000000..cd916c0a3400 --- /dev/null +++ b/doc/mdate-sh @@ -0,0 +1,201 @@ +#!/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/doc/stamp-vti b/doc/stamp-vti new file mode 100644 index 000000000000..46b5982bf242 --- /dev/null +++ b/doc/stamp-vti @@ -0,0 +1,4 @@ +@set UPDATED 10 September 2007 +@set UPDATED-MONTH September 2007 +@set EDITION 2.5.35 +@set VERSION 2.5.35 diff --git a/usr.bin/lex/ecs.c b/ecs.c index 10b167c5898c..e2abbe486239 100644 --- a/usr.bin/lex/ecs.c +++ b/ecs.c @@ -1,43 +1,46 @@ /* ecs - equivalence class routines */ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ -/* $Header: /home/daffy/u0/vern/flex/RCS/ecs.c,v 2.9 93/12/07 10:18:20 vern Exp $ */ #include "flexdef.h" /* ccl2ecl - convert character classes to set of equivalence classes */ -void ccl2ecl() - { - int i, ich, newlen, cclp, ccls, cclmec; +void ccl2ecl () +{ + int i, ich, newlen, cclp, ccls, cclmec; - for ( i = 1; i <= lastccl; ++i ) - { + for (i = 1; i <= lastccl; ++i) { /* We loop through each character class, and for each character * in the class, add the character's equivalence class to the * new "character" class we are creating. Thus when we are all @@ -48,21 +51,19 @@ void ccl2ecl() newlen = 0; cclp = cclmap[i]; - for ( ccls = 0; ccls < ccllen[i]; ++ccls ) - { + for (ccls = 0; ccls < ccllen[i]; ++ccls) { ich = ccltbl[cclp + ccls]; cclmec = ecgroup[ich]; - if ( cclmec > 0 ) - { + if (cclmec > 0) { ccltbl[cclp + newlen] = cclmec; ++newlen; - } } + } ccllen[i] = newlen; - } } +} /* cre8ecs - associate equivalence class numbers with class members @@ -73,10 +74,10 @@ void ccl2ecl() * Returned is the number of classes. */ -int cre8ecs( fwd, bck, num ) -int fwd[], bck[], num; - { - int i, j, numcl; +int cre8ecs (fwd, bck, num) + int fwd[], bck[], num; +{ + int i, j, numcl; numcl = 0; @@ -85,16 +86,15 @@ int fwd[], bck[], num; * is positive, then x is the representative of its equivalence * class. */ - for ( i = 1; i <= num; ++i ) - if ( bck[i] == NIL ) - { + for (i = 1; i <= num; ++i) + if (bck[i] == NIL) { bck[i] = ++numcl; - for ( j = fwd[i]; j != NIL; j = fwd[j] ) + for (j = fwd[i]; j != NIL; j = fwd[j]) bck[j] = -numcl; - } + } return numcl; - } +} /* mkeccl - update equivalence classes based on character class xtions @@ -112,12 +112,12 @@ int fwd[], bck[], num; * NUL_mapping is the value which NUL (0) should be mapped to. */ -void mkeccl( ccls, lenccl, fwd, bck, llsiz, NUL_mapping ) -Char ccls[]; -int lenccl, fwd[], bck[], llsiz, NUL_mapping; - { - int cclp, oldec, newec; - int cclm, i, j; +void mkeccl (ccls, lenccl, fwd, bck, llsiz, NUL_mapping) + Char ccls[]; + int lenccl, fwd[], bck[], llsiz, NUL_mapping; +{ + int cclp, oldec, newec; + int cclm, i, j; static unsigned char cclflags[CSIZE]; /* initialized to all '\0' */ /* Note that it doesn't matter whether or not the character class is @@ -126,11 +126,10 @@ int lenccl, fwd[], bck[], llsiz, NUL_mapping; cclp = 0; - while ( cclp < lenccl ) - { + while (cclp < lenccl) { cclm = ccls[cclp]; - if ( NUL_mapping && cclm == 0 ) + if (NUL_mapping && cclm == 0) cclm = NUL_mapping; oldec = bck[cclm]; @@ -138,22 +137,19 @@ int lenccl, fwd[], bck[], llsiz, NUL_mapping; j = cclp + 1; - for ( i = fwd[cclm]; i != NIL && i <= llsiz; i = fwd[i] ) - { /* look for the symbol in the character class */ - for ( ; j < lenccl; ++j ) - { + for (i = fwd[cclm]; i != NIL && i <= llsiz; i = fwd[i]) { /* look for the symbol in the character class */ + for (; j < lenccl; ++j) { register int ccl_char; - if ( NUL_mapping && ccls[j] == 0 ) + if (NUL_mapping && ccls[j] == 0) ccl_char = NUL_mapping; else ccl_char = ccls[j]; - if ( ccl_char > i ) + if (ccl_char > i) break; - if ( ccl_char == i && ! cclflags[j] ) - { + if (ccl_char == i && !cclflags[j]) { /* We found an old companion of cclm * in the ccl. Link it into the new * equivalence class and flag it as @@ -169,8 +165,8 @@ int lenccl, fwd[], bck[], llsiz, NUL_mapping; /* Get next equivalence class member. */ /* continue 2 */ goto next_pt; - } } + } /* Symbol isn't in character class. Put it in the old * equivalence class. @@ -178,48 +174,46 @@ int lenccl, fwd[], bck[], llsiz, NUL_mapping; bck[i] = oldec; - if ( oldec != NIL ) + if (oldec != NIL) fwd[oldec] = i; oldec = i; - next_pt: ; - } + next_pt:; + } - if ( bck[cclm] != NIL || oldec != bck[cclm] ) - { + if (bck[cclm] != NIL || oldec != bck[cclm]) { bck[cclm] = NIL; fwd[oldec] = NIL; - } + } fwd[newec] = NIL; /* Find next ccl member to process. */ - for ( ++cclp; cclflags[cclp] && cclp < lenccl; ++cclp ) - { + for (++cclp; cclflags[cclp] && cclp < lenccl; ++cclp) { /* Reset "doesn't need processing" flag. */ cclflags[cclp] = 0; - } } } +} /* mkechar - create equivalence class for single character */ -void mkechar( tch, fwd, bck ) -int tch, fwd[], bck[]; - { +void mkechar (tch, fwd, bck) + int tch, fwd[], bck[]; +{ /* If until now the character has been a proper subset of * an equivalence class, break it away to create a new ec */ - if ( fwd[tch] != NIL ) + if (fwd[tch] != NIL) bck[fwd[tch]] = bck[tch]; - if ( bck[tch] != NIL ) + if (bck[tch] != NIL) fwd[bck[tch]] = fwd[tch]; fwd[tch] = NIL; bck[tch] = NIL; - } +} diff --git a/filter.c b/filter.c new file mode 100644 index 000000000000..b0c7bf1edb09 --- /dev/null +++ b/filter.c @@ -0,0 +1,427 @@ +/* filter - postprocessing of flex output through filters */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" +static const char * check_4_gnu_m4 = + "m4_dnl ifdef(`__gnu__', ," + "`errprint(Flex requires GNU M4. Set the PATH or set the M4 environment variable to its path name.)" + " m4exit(2)')\n"; + + +/** global chain. */ +struct filter *output_chain = NULL; + +/* Allocate and initialize an external filter. + * @param chain the current chain or NULL for new chain + * @param cmd the command to execute. + * @param ... a NULL terminated list of (const char*) arguments to command, + * not including argv[0]. + * @return newest filter in chain + */ +struct filter *filter_create_ext (struct filter *chain, const char *cmd, + ...) +{ + struct filter *f; + int max_args; + const char *s; + va_list ap; + + /* allocate and initialize new filter */ + f = (struct filter *) flex_alloc (sizeof (struct filter)); + memset (f, 0, sizeof (*f)); + f->filter_func = NULL; + f->extra = NULL; + f->next = NULL; + f->argc = 0; + + if (chain != NULL) { + /* append f to end of chain */ + while (chain->next) + chain = chain->next; + chain->next = f; + } + + + /* allocate argv, and populate it with the argument list. */ + max_args = 8; + f->argv = + (const char **) flex_alloc (sizeof (char *) * + (max_args + 1)); + f->argv[f->argc++] = cmd; + + va_start (ap, cmd); + while ((s = va_arg (ap, const char *)) != NULL) { + if (f->argc >= max_args) { + max_args += 8; + f->argv = + (const char **) flex_realloc (f->argv, + sizeof (char + *) * + (max_args + + 1)); + } + f->argv[f->argc++] = s; + } + f->argv[f->argc] = NULL; + + va_end (ap); + return f; +} + +/* Allocate and initialize an internal filter. + * @param chain the current chain or NULL for new chain + * @param filter_func The function that will perform the filtering. + * filter_func should return 0 if successful, and -1 + * if an error occurs -- or it can simply exit(). + * @param extra optional user-defined data to pass to the filter. + * @return newest filter in chain + */ +struct filter *filter_create_int (struct filter *chain, + int (*filter_func) (struct filter *), + void *extra) +{ + struct filter *f; + + /* allocate and initialize new filter */ + f = (struct filter *) flex_alloc (sizeof (struct filter)); + memset (f, 0, sizeof (*f)); + f->next = NULL; + f->argc = 0; + f->argv = NULL; + + f->filter_func = filter_func; + f->extra = extra; + + if (chain != NULL) { + /* append f to end of chain */ + while (chain->next) + chain = chain->next; + chain->next = f; + } + + return f; +} + +/** Fork and exec entire filter chain. + * @param chain The head of the chain. + * @return true on success. + */ +bool filter_apply_chain (struct filter * chain) +{ + int pid, pipes[2]; + + /* Tricky recursion, since we want to begin the chain + * at the END. Why? Because we need all the forked processes + * to be children of the main flex process. + */ + if (chain) + filter_apply_chain (chain->next); + else + return true; + + /* Now we are the right-most unprocessed link in the chain. + */ + + fflush (stdout); + fflush (stderr); + + if (pipe (pipes) == -1) + flexerror (_("pipe failed")); + + if ((pid = fork ()) == -1) + flexerror (_("fork failed")); + + if (pid == 0) { + /* child */ + + /* We need stdin (the FILE* stdin) to connect to this new pipe. + * There is no portable way to set stdin to a new file descriptor, + * as stdin is not an lvalue on some systems (BSD). + * So we dup the new pipe onto the stdin descriptor and use a no-op fseek + * to sync the stream. This is a Hail Mary situation. It seems to work. + */ + close (pipes[1]); + if (dup2 (pipes[0], fileno (stdin)) == -1) + flexfatal (_("dup2(pipes[0],0)")); + close (pipes[0]); + fseek (stdin, 0, SEEK_CUR); + + /* run as a filter, either internally or by exec */ + if (chain->filter_func) { + int r; + + if ((r = chain->filter_func (chain)) == -1) + flexfatal (_("filter_func failed")); + exit (0); + } + else { + execvp (chain->argv[0], + (char **const) (chain->argv)); + flexfatal (_("exec failed")); + } + + exit (1); + } + + /* Parent */ + close (pipes[0]); + if (dup2 (pipes[1], fileno (stdout)) == -1) + flexfatal (_("dup2(pipes[1],1)")); + close (pipes[1]); + fseek (stdout, 0, SEEK_CUR); + + return true; +} + +/** Truncate the chain to max_len number of filters. + * @param chain the current chain. + * @param max_len the maximum length of the chain. + * @return the resulting length of the chain. + */ +int filter_truncate (struct filter *chain, int max_len) +{ + int len = 1; + + if (!chain) + return 0; + + while (chain->next && len < max_len) { + chain = chain->next; + ++len; + } + + chain->next = NULL; + return len; +} + +/** Splits the chain in order to write to a header file. + * Similar in spirit to the 'tee' program. + * The header file name is in extra. + * @return 0 (zero) on success, and -1 on failure. + */ +int filter_tee_header (struct filter *chain) +{ + /* This function reads from stdin and writes to both the C file and the + * header file at the same time. + */ + + const int readsz = 512; + char *buf; + int to_cfd = -1; + FILE *to_c = NULL, *to_h = NULL; + bool write_header; + + write_header = (chain->extra != NULL); + + /* Store a copy of the stdout pipe, which is already piped to C file + * through the running chain. Then create a new pipe to the H file as + * stdout, and fork the rest of the chain again. + */ + + if ((to_cfd = dup (1)) == -1) + flexfatal (_("dup(1) failed")); + to_c = fdopen (to_cfd, "w"); + + if (write_header) { + if (freopen ((char *) chain->extra, "w", stdout) == NULL) + flexfatal (_("freopen(headerfilename) failed")); + + filter_apply_chain (chain->next); + to_h = stdout; + } + + /* Now to_c is a pipe to the C branch, and to_h is a pipe to the H branch. + */ + + if (write_header) { + fputs (check_4_gnu_m4, to_h); + fputs ("m4_changecom`'m4_dnl\n", to_h); + fputs ("m4_changequote`'m4_dnl\n", to_h); + fputs ("m4_changequote([[,]])[[]]m4_dnl\n", to_h); + fputs ("m4_define([[M4_YY_NOOP]])[[]]m4_dnl\n", to_h); + fputs ("m4_define( [[M4_YY_IN_HEADER]],[[]])m4_dnl\n", + to_h); + fprintf (to_h, "#ifndef %sHEADER_H\n", prefix); + fprintf (to_h, "#define %sHEADER_H 1\n", prefix); + fprintf (to_h, "#define %sIN_HEADER 1\n\n", prefix); + fprintf (to_h, + "m4_define( [[M4_YY_OUTFILE_NAME]],[[%s]])m4_dnl\n", + headerfilename ? headerfilename : "<stdout>"); + + } + + fputs (check_4_gnu_m4, to_c); + fputs ("m4_changecom`'m4_dnl\n", to_c); + fputs ("m4_changequote`'m4_dnl\n", to_c); + fputs ("m4_changequote([[,]])[[]]m4_dnl\n", to_c); + fputs ("m4_define([[M4_YY_NOOP]])[[]]m4_dnl\n", to_c); + fprintf (to_c, "m4_define( [[M4_YY_OUTFILE_NAME]],[[%s]])m4_dnl\n", + outfilename ? outfilename : "<stdout>"); + + buf = (char *) flex_alloc (readsz); + while (fgets (buf, readsz, stdin)) { + fputs (buf, to_c); + if (write_header) + fputs (buf, to_h); + } + + if (write_header) { + fprintf (to_h, "\n"); + + /* write a fake line number. It will get fixed by the linedir filter. */ + fprintf (to_h, "#line 4000 \"M4_YY_OUTFILE_NAME\"\n"); + + fprintf (to_h, "#undef %sIN_HEADER\n", prefix); + fprintf (to_h, "#endif /* %sHEADER_H */\n", prefix); + fputs ("m4_undefine( [[M4_YY_IN_HEADER]])m4_dnl\n", to_h); + + fflush (to_h); + if (ferror (to_h)) + lerrsf (_("error writing output file %s"), + (char *) chain->extra); + + else if (fclose (to_h)) + lerrsf (_("error closing output file %s"), + (char *) chain->extra); + } + + fflush (to_c); + if (ferror (to_c)) + lerrsf (_("error writing output file %s"), + outfilename ? outfilename : "<stdout>"); + + else if (fclose (to_c)) + lerrsf (_("error closing output file %s"), + outfilename ? outfilename : "<stdout>"); + + while (wait (0) > 0) ; + + exit (0); + return 0; +} + +/** Adjust the line numbers in the #line directives of the generated scanner. + * After the m4 expansion, the line numbers are incorrect since the m4 macros + * can add or remove lines. This only adjusts line numbers for generated code, + * not user code. This also happens to be a good place to squeeze multiple + * blank lines into a single blank line. + */ +int filter_fix_linedirs (struct filter *chain) +{ + char *buf; + const int readsz = 512; + int lineno = 1; + bool in_gen = true; /* in generated code */ + bool last_was_blank = false; + + if (!chain) + return 0; + + buf = (char *) flex_alloc (readsz); + + while (fgets (buf, readsz, stdin)) { + + regmatch_t m[10]; + + /* Check for #line directive. */ + if (buf[0] == '#' + && regexec (®ex_linedir, buf, 3, m, 0) == 0) { + + int num; + char *fname; + + /* extract the line number and filename */ + num = regmatch_strtol (&m[1], buf, NULL, 0); + fname = regmatch_dup (&m[2], buf); + + if (strcmp (fname, + outfilename ? outfilename : "<stdout>") + == 0 + || strcmp (fname, + headerfilename ? headerfilename : "<stdout>") + == 0) { + + char *s1, *s2; + char filename[MAXLINE]; + + s1 = fname; + s2 = filename; + + while ((s2 - filename) < (MAXLINE - 1) && *s1) { + /* Escape the backslash */ + if (*s1 == '\\') + *s2++ = '\\'; + /* Escape the double quote */ + if (*s1 == '\"') + *s2++ = '\\'; + /* Copy the character as usual */ + *s2++ = *s1++; + } + + *s2 = '\0'; + + /* Adjust the line directives. */ + in_gen = true; + snprintf (buf, readsz, "#line %d \"%s\"\n", + lineno + 1, filename); + } + else { + /* it's a #line directive for code we didn't write */ + in_gen = false; + } + + free (fname); + last_was_blank = false; + } + + /* squeeze blank lines from generated code */ + else if (in_gen + && regexec (®ex_blank_line, buf, 0, NULL, + 0) == 0) { + if (last_was_blank) + continue; + else + last_was_blank = true; + } + + else { + /* it's a line of normal, non-empty code. */ + last_was_blank = false; + } + + fputs (buf, stdout); + lineno++; + } + fflush (stdout); + if (ferror (stdout)) + lerrsf (_("error writing output file %s"), + outfilename ? outfilename : "<stdout>"); + + else if (fclose (stdout)) + lerrsf (_("error closing output file %s"), + outfilename ? outfilename : "<stdout>"); + + return 0; +} + +/* vim:set expandtab cindent tabstop=4 softtabstop=4 shiftwidth=4 textwidth=0: */ diff --git a/flex.skl b/flex.skl new file mode 100644 index 000000000000..6ebf2fd3dc2d --- /dev/null +++ b/flex.skl @@ -0,0 +1,3430 @@ +%# -*-C-*- vi: set ft=c: +%# This file is processed in several stages. +%# Here are the stages, as best as I can describe: +%# +%# 1. flex.skl is processed through GNU m4 during the +%# pre-compilation stage of flex. Only macros starting +%# with `m4preproc_' are processed, and quoting is normal. +%# +%# 2. The preprocessed skeleton is translated verbatim into a +%# C array, saved as "skel.c" and compiled into the flex binary. +%# +%# 3. At runtime, the skeleton is generated and filtered (again) +%# through m4. Macros beginning with `m4_' will be processed. +%# The quoting is "[[" and "]]" so we don't interfere with +%# user code. +%# +%# All generate macros for the m4 stage contain the text "m4" or "M4" +%# in them. This is to distinguish them from CPP macros. +%# The exception to this rule is YY_G, which is an m4 macro, +%# but it needs to be remain short because it is used everywhere. +%# +/* A lexical scanner generated by flex */ + +%# Macros for preproc stage. +m4preproc_changecom + +%# Macros for runtime processing stage. +m4_changecom +m4_changequote +m4_changequote([[, ]]) + +%# +%# Lines in this skeleton starting with a "%" character are "control lines" +%# and affect the generation of the scanner. The possible control codes are +%# listed and processed in misc.c. +%# +%# %# - A comment. The current line is omitted from the generated scanner. +%# %if-c++-only - The following lines are printed for C++ scanners ONLY. +%# %if-c-only - The following lines are NOT printed for C++ scanners. +%# %if-c-or-c++ - The following lines are printed in BOTH C and C++ scanners. +%# %if-reentrant - Print for reentrant scanners.(push) +%# %if-not-reentrant - Print for non-reentrant scanners. (push) +%# %if-bison-bridge - Print for bison-bridge. (push) +%# %if-not-bison-bridge - Print for non-bison-bridge. (push) +%# %endif - pop from the previous if code. +%# %% - A stop-point, where code is inserted by flex. +%# Each stop-point is numbered here and also in the code generator. +%# (See gen.c, etc. for details.) +%# %not-for-header - Begin code that should NOT appear in a ".h" file. +%# %ok-for-header - %c and %e are used for building a header file. +%# %if-tables-serialization +%# +%# All control-lines EXCEPT comment lines ("%#") will be inserted into +%# the generated scanner as a C-style comment. This is to aid those who +%# edit the skeleton. +%# + +%not-for-header +%if-c-only +%if-not-reentrant +m4_ifelse(M4_YY_PREFIX,yy,, +#define yy_create_buffer M4_YY_PREFIX[[_create_buffer]] +#define yy_delete_buffer M4_YY_PREFIX[[_delete_buffer]] +#define yy_flex_debug M4_YY_PREFIX[[_flex_debug]] +#define yy_init_buffer M4_YY_PREFIX[[_init_buffer]] +#define yy_flush_buffer M4_YY_PREFIX[[_flush_buffer]] +#define yy_load_buffer_state M4_YY_PREFIX[[_load_buffer_state]] +#define yy_switch_to_buffer M4_YY_PREFIX[[_switch_to_buffer]] +#define yyin M4_YY_PREFIX[[in]] +#define yyleng M4_YY_PREFIX[[leng]] +#define yylex M4_YY_PREFIX[[lex]] +#define yylineno M4_YY_PREFIX[[lineno]] +#define yyout M4_YY_PREFIX[[out]] +#define yyrestart M4_YY_PREFIX[[restart]] +#define yytext M4_YY_PREFIX[[text]] +#define yywrap M4_YY_PREFIX[[wrap]] +#define yyalloc M4_YY_PREFIX[[alloc]] +#define yyrealloc M4_YY_PREFIX[[realloc]] +#define yyfree M4_YY_PREFIX[[free]] +) +%endif +%endif +%ok-for-header + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION FLEX_MAJOR_VERSION +#define YY_FLEX_MINOR_VERSION FLEX_MINOR_VERSION +#define YY_FLEX_SUBMINOR_VERSION FLEX_SUBMINOR_VERSION +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +%# Some negated symbols +m4_ifdef( [[M4_YY_IN_HEADER]], , [[m4_define([[M4_YY_NOT_IN_HEADER]], [[]])]]) +m4_ifdef( [[M4_YY_REENTRANT]], , [[m4_define([[M4_YY_NOT_REENTRANT]], [[]])]]) + +%# This is the m4 way to say "(stack_used || is_reentrant) +m4_ifdef( [[M4_YY_STACK_USED]], [[m4_define([[M4_YY_HAS_START_STACK_VARS]])]]) +m4_ifdef( [[M4_YY_REENTRANT]], [[m4_define([[M4_YY_HAS_START_STACK_VARS]])]]) + +%# Prefixes. +%# The complexity here is necessary so that m4 preserves +%# the argument lists to each C function. + + +m4_ifdef( [[M4_YY_PREFIX]],, [[m4_define([[M4_YY_PREFIX]], [[yy]])]]) + +m4preproc_define(`M4_GEN_PREFIX', + ``m4_define(yy[[$1]], [[M4_YY_PREFIX[[$1]]m4_ifelse($'`#,0,,[[($'`@)]])]])'') + +%if-c++-only + /* The c++ scanner is a mess. The FlexLexer.h header file relies on the + * following macro. This is required in order to pass the c++-multiple-scanners + * test in the regression suite. We get reports that it breaks inheritance. + * We will address this in a future release of flex, or omit the C++ scanner + * altogether. + */ + #define yyFlexLexer M4_YY_PREFIX[[FlexLexer]] +%endif + +%if-c-only + M4_GEN_PREFIX(`_create_buffer') + M4_GEN_PREFIX(`_delete_buffer') + M4_GEN_PREFIX(`_scan_buffer') + M4_GEN_PREFIX(`_scan_string') + M4_GEN_PREFIX(`_scan_bytes') + M4_GEN_PREFIX(`_init_buffer') + M4_GEN_PREFIX(`_flush_buffer') + M4_GEN_PREFIX(`_load_buffer_state') + M4_GEN_PREFIX(`_switch_to_buffer') + M4_GEN_PREFIX(`push_buffer_state') + M4_GEN_PREFIX(`pop_buffer_state') + M4_GEN_PREFIX(`ensure_buffer_stack') + M4_GEN_PREFIX(`lex') + M4_GEN_PREFIX(`restart') + M4_GEN_PREFIX(`lex_init') + M4_GEN_PREFIX(`lex_init_extra') + M4_GEN_PREFIX(`lex_destroy') + M4_GEN_PREFIX(`get_debug') + M4_GEN_PREFIX(`set_debug') + M4_GEN_PREFIX(`get_extra') + M4_GEN_PREFIX(`set_extra') + M4_GEN_PREFIX(`get_in') + M4_GEN_PREFIX(`set_in') + M4_GEN_PREFIX(`get_out') + M4_GEN_PREFIX(`set_out') + M4_GEN_PREFIX(`get_leng') + M4_GEN_PREFIX(`get_text') + M4_GEN_PREFIX(`get_lineno') + M4_GEN_PREFIX(`set_lineno') + m4_ifdef( [[M4_YY_REENTRANT]], + [[ + M4_GEN_PREFIX(`get_column') + M4_GEN_PREFIX(`set_column') + ]]) + M4_GEN_PREFIX(`wrap') +%endif + +m4_ifdef( [[M4_YY_BISON_LVAL]], +[[ + M4_GEN_PREFIX(`get_lval') + M4_GEN_PREFIX(`set_lval') +]]) + +m4_ifdef( [[<M4_YY_BISON_LLOC>]], +[[ + M4_GEN_PREFIX(`get_lloc') + M4_GEN_PREFIX(`set_lloc') +]]) + + + M4_GEN_PREFIX(`alloc') + M4_GEN_PREFIX(`realloc') + M4_GEN_PREFIX(`free') + +%if-c-only +m4_ifdef( [[M4_YY_NOT_REENTRANT]], +[[ + M4_GEN_PREFIX(`text') + M4_GEN_PREFIX(`leng') + M4_GEN_PREFIX(`in') + M4_GEN_PREFIX(`out') + M4_GEN_PREFIX(`_flex_debug') + M4_GEN_PREFIX(`lineno') +]]) +%endif + + +m4_ifdef( [[M4_YY_TABLES_EXTERNAL]], +[[ + M4_GEN_PREFIX(`tables_fload') + M4_GEN_PREFIX(`tables_destroy') + M4_GEN_PREFIX(`TABLES_NAME') +]]) + +/* 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 +#include <sys/types.h> +#include <netinet/in.h> +%endif +/* end standard C headers. */ + +%if-c-or-c++ +m4preproc_include(`flexint.h') +%endif + +%if-c++-only +/* begin standard C++ headers. */ +#include <iostream> +#include <errno.h> +#include <cstdlib> +#include <cstring> +/* end standard C++ headers. */ +%endif + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +%# For compilers that can not handle prototypes. +%# e.g., +%# The function prototype +%# int foo(int x, char* y); +%# +%# ...should be written as +%# int foo M4_YY_PARAMS(int x, char* y); +%# +%# ...which could possibly generate +%# int foo (); +%# +m4_ifdef( [[M4_YY_NO_ANSI_FUNC_PROTOS]], +[[ + m4_define( [[M4_YY_PARAMS]], [[()]]) +]], +[[ + m4_define( [[M4_YY_PARAMS]], [[($*)]]) +]]) + +%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 + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +%# Declare yyguts variable +m4_define( [[M4_YY_DECL_GUTS_VAR]], [[struct yyguts_t * yyg = (struct yyguts_t*)yyscanner]]) +%# For use wherever a Global is accessed or assigned. +m4_define( [[YY_G]], [[yyg->$1]]) + +%# For use in function prototypes to append the additional argument. +m4_define( [[M4_YY_PROTO_LAST_ARG]], [[, yyscan_t yyscanner]]) +m4_define( [[M4_YY_PROTO_ONLY_ARG]], [[yyscan_t yyscanner]]) + +%# For use in function definitions to append the additional argument. +m4_ifdef( [[M4_YY_NO_ANSI_FUNC_DEFS]], +[[ + m4_define( [[M4_YY_DEF_LAST_ARG]], [[, yyscanner]]) + m4_define( [[M4_YY_DEF_ONLY_ARG]], [[yyscanner]]) +]], +[[ + m4_define( [[M4_YY_DEF_LAST_ARG]], [[, yyscan_t yyscanner]]) + m4_define( [[M4_YY_DEF_ONLY_ARG]], [[yyscan_t yyscanner]]) +]]) +m4_define( [[M4_YY_DECL_LAST_ARG]], [[yyscan_t yyscanner;]]) + +%# For use in function calls to pass the additional argument. +m4_define( [[M4_YY_CALL_LAST_ARG]], [[, yyscanner]]) +m4_define( [[M4_YY_CALL_ONLY_ARG]], [[yyscanner]]) + +%# For use in function documentation to adjust for additional argument. +m4_define( [[M4_YY_DOC_PARAM]], [[@param yyscanner The scanner object.]]) + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin YY_G(yyin_r) +#define yyout YY_G(yyout_r) +#define yyextra YY_G(yyextra_r) +#define yyleng YY_G(yyleng_r) +#define yytext YY_G(yytext_r) +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yy_flex_debug YY_G(yy_flex_debug_r) + +m4_define( [[M4_YY_INCR_LINENO]], +[[ + do{ yylineno++; + yycolumn=0; + }while(0) +]]) + +%endif + + + +%if-not-reentrant + +m4_define( [[M4_YY_INCR_LINENO]], +[[ + yylineno++; +]]) + +%# Define these macros to be no-ops. +m4_define( [[M4_YY_DECL_GUTS_VAR]], [[m4_dnl]]) +m4_define( [[YY_G]], [[($1)]]) +m4_define( [[M4_YY_PROTO_LAST_ARG]]) +m4_define( [[M4_YY_PROTO_ONLY_ARG]], [[void]]) +m4_define( [[M4_YY_DEF_LAST_ARG]]) + +m4_ifdef( [[M4_YY_NO_ANSI_FUNC_DEFS]], +[[ + m4_define( [[M4_YY_DEF_ONLY_ARG]]) +]], +[[ + m4_define( [[M4_YY_DEF_ONLY_ARG]], [[void]]) +]]) +m4_define([[M4_YY_DECL_LAST_ARG]]) +m4_define([[M4_YY_CALL_LAST_ARG]]) +m4_define([[M4_YY_CALL_ONLY_ARG]]) +m4_define( [[M4_YY_DOC_PARAM]], [[]]) + +%endif + + +m4_ifdef( [[M4_YY_NO_ANSI_FUNC_DEFS]], +[[ +%# For compilers that need traditional function definitions. +%# e.g., +%# The function prototype taking 2 arguments +%# int foo (int x, char* y) +%# +%# ...should be written as +%# int foo YYFARGS2(int,x, char*,y) +%# +%# ...which could possibly generate +%# int foo (x,y,yyscanner) +%# int x; +%# char * y; +%# yyscan_t yyscanner; +%# +%# Generate traditional function defs + m4_define( [[YYFARGS0]], [[(M4_YY_DEF_ONLY_ARG) [[\]] + M4_YY_DECL_LAST_ARG]]) + m4_define( [[YYFARGS1]], [[($2 M4_YY_DEF_LAST_ARG) [[\]] + $1 $2; [[\]] + M4_YY_DECL_LAST_ARG]]) + m4_define( [[YYFARGS2]], [[($2,$4 M4_YY_DEF_LAST_ARG) [[\]] + $1 $2; [[\]] + $3 $4; [[\]] + M4_YY_DECL_LAST_ARG]]) + m4_define( [[YYFARGS3]], [[($2,$4,$6 M4_YY_DEF_LAST_ARG) [[\]] + $1 $2; [[\]] + $3 $4; [[\]] + $5 $6; [[\]] + M4_YY_DECL_LAST_ARG]]) +]], +[[ +%# Generate C99 function defs. + m4_define( [[YYFARGS0]], [[(M4_YY_DEF_ONLY_ARG)]]) + m4_define( [[YYFARGS1]], [[($1 $2 M4_YY_DEF_LAST_ARG)]]) + m4_define( [[YYFARGS2]], [[($1 $2, $3 $4 M4_YY_DEF_LAST_ARG)]]) + m4_define( [[YYFARGS3]], [[($1 $2, $3 $4, $5 $6 M4_YY_DEF_LAST_ARG)]]) +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* 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_G(yy_start) = 1 + 2 * +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* 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_G(yy_start) - 1) / 2) +#define YYSTATE YY_START +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin M4_YY_CALL_LAST_ARG ) +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#define YY_END_OF_BUFFER_CHAR 0 +]]) + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) +]]) + + +#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 yyleng; +%endif + +%if-c-only +%if-not-reentrant +extern FILE *yyin, *yyout; +%endif +%endif + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ + m4_ifdef( [[M4_YY_USE_LINENO]], + [[ + /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires + * access to the local variable yy_act. Since yyless() is a macro, it would break + * existing scanners that call yyless() from OUTSIDE yylex. + * One obvious solution it to make yy_act a global. I tried that, and saw + * a 5% performance hit in a non-yylineno scanner, because yy_act is + * normally declared as a register variable-- so it is not worth it. + */ + #define YY_LESS_LINENO(n) \ + do { \ + int yyl;\ + for ( yyl = n; yyl < yyleng; ++yyl )\ + if ( yytext[yyl] == '\n' )\ + --yylineno;\ + }while(0) + ]], + [[ + #define YY_LESS_LINENO(n) + ]]) +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = YY_G(yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + YY_G(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#define unput(c) yyunput( c, YY_G(yytext_ptr) M4_YY_CALL_LAST_ARG ) +]]) + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t 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 + std::istream* yy_input_file; +%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; +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#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 yyrestart()), so that the user can continue scanning by + * just pointing yyin 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 + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* 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_G(yy_buffer_stack) \ + ? YY_G(yy_buffer_stack)[YY_G(yy_buffer_stack_top)] \ + : NULL) +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* 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_G(yy_buffer_stack)[YY_G(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 yytext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; +%ok-for-header +%endif + +void yyrestart M4_YY_PARAMS( FILE *input_file M4_YY_PROTO_LAST_ARG ); +void yy_switch_to_buffer M4_YY_PARAMS( YY_BUFFER_STATE new_buffer M4_YY_PROTO_LAST_ARG ); +YY_BUFFER_STATE yy_create_buffer M4_YY_PARAMS( FILE *file, int size M4_YY_PROTO_LAST_ARG ); +void yy_delete_buffer M4_YY_PARAMS( YY_BUFFER_STATE b M4_YY_PROTO_LAST_ARG ); +void yy_flush_buffer M4_YY_PARAMS( YY_BUFFER_STATE b M4_YY_PROTO_LAST_ARG ); +void yypush_buffer_state M4_YY_PARAMS( YY_BUFFER_STATE new_buffer M4_YY_PROTO_LAST_ARG ); +void yypop_buffer_state M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +static void yyensure_buffer_stack M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +static void yy_load_buffer_state M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +static void yy_init_buffer M4_YY_PARAMS( YY_BUFFER_STATE b, FILE *file M4_YY_PROTO_LAST_ARG ); +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER M4_YY_CALL_LAST_ARG) +]]) + +YY_BUFFER_STATE yy_scan_buffer M4_YY_PARAMS( char *base, yy_size_t size M4_YY_PROTO_LAST_ARG ); +YY_BUFFER_STATE yy_scan_string M4_YY_PARAMS( yyconst char *yy_str M4_YY_PROTO_LAST_ARG ); +YY_BUFFER_STATE yy_scan_bytes M4_YY_PARAMS( yyconst char *bytes, int len M4_YY_PROTO_LAST_ARG ); + +%endif + +void *yyalloc M4_YY_PARAMS( yy_size_t M4_YY_PROTO_LAST_ARG ); +void *yyrealloc M4_YY_PARAMS( void *, yy_size_t M4_YY_PROTO_LAST_ARG ); +void yyfree M4_YY_PARAMS( void * M4_YY_PROTO_LAST_ARG ); + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#define yy_new_buffer yy_create_buffer +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (M4_YY_CALL_ONLY_ARG); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE M4_YY_CALL_LAST_ARG); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (M4_YY_CALL_ONLY_ARG); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE M4_YY_CALL_LAST_ARG); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) +]]) + +%% [1.0] yytext/yyin/yyout/yy_state_type/yylineno etc. def's & init go here + +%if-c-only Standard (non-C++) definition + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +static yy_state_type yy_get_previous_state M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +static yy_state_type yy_try_NUL_trans M4_YY_PARAMS( yy_state_type current_state M4_YY_PROTO_LAST_ARG); +static int yy_get_next_buffer M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +static void yy_fatal_error M4_YY_PARAMS( yyconst char msg[] M4_YY_PROTO_LAST_ARG ); +]]) + +%endif + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + YY_G(yytext_ptr) = yy_bp; \ +%% [2.0] code to fiddle yytext and yyleng for yymore() goes here \ + YY_G(yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ +%% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ + YY_G(yy_c_buf_p) = yy_cp; +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +%% [4.0] data tables for the DFA and the user's section 1 definitions go here +]]) + +m4_ifdef( [[M4_YY_IN_HEADER]], [[#ifdef YY_HEADER_EXPORT_START_CONDITIONS]]) +M4_YY_SC_DEFS +m4_ifdef( [[M4_YY_IN_HEADER]], [[#endif]]) + +m4_ifdef( [[M4_YY_NO_UNISTD_H]],, +[[ +#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 +#include <unistd.h> +%endif +#endif +]]) + +m4_ifdef( [[M4_EXTRA_TYPE_DEFS]], +[[ +#define YY_EXTRA_TYPE M4_EXTRA_TYPE_DEFS +]], +[[ +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif +]] +) + +%if-c-only Reentrant structure and macros (non-C++). +%if-reentrant + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* Holds the entire state of the reentrant scanner. */ +struct yyguts_t + { + + /* User-defined. Not touched by flex. */ + YY_EXTRA_TYPE yyextra_r; + + /* The rest are the same as the globals declared in the non-reentrant scanner. */ + FILE *yyin_r, *yyout_r; + size_t yy_buffer_stack_top; /**< index of top of stack. */ + size_t yy_buffer_stack_max; /**< capacity of stack. */ + YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ + char yy_hold_char; + int yy_n_chars; + int yyleng_r; + char *yy_c_buf_p; + int yy_init; + int yy_start; + int yy_did_buffer_switch_on_eof; + int yy_start_stack_ptr; + int yy_start_stack_depth; + int *yy_start_stack; + yy_state_type yy_last_accepting_state; + char* yy_last_accepting_cpos; + + int yylineno_r; + int yy_flex_debug_r; + +m4_ifdef( [[M4_YY_USES_REJECT]], +[[ + yy_state_type *yy_state_buf; + yy_state_type *yy_state_ptr; + char *yy_full_match; + int yy_lp; + + /* These are only needed for trailing context rules, + * but there's no conditional variable for that yet. */ + int yy_looking_for_trail_begin; + int yy_full_lp; + int *yy_full_state; +]]) + +m4_ifdef( [[M4_YY_TEXT_IS_ARRAY]], +[[ + char yytext_r[YYLMAX]; + char *yytext_ptr; + int yy_more_offset; + int yy_prev_more_offset; +]], +[[ + char *yytext_r; + int yy_more_flag; + int yy_more_len; +]]) + +m4_ifdef( [[M4_YY_BISON_LVAL]], +[[ + YYSTYPE * yylval_r; +]]) + +m4_ifdef( [[<M4_YY_BISON_LLOC>]], +[[ + YYLTYPE * yylloc_r; +]]) + + }; /* end struct yyguts_t */ +]]) + + +%if-c-only +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +static int yy_init_globals M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +]]) +%endif + +%if-reentrant + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ + m4_ifdef( [[M4_YY_BISON_LVAL]], + [[ + /* This must go here because YYSTYPE and YYLTYPE are included + * from bison output in section 1.*/ + # define yylval YY_G(yylval_r) + ]]) + + m4_ifdef( [[<M4_YY_BISON_LLOC>]], + [[ + # define yylloc YY_G(yylloc_r) + ]]) +]]) + +int yylex_init M4_YY_PARAMS(yyscan_t* scanner); + +int yylex_init_extra M4_YY_PARAMS( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); + +%endif + +%endif End reentrant structures and macros. + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +m4_ifdef( [[M4_YY_NO_DESTROY]],, +[[ +int yylex_destroy M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +]]) + +m4_ifdef( [[M4_YY_NO_GET_DEBUG]],, +[[ +int yyget_debug M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +]]) + +m4_ifdef( [[M4_YY_NO_SET_DEBUG]],, +[[ +void yyset_debug M4_YY_PARAMS( int debug_flag M4_YY_PROTO_LAST_ARG ); +]]) + +m4_ifdef( [[M4_YY_NO_GET_EXTRA]],, +[[ +YY_EXTRA_TYPE yyget_extra M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +]]) + +m4_ifdef( [[M4_YY_NO_SET_EXTRA]],, +[[ +void yyset_extra M4_YY_PARAMS( YY_EXTRA_TYPE user_defined M4_YY_PROTO_LAST_ARG ); +]]) + +m4_ifdef( [[M4_YY_NO_GET_IN]],, +[[ +FILE *yyget_in M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +]]) + +m4_ifdef( [[M4_YY_NO_SET_IN]],, +[[ +void yyset_in M4_YY_PARAMS( FILE * in_str M4_YY_PROTO_LAST_ARG ); +]]) + +m4_ifdef( [[M4_YY_NO_GET_OUT]],, +[[ +FILE *yyget_out M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +]]) + +m4_ifdef( [[M4_YY_NO_SET_OUT]],, +[[ +void yyset_out M4_YY_PARAMS( FILE * out_str M4_YY_PROTO_LAST_ARG ); +]]) + +m4_ifdef( [[M4_YY_NO_GET_LENG]],, +[[ +int yyget_leng M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +]]) + +m4_ifdef( [[M4_YY_NO_GET_TEXT]],, +[[ +char *yyget_text M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +]]) + +m4_ifdef( [[M4_YY_NO_GET_LINENO]],, +[[ +int yyget_lineno M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +]]) + +m4_ifdef( [[M4_YY_NO_SET_LINENO]],, +[[ +void yyset_lineno M4_YY_PARAMS( int line_number M4_YY_PROTO_LAST_ARG ); +]]) + +%if-bison-bridge +m4_ifdef( [[M4_YY_NO_GET_LVAL]],, +[[ +YYSTYPE * yyget_lval M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +]]) + +void yyset_lval M4_YY_PARAMS( YYSTYPE * yylval_param M4_YY_PROTO_LAST_ARG ); + +m4_ifdef( [[<M4_YY_BISON_LLOC>]], +[[ + m4_ifdef( [[M4_YY_NO_GET_LLOC]],, + [[ + YYLTYPE *yyget_lloc M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); + ]]) + + m4_ifdef( [[M4_YY_NO_SET_LLOC]],, + [[ + void yyset_lloc M4_YY_PARAMS( YYLTYPE * yylloc_param M4_YY_PROTO_LAST_ARG ); + ]]) +]]) +%endif + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +#else +extern int yywrap M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +#endif +#endif + +%not-for-header + m4_ifdef( [[M4_YY_NO_UNPUT]],, + [[ + static void yyunput M4_YY_PARAMS( int c, char *buf_ptr M4_YY_PROTO_LAST_ARG); + ]]) +%ok-for-header +%endif + +#ifndef yytext_ptr +static void yy_flex_strncpy M4_YY_PARAMS( char *, yyconst char *, int M4_YY_PROTO_LAST_ARG); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen M4_YY_PARAMS( yyconst char * M4_YY_PROTO_LAST_ARG); +#endif + +#ifndef YY_NO_INPUT +%if-c-only Standard (non-C++) definition +%not-for-header +#ifdef __cplusplus +static int yyinput M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +#else +static int input M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +#endif +%ok-for-header +%endif +#endif + + +%if-c-only +%# TODO: This is messy. +m4_ifdef( [[M4_YY_STACK_USED]], +[[ + +m4_ifdef( [[M4_YY_NOT_REENTRANT]], +[[ + m4_ifdef( [[M4_YY_NOT_IN_HEADER]], + [[ + static int yy_start_stack_ptr = 0; + static int yy_start_stack_depth = 0; + static int *yy_start_stack = NULL; + ]]) +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ + m4_ifdef( [[M4_YY_NO_PUSH_STATE]],, + [[ + static void yy_push_state M4_YY_PARAMS( int new_state M4_YY_PROTO_LAST_ARG); + ]]) + m4_ifdef( [[M4_YY_NO_POP_STATE]],, + [[ + static void yy_pop_state M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); + ]]) + m4_ifdef( [[M4_YY_NO_TOP_STATE]],, + [[ + static int yy_top_state M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); + ]]) +]]) + +]], +[[ +m4_define( [[M4_YY_NO_PUSH_STATE]]) +m4_define( [[M4_YY_NO_POP_STATE]]) +m4_define( [[M4_YY_NO_TOP_STATE]]) +]]) +%endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* 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 fwrite( yytext, yyleng, 1, yyout ) +%endif +%if-c++-only C++ definition +#define ECHO LexerOutput( yytext, yyleng ) +%endif +#endif +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* 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-c++-only C++ definition \ + if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +%endif + +#endif +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* 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 + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +%if-c-only +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg M4_YY_CALL_LAST_ARG) +%endif +%if-c++-only +#define YY_FATAL_ERROR(msg) LexerError( msg ) +%endif +#endif +]]) + +%if-tables-serialization structures and prototypes +m4preproc_include(`tables_shared.h') + +/* Load the DFA tables from the given stream. */ +int yytables_fload M4_YY_PARAMS(FILE * fp M4_YY_PROTO_LAST_ARG); + +/* Unload the tables from memory. */ +int yytables_destroy M4_YY_PARAMS(M4_YY_PROTO_ONLY_ARG); +%not-for-header + +/** Describes a mapping from a serialized table id to its deserialized state in + * this scanner. This is the bridge between our "generic" deserialization code + * and the specifics of this scanner. + */ +struct yytbl_dmap { + enum yytbl_id dm_id;/**< table identifier */ + void **dm_arr; /**< address of pointer to store the deserialized table. */ + size_t dm_sz; /**< local sizeof() each element in table. */ +}; + +/** A {0,0,0}-terminated list of structs, forming the map */ +static struct yytbl_dmap yydmap[] = +{ +%tables-yydmap generated elements + {0,0,0} +}; + +/** A tables-reader object to maintain some state in the read. */ +struct yytbl_reader { + FILE * fp; /**< input stream */ + flex_uint32_t bread; /**< bytes read since beginning of current tableset */ +}; + +%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 + + +m4_define( [[M4_YY_LEX_PROTO]], [[M4_YY_PARAMS(M4_YY_PROTO_ONLY_ARG)]]) +m4_define( [[M4_YY_LEX_DECLARATION]], [[YYFARGS0(void)]]) + +m4_ifdef( [[M4_YY_BISON_LVAL]], +[[ + m4_dnl The bison pure parser is used. Redefine yylex to + m4_dnl accept the lval parameter. + + m4_define( [[M4_YY_LEX_PROTO]], [[\]] + [[M4_YY_PARAMS(YYSTYPE * yylval_param M4_YY_PROTO_LAST_ARG)]]) + m4_define( [[M4_YY_LEX_DECLARATION]], [[\]] + [[YYFARGS1(YYSTYPE *,yylval_param)]]) +]]) + +m4_ifdef( [[<M4_YY_BISON_LLOC>]], +[[ + m4_dnl Locations are used. yylex should also accept the ylloc parameter. + + m4_define( [[M4_YY_LEX_PROTO]], [[\]] + [[M4_YY_PARAMS(YYSTYPE * yylval_param, YYLTYPE * yylloc_param M4_YY_PROTO_LAST_ARG)]]) + m4_define( [[M4_YY_LEX_DECLARATION]], [[\]] + [[YYFARGS2(YYSTYPE *,yylval_param, YYLTYPE *,yylloc_param)]]) +]]) + +extern int yylex M4_YY_LEX_PROTO; + +#define YY_DECL int yylex M4_YY_LEX_DECLARATION +%endif +%if-c++-only C++ definition +#define YY_DECL int yyFlexLexer::yylex() +%endif +#endif /* !YY_DECL */ + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +%% [6.0] YY_RULE_SETUP definition goes here +]]) + +%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; + M4_YY_DECL_GUTS_VAR(); + +m4_ifdef( [[M4_YY_NOT_REENTRANT]], +[[ + m4_ifdef( [[M4_YY_BISON_LVAL]], + [[ + YYSTYPE * yylval; + ]]) + m4_ifdef( [[<M4_YY_BISON_LLOC>]], + [[ + YYLTYPE * yylloc; + ]]) +]]) + +%% [7.0] user's declarations go here + +m4_ifdef( [[M4_YY_BISON_LVAL]], +[[ + yylval = yylval_param; +]]) + +m4_ifdef( [[<M4_YY_BISON_LLOC>]], +[[ + yylloc = yylloc_param; +]]) + + if ( !YY_G(yy_init) ) + { + YY_G(yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + +m4_ifdef( [[M4_YY_USES_REJECT]], +[[ + /* Create the reject buffer large enough to save one state per allowed character. */ + if ( ! YY_G(yy_state_buf) ) + YY_G(yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE M4_YY_CALL_LAST_ARG); + if ( ! YY_G(yy_state_buf) ) + YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); +]]) + + if ( ! YY_G(yy_start) ) + YY_G(yy_start) = 1; /* first start state */ + + if ( ! yyin ) +%if-c-only + yyin = stdin; +%endif +%if-c++-only + yyin = & std::cin; +%endif + + if ( ! yyout ) +%if-c-only + yyout = stdout; +%endif +%if-c++-only + yyout = & std::cout; +%endif + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (M4_YY_CALL_ONLY_ARG); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE M4_YY_CALL_LAST_ARG); + } + + yy_load_buffer_state( M4_YY_CALL_ONLY_ARG ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { +%% [8.0] yymore()-related code goes here + yy_cp = YY_G(yy_c_buf_p); + + /* Support of yytext. */ + *yy_cp = YY_G(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_find_action: +%% [10.0] code to find the action number goes here + + YY_DO_BEFORE_ACTION; + +%% [11.0] code for yylineno update goes here + +do_action: /* This label is used only to access EOF actions. */ + +%% [12.0] debug code goes here + + switch ( yy_act ) + { /* beginning of action switch */ +%% [13.0] actions go here + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - YY_G(yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = YY_G(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 yyin at a new source and called + * yylex(). 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_G(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + 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_G(yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + YY_G(yy_c_buf_p) = YY_G(yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( M4_YY_CALL_ONLY_ARG ); + + /* 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 M4_YY_CALL_LAST_ARG); + + yy_bp = YY_G(yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++YY_G(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 + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( M4_YY_CALL_ONLY_ARG ) ) + { + case EOB_ACT_END_OF_FILE: + { + YY_G(yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( M4_YY_CALL_ONLY_ARG ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, 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_G(yy_c_buf_p) = YY_G(yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! YY_G(yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + YY_G(yy_c_buf_p) = + YY_G(yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( M4_YY_CALL_ONLY_ARG ); + + yy_cp = YY_G(yy_c_buf_p); + yy_bp = YY_G(yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + YY_G(yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( M4_YY_CALL_ONLY_ARG ); + + yy_cp = YY_G(yy_c_buf_p); + yy_bp = YY_G(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 yylex */ +%ok-for-header + +%if-c++-only +%not-for-header +/* The contents of this function are C++ specific, so the YY_G macro is not used. + */ +yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) +{ + yyin = arg_yyin; + yyout = arg_yyout; + yy_c_buf_p = 0; + yy_init = 0; + yy_start = 0; + yy_flex_debug = 0; + yylineno = 1; // this will only get updated if %option yylineno + + yy_did_buffer_switch_on_eof = 0; + + yy_looking_for_trail_begin = 0; + yy_more_flag = 0; + yy_more_len = 0; + yy_more_offset = yy_prev_more_offset = 0; + + yy_start_stack_ptr = yy_start_stack_depth = 0; + yy_start_stack = NULL; + + yy_buffer_stack = 0; + yy_buffer_stack_top = 0; + yy_buffer_stack_max = 0; + + +m4_ifdef( [[M4_YY_USES_REJECT]], +[[ + yy_state_buf = new yy_state_type[YY_STATE_BUF_SIZE]; +]], +[[ + yy_state_buf = 0; +]]) +} + +/* The contents of this function are C++ specific, so the YY_G macro is not used. + */ +yyFlexLexer::~yyFlexLexer() +{ + delete [] yy_state_buf; + yyfree( yy_start_stack M4_YY_CALL_LAST_ARG ); + yy_delete_buffer( YY_CURRENT_BUFFER M4_YY_CALL_LAST_ARG); + yyfree( yy_buffer_stack M4_YY_CALL_LAST_ARG ); +} + +/* The contents of this function are C++ specific, so the YY_G macro is not used. + */ +void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) +{ + if ( new_in ) + { + yy_delete_buffer( YY_CURRENT_BUFFER M4_YY_CALL_LAST_ARG); + yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE M4_YY_CALL_LAST_ARG) M4_YY_CALL_LAST_ARG); + } + + if ( new_out ) + yyout = new_out; +} + +#ifdef YY_INTERACTIVE +int yyFlexLexer::LexerInput( char* buf, int /* max_size */ ) +#else +int yyFlexLexer::LexerInput( char* buf, int max_size ) +#endif +{ + if ( yyin->eof() || yyin->fail() ) + return 0; + +#ifdef YY_INTERACTIVE + yyin->get( buf[0] ); + + if ( yyin->eof() ) + return 0; + + if ( yyin->bad() ) + return -1; + + return 1; + +#else + (void) yyin->read( buf, max_size ); + + if ( yyin->bad() ) + return -1; + else + return yyin->gcount(); +#endif +} + +void yyFlexLexer::LexerOutput( const char* buf, int size ) +{ + (void) yyout->write( buf, size ); +} +%ok-for-header +%endif + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* 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 YYFARGS0(void) +%endif +%if-c++-only +int yyFlexLexer::yy_get_next_buffer() +%endif +{ + M4_YY_DECL_GUTS_VAR(); + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = YY_G(yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( YY_G(yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(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_G(yy_c_buf_p) - YY_G(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_G(yy_c_buf_p) - YY_G(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_G(yy_n_chars) = 0; + + else + { + int 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. */ +m4_ifdef( [[M4_YY_USES_REJECT]], +[[ + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +]], +[[ + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) (YY_G(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. */ + yyrealloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 M4_YY_CALL_LAST_ARG ); + } + 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_G(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_G(yy_n_chars), (size_t) num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = YY_G(yy_n_chars); + } + + if ( YY_G(yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin M4_YY_CALL_LAST_ARG); + } + + 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; + + if ((yy_size_t) (YY_G(yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = YY_G(yy_n_chars) + number_to_move + (YY_G(yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( + (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, new_size M4_YY_CALL_LAST_ARG ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + YY_G(yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + YY_G(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 YYFARGS0(void) +%endif +%if-c++-only + yy_state_type yyFlexLexer::yy_get_previous_state() +%endif +{ + register yy_state_type yy_current_state; + register char *yy_cp; + M4_YY_DECL_GUTS_VAR(); + +%% [15.0] code to get the start state into yy_current_state goes here + + for ( yy_cp = YY_G(yytext_ptr) + YY_MORE_ADJ; yy_cp < YY_G(yy_c_buf_p); ++yy_cp ) + { +%% [16.0] code to find the next state goes here + } + + 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 YYFARGS1( yy_state_type, yy_current_state) +%endif +%if-c++-only + yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) +%endif +{ + register int yy_is_jam; + M4_YY_DECL_GUTS_VAR(); /* This var may be unused depending upon options. */ +%% [17.0] code to find the next state, and perhaps do backing up, goes here + + return yy_is_jam ? 0 : yy_current_state; +} + + +%if-c-only +m4_ifdef( [[M4_YY_NO_UNPUT]],, +[[ + static void yyunput YYFARGS2( int,c, register char *,yy_bp) +%endif +%if-c++-only + void yyFlexLexer::yyunput( int c, register char* yy_bp) +%endif +{ + register char *yy_cp; + M4_YY_DECL_GUTS_VAR(); + + yy_cp = YY_G(yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = YY_G(yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = YY_G(yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + YY_G(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + +%% [18.0] update yylineno here +m4_ifdef( [[M4_YY_USE_LINENO]], +[[ + if ( c == '\n' ){ + --yylineno; + } +]]) + + YY_G(yytext_ptr) = yy_bp; + YY_G(yy_hold_char) = *yy_cp; + YY_G(yy_c_buf_p) = yy_cp; +} +%if-c-only +]]) +%endif + +%if-c-only +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput YYFARGS0(void) +#else + static int input YYFARGS0(void) +#endif + +%endif +%if-c++-only + int yyFlexLexer::yyinput() +%endif +{ + int c; + M4_YY_DECL_GUTS_VAR(); + + *YY_G(yy_c_buf_p) = YY_G(yy_hold_char); + + if ( *YY_G(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_G(yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(yy_n_chars)] ) + /* This was really a NUL. */ + *YY_G(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = YY_G(yy_c_buf_p) - YY_G(yytext_ptr); + ++YY_G(yy_c_buf_p); + + switch ( yy_get_next_buffer( M4_YY_CALL_ONLY_ARG ) ) + { + 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. */ + yyrestart( yyin M4_YY_CALL_LAST_ARG); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap( M4_YY_CALL_ONLY_ARG ) ) + return EOF; + + if ( ! YY_G(yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(M4_YY_CALL_ONLY_ARG); +#else + return input(M4_YY_CALL_ONLY_ARG); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + YY_G(yy_c_buf_p) = YY_G(yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) YY_G(yy_c_buf_p); /* cast for 8-bit char's */ + *YY_G(yy_c_buf_p) = '\0'; /* preserve yytext */ + YY_G(yy_hold_char) = *++YY_G(yy_c_buf_p); + +%% [19.0] update BOL and yylineno + + return c; +} +%if-c-only +#endif /* ifndef YY_NO_INPUT */ +%endif + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * M4_YY_DOC_PARAM + * @note This function does not reset the start condition to @c INITIAL . + */ +%if-c-only + void yyrestart YYFARGS1( FILE *,input_file) +%endif +%if-c++-only + void yyFlexLexer::yyrestart( std::istream* input_file ) +%endif +{ + M4_YY_DECL_GUTS_VAR(); + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (M4_YY_CALL_ONLY_ARG); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE M4_YY_CALL_LAST_ARG); + } + + yy_init_buffer( YY_CURRENT_BUFFER, input_file M4_YY_CALL_LAST_ARG); + yy_load_buffer_state( M4_YY_CALL_ONLY_ARG ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * M4_YY_DOC_PARAM + */ +%if-c-only + void yy_switch_to_buffer YYFARGS1( YY_BUFFER_STATE ,new_buffer) +%endif +%if-c++-only + void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +%endif +{ + M4_YY_DECL_GUTS_VAR(); + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (M4_YY_CALL_ONLY_ARG); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *YY_G(yy_c_buf_p) = YY_G(yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = YY_G(yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = YY_G(yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( M4_YY_CALL_ONLY_ARG ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + YY_G(yy_did_buffer_switch_on_eof) = 1; +} + + +%if-c-only +static void yy_load_buffer_state YYFARGS0(void) +%endif +%if-c++-only + void yyFlexLexer::yy_load_buffer_state() +%endif +{ + M4_YY_DECL_GUTS_VAR(); + YY_G(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_G(yytext_ptr) = YY_G(yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + YY_G(yy_hold_char) = *YY_G(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. + * M4_YY_DOC_PARAM + * @return the allocated buffer state. + */ +%if-c-only + YY_BUFFER_STATE yy_create_buffer YYFARGS2( FILE *,file, int ,size) +%endif +%if-c++-only + YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) +%endif +{ + YY_BUFFER_STATE b; + m4_dnl M4_YY_DECL_GUTS_VAR(); + + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) M4_YY_CALL_LAST_ARG ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_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 *) yyalloc( b->yy_buf_size + 2 M4_YY_CALL_LAST_ARG ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file M4_YY_CALL_LAST_ARG); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * M4_YY_DOC_PARAM + */ +%if-c-only + void yy_delete_buffer YYFARGS1( YY_BUFFER_STATE ,b) +%endif +%if-c++-only + void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) +%endif +{ + M4_YY_DECL_GUTS_VAR(); + + 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 ) + yyfree( (void *) b->yy_ch_buf M4_YY_CALL_LAST_ARG ); + + yyfree( (void *) b M4_YY_CALL_LAST_ARG ); +} + + +%if-c-only +m4_ifdef( [[M4_YY_ALWAYS_INTERACTIVE]],, +[[ + m4_ifdef( [[M4_YY_NEVER_INTERACTIVE]],, + [[ +#ifndef __cplusplus +extern int isatty M4_YY_PARAMS( int ); +#endif /* __cplusplus */ + ]]) +]]) +%endif + +%if-c++-only +m4_ifdef( [[M4_YY_NEVER_INTERACTIVE]],, +[[ +extern "C" int isatty M4_YY_PARAMS( int ); +]]) +%endif + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ +%if-c-only + static void yy_init_buffer YYFARGS2( YY_BUFFER_STATE ,b, FILE *,file) +%endif +%if-c++-only + void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) +%endif + +{ + int oerrno = errno; + M4_YY_DECL_GUTS_VAR(); + + yy_flush_buffer( b M4_YY_CALL_LAST_ARG); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() 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 +m4_ifdef( [[M4_YY_ALWAYS_INTERACTIVE]], +[[ + b->yy_is_interactive = 1; +]], +[[ + m4_ifdef( [[M4_YY_NEVER_INTERACTIVE]], + [[ + b->yy_is_interactive = 0; + ]], + [[ + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + ]]) +]]) +%endif +%if-c++-only + b->yy_is_interactive = 0; +%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. + * M4_YY_DOC_PARAM + */ +%if-c-only + void yy_flush_buffer YYFARGS1( YY_BUFFER_STATE ,b) +%endif +%if-c++-only + void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) +%endif +{ + M4_YY_DECL_GUTS_VAR(); + 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 ) + yy_load_buffer_state( M4_YY_CALL_ONLY_ARG ); +} + +%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. + * M4_YY_DOC_PARAM + */ +%if-c-only +void yypush_buffer_state YYFARGS1(YY_BUFFER_STATE,new_buffer) +%endif +%if-c++-only +void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) +%endif +{ + M4_YY_DECL_GUTS_VAR(); + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(M4_YY_CALL_ONLY_ARG); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *YY_G(yy_c_buf_p) = YY_G(yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = YY_G(yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = YY_G(yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + YY_G(yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( M4_YY_CALL_ONLY_ARG ); + YY_G(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. + * M4_YY_DOC_PARAM + */ +%if-c-only +void yypop_buffer_state YYFARGS0(void) +%endif +%if-c++-only +void yyFlexLexer::yypop_buffer_state (void) +%endif +{ + M4_YY_DECL_GUTS_VAR(); + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER M4_YY_CALL_LAST_ARG); + YY_CURRENT_BUFFER_LVALUE = NULL; + if (YY_G(yy_buffer_stack_top) > 0) + --YY_G(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( M4_YY_CALL_ONLY_ARG ); + YY_G(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 yyensure_buffer_stack YYFARGS0(void) +%endif +%if-c++-only +void yyFlexLexer::yyensure_buffer_stack(void) +%endif +{ + int num_to_alloc; + M4_YY_DECL_GUTS_VAR(); + + if (!YY_G(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_G(yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + M4_YY_CALL_LAST_ARG); + if ( ! YY_G(yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + + memset(YY_G(yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + YY_G(yy_buffer_stack_max) = num_to_alloc; + YY_G(yy_buffer_stack_top) = 0; + return; + } + + if (YY_G(yy_buffer_stack_top) >= (YY_G(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_G(yy_buffer_stack_max) + grow_size; + YY_G(yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + (YY_G(yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + M4_YY_CALL_LAST_ARG); + if ( ! YY_G(yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset(YY_G(yy_buffer_stack) + YY_G(yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + YY_G(yy_buffer_stack_max) = num_to_alloc; + } +} +%endif + + + + +m4_ifdef( [[M4_YY_NO_SCAN_BUFFER]],, +[[ +%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 + * M4_YY_DOC_PARAM + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer YYFARGS2( char *,base, yy_size_t ,size) +{ + YY_BUFFER_STATE b; + m4_dnl M4_YY_DECL_GUTS_VAR(); + + 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) yyalloc( sizeof( struct yy_buffer_state ) M4_YY_CALL_LAST_ARG ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_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; + + yy_switch_to_buffer( b M4_YY_CALL_LAST_ARG ); + + return b; +} +%endif +]]) + + +m4_ifdef( [[M4_YY_NO_SCAN_STRING]],, +[[ +%if-c-only +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * M4_YY_DOC_PARAM + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string YYFARGS1( yyconst char *, yystr) +{ + m4_dnl M4_YY_DECL_GUTS_VAR(); + + return yy_scan_bytes( yystr, strlen(yystr) M4_YY_CALL_LAST_ARG); +} +%endif +]]) + + +m4_ifdef( [[M4_YY_NO_SCAN_BYTES]],, +[[ +%if-c-only +/** Setup the input buffer state to scan the given bytes. The next call to yylex() 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. + * M4_YY_DOC_PARAM + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes YYFARGS2( yyconst char *,yybytes, int ,_yybytes_len) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + m4_dnl M4_YY_DECL_GUTS_VAR(); + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) yyalloc( n M4_YY_CALL_LAST_ARG ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n M4_YY_CALL_LAST_ARG); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_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 +]]) + + +m4_ifdef( [[M4_YY_NO_PUSH_STATE]],, +[[ +%if-c-only + static void yy_push_state YYFARGS1( int ,new_state) +%endif +%if-c++-only + void yyFlexLexer::yy_push_state( int new_state ) +%endif +{ + M4_YY_DECL_GUTS_VAR(); + if ( YY_G(yy_start_stack_ptr) >= YY_G(yy_start_stack_depth) ) + { + yy_size_t new_size; + + YY_G(yy_start_stack_depth) += YY_START_STACK_INCR; + new_size = YY_G(yy_start_stack_depth) * sizeof( int ); + + if ( ! YY_G(yy_start_stack) ) + YY_G(yy_start_stack) = (int *) yyalloc( new_size M4_YY_CALL_LAST_ARG ); + + else + YY_G(yy_start_stack) = (int *) yyrealloc( + (void *) YY_G(yy_start_stack), new_size M4_YY_CALL_LAST_ARG ); + + if ( ! YY_G(yy_start_stack) ) + YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); + } + + YY_G(yy_start_stack)[YY_G(yy_start_stack_ptr)++] = YY_START; + + BEGIN(new_state); +} +]]) + + +m4_ifdef( [[M4_YY_NO_POP_STATE]],, +[[ +%if-c-only + static void yy_pop_state YYFARGS0(void) +%endif +%if-c++-only + void yyFlexLexer::yy_pop_state() +%endif +{ + M4_YY_DECL_GUTS_VAR(); + if ( --YY_G(yy_start_stack_ptr) < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(YY_G(yy_start_stack)[YY_G(yy_start_stack_ptr)]); +} +]]) + + +m4_ifdef( [[M4_YY_NO_TOP_STATE]],, +[[ +%if-c-only + static int yy_top_state YYFARGS0(void) +%endif +%if-c++-only + int yyFlexLexer::yy_top_state() +%endif +{ + M4_YY_DECL_GUTS_VAR(); + return YY_G(yy_start_stack)[YY_G(yy_start_stack_ptr) - 1]; +} +]]) + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +%if-c-only +static void yy_fatal_error YYFARGS1(yyconst char*, msg) +{ + m4_dnl M4_YY_DECL_GUTS_VAR(); + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} +%endif +%if-c++-only +void yyFlexLexer::LexerError( yyconst char msg[] ) +{ + M4_YY_DECL_GUTS_VAR(); + std::cerr << msg << std::endl; + exit( YY_EXIT_FAILURE ); +} +%endif + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = YY_G(yy_hold_char); \ + YY_G(yy_c_buf_p) = yytext + yyless_macro_arg; \ + YY_G(yy_hold_char) = *YY_G(yy_c_buf_p); \ + *YY_G(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + + + +/* Accessor methods (get/set functions) to struct members. */ + +%if-c-only +%if-reentrant +m4_ifdef( [[M4_YY_NO_GET_EXTRA]],, +[[ +/** Get the user-defined data for this scanner. + * M4_YY_DOC_PARAM + */ +YY_EXTRA_TYPE yyget_extra YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + return yyextra; +} +]]) +%endif + +m4_ifdef( [[M4_YY_NO_GET_LINENO]],, +[[ +/** Get the current line number. + * M4_YY_DOC_PARAM + */ +int yyget_lineno YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + + m4_ifdef( [[M4_YY_REENTRANT]], + [[ + if (! YY_CURRENT_BUFFER) + return 0; + ]]) + return yylineno; +} +]]) + +m4_ifdef( [[M4_YY_REENTRANT]], +[[ +m4_ifdef( [[M4_YY_NO_GET_COLUMN]],, +[[ +/** Get the current column number. + * M4_YY_DOC_PARAM + */ +int yyget_column YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + + m4_ifdef( [[M4_YY_REENTRANT]], + [[ + if (! YY_CURRENT_BUFFER) + return 0; + ]]) + return yycolumn; +} +]]) +]]) + +m4_ifdef( [[M4_YY_NO_GET_IN]],, +[[ +/** Get the input stream. + * M4_YY_DOC_PARAM + */ +FILE *yyget_in YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + return yyin; +} +]]) + +m4_ifdef( [[M4_YY_NO_GET_OUT]],, +[[ +/** Get the output stream. + * M4_YY_DOC_PARAM + */ +FILE *yyget_out YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + return yyout; +} +]]) + +m4_ifdef( [[M4_YY_NO_GET_LENG]],, +[[ +/** Get the length of the current token. + * M4_YY_DOC_PARAM + */ +int yyget_leng YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + return yyleng; +} +]]) + +/** Get the current token. + * M4_YY_DOC_PARAM + */ +m4_ifdef( [[M4_YY_NO_GET_TEXT]],, +[[ +char *yyget_text YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + return yytext; +} +]]) + +%if-reentrant +m4_ifdef( [[M4_YY_NO_SET_EXTRA]],, +[[ +/** Set the user-defined data. This data is never touched by the scanner. + * @param user_defined The data to be associated with this scanner. + * M4_YY_DOC_PARAM + */ +void yyset_extra YYFARGS1( YY_EXTRA_TYPE ,user_defined) +{ + M4_YY_DECL_GUTS_VAR(); + yyextra = user_defined ; +} +]]) +%endif + +m4_ifdef( [[M4_YY_NO_SET_LINENO]],, +[[ +/** Set the current line number. + * @param line_number + * M4_YY_DOC_PARAM + */ +void yyset_lineno YYFARGS1( int ,line_number) +{ + M4_YY_DECL_GUTS_VAR(); + + m4_ifdef( [[M4_YY_REENTRANT]], + [[ + /* lineno is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + yy_fatal_error( "yyset_lineno called with no buffer" M4_YY_CALL_LAST_ARG); + ]]) + yylineno = line_number; +} +]]) + +m4_ifdef( [[M4_YY_REENTRANT]], +[[ +m4_ifdef( [[M4_YY_NO_SET_COLUMN]],, +[[ +/** Set the current column. + * @param line_number + * M4_YY_DOC_PARAM + */ +void yyset_column YYFARGS1( int , column_no) +{ + M4_YY_DECL_GUTS_VAR(); + + m4_ifdef( [[M4_YY_REENTRANT]], + [[ + /* column is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + yy_fatal_error( "yyset_column called with no buffer" M4_YY_CALL_LAST_ARG); + ]]) + yycolumn = column_no; +} +]]) +]]) + + +m4_ifdef( [[M4_YY_NO_SET_IN]],, +[[ +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * M4_YY_DOC_PARAM + * @see yy_switch_to_buffer + */ +void yyset_in YYFARGS1( FILE * ,in_str) +{ + M4_YY_DECL_GUTS_VAR(); + yyin = in_str ; +} +]]) + +m4_ifdef( [[M4_YY_NO_SET_OUT]],, +[[ +void yyset_out YYFARGS1( FILE * ,out_str) +{ + M4_YY_DECL_GUTS_VAR(); + yyout = out_str ; +} +]]) + + +m4_ifdef( [[M4_YY_NO_GET_DEBUG]],, +[[ +int yyget_debug YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + return yy_flex_debug; +} +]]) + +m4_ifdef( [[M4_YY_NO_SET_DEBUG]],, +[[ +void yyset_debug YYFARGS1( int ,bdebug) +{ + M4_YY_DECL_GUTS_VAR(); + yy_flex_debug = bdebug ; +} +]]) +%endif + +%if-reentrant +/* Accessor methods for yylval and yylloc */ + +%if-bison-bridge +m4_ifdef( [[M4_YY_NO_GET_LVAL]],, +[[ +YYSTYPE * yyget_lval YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + return yylval; +} +]]) + +m4_ifdef( [[M4_YY_NO_SET_LVAL]],, +[[ +void yyset_lval YYFARGS1( YYSTYPE * ,yylval_param) +{ + M4_YY_DECL_GUTS_VAR(); + yylval = yylval_param; +} +]]) + +m4_ifdef( [[<M4_YY_BISON_LLOC>]], +[[ + m4_ifdef( [[M4_YY_NO_GET_LLOC]],, + [[ +YYLTYPE *yyget_lloc YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + return yylloc; +} + ]]) + + m4_ifdef( [[M4_YY_NO_SET_LLOC]],, + [[ +void yyset_lloc YYFARGS1( YYLTYPE * ,yylloc_param) +{ + M4_YY_DECL_GUTS_VAR(); + yylloc = yylloc_param; +} + ]]) +]]) + +%endif + + +/* User-visible API */ + +/* yylex_init is special because it creates the scanner itself, so it is + * the ONLY reentrant function that doesn't take the scanner as the last argument. + * That's why we explicitly handle the declaration, instead of using our macros. + */ +m4_ifdef( [[M4_YY_NO_ANSI_FUNC_DEFS]], +[[ +int yylex_init( ptr_yy_globals ) + yyscan_t* ptr_yy_globals; +]], +[[ +int yylex_init(yyscan_t* ptr_yy_globals) +]]) +{ + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + return yy_init_globals ( *ptr_yy_globals ); +} + + +/* yylex_init_extra has the same functionality as yylex_init, but follows the + * convention of taking the scanner as the last argument. Note however, that + * this is a *pointer* to a scanner, as it will be allocated by this call (and + * is the reason, too, why this function also must handle its own declaration). + * The user defined value in the first argument will be available to yyalloc in + * the yyextra field. + */ +m4_ifdef( [[M4_YY_NO_ANSI_FUNC_DEFS]], +[[ +int yylex_init_extra( yy_user_defined, ptr_yy_globals ) + YY_EXTRA_TYPE yy_user_defined; + yyscan_t* ptr_yy_globals; +]], +[[ +int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals ) +]]) +{ + struct yyguts_t dummy_yyguts; + + yyset_extra (yy_user_defined, &dummy_yyguts); + + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in + yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + yyset_extra (yy_user_defined, *ptr_yy_globals); + + return yy_init_globals ( *ptr_yy_globals ); +} + +%endif if-c-only + + +%if-c-only +static int yy_init_globals YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + +m4_ifdef( [[M4_YY_USE_LINENO]], +[[ + m4_ifdef( [[M4_YY_NOT_REENTRANT]], + [[ + /* We do not touch yylineno unless the option is enabled. */ + yylineno = 1; + ]]) +]]) + YY_G(yy_buffer_stack) = 0; + YY_G(yy_buffer_stack_top) = 0; + YY_G(yy_buffer_stack_max) = 0; + YY_G(yy_c_buf_p) = (char *) 0; + YY_G(yy_init) = 0; + YY_G(yy_start) = 0; + +m4_ifdef( [[M4_YY_HAS_START_STACK_VARS]], +[[ + YY_G(yy_start_stack_ptr) = 0; + YY_G(yy_start_stack_depth) = 0; + YY_G(yy_start_stack) = NULL; +]]) + +m4_ifdef( [[M4_YY_USES_REJECT]], +[[ + YY_G(yy_state_buf) = 0; + YY_G(yy_state_ptr) = 0; + YY_G(yy_full_match) = 0; + YY_G(yy_lp) = 0; +]]) + +m4_ifdef( [[M4_YY_TEXT_IS_ARRAY]], +[[ + YY_G(yytext_ptr) = 0; + YY_G(yy_more_offset) = 0; + YY_G(yy_prev_more_offset) = 0; +]]) + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = (FILE *) 0; + yyout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} +%endif + + +%if-c-only SNIP! this currently causes conflicts with the c++ scanner +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer( YY_CURRENT_BUFFER M4_YY_CALL_LAST_ARG ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(M4_YY_CALL_ONLY_ARG); + } + + /* Destroy the stack itself. */ + yyfree(YY_G(yy_buffer_stack) M4_YY_CALL_LAST_ARG); + YY_G(yy_buffer_stack) = NULL; + +m4_ifdef( [[M4_YY_HAS_START_STACK_VARS]], +[[ + /* Destroy the start condition stack. */ + yyfree( YY_G(yy_start_stack) M4_YY_CALL_LAST_ARG ); + YY_G(yy_start_stack) = NULL; +]]) + +m4_ifdef( [[M4_YY_USES_REJECT]], +[[ + yyfree ( YY_G(yy_state_buf) M4_YY_CALL_LAST_ARG); + YY_G(yy_state_buf) = NULL; +]]) + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( M4_YY_CALL_ONLY_ARG); + +%if-reentrant + /* Destroy the main struct (reentrant only). */ + yyfree ( yyscanner M4_YY_CALL_LAST_ARG ); + yyscanner = NULL; +%endif + return 0; +} +%endif + + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* + * Internal utility routines. + */ +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#ifndef yytext_ptr +static void yy_flex_strncpy YYFARGS3( char*,s1, yyconst char *,s2, int,n) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YYFARGS1( yyconst char *,s) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif +]]) + +m4_ifdef( [[M4_YY_NO_FLEX_ALLOC]],, +[[ +void *yyalloc YYFARGS1( yy_size_t ,size) +{ + return (void *) malloc( size ); +} +]]) + +m4_ifdef( [[M4_YY_NO_FLEX_REALLOC]],, +[[ +void *yyrealloc YYFARGS2( 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 ); +} +]]) + +m4_ifdef( [[M4_YY_NO_FLEX_FREE]],, +[[ +void yyfree YYFARGS1( void *,ptr) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} +]]) + +%if-tables-serialization definitions +m4preproc_include(`tables_shared.c') + +static int yytbl_read8 (void *v, struct yytbl_reader * rd) +{ + errno = 0; + if (fread (v, sizeof (flex_uint8_t), 1, rd->fp) != 1){ + errno = EIO; + return -1; + } + rd->bread += sizeof(flex_uint8_t); + return 0; +} + +static int yytbl_read16 (void *v, struct yytbl_reader * rd) +{ + errno = 0; + if (fread (v, sizeof (flex_uint16_t), 1, rd->fp) != 1){ + errno = EIO; + return -1; + } + *((flex_uint16_t *) v) = ntohs (*((flex_uint16_t *) v)); + rd->bread += sizeof(flex_uint16_t); + return 0; +} + +static int yytbl_read32 (void *v, struct yytbl_reader * rd) +{ + errno = 0; + if (fread (v, sizeof (flex_uint32_t), 1, rd->fp) != 1){ + errno = EIO; + return -1; + } + *((flex_uint32_t *) v) = ntohl (*((flex_uint32_t *) v)); + rd->bread += sizeof(flex_uint32_t); + return 0; +} + +/** Read the header */ +static int yytbl_hdr_read YYFARGS2(struct yytbl_hdr *, th, struct yytbl_reader *, rd) +{ + int bytes; + memset (th, 0, sizeof (struct yytbl_hdr)); + + if (yytbl_read32 (&(th->th_magic), rd) != 0) + return -1; + + if (th->th_magic != YYTBL_MAGIC){ + yy_fatal_error("bad magic number" /*TODO: not fatal.*/ M4_YY_CALL_LAST_ARG); + return -1; + } + + if (yytbl_read32 (&(th->th_hsize), rd) != 0 + || yytbl_read32 (&(th->th_ssize), rd) != 0 + || yytbl_read16 (&(th->th_flags), rd) != 0) + return -1; + + /* Sanity check on header size. Greater than 1k suggests some funny business. */ + if (th->th_hsize < 16 || th->th_hsize > 1024){ + yy_fatal_error("insane header size detected" /*TODO: not fatal.*/ M4_YY_CALL_LAST_ARG); + return -1; + } + + /* Allocate enough space for the version and name fields */ + bytes = th->th_hsize - 14; + th->th_version = (char *) yyalloc (bytes M4_YY_CALL_LAST_ARG); + if ( ! th->th_version ) + YY_FATAL_ERROR( "out of dynamic memory in yytbl_hdr_read()" ); + + /* we read it all into th_version, and point th_name into that data */ + if (fread (th->th_version, 1, bytes, rd->fp) != bytes){ + errno = EIO; + yyfree(th->th_version M4_YY_CALL_LAST_ARG); + th->th_version = NULL; + return -1; + } + else + rd->bread += bytes; + + th->th_name = th->th_version + strlen (th->th_version) + 1; + return 0; +} + +/** lookup id in the dmap list. + * @param dmap pointer to first element in list + * @return NULL if not found. + */ +static struct yytbl_dmap *yytbl_dmap_lookup YYFARGS2(struct yytbl_dmap *, dmap, + int, id) +{ + while (dmap->dm_id) + if (dmap->dm_id == id) + return dmap; + else + dmap++; + return NULL; +} + +/** Read a table while mapping its contents to the local array. + * @param dmap used to performing mapping + * @return 0 on success + */ +static int yytbl_data_load YYFARGS2(struct yytbl_dmap *, dmap, struct yytbl_reader*, rd) +{ + struct yytbl_data td; + struct yytbl_dmap *transdmap=0; + int len, i, rv, inner_loop_count; + void *p=0; + + memset (&td, 0, sizeof (struct yytbl_data)); + + if (yytbl_read16 (&td.td_id, rd) != 0 + || yytbl_read16 (&td.td_flags, rd) != 0 + || yytbl_read32 (&td.td_hilen, rd) != 0 + || yytbl_read32 (&td.td_lolen, rd) != 0) + return -1; + + /* Lookup the map for the transition table so we have it in case we need it + * inside the loop below. This scanner might not even have a transition + * table, which is ok. + */ + transdmap = yytbl_dmap_lookup (dmap, YYTD_ID_TRANSITION M4_YY_CALL_LAST_ARG); + + if ((dmap = yytbl_dmap_lookup (dmap, td.td_id M4_YY_CALL_LAST_ARG)) == NULL){ + yy_fatal_error("table id not found in map." /*TODO: not fatal.*/ M4_YY_CALL_LAST_ARG); + return -1; + } + + /* Allocate space for table. + * The --full yy_transition table is a special case, since we + * need the dmap.dm_sz entry to tell us the sizeof the individual + * struct members. + */ + { + size_t bytes; + + if ((td.td_flags & YYTD_STRUCT)) + bytes = sizeof(struct yy_trans_info) * td.td_lolen * (td.td_hilen ? td.td_hilen : 1); + else + bytes = td.td_lolen * (td.td_hilen ? td.td_hilen : 1) * dmap->dm_sz; + + if(M4_YY_TABLES_VERIFY) + /* We point to the array itself */ + p = dmap->dm_arr; + else + /* We point to the address of a pointer. */ + *dmap->dm_arr = p = (void *) yyalloc (bytes M4_YY_CALL_LAST_ARG); + if ( ! p ) + YY_FATAL_ERROR( "out of dynamic memory in yytbl_data_load()" ); + } + + /* If it's a struct, we read 2 integers to get one element */ + if ((td.td_flags & YYTD_STRUCT) != 0) + inner_loop_count = 2; + else + inner_loop_count = 1; + + /* read and map each element. + * This loop iterates once for each element of the td_data array. + * Notice that we increment 'i' in the inner loop. + */ + len = yytbl_calc_total_len (&td); + for (i = 0; i < len; ){ + int j; + + + /* This loop really executes exactly 1 or 2 times. + * The second time is to handle the second member of the + * YYTD_STRUCT for the yy_transition array. + */ + for (j = 0; j < inner_loop_count; j++, i++) { + flex_int32_t t32; + + /* read into t32 no matter what the real size is. */ + { + flex_int16_t t16; + flex_int8_t t8; + + switch (YYTDFLAGS2BYTES (td.td_flags)) { + case sizeof (flex_int32_t): + rv = yytbl_read32 (&t32, rd); + break; + case sizeof (flex_int16_t): + rv = yytbl_read16 (&t16, rd); + t32 = t16; + break; + case sizeof (flex_int8_t): + rv = yytbl_read8 (&t8, rd); + t32 = t8; + break; + default: + yy_fatal_error("invalid td_flags" /*TODO: not fatal.*/ M4_YY_CALL_LAST_ARG); + return -1; + } + } + if (rv != 0) + return -1; + + /* copy into the deserialized array... */ + + if ((td.td_flags & YYTD_STRUCT)) { + /* t32 is the j'th member of a two-element struct. */ + void *v; + + v = j == 0 ? &(((struct yy_trans_info *) p)->yy_verify) + : &(((struct yy_trans_info *) p)->yy_nxt); + + switch (dmap->dm_sz) { + case sizeof (flex_int32_t): + if (M4_YY_TABLES_VERIFY){ + if( ((flex_int32_t *) v)[0] != (flex_int32_t) t32) + yy_fatal_error("tables verification failed at YYTD_STRUCT flex_int32_t" M4_YY_CALL_LAST_ARG); + }else + ((flex_int32_t *) v)[0] = (flex_int32_t) t32; + break; + case sizeof (flex_int16_t): + if (M4_YY_TABLES_VERIFY ){ + if(((flex_int16_t *) v)[0] != (flex_int16_t) t32) + yy_fatal_error("tables verification failed at YYTD_STRUCT flex_int16_t" M4_YY_CALL_LAST_ARG); + }else + ((flex_int16_t *) v)[0] = (flex_int16_t) t32; + break; + case sizeof(flex_int8_t): + if (M4_YY_TABLES_VERIFY ){ + if( ((flex_int8_t *) v)[0] != (flex_int8_t) t32) + yy_fatal_error("tables verification failed at YYTD_STRUCT flex_int8_t" M4_YY_CALL_LAST_ARG); + }else + ((flex_int8_t *) v)[0] = (flex_int8_t) t32; + break; + default: + yy_fatal_error("invalid dmap->dm_sz for struct" /*TODO: not fatal.*/ M4_YY_CALL_LAST_ARG); + return -1; + } + + /* if we're done with j, increment p */ + if (j == 1) + p = (struct yy_trans_info *) p + 1; + } + else if ((td.td_flags & YYTD_PTRANS)) { + /* t32 is an index into the transition array. */ + struct yy_trans_info *v; + + + if (!transdmap){ + yy_fatal_error("transition table not found" /*TODO: not fatal.*/ M4_YY_CALL_LAST_ARG); + return -1; + } + + if( M4_YY_TABLES_VERIFY) + v = &(((struct yy_trans_info *) (transdmap->dm_arr))[t32]); + else + v = &((*((struct yy_trans_info **) (transdmap->dm_arr)))[t32]); + + if(M4_YY_TABLES_VERIFY ){ + if( ((struct yy_trans_info **) p)[0] != v) + yy_fatal_error("tables verification failed at YYTD_PTRANS" M4_YY_CALL_LAST_ARG); + }else + ((struct yy_trans_info **) p)[0] = v; + + /* increment p */ + p = (struct yy_trans_info **) p + 1; + } + else { + /* t32 is a plain int. copy data, then incrememnt p. */ + switch (dmap->dm_sz) { + case sizeof (flex_int32_t): + if(M4_YY_TABLES_VERIFY ){ + if( ((flex_int32_t *) p)[0] != (flex_int32_t) t32) + yy_fatal_error("tables verification failed at flex_int32_t" M4_YY_CALL_LAST_ARG); + }else + ((flex_int32_t *) p)[0] = (flex_int32_t) t32; + p = ((flex_int32_t *) p) + 1; + break; + case sizeof (flex_int16_t): + if(M4_YY_TABLES_VERIFY ){ + if( ((flex_int16_t *) p)[0] != (flex_int16_t) t32) + yy_fatal_error("tables verification failed at flex_int16_t" M4_YY_CALL_LAST_ARG); + }else + ((flex_int16_t *) p)[0] = (flex_int16_t) t32; + p = ((flex_int16_t *) p) + 1; + break; + case sizeof (flex_int8_t): + if(M4_YY_TABLES_VERIFY ){ + if( ((flex_int8_t *) p)[0] != (flex_int8_t) t32) + yy_fatal_error("tables verification failed at flex_int8_t" M4_YY_CALL_LAST_ARG); + }else + ((flex_int8_t *) p)[0] = (flex_int8_t) t32; + p = ((flex_int8_t *) p) + 1; + break; + default: + yy_fatal_error("invalid dmap->dm_sz for plain int" /*TODO: not fatal.*/ M4_YY_CALL_LAST_ARG); + return -1; + } + } + } + + } + + /* Now eat padding. */ + { + int pad; + pad = yypad64(rd->bread); + while(--pad >= 0){ + flex_int8_t t8; + if(yytbl_read8(&t8,rd) != 0) + return -1; + } + } + + return 0; +} + +%define-yytables The name for this specific scanner's tables. + +/* Find the key and load the DFA tables from the given stream. */ +static int yytbl_fload YYFARGS2(FILE *, fp, const char *, key) +{ + int rv=0; + struct yytbl_hdr th; + struct yytbl_reader rd; + + rd.fp = fp; + th.th_version = NULL; + + /* Keep trying until we find the right set of tables or end of file. */ + while (!feof(rd.fp)) { + rd.bread = 0; + if (yytbl_hdr_read (&th, &rd M4_YY_CALL_LAST_ARG) != 0){ + rv = -1; + goto return_rv; + } + + /* A NULL key means choose the first set of tables. */ + if (key == NULL) + break; + + if (strcmp(th.th_name,key) != 0){ + /* Skip ahead to next set */ + fseek(rd.fp, th.th_ssize - th.th_hsize, SEEK_CUR); + yyfree(th.th_version M4_YY_CALL_LAST_ARG); + th.th_version = NULL; + } + else + break; + } + + while (rd.bread < th.th_ssize){ + /* Load the data tables */ + if(yytbl_data_load (yydmap,&rd M4_YY_CALL_LAST_ARG) != 0){ + rv = -1; + goto return_rv; + } + } + +return_rv: + if(th.th_version){ + yyfree(th.th_version M4_YY_CALL_LAST_ARG); + th.th_version = NULL; + } + + return rv; +} + +/** Load the DFA tables for this scanner from the given stream. */ +int yytables_fload YYFARGS1(FILE *, fp) +{ + + if( yytbl_fload(fp, YYTABLES_NAME M4_YY_CALL_LAST_ARG) != 0) + return -1; + return 0; +} + +/** Destroy the loaded tables, freeing memory, etc.. */ +int yytables_destroy YYFARGS0(void) +{ + struct yytbl_dmap *dmap=0; + + if(!M4_YY_TABLES_VERIFY){ + /* Walk the dmap, freeing the pointers */ + for(dmap=yydmap; dmap->dm_id; dmap++) { + void * v; + v = dmap->dm_arr; + if(v && *(char**)v){ + yyfree(*(char**)v M4_YY_CALL_LAST_ARG); + *(char**)v = NULL; + } + } + } + + return 0; +} + +/* end table serialization code definitions */ +%endif + + +m4_ifdef([[M4_YY_MAIN]], [[ +int main M4_YY_PARAMS(void); + +int main () +{ + +%if-reentrant + yyscan_t lexer; + yylex_init(&lexer); + yylex( lexer ); + yylex_destroy( lexer); + +%endif +%if-not-reentrant + yylex(); +%endif + + return 0; +} +]]) + +%ok-for-header +m4_ifdef( [[M4_YY_IN_HEADER]], +[[ +#undef YY_NEW_FILE +#undef YY_FLUSH_BUFFER +#undef yy_set_bol +#undef yy_new_buffer +#undef yy_set_interactive +#undef YY_DO_BEFORE_ACTION + +#ifdef YY_DECL_IS_OURS +#undef YY_DECL_IS_OURS +#undef YY_DECL +#endif +]]) diff --git a/usr.bin/lex/flexdef.h b/flexdef.h index 9bf87e1be51d..d038952d44ea 100644 --- a/usr.bin/lex/flexdef.h +++ b/flexdef.h @@ -1,74 +1,109 @@ + /* flexdef - definitions file for flex */ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ -/* @(#) $Header: /home/daffy/u0/vern/flex/RCS/flexdef.h,v 2.53 95/04/20 11:17:36 vern Exp $ (LBL) */ +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ -#include <stdio.h> -#include <ctype.h> +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ -#include "config.h" +/* This file is part of flex. */ -#ifdef __TURBOC__ -#define HAVE_STRING_H 1 -#define MS_DOS 1 -#ifndef __STDC__ -#define __STDC__ 1 -#endif - #pragma warn -pro - #pragma warn -rch - #pragma warn -use - #pragma warn -aus - #pragma warn -par - #pragma warn -pia -#endif +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ -#ifdef HAVE_STRING_H -#include <string.h> -#else -#include <strings.h> -#endif +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> +#ifndef FLEXDEF_H +#define FLEXDEF_H 1 + +#ifdef HAVE_CONFIG_H +#include <config.h> #endif -#ifdef HAVE_MALLOC_H -#include <malloc.h> +/* AIX requires this to be the first thing in the file. */ +#ifndef __GNUC__ +# if HAVE_ALLOCA_H +# include <alloca.h> +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif #endif #ifdef STDC_HEADERS +#include <stdio.h> #include <stdlib.h> +#include <stdarg.h> +#include <setjmp.h> +#include <ctype.h> +#include <string.h> +#include <math.h> +#endif +#ifdef HAVE_ASSERT_H +#include <assert.h> +#else +#define assert(Pred) #endif -/* As an aid for the internationalization patch to flex, which - * is maintained outside this distribution for copyright reasons. - */ -#define _(String) (String) +#ifdef HAVE_LIMITS_H +#include <limits.h> +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif +#ifdef HAVE_SYS_PARAMS_H +#include <sys/params.h> +#endif +#ifdef HAVE_SYS_WAIT_H +#include <sys/wait.h> +#endif +#ifdef HAVE_STDBOOL_H +#include <stdbool.h> +#else +#define bool int +#define true 1 +#define false 0 +#endif +#include <regex.h> +#include "flexint.h" + +/* We use gettext. So, when we write strings which should be translated, we mark them with _() */ +#ifdef ENABLE_NLS +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif /* HAVE_LOCALE_H */ +#include "gettext.h" +#define _(String) gettext (String) +#else +#define _(STRING) STRING +#endif /* ENABLE_NLS */ /* Always be prepared to generate an 8-bit scanner. */ #define CSIZE 256 @@ -80,7 +115,7 @@ #endif #ifndef PROTO -#if __STDC__ +#if defined(__STDC__) #define PROTO(proto) proto #else #define PROTO(proto) () @@ -118,12 +153,8 @@ #define isascii(c) ((c) <= 0177) #endif - -#define true 1 -#define false 0 #define unspecified -1 - /* Special chk[] values marking the slots taking by end-of-buffer and action * numbers. */ @@ -189,10 +220,10 @@ */ #define NIL 0 -#define JAM -1 /* to mark a missing DFA transition */ +#define JAM -1 /* to mark a missing DFA transition */ #define NO_TRANSITION NIL -#define UNIQUE -1 /* marks a symbol as an e.c. representative */ -#define INFINITY -1 /* for x{5,} constructions */ +#define UNIQUE -1 /* marks a symbol as an e.c. representative */ +#define INFINITE_REPEAT -1 /* for x{5,} constructions */ #define INITIAL_MAX_CCLS 100 /* max number of unique character classes */ #define MAX_CCLS_INCREMENT 100 @@ -210,15 +241,16 @@ #define INITIAL_MAX_DFAS 1000 /* default maximum number of dfa states */ #define MAX_DFAS_INCREMENT 1000 -#define JAMSTATE -32766 /* marks a reference to the state that always jams */ +#define JAMSTATE -32766 /* marks a reference to the state that always jams */ /* Maximum number of NFA states. */ #define MAXIMUM_MNS 31999 +#define MAXIMUM_MNS_LONG 1999999999 /* Enough so that if it's subtracted from an NFA state number, the result * is guaranteed to be negative. */ -#define MARKER_DIFFERENCE (MAXIMUM_MNS+2) +#define MARKER_DIFFERENCE (maximum_mns+2) /* Maximum number of nxt/chk pairs for non-templates. */ #define INITIAL_MAX_XPAIRS 2000 @@ -234,7 +266,7 @@ #define MAX_SCS_INCREMENT 40 /* amount to bump by if it's not enough */ #define ONE_STACK_SIZE 500 /* stack of states with only one out-transition */ -#define SAME_TRANS -1 /* transition is the same as "default" entry for state */ +#define SAME_TRANS -1 /* transition is the same as "default" entry for state */ /* The following percentages are used to tune table compression: @@ -246,7 +278,7 @@ /* The percentage the number of homogeneous out-transitions of a state * must be of the number of total out-transitions of the state in order - * that the state's transition table is first compared with a potential + * that the state's transition table is first compared with a potential * template of the most common out-transition instead of with the first * proto in the proto queue. */ @@ -288,7 +320,7 @@ */ #define PROT_SAVE_SIZE 2000 -#define MSP 50 /* maximum number of saved protos (protos on the proto queue) */ +#define MSP 50 /* maximum number of saved protos (protos on the proto queue) */ /* Maximum number of out-transitions a state can have that we'll rummage * around through the interior of the internal fast table looking for a @@ -314,30 +346,6 @@ /* Declarations for global variables. */ -/* Variables for symbol tables: - * sctbl - start-condition symbol table - * ndtbl - name-definition symbol table - * ccltab - character class text symbol table - */ - -struct hash_entry - { - struct hash_entry *prev, *next; - char *name; - char *str_val; - int int_val; - } ; - -typedef struct hash_entry **hash_table; - -#define NAME_TABLE_HASH_SIZE 101 -#define START_COND_HASH_SIZE 101 -#define CCL_HASH_SIZE 101 - -extern struct hash_entry *ndtbl[NAME_TABLE_HASH_SIZE]; -extern struct hash_entry *sctbl[START_COND_HASH_SIZE]; -extern struct hash_entry *ccltab[CCL_HASH_SIZE]; - /* Variables for flags: * printstats - if true (-v), dump statistics @@ -348,8 +356,8 @@ extern struct hash_entry *ccltab[CCL_HASH_SIZE]; * nowarn - if true (-w), do not generate warnings * spprdflt - if true (-s), suppress the default rule * interactive - if true (-I), generate an interactive scanner - * caseins - if true (-i), generate a case-insensitive scanner * lex_compat - if true (-l), maximize compatibility with AT&T lex + * posix_compat - if true (-X), maximize compatibility with POSIX lex * do_yylineno - if true, generate code to maintain yylineno * useecs - if true (-Ce flag), use equivalence classes * fulltbl - if true (-Cf flag), don't compress the DFA state table @@ -363,6 +371,9 @@ extern struct hash_entry *ccltab[CCL_HASH_SIZE]; * listing backing-up states * C_plus_plus - if true (i.e., -+ flag), generate a C++ scanner class; * otherwise, a standard C scanner + * reentrant - if true (-R), generate a reentrant C scanner. + * bison_bridge_lval - if true (--bison-bridge), bison pure calling convention. + * bison_bridge_lloc - if true (--bison-locations), bison yylloc. * long_align - if true (-Ca flag), favor long-word alignment. * use_read - if true (-f, -F, or -Cr) then use read() for scanner input; * otherwise, use fread(). @@ -384,10 +395,13 @@ extern struct hash_entry *ccltab[CCL_HASH_SIZE]; * reject_really_used - same for REJECT */ -extern int printstats, syntaxerror, eofseen, ddebug, trace, nowarn, spprdflt; -extern int interactive, caseins, lex_compat, do_yylineno; +extern int printstats, syntaxerror, eofseen, ddebug, trace, nowarn, + spprdflt; +extern int interactive, lex_compat, posix_compat, do_yylineno; extern int useecs, fulltbl, usemecs, fullspd; extern int gen_line_dirs, performance_report, backing_up_report; +extern int reentrant, bison_bridge_lval, bison_bridge_lloc; +extern bool ansi_func_defs, ansi_func_protos; extern int C_plus_plus, long_align, use_read, yytext_is_array, do_yywrap; extern int csize; extern int yymore_used, reject, real_reject, continued_action, in_rule; @@ -408,6 +422,7 @@ extern int yymore_really_used, reject_really_used; * backing_up_file - file to summarize backing-up states to * infilename - name of input file * outfilename - name of output file + * headerfilename - name of the .h file to generate * did_outfilename - whether outfilename was explicitly set * prefix - the prefix used for externally visible names ("yy" by default) * yyclass - yyFlexLexer subclass to use for YY_DECL @@ -415,7 +430,7 @@ extern int yymore_really_used, reject_really_used; * use_stdout - the -t flag * input_files - array holding names of input files * num_input_files - size of input_files array - * program_name - name with which program was invoked + * program_name - name with which program was invoked * * action_array - array to hold the rule actions * action_size - size of action_array @@ -431,9 +446,9 @@ extern int datapos, dataline, linenum, out_linenum; extern FILE *skelfile, *yyin, *backing_up_file; extern const char *skel[]; extern int skel_ind; -extern char *infilename, *outfilename; +extern char *infilename, *outfilename, *headerfilename; extern int did_outfilename; -extern char *prefix, *yyclass; +extern char *prefix, *yyclass, *extra_type; extern int do_stdinit, use_stdout; extern char **input_files; extern int num_input_files; @@ -457,6 +472,7 @@ extern int onenext[ONE_STACK_SIZE], onedef[ONE_STACK_SIZE], onesp; /* Variables for nfa machine data: + * maximum_mns - maximal number of NFA states supported by tables * current_mns - current maximum on number of NFA states * num_rules - number of the last accepting state; also is number of * rules created so far @@ -483,13 +499,18 @@ extern int onenext[ONE_STACK_SIZE], onedef[ONE_STACK_SIZE], onesp; * context * rule_linenum - line number associated with rule * rule_useful - true if we've determined that the rule can be matched + * rule_has_nl - true if rule could possibly match a newline + * ccl_has_nl - true if current ccl could match a newline + * nlch - default eol char */ -extern int current_mns, current_max_rules; +extern int maximum_mns, current_mns, current_max_rules; extern int num_rules, num_eof_rules, default_rule, lastnfa; extern int *firstst, *lastst, *finalst, *transchar, *trans1, *trans2; extern int *accptnum, *assoc_rule, *state_type; extern int *rule_type, *rule_linenum, *rule_useful; +extern bool *rule_has_nl, *ccl_has_nl; +extern int nlch; /* Different types of states; values are useful as masks, as well, for * routines like check_trailing_context(). @@ -600,12 +621,12 @@ extern char **scname; extern int current_max_dfa_size, current_max_xpairs; extern int current_max_template_xpairs, current_max_dfas; extern int lastdfa, *nxt, *chk, *tnxt; -extern int *base, *def, *nultrans, NUL_ec, tblend, firstfree, **dss, *dfasiz; -extern union dfaacc_union - { - int *dfaacc_set; - int dfaacc_state; - } *dfaacc; +extern int *base, *def, *nultrans, NUL_ec, tblend, firstfree, **dss, + *dfasiz; +extern union dfaacc_union { + int *dfaacc_set; + int dfaacc_state; +} *dfaacc; extern int *accsiz, *dhash, numas; extern int numsnpairs, jambase, jamstate; extern int end_of_buffer_state; @@ -652,12 +673,12 @@ extern int sectnum, nummt, hshcol, dfaeql, numeps, eps2, num_reallocs; extern int tmpuses, totnst, peakpairs, numuniq, numdup, hshsave; extern int num_backing_up, bol_needed; -void *allocate_array PROTO((int, size_t)); -void *reallocate_array PROTO((void*, int, size_t)); +void *allocate_array PROTO ((int, size_t)); +void *reallocate_array PROTO ((void *, int, size_t)); -void *flex_alloc PROTO((size_t)); -void *flex_realloc PROTO((void*, size_t)); -void flex_free PROTO((void*)); +void *flex_alloc PROTO ((size_t)); +void *flex_realloc PROTO ((void *, size_t)); +void flex_free PROTO ((void *)); #define allocate_integer_array(size) \ (int *) allocate_array( size, sizeof( int ) ) @@ -665,6 +686,12 @@ void flex_free PROTO((void*)); #define reallocate_integer_array(array,size) \ (int *) reallocate_array( (void *) array, size, sizeof( int ) ) +#define allocate_bool_array(size) \ + (bool *) allocate_array( size, sizeof( bool ) ) + +#define reallocate_bool_array(array,size) \ + (bool *) reallocate_array( (void *) array, size, sizeof( bool ) ) + #define allocate_int_ptr_array(size) \ (int **) allocate_array( size, sizeof( int * ) ) @@ -709,340 +736,488 @@ extern int yylval; /* from file ccl.c */ -extern void ccladd PROTO((int, int)); /* add a single character to a ccl */ -extern int cclinit PROTO((void)); /* make an empty ccl */ -extern void cclnegate PROTO((int)); /* negate a ccl */ +extern void ccladd PROTO ((int, int)); /* add a single character to a ccl */ +extern int cclinit PROTO ((void)); /* make an empty ccl */ +extern void cclnegate PROTO ((int)); /* negate a ccl */ +extern int ccl_set_diff (int a, int b); /* set difference of two ccls. */ +extern int ccl_set_union (int a, int b); /* set union of two ccls. */ /* List the members of a set of characters in CCL form. */ -extern void list_character_set PROTO((FILE*, int[])); +extern void list_character_set PROTO ((FILE *, int[])); /* from file dfa.c */ /* Check a DFA state for backing up. */ -extern void check_for_backing_up PROTO((int, int[])); +extern void check_for_backing_up PROTO ((int, int[])); /* Check to see if NFA state set constitutes "dangerous" trailing context. */ -extern void check_trailing_context PROTO((int*, int, int*, int)); +extern void check_trailing_context PROTO ((int *, int, int *, int)); /* Construct the epsilon closure of a set of ndfa states. */ -extern int *epsclosure PROTO((int*, int*, int[], int*, int*)); +extern int *epsclosure PROTO ((int *, int *, int[], int *, int *)); /* Increase the maximum number of dfas. */ -extern void increase_max_dfas PROTO((void)); +extern void increase_max_dfas PROTO ((void)); -extern void ntod PROTO((void)); /* convert a ndfa to a dfa */ +extern void ntod PROTO ((void)); /* convert a ndfa to a dfa */ /* Converts a set of ndfa states into a dfa state. */ -extern int snstods PROTO((int[], int, int[], int, int, int*)); +extern int snstods PROTO ((int[], int, int[], int, int, int *)); /* from file ecs.c */ /* Convert character classes to set of equivalence classes. */ -extern void ccl2ecl PROTO((void)); +extern void ccl2ecl PROTO ((void)); /* Associate equivalence class numbers with class members. */ -extern int cre8ecs PROTO((int[], int[], int)); +extern int cre8ecs PROTO ((int[], int[], int)); /* Update equivalence classes based on character class transitions. */ -extern void mkeccl PROTO((Char[], int, int[], int[], int, int)); +extern void mkeccl PROTO ((Char[], int, int[], int[], int, int)); /* Create equivalence class for single character. */ -extern void mkechar PROTO((int, int[], int[])); +extern void mkechar PROTO ((int, int[], int[])); /* from file gen.c */ -extern void do_indent PROTO((void)); /* indent to the current level */ +extern void do_indent PROTO ((void)); /* indent to the current level */ /* Generate the code to keep backing-up information. */ -extern void gen_backing_up PROTO((void)); +extern void gen_backing_up PROTO ((void)); /* Generate the code to perform the backing up. */ -extern void gen_bu_action PROTO((void)); +extern void gen_bu_action PROTO ((void)); /* Generate full speed compressed transition table. */ -extern void genctbl PROTO((void)); +extern void genctbl PROTO ((void)); /* Generate the code to find the action number. */ -extern void gen_find_action PROTO((void)); +extern void gen_find_action PROTO ((void)); -extern void genftbl PROTO((void)); /* generate full transition table */ +extern void genftbl PROTO ((void)); /* generate full transition table */ /* Generate the code to find the next compressed-table state. */ -extern void gen_next_compressed_state PROTO((char*)); +extern void gen_next_compressed_state PROTO ((char *)); /* Generate the code to find the next match. */ -extern void gen_next_match PROTO((void)); +extern void gen_next_match PROTO ((void)); /* Generate the code to find the next state. */ -extern void gen_next_state PROTO((int)); +extern void gen_next_state PROTO ((int)); /* Generate the code to make a NUL transition. */ -extern void gen_NUL_trans PROTO((void)); +extern void gen_NUL_trans PROTO ((void)); /* Generate the code to find the start state. */ -extern void gen_start_state PROTO((void)); +extern void gen_start_state PROTO ((void)); /* Generate data statements for the transition tables. */ -extern void gentabs PROTO((void)); +extern void gentabs PROTO ((void)); /* Write out a formatted string at the current indentation level. */ -extern void indent_put2s PROTO((char[], char[])); +extern void indent_put2s PROTO ((const char *, const char *)); /* Write out a string + newline at the current indentation level. */ -extern void indent_puts PROTO((char[])); +extern void indent_puts PROTO ((const char *)); -extern void make_tables PROTO((void)); /* generate transition tables */ +extern void make_tables PROTO ((void)); /* generate transition tables */ /* from file main.c */ -extern void check_options PROTO((void)); -extern void flexend PROTO((int)); -extern void usage PROTO((void)); +extern void check_options PROTO ((void)); +extern void flexend PROTO ((int)); +extern void usage PROTO ((void)); /* from file misc.c */ /* Add a #define to the action file. */ -extern void action_define PROTO(( char *defname, int value )); +extern void action_define PROTO ((const char *defname, int value)); /* Add the given text to the stored actions. */ -extern void add_action PROTO(( char *new_text )); +extern void add_action PROTO ((const char *new_text)); /* True if a string is all lower case. */ -extern int all_lower PROTO((register char *)); +extern int all_lower PROTO ((register char *)); /* True if a string is all upper case. */ -extern int all_upper PROTO((register char *)); +extern int all_upper PROTO ((register char *)); /* Bubble sort an integer array. */ -extern void bubble PROTO((int [], int)); +extern void bubble PROTO ((int[], int)); /* Check a character to make sure it's in the expected range. */ -extern void check_char PROTO((int c)); +extern void check_char PROTO ((int c)); /* Replace upper-case letter to lower-case. */ -extern Char clower PROTO((int)); +extern Char clower PROTO ((int)); /* Returns a dynamically allocated copy of a string. */ -extern char *copy_string PROTO((register const char *)); +extern char *copy_string PROTO ((register const char *)); /* Returns a dynamically allocated copy of a (potentially) unsigned string. */ -extern Char *copy_unsigned_string PROTO((register Char *)); +extern Char *copy_unsigned_string PROTO ((register Char *)); /* Shell sort a character array. */ -extern void cshell PROTO((Char [], int, int)); +extern void cshell PROTO ((Char[], int, int)); /* Finish up a block of data declarations. */ -extern void dataend PROTO((void)); +extern void dataend PROTO ((void)); /* Flush generated data statements. */ -extern void dataflush PROTO((void)); +extern void dataflush PROTO ((void)); /* Report an error message and terminate. */ -extern void flexerror PROTO((const char[])); +extern void flexerror PROTO ((const char *)); /* Report a fatal error message and terminate. */ -extern void flexfatal PROTO((const char[])); +extern void flexfatal PROTO ((const char *)); + +/* Report a fatal error with a pinpoint, and terminate */ +#if HAVE_DECL___FUNC__ +#define flex_die(msg) \ + do{ \ + fprintf (stderr,\ + _("%s: fatal internal error at %s:%d (%s): %s\n"),\ + program_name, __FILE__, (int)__LINE__,\ + __func__,msg);\ + FLEX_EXIT(1);\ + }while(0) +#else /* ! HAVE_DECL___FUNC__ */ +#define flex_die(msg) \ + do{ \ + fprintf (stderr,\ + _("%s: fatal internal error at %s:%d %s\n"),\ + program_name, __FILE__, (int)__LINE__,\ + msg);\ + FLEX_EXIT(1);\ + }while(0) +#endif /* ! HAVE_DECL___func__ */ /* Convert a hexadecimal digit string to an integer value. */ -extern int htoi PROTO((Char[])); +extern int htoi PROTO ((Char[])); /* Report an error message formatted with one integer argument. */ -extern void lerrif PROTO((const char[], int)); +extern void lerrif PROTO ((const char *, int)); /* Report an error message formatted with one string argument. */ -extern void lerrsf PROTO((const char[], const char[])); +extern void lerrsf PROTO ((const char *, const char *)); /* Spit out a "#line" statement. */ -extern void line_directive_out PROTO((FILE*, int)); +extern void line_directive_out PROTO ((FILE *, int)); /* Mark the current position in the action array as the end of the section 1 * user defs. */ -extern void mark_defs1 PROTO((void)); +extern void mark_defs1 PROTO ((void)); /* Mark the current position in the action array as the end of the prolog. */ -extern void mark_prolog PROTO((void)); +extern void mark_prolog PROTO ((void)); /* Generate a data statment for a two-dimensional array. */ -extern void mk2data PROTO((int)); +extern void mk2data PROTO ((int)); -extern void mkdata PROTO((int)); /* generate a data statement */ +extern void mkdata PROTO ((int)); /* generate a data statement */ /* Return the integer represented by a string of digits. */ -extern int myctoi PROTO((char [])); +extern int myctoi PROTO ((const char *)); /* Return character corresponding to escape sequence. */ -extern Char myesc PROTO((Char[])); +extern Char myesc PROTO ((Char[])); /* Convert an octal digit string to an integer value. */ -extern int otoi PROTO((Char [] )); +extern int otoi PROTO ((Char[])); /* Output a (possibly-formatted) string to the generated scanner. */ -extern void out PROTO((const char [])); -extern void out_dec PROTO((const char [], int)); -extern void out_dec2 PROTO((const char [], int, int)); -extern void out_hex PROTO((const char [], unsigned int)); -extern void out_line_count PROTO((const char [])); -extern void out_str PROTO((const char [], const char [])); +extern void out PROTO ((const char *)); +extern void out_dec PROTO ((const char *, int)); +extern void out_dec2 PROTO ((const char *, int, int)); +extern void out_hex PROTO ((const char *, unsigned int)); +extern void out_line_count PROTO ((const char *)); +extern void out_str PROTO ((const char *, const char *)); extern void out_str3 - PROTO((const char [], const char [], const char [], const char [])); -extern void out_str_dec PROTO((const char [], const char [], int)); -extern void outc PROTO((int)); -extern void outn PROTO((const char [])); +PROTO ((const char *, const char *, const char *, const char *)); +extern void out_str_dec PROTO ((const char *, const char *, int)); +extern void outc PROTO ((int)); +extern void outn PROTO ((const char *)); +extern void out_m4_define (const char* def, const char* val); /* Return a printable version of the given character, which might be * 8-bit. */ -extern char *readable_form PROTO((int)); +extern char *readable_form PROTO ((int)); /* Write out one section of the skeleton file. */ -extern void skelout PROTO((void)); +extern void skelout PROTO ((void)); /* Output a yy_trans_info structure. */ -extern void transition_struct_out PROTO((int, int)); +extern void transition_struct_out PROTO ((int, int)); /* Only needed when using certain broken versions of bison to build parse.c. */ -extern void *yy_flex_xmalloc PROTO(( int )); +extern void *yy_flex_xmalloc PROTO ((int)); /* Set a region of memory to 0. */ -extern void zero_out PROTO((char *, size_t)); +extern void zero_out PROTO ((char *, size_t)); /* from file nfa.c */ /* Add an accepting state to a machine. */ -extern void add_accept PROTO((int, int)); +extern void add_accept PROTO ((int, int)); /* Make a given number of copies of a singleton machine. */ -extern int copysingl PROTO((int, int)); +extern int copysingl PROTO ((int, int)); /* Debugging routine to write out an nfa. */ -extern void dumpnfa PROTO((int)); +extern void dumpnfa PROTO ((int)); /* Finish up the processing for a rule. */ -extern void finish_rule PROTO((int, int, int, int)); +extern void finish_rule PROTO ((int, int, int, int, int)); /* Connect two machines together. */ -extern int link_machines PROTO((int, int)); +extern int link_machines PROTO ((int, int)); /* Mark each "beginning" state in a machine as being a "normal" (i.e., * not trailing context associated) state. */ -extern void mark_beginning_as_normal PROTO((register int)); +extern void mark_beginning_as_normal PROTO ((register int)); /* Make a machine that branches to two machines. */ -extern int mkbranch PROTO((int, int)); +extern int mkbranch PROTO ((int, int)); -extern int mkclos PROTO((int)); /* convert a machine into a closure */ -extern int mkopt PROTO((int)); /* make a machine optional */ +extern int mkclos PROTO ((int)); /* convert a machine into a closure */ +extern int mkopt PROTO ((int)); /* make a machine optional */ /* Make a machine that matches either one of two machines. */ -extern int mkor PROTO((int, int)); +extern int mkor PROTO ((int, int)); /* Convert a machine into a positive closure. */ -extern int mkposcl PROTO((int)); +extern int mkposcl PROTO ((int)); -extern int mkrep PROTO((int, int, int)); /* make a replicated machine */ +extern int mkrep PROTO ((int, int, int)); /* make a replicated machine */ /* Create a state with a transition on a given symbol. */ -extern int mkstate PROTO((int)); +extern int mkstate PROTO ((int)); -extern void new_rule PROTO((void)); /* initialize for a new rule */ +extern void new_rule PROTO ((void)); /* initialize for a new rule */ /* from file parse.y */ /* Build the "<<EOF>>" action for the active start conditions. */ -extern void build_eof_action PROTO((void)); +extern void build_eof_action PROTO ((void)); /* Write out a message formatted with one string, pinpointing its location. */ -extern void format_pinpoint_message PROTO((char[], char[])); +extern void format_pinpoint_message PROTO ((const char *, const char *)); /* Write out a message, pinpointing its location. */ -extern void pinpoint_message PROTO((char[])); +extern void pinpoint_message PROTO ((const char *)); /* Write out a warning, pinpointing it at the given line. */ -extern void line_warning PROTO(( char[], int )); +extern void line_warning PROTO ((const char *, int)); /* Write out a message, pinpointing it at the given line. */ -extern void line_pinpoint PROTO(( char[], int )); +extern void line_pinpoint PROTO ((const char *, int)); /* Report a formatted syntax error. */ -extern void format_synerr PROTO((char [], char[])); -extern void synerr PROTO((char [])); /* report a syntax error */ -extern void format_warn PROTO((char [], char[])); -extern void warn PROTO((char [])); /* report a warning */ -extern void yyerror PROTO((char [])); /* report a parse error */ -extern int yyparse PROTO((void)); /* the YACC parser */ +extern void format_synerr PROTO ((const char *, const char *)); +extern void synerr PROTO ((const char *)); /* report a syntax error */ +extern void format_warn PROTO ((const char *, const char *)); +extern void warn PROTO ((const char *)); /* report a warning */ +extern void yyerror PROTO ((const char *)); /* report a parse error */ +extern int yyparse PROTO ((void)); /* the YACC parser */ /* from file scan.l */ /* The Flex-generated scanner for flex. */ -extern int flexscan PROTO((void)); +extern int flexscan PROTO ((void)); /* Open the given file (if NULL, stdin) for scanning. */ -extern void set_input_file PROTO((char*)); +extern void set_input_file PROTO ((char *)); /* Wrapup a file in the lexical analyzer. */ -extern int yywrap PROTO((void)); +extern int yywrap PROTO ((void)); /* from file sym.c */ -/* Add symbol and definitions to symbol table. */ -extern int addsym PROTO((register char[], char*, int, hash_table, int)); - /* Save the text of a character class. */ -extern void cclinstal PROTO ((Char [], int)); +extern void cclinstal PROTO ((Char[], int)); /* Lookup the number associated with character class. */ -extern int ccllookup PROTO((Char [])); - -/* Find symbol in symbol table. */ -extern struct hash_entry *findsym PROTO((register char[], hash_table, int )); +extern int ccllookup PROTO ((Char[])); -extern void ndinstal PROTO((char[], Char[])); /* install a name definition */ -extern Char *ndlookup PROTO((char[])); /* lookup a name definition */ +extern void ndinstal PROTO ((const char *, Char[])); /* install a name definition */ +extern Char *ndlookup PROTO ((const char *)); /* lookup a name definition */ /* Increase maximum number of SC's. */ -extern void scextend PROTO((void)); -extern void scinstal PROTO((char[], int)); /* make a start condition */ +extern void scextend PROTO ((void)); +extern void scinstal PROTO ((const char *, int)); /* make a start condition */ /* Lookup the number associated with a start condition. */ -extern int sclookup PROTO((char[])); +extern int sclookup PROTO ((const char *)); /* from file tblcmp.c */ /* Build table entries for dfa state. */ -extern void bldtbl PROTO((int[], int, int, int, int)); +extern void bldtbl PROTO ((int[], int, int, int, int)); + +extern void cmptmps PROTO ((void)); /* compress template table entries */ +extern void expand_nxt_chk PROTO ((void)); /* increase nxt/chk arrays */ -extern void cmptmps PROTO((void)); /* compress template table entries */ -extern void expand_nxt_chk PROTO((void)); /* increase nxt/chk arrays */ /* Finds a space in the table for a state to be placed. */ -extern int find_table_space PROTO((int*, int)); -extern void inittbl PROTO((void)); /* initialize transition tables */ +extern int find_table_space PROTO ((int *, int)); +extern void inittbl PROTO ((void)); /* initialize transition tables */ + /* Make the default, "jam" table entries. */ -extern void mkdeftbl PROTO((void)); +extern void mkdeftbl PROTO ((void)); /* Create table entries for a state (or state fragment) which has * only one out-transition. */ -extern void mk1tbl PROTO((int, int, int, int)); +extern void mk1tbl PROTO ((int, int, int, int)); /* Place a state into full speed transition table. */ -extern void place_state PROTO((int*, int, int)); +extern void place_state PROTO ((int *, int, int)); /* Save states with only one out-transition to be processed later. */ -extern void stack1 PROTO((int, int, int, int)); +extern void stack1 PROTO ((int, int, int, int)); /* from file yylex.c */ -extern int yylex PROTO((void)); +extern int yylex PROTO ((void)); + +/* A growable array. See buf.c. */ +struct Buf { + void *elts; /* elements. */ + int nelts; /* number of elements. */ + size_t elt_size; /* in bytes. */ + int nmax; /* max capacity of elements. */ +}; + +extern void buf_init PROTO ((struct Buf * buf, size_t elem_size)); +extern void buf_destroy PROTO ((struct Buf * buf)); +extern struct Buf *buf_append +PROTO ((struct Buf * buf, const void *ptr, int n_elem)); +extern struct Buf *buf_concat PROTO((struct Buf* dest, const struct Buf* src)); +extern struct Buf *buf_strappend PROTO ((struct Buf *, const char *str)); +extern struct Buf *buf_strnappend +PROTO ((struct Buf *, const char *str, int nchars)); +extern struct Buf *buf_strdefine +PROTO ((struct Buf * buf, const char *str, const char *def)); +extern struct Buf *buf_prints PROTO((struct Buf *buf, const char *fmt, const char* s)); +extern struct Buf *buf_m4_define PROTO((struct Buf *buf, const char* def, const char* val)); +extern struct Buf *buf_m4_undefine PROTO((struct Buf *buf, const char* def)); +extern struct Buf *buf_print_strings PROTO((struct Buf * buf, FILE* out)); +extern struct Buf *buf_linedir PROTO((struct Buf *buf, const char* filename, int lineno)); + +extern struct Buf userdef_buf; /* a string buffer for #define's generated by user-options on cmd line. */ +extern struct Buf defs_buf; /* a char* buffer to save #define'd some symbols generated by flex. */ +extern struct Buf yydmap_buf; /* a string buffer to hold yydmap elements */ +extern struct Buf m4defs_buf; /* Holds m4 definitions. */ +extern struct Buf top_buf; /* contains %top code. String buffer. */ + +/* For blocking out code from the header file. */ +#define OUT_BEGIN_CODE() outn("m4_ifdef( [[M4_YY_IN_HEADER]],,[[") +#define OUT_END_CODE() outn("]])") + +/* For setjmp/longjmp (instead of calling exit(2)). Linkage in main.c */ +extern jmp_buf flex_main_jmp_buf; + +#define FLEX_EXIT(status) longjmp(flex_main_jmp_buf,(status)+1) + +/* Removes all \n and \r chars from tail of str. returns str. */ +extern char *chomp (char *str); + +/* ctype functions forced to return boolean */ +#define b_isalnum(c) (isalnum(c)?true:false) +#define b_isalpha(c) (isalpha(c)?true:false) +#define b_isascii(c) (isascii(c)?true:false) +#define b_isblank(c) (isblank(c)?true:false) +#define b_iscntrl(c) (iscntrl(c)?true:false) +#define b_isdigit(c) (isdigit(c)?true:false) +#define b_isgraph(c) (isgraph(c)?true:false) +#define b_islower(c) (islower(c)?true:false) +#define b_isprint(c) (isprint(c)?true:false) +#define b_ispunct(c) (ispunct(c)?true:false) +#define b_isspace(c) (isspace(c)?true:false) +#define b_isupper(c) (isupper(c)?true:false) +#define b_isxdigit(c) (isxdigit(c)?true:false) + +/* return true if char is uppercase or lowercase. */ +bool has_case(int c); + +/* Change case of character if possible. */ +int reverse_case(int c); + +/* return false if [c1-c2] is ambiguous for a caseless scanner. */ +bool range_covers_case (int c1, int c2); + +/* + * From "filter.c" + */ + +/** A single stdio filter to execute. + * The filter may be external, such as "sed", or it + * may be internal, as a function call. + */ +struct filter { + int (*filter_func)(struct filter*); /**< internal filter function */ + void * extra; /**< extra data passed to filter_func */ + int argc; /**< arg count */ + const char ** argv; /**< arg vector, \0-terminated */ + struct filter * next; /**< next filter or NULL */ +}; + +/* output filter chain */ +extern struct filter * output_chain; +extern struct filter *filter_create_ext PROTO((struct filter * chain, const char *cmd, ...)); +struct filter *filter_create_int PROTO((struct filter *chain, + int (*filter_func) (struct filter *), + void *extra)); +extern bool filter_apply_chain PROTO((struct filter * chain)); +extern int filter_truncate (struct filter * chain, int max_len); +extern int filter_tee_header PROTO((struct filter *chain)); +extern int filter_fix_linedirs PROTO((struct filter *chain)); + + +/* + * From "regex.c" + */ + +extern regex_t regex_linedir, regex_blank_line; +bool flex_init_regex(void); +void flex_regcomp(regex_t *preg, const char *regex, int cflags); +char *regmatch_dup (regmatch_t * m, const char *src); +char *regmatch_cpy (regmatch_t * m, char *dest, const char *src); +int regmatch_len (regmatch_t * m); +int regmatch_strtol (regmatch_t * m, const char *src, char **endptr, int base); +bool regmatch_empty (regmatch_t * m); + +/* From "scanflags.h" */ +typedef unsigned int scanflags_t; +extern scanflags_t* _sf_stk; +extern size_t _sf_top_ix, _sf_max; /**< stack of scanner flags. */ +#define _SF_CASE_INS 0x0001 +#define _SF_DOT_ALL 0x0002 +#define _SF_SKIP_WS 0x0004 +#define sf_top() (_sf_stk[_sf_top_ix]) +#define sf_case_ins() (sf_top() & _SF_CASE_INS) +#define sf_dot_all() (sf_top() & _SF_DOT_ALL) +#define sf_skip_ws() (sf_top() & _SF_SKIP_WS) +#define sf_set_case_ins(X) ((X) ? (sf_top() |= _SF_CASE_INS) : (sf_top() &= ~_SF_CASE_INS)) +#define sf_set_dot_all(X) ((X) ? (sf_top() |= _SF_DOT_ALL) : (sf_top() &= ~_SF_DOT_ALL)) +#define sf_set_skip_ws(X) ((X) ? (sf_top() |= _SF_SKIP_WS) : (sf_top() &= ~_SF_SKIP_WS)) +extern void sf_init(void); +extern void sf_push(void); +extern void sf_pop(void); + + +#endif /* not defined FLEXDEF_H */ diff --git a/flexint.h b/flexint.h new file mode 100644 index 000000000000..60e91275e31d --- /dev/null +++ b/flexint.h @@ -0,0 +1,63 @@ +/* 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 + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#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 */ diff --git a/gen.c b/gen.c new file mode 100644 index 000000000000..848e2c586ce5 --- /dev/null +++ b/gen.c @@ -0,0 +1,2169 @@ +/* gen - actual generation (writing) of flex scanners */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" +#include "tables.h" + + +/* declare functions that have forward references */ + +void gen_next_state PROTO ((int)); +void genecs PROTO ((void)); +void indent_put2s PROTO ((const char *, const char *)); +void indent_puts PROTO ((const char *)); + + +static int indent_level = 0; /* each level is 8 spaces */ + +#define indent_up() (++indent_level) +#define indent_down() (--indent_level) +#define set_indent(indent_val) indent_level = indent_val + +/* Almost everything is done in terms of arrays starting at 1, so provide + * a null entry for the zero element of all C arrays. (The exception + * to this is that the fast table representation generally uses the + * 0 elements of its arrays, too.) + */ + +static const char *get_int16_decl (void) +{ + return (gentables) + ? "static yyconst flex_int16_t %s[%d] =\n { 0,\n" + : "static yyconst flex_int16_t * %s = 0;\n"; +} + + +static const char *get_int32_decl (void) +{ + return (gentables) + ? "static yyconst flex_int32_t %s[%d] =\n { 0,\n" + : "static yyconst flex_int32_t * %s = 0;\n"; +} + +static const char *get_state_decl (void) +{ + return (gentables) + ? "static yyconst yy_state_type %s[%d] =\n { 0,\n" + : "static yyconst yy_state_type * %s = 0;\n"; +} + +/* Indent to the current level. */ + +void do_indent () +{ + register int i = indent_level * 8; + + while (i >= 8) { + outc ('\t'); + i -= 8; + } + + while (i > 0) { + outc (' '); + --i; + } +} + + +/** Make the table for possible eol matches. + * @return the newly allocated rule_can_match_eol table + */ +static struct yytbl_data *mkeoltbl (void) +{ + int i; + flex_int8_t *tdata = 0; + struct yytbl_data *tbl; + + tbl = (struct yytbl_data *) calloc (1, sizeof (struct yytbl_data)); + yytbl_data_init (tbl, YYTD_ID_RULE_CAN_MATCH_EOL); + tbl->td_flags = YYTD_DATA8; + tbl->td_lolen = num_rules + 1; + tbl->td_data = tdata = + (flex_int8_t *) calloc (tbl->td_lolen, sizeof (flex_int8_t)); + + for (i = 1; i <= num_rules; i++) + tdata[i] = rule_has_nl[i] ? 1 : 0; + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_RULE_CAN_MATCH_EOL, (void**)&yy_rule_can_match_eol, sizeof(%s)},\n", + "flex_int32_t"); + return tbl; +} + +/* Generate the table for possible eol matches. */ +static void geneoltbl () +{ + int i; + + outn ("m4_ifdef( [[M4_YY_USE_LINENO]],[["); + outn ("/* Table of booleans, true if rule could match eol. */"); + out_str_dec (get_int32_decl (), "yy_rule_can_match_eol", + num_rules + 1); + + if (gentables) { + for (i = 1; i <= num_rules; i++) { + out_dec ("%d, ", rule_has_nl[i] ? 1 : 0); + /* format nicely, 20 numbers per line. */ + if ((i % 20) == 19) + out ("\n "); + } + out (" };\n"); + } + outn ("]])"); +} + + +/* Generate the code to keep backing-up information. */ + +void gen_backing_up () +{ + if (reject || num_backing_up == 0) + return; + + if (fullspd) + indent_puts ("if ( yy_current_state[-1].yy_nxt )"); + else + indent_puts ("if ( yy_accept[yy_current_state] )"); + + indent_up (); + indent_puts ("{"); + indent_puts ("YY_G(yy_last_accepting_state) = yy_current_state;"); + indent_puts ("YY_G(yy_last_accepting_cpos) = yy_cp;"); + indent_puts ("}"); + indent_down (); +} + + +/* Generate the code to perform the backing up. */ + +void gen_bu_action () +{ + if (reject || num_backing_up == 0) + return; + + set_indent (3); + + indent_puts ("case 0: /* must back up */"); + indent_puts ("/* undo the effects of YY_DO_BEFORE_ACTION */"); + indent_puts ("*yy_cp = YY_G(yy_hold_char);"); + + if (fullspd || fulltbl) + indent_puts ("yy_cp = YY_G(yy_last_accepting_cpos) + 1;"); + else + /* Backing-up info for compressed tables is taken \after/ + * yy_cp has been incremented for the next state. + */ + indent_puts ("yy_cp = YY_G(yy_last_accepting_cpos);"); + + indent_puts ("yy_current_state = YY_G(yy_last_accepting_state);"); + indent_puts ("goto yy_find_action;"); + outc ('\n'); + + set_indent (0); +} + +/** mkctbl - make full speed compressed transition table + * This is an array of structs; each struct a pair of integers. + * You should call mkssltbl() immediately after this. + * Then, I think, mkecstbl(). Arrrg. + * @return the newly allocated trans table + */ + +static struct yytbl_data *mkctbl (void) +{ + register int i; + struct yytbl_data *tbl = 0; + flex_int32_t *tdata = 0, curr = 0; + int end_of_buffer_action = num_rules + 1; + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_TRANSITION, (void**)&yy_transition, sizeof(%s)},\n", + ((tblend + numecs + 1) >= INT16_MAX + || long_align) ? "flex_int32_t" : "flex_int16_t"); + + tbl = (struct yytbl_data *) calloc (1, sizeof (struct yytbl_data)); + yytbl_data_init (tbl, YYTD_ID_TRANSITION); + tbl->td_flags = YYTD_DATA32 | YYTD_STRUCT; + tbl->td_hilen = 0; + tbl->td_lolen = tblend + numecs + 1; /* number of structs */ + + tbl->td_data = tdata = + (flex_int32_t *) calloc (tbl->td_lolen * 2, sizeof (flex_int32_t)); + + /* We want the transition to be represented as the offset to the + * next state, not the actual state number, which is what it currently + * is. The offset is base[nxt[i]] - (base of current state)]. That's + * just the difference between the starting points of the two involved + * states (to - from). + * + * First, though, we need to find some way to put in our end-of-buffer + * flags and states. We do this by making a state with absolutely no + * transitions. We put it at the end of the table. + */ + + /* We need to have room in nxt/chk for two more slots: One for the + * action and one for the end-of-buffer transition. We now *assume* + * that we're guaranteed the only character we'll try to index this + * nxt/chk pair with is EOB, i.e., 0, so we don't have to make sure + * there's room for jam entries for other characters. + */ + + while (tblend + 2 >= current_max_xpairs) + expand_nxt_chk (); + + while (lastdfa + 1 >= current_max_dfas) + increase_max_dfas (); + + base[lastdfa + 1] = tblend + 2; + nxt[tblend + 1] = end_of_buffer_action; + chk[tblend + 1] = numecs + 1; + chk[tblend + 2] = 1; /* anything but EOB */ + + /* So that "make test" won't show arb. differences. */ + nxt[tblend + 2] = 0; + + /* Make sure every state has an end-of-buffer transition and an + * action #. + */ + for (i = 0; i <= lastdfa; ++i) { + int anum = dfaacc[i].dfaacc_state; + int offset = base[i]; + + chk[offset] = EOB_POSITION; + chk[offset - 1] = ACTION_POSITION; + nxt[offset - 1] = anum; /* action number */ + } + + for (i = 0; i <= tblend; ++i) { + if (chk[i] == EOB_POSITION) { + tdata[curr++] = 0; + tdata[curr++] = base[lastdfa + 1] - i; + } + + else if (chk[i] == ACTION_POSITION) { + tdata[curr++] = 0; + tdata[curr++] = nxt[i]; + } + + else if (chk[i] > numecs || chk[i] == 0) { + tdata[curr++] = 0; + tdata[curr++] = 0; + } + else { /* verify, transition */ + + tdata[curr++] = chk[i]; + tdata[curr++] = base[nxt[i]] - (i - chk[i]); + } + } + + + /* Here's the final, end-of-buffer state. */ + tdata[curr++] = chk[tblend + 1]; + tdata[curr++] = nxt[tblend + 1]; + + tdata[curr++] = chk[tblend + 2]; + tdata[curr++] = nxt[tblend + 2]; + + return tbl; +} + + +/** Make start_state_list table. + * @return the newly allocated start_state_list table + */ +static struct yytbl_data *mkssltbl (void) +{ + struct yytbl_data *tbl = 0; + flex_int32_t *tdata = 0; + flex_int32_t i; + + tbl = (struct yytbl_data *) calloc (1, sizeof (struct yytbl_data)); + yytbl_data_init (tbl, YYTD_ID_START_STATE_LIST); + tbl->td_flags = YYTD_DATA32 | YYTD_PTRANS; + tbl->td_hilen = 0; + tbl->td_lolen = lastsc * 2 + 1; + + tbl->td_data = tdata = + (flex_int32_t *) calloc (tbl->td_lolen, sizeof (flex_int32_t)); + + for (i = 0; i <= lastsc * 2; ++i) + tdata[i] = base[i]; + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_START_STATE_LIST, (void**)&yy_start_state_list, sizeof(%s)},\n", + "struct yy_trans_info*"); + + return tbl; +} + + + +/* genctbl - generates full speed compressed transition table */ + +void genctbl () +{ + register int i; + int end_of_buffer_action = num_rules + 1; + + /* Table of verify for transition and offset to next state. */ + if (gentables) + out_dec ("static yyconst struct yy_trans_info yy_transition[%d] =\n {\n", tblend + numecs + 1); + else + outn ("static yyconst struct yy_trans_info *yy_transition = 0;"); + + /* We want the transition to be represented as the offset to the + * next state, not the actual state number, which is what it currently + * is. The offset is base[nxt[i]] - (base of current state)]. That's + * just the difference between the starting points of the two involved + * states (to - from). + * + * First, though, we need to find some way to put in our end-of-buffer + * flags and states. We do this by making a state with absolutely no + * transitions. We put it at the end of the table. + */ + + /* We need to have room in nxt/chk for two more slots: One for the + * action and one for the end-of-buffer transition. We now *assume* + * that we're guaranteed the only character we'll try to index this + * nxt/chk pair with is EOB, i.e., 0, so we don't have to make sure + * there's room for jam entries for other characters. + */ + + while (tblend + 2 >= current_max_xpairs) + expand_nxt_chk (); + + while (lastdfa + 1 >= current_max_dfas) + increase_max_dfas (); + + base[lastdfa + 1] = tblend + 2; + nxt[tblend + 1] = end_of_buffer_action; + chk[tblend + 1] = numecs + 1; + chk[tblend + 2] = 1; /* anything but EOB */ + + /* So that "make test" won't show arb. differences. */ + nxt[tblend + 2] = 0; + + /* Make sure every state has an end-of-buffer transition and an + * action #. + */ + for (i = 0; i <= lastdfa; ++i) { + int anum = dfaacc[i].dfaacc_state; + int offset = base[i]; + + chk[offset] = EOB_POSITION; + chk[offset - 1] = ACTION_POSITION; + nxt[offset - 1] = anum; /* action number */ + } + + for (i = 0; i <= tblend; ++i) { + if (chk[i] == EOB_POSITION) + transition_struct_out (0, base[lastdfa + 1] - i); + + else if (chk[i] == ACTION_POSITION) + transition_struct_out (0, nxt[i]); + + else if (chk[i] > numecs || chk[i] == 0) + transition_struct_out (0, 0); /* unused slot */ + + else /* verify, transition */ + transition_struct_out (chk[i], + base[nxt[i]] - (i - + chk[i])); + } + + + /* Here's the final, end-of-buffer state. */ + transition_struct_out (chk[tblend + 1], nxt[tblend + 1]); + transition_struct_out (chk[tblend + 2], nxt[tblend + 2]); + + if (gentables) + outn (" };\n"); + + /* Table of pointers to start states. */ + if (gentables) + out_dec ("static yyconst struct yy_trans_info *yy_start_state_list[%d] =\n", lastsc * 2 + 1); + else + outn ("static yyconst struct yy_trans_info **yy_start_state_list =0;"); + + if (gentables) { + outn (" {"); + + for (i = 0; i <= lastsc * 2; ++i) + out_dec (" &yy_transition[%d],\n", base[i]); + + dataend (); + } + + if (useecs) + genecs (); +} + + +/* mkecstbl - Make equivalence-class tables. */ + +struct yytbl_data *mkecstbl (void) +{ + register int i; + struct yytbl_data *tbl = 0; + flex_int32_t *tdata = 0; + + tbl = (struct yytbl_data *) calloc (1, sizeof (struct yytbl_data)); + yytbl_data_init (tbl, YYTD_ID_EC); + tbl->td_flags |= YYTD_DATA32; + tbl->td_hilen = 0; + tbl->td_lolen = csize; + + tbl->td_data = tdata = + (flex_int32_t *) calloc (tbl->td_lolen, sizeof (flex_int32_t)); + + for (i = 1; i < csize; ++i) { + ecgroup[i] = ABS (ecgroup[i]); + tdata[i] = ecgroup[i]; + } + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_EC, (void**)&yy_ec, sizeof(%s)},\n", + "flex_int32_t"); + + return tbl; +} + +/* Generate equivalence-class tables. */ + +void genecs () +{ + register int i, j; + int numrows; + + out_str_dec (get_int32_decl (), "yy_ec", csize); + + for (i = 1; i < csize; ++i) { + ecgroup[i] = ABS (ecgroup[i]); + mkdata (ecgroup[i]); + } + + dataend (); + + if (trace) { + fputs (_("\n\nEquivalence Classes:\n\n"), stderr); + + numrows = csize / 8; + + for (j = 0; j < numrows; ++j) { + for (i = j; i < csize; i = i + numrows) { + fprintf (stderr, "%4s = %-2d", + readable_form (i), ecgroup[i]); + + putc (' ', stderr); + } + + putc ('\n', stderr); + } + } +} + + +/* Generate the code to find the action number. */ + +void gen_find_action () +{ + if (fullspd) + indent_puts ("yy_act = yy_current_state[-1].yy_nxt;"); + + else if (fulltbl) + indent_puts ("yy_act = yy_accept[yy_current_state];"); + + else if (reject) { + indent_puts ("yy_current_state = *--YY_G(yy_state_ptr);"); + indent_puts ("YY_G(yy_lp) = yy_accept[yy_current_state];"); + + outn ("find_rule: /* we branch to this label when backing up */"); + + indent_puts + ("for ( ; ; ) /* until we find what rule we matched */"); + + indent_up (); + + indent_puts ("{"); + + indent_puts + ("if ( YY_G(yy_lp) && YY_G(yy_lp) < yy_accept[yy_current_state + 1] )"); + indent_up (); + indent_puts ("{"); + indent_puts ("yy_act = yy_acclist[YY_G(yy_lp)];"); + + if (variable_trailing_context_rules) { + indent_puts + ("if ( yy_act & YY_TRAILING_HEAD_MASK ||"); + indent_puts (" YY_G(yy_looking_for_trail_begin) )"); + indent_up (); + indent_puts ("{"); + + indent_puts + ("if ( yy_act == YY_G(yy_looking_for_trail_begin) )"); + indent_up (); + indent_puts ("{"); + indent_puts ("YY_G(yy_looking_for_trail_begin) = 0;"); + indent_puts ("yy_act &= ~YY_TRAILING_HEAD_MASK;"); + indent_puts ("break;"); + indent_puts ("}"); + indent_down (); + + indent_puts ("}"); + indent_down (); + + indent_puts + ("else if ( yy_act & YY_TRAILING_MASK )"); + indent_up (); + indent_puts ("{"); + indent_puts + ("YY_G(yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;"); + indent_puts + ("YY_G(yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;"); + + if (real_reject) { + /* Remember matched text in case we back up + * due to REJECT. + */ + indent_puts + ("YY_G(yy_full_match) = yy_cp;"); + indent_puts + ("YY_G(yy_full_state) = YY_G(yy_state_ptr);"); + indent_puts ("YY_G(yy_full_lp) = YY_G(yy_lp);"); + } + + indent_puts ("}"); + indent_down (); + + indent_puts ("else"); + indent_up (); + indent_puts ("{"); + indent_puts ("YY_G(yy_full_match) = yy_cp;"); + indent_puts + ("YY_G(yy_full_state) = YY_G(yy_state_ptr);"); + indent_puts ("YY_G(yy_full_lp) = YY_G(yy_lp);"); + indent_puts ("break;"); + indent_puts ("}"); + indent_down (); + + indent_puts ("++YY_G(yy_lp);"); + indent_puts ("goto find_rule;"); + } + + else { + /* Remember matched text in case we back up due to + * trailing context plus REJECT. + */ + indent_up (); + indent_puts ("{"); + indent_puts ("YY_G(yy_full_match) = yy_cp;"); + indent_puts ("break;"); + indent_puts ("}"); + indent_down (); + } + + indent_puts ("}"); + indent_down (); + + indent_puts ("--yy_cp;"); + + /* We could consolidate the following two lines with those at + * the beginning, but at the cost of complaints that we're + * branching inside a loop. + */ + indent_puts ("yy_current_state = *--YY_G(yy_state_ptr);"); + indent_puts ("YY_G(yy_lp) = yy_accept[yy_current_state];"); + + indent_puts ("}"); + + indent_down (); + } + + else { /* compressed */ + indent_puts ("yy_act = yy_accept[yy_current_state];"); + + if (interactive && !reject) { + /* Do the guaranteed-needed backing up to figure out + * the match. + */ + indent_puts ("if ( yy_act == 0 )"); + indent_up (); + indent_puts ("{ /* have to back up */"); + indent_puts + ("yy_cp = YY_G(yy_last_accepting_cpos);"); + indent_puts + ("yy_current_state = YY_G(yy_last_accepting_state);"); + indent_puts + ("yy_act = yy_accept[yy_current_state];"); + indent_puts ("}"); + indent_down (); + } + } +} + +/* mkftbl - make the full table and return the struct . + * you should call mkecstbl() after this. + */ + +struct yytbl_data *mkftbl (void) +{ + register int i; + int end_of_buffer_action = num_rules + 1; + struct yytbl_data *tbl; + flex_int32_t *tdata = 0; + + tbl = (struct yytbl_data *) calloc (1, sizeof (struct yytbl_data)); + yytbl_data_init (tbl, YYTD_ID_ACCEPT); + tbl->td_flags |= YYTD_DATA32; + tbl->td_hilen = 0; /* it's a one-dimensional array */ + tbl->td_lolen = lastdfa + 1; + + tbl->td_data = tdata = + (flex_int32_t *) calloc (tbl->td_lolen, sizeof (flex_int32_t)); + + dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action; + + for (i = 1; i <= lastdfa; ++i) { + register int anum = dfaacc[i].dfaacc_state; + + tdata[i] = anum; + + if (trace && anum) + fprintf (stderr, _("state # %d accepts: [%d]\n"), + i, anum); + } + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_ACCEPT, (void**)&yy_accept, sizeof(%s)},\n", + long_align ? "flex_int32_t" : "flex_int16_t"); + return tbl; +} + + +/* genftbl - generate full transition table */ + +void genftbl () +{ + register int i; + int end_of_buffer_action = num_rules + 1; + + out_str_dec (long_align ? get_int32_decl () : get_int16_decl (), + "yy_accept", lastdfa + 1); + + dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action; + + for (i = 1; i <= lastdfa; ++i) { + register int anum = dfaacc[i].dfaacc_state; + + mkdata (anum); + + if (trace && anum) + fprintf (stderr, _("state # %d accepts: [%d]\n"), + i, anum); + } + + dataend (); + + if (useecs) + genecs (); + + /* Don't have to dump the actual full table entries - they were + * created on-the-fly. + */ +} + + +/* Generate the code to find the next compressed-table state. */ + +void gen_next_compressed_state (char_map) + char *char_map; +{ + indent_put2s ("register YY_CHAR yy_c = %s;", char_map); + + /* Save the backing-up info \before/ computing the next state + * because we always compute one more state than needed - we + * always proceed until we reach a jam state + */ + gen_backing_up (); + + indent_puts + ("while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )"); + indent_up (); + indent_puts ("{"); + indent_puts ("yy_current_state = (int) yy_def[yy_current_state];"); + + if (usemecs) { + /* We've arrange it so that templates are never chained + * to one another. This means we can afford to make a + * very simple test to see if we need to convert to + * yy_c's meta-equivalence class without worrying + * about erroneously looking up the meta-equivalence + * class twice + */ + do_indent (); + + /* lastdfa + 2 is the beginning of the templates */ + out_dec ("if ( yy_current_state >= %d )\n", lastdfa + 2); + + indent_up (); + indent_puts ("yy_c = yy_meta[(unsigned int) yy_c];"); + indent_down (); + } + + indent_puts ("}"); + indent_down (); + + indent_puts + ("yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];"); +} + + +/* Generate the code to find the next match. */ + +void gen_next_match () +{ + /* NOTE - changes in here should be reflected in gen_next_state() and + * gen_NUL_trans(). + */ + char *char_map = useecs ? + "yy_ec[YY_SC_TO_UI(*yy_cp)] " : "YY_SC_TO_UI(*yy_cp)"; + + char *char_map_2 = useecs ? + "yy_ec[YY_SC_TO_UI(*++yy_cp)] " : "YY_SC_TO_UI(*++yy_cp)"; + + if (fulltbl) { + if (gentables) + indent_put2s + ("while ( (yy_current_state = yy_nxt[yy_current_state][ %s ]) > 0 )", + char_map); + else + indent_put2s + ("while ( (yy_current_state = yy_nxt[yy_current_state*YY_NXT_LOLEN + %s ]) > 0 )", + char_map); + + indent_up (); + + if (num_backing_up > 0) { + indent_puts ("{"); + gen_backing_up (); + outc ('\n'); + } + + indent_puts ("++yy_cp;"); + + if (num_backing_up > 0) + + indent_puts ("}"); + + indent_down (); + + outc ('\n'); + indent_puts ("yy_current_state = -yy_current_state;"); + } + + else if (fullspd) { + indent_puts ("{"); + indent_puts + ("register yyconst struct yy_trans_info *yy_trans_info;\n"); + indent_puts ("register YY_CHAR yy_c;\n"); + indent_put2s ("for ( yy_c = %s;", char_map); + indent_puts + (" (yy_trans_info = &yy_current_state[(unsigned int) yy_c])->"); + indent_puts ("yy_verify == yy_c;"); + indent_put2s (" yy_c = %s )", char_map_2); + + indent_up (); + + if (num_backing_up > 0) + indent_puts ("{"); + + indent_puts ("yy_current_state += yy_trans_info->yy_nxt;"); + + if (num_backing_up > 0) { + outc ('\n'); + gen_backing_up (); + indent_puts ("}"); + } + + indent_down (); + indent_puts ("}"); + } + + else { /* compressed */ + indent_puts ("do"); + + indent_up (); + indent_puts ("{"); + + gen_next_state (false); + + indent_puts ("++yy_cp;"); + + + indent_puts ("}"); + indent_down (); + + do_indent (); + + if (interactive) + out_dec ("while ( yy_base[yy_current_state] != %d );\n", jambase); + else + out_dec ("while ( yy_current_state != %d );\n", + jamstate); + + if (!reject && !interactive) { + /* Do the guaranteed-needed backing up to figure out + * the match. + */ + indent_puts + ("yy_cp = YY_G(yy_last_accepting_cpos);"); + indent_puts + ("yy_current_state = YY_G(yy_last_accepting_state);"); + } + } +} + + +/* Generate the code to find the next state. */ + +void gen_next_state (worry_about_NULs) + int worry_about_NULs; +{ /* NOTE - changes in here should be reflected in gen_next_match() */ + char char_map[256]; + + if (worry_about_NULs && !nultrans) { + if (useecs) + snprintf (char_map, sizeof(char_map), + "(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : %d)", + NUL_ec); + else + snprintf (char_map, sizeof(char_map), + "(*yy_cp ? YY_SC_TO_UI(*yy_cp) : %d)", + NUL_ec); + } + + else + strcpy (char_map, useecs ? + "yy_ec[YY_SC_TO_UI(*yy_cp)]" : + "YY_SC_TO_UI(*yy_cp)"); + + if (worry_about_NULs && nultrans) { + if (!fulltbl && !fullspd) + /* Compressed tables back up *before* they match. */ + gen_backing_up (); + + indent_puts ("if ( *yy_cp )"); + indent_up (); + indent_puts ("{"); + } + + if (fulltbl) { + if (gentables) + indent_put2s + ("yy_current_state = yy_nxt[yy_current_state][%s];", + char_map); + else + indent_put2s + ("yy_current_state = yy_nxt[yy_current_state*YY_NXT_LOLEN + %s];", + char_map); + } + + else if (fullspd) + indent_put2s + ("yy_current_state += yy_current_state[%s].yy_nxt;", + char_map); + + else + gen_next_compressed_state (char_map); + + if (worry_about_NULs && nultrans) { + + indent_puts ("}"); + indent_down (); + indent_puts ("else"); + indent_up (); + indent_puts + ("yy_current_state = yy_NUL_trans[yy_current_state];"); + indent_down (); + } + + if (fullspd || fulltbl) + gen_backing_up (); + + if (reject) + indent_puts ("*YY_G(yy_state_ptr)++ = yy_current_state;"); +} + + +/* Generate the code to make a NUL transition. */ + +void gen_NUL_trans () +{ /* NOTE - changes in here should be reflected in gen_next_match() */ + /* Only generate a definition for "yy_cp" if we'll generate code + * that uses it. Otherwise lint and the like complain. + */ + int need_backing_up = (num_backing_up > 0 && !reject); + + if (need_backing_up && (!nultrans || fullspd || fulltbl)) + /* We're going to need yy_cp lying around for the call + * below to gen_backing_up(). + */ + indent_puts ("register char *yy_cp = YY_G(yy_c_buf_p);"); + + outc ('\n'); + + if (nultrans) { + indent_puts + ("yy_current_state = yy_NUL_trans[yy_current_state];"); + indent_puts ("yy_is_jam = (yy_current_state == 0);"); + } + + else if (fulltbl) { + do_indent (); + if (gentables) + out_dec ("yy_current_state = yy_nxt[yy_current_state][%d];\n", NUL_ec); + else + out_dec ("yy_current_state = yy_nxt[yy_current_state*YY_NXT_LOLEN + %d];\n", NUL_ec); + indent_puts ("yy_is_jam = (yy_current_state <= 0);"); + } + + else if (fullspd) { + do_indent (); + out_dec ("register int yy_c = %d;\n", NUL_ec); + + indent_puts + ("register yyconst struct yy_trans_info *yy_trans_info;\n"); + indent_puts + ("yy_trans_info = &yy_current_state[(unsigned int) yy_c];"); + indent_puts ("yy_current_state += yy_trans_info->yy_nxt;"); + + indent_puts + ("yy_is_jam = (yy_trans_info->yy_verify != yy_c);"); + } + + else { + char NUL_ec_str[20]; + + snprintf (NUL_ec_str, sizeof(NUL_ec_str), "%d", NUL_ec); + gen_next_compressed_state (NUL_ec_str); + + do_indent (); + out_dec ("yy_is_jam = (yy_current_state == %d);\n", + jamstate); + + if (reject) { + /* Only stack this state if it's a transition we + * actually make. If we stack it on a jam, then + * the state stack and yy_c_buf_p get out of sync. + */ + indent_puts ("if ( ! yy_is_jam )"); + indent_up (); + indent_puts + ("*YY_G(yy_state_ptr)++ = yy_current_state;"); + indent_down (); + } + } + + /* If we've entered an accepting state, back up; note that + * compressed tables have *already* done such backing up, so + * we needn't bother with it again. + */ + if (need_backing_up && (fullspd || fulltbl)) { + outc ('\n'); + indent_puts ("if ( ! yy_is_jam )"); + indent_up (); + indent_puts ("{"); + gen_backing_up (); + indent_puts ("}"); + indent_down (); + } +} + + +/* Generate the code to find the start state. */ + +void gen_start_state () +{ + if (fullspd) { + if (bol_needed) { + indent_puts + ("yy_current_state = yy_start_state_list[YY_G(yy_start) + YY_AT_BOL()];"); + } + else + indent_puts + ("yy_current_state = yy_start_state_list[YY_G(yy_start)];"); + } + + else { + indent_puts ("yy_current_state = YY_G(yy_start);"); + + if (bol_needed) + indent_puts ("yy_current_state += YY_AT_BOL();"); + + if (reject) { + /* Set up for storing up states. */ + outn ("m4_ifdef( [[M4_YY_USES_REJECT]],\n[["); + indent_puts + ("YY_G(yy_state_ptr) = YY_G(yy_state_buf);"); + indent_puts + ("*YY_G(yy_state_ptr)++ = yy_current_state;"); + outn ("]])"); + } + } +} + + +/* gentabs - generate data statements for the transition tables */ + +void gentabs () +{ + int i, j, k, *accset, nacc, *acc_array, total_states; + int end_of_buffer_action = num_rules + 1; + struct yytbl_data *yyacc_tbl = 0, *yymeta_tbl = 0, *yybase_tbl = 0, + *yydef_tbl = 0, *yynxt_tbl = 0, *yychk_tbl = 0, *yyacclist_tbl=0; + flex_int32_t *yyacc_data = 0, *yybase_data = 0, *yydef_data = 0, + *yynxt_data = 0, *yychk_data = 0, *yyacclist_data=0; + flex_int32_t yybase_curr = 0, yyacclist_curr=0,yyacc_curr=0; + + acc_array = allocate_integer_array (current_max_dfas); + nummt = 0; + + /* The compressed table format jams by entering the "jam state", + * losing information about the previous state in the process. + * In order to recover the previous state, we effectively need + * to keep backing-up information. + */ + ++num_backing_up; + + if (reject) { + /* Write out accepting list and pointer list. + + * First we generate the "yy_acclist" array. In the process, + * we compute the indices that will go into the "yy_accept" + * array, and save the indices in the dfaacc array. + */ + int EOB_accepting_list[2]; + + /* Set up accepting structures for the End Of Buffer state. */ + EOB_accepting_list[0] = 0; + EOB_accepting_list[1] = end_of_buffer_action; + accsiz[end_of_buffer_state] = 1; + dfaacc[end_of_buffer_state].dfaacc_set = + EOB_accepting_list; + + out_str_dec (long_align ? get_int32_decl () : + get_int16_decl (), "yy_acclist", MAX (numas, + 1) + 1); + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_ACCLIST, (void**)&yy_acclist, sizeof(%s)},\n", + long_align ? "flex_int32_t" : "flex_int16_t"); + + yyacclist_tbl = (struct yytbl_data*)calloc(1,sizeof(struct yytbl_data)); + yytbl_data_init (yyacclist_tbl, YYTD_ID_ACCLIST); + yyacclist_tbl->td_lolen = MAX(numas,1) + 1; + yyacclist_tbl->td_data = yyacclist_data = + (flex_int32_t *) calloc (yyacclist_tbl->td_lolen, sizeof (flex_int32_t)); + yyacclist_curr = 1; + + j = 1; /* index into "yy_acclist" array */ + + for (i = 1; i <= lastdfa; ++i) { + acc_array[i] = j; + + if (accsiz[i] != 0) { + accset = dfaacc[i].dfaacc_set; + nacc = accsiz[i]; + + if (trace) + fprintf (stderr, + _("state # %d accepts: "), + i); + + for (k = 1; k <= nacc; ++k) { + int accnum = accset[k]; + + ++j; + + if (variable_trailing_context_rules + && !(accnum & + YY_TRAILING_HEAD_MASK) + && accnum > 0 + && accnum <= num_rules + && rule_type[accnum] == + RULE_VARIABLE) { + /* Special hack to flag + * accepting number as part + * of trailing context rule. + */ + accnum |= YY_TRAILING_MASK; + } + + mkdata (accnum); + yyacclist_data[yyacclist_curr++] = accnum; + + if (trace) { + fprintf (stderr, "[%d]", + accset[k]); + + if (k < nacc) + fputs (", ", + stderr); + else + putc ('\n', + stderr); + } + } + } + } + + /* add accepting number for the "jam" state */ + acc_array[i] = j; + + dataend (); + if (tablesext) { + yytbl_data_compress (yyacclist_tbl); + if (yytbl_data_fwrite (&tableswr, yyacclist_tbl) < 0) + flexerror (_("Could not write yyacclist_tbl")); + yytbl_data_destroy (yyacclist_tbl); + yyacclist_tbl = NULL; + } + } + + else { + dfaacc[end_of_buffer_state].dfaacc_state = + end_of_buffer_action; + + for (i = 1; i <= lastdfa; ++i) + acc_array[i] = dfaacc[i].dfaacc_state; + + /* add accepting number for jam state */ + acc_array[i] = 0; + } + + /* Begin generating yy_accept */ + + /* Spit out "yy_accept" array. If we're doing "reject", it'll be + * pointers into the "yy_acclist" array. Otherwise it's actual + * accepting numbers. In either case, we just dump the numbers. + */ + + /* "lastdfa + 2" is the size of "yy_accept"; includes room for C arrays + * beginning at 0 and for "jam" state. + */ + k = lastdfa + 2; + + if (reject) + /* We put a "cap" on the table associating lists of accepting + * numbers with state numbers. This is needed because we tell + * where the end of an accepting list is by looking at where + * the list for the next state starts. + */ + ++k; + + out_str_dec (long_align ? get_int32_decl () : get_int16_decl (), + "yy_accept", k); + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_ACCEPT, (void**)&yy_accept, sizeof(%s)},\n", + long_align ? "flex_int32_t" : "flex_int16_t"); + + yyacc_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct yytbl_data)); + yytbl_data_init (yyacc_tbl, YYTD_ID_ACCEPT); + yyacc_tbl->td_lolen = k; + yyacc_tbl->td_data = yyacc_data = + (flex_int32_t *) calloc (yyacc_tbl->td_lolen, sizeof (flex_int32_t)); + yyacc_curr=1; + + for (i = 1; i <= lastdfa; ++i) { + mkdata (acc_array[i]); + yyacc_data[yyacc_curr++] = acc_array[i]; + + if (!reject && trace && acc_array[i]) + fprintf (stderr, _("state # %d accepts: [%d]\n"), + i, acc_array[i]); + } + + /* Add entry for "jam" state. */ + mkdata (acc_array[i]); + yyacc_data[yyacc_curr++] = acc_array[i]; + + if (reject) { + /* Add "cap" for the list. */ + mkdata (acc_array[i]); + yyacc_data[yyacc_curr++] = acc_array[i]; + } + + dataend (); + if (tablesext) { + yytbl_data_compress (yyacc_tbl); + if (yytbl_data_fwrite (&tableswr, yyacc_tbl) < 0) + flexerror (_("Could not write yyacc_tbl")); + yytbl_data_destroy (yyacc_tbl); + yyacc_tbl = NULL; + } + /* End generating yy_accept */ + + if (useecs) { + + genecs (); + if (tablesext) { + struct yytbl_data *tbl; + + tbl = mkecstbl (); + yytbl_data_compress (tbl); + if (yytbl_data_fwrite (&tableswr, tbl) < 0) + flexerror (_("Could not write ecstbl")); + yytbl_data_destroy (tbl); + tbl = 0; + } + } + + if (usemecs) { + /* Begin generating yy_meta */ + /* Write out meta-equivalence classes (used to index + * templates with). + */ + flex_int32_t *yymecs_data = 0; + yymeta_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct + yytbl_data)); + yytbl_data_init (yymeta_tbl, YYTD_ID_META); + yymeta_tbl->td_lolen = numecs + 1; + yymeta_tbl->td_data = yymecs_data = + (flex_int32_t *) calloc (yymeta_tbl->td_lolen, + sizeof (flex_int32_t)); + + if (trace) + fputs (_("\n\nMeta-Equivalence Classes:\n"), + stderr); + + out_str_dec (get_int32_decl (), "yy_meta", numecs + 1); + buf_prints (&yydmap_buf, + "\t{YYTD_ID_META, (void**)&yy_meta, sizeof(%s)},\n", + "flex_int32_t"); + + for (i = 1; i <= numecs; ++i) { + if (trace) + fprintf (stderr, "%d = %d\n", + i, ABS (tecbck[i])); + + mkdata (ABS (tecbck[i])); + yymecs_data[i] = ABS (tecbck[i]); + } + + dataend (); + if (tablesext) { + yytbl_data_compress (yymeta_tbl); + if (yytbl_data_fwrite (&tableswr, yymeta_tbl) < 0) + flexerror (_ + ("Could not write yymeta_tbl")); + yytbl_data_destroy (yymeta_tbl); + yymeta_tbl = NULL; + } + /* End generating yy_meta */ + } + + total_states = lastdfa + numtemps; + + /* Begin generating yy_base */ + out_str_dec ((tblend >= INT16_MAX || long_align) ? + get_int32_decl () : get_int16_decl (), + "yy_base", total_states + 1); + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_BASE, (void**)&yy_base, sizeof(%s)},\n", + (tblend >= INT16_MAX + || long_align) ? "flex_int32_t" : "flex_int16_t"); + yybase_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct yytbl_data)); + yytbl_data_init (yybase_tbl, YYTD_ID_BASE); + yybase_tbl->td_lolen = total_states + 1; + yybase_tbl->td_data = yybase_data = + (flex_int32_t *) calloc (yybase_tbl->td_lolen, + sizeof (flex_int32_t)); + yybase_curr = 1; + + for (i = 1; i <= lastdfa; ++i) { + register int d = def[i]; + + if (base[i] == JAMSTATE) + base[i] = jambase; + + if (d == JAMSTATE) + def[i] = jamstate; + + else if (d < 0) { + /* Template reference. */ + ++tmpuses; + def[i] = lastdfa - d + 1; + } + + mkdata (base[i]); + yybase_data[yybase_curr++] = base[i]; + } + + /* Generate jam state's base index. */ + mkdata (base[i]); + yybase_data[yybase_curr++] = base[i]; + + for (++i /* skip jam state */ ; i <= total_states; ++i) { + mkdata (base[i]); + yybase_data[yybase_curr++] = base[i]; + def[i] = jamstate; + } + + dataend (); + if (tablesext) { + yytbl_data_compress (yybase_tbl); + if (yytbl_data_fwrite (&tableswr, yybase_tbl) < 0) + flexerror (_("Could not write yybase_tbl")); + yytbl_data_destroy (yybase_tbl); + yybase_tbl = NULL; + } + /* End generating yy_base */ + + + /* Begin generating yy_def */ + out_str_dec ((total_states >= INT16_MAX || long_align) ? + get_int32_decl () : get_int16_decl (), + "yy_def", total_states + 1); + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_DEF, (void**)&yy_def, sizeof(%s)},\n", + (total_states >= INT16_MAX + || long_align) ? "flex_int32_t" : "flex_int16_t"); + + yydef_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct yytbl_data)); + yytbl_data_init (yydef_tbl, YYTD_ID_DEF); + yydef_tbl->td_lolen = total_states + 1; + yydef_tbl->td_data = yydef_data = + (flex_int32_t *) calloc (yydef_tbl->td_lolen, sizeof (flex_int32_t)); + + for (i = 1; i <= total_states; ++i) { + mkdata (def[i]); + yydef_data[i] = def[i]; + } + + dataend (); + if (tablesext) { + yytbl_data_compress (yydef_tbl); + if (yytbl_data_fwrite (&tableswr, yydef_tbl) < 0) + flexerror (_("Could not write yydef_tbl")); + yytbl_data_destroy (yydef_tbl); + yydef_tbl = NULL; + } + /* End generating yy_def */ + + + /* Begin generating yy_nxt */ + out_str_dec ((total_states >= INT16_MAX || long_align) ? + get_int32_decl () : get_int16_decl (), "yy_nxt", + tblend + 1); + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_NXT, (void**)&yy_nxt, sizeof(%s)},\n", + (total_states >= INT16_MAX + || long_align) ? "flex_int32_t" : "flex_int16_t"); + + yynxt_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct yytbl_data)); + yytbl_data_init (yynxt_tbl, YYTD_ID_NXT); + yynxt_tbl->td_lolen = tblend + 1; + yynxt_tbl->td_data = yynxt_data = + (flex_int32_t *) calloc (yynxt_tbl->td_lolen, sizeof (flex_int32_t)); + + for (i = 1; i <= tblend; ++i) { + /* Note, the order of the following test is important. + * If chk[i] is 0, then nxt[i] is undefined. + */ + if (chk[i] == 0 || nxt[i] == 0) + nxt[i] = jamstate; /* new state is the JAM state */ + + mkdata (nxt[i]); + yynxt_data[i] = nxt[i]; + } + + dataend (); + if (tablesext) { + yytbl_data_compress (yynxt_tbl); + if (yytbl_data_fwrite (&tableswr, yynxt_tbl) < 0) + flexerror (_("Could not write yynxt_tbl")); + yytbl_data_destroy (yynxt_tbl); + yynxt_tbl = NULL; + } + /* End generating yy_nxt */ + + /* Begin generating yy_chk */ + out_str_dec ((total_states >= INT16_MAX || long_align) ? + get_int32_decl () : get_int16_decl (), "yy_chk", + tblend + 1); + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_CHK, (void**)&yy_chk, sizeof(%s)},\n", + (total_states >= INT16_MAX + || long_align) ? "flex_int32_t" : "flex_int16_t"); + + yychk_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct yytbl_data)); + yytbl_data_init (yychk_tbl, YYTD_ID_CHK); + yychk_tbl->td_lolen = tblend + 1; + yychk_tbl->td_data = yychk_data = + (flex_int32_t *) calloc (yychk_tbl->td_lolen, sizeof (flex_int32_t)); + + for (i = 1; i <= tblend; ++i) { + if (chk[i] == 0) + ++nummt; + + mkdata (chk[i]); + yychk_data[i] = chk[i]; + } + + dataend (); + if (tablesext) { + yytbl_data_compress (yychk_tbl); + if (yytbl_data_fwrite (&tableswr, yychk_tbl) < 0) + flexerror (_("Could not write yychk_tbl")); + yytbl_data_destroy (yychk_tbl); + yychk_tbl = NULL; + } + /* End generating yy_chk */ + + flex_free ((void *) acc_array); +} + + +/* Write out a formatted string (with a secondary string argument) at the + * current indentation level, adding a final newline. + */ + +void indent_put2s (fmt, arg) + const char *fmt, *arg; +{ + do_indent (); + out_str (fmt, arg); + outn (""); +} + + +/* Write out a string at the current indentation level, adding a final + * newline. + */ + +void indent_puts (str) + const char *str; +{ + do_indent (); + outn (str); +} + + +/* make_tables - generate transition tables and finishes generating output file + */ + +void make_tables () +{ + register int i; + int did_eof_rule = false; + struct yytbl_data *yynultrans_tbl; + + + skelout (); /* %% [2.0] - break point in skel */ + + /* First, take care of YY_DO_BEFORE_ACTION depending on yymore + * being used. + */ + set_indent (1); + + if (yymore_used && !yytext_is_array) { + indent_puts ("YY_G(yytext_ptr) -= YY_G(yy_more_len); \\"); + indent_puts + ("yyleng = (size_t) (yy_cp - YY_G(yytext_ptr)); \\"); + } + + else + indent_puts ("yyleng = (size_t) (yy_cp - yy_bp); \\"); + + /* Now also deal with copying yytext_ptr to yytext if needed. */ + skelout (); /* %% [3.0] - break point in skel */ + if (yytext_is_array) { + if (yymore_used) + indent_puts + ("if ( yyleng + YY_G(yy_more_offset) >= YYLMAX ) \\"); + else + indent_puts ("if ( yyleng >= YYLMAX ) \\"); + + indent_up (); + indent_puts + ("YY_FATAL_ERROR( \"token too large, exceeds YYLMAX\" ); \\"); + indent_down (); + + if (yymore_used) { + indent_puts + ("yy_flex_strncpy( &yytext[YY_G(yy_more_offset)], YY_G(yytext_ptr), yyleng + 1 M4_YY_CALL_LAST_ARG); \\"); + indent_puts ("yyleng += YY_G(yy_more_offset); \\"); + indent_puts + ("YY_G(yy_prev_more_offset) = YY_G(yy_more_offset); \\"); + indent_puts ("YY_G(yy_more_offset) = 0; \\"); + } + else { + indent_puts + ("yy_flex_strncpy( yytext, YY_G(yytext_ptr), yyleng + 1 M4_YY_CALL_LAST_ARG); \\"); + } + } + + set_indent (0); + + skelout (); /* %% [4.0] - break point in skel */ + + + /* This is where we REALLY begin generating the tables. */ + + out_dec ("#define YY_NUM_RULES %d\n", num_rules); + out_dec ("#define YY_END_OF_BUFFER %d\n", num_rules + 1); + + if (fullspd) { + /* Need to define the transet type as a size large + * enough to hold the biggest offset. + */ + int total_table_size = tblend + numecs + 1; + char *trans_offset_type = + (total_table_size >= INT16_MAX || long_align) ? + "flex_int32_t" : "flex_int16_t"; + + set_indent (0); + indent_puts ("struct yy_trans_info"); + indent_up (); + indent_puts ("{"); + + /* We require that yy_verify and yy_nxt must be of the same size int. */ + indent_put2s ("%s yy_verify;", trans_offset_type); + + /* In cases where its sister yy_verify *is* a "yes, there is + * a transition", yy_nxt is the offset (in records) to the + * next state. In most cases where there is no transition, + * the value of yy_nxt is irrelevant. If yy_nxt is the -1th + * record of a state, though, then yy_nxt is the action number + * for that state. + */ + + indent_put2s ("%s yy_nxt;", trans_offset_type); + indent_puts ("};"); + indent_down (); + } + else { + /* We generate a bogus 'struct yy_trans_info' data type + * so we can guarantee that it is always declared in the skel. + * This is so we can compile "sizeof(struct yy_trans_info)" + * in any scanner. + */ + indent_puts + ("/* This struct is not used in this scanner,"); + indent_puts (" but its presence is necessary. */"); + indent_puts ("struct yy_trans_info"); + indent_up (); + indent_puts ("{"); + indent_puts ("flex_int32_t yy_verify;"); + indent_puts ("flex_int32_t yy_nxt;"); + indent_puts ("};"); + indent_down (); + } + + if (fullspd) { + genctbl (); + if (tablesext) { + struct yytbl_data *tbl; + + tbl = mkctbl (); + yytbl_data_compress (tbl); + if (yytbl_data_fwrite (&tableswr, tbl) < 0) + flexerror (_("Could not write ftbl")); + yytbl_data_destroy (tbl); + + tbl = mkssltbl (); + yytbl_data_compress (tbl); + if (yytbl_data_fwrite (&tableswr, tbl) < 0) + flexerror (_("Could not write ssltbl")); + yytbl_data_destroy (tbl); + tbl = 0; + + if (useecs) { + tbl = mkecstbl (); + yytbl_data_compress (tbl); + if (yytbl_data_fwrite (&tableswr, tbl) < 0) + flexerror (_ + ("Could not write ecstbl")); + yytbl_data_destroy (tbl); + tbl = 0; + } + } + } + else if (fulltbl) { + genftbl (); + if (tablesext) { + struct yytbl_data *tbl; + + tbl = mkftbl (); + yytbl_data_compress (tbl); + if (yytbl_data_fwrite (&tableswr, tbl) < 0) + flexerror (_("Could not write ftbl")); + yytbl_data_destroy (tbl); + tbl = 0; + + if (useecs) { + tbl = mkecstbl (); + yytbl_data_compress (tbl); + if (yytbl_data_fwrite (&tableswr, tbl) < 0) + flexerror (_ + ("Could not write ecstbl")); + yytbl_data_destroy (tbl); + tbl = 0; + } + } + } + else + gentabs (); + + if (do_yylineno) { + + geneoltbl (); + + if (tablesext) { + struct yytbl_data *tbl; + + tbl = mkeoltbl (); + yytbl_data_compress (tbl); + if (yytbl_data_fwrite (&tableswr, tbl) < 0) + flexerror (_("Could not write eoltbl")); + yytbl_data_destroy (tbl); + tbl = 0; + } + } + + /* Definitions for backing up. We don't need them if REJECT + * is being used because then we use an alternative backin-up + * technique instead. + */ + if (num_backing_up > 0 && !reject) { + if (!C_plus_plus && !reentrant) { + indent_puts + ("static yy_state_type yy_last_accepting_state;"); + indent_puts + ("static char *yy_last_accepting_cpos;\n"); + } + } + + if (nultrans) { + flex_int32_t *yynultrans_data = 0; + + /* Begin generating yy_NUL_trans */ + out_str_dec (get_state_decl (), "yy_NUL_trans", + lastdfa + 1); + buf_prints (&yydmap_buf, + "\t{YYTD_ID_NUL_TRANS, (void**)&yy_NUL_trans, sizeof(%s)},\n", + (fullspd) ? "struct yy_trans_info*" : + "flex_int32_t"); + + yynultrans_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct + yytbl_data)); + yytbl_data_init (yynultrans_tbl, YYTD_ID_NUL_TRANS); + if (fullspd) + yynultrans_tbl->td_flags |= YYTD_PTRANS; + yynultrans_tbl->td_lolen = lastdfa + 1; + yynultrans_tbl->td_data = yynultrans_data = + (flex_int32_t *) calloc (yynultrans_tbl->td_lolen, + sizeof (flex_int32_t)); + + for (i = 1; i <= lastdfa; ++i) { + if (fullspd) { + out_dec (" &yy_transition[%d],\n", + base[i]); + yynultrans_data[i] = base[i]; + } + else { + mkdata (nultrans[i]); + yynultrans_data[i] = nultrans[i]; + } + } + + dataend (); + if (tablesext) { + yytbl_data_compress (yynultrans_tbl); + if (yytbl_data_fwrite (&tableswr, yynultrans_tbl) < + 0) + flexerror (_ + ("Could not write yynultrans_tbl")); + yytbl_data_destroy (yynultrans_tbl); + yynultrans_tbl = NULL; + } + /* End generating yy_NUL_trans */ + } + + if (!C_plus_plus && !reentrant) { + indent_puts ("extern int yy_flex_debug;"); + indent_put2s ("int yy_flex_debug = %s;\n", + ddebug ? "1" : "0"); + } + + if (ddebug) { /* Spit out table mapping rules to line numbers. */ + out_str_dec (long_align ? get_int32_decl () : + get_int16_decl (), "yy_rule_linenum", + num_rules); + for (i = 1; i < num_rules; ++i) + mkdata (rule_linenum[i]); + dataend (); + } + + if (reject) { + outn ("m4_ifdef( [[M4_YY_USES_REJECT]],\n[["); + /* Declare state buffer variables. */ + if (!C_plus_plus && !reentrant) { + outn ("static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;"); + outn ("static char *yy_full_match;"); + outn ("static int yy_lp;"); + } + + if (variable_trailing_context_rules) { + if (!C_plus_plus && !reentrant) { + outn ("static int yy_looking_for_trail_begin = 0;"); + outn ("static int yy_full_lp;"); + outn ("static int *yy_full_state;"); + } + + out_hex ("#define YY_TRAILING_MASK 0x%x\n", + (unsigned int) YY_TRAILING_MASK); + out_hex ("#define YY_TRAILING_HEAD_MASK 0x%x\n", + (unsigned int) YY_TRAILING_HEAD_MASK); + } + + outn ("#define REJECT \\"); + outn ("{ \\"); + outn ("*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */ \\"); + outn ("yy_cp = YY_G(yy_full_match); /* restore poss. backed-over text */ \\"); + + if (variable_trailing_context_rules) { + outn ("YY_G(yy_lp) = YY_G(yy_full_lp); /* restore orig. accepting pos. */ \\"); + outn ("YY_G(yy_state_ptr) = YY_G(yy_full_state); /* restore orig. state */ \\"); + outn ("yy_current_state = *YY_G(yy_state_ptr); /* restore curr. state */ \\"); + } + + outn ("++YY_G(yy_lp); \\"); + outn ("goto find_rule; \\"); + + outn ("}"); + outn ("]])\n"); + } + + else { + outn ("/* The intent behind this definition is that it'll catch"); + outn (" * any uses of REJECT which flex missed."); + outn (" */"); + outn ("#define REJECT reject_used_but_not_detected"); + } + + if (yymore_used) { + if (!C_plus_plus) { + if (yytext_is_array) { + if (!reentrant){ + indent_puts ("static int yy_more_offset = 0;"); + indent_puts ("static int yy_prev_more_offset = 0;"); + } + } + else if (!reentrant) { + indent_puts + ("static int yy_more_flag = 0;"); + indent_puts + ("static int yy_more_len = 0;"); + } + } + + if (yytext_is_array) { + indent_puts + ("#define yymore() (YY_G(yy_more_offset) = yy_flex_strlen( yytext M4_YY_CALL_LAST_ARG))"); + indent_puts ("#define YY_NEED_STRLEN"); + indent_puts ("#define YY_MORE_ADJ 0"); + indent_puts + ("#define YY_RESTORE_YY_MORE_OFFSET \\"); + indent_up (); + indent_puts ("{ \\"); + indent_puts + ("YY_G(yy_more_offset) = YY_G(yy_prev_more_offset); \\"); + indent_puts ("yyleng -= YY_G(yy_more_offset); \\"); + indent_puts ("}"); + indent_down (); + } + else { + indent_puts + ("#define yymore() (YY_G(yy_more_flag) = 1)"); + indent_puts + ("#define YY_MORE_ADJ YY_G(yy_more_len)"); + indent_puts ("#define YY_RESTORE_YY_MORE_OFFSET"); + } + } + + else { + indent_puts + ("#define yymore() yymore_used_but_not_detected"); + indent_puts ("#define YY_MORE_ADJ 0"); + indent_puts ("#define YY_RESTORE_YY_MORE_OFFSET"); + } + + if (!C_plus_plus) { + if (yytext_is_array) { + outn ("#ifndef YYLMAX"); + outn ("#define YYLMAX 8192"); + outn ("#endif\n"); + if (!reentrant){ + outn ("char yytext[YYLMAX];"); + outn ("char *yytext_ptr;"); + } + } + + else { + if(! reentrant) + outn ("char *yytext;"); + } + } + + out (&action_array[defs1_offset]); + + line_directive_out (stdout, 0); + + skelout (); /* %% [5.0] - break point in skel */ + + if (!C_plus_plus) { + if (use_read) { + outn ("\terrno=0; \\"); + outn ("\twhile ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \\"); + outn ("\t{ \\"); + outn ("\t\tif( errno != EINTR) \\"); + outn ("\t\t{ \\"); + outn ("\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\"); + outn ("\t\t\tbreak; \\"); + outn ("\t\t} \\"); + outn ("\t\terrno=0; \\"); + outn ("\t\tclearerr(yyin); \\"); + outn ("\t}\\"); + } + + else { + outn ("\tif ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \\"); + outn ("\t\t{ \\"); + outn ("\t\tint c = '*'; \\"); + outn ("\t\tint n; \\"); + outn ("\t\tfor ( n = 0; n < max_size && \\"); + outn ("\t\t\t (c = getc( yyin )) != EOF && c != '\\n'; ++n ) \\"); + outn ("\t\t\tbuf[n] = (char) c; \\"); + outn ("\t\tif ( c == '\\n' ) \\"); + outn ("\t\t\tbuf[n++] = (char) c; \\"); + outn ("\t\tif ( c == EOF && ferror( yyin ) ) \\"); + outn ("\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\"); + outn ("\t\tresult = n; \\"); + outn ("\t\t} \\"); + outn ("\telse \\"); + outn ("\t\t{ \\"); + outn ("\t\terrno=0; \\"); + outn ("\t\twhile ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \\"); + outn ("\t\t\t{ \\"); + outn ("\t\t\tif( errno != EINTR) \\"); + outn ("\t\t\t\t{ \\"); + outn ("\t\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\"); + outn ("\t\t\t\tbreak; \\"); + outn ("\t\t\t\t} \\"); + outn ("\t\t\terrno=0; \\"); + outn ("\t\t\tclearerr(yyin); \\"); + outn ("\t\t\t} \\"); + outn ("\t\t}\\"); + } + } + + skelout (); /* %% [6.0] - break point in skel */ + + indent_puts ("#define YY_RULE_SETUP \\"); + indent_up (); + if (bol_needed) { + indent_puts ("if ( yyleng > 0 ) \\"); + indent_up (); + indent_puts ("YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \\"); + indent_puts ("\t\t(yytext[yyleng - 1] == '\\n'); \\"); + indent_down (); + } + indent_puts ("YY_USER_ACTION"); + indent_down (); + + skelout (); /* %% [7.0] - break point in skel */ + + /* Copy prolog to output file. */ + out (&action_array[prolog_offset]); + + line_directive_out (stdout, 0); + + skelout (); /* %% [8.0] - break point in skel */ + + set_indent (2); + + if (yymore_used && !yytext_is_array) { + indent_puts ("YY_G(yy_more_len) = 0;"); + indent_puts ("if ( YY_G(yy_more_flag) )"); + indent_up (); + indent_puts ("{"); + indent_puts + ("YY_G(yy_more_len) = YY_G(yy_c_buf_p) - YY_G(yytext_ptr);"); + indent_puts ("YY_G(yy_more_flag) = 0;"); + indent_puts ("}"); + indent_down (); + } + + skelout (); /* %% [9.0] - break point in skel */ + + gen_start_state (); + + /* Note, don't use any indentation. */ + outn ("yy_match:"); + gen_next_match (); + + skelout (); /* %% [10.0] - break point in skel */ + set_indent (2); + gen_find_action (); + + skelout (); /* %% [11.0] - break point in skel */ + outn ("m4_ifdef( [[M4_YY_USE_LINENO]],[["); + indent_puts + ("if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )"); + indent_up (); + indent_puts ("{"); + indent_puts ("int yyl;"); + do_indent (); + out_str ("for ( yyl = %s; yyl < yyleng; ++yyl )\n", + yymore_used ? (yytext_is_array ? "YY_G(yy_prev_more_offset)" : + "YY_G(yy_more_len)") : "0"); + indent_up (); + indent_puts ("if ( yytext[yyl] == '\\n' )"); + indent_up (); + indent_puts ("M4_YY_INCR_LINENO();"); + indent_down (); + indent_down (); + indent_puts ("}"); + indent_down (); + outn ("]])"); + + skelout (); /* %% [12.0] - break point in skel */ + if (ddebug) { + indent_puts ("if ( yy_flex_debug )"); + indent_up (); + + indent_puts ("{"); + indent_puts ("if ( yy_act == 0 )"); + indent_up (); + indent_puts (C_plus_plus ? + "std::cerr << \"--scanner backing up\\n\";" : + "fprintf( stderr, \"--scanner backing up\\n\" );"); + indent_down (); + + do_indent (); + out_dec ("else if ( yy_act < %d )\n", num_rules); + indent_up (); + + if (C_plus_plus) { + indent_puts + ("std::cerr << \"--accepting rule at line \" << yy_rule_linenum[yy_act] <<"); + indent_puts + (" \"(\\\"\" << yytext << \"\\\")\\n\";"); + } + else { + indent_puts + ("fprintf( stderr, \"--accepting rule at line %ld (\\\"%s\\\")\\n\","); + + indent_puts + (" (long)yy_rule_linenum[yy_act], yytext );"); + } + + indent_down (); + + do_indent (); + out_dec ("else if ( yy_act == %d )\n", num_rules); + indent_up (); + + if (C_plus_plus) { + indent_puts + ("std::cerr << \"--accepting default rule (\\\"\" << yytext << \"\\\")\\n\";"); + } + else { + indent_puts + ("fprintf( stderr, \"--accepting default rule (\\\"%s\\\")\\n\","); + indent_puts (" yytext );"); + } + + indent_down (); + + do_indent (); + out_dec ("else if ( yy_act == %d )\n", num_rules + 1); + indent_up (); + + indent_puts (C_plus_plus ? + "std::cerr << \"--(end of buffer or a NUL)\\n\";" : + "fprintf( stderr, \"--(end of buffer or a NUL)\\n\" );"); + + indent_down (); + + do_indent (); + outn ("else"); + indent_up (); + + if (C_plus_plus) { + indent_puts + ("std::cerr << \"--EOF (start condition \" << YY_START << \")\\n\";"); + } + else { + indent_puts + ("fprintf( stderr, \"--EOF (start condition %d)\\n\", YY_START );"); + } + + indent_down (); + + indent_puts ("}"); + indent_down (); + } + + /* Copy actions to output file. */ + skelout (); /* %% [13.0] - break point in skel */ + indent_up (); + gen_bu_action (); + out (&action_array[action_offset]); + + line_directive_out (stdout, 0); + + /* generate cases for any missing EOF rules */ + for (i = 1; i <= lastsc; ++i) + if (!sceof[i]) { + do_indent (); + out_str ("case YY_STATE_EOF(%s):\n", scname[i]); + did_eof_rule = true; + } + + if (did_eof_rule) { + indent_up (); + indent_puts ("yyterminate();"); + indent_down (); + } + + + /* Generate code for handling NUL's, if needed. */ + + /* First, deal with backing up and setting up yy_cp if the scanner + * finds that it should JAM on the NUL. + */ + skelout (); /* %% [14.0] - break point in skel */ + set_indent (4); + + if (fullspd || fulltbl) + indent_puts ("yy_cp = YY_G(yy_c_buf_p);"); + + else { /* compressed table */ + if (!reject && !interactive) { + /* Do the guaranteed-needed backing up to figure + * out the match. + */ + indent_puts + ("yy_cp = YY_G(yy_last_accepting_cpos);"); + indent_puts + ("yy_current_state = YY_G(yy_last_accepting_state);"); + } + + else + /* Still need to initialize yy_cp, though + * yy_current_state was set up by + * yy_get_previous_state(). + */ + indent_puts ("yy_cp = YY_G(yy_c_buf_p);"); + } + + + /* Generate code for yy_get_previous_state(). */ + set_indent (1); + skelout (); /* %% [15.0] - break point in skel */ + + gen_start_state (); + + set_indent (2); + skelout (); /* %% [16.0] - break point in skel */ + gen_next_state (true); + + set_indent (1); + skelout (); /* %% [17.0] - break point in skel */ + gen_NUL_trans (); + + skelout (); /* %% [18.0] - break point in skel */ + skelout (); /* %% [19.0] - break point in skel */ + /* Update BOL and yylineno inside of input(). */ + if (bol_needed) { + indent_puts + ("YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\\n');"); + if (do_yylineno) { + indent_puts + ("if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol )"); + indent_up (); + indent_puts ("M4_YY_INCR_LINENO();"); + indent_down (); + } + } + + else if (do_yylineno) { + indent_puts ("if ( c == '\\n' )"); + indent_up (); + indent_puts ("M4_YY_INCR_LINENO();"); + indent_down (); + } + + skelout (); + + /* Copy remainder of input to output. */ + + line_directive_out (stdout, 1); + + if (sectnum == 3) { + OUT_BEGIN_CODE (); + (void) flexscan (); /* copy remainder of input to output */ + OUT_END_CODE (); + } +} diff --git a/gettext.h b/gettext.h new file mode 100644 index 000000000000..ea67f30815ab --- /dev/null +++ b/gettext.h @@ -0,0 +1,59 @@ +/* Convenience header for conditional use of GNU <libintl.h>. + Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#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 + +/* 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/install-sh b/install-sh new file mode 100755 index 000000000000..4d4a9519eaf8 --- /dev/null +++ b/install-sh @@ -0,0 +1,323 @@ +#!/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/libmain.c b/libmain.c new file mode 100644 index 000000000000..49262e462bb0 --- /dev/null +++ b/libmain.c @@ -0,0 +1,33 @@ +/* libmain - flex run-time support library "main" function */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +extern int yylex (); + +int main (argc, argv) + int argc; + char *argv[]; +{ + while (yylex () != 0) ; + + return 0; +} diff --git a/libyywrap.c b/libyywrap.c new file mode 100644 index 000000000000..8561a43f4cdd --- /dev/null +++ b/libyywrap.c @@ -0,0 +1,27 @@ +/* libyywrap - flex run-time support library "yywrap" function */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +int yywrap (void) +{ + return 1; +} diff --git a/m4/Makefile.am b/m4/Makefile.am new file mode 100644 index 000000000000..109e92df3a43 --- /dev/null +++ b/m4/Makefile.am @@ -0,0 +1 @@ +EXTRA_DIST = codeset.m4 gettext.m4 glibc21.m4 iconv.m4 intdiv0.m4 inttypes-pri.m4 inttypes.m4 inttypes_h.m4 isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 progtest.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 nls.m4 po.m4 diff --git a/m4/Makefile.in b/m4/Makefile.in new file mode 100644 index 000000000000..bb1b4ea0893f --- /dev/null +++ b/m4/Makefile.in @@ -0,0 +1,316 @@ +# 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 = m4 +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BISON = @BISON@ +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@ +GMSGFMT = @GMSGFMT@ +HELP2MAN = @HELP2MAN@ +INDENT = @INDENT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +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@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +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 = codeset.m4 gettext.m4 glibc21.m4 iconv.m4 intdiv0.m4 inttypes-pri.m4 inttypes.m4 inttypes_h.m4 isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 progtest.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 nls.m4 po.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) --gnits m4/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnits m4/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/main.c b/main.c new file mode 100644 index 000000000000..cec2d77d3ab6 --- /dev/null +++ b/main.c @@ -0,0 +1,1857 @@ +/* flex - tool to generate fast lexical analyzers */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + + +#include "flexdef.h" +#include "version.h" +#include "options.h" +#include "tables.h" + +static char flex_version[] = FLEX_VERSION; + +/* declare functions that have forward references */ + +void flexinit PROTO ((int, char **)); +void readin PROTO ((void)); +void set_up_initial_allocations PROTO ((void)); +static char *basename2 PROTO ((char *path, int should_strip_ext)); + + +/* these globals are all defined and commented in flexdef.h */ +int printstats, syntaxerror, eofseen, ddebug, trace, nowarn, spprdflt; +int interactive, lex_compat, posix_compat, do_yylineno, + useecs, fulltbl, usemecs; +int fullspd, gen_line_dirs, performance_report, backing_up_report; +int C_plus_plus, long_align, use_read, yytext_is_array, do_yywrap, + csize; +int reentrant, bison_bridge_lval, bison_bridge_lloc; +int yymore_used, reject, real_reject, continued_action, in_rule; +int yymore_really_used, reject_really_used; +int datapos, dataline, linenum, out_linenum; +FILE *skelfile = NULL; +int skel_ind = 0; +char *action_array; +int action_size, defs1_offset, prolog_offset, action_offset, + action_index; +char *infilename = NULL, *outfilename = NULL, *headerfilename = NULL; +int did_outfilename; +char *prefix, *yyclass, *extra_type = NULL; +int do_stdinit, use_stdout; +int onestate[ONE_STACK_SIZE], onesym[ONE_STACK_SIZE]; +int onenext[ONE_STACK_SIZE], onedef[ONE_STACK_SIZE], onesp; +int maximum_mns, current_mns, current_max_rules; +int num_rules, num_eof_rules, default_rule, lastnfa; +int *firstst, *lastst, *finalst, *transchar, *trans1, *trans2; +int *accptnum, *assoc_rule, *state_type; +int *rule_type, *rule_linenum, *rule_useful; +int current_state_type; +int variable_trailing_context_rules; +int numtemps, numprots, protprev[MSP], protnext[MSP], prottbl[MSP]; +int protcomst[MSP], firstprot, lastprot, protsave[PROT_SAVE_SIZE]; +int numecs, nextecm[CSIZE + 1], ecgroup[CSIZE + 1], nummecs, + tecfwd[CSIZE + 1]; +int tecbck[CSIZE + 1]; +int lastsc, *scset, *scbol, *scxclu, *sceof; +int current_max_scs; +char **scname; +int current_max_dfa_size, current_max_xpairs; +int current_max_template_xpairs, current_max_dfas; +int lastdfa, *nxt, *chk, *tnxt; +int *base, *def, *nultrans, NUL_ec, tblend, firstfree, **dss, *dfasiz; +union dfaacc_union *dfaacc; +int *accsiz, *dhash, numas; +int numsnpairs, jambase, jamstate; +int lastccl, *cclmap, *ccllen, *cclng, cclreuse; +int current_maxccls, current_max_ccl_tbl_size; +Char *ccltbl; +char nmstr[MAXLINE]; +int sectnum, nummt, hshcol, dfaeql, numeps, eps2, num_reallocs; +int tmpuses, totnst, peakpairs, numuniq, numdup, hshsave; +int num_backing_up, bol_needed; +FILE *backing_up_file; +int end_of_buffer_state; +char **input_files; +int num_input_files; +jmp_buf flex_main_jmp_buf; +bool *rule_has_nl, *ccl_has_nl; +int nlch = '\n'; +bool ansi_func_defs, ansi_func_protos; + +bool tablesext, tablesverify, gentables; +char *tablesfilename=0,*tablesname=0; +struct yytbl_writer tableswr; + +/* Make sure program_name is initialized so we don't crash if writing + * out an error message before getting the program name from argv[0]. + */ +char *program_name = "flex"; + +#ifndef SHORT_FILE_NAMES +static char *outfile_template = "lex.%s.%s"; +static char *backing_name = "lex.backup"; +static char *tablesfile_template = "lex.%s.tables"; +#else +static char *outfile_template = "lex%s.%s"; +static char *backing_name = "lex.bck"; +static char *tablesfile_template = "lex%s.tbl"; +#endif + +#ifdef MS_DOS +extern unsigned _stklen = 16384; +#endif + +/* From scan.l */ +extern FILE* yyout; + +static char outfile_path[MAXLINE]; +static int outfile_created = 0; +static char *skelname = NULL; +static int _stdout_closed = 0; /* flag to prevent double-fclose() on stdout. */ +const char *escaped_qstart = "[[]]M4_YY_NOOP[M4_YY_NOOP[M4_YY_NOOP[[]]"; +const char *escaped_qend = "[[]]M4_YY_NOOP]M4_YY_NOOP]M4_YY_NOOP[[]]"; + +/* For debugging. The max number of filters to apply to skeleton. */ +static int preproc_level = 1000; + +int flex_main PROTO ((int argc, char *argv[])); +int main PROTO ((int argc, char *argv[])); + +int flex_main (argc, argv) + int argc; + char *argv[]; +{ + int i, exit_status, child_status; + + /* Set a longjmp target. Yes, I know it's a hack, but it gets worse: The + * return value of setjmp, if non-zero, is the desired exit code PLUS ONE. + * For example, if you want 'main' to return with code '2', then call + * longjmp() with an argument of 3. This is because it is invalid to + * specify a value of 0 to longjmp. FLEX_EXIT(n) should be used instead of + * exit(n); + */ + exit_status = setjmp (flex_main_jmp_buf); + if (exit_status){ + if (stdout && !_stdout_closed && !ferror(stdout)){ + fflush(stdout); + fclose(stdout); + } + while (wait(&child_status) > 0){ + if (!WIFEXITED (child_status) + || WEXITSTATUS (child_status) != 0){ + /* report an error of a child + */ + if( exit_status <= 1 ) + exit_status = 2; + + } + } + return exit_status - 1; + } + + flexinit (argc, argv); + + readin (); + + ntod (); + + for (i = 1; i <= num_rules; ++i) + if (!rule_useful[i] && i != default_rule) + line_warning (_("rule cannot be matched"), + rule_linenum[i]); + + if (spprdflt && !reject && rule_useful[default_rule]) + line_warning (_ + ("-s option given but default rule can be matched"), + rule_linenum[default_rule]); + + /* Generate the C state transition tables from the DFA. */ + make_tables (); + + /* Note, flexend does not return. It exits with its argument + * as status. + */ + flexend (0); + + return 0; /* keep compilers/lint happy */ +} + +/* Wrapper around flex_main, so flex_main can be built as a library. */ +int main (argc, argv) + int argc; + char *argv[]; +{ +#if ENABLE_NLS +#if HAVE_LOCALE_H + setlocale (LC_MESSAGES, ""); + setlocale (LC_CTYPE, ""); + textdomain (PACKAGE); + bindtextdomain (PACKAGE, LOCALEDIR); +#endif +#endif + + return flex_main (argc, argv); +} + +/* check_options - check user-specified options */ + +void check_options () +{ + int i; + const char * m4 = NULL; + + if (lex_compat) { + if (C_plus_plus) + flexerror (_("Can't use -+ with -l option")); + + if (fulltbl || fullspd) + flexerror (_("Can't use -f or -F with -l option")); + + if (reentrant || bison_bridge_lval) + flexerror (_ + ("Can't use --reentrant or --bison-bridge with -l option")); + + /* Don't rely on detecting use of yymore() and REJECT, + * just assume they'll be used. + */ + yymore_really_used = reject_really_used = true; + + yytext_is_array = true; + do_yylineno = true; + use_read = false; + } + + +#if 0 + /* This makes no sense whatsoever. I'm removing it. */ + if (do_yylineno) + /* This should really be "maintain_backup_tables = true" */ + reject_really_used = true; +#endif + + if (csize == unspecified) { + if ((fulltbl || fullspd) && !useecs) + csize = DEFAULT_CSIZE; + else + csize = CSIZE; + } + + if (interactive == unspecified) { + if (fulltbl || fullspd) + interactive = false; + else + interactive = true; + } + + if (fulltbl || fullspd) { + if (usemecs) + flexerror (_ + ("-Cf/-CF and -Cm don't make sense together")); + + if (interactive) + flexerror (_("-Cf/-CF and -I are incompatible")); + + if (lex_compat) + flexerror (_ + ("-Cf/-CF are incompatible with lex-compatibility mode")); + + + if (fulltbl && fullspd) + flexerror (_ + ("-Cf and -CF are mutually exclusive")); + } + + if (C_plus_plus && fullspd) + flexerror (_("Can't use -+ with -CF option")); + + if (C_plus_plus && yytext_is_array) { + warn (_("%array incompatible with -+ option")); + yytext_is_array = false; + } + + if (C_plus_plus && (reentrant)) + flexerror (_("Options -+ and --reentrant are mutually exclusive.")); + + if (C_plus_plus && bison_bridge_lval) + flexerror (_("bison bridge not supported for the C++ scanner.")); + + + if (useecs) { /* Set up doubly-linked equivalence classes. */ + + /* We loop all the way up to csize, since ecgroup[csize] is + * the position used for NUL characters. + */ + ecgroup[1] = NIL; + + for (i = 2; i <= csize; ++i) { + ecgroup[i] = i - 1; + nextecm[i - 1] = i; + } + + nextecm[csize] = NIL; + } + + else { + /* Put everything in its own equivalence class. */ + for (i = 1; i <= csize; ++i) { + ecgroup[i] = i; + nextecm[i] = BAD_SUBSCRIPT; /* to catch errors */ + } + } + + if (!ansi_func_defs) + buf_m4_define( &m4defs_buf, "M4_YY_NO_ANSI_FUNC_DEFS", NULL); + + if (!ansi_func_protos) + buf_m4_define( &m4defs_buf, "M4_YY_NO_ANSI_FUNC_PROTOS", NULL); + + if (extra_type) + buf_m4_define( &m4defs_buf, "M4_EXTRA_TYPE_DEFS", extra_type); + + if (!use_stdout) { + FILE *prev_stdout; + + if (!did_outfilename) { + char *suffix; + + if (C_plus_plus) + suffix = "cc"; + else + suffix = "c"; + + snprintf (outfile_path, sizeof(outfile_path), outfile_template, + prefix, suffix); + + outfilename = outfile_path; + } + + prev_stdout = freopen (outfilename, "w+", stdout); + + if (prev_stdout == NULL) + lerrsf (_("could not create %s"), outfilename); + + outfile_created = 1; + } + + + /* Setup the filter chain. */ + output_chain = filter_create_int(NULL, filter_tee_header, headerfilename); + if ( !(m4 = getenv("M4"))) + m4 = M4; + filter_create_ext(output_chain, m4, "-P", 0); + filter_create_int(output_chain, filter_fix_linedirs, NULL); + + /* For debugging, only run the requested number of filters. */ + if (preproc_level > 0) { + filter_truncate(output_chain, preproc_level); + filter_apply_chain(output_chain); + } + yyout = stdout; + + + /* always generate the tablesverify flag. */ + buf_m4_define (&m4defs_buf, "M4_YY_TABLES_VERIFY", tablesverify ? "1" : "0"); + if (tablesext) + gentables = false; + + if (tablesverify) + /* force generation of C tables. */ + gentables = true; + + + if (tablesext) { + FILE *tablesout; + struct yytbl_hdr hdr; + char *pname = 0; + int nbytes = 0; + + buf_m4_define (&m4defs_buf, "M4_YY_TABLES_EXTERNAL", NULL); + + if (!tablesfilename) { + nbytes = strlen (prefix) + strlen (tablesfile_template) + 2; + tablesfilename = pname = (char *) calloc (nbytes, 1); + snprintf (pname, nbytes, tablesfile_template, prefix); + } + + if ((tablesout = fopen (tablesfilename, "w")) == NULL) + lerrsf (_("could not create %s"), tablesfilename); + if (pname) + free (pname); + tablesfilename = 0; + + yytbl_writer_init (&tableswr, tablesout); + + nbytes = strlen (prefix) + strlen ("tables") + 2; + tablesname = (char *) calloc (nbytes, 1); + snprintf (tablesname, nbytes, "%stables", prefix); + yytbl_hdr_init (&hdr, flex_version, tablesname); + + if (yytbl_hdr_fwrite (&tableswr, &hdr) <= 0) + flexerror (_("could not write tables header")); + } + + if (skelname && (skelfile = fopen (skelname, "r")) == NULL) + lerrsf (_("can't open skeleton file %s"), skelname); + + if (reentrant) { + buf_m4_define (&m4defs_buf, "M4_YY_REENTRANT", NULL); + if (yytext_is_array) + buf_m4_define (&m4defs_buf, "M4_YY_TEXT_IS_ARRAY", NULL); + } + + if ( bison_bridge_lval) + buf_m4_define (&m4defs_buf, "M4_YY_BISON_LVAL", NULL); + + if ( bison_bridge_lloc) + buf_m4_define (&m4defs_buf, "<M4_YY_BISON_LLOC>", NULL); + + buf_m4_define(&m4defs_buf, "M4_YY_PREFIX", prefix); + + if (did_outfilename) + line_directive_out (stdout, 0); + + if (do_yylineno) + buf_m4_define (&m4defs_buf, "M4_YY_USE_LINENO", NULL); + + /* Create the alignment type. */ + buf_strdefine (&userdef_buf, "YY_INT_ALIGNED", + long_align ? "long int" : "short int"); + + /* Define the start condition macros. */ + { + struct Buf tmpbuf; + buf_init(&tmpbuf, sizeof(char)); + for (i = 1; i <= lastsc; i++) { + char *str, *fmt = "#define %s %d\n"; + size_t strsz; + + str = (char*)flex_alloc(strsz = strlen(fmt) + strlen(scname[i]) + (int)(1 + log10(i)) + 2); + snprintf(str, strsz, fmt, scname[i], i - 1); + buf_strappend(&tmpbuf, str); + free(str); + } + buf_m4_define(&m4defs_buf, "M4_YY_SC_DEFS", tmpbuf.elts); + buf_destroy(&tmpbuf); + } + + /* This is where we begin writing to the file. */ + + /* Dump the %top code. */ + if( top_buf.elts) + outn((char*) top_buf.elts); + + /* Dump the m4 definitions. */ + buf_print_strings(&m4defs_buf, stdout); + m4defs_buf.nelts = 0; /* memory leak here. */ + + /* Place a bogus line directive, it will be fixed in the filter. */ + outn("#line 0 \"M4_YY_OUTFILE_NAME\"\n"); + + /* Dump the user defined preproc directives. */ + if (userdef_buf.elts) + outn ((char *) (userdef_buf.elts)); + + skelout (); + /* %% [1.0] */ +} + +/* flexend - terminate flex + * + * note + * This routine does not return. + */ + +void flexend (exit_status) + int exit_status; + +{ + static int called_before = -1; /* prevent infinite recursion. */ + int tblsiz; + + if (++called_before) + FLEX_EXIT (exit_status); + + if (skelfile != NULL) { + if (ferror (skelfile)) + lerrsf (_("input error reading skeleton file %s"), + skelname); + + else if (fclose (skelfile)) + lerrsf (_("error closing skeleton file %s"), + skelname); + } + +#if 0 + fprintf (header_out, + "#ifdef YY_HEADER_EXPORT_START_CONDITIONS\n"); + fprintf (header_out, + "/* Beware! Start conditions are not prefixed. */\n"); + + /* Special case for "INITIAL" */ + fprintf (header_out, + "#undef INITIAL\n#define INITIAL 0\n"); + for (i = 2; i <= lastsc; i++) + fprintf (header_out, "#define %s %d\n", scname[i], i - 1); + fprintf (header_out, + "#endif /* YY_HEADER_EXPORT_START_CONDITIONS */\n\n"); + + /* Kill ALL flex-related macros. This is so the user + * can #include more than one generated header file. */ + fprintf (header_out, "#ifndef YY_HEADER_NO_UNDEFS\n"); + fprintf (header_out, + "/* Undefine all internal macros, etc., that do no belong in the header. */\n\n"); + + { + const char * undef_list[] = { + + "BEGIN", + "ECHO", + "EOB_ACT_CONTINUE_SCAN", + "EOB_ACT_END_OF_FILE", + "EOB_ACT_LAST_MATCH", + "FLEX_SCANNER", + "FLEX_STD", + "REJECT", + "YYFARGS0", + "YYFARGS1", + "YYFARGS2", + "YYFARGS3", + "YYLMAX", + "YYSTATE", + "YY_AT_BOL", + "YY_BREAK", + "YY_BUFFER_EOF_PENDING", + "YY_BUFFER_NEW", + "YY_BUFFER_NORMAL", + "YY_BUF_SIZE", + "M4_YY_CALL_LAST_ARG", + "M4_YY_CALL_ONLY_ARG", + "YY_CURRENT_BUFFER", + "YY_DECL", + "M4_YY_DECL_LAST_ARG", + "M4_YY_DEF_LAST_ARG", + "M4_YY_DEF_ONLY_ARG", + "YY_DO_BEFORE_ACTION", + "YY_END_OF_BUFFER", + "YY_END_OF_BUFFER_CHAR", + "YY_EXIT_FAILURE", + "YY_EXTRA_TYPE", + "YY_FATAL_ERROR", + "YY_FLEX_DEFINED_ECHO", + "YY_FLEX_LEX_COMPAT", + "YY_FLEX_MAJOR_VERSION", + "YY_FLEX_MINOR_VERSION", + "YY_FLEX_SUBMINOR_VERSION", + "YY_FLUSH_BUFFER", + "YY_G", + "YY_INPUT", + "YY_INTERACTIVE", + "YY_INT_ALIGNED", + "YY_LAST_ARG", + "YY_LESS_LINENO", + "YY_LEX_ARGS", + "YY_LEX_DECLARATION", + "YY_LEX_PROTO", + "YY_MAIN", + "YY_MORE_ADJ", + "YY_NEED_STRLEN", + "YY_NEW_FILE", + "YY_NULL", + "YY_NUM_RULES", + "YY_ONLY_ARG", + "YY_PARAMS", + "YY_PROTO", + "M4_YY_PROTO_LAST_ARG", + "M4_YY_PROTO_ONLY_ARG void", + "YY_READ_BUF_SIZE", + "YY_REENTRANT", + "YY_RESTORE_YY_MORE_OFFSET", + "YY_RULE_SETUP", + "YY_SC_TO_UI", + "YY_SKIP_YYWRAP", + "YY_START", + "YY_START_STACK_INCR", + "YY_STATE_EOF", + "YY_STDINIT", + "YY_TRAILING_HEAD_MASK", + "YY_TRAILING_MASK", + "YY_USER_ACTION", + "YY_USE_CONST", + "YY_USE_PROTOS", + "unput", + "yyTABLES_NAME", + "yy_create_buffer", + "yy_delete_buffer", + "yy_flex_debug", + "yy_flush_buffer", + "yy_init_buffer", + "yy_load_buffer_state", + "yy_new_buffer", + "yy_scan_buffer", + "yy_scan_bytes", + "yy_scan_string", + "yy_set_bol", + "yy_set_interactive", + "yy_switch_to_buffer", + "yypush_buffer_state", + "yypop_buffer_state", + "yyensure_buffer_stack", + "yyalloc", + "yyconst", + "yyextra", + "yyfree", + "yyget_debug", + "yyget_extra", + "yyget_in", + "yyget_leng", + "yyget_lineno", + "yyget_lloc", + "yyget_lval", + "yyget_out", + "yyget_text", + "yyin", + "yyleng", + "yyless", + "yylex", + "yylex_destroy", + "yylex_init", + "yylex_init_extra", + "yylineno", + "yylloc", + "yylval", + "yymore", + "yyout", + "yyrealloc", + "yyrestart", + "yyset_debug", + "yyset_extra", + "yyset_in", + "yyset_lineno", + "yyset_lloc", + "yyset_lval", + "yyset_out", + "yytables_destroy", + "yytables_fload", + "yyterminate", + "yytext", + "yytext_ptr", + "yywrap", + + /* must be null-terminated */ + NULL}; + + + for (i=0; undef_list[i] != NULL; i++) + fprintf (header_out, "#undef %s\n", undef_list[i]); + } + + /* undef any of the auto-generated symbols. */ + for (i = 0; i < defs_buf.nelts; i++) { + + /* don't undef start conditions */ + if (sclookup (((char **) defs_buf.elts)[i]) > 0) + continue; + fprintf (header_out, "#undef %s\n", + ((char **) defs_buf.elts)[i]); + } + + fprintf (header_out, + "#endif /* !YY_HEADER_NO_UNDEFS */\n"); + fprintf (header_out, "\n"); + fprintf (header_out, "#undef %sIN_HEADER\n", prefix); + fprintf (header_out, "#endif /* %sHEADER_H */\n", prefix); + + if (ferror (header_out)) + lerrsf (_("error creating header file %s"), + headerfilename); + fflush (header_out); + fclose (header_out); +#endif + + if (exit_status != 0 && outfile_created) { + if (ferror (stdout)) + lerrsf (_("error writing output file %s"), + outfilename); + + else if ((_stdout_closed = 1) && fclose (stdout)) + lerrsf (_("error closing output file %s"), + outfilename); + + else if (unlink (outfilename)) + lerrsf (_("error deleting output file %s"), + outfilename); + } + + + if (backing_up_report && backing_up_file) { + if (num_backing_up == 0) + fprintf (backing_up_file, _("No backing up.\n")); + else if (fullspd || fulltbl) + fprintf (backing_up_file, + _ + ("%d backing up (non-accepting) states.\n"), + num_backing_up); + else + fprintf (backing_up_file, + _("Compressed tables always back up.\n")); + + if (ferror (backing_up_file)) + lerrsf (_("error writing backup file %s"), + backing_name); + + else if (fclose (backing_up_file)) + lerrsf (_("error closing backup file %s"), + backing_name); + } + + if (printstats) { + fprintf (stderr, _("%s version %s usage statistics:\n"), + program_name, flex_version); + + fprintf (stderr, _(" scanner options: -")); + + if (C_plus_plus) + putc ('+', stderr); + if (backing_up_report) + putc ('b', stderr); + if (ddebug) + putc ('d', stderr); + if (sf_case_ins()) + putc ('i', stderr); + if (lex_compat) + putc ('l', stderr); + if (posix_compat) + putc ('X', stderr); + if (performance_report > 0) + putc ('p', stderr); + if (performance_report > 1) + putc ('p', stderr); + if (spprdflt) + putc ('s', stderr); + if (reentrant) + fputs ("--reentrant", stderr); + if (bison_bridge_lval) + fputs ("--bison-bridge", stderr); + if (bison_bridge_lloc) + fputs ("--bison-locations", stderr); + if (use_stdout) + putc ('t', stderr); + if (printstats) + putc ('v', stderr); /* always true! */ + if (nowarn) + putc ('w', stderr); + if (interactive == false) + putc ('B', stderr); + if (interactive == true) + putc ('I', stderr); + if (!gen_line_dirs) + putc ('L', stderr); + if (trace) + putc ('T', stderr); + + if (csize == unspecified) + /* We encountered an error fairly early on, so csize + * never got specified. Define it now, to prevent + * bogus table sizes being written out below. + */ + csize = 256; + + if (csize == 128) + putc ('7', stderr); + else + putc ('8', stderr); + + fprintf (stderr, " -C"); + + if (long_align) + putc ('a', stderr); + if (fulltbl) + putc ('f', stderr); + if (fullspd) + putc ('F', stderr); + if (useecs) + putc ('e', stderr); + if (usemecs) + putc ('m', stderr); + if (use_read) + putc ('r', stderr); + + if (did_outfilename) + fprintf (stderr, " -o%s", outfilename); + + if (skelname) + fprintf (stderr, " -S%s", skelname); + + if (strcmp (prefix, "yy")) + fprintf (stderr, " -P%s", prefix); + + putc ('\n', stderr); + + fprintf (stderr, _(" %d/%d NFA states\n"), + lastnfa, current_mns); + fprintf (stderr, _(" %d/%d DFA states (%d words)\n"), + lastdfa, current_max_dfas, totnst); + fprintf (stderr, _(" %d rules\n"), + num_rules + num_eof_rules - + 1 /* - 1 for def. rule */ ); + + if (num_backing_up == 0) + fprintf (stderr, _(" No backing up\n")); + else if (fullspd || fulltbl) + fprintf (stderr, + _ + (" %d backing-up (non-accepting) states\n"), + num_backing_up); + else + fprintf (stderr, + _ + (" Compressed tables always back-up\n")); + + if (bol_needed) + fprintf (stderr, + _(" Beginning-of-line patterns used\n")); + + fprintf (stderr, _(" %d/%d start conditions\n"), lastsc, + current_max_scs); + fprintf (stderr, + _ + (" %d epsilon states, %d double epsilon states\n"), + numeps, eps2); + + if (lastccl == 0) + fprintf (stderr, _(" no character classes\n")); + else + fprintf (stderr, + _ + (" %d/%d character classes needed %d/%d words of storage, %d reused\n"), + lastccl, current_maxccls, + cclmap[lastccl] + ccllen[lastccl], + current_max_ccl_tbl_size, cclreuse); + + fprintf (stderr, _(" %d state/nextstate pairs created\n"), + numsnpairs); + fprintf (stderr, + _(" %d/%d unique/duplicate transitions\n"), + numuniq, numdup); + + if (fulltbl) { + tblsiz = lastdfa * numecs; + fprintf (stderr, _(" %d table entries\n"), + tblsiz); + } + + else { + tblsiz = 2 * (lastdfa + numtemps) + 2 * tblend; + + fprintf (stderr, + _(" %d/%d base-def entries created\n"), + lastdfa + numtemps, current_max_dfas); + fprintf (stderr, + _ + (" %d/%d (peak %d) nxt-chk entries created\n"), + tblend, current_max_xpairs, peakpairs); + fprintf (stderr, + _ + (" %d/%d (peak %d) template nxt-chk entries created\n"), + numtemps * nummecs, + current_max_template_xpairs, + numtemps * numecs); + fprintf (stderr, _(" %d empty table entries\n"), + nummt); + fprintf (stderr, _(" %d protos created\n"), + numprots); + fprintf (stderr, + _(" %d templates created, %d uses\n"), + numtemps, tmpuses); + } + + if (useecs) { + tblsiz = tblsiz + csize; + fprintf (stderr, + _ + (" %d/%d equivalence classes created\n"), + numecs, csize); + } + + if (usemecs) { + tblsiz = tblsiz + numecs; + fprintf (stderr, + _ + (" %d/%d meta-equivalence classes created\n"), + nummecs, csize); + } + + fprintf (stderr, + _ + (" %d (%d saved) hash collisions, %d DFAs equal\n"), + hshcol, hshsave, dfaeql); + fprintf (stderr, _(" %d sets of reallocations needed\n"), + num_reallocs); + fprintf (stderr, _(" %d total table entries needed\n"), + tblsiz); + } + + FLEX_EXIT (exit_status); +} + + +/* flexinit - initialize flex */ + +void flexinit (argc, argv) + int argc; + char **argv; +{ + int i, sawcmpflag, rv, optind; + char *arg; + scanopt_t sopt; + + printstats = syntaxerror = trace = spprdflt = false; + lex_compat = posix_compat = C_plus_plus = backing_up_report = + ddebug = fulltbl = false; + fullspd = long_align = nowarn = yymore_used = continued_action = + false; + do_yylineno = yytext_is_array = in_rule = reject = do_stdinit = + false; + yymore_really_used = reject_really_used = unspecified; + interactive = csize = unspecified; + do_yywrap = gen_line_dirs = usemecs = useecs = true; + reentrant = bison_bridge_lval = bison_bridge_lloc = false; + performance_report = 0; + did_outfilename = 0; + prefix = "yy"; + yyclass = 0; + use_read = use_stdout = false; + tablesext = tablesverify = false; + gentables = true; + tablesfilename = tablesname = NULL; + ansi_func_defs = ansi_func_protos = true; + + sawcmpflag = false; + + /* Initialize dynamic array for holding the rule actions. */ + action_size = 2048; /* default size of action array in bytes */ + action_array = allocate_character_array (action_size); + defs1_offset = prolog_offset = action_offset = action_index = 0; + action_array[0] = '\0'; + + /* Initialize any buffers. */ + buf_init (&userdef_buf, sizeof (char)); /* one long string */ + buf_init (&defs_buf, sizeof (char *)); /* list of strings */ + buf_init (&yydmap_buf, sizeof (char)); /* one long string */ + buf_init (&top_buf, sizeof (char)); /* one long string */ + + { + const char * m4defs_init_str[] = {"m4_changequote\n", + "m4_changequote([[, ]])\n"}; + buf_init (&m4defs_buf, sizeof (char *)); + buf_append (&m4defs_buf, &m4defs_init_str, 2); + } + + sf_init (); + + /* initialize regex lib */ + flex_init_regex(); + + /* Enable C++ if program name ends with '+'. */ + program_name = basename2 (argv[0], 0); + + if (program_name[0] != '\0' && + program_name[strlen (program_name) - 1] == '+') + C_plus_plus = true; + + /* read flags */ + sopt = scanopt_init (flexopts, argc, argv, 0); + if (!sopt) { + /* This will only happen when flexopts array is altered. */ + fprintf (stderr, + _("Internal error. flexopts are malformed.\n")); + FLEX_EXIT (1); + } + + while ((rv = scanopt (sopt, &arg, &optind)) != 0) { + + if (rv < 0) { + /* Scanopt has already printed an option-specific error message. */ + fprintf (stderr, + _ + ("Try `%s --help' for more information.\n"), + program_name); + FLEX_EXIT (1); + } + + switch ((enum flexopt_flag_t) rv) { + case OPT_CPLUSPLUS: + C_plus_plus = true; + break; + + case OPT_BATCH: + interactive = false; + break; + + case OPT_BACKUP: + backing_up_report = true; + break; + + case OPT_DONOTHING: + break; + + case OPT_COMPRESSION: + if (!sawcmpflag) { + useecs = false; + usemecs = false; + fulltbl = false; + sawcmpflag = true; + } + + for (i = 0; arg && arg[i] != '\0'; i++) + switch (arg[i]) { + case 'a': + long_align = true; + break; + + case 'e': + useecs = true; + break; + + case 'F': + fullspd = true; + break; + + case 'f': + fulltbl = true; + break; + + case 'm': + usemecs = true; + break; + + case 'r': + use_read = true; + break; + + default: + lerrif (_ + ("unknown -C option '%c'"), + (int) arg[i]); + break; + } + break; + + case OPT_DEBUG: + ddebug = true; + break; + + case OPT_NO_DEBUG: + ddebug = false; + break; + + case OPT_FULL: + useecs = usemecs = false; + use_read = fulltbl = true; + break; + + case OPT_FAST: + useecs = usemecs = false; + use_read = fullspd = true; + break; + + case OPT_HELP: + usage (); + FLEX_EXIT (0); + + case OPT_INTERACTIVE: + interactive = true; + break; + + case OPT_CASE_INSENSITIVE: + sf_set_case_ins(true); + break; + + case OPT_LEX_COMPAT: + lex_compat = true; + break; + + case OPT_POSIX_COMPAT: + posix_compat = true; + break; + + case OPT_PREPROC_LEVEL: + preproc_level = strtol(arg,NULL,0); + break; + + case OPT_MAIN: + buf_strdefine (&userdef_buf, "YY_MAIN", "1"); + do_yywrap = false; + break; + + case OPT_NO_MAIN: + buf_strdefine (&userdef_buf, "YY_MAIN", "0"); + break; + + case OPT_NO_LINE: + gen_line_dirs = false; + break; + + case OPT_OUTFILE: + outfilename = arg; + did_outfilename = 1; + break; + + case OPT_PREFIX: + prefix = arg; + break; + + case OPT_PERF_REPORT: + ++performance_report; + break; + + case OPT_BISON_BRIDGE: + bison_bridge_lval = true; + break; + + case OPT_BISON_BRIDGE_LOCATIONS: + bison_bridge_lval = bison_bridge_lloc = true; + break; + + case OPT_REENTRANT: + reentrant = true; + break; + + case OPT_NO_REENTRANT: + reentrant = false; + break; + + case OPT_SKEL: + skelname = arg; + break; + + case OPT_DEFAULT: + spprdflt = false; + break; + + case OPT_NO_DEFAULT: + spprdflt = true; + break; + + case OPT_STDOUT: + use_stdout = true; + break; + + case OPT_NO_UNISTD_H: + //buf_strdefine (&userdef_buf, "YY_NO_UNISTD_H", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_UNISTD_H",0); + break; + + case OPT_TABLES_FILE: + tablesext = true; + tablesfilename = arg; + break; + + case OPT_TABLES_VERIFY: + tablesverify = true; + break; + + case OPT_TRACE: + trace = true; + break; + + case OPT_VERBOSE: + printstats = true; + break; + + case OPT_VERSION: + printf (_("%s %s\n"), program_name, flex_version); + FLEX_EXIT (0); + + case OPT_WARN: + nowarn = false; + break; + + case OPT_NO_WARN: + nowarn = true; + break; + + case OPT_7BIT: + csize = 128; + break; + + case OPT_8BIT: + csize = CSIZE; + break; + + case OPT_ALIGN: + long_align = true; + break; + + case OPT_NO_ALIGN: + long_align = false; + break; + + case OPT_ALWAYS_INTERACTIVE: + buf_m4_define (&m4defs_buf, "M4_YY_ALWAYS_INTERACTIVE", 0); + break; + + case OPT_NEVER_INTERACTIVE: + buf_m4_define( &m4defs_buf, "M4_YY_NEVER_INTERACTIVE", 0); + break; + + case OPT_ARRAY: + yytext_is_array = true; + break; + + case OPT_POINTER: + yytext_is_array = false; + break; + + case OPT_ECS: + useecs = true; + break; + + case OPT_NO_ECS: + useecs = false; + break; + + case OPT_HEADER_FILE: + headerfilename = arg; + break; + + case OPT_META_ECS: + usemecs = true; + break; + + case OPT_NO_META_ECS: + usemecs = false; + break; + + case OPT_PREPROCDEFINE: + { + /* arg is "symbol" or "symbol=definition". */ + char *def; + + for (def = arg; + *def != '\0' && *def != '='; ++def) ; + + buf_strappend (&userdef_buf, "#define "); + if (*def == '\0') { + buf_strappend (&userdef_buf, arg); + buf_strappend (&userdef_buf, + " 1\n"); + } + else { + buf_strnappend (&userdef_buf, arg, + def - arg); + buf_strappend (&userdef_buf, " "); + buf_strappend (&userdef_buf, + def + 1); + buf_strappend (&userdef_buf, "\n"); + } + } + break; + + case OPT_READ: + use_read = true; + break; + + case OPT_STACK: + //buf_strdefine (&userdef_buf, "YY_STACK_USED", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_STACK_USED",0); + break; + + case OPT_STDINIT: + do_stdinit = true; + break; + + case OPT_NO_STDINIT: + do_stdinit = false; + break; + + case OPT_YYCLASS: + yyclass = arg; + break; + + case OPT_YYLINENO: + do_yylineno = true; + break; + + case OPT_NO_YYLINENO: + do_yylineno = false; + break; + + case OPT_YYWRAP: + do_yywrap = true; + break; + + case OPT_NO_YYWRAP: + do_yywrap = false; + break; + + case OPT_YYMORE: + yymore_really_used = true; + break; + + case OPT_NO_YYMORE: + yymore_really_used = false; + break; + + case OPT_REJECT: + reject_really_used = true; + break; + + case OPT_NO_REJECT: + reject_really_used = false; + break; + + case OPT_NO_ANSI_FUNC_DEFS: + ansi_func_defs = false; + break; + + case OPT_NO_ANSI_FUNC_PROTOS: + ansi_func_protos = false; + break; + + case OPT_NO_YY_PUSH_STATE: + //buf_strdefine (&userdef_buf, "YY_NO_PUSH_STATE", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_PUSH_STATE",0); + break; + case OPT_NO_YY_POP_STATE: + //buf_strdefine (&userdef_buf, "YY_NO_POP_STATE", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_POP_STATE",0); + break; + case OPT_NO_YY_TOP_STATE: + //buf_strdefine (&userdef_buf, "YY_NO_TOP_STATE", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_TOP_STATE",0); + break; + case OPT_NO_UNPUT: + //buf_strdefine (&userdef_buf, "YY_NO_UNPUT", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_UNPUT",0); + break; + case OPT_NO_YY_SCAN_BUFFER: + //buf_strdefine (&userdef_buf, "YY_NO_SCAN_BUFFER", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SCAN_BUFFER",0); + break; + case OPT_NO_YY_SCAN_BYTES: + //buf_strdefine (&userdef_buf, "YY_NO_SCAN_BYTES", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SCAN_BYTES",0); + break; + case OPT_NO_YY_SCAN_STRING: + //buf_strdefine (&userdef_buf, "YY_NO_SCAN_STRING", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SCAN_STRING",0); + break; + case OPT_NO_YYGET_EXTRA: + //buf_strdefine (&userdef_buf, "YY_NO_GET_EXTRA", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_EXTRA",0); + break; + case OPT_NO_YYSET_EXTRA: + //buf_strdefine (&userdef_buf, "YY_NO_SET_EXTRA", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_EXTRA",0); + break; + case OPT_NO_YYGET_LENG: + //buf_strdefine (&userdef_buf, "YY_NO_GET_LENG", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LENG",0); + break; + case OPT_NO_YYGET_TEXT: + //buf_strdefine (&userdef_buf, "YY_NO_GET_TEXT", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_TEXT",0); + break; + case OPT_NO_YYGET_LINENO: + //buf_strdefine (&userdef_buf, "YY_NO_GET_LINENO", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LINENO",0); + break; + case OPT_NO_YYSET_LINENO: + //buf_strdefine (&userdef_buf, "YY_NO_SET_LINENO", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_LINENO",0); + break; + case OPT_NO_YYGET_IN: + //buf_strdefine (&userdef_buf, "YY_NO_GET_IN", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_IN",0); + break; + case OPT_NO_YYSET_IN: + //buf_strdefine (&userdef_buf, "YY_NO_SET_IN", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_IN",0); + break; + case OPT_NO_YYGET_OUT: + //buf_strdefine (&userdef_buf, "YY_NO_GET_OUT", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_OUT",0); + break; + case OPT_NO_YYSET_OUT: + //buf_strdefine (&userdef_buf, "YY_NO_SET_OUT", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_OUT",0); + break; + case OPT_NO_YYGET_LVAL: + //buf_strdefine (&userdef_buf, "YY_NO_GET_LVAL", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LVAL",0); + break; + case OPT_NO_YYSET_LVAL: + //buf_strdefine (&userdef_buf, "YY_NO_SET_LVAL", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_LVAL",0); + break; + case OPT_NO_YYGET_LLOC: + //buf_strdefine (&userdef_buf, "YY_NO_GET_LLOC", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LLOC",0); + break; + case OPT_NO_YYSET_LLOC: + //buf_strdefine (&userdef_buf, "YY_NO_SET_LLOC", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_LLOC",0); + break; + + } /* switch */ + } /* while scanopt() */ + + scanopt_destroy (sopt); + + num_input_files = argc - optind; + input_files = argv + optind; + set_input_file (num_input_files > 0 ? input_files[0] : NULL); + + lastccl = lastsc = lastdfa = lastnfa = 0; + num_rules = num_eof_rules = default_rule = 0; + numas = numsnpairs = tmpuses = 0; + numecs = numeps = eps2 = num_reallocs = hshcol = dfaeql = totnst = + 0; + numuniq = numdup = hshsave = eofseen = datapos = dataline = 0; + num_backing_up = onesp = numprots = 0; + variable_trailing_context_rules = bol_needed = false; + + out_linenum = linenum = sectnum = 1; + firstprot = NIL; + + /* Used in mkprot() so that the first proto goes in slot 1 + * of the proto queue. + */ + lastprot = 1; + + set_up_initial_allocations (); +} + + +/* readin - read in the rules section of the input file(s) */ + +void readin () +{ + static char yy_stdinit[] = "FILE *yyin = stdin, *yyout = stdout;"; + static char yy_nostdinit[] = + "FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;"; + + line_directive_out ((FILE *) 0, 1); + + if (yyparse ()) { + pinpoint_message (_("fatal parse error")); + flexend (1); + } + + if (syntaxerror) + flexend (1); + + /* If the user explicitly requested posix compatibility by specifing the + * posix-compat option, then we check for conflicting options. However, if + * the POSIXLY_CORRECT variable is set, then we quietly make flex as + * posix-compatible as possible. This is the recommended behavior + * according to the GNU Coding Standards. + * + * Note: The posix option was added to flex to provide the posix behavior + * of the repeat operator in regular expressions, e.g., `ab{3}' + */ + if (posix_compat) { + /* TODO: This is where we try to make flex behave according to + * posiz, AND check for conflicting options. How far should we go + * with this? Should we disable all the neat-o flex features? + */ + /* Update: Estes says no, since other flex features don't violate posix. */ + } + + if (getenv ("POSIXLY_CORRECT")) { + posix_compat = true; + } + + if (backing_up_report) { + backing_up_file = fopen (backing_name, "w"); + if (backing_up_file == NULL) + lerrsf (_ + ("could not create backing-up info file %s"), + backing_name); + } + + else + backing_up_file = NULL; + + if (yymore_really_used == true) + yymore_used = true; + else if (yymore_really_used == false) + yymore_used = false; + + if (reject_really_used == true) + reject = true; + else if (reject_really_used == false) + reject = false; + + if (performance_report > 0) { + if (lex_compat) { + fprintf (stderr, + _ + ("-l AT&T lex compatibility option entails a large performance penalty\n")); + fprintf (stderr, + _ + (" and may be the actual source of other reported performance penalties\n")); + } + + else if (do_yylineno) { + fprintf (stderr, + _ + ("%%option yylineno entails a performance penalty ONLY on rules that can match newline characters\n")); + } + + if (performance_report > 1) { + if (interactive) + fprintf (stderr, + _ + ("-I (interactive) entails a minor performance penalty\n")); + + if (yymore_used) + fprintf (stderr, + _ + ("yymore() entails a minor performance penalty\n")); + } + + if (reject) + fprintf (stderr, + _ + ("REJECT entails a large performance penalty\n")); + + if (variable_trailing_context_rules) + fprintf (stderr, + _ + ("Variable trailing context rules entail a large performance penalty\n")); + } + + if (reject) + real_reject = true; + + if (variable_trailing_context_rules) + reject = true; + + if ((fulltbl || fullspd) && reject) { + if (real_reject) + flexerror (_ + ("REJECT cannot be used with -f or -F")); + else if (do_yylineno) + flexerror (_ + ("%option yylineno cannot be used with REJECT")); + else + flexerror (_ + ("variable trailing context rules cannot be used with -f or -F")); + } + + if (reject){ + out_m4_define( "M4_YY_USES_REJECT", NULL); + //outn ("\n#define YY_USES_REJECT"); + } + + if (!do_yywrap) { + if (!C_plus_plus) { + outn ("\n#define yywrap(n) 1"); + } + outn ("#define YY_SKIP_YYWRAP"); + } + + if (ddebug) + outn ("\n#define FLEX_DEBUG"); + + OUT_BEGIN_CODE (); + if (csize == 256) + outn ("typedef unsigned char YY_CHAR;"); + else + outn ("typedef char YY_CHAR;"); + OUT_END_CODE (); + + if (C_plus_plus) { + outn ("#define yytext_ptr yytext"); + + if (interactive) + outn ("#define YY_INTERACTIVE"); + } + + else { + OUT_BEGIN_CODE (); + /* In reentrant scanner, stdinit is handled in flex.skl. */ + if (do_stdinit) { + if (reentrant){ + outn ("#ifdef VMS"); + outn ("#ifdef __VMS_POSIX"); + outn ("#define YY_STDINIT"); + outn ("#endif"); + outn ("#else"); + outn ("#define YY_STDINIT"); + outn ("#endif"); + } + + outn ("#ifdef VMS"); + outn ("#ifndef __VMS_POSIX"); + outn (yy_nostdinit); + outn ("#else"); + outn (yy_stdinit); + outn ("#endif"); + outn ("#else"); + outn (yy_stdinit); + outn ("#endif"); + } + + else { + if(!reentrant) + outn (yy_nostdinit); + } + OUT_END_CODE (); + } + + OUT_BEGIN_CODE (); + if (fullspd) + outn ("typedef yyconst struct yy_trans_info *yy_state_type;"); + else if (!C_plus_plus) + outn ("typedef int yy_state_type;"); + OUT_END_CODE (); + + if (lex_compat) + outn ("#define YY_FLEX_LEX_COMPAT"); + + if (!C_plus_plus && !reentrant) { + outn ("extern int yylineno;"); + OUT_BEGIN_CODE (); + outn ("int yylineno = 1;"); + OUT_END_CODE (); + } + + if (C_plus_plus) { + outn ("\n#include <FlexLexer.h>"); + + if (!do_yywrap) { + outn("\nint yyFlexLexer::yywrap() { return 1; }"); + } + + if (yyclass) { + outn ("int yyFlexLexer::yylex()"); + outn ("\t{"); + outn ("\tLexerError( \"yyFlexLexer::yylex invoked but %option yyclass used\" );"); + outn ("\treturn 0;"); + outn ("\t}"); + + out_str ("\n#define YY_DECL int %s::yylex()\n", + yyclass); + } + } + + else { + + /* Watch out: yytext_ptr is a variable when yytext is an array, + * but it's a macro when yytext is a pointer. + */ + if (yytext_is_array) { + if (!reentrant) + outn ("extern char yytext[];\n"); + } + else { + if (reentrant) { + outn ("#define yytext_ptr yytext_r"); + } + else { + outn ("extern char *yytext;"); + outn ("#define yytext_ptr yytext"); + } + } + + if (yyclass) + flexerror (_ + ("%option yyclass only meaningful for C++ scanners")); + } + + if (useecs) + numecs = cre8ecs (nextecm, ecgroup, csize); + else + numecs = csize; + + /* Now map the equivalence class for NUL to its expected place. */ + ecgroup[0] = ecgroup[csize]; + NUL_ec = ABS (ecgroup[0]); + + if (useecs) + ccl2ecl (); +} + + +/* set_up_initial_allocations - allocate memory for internal tables */ + +void set_up_initial_allocations () +{ + maximum_mns = (long_align ? MAXIMUM_MNS_LONG : MAXIMUM_MNS); + current_mns = INITIAL_MNS; + firstst = allocate_integer_array (current_mns); + lastst = allocate_integer_array (current_mns); + finalst = allocate_integer_array (current_mns); + transchar = allocate_integer_array (current_mns); + trans1 = allocate_integer_array (current_mns); + trans2 = allocate_integer_array (current_mns); + accptnum = allocate_integer_array (current_mns); + assoc_rule = allocate_integer_array (current_mns); + state_type = allocate_integer_array (current_mns); + + current_max_rules = INITIAL_MAX_RULES; + rule_type = allocate_integer_array (current_max_rules); + rule_linenum = allocate_integer_array (current_max_rules); + rule_useful = allocate_integer_array (current_max_rules); + rule_has_nl = allocate_bool_array (current_max_rules); + + current_max_scs = INITIAL_MAX_SCS; + scset = allocate_integer_array (current_max_scs); + scbol = allocate_integer_array (current_max_scs); + scxclu = allocate_integer_array (current_max_scs); + sceof = allocate_integer_array (current_max_scs); + scname = allocate_char_ptr_array (current_max_scs); + + current_maxccls = INITIAL_MAX_CCLS; + cclmap = allocate_integer_array (current_maxccls); + ccllen = allocate_integer_array (current_maxccls); + cclng = allocate_integer_array (current_maxccls); + ccl_has_nl = allocate_bool_array (current_maxccls); + + current_max_ccl_tbl_size = INITIAL_MAX_CCL_TBL_SIZE; + ccltbl = allocate_Character_array (current_max_ccl_tbl_size); + + current_max_dfa_size = INITIAL_MAX_DFA_SIZE; + + current_max_xpairs = INITIAL_MAX_XPAIRS; + nxt = allocate_integer_array (current_max_xpairs); + chk = allocate_integer_array (current_max_xpairs); + + current_max_template_xpairs = INITIAL_MAX_TEMPLATE_XPAIRS; + tnxt = allocate_integer_array (current_max_template_xpairs); + + current_max_dfas = INITIAL_MAX_DFAS; + base = allocate_integer_array (current_max_dfas); + def = allocate_integer_array (current_max_dfas); + dfasiz = allocate_integer_array (current_max_dfas); + accsiz = allocate_integer_array (current_max_dfas); + dhash = allocate_integer_array (current_max_dfas); + dss = allocate_int_ptr_array (current_max_dfas); + dfaacc = allocate_dfaacc_union (current_max_dfas); + + nultrans = (int *) 0; +} + + +/* extracts basename from path, optionally stripping the extension "\.*" + * (same concept as /bin/sh `basename`, but different handling of extension). */ +static char *basename2 (path, strip_ext) + char *path; + int strip_ext; /* boolean */ +{ + char *b, *e = 0; + + b = path; + for (b = path; *path; path++) + if (*path == '/') + b = path + 1; + else if (*path == '.') + e = path; + + if (strip_ext && e && e > b) + *e = '\0'; + return b; +} + +void usage () +{ + FILE *f = stdout; + + if (!did_outfilename) { + snprintf (outfile_path, sizeof(outfile_path), outfile_template, + prefix, C_plus_plus ? "cc" : "c"); + outfilename = outfile_path; + } + + fprintf (f, _("Usage: %s [OPTIONS] [FILE]...\n"), program_name); + fprintf (f, + _ + ("Generates programs that perform pattern-matching on text.\n" + "\n" "Table Compression:\n" + " -Ca, --align trade off larger tables for better memory alignment\n" + " -Ce, --ecs construct equivalence classes\n" + " -Cf do not compress tables; use -f representation\n" + " -CF do not compress tables; use -F representation\n" + " -Cm, --meta-ecs construct meta-equivalence classes\n" + " -Cr, --read use read() instead of stdio for scanner input\n" + " -f, --full generate fast, large scanner. Same as -Cfr\n" + " -F, --fast use alternate table representation. Same as -CFr\n" + " -Cem default compression (same as --ecs --meta-ecs)\n" + "\n" "Debugging:\n" + " -d, --debug enable debug mode in scanner\n" + " -b, --backup write backing-up information to %s\n" + " -p, --perf-report write performance report to stderr\n" + " -s, --nodefault suppress default rule to ECHO unmatched text\n" + " -T, --trace %s should run in trace mode\n" + " -w, --nowarn do not generate warnings\n" + " -v, --verbose write summary of scanner statistics to stdout\n" + "\n" "Files:\n" + " -o, --outfile=FILE specify output filename\n" + " -S, --skel=FILE specify skeleton file\n" + " -t, --stdout write scanner on stdout instead of %s\n" + " --yyclass=NAME name of C++ class\n" + " --header-file=FILE create a C header file in addition to the scanner\n" + " --tables-file[=FILE] write tables to FILE\n" "\n" + "Scanner behavior:\n" + " -7, --7bit generate 7-bit scanner\n" + " -8, --8bit generate 8-bit scanner\n" + " -B, --batch generate batch scanner (opposite of -I)\n" + " -i, --case-insensitive ignore case in patterns\n" + " -l, --lex-compat maximal compatibility with original lex\n" + " -X, --posix-compat maximal compatibility with POSIX lex\n" + " -I, --interactive generate interactive scanner (opposite of -B)\n" + " --yylineno track line count in yylineno\n" + "\n" "Generated code:\n" + " -+, --c++ generate C++ scanner class\n" + " -Dmacro[=defn] #define macro defn (default defn is '1')\n" + " -L, --noline suppress #line directives in scanner\n" + " -P, --prefix=STRING use STRING as prefix instead of \"yy\"\n" + " -R, --reentrant generate a reentrant C scanner\n" + " --bison-bridge scanner for bison pure parser.\n" + " --bison-locations include yylloc support.\n" + " --stdinit initialize yyin/yyout to stdin/stdout\n" + " --noansi-definitions old-style function definitions\n" + " --noansi-prototypes empty parameter list in prototypes\n" + " --nounistd do not include <unistd.h>\n" + " --noFUNCTION do not generate a particular FUNCTION\n" + "\n" "Miscellaneous:\n" + " -c do-nothing POSIX option\n" + " -n do-nothing POSIX option\n" + " -?\n" + " -h, --help produce this help message\n" + " -V, --version report %s version\n"), + backing_name, program_name, outfile_path, program_name); + +} diff --git a/misc.c b/misc.c new file mode 100644 index 000000000000..1009dea948b1 --- /dev/null +++ b/misc.c @@ -0,0 +1,1095 @@ +/* misc - miscellaneous flex routines */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" +#include "tables.h" + +#define CMD_IF_TABLES_SER "%if-tables-serialization" +#define CMD_TABLES_YYDMAP "%tables-yydmap" +#define CMD_DEFINE_YYTABLES "%define-yytables" +#define CMD_IF_CPP_ONLY "%if-c++-only" +#define CMD_IF_C_ONLY "%if-c-only" +#define CMD_IF_C_OR_CPP "%if-c-or-c++" +#define CMD_NOT_FOR_HEADER "%not-for-header" +#define CMD_OK_FOR_HEADER "%ok-for-header" +#define CMD_PUSH "%push" +#define CMD_POP "%pop" +#define CMD_IF_REENTRANT "%if-reentrant" +#define CMD_IF_NOT_REENTRANT "%if-not-reentrant" +#define CMD_IF_BISON_BRIDGE "%if-bison-bridge" +#define CMD_IF_NOT_BISON_BRIDGE "%if-not-bison-bridge" +#define CMD_ENDIF "%endif" + +/* we allow the skeleton to push and pop. */ +struct sko_state { + bool dc; /**< do_copy */ +}; +static struct sko_state *sko_stack=0; +static int sko_len=0,sko_sz=0; +static void sko_push(bool dc) +{ + if(!sko_stack){ + sko_sz = 1; + sko_stack = (struct sko_state*)flex_alloc(sizeof(struct sko_state)*sko_sz); + sko_len = 0; + } + if(sko_len >= sko_sz){ + sko_sz *= 2; + sko_stack = (struct sko_state*)flex_realloc(sko_stack,sizeof(struct sko_state)*sko_sz); + } + + /* initialize to zero and push */ + sko_stack[sko_len].dc = dc; + sko_len++; +} +static void sko_peek(bool *dc) +{ + if(sko_len <= 0) + flex_die("peek attempt when sko stack is empty"); + if(dc) + *dc = sko_stack[sko_len-1].dc; +} +static void sko_pop(bool* dc) +{ + sko_peek(dc); + sko_len--; + if(sko_len < 0) + flex_die("popped too many times in skeleton."); +} + +/* Append "#define defname value\n" to the running buffer. */ +void action_define (defname, value) + const char *defname; + int value; +{ + char buf[MAXLINE]; + char *cpy; + + if ((int) strlen (defname) > MAXLINE / 2) { + format_pinpoint_message (_ + ("name \"%s\" ridiculously long"), + defname); + return; + } + + snprintf (buf, sizeof(buf), "#define %s %d\n", defname, value); + add_action (buf); + + /* track #defines so we can undef them when we're done. */ + cpy = copy_string (defname); + buf_append (&defs_buf, &cpy, 1); +} + + +/** Append "m4_define([[defname]],[[value]])m4_dnl\n" to the running buffer. + * @param defname The macro name. + * @param value The macro value, can be NULL, which is the same as the empty string. + */ +void action_m4_define (const char *defname, const char * value) +{ + char buf[MAXLINE]; + + flexfatal ("DO NOT USE THIS FUNCTION!"); + + if ((int) strlen (defname) > MAXLINE / 2) { + format_pinpoint_message (_ + ("name \"%s\" ridiculously long"), + defname); + return; + } + + snprintf (buf, sizeof(buf), "m4_define([[%s]],[[%s]])m4_dnl\n", defname, value?value:""); + add_action (buf); +} + +/* Append "new_text" to the running buffer. */ +void add_action (new_text) + const char *new_text; +{ + int len = strlen (new_text); + + while (len + action_index >= action_size - 10 /* slop */ ) { + int new_size = action_size * 2; + + if (new_size <= 0) + /* Increase just a little, to try to avoid overflow + * on 16-bit machines. + */ + action_size += action_size / 8; + else + action_size = new_size; + + action_array = + reallocate_character_array (action_array, + action_size); + } + + strcpy (&action_array[action_index], new_text); + + action_index += len; +} + + +/* allocate_array - allocate memory for an integer array of the given size */ + +void *allocate_array (size, element_size) + int size; + size_t element_size; +{ + register void *mem; + size_t num_bytes = element_size * size; + + mem = flex_alloc (num_bytes); + if (!mem) + flexfatal (_ + ("memory allocation failed in allocate_array()")); + + return mem; +} + + +/* all_lower - true if a string is all lower-case */ + +int all_lower (str) + register char *str; +{ + while (*str) { + if (!isascii ((Char) * str) || !islower (*str)) + return 0; + ++str; + } + + return 1; +} + + +/* all_upper - true if a string is all upper-case */ + +int all_upper (str) + register char *str; +{ + while (*str) { + if (!isascii ((Char) * str) || !isupper (*str)) + return 0; + ++str; + } + + return 1; +} + + +/* bubble - bubble sort an integer array in increasing order + * + * synopsis + * int v[n], n; + * void bubble( v, n ); + * + * description + * sorts the first n elements of array v and replaces them in + * increasing order. + * + * passed + * v - the array to be sorted + * n - the number of elements of 'v' to be sorted + */ + +void bubble (v, n) + int v[], n; +{ + register int i, j, k; + + for (i = n; i > 1; --i) + for (j = 1; j < i; ++j) + if (v[j] > v[j + 1]) { /* compare */ + k = v[j]; /* exchange */ + v[j] = v[j + 1]; + v[j + 1] = k; + } +} + + +/* check_char - checks a character to make sure it's within the range + * we're expecting. If not, generates fatal error message + * and exits. + */ + +void check_char (c) + int c; +{ + if (c >= CSIZE) + lerrsf (_("bad character '%s' detected in check_char()"), + readable_form (c)); + + if (c >= csize) + lerrsf (_ + ("scanner requires -8 flag to use the character %s"), + readable_form (c)); +} + + + +/* clower - replace upper-case letter to lower-case */ + +Char clower (c) + register int c; +{ + return (Char) ((isascii (c) && isupper (c)) ? tolower (c) : c); +} + + +/* copy_string - returns a dynamically allocated copy of a string */ + +char *copy_string (str) + register const char *str; +{ + register const char *c1; + register char *c2; + char *copy; + unsigned int size; + + /* find length */ + for (c1 = str; *c1; ++c1) ; + + size = (c1 - str + 1) * sizeof (char); + + copy = (char *) flex_alloc (size); + + if (copy == NULL) + flexfatal (_("dynamic memory failure in copy_string()")); + + for (c2 = copy; (*c2++ = *str++) != 0;) ; + + return copy; +} + + +/* copy_unsigned_string - + * returns a dynamically allocated copy of a (potentially) unsigned string + */ + +Char *copy_unsigned_string (str) + register Char *str; +{ + register Char *c; + Char *copy; + + /* find length */ + for (c = str; *c; ++c) ; + + copy = allocate_Character_array (c - str + 1); + + for (c = copy; (*c++ = *str++) != 0;) ; + + return copy; +} + + +/* cshell - shell sort a character array in increasing order + * + * synopsis + * + * Char v[n]; + * int n, special_case_0; + * cshell( v, n, special_case_0 ); + * + * description + * Does a shell sort of the first n elements of array v. + * If special_case_0 is true, then any element equal to 0 + * is instead assumed to have infinite weight. + * + * passed + * v - array to be sorted + * n - number of elements of v to be sorted + */ + +void cshell (v, n, special_case_0) + Char v[]; + int n, special_case_0; +{ + int gap, i, j, jg; + Char k; + + for (gap = n / 2; gap > 0; gap = gap / 2) + for (i = gap; i < n; ++i) + for (j = i - gap; j >= 0; j = j - gap) { + jg = j + gap; + + if (special_case_0) { + if (v[jg] == 0) + break; + + else if (v[j] != 0 + && v[j] <= v[jg]) + break; + } + + else if (v[j] <= v[jg]) + break; + + k = v[j]; + v[j] = v[jg]; + v[jg] = k; + } +} + + +/* dataend - finish up a block of data declarations */ + +void dataend () +{ + /* short circuit any output */ + if (gentables) { + + if (datapos > 0) + dataflush (); + + /* add terminator for initialization; { for vi */ + outn (" } ;\n"); + } + dataline = 0; + datapos = 0; +} + + +/* dataflush - flush generated data statements */ + +void dataflush () +{ + /* short circuit any output */ + if (!gentables) + return; + + outc ('\n'); + + if (++dataline >= NUMDATALINES) { + /* Put out a blank line so that the table is grouped into + * large blocks that enable the user to find elements easily. + */ + outc ('\n'); + dataline = 0; + } + + /* Reset the number of characters written on the current line. */ + datapos = 0; +} + + +/* flexerror - report an error message and terminate */ + +void flexerror (msg) + const char *msg; +{ + fprintf (stderr, "%s: %s\n", program_name, msg); + flexend (1); +} + + +/* flexfatal - report a fatal error message and terminate */ + +void flexfatal (msg) + const char *msg; +{ + fprintf (stderr, _("%s: fatal internal error, %s\n"), + program_name, msg); + FLEX_EXIT (1); +} + + +/* htoi - convert a hexadecimal digit string to an integer value */ + +int htoi (str) + Char str[]; +{ + unsigned int result; + + (void) sscanf ((char *) str, "%x", &result); + + return result; +} + + +/* lerrif - report an error message formatted with one integer argument */ + +void lerrif (msg, arg) + const char *msg; + int arg; +{ + char errmsg[MAXLINE]; + + snprintf (errmsg, sizeof(errmsg), msg, arg); + flexerror (errmsg); +} + + +/* lerrsf - report an error message formatted with one string argument */ + +void lerrsf (msg, arg) + const char *msg, arg[]; +{ + char errmsg[MAXLINE]; + + snprintf (errmsg, sizeof(errmsg), msg, arg); + flexerror (errmsg); +} + + +/* line_directive_out - spit out a "#line" statement */ + +void line_directive_out (output_file, do_infile) + FILE *output_file; + int do_infile; +{ + char directive[MAXLINE], filename[MAXLINE]; + char *s1, *s2, *s3; + static const char *line_fmt = "#line %d \"%s\"\n"; + + if (!gen_line_dirs) + return; + + s1 = do_infile ? infilename : "M4_YY_OUTFILE_NAME"; + + if (do_infile && !s1) + s1 = "<stdin>"; + + s2 = filename; + s3 = &filename[sizeof (filename) - 2]; + + while (s2 < s3 && *s1) { + if (*s1 == '\\') + /* Escape the '\' */ + *s2++ = '\\'; + + *s2++ = *s1++; + } + + *s2 = '\0'; + + if (do_infile) + snprintf (directive, sizeof(directive), line_fmt, linenum, filename); + else { + if (output_file == stdout) + /* Account for the line directive itself. */ + ++out_linenum; + + snprintf (directive, sizeof(directive), line_fmt, out_linenum, filename); + } + + /* If output_file is nil then we should put the directive in + * the accumulated actions. + */ + if (output_file) { + fputs (directive, output_file); + } + else + add_action (directive); +} + + +/* mark_defs1 - mark the current position in the action array as + * representing where the user's section 1 definitions end + * and the prolog begins + */ +void mark_defs1 () +{ + defs1_offset = 0; + action_array[action_index++] = '\0'; + action_offset = prolog_offset = action_index; + action_array[action_index] = '\0'; +} + + +/* mark_prolog - mark the current position in the action array as + * representing the end of the action prolog + */ +void mark_prolog () +{ + action_array[action_index++] = '\0'; + action_offset = action_index; + action_array[action_index] = '\0'; +} + + +/* mk2data - generate a data statement for a two-dimensional array + * + * Generates a data statement initializing the current 2-D array to "value". + */ +void mk2data (value) + int value; +{ + /* short circuit any output */ + if (!gentables) + return; + + if (datapos >= NUMDATAITEMS) { + outc (','); + dataflush (); + } + + if (datapos == 0) + /* Indent. */ + out (" "); + + else + outc (','); + + ++datapos; + + out_dec ("%5d", value); +} + + +/* mkdata - generate a data statement + * + * Generates a data statement initializing the current array element to + * "value". + */ +void mkdata (value) + int value; +{ + /* short circuit any output */ + if (!gentables) + return; + + if (datapos >= NUMDATAITEMS) { + outc (','); + dataflush (); + } + + if (datapos == 0) + /* Indent. */ + out (" "); + else + outc (','); + + ++datapos; + + out_dec ("%5d", value); +} + + +/* myctoi - return the integer represented by a string of digits */ + +int myctoi (array) + const char *array; +{ + int val = 0; + + (void) sscanf (array, "%d", &val); + + return val; +} + + +/* myesc - return character corresponding to escape sequence */ + +Char myesc (array) + Char array[]; +{ + Char c, esc_char; + + switch (array[1]) { + case 'b': + return '\b'; + case 'f': + return '\f'; + case 'n': + return '\n'; + case 'r': + return '\r'; + case 't': + return '\t'; + +#if defined (__STDC__) + case 'a': + return '\a'; + case 'v': + return '\v'; +#else + case 'a': + return '\007'; + case 'v': + return '\013'; +#endif + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + { /* \<octal> */ + int sptr = 1; + + while (isascii (array[sptr]) && + isdigit (array[sptr])) + /* Don't increment inside loop control + * because if isdigit() is a macro it might + * expand into multiple increments ... + */ + ++sptr; + + c = array[sptr]; + array[sptr] = '\0'; + + esc_char = otoi (array + 1); + + array[sptr] = c; + + return esc_char; + } + + case 'x': + { /* \x<hex> */ + int sptr = 2; + + while (isascii (array[sptr]) && + isxdigit ((char) array[sptr])) + /* Don't increment inside loop control + * because if isdigit() is a macro it might + * expand into multiple increments ... + */ + ++sptr; + + c = array[sptr]; + array[sptr] = '\0'; + + esc_char = htoi (array + 2); + + array[sptr] = c; + + return esc_char; + } + + default: + return array[1]; + } +} + + +/* otoi - convert an octal digit string to an integer value */ + +int otoi (str) + Char str[]; +{ + unsigned int result; + + (void) sscanf ((char *) str, "%o", &result); + return result; +} + + +/* out - various flavors of outputing a (possibly formatted) string for the + * generated scanner, keeping track of the line count. + */ + +void out (str) + const char *str; +{ + fputs (str, stdout); + out_line_count (str); +} + +void out_dec (fmt, n) + const char *fmt; + int n; +{ + fprintf (stdout, fmt, n); + out_line_count (fmt); +} + +void out_dec2 (fmt, n1, n2) + const char *fmt; + int n1, n2; +{ + fprintf (stdout, fmt, n1, n2); + out_line_count (fmt); +} + +void out_hex (fmt, x) + const char *fmt; + unsigned int x; +{ + fprintf (stdout, fmt, x); + out_line_count (fmt); +} + +void out_line_count (str) + const char *str; +{ + register int i; + + for (i = 0; str[i]; ++i) + if (str[i] == '\n') + ++out_linenum; +} + +void out_str (fmt, str) + const char *fmt, str[]; +{ + fprintf (stdout,fmt, str); + out_line_count (fmt); + out_line_count (str); +} + +void out_str3 (fmt, s1, s2, s3) + const char *fmt, s1[], s2[], s3[]; +{ + fprintf (stdout,fmt, s1, s2, s3); + out_line_count (fmt); + out_line_count (s1); + out_line_count (s2); + out_line_count (s3); +} + +void out_str_dec (fmt, str, n) + const char *fmt, str[]; + int n; +{ + fprintf (stdout,fmt, str, n); + out_line_count (fmt); + out_line_count (str); +} + +void outc (c) + int c; +{ + fputc (c, stdout); + + if (c == '\n') + ++out_linenum; +} + +void outn (str) + const char *str; +{ + fputs (str,stdout); + fputc('\n',stdout); + out_line_count (str); + ++out_linenum; +} + +/** Print "m4_define( [[def]], [[val]])m4_dnl\n". + * @param def The m4 symbol to define. + * @param val The definition; may be NULL. + * @return buf + */ +void out_m4_define (const char* def, const char* val) +{ + const char * fmt = "m4_define( [[%s]], [[%s]])m4_dnl\n"; + fprintf(stdout, fmt, def, val?val:""); +} + + +/* readable_form - return the the human-readable form of a character + * + * The returned string is in static storage. + */ + +char *readable_form (c) + register int c; +{ + static char rform[10]; + + if ((c >= 0 && c < 32) || c >= 127) { + switch (c) { + case '\b': + return "\\b"; + case '\f': + return "\\f"; + case '\n': + return "\\n"; + case '\r': + return "\\r"; + case '\t': + return "\\t"; + +#if defined (__STDC__) + case '\a': + return "\\a"; + case '\v': + return "\\v"; +#endif + + default: + snprintf (rform, sizeof(rform), "\\%.3o", (unsigned int) c); + return rform; + } + } + + else if (c == ' ') + return "' '"; + + else { + rform[0] = c; + rform[1] = '\0'; + + return rform; + } +} + + +/* reallocate_array - increase the size of a dynamic array */ + +void *reallocate_array (array, size, element_size) + void *array; + int size; + size_t element_size; +{ + register void *new_array; + size_t num_bytes = element_size * size; + + new_array = flex_realloc (array, num_bytes); + if (!new_array) + flexfatal (_("attempt to increase array size failed")); + + return new_array; +} + + +/* skelout - write out one section of the skeleton file + * + * Description + * Copies skelfile or skel array to stdout until a line beginning with + * "%%" or EOF is found. + */ +void skelout () +{ + char buf_storage[MAXLINE]; + char *buf = buf_storage; + bool do_copy = true; + + /* "reset" the state by clearing the buffer and pushing a '1' */ + if(sko_len > 0) + sko_peek(&do_copy); + sko_len = 0; + sko_push(do_copy=true); + + + /* Loop pulling lines either from the skelfile, if we're using + * one, or from the skel[] array. + */ + while (skelfile ? + (fgets (buf, MAXLINE, skelfile) != NULL) : + ((buf = (char *) skel[skel_ind++]) != 0)) { + + if (skelfile) + chomp (buf); + + /* copy from skel array */ + if (buf[0] == '%') { /* control line */ + /* print the control line as a comment. */ + if (ddebug && buf[1] != '#') { + if (buf[strlen (buf) - 1] == '\\') + out_str ("/* %s */\\\n", buf); + else + out_str ("/* %s */\n", buf); + } + + /* We've been accused of using cryptic markers in the skel. + * So we'll use emacs-style-hyphenated-commands. + * We might consider a hash if this if-else-if-else + * chain gets too large. + */ +#define cmd_match(s) (strncmp(buf,(s),strlen(s))==0) + + if (buf[1] == '%') { + /* %% is a break point for skelout() */ + return; + } + else if (cmd_match (CMD_PUSH)){ + sko_push(do_copy); + if(ddebug){ + out_str("/*(state = (%s) */",do_copy?"true":"false"); + } + out_str("%s\n", buf[strlen (buf) - 1] =='\\' ? "\\" : ""); + } + else if (cmd_match (CMD_POP)){ + sko_pop(&do_copy); + if(ddebug){ + out_str("/*(state = (%s) */",do_copy?"true":"false"); + } + out_str("%s\n", buf[strlen (buf) - 1] =='\\' ? "\\" : ""); + } + else if (cmd_match (CMD_IF_REENTRANT)){ + sko_push(do_copy); + do_copy = reentrant && do_copy; + } + else if (cmd_match (CMD_IF_NOT_REENTRANT)){ + sko_push(do_copy); + do_copy = !reentrant && do_copy; + } + else if (cmd_match(CMD_IF_BISON_BRIDGE)){ + sko_push(do_copy); + do_copy = bison_bridge_lval && do_copy; + } + else if (cmd_match(CMD_IF_NOT_BISON_BRIDGE)){ + sko_push(do_copy); + do_copy = !bison_bridge_lval && do_copy; + } + else if (cmd_match (CMD_ENDIF)){ + sko_pop(&do_copy); + } + else if (cmd_match (CMD_IF_TABLES_SER)) { + do_copy = do_copy && tablesext; + } + else if (cmd_match (CMD_TABLES_YYDMAP)) { + if (tablesext && yydmap_buf.elts) + outn ((char *) (yydmap_buf.elts)); + } + else if (cmd_match (CMD_DEFINE_YYTABLES)) { + out_str("#define YYTABLES_NAME \"%s\"\n", + tablesname?tablesname:"yytables"); + } + else if (cmd_match (CMD_IF_CPP_ONLY)) { + /* only for C++ */ + sko_push(do_copy); + do_copy = C_plus_plus; + } + else if (cmd_match (CMD_IF_C_ONLY)) { + /* %- only for C */ + sko_push(do_copy); + do_copy = !C_plus_plus; + } + else if (cmd_match (CMD_IF_C_OR_CPP)) { + /* %* for C and C++ */ + sko_push(do_copy); + do_copy = true; + } + else if (cmd_match (CMD_NOT_FOR_HEADER)) { + /* %c begin linkage-only (non-header) code. */ + OUT_BEGIN_CODE (); + } + else if (cmd_match (CMD_OK_FOR_HEADER)) { + /* %e end linkage-only code. */ + OUT_END_CODE (); + } + else if (buf[1] == '#') { + /* %# a comment in the skel. ignore. */ + } + else { + flexfatal (_("bad line in skeleton file")); + } + } + + else if (do_copy) + outn (buf); + } /* end while */ +} + + +/* transition_struct_out - output a yy_trans_info structure + * + * outputs the yy_trans_info structure with the two elements, element_v and + * element_n. Formats the output with spaces and carriage returns. + */ + +void transition_struct_out (element_v, element_n) + int element_v, element_n; +{ + + /* short circuit any output */ + if (!gentables) + return; + + out_dec2 (" {%4d,%4d },", element_v, element_n); + + datapos += TRANS_STRUCT_PRINT_LENGTH; + + if (datapos >= 79 - TRANS_STRUCT_PRINT_LENGTH) { + outc ('\n'); + + if (++dataline % 10 == 0) + outc ('\n'); + + datapos = 0; + } +} + + +/* The following is only needed when building flex's parser using certain + * broken versions of bison. + */ +void *yy_flex_xmalloc (size) + int size; +{ + void *result = flex_alloc ((size_t) size); + + if (!result) + flexfatal (_ + ("memory allocation failed in yy_flex_xmalloc()")); + + return result; +} + + +/* zero_out - set a region of memory to 0 + * + * Sets region_ptr[0] through region_ptr[size_in_bytes - 1] to zero. + */ + +void zero_out (region_ptr, size_in_bytes) + char *region_ptr; + size_t size_in_bytes; +{ + register char *rp, *rp_end; + + rp = region_ptr; + rp_end = region_ptr + size_in_bytes; + + while (rp < rp_end) + *rp++ = 0; +} + +/* Remove all '\n' and '\r' characters, if any, from the end of str. + * str can be any null-terminated string, or NULL. + * returns str. */ +char *chomp (str) + char *str; +{ + char *p = str; + + if (!str || !*str) /* s is null or empty string */ + return str; + + /* find end of string minus one */ + while (*p) + ++p; + --p; + + /* eat newlines */ + while (p >= str && (*p == '\r' || *p == '\n')) + *p-- = 0; + return str; +} diff --git a/missing b/missing new file mode 100755 index 000000000000..894e786e16c1 --- /dev/null +++ b/missing @@ -0,0 +1,360 @@ +#! /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/mkinstalldirs b/mkinstalldirs new file mode 100755 index 000000000000..d2d5f21b6112 --- /dev/null +++ b/mkinstalldirs @@ -0,0 +1,111 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman <friedman@prep.ai.mit.edu> +# Created: 1993-05-16 +# Public domain + +errstatus=0 +dirmode="" + +usage="\ +Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" 1>&2 + exit 0 + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --) # 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 + +case $dirmode in + '') + if mkdir -p -- . 2>/dev/null; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + fi + ;; + *) + if mkdir -m "$dirmode" -p -- . 2>/dev/null; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + fi + ;; +esac + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + 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 +# End: +# mkinstalldirs ends here diff --git a/mkskel.sh b/mkskel.sh new file mode 100755 index 000000000000..02c397a81c96 --- /dev/null +++ b/mkskel.sh @@ -0,0 +1,37 @@ +#! /bin/sh + +# This file is part of flex. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: + +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. + +# Neither the name of the University nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE. + +cat <<! +/* File created from flex.skl via mkskel.sh */ + +#include "flexdef.h" + +const char *skel[] = { +! + +sed 's/\\/&&/g' | sed 's/"/\\"/g' | sed 's/.*/ "&",/' + +cat <<! + 0 +}; +! diff --git a/usr.bin/lex/nfa.c b/nfa.c index 34acbce79fc3..dbd15578b77c 100644 --- a/usr.bin/lex/nfa.c +++ b/nfa.c @@ -1,40 +1,43 @@ /* nfa - NFA construction routines */ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ -/* $Header: /home/daffy/u0/vern/flex/RCS/nfa.c,v 2.17 95/03/04 16:11:42 vern Exp $ */ +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ #include "flexdef.h" /* declare functions that have forward references */ -int dupmachine PROTO((int)); -void mkxtion PROTO((int, int)); +int dupmachine PROTO ((int)); +void mkxtion PROTO ((int, int)); /* add_accept - add an accepting state to a machine @@ -42,25 +45,25 @@ void mkxtion PROTO((int, int)); * accepting_number becomes mach's accepting number. */ -void add_accept( mach, accepting_number ) -int mach, accepting_number; - { +void add_accept (mach, accepting_number) + int mach, accepting_number; +{ /* Hang the accepting number off an epsilon state. if it is associated * with a state that has a non-epsilon out-transition, then the state * will accept BEFORE it makes that transition, i.e., one character * too soon. */ - if ( transchar[finalst[mach]] == SYM_EPSILON ) + if (transchar[finalst[mach]] == SYM_EPSILON) accptnum[finalst[mach]] = accepting_number; - else - { - int astate = mkstate( SYM_EPSILON ); + else { + int astate = mkstate (SYM_EPSILON); + accptnum[astate] = accepting_number; - (void) link_machines( mach, astate ); - } + (void) link_machines (mach, astate); } +} /* copysingl - make a given number of copies of a singleton machine @@ -74,31 +77,32 @@ int mach, accepting_number; * num - the number of copies of singl to be present in newsng */ -int copysingl( singl, num ) -int singl, num; - { - int copy, i; +int copysingl (singl, num) + int singl, num; +{ + int copy, i; - copy = mkstate( SYM_EPSILON ); + copy = mkstate (SYM_EPSILON); - for ( i = 1; i <= num; ++i ) - copy = link_machines( copy, dupmachine( singl ) ); + for (i = 1; i <= num; ++i) + copy = link_machines (copy, dupmachine (singl)); return copy; - } +} /* dumpnfa - debugging routine to write out an nfa */ -void dumpnfa( state1 ) -int state1; +void dumpnfa (state1) + int state1; - { - int sym, tsp1, tsp2, anum, ns; +{ + int sym, tsp1, tsp2, anum, ns; - fprintf( stderr, - _( "\n\n********** beginning dump of nfa with start state %d\n" ), - state1 ); + fprintf (stderr, + _ + ("\n\n********** beginning dump of nfa with start state %d\n"), + state1); /* We probably should loop starting at firstst[state1] and going to * lastst[state1], but they're not maintained properly when we "or" @@ -107,26 +111,25 @@ int state1; */ /* for ( ns = firstst[state1]; ns <= lastst[state1]; ++ns ) */ - for ( ns = 1; ns <= lastnfa; ++ns ) - { - fprintf( stderr, _( "state # %4d\t" ), ns ); + for (ns = 1; ns <= lastnfa; ++ns) { + fprintf (stderr, _("state # %4d\t"), ns); sym = transchar[ns]; tsp1 = trans1[ns]; tsp2 = trans2[ns]; anum = accptnum[ns]; - fprintf( stderr, "%3d: %4d, %4d", sym, tsp1, tsp2 ); - - if ( anum != NIL ) - fprintf( stderr, " [%d]", anum ); + fprintf (stderr, "%3d: %4d, %4d", sym, tsp1, tsp2); - fprintf( stderr, "\n" ); - } + if (anum != NIL) + fprintf (stderr, " [%d]", anum); - fprintf( stderr, _( "********** end of dump\n" ) ); + fprintf (stderr, "\n"); } + fprintf (stderr, _("********** end of dump\n")); +} + /* dupmachine - make a duplicate of a given machine * @@ -145,32 +148,30 @@ int state1; * states accessible by the arrays firstst and lastst */ -int dupmachine( mach ) -int mach; - { - int i, init, state_offset; - int state = 0; - int last = lastst[mach]; - - for ( i = firstst[mach]; i <= last; ++i ) - { - state = mkstate( transchar[i] ); - - if ( trans1[i] != NO_TRANSITION ) - { - mkxtion( finalst[state], trans1[i] + state - i ); - - if ( transchar[i] == SYM_EPSILON && - trans2[i] != NO_TRANSITION ) - mkxtion( finalst[state], - trans2[i] + state - i ); - } +int dupmachine (mach) + int mach; +{ + int i, init, state_offset; + int state = 0; + int last = lastst[mach]; - accptnum[state] = accptnum[i]; + for (i = firstst[mach]; i <= last; ++i) { + state = mkstate (transchar[i]); + + if (trans1[i] != NO_TRANSITION) { + mkxtion (finalst[state], trans1[i] + state - i); + + if (transchar[i] == SYM_EPSILON && + trans2[i] != NO_TRANSITION) + mkxtion (finalst[state], + trans2[i] + state - i); } - if ( state == 0 ) - flexfatal( _( "empty machine in dupmachine()" ) ); + accptnum[state] = accptnum[i]; + } + + if (state == 0) + flexfatal (_("empty machine in dupmachine()")); state_offset = state - i + 1; @@ -180,7 +181,7 @@ int mach; lastst[init] = lastst[mach] + state_offset; return init; - } +} /* finish_rule - finish up the processing for a rule @@ -195,12 +196,13 @@ int mach; * context has variable length. */ -void finish_rule( mach, variable_trail_rule, headcnt, trailcnt ) -int mach, variable_trail_rule, headcnt, trailcnt; - { - char action_text[MAXLINE]; +void finish_rule (mach, variable_trail_rule, headcnt, trailcnt, + pcont_act) + int mach, variable_trail_rule, headcnt, trailcnt, pcont_act; +{ + char action_text[MAXLINE]; - add_accept( mach, num_rules ); + add_accept (mach, num_rules); /* We did this in new_rule(), but it often gets the wrong * number because we do it before we start parsing the current rule. @@ -210,68 +212,77 @@ int mach, variable_trail_rule, headcnt, trailcnt; /* If this is a continued action, then the line-number has already * been updated, giving us the wrong number. */ - if ( continued_action ) + if (continued_action) --rule_linenum[num_rules]; - sprintf( action_text, "case %d:\n", num_rules ); - add_action( action_text ); - if ( variable_trail_rule ) - { + /* If the previous rule was continued action, then we inherit the + * previous newline flag, possibly overriding the current one. + */ + if (pcont_act && rule_has_nl[num_rules - 1]) + rule_has_nl[num_rules] = true; + + snprintf (action_text, sizeof(action_text), "case %d:\n", num_rules); + add_action (action_text); + if (rule_has_nl[num_rules]) { + snprintf (action_text, sizeof(action_text), "/* rule %d can match eol */\n", + num_rules); + add_action (action_text); + } + + + if (variable_trail_rule) { rule_type[num_rules] = RULE_VARIABLE; - if ( performance_report > 0 ) - fprintf( stderr, - _( "Variable trailing context rule at line %d\n" ), - rule_linenum[num_rules] ); + if (performance_report > 0) + fprintf (stderr, + _ + ("Variable trailing context rule at line %d\n"), + rule_linenum[num_rules]); variable_trailing_context_rules = true; - } + } - else - { + else { rule_type[num_rules] = RULE_NORMAL; - if ( headcnt > 0 || trailcnt > 0 ) - { + if (headcnt > 0 || trailcnt > 0) { /* Do trailing context magic to not match the trailing * characters. */ - char *scanner_cp = "yy_c_buf_p = yy_cp"; - char *scanner_bp = "yy_bp"; - - add_action( - "*yy_cp = yy_hold_char; /* undo effects of setting up yytext */\n" ); - - if ( headcnt > 0 ) - { - sprintf( action_text, "%s = %s + %d;\n", - scanner_cp, scanner_bp, headcnt ); - add_action( action_text ); - } - - else - { - sprintf( action_text, "%s -= %d;\n", - scanner_cp, trailcnt ); - add_action( action_text ); - } - - add_action( - "YY_DO_BEFORE_ACTION; /* set up yytext again */\n" ); + char *scanner_cp = "YY_G(yy_c_buf_p) = yy_cp"; + char *scanner_bp = "yy_bp"; + + add_action + ("*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */\n"); + + if (headcnt > 0) { + snprintf (action_text, sizeof(action_text), "%s = %s + %d;\n", + scanner_cp, scanner_bp, headcnt); + add_action (action_text); } + + else { + snprintf (action_text, sizeof(action_text), "%s -= %d;\n", + scanner_cp, trailcnt); + add_action (action_text); + } + + add_action + ("YY_DO_BEFORE_ACTION; /* set up yytext again */\n"); } + } /* Okay, in the action code at this point yytext and yyleng have * their proper final values for this rule, so here's the point * to do any user action. But don't do it for continued actions, * as that'll result in multiple YY_RULE_SETUP's. */ - if ( ! continued_action ) - add_action( "YY_RULE_SETUP\n" ); + if (!continued_action) + add_action ("YY_RULE_SETUP\n"); - line_directive_out( (FILE *) 0, 1 ); - } + line_directive_out ((FILE *) 0, 1); +} /* link_machines - connect two machines together @@ -290,25 +301,24 @@ int mach, variable_trail_rule, headcnt, trailcnt; * FIRST is set to new by the operation. last is unmolested. */ -int link_machines( first, last ) -int first, last; - { - if ( first == NIL ) +int link_machines (first, last) + int first, last; +{ + if (first == NIL) return last; - else if ( last == NIL ) + else if (last == NIL) return first; - else - { - mkxtion( finalst[first], last ); + else { + mkxtion (finalst[first], last); finalst[first] = finalst[last]; - lastst[first] = MAX( lastst[first], lastst[last] ); - firstst[first] = MIN( firstst[first], firstst[last] ); + lastst[first] = MAX (lastst[first], lastst[last]); + firstst[first] = MIN (firstst[first], firstst[last]); return first; - } } +} /* mark_beginning_as_normal - mark each "beginning" state in a machine @@ -318,36 +328,32 @@ int first, last; * The "beginning" states are the epsilon closure of the first state */ -void mark_beginning_as_normal( mach ) -register int mach; - { - switch ( state_type[mach] ) - { - case STATE_NORMAL: - /* Oh, we've already visited here. */ - return; - - case STATE_TRAILING_CONTEXT: - state_type[mach] = STATE_NORMAL; - - if ( transchar[mach] == SYM_EPSILON ) - { - if ( trans1[mach] != NO_TRANSITION ) - mark_beginning_as_normal( - trans1[mach] ); - - if ( trans2[mach] != NO_TRANSITION ) - mark_beginning_as_normal( - trans2[mach] ); - } - break; - - default: - flexerror( - _( "bad state type in mark_beginning_as_normal()" ) ); - break; +void mark_beginning_as_normal (mach) + register int mach; +{ + switch (state_type[mach]) { + case STATE_NORMAL: + /* Oh, we've already visited here. */ + return; + + case STATE_TRAILING_CONTEXT: + state_type[mach] = STATE_NORMAL; + + if (transchar[mach] == SYM_EPSILON) { + if (trans1[mach] != NO_TRANSITION) + mark_beginning_as_normal (trans1[mach]); + + if (trans2[mach] != NO_TRANSITION) + mark_beginning_as_normal (trans2[mach]); } + break; + + default: + flexerror (_ + ("bad state type in mark_beginning_as_normal()")); + break; } +} /* mkbranch - make a machine that branches to two machines @@ -364,24 +370,24 @@ register int mach; * more mkbranch's. Compare with mkor() */ -int mkbranch( first, second ) -int first, second; - { - int eps; +int mkbranch (first, second) + int first, second; +{ + int eps; - if ( first == NO_TRANSITION ) + if (first == NO_TRANSITION) return second; - else if ( second == NO_TRANSITION ) + else if (second == NO_TRANSITION) return first; - eps = mkstate( SYM_EPSILON ); + eps = mkstate (SYM_EPSILON); - mkxtion( eps, first ); - mkxtion( eps, second ); + mkxtion (eps, first); + mkxtion (eps, second); return eps; - } +} /* mkclos - convert a machine into a closure @@ -392,11 +398,11 @@ int first, second; * new - a new state which matches the closure of "state" */ -int mkclos( state ) -int state; - { - return mkopt( mkposcl( state ) ); - } +int mkclos (state) + int state; +{ + return mkopt (mkposcl (state)); +} /* mkopt - make a machine optional @@ -413,28 +419,27 @@ int state; * 2. mach is destroyed by the call */ -int mkopt( mach ) -int mach; - { - int eps; +int mkopt (mach) + int mach; +{ + int eps; - if ( ! SUPER_FREE_EPSILON(finalst[mach]) ) - { - eps = mkstate( SYM_EPSILON ); - mach = link_machines( mach, eps ); - } + if (!SUPER_FREE_EPSILON (finalst[mach])) { + eps = mkstate (SYM_EPSILON); + mach = link_machines (mach, eps); + } /* Can't skimp on the following if FREE_EPSILON(mach) is true because * some state interior to "mach" might point back to the beginning * for a closure. */ - eps = mkstate( SYM_EPSILON ); - mach = link_machines( eps, mach ); + eps = mkstate (SYM_EPSILON); + mach = link_machines (eps, mach); - mkxtion( mach, finalst[mach] ); + mkxtion (mach, finalst[mach]); return mach; - } +} /* mkor - make a machine that matches either one of two machines @@ -451,56 +456,52 @@ int mach; * the number of epsilon states needed */ -int mkor( first, second ) -int first, second; - { - int eps, orend; +int mkor (first, second) + int first, second; +{ + int eps, orend; - if ( first == NIL ) + if (first == NIL) return second; - else if ( second == NIL ) + else if (second == NIL) return first; - else - { + else { /* See comment in mkopt() about why we can't use the first * state of "first" or "second" if they satisfy "FREE_EPSILON". */ - eps = mkstate( SYM_EPSILON ); + eps = mkstate (SYM_EPSILON); - first = link_machines( eps, first ); + first = link_machines (eps, first); - mkxtion( first, second ); + mkxtion (first, second); - if ( SUPER_FREE_EPSILON(finalst[first]) && - accptnum[finalst[first]] == NIL ) - { + if (SUPER_FREE_EPSILON (finalst[first]) && + accptnum[finalst[first]] == NIL) { orend = finalst[first]; - mkxtion( finalst[second], orend ); - } + mkxtion (finalst[second], orend); + } - else if ( SUPER_FREE_EPSILON(finalst[second]) && - accptnum[finalst[second]] == NIL ) - { + else if (SUPER_FREE_EPSILON (finalst[second]) && + accptnum[finalst[second]] == NIL) { orend = finalst[second]; - mkxtion( finalst[first], orend ); - } + mkxtion (finalst[first], orend); + } - else - { - eps = mkstate( SYM_EPSILON ); + else { + eps = mkstate (SYM_EPSILON); - first = link_machines( first, eps ); + first = link_machines (first, eps); orend = finalst[first]; - mkxtion( finalst[second], orend ); - } + mkxtion (finalst[second], orend); } + } finalst[first] = orend; return first; - } +} /* mkposcl - convert a machine into a positive closure @@ -511,24 +512,22 @@ int first, second; * new - a machine matching the positive closure of "state" */ -int mkposcl( state ) -int state; - { - int eps; +int mkposcl (state) + int state; +{ + int eps; - if ( SUPER_FREE_EPSILON(finalst[state]) ) - { - mkxtion( finalst[state], state ); + if (SUPER_FREE_EPSILON (finalst[state])) { + mkxtion (finalst[state], state); return state; - } + } - else - { - eps = mkstate( SYM_EPSILON ); - mkxtion( eps, state ); - return link_machines( state, eps ); - } + else { + eps = mkstate (SYM_EPSILON); + mkxtion (eps, state); + return link_machines (state, eps); } +} /* mkrep - make a replicated machine @@ -540,39 +539,39 @@ int state; * number of times to "ub" number of times * * note - * if "ub" is INFINITY then "new" matches "lb" or more occurrences of "mach" + * if "ub" is INFINITE_REPEAT then "new" matches "lb" or more occurrences of "mach" */ -int mkrep( mach, lb, ub ) -int mach, lb, ub; - { - int base_mach, tail, copy, i; +int mkrep (mach, lb, ub) + int mach, lb, ub; +{ + int base_mach, tail, copy, i; - base_mach = copysingl( mach, lb - 1 ); + base_mach = copysingl (mach, lb - 1); - if ( ub == INFINITY ) - { - copy = dupmachine( mach ); - mach = link_machines( mach, - link_machines( base_mach, mkclos( copy ) ) ); - } + if (ub == INFINITE_REPEAT) { + copy = dupmachine (mach); + mach = link_machines (mach, + link_machines (base_mach, + mkclos (copy))); + } - else - { - tail = mkstate( SYM_EPSILON ); + else { + tail = mkstate (SYM_EPSILON); - for ( i = lb; i < ub; ++i ) - { - copy = dupmachine( mach ); - tail = mkopt( link_machines( copy, tail ) ); - } - - mach = link_machines( mach, link_machines( base_mach, tail ) ); + for (i = lb; i < ub; ++i) { + copy = dupmachine (mach); + tail = mkopt (link_machines (copy, tail)); } - return mach; + mach = + link_machines (mach, + link_machines (base_mach, tail)); } + return mach; +} + /* mkstate - create a state with a transition on a given symbol * @@ -590,30 +589,31 @@ int mach, lb, ub; * that it admittedly is) */ -int mkstate( sym ) -int sym; - { - if ( ++lastnfa >= current_mns ) - { - if ( (current_mns += MNS_INCREMENT) >= MAXIMUM_MNS ) - lerrif( - _( "input rules are too complicated (>= %d NFA states)" ), - current_mns ); +int mkstate (sym) + int sym; +{ + if (++lastnfa >= current_mns) { + if ((current_mns += MNS_INCREMENT) >= maximum_mns) + lerrif (_ + ("input rules are too complicated (>= %d NFA states)"), +current_mns); ++num_reallocs; - firstst = reallocate_integer_array( firstst, current_mns ); - lastst = reallocate_integer_array( lastst, current_mns ); - finalst = reallocate_integer_array( finalst, current_mns ); - transchar = reallocate_integer_array( transchar, current_mns ); - trans1 = reallocate_integer_array( trans1, current_mns ); - trans2 = reallocate_integer_array( trans2, current_mns ); - accptnum = reallocate_integer_array( accptnum, current_mns ); + firstst = reallocate_integer_array (firstst, current_mns); + lastst = reallocate_integer_array (lastst, current_mns); + finalst = reallocate_integer_array (finalst, current_mns); + transchar = + reallocate_integer_array (transchar, current_mns); + trans1 = reallocate_integer_array (trans1, current_mns); + trans2 = reallocate_integer_array (trans2, current_mns); + accptnum = + reallocate_integer_array (accptnum, current_mns); assoc_rule = - reallocate_integer_array( assoc_rule, current_mns ); + reallocate_integer_array (assoc_rule, current_mns); state_type = - reallocate_integer_array( state_type, current_mns ); - } + reallocate_integer_array (state_type, current_mns); + } firstst[lastnfa] = lastnfa; finalst[lastnfa] = lastnfa; @@ -634,28 +634,26 @@ int sym; * elsewhere in the input). */ - if ( sym < 0 ) - { + if (sym < 0) { /* We don't have to update the equivalence classes since * that was already done when the ccl was created for the * first time. */ - } + } - else if ( sym == SYM_EPSILON ) + else if (sym == SYM_EPSILON) ++numeps; - else - { - check_char( sym ); + else { + check_char (sym); - if ( useecs ) + if (useecs) /* Map NUL's to csize. */ - mkechar( sym ? sym : csize, nextecm, ecgroup ); - } + mkechar (sym ? sym : csize, nextecm, ecgroup); + } return lastnfa; - } +} /* mkxtion - make a transition from one state to another @@ -668,42 +666,43 @@ int sym; * stateto - the state to which the transition is to be made */ -void mkxtion( statefrom, stateto ) -int statefrom, stateto; - { - if ( trans1[statefrom] == NO_TRANSITION ) +void mkxtion (statefrom, stateto) + int statefrom, stateto; +{ + if (trans1[statefrom] == NO_TRANSITION) trans1[statefrom] = stateto; - else if ( (transchar[statefrom] != SYM_EPSILON) || - (trans2[statefrom] != NO_TRANSITION) ) - flexfatal( _( "found too many transitions in mkxtion()" ) ); + else if ((transchar[statefrom] != SYM_EPSILON) || + (trans2[statefrom] != NO_TRANSITION)) + flexfatal (_("found too many transitions in mkxtion()")); - else - { /* second out-transition for an epsilon state */ + else { /* second out-transition for an epsilon state */ ++eps2; trans2[statefrom] = stateto; - } } +} /* new_rule - initialize for a new rule */ -void new_rule() - { - if ( ++num_rules >= current_max_rules ) - { +void new_rule () +{ + if (++num_rules >= current_max_rules) { ++num_reallocs; current_max_rules += MAX_RULES_INCREMENT; - rule_type = reallocate_integer_array( rule_type, - current_max_rules ); - rule_linenum = reallocate_integer_array( rule_linenum, - current_max_rules ); - rule_useful = reallocate_integer_array( rule_useful, - current_max_rules ); - } + rule_type = reallocate_integer_array (rule_type, + current_max_rules); + rule_linenum = reallocate_integer_array (rule_linenum, + current_max_rules); + rule_useful = reallocate_integer_array (rule_useful, + current_max_rules); + rule_has_nl = reallocate_bool_array (rule_has_nl, + current_max_rules); + } - if ( num_rules > MAX_RULE ) - lerrif( _( "too many rules (> %d)!" ), MAX_RULE ); + if (num_rules > MAX_RULE) + lerrif (_("too many rules (> %d)!"), MAX_RULE); rule_linenum[num_rules] = linenum; rule_useful[num_rules] = false; - } + rule_has_nl[num_rules] = false; +} diff --git a/options.c b/options.c new file mode 100644 index 000000000000..c6731738a19b --- /dev/null +++ b/options.c @@ -0,0 +1,280 @@ +/* flex - tool to generate fast lexical analyzers */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "options.h" + +/* Be sure to synchronize these options with those defined in "options.h", + * the giant switch() statement in "main.c", and the %option processing in + * "scan.l". + */ + + +/* The command-line options, passed to scanopt_init() */ +optspec_t flexopts[] = { + + {"-7", OPT_7BIT, 0} + , + {"--7bit", OPT_7BIT, 0} + , /* Generate 7-bit scanner. */ + {"-8", OPT_8BIT, 0} + , + {"--8bit", OPT_8BIT, 0} + , /* Generate 8-bit scanner. */ + {"--align", OPT_ALIGN, 0} + , /* Trade off larger tables for better memory alignment. */ + {"--noalign", OPT_NO_ALIGN, 0} + , + {"--always-interactive", OPT_ALWAYS_INTERACTIVE, 0} + , + {"--array", OPT_ARRAY, 0} + , + {"-b", OPT_BACKUP, 0} + , + {"--backup", OPT_BACKUP, 0} + , /* Generate backing-up information to lex.backup. */ + {"-B", OPT_BATCH, 0} + , + {"--batch", OPT_BATCH, 0} + , /* Generate batch scanner (opposite of -I). */ + {"--bison-bridge", OPT_BISON_BRIDGE, 0} + , /* Scanner to be called by a bison pure parser. */ + {"--bison-locations", OPT_BISON_BRIDGE_LOCATIONS, 0} + , /* Scanner to be called by a bison pure parser. */ + {"-i", OPT_CASE_INSENSITIVE, 0} + , + {"--case-insensitive", OPT_CASE_INSENSITIVE, 0} + , /* Generate case-insensitive scanner. */ + + {"-C[aefFmr]", OPT_COMPRESSION, + "Specify degree of table compression (default is -Cem)"}, + {"-+", OPT_CPLUSPLUS, 0} + , + {"--c++", OPT_CPLUSPLUS, 0} + , /* Generate C++ scanner class. */ + {"-d", OPT_DEBUG, 0} + , + {"--debug", OPT_DEBUG, 0} + , /* Turn on debug mode in generated scanner. */ + {"--nodebug", OPT_NO_DEBUG, 0} + , + {"-s", OPT_NO_DEFAULT, 0} + , + {"--nodefault", OPT_NO_DEFAULT, 0} + , /* Suppress default rule to ECHO unmatched text. */ + {"--default", OPT_DEFAULT, 0} + , + {"-c", OPT_DONOTHING, 0} + , /* For POSIX lex compatibility. */ + {"-n", OPT_DONOTHING, 0} + , /* For POSIX lex compatibility. */ + {"--ecs", OPT_ECS, 0} + , /* Construct equivalence classes. */ + {"--noecs", OPT_NO_ECS, 0} + , + {"-F", OPT_FAST, 0} + , + {"--fast", OPT_FAST, 0} + , /* Same as -CFr. */ + {"-f", OPT_FULL, 0} + , + {"--full", OPT_FULL, 0} + , /* Same as -Cfr. */ + {"--header-file[=FILE]", OPT_HEADER_FILE, 0} + , + {"-?", OPT_HELP, 0} + , + {"-h", OPT_HELP, 0} + , + {"--help", OPT_HELP, 0} + , /* Produce this help message. */ + {"-I", OPT_INTERACTIVE, 0} + , + {"--interactive", OPT_INTERACTIVE, 0} + , /* Generate interactive scanner (opposite of -B). */ + {"-l", OPT_LEX_COMPAT, 0} + , + {"--lex-compat", OPT_LEX_COMPAT, 0} + , /* Maximal compatibility with original lex. */ + {"-X", OPT_POSIX_COMPAT, 0} + , + {"--posix-compat", OPT_POSIX_COMPAT, 0} + , /* Maximal compatibility with POSIX lex. */ + {"--preproc=NUM", OPT_PREPROC_LEVEL, 0} + , + {"-L", OPT_NO_LINE, 0} + , /* Suppress #line directives in scanner. */ + {"--noline", OPT_NO_LINE, 0} + , /* Suppress #line directives in scanner. */ + {"--main", OPT_MAIN, 0} + , /* use built-in main() function. */ + {"--nomain", OPT_NO_MAIN, 0} + , + {"--meta-ecs", OPT_META_ECS, 0} + , /* Construct meta-equivalence classes. */ + {"--nometa-ecs", OPT_NO_META_ECS, 0} + , + {"--never-interactive", OPT_NEVER_INTERACTIVE, 0} + , + {"-o FILE", OPT_OUTFILE, 0} + , + {"--outfile=FILE", OPT_OUTFILE, 0} + , /* Write to FILE (default is lex.yy.c) */ + {"-p", OPT_PERF_REPORT, 0} + , + {"--perf-report", OPT_PERF_REPORT, 0} + , /* Generate performance report to stderr. */ + {"--pointer", OPT_POINTER, 0} + , + {"-P PREFIX", OPT_PREFIX, 0} + , + {"--prefix=PREFIX", OPT_PREFIX, 0} + , /* Use PREFIX (default is yy) */ + {"-Dmacro", OPT_PREPROCDEFINE, 0} + , /* Define a preprocessor symbol. */ + {"--read", OPT_READ, 0} + , /* Use read(2) instead of stdio. */ + {"-R", OPT_REENTRANT, 0} + , + {"--reentrant", OPT_REENTRANT, 0} + , /* Generate a reentrant C scanner. */ + {"--noreentrant", OPT_NO_REENTRANT, 0} + , + {"--reject", OPT_REJECT, 0} + , + {"--noreject", OPT_NO_REJECT, 0} + , + {"-S FILE", OPT_SKEL, 0} + , + {"--skel=FILE", OPT_SKEL, 0} + , /* Use skeleton from FILE */ + {"--stack", OPT_STACK, 0} + , + {"--stdinit", OPT_STDINIT, 0} + , + {"--nostdinit", OPT_NO_STDINIT, 0} + , + {"-t", OPT_STDOUT, 0} + , + {"--stdout", OPT_STDOUT, 0} + , /* Write generated scanner to stdout. */ + {"-T", OPT_TRACE, 0} + , + {"--trace", OPT_TRACE, 0} + , /* Flex should run in trace mode. */ + {"--tables-file[=FILE]", OPT_TABLES_FILE, 0} + , /* Save tables to FILE */ + {"--tables-verify", OPT_TABLES_VERIFY, 0} + , /* Tables integrity check */ + {"--nounistd", OPT_NO_UNISTD_H, 0} + , /* Do not include unistd.h */ + {"-v", OPT_VERBOSE, 0} + , + {"--verbose", OPT_VERBOSE, 0} + , /* Write summary of scanner statistics to stdout. */ + {"-V", OPT_VERSION, 0} + , + {"--version", OPT_VERSION, 0} + , /* Report flex version. */ + {"--warn", OPT_WARN, 0} + , + {"-w", OPT_NO_WARN, 0} + , + {"--nowarn", OPT_NO_WARN, 0} + , /* Suppress warning messages. */ + {"--noansi-definitions", OPT_NO_ANSI_FUNC_DEFS, 0} + , + {"--noansi-prototypes", OPT_NO_ANSI_FUNC_PROTOS, 0} + , + {"--yyclass=NAME", OPT_YYCLASS, 0} + , + {"--yylineno", OPT_YYLINENO, 0} + , + {"--noyylineno", OPT_NO_YYLINENO, 0} + , + + {"--yymore", OPT_YYMORE, 0} + , + {"--noyymore", OPT_NO_YYMORE, 0} + , + {"--noyywrap", OPT_NO_YYWRAP, 0} + , + {"--yywrap", OPT_YYWRAP, 0} + , + + {"--nounput", OPT_NO_UNPUT, 0} + , + {"--noyy_push_state", OPT_NO_YY_PUSH_STATE, 0} + , + {"--noyy_pop_state", OPT_NO_YY_POP_STATE, 0} + , + {"--noyy_top_state", OPT_NO_YY_TOP_STATE, 0} + , + {"--noyy_scan_buffer", OPT_NO_YY_SCAN_BUFFER, 0} + , + {"--noyy_scan_bytes", OPT_NO_YY_SCAN_BYTES, 0} + , + {"--noyy_scan_string", OPT_NO_YY_SCAN_STRING, 0} + , + {"--noyyget_extra", OPT_NO_YYGET_EXTRA, 0} + , + {"--noyyset_extra", OPT_NO_YYSET_EXTRA, 0} + , + {"--noyyget_leng", OPT_NO_YYGET_LENG, 0} + , + {"--noyyget_text", OPT_NO_YYGET_TEXT, 0} + , + {"--noyyget_lineno", OPT_NO_YYGET_LINENO, 0} + , + {"--noyyset_lineno", OPT_NO_YYSET_LINENO, 0} + , + {"--noyyget_in", OPT_NO_YYGET_IN, 0} + , + {"--noyyset_in", OPT_NO_YYSET_IN, 0} + , + {"--noyyget_out", OPT_NO_YYGET_OUT, 0} + , + {"--noyyset_out", OPT_NO_YYSET_OUT, 0} + , + {"--noyyget_lval", OPT_NO_YYGET_LVAL, 0} + , + {"--noyyset_lval", OPT_NO_YYSET_LVAL, 0} + , + {"--noyyget_lloc", OPT_NO_YYGET_LLOC, 0} + , + {"--noyyset_lloc", OPT_NO_YYSET_LLOC, 0} + , + + {0, 0, 0} /* required final NULL entry. */ +}; + +/* vim:set tabstop=8 softtabstop=4 shiftwidth=4: */ diff --git a/options.h b/options.h new file mode 100644 index 000000000000..1f3925b9e94d --- /dev/null +++ b/options.h @@ -0,0 +1,134 @@ +/* flex - tool to generate fast lexical analyzers */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#ifndef OPTIONS_H +#define OPTIONS_H +#include "scanopt.h" + +extern optspec_t flexopts[]; + +enum flexopt_flag_t { + /* Use positive integers only, since they are return codes for scanopt. + * Order is not important. */ + OPT_7BIT = 1, + OPT_8BIT, + OPT_ALIGN, + OPT_ALWAYS_INTERACTIVE, + OPT_ARRAY, + OPT_BACKUP, + OPT_BATCH, + OPT_BISON_BRIDGE, + OPT_BISON_BRIDGE_LOCATIONS, + OPT_CASE_INSENSITIVE, + OPT_COMPRESSION, + OPT_CPLUSPLUS, + OPT_DEBUG, + OPT_DEFAULT, + OPT_DONOTHING, + OPT_ECS, + OPT_FAST, + OPT_FULL, + OPT_HEADER_FILE, + OPT_HELP, + OPT_INTERACTIVE, + OPT_LEX_COMPAT, + OPT_POSIX_COMPAT, + OPT_MAIN, + OPT_META_ECS, + OPT_NEVER_INTERACTIVE, + OPT_NO_ALIGN, + OPT_NO_ANSI_FUNC_DEFS, + OPT_NO_ANSI_FUNC_PROTOS, + OPT_NO_DEBUG, + OPT_NO_DEFAULT, + OPT_NO_ECS, + OPT_NO_LINE, + OPT_NO_MAIN, + OPT_NO_META_ECS, + OPT_NO_REENTRANT, + OPT_NO_REJECT, + OPT_NO_STDINIT, + OPT_NO_UNPUT, + OPT_NO_WARN, + OPT_NO_YYGET_EXTRA, + OPT_NO_YYGET_IN, + OPT_NO_YYGET_LENG, + OPT_NO_YYGET_LINENO, + OPT_NO_YYGET_LLOC, + OPT_NO_YYGET_LVAL, + OPT_NO_YYGET_OUT, + OPT_NO_YYGET_TEXT, + OPT_NO_YYLINENO, + OPT_NO_YYMORE, + OPT_NO_YYSET_EXTRA, + OPT_NO_YYSET_IN, + OPT_NO_YYSET_LINENO, + OPT_NO_YYSET_LLOC, + OPT_NO_YYSET_LVAL, + OPT_NO_YYSET_OUT, + OPT_NO_YYWRAP, + OPT_NO_YY_POP_STATE, + OPT_NO_YY_PUSH_STATE, + OPT_NO_YY_SCAN_BUFFER, + OPT_NO_YY_SCAN_BYTES, + OPT_NO_YY_SCAN_STRING, + OPT_NO_YY_TOP_STATE, + OPT_OUTFILE, + OPT_PERF_REPORT, + OPT_POINTER, + OPT_PREFIX, + OPT_PREPROCDEFINE, + OPT_PREPROC_LEVEL, + OPT_READ, + OPT_REENTRANT, + OPT_REJECT, + OPT_SKEL, + OPT_STACK, + OPT_STDINIT, + OPT_STDOUT, + OPT_TABLES_FILE, + OPT_TABLES_VERIFY, + OPT_TRACE, + OPT_NO_UNISTD_H, + OPT_VERBOSE, + OPT_VERSION, + OPT_WARN, + OPT_YYCLASS, + OPT_YYLINENO, + OPT_YYMORE, + OPT_YYWRAP +}; + +#endif + +/* vim:set tabstop=8 softtabstop=4 shiftwidth=4 textwidth=0: */ diff --git a/parse.c b/parse.c new file mode 100644 index 000000000000..fc128f979a15 --- /dev/null +++ b/parse.c @@ -0,0 +1,2830 @@ +/* A Bison parser, made by GNU Bison 2.1. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 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, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* 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.1" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + CHAR = 258, + NUMBER = 259, + SECTEND = 260, + SCDECL = 261, + XSCDECL = 262, + NAME = 263, + PREVCCL = 264, + EOF_OP = 265, + OPTION_OP = 266, + OPT_OUTFILE = 267, + OPT_PREFIX = 268, + OPT_YYCLASS = 269, + OPT_HEADER = 270, + OPT_EXTRA_TYPE = 271, + OPT_TABLES = 272, + CCE_ALNUM = 273, + CCE_ALPHA = 274, + CCE_BLANK = 275, + CCE_CNTRL = 276, + CCE_DIGIT = 277, + CCE_GRAPH = 278, + CCE_LOWER = 279, + CCE_PRINT = 280, + CCE_PUNCT = 281, + CCE_SPACE = 282, + CCE_UPPER = 283, + CCE_XDIGIT = 284, + CCE_NEG_ALNUM = 285, + CCE_NEG_ALPHA = 286, + CCE_NEG_BLANK = 287, + CCE_NEG_CNTRL = 288, + CCE_NEG_DIGIT = 289, + CCE_NEG_GRAPH = 290, + CCE_NEG_LOWER = 291, + CCE_NEG_PRINT = 292, + CCE_NEG_PUNCT = 293, + CCE_NEG_SPACE = 294, + CCE_NEG_UPPER = 295, + CCE_NEG_XDIGIT = 296, + CCL_OP_UNION = 297, + CCL_OP_DIFF = 298, + BEGIN_REPEAT_POSIX = 299, + END_REPEAT_POSIX = 300, + BEGIN_REPEAT_FLEX = 301, + END_REPEAT_FLEX = 302 + }; +#endif +/* Tokens. */ +#define CHAR 258 +#define NUMBER 259 +#define SECTEND 260 +#define SCDECL 261 +#define XSCDECL 262 +#define NAME 263 +#define PREVCCL 264 +#define EOF_OP 265 +#define OPTION_OP 266 +#define OPT_OUTFILE 267 +#define OPT_PREFIX 268 +#define OPT_YYCLASS 269 +#define OPT_HEADER 270 +#define OPT_EXTRA_TYPE 271 +#define OPT_TABLES 272 +#define CCE_ALNUM 273 +#define CCE_ALPHA 274 +#define CCE_BLANK 275 +#define CCE_CNTRL 276 +#define CCE_DIGIT 277 +#define CCE_GRAPH 278 +#define CCE_LOWER 279 +#define CCE_PRINT 280 +#define CCE_PUNCT 281 +#define CCE_SPACE 282 +#define CCE_UPPER 283 +#define CCE_XDIGIT 284 +#define CCE_NEG_ALNUM 285 +#define CCE_NEG_ALPHA 286 +#define CCE_NEG_BLANK 287 +#define CCE_NEG_CNTRL 288 +#define CCE_NEG_DIGIT 289 +#define CCE_NEG_GRAPH 290 +#define CCE_NEG_LOWER 291 +#define CCE_NEG_PRINT 292 +#define CCE_NEG_PUNCT 293 +#define CCE_NEG_SPACE 294 +#define CCE_NEG_UPPER 295 +#define CCE_NEG_XDIGIT 296 +#define CCL_OP_UNION 297 +#define CCL_OP_DIFF 298 +#define BEGIN_REPEAT_POSIX 299 +#define END_REPEAT_POSIX 300 +#define BEGIN_REPEAT_FLEX 301 +#define END_REPEAT_FLEX 302 + + + + +/* Copy the first part of user declarations. */ +#line 34 "parse.y" + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" +#include "tables.h" + +int pat, scnum, eps, headcnt, trailcnt, lastchar, i, rulelen; +int trlcontxt, xcluflg, currccl, cclsorted, varlength, variable_trail_rule; + +int *scon_stk; +int scon_stk_ptr; + +static int madeany = false; /* whether we've made the '.' character class */ +static int ccldot, cclany; +int previous_continued_action; /* whether the previous rule's action was '|' */ + +#define format_warn3(fmt, a1, a2) \ + do{ \ + char fw3_msg[MAXLINE];\ + snprintf( fw3_msg, MAXLINE,(fmt), (a1), (a2) );\ + warn( fw3_msg );\ + }while(0) + +/* Expand a POSIX character class expression. */ +#define CCL_EXPR(func) \ + do{ \ + int c; \ + for ( c = 0; c < csize; ++c ) \ + if ( isascii(c) && func(c) ) \ + ccladd( currccl, c ); \ + }while(0) + +/* negated class */ +#define CCL_NEG_EXPR(func) \ + do{ \ + int c; \ + for ( c = 0; c < csize; ++c ) \ + if ( !func(c) ) \ + ccladd( currccl, c ); \ + }while(0) + +/* While POSIX defines isblank(), it's not ANSI C. */ +#define IS_BLANK(c) ((c) == ' ' || (c) == '\t') + +/* On some over-ambitious machines, such as DEC Alpha's, the default + * token type is "long" instead of "int"; this leads to problems with + * declaring yylval in flexdef.h. But so far, all the yacc's I've seen + * wrap their definitions of YYSTYPE with "#ifndef YYSTYPE"'s, so the + * following should ensure that the default token type is "int". + */ +#define YYSTYPE int + + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +typedef int YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 219 of yacc.c. */ +#line 273 "parse.c" + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus)) +# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#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 + +#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 +# else +# define YYSTACK_ALLOC alloca +# if defined (__STDC__) || defined (__cplusplus) +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +# define YYINCLUDED_STDLIB_H +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (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 2005 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1) +# endif +# ifdef __cplusplus +extern "C" { +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifdef __cplusplus +} +# endif +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short int yyss; + YYSTYPE yyvs; + }; + +/* 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 (short int) + 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 (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 (0) + +#endif + +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short int yysigned_char; +#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 69 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 27 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 97 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 140 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 302 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 49, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 63, 2, 57, 2, 2, 2, + 64, 65, 55, 60, 56, 68, 62, 59, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 53, 48, 54, 61, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 66, 2, 67, 52, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 50, 58, 51, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 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 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short int yyprhs[] = +{ + 0, 0, 3, 9, 10, 14, 17, 18, 20, 22, + 24, 26, 29, 31, 33, 36, 39, 40, 44, 48, + 52, 56, 60, 64, 70, 76, 77, 78, 81, 83, + 85, 87, 88, 93, 97, 98, 102, 104, 106, 108, + 111, 115, 118, 120, 124, 126, 129, 132, 134, 141, + 147, 152, 155, 158, 161, 168, 174, 179, 181, 183, + 185, 189, 193, 195, 199, 203, 205, 209, 214, 219, + 222, 225, 226, 228, 230, 232, 234, 236, 238, 240, + 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, + 262, 264, 266, 268, 270, 272, 274, 277 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yysigned_char yyrhs[] = +{ + 70, 0, -1, 71, 72, 73, 79, 80, -1, -1, + 72, 74, 75, -1, 72, 76, -1, -1, 1, -1, + 5, -1, 6, -1, 7, -1, 75, 8, -1, 8, + -1, 1, -1, 11, 77, -1, 77, 78, -1, -1, + 12, 48, 8, -1, 16, 48, 8, -1, 13, 48, + 8, -1, 14, 48, 8, -1, 15, 48, 8, -1, + 17, 48, 8, -1, 79, 83, 80, 81, 49, -1, + 79, 83, 50, 79, 51, -1, -1, -1, 52, 86, + -1, 86, -1, 10, -1, 1, -1, -1, 53, 82, + 84, 54, -1, 53, 55, 54, -1, -1, 84, 56, + 85, -1, 85, -1, 1, -1, 8, -1, 88, 87, + -1, 88, 87, 57, -1, 87, 57, -1, 87, -1, + 87, 58, 89, -1, 89, -1, 87, 59, -1, 89, + 90, -1, 90, -1, 89, 44, 4, 56, 4, 45, + -1, 89, 44, 4, 56, 45, -1, 89, 44, 4, + 45, -1, 90, 55, -1, 90, 60, -1, 90, 61, + -1, 90, 46, 4, 56, 4, 47, -1, 90, 46, + 4, 56, 47, -1, 90, 46, 4, 47, -1, 62, + -1, 91, -1, 9, -1, 63, 95, 63, -1, 64, + 87, 65, -1, 3, -1, 91, 43, 92, -1, 91, + 42, 92, -1, 92, -1, 66, 93, 67, -1, 66, + 52, 93, 67, -1, 93, 3, 68, 3, -1, 93, + 3, -1, 93, 94, -1, -1, 18, -1, 19, -1, + 20, -1, 21, -1, 22, -1, 23, -1, 24, -1, + 25, -1, 26, -1, 27, -1, 29, -1, 28, -1, + 30, -1, 31, -1, 32, -1, 33, -1, 34, -1, + 35, -1, 37, -1, 38, -1, 39, -1, 41, -1, + 36, -1, 40, -1, 95, 3, -1, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short int yyrline[] = +{ + 0, 118, 118, 148, 155, 156, 157, 158, 162, 170, + 173, 177, 180, 183, 187, 190, 191, 194, 199, 201, + 203, 205, 207, 211, 213, 215, 219, 231, 267, 291, + 314, 319, 322, 325, 343, 346, 348, 350, 354, 377, + 433, 436, 479, 497, 503, 508, 535, 543, 546, 574, + 588, 610, 617, 623, 629, 657, 671, 690, 724, 744, + 754, 757, 760, 775, 776, 777, 782, 784, 791, 851, + 869, 877, 885, 886, 887, 888, 889, 890, 891, 896, + 897, 898, 899, 900, 906, 907, 908, 909, 910, 911, + 912, 913, 914, 915, 916, 922, 930, 946 +}; +#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", "error", "$undefined", "CHAR", "NUMBER", "SECTEND", "SCDECL", + "XSCDECL", "NAME", "PREVCCL", "EOF_OP", "OPTION_OP", "OPT_OUTFILE", + "OPT_PREFIX", "OPT_YYCLASS", "OPT_HEADER", "OPT_EXTRA_TYPE", + "OPT_TABLES", "CCE_ALNUM", "CCE_ALPHA", "CCE_BLANK", "CCE_CNTRL", + "CCE_DIGIT", "CCE_GRAPH", "CCE_LOWER", "CCE_PRINT", "CCE_PUNCT", + "CCE_SPACE", "CCE_UPPER", "CCE_XDIGIT", "CCE_NEG_ALNUM", "CCE_NEG_ALPHA", + "CCE_NEG_BLANK", "CCE_NEG_CNTRL", "CCE_NEG_DIGIT", "CCE_NEG_GRAPH", + "CCE_NEG_LOWER", "CCE_NEG_PRINT", "CCE_NEG_PUNCT", "CCE_NEG_SPACE", + "CCE_NEG_UPPER", "CCE_NEG_XDIGIT", "CCL_OP_UNION", "CCL_OP_DIFF", + "BEGIN_REPEAT_POSIX", "END_REPEAT_POSIX", "BEGIN_REPEAT_FLEX", + "END_REPEAT_FLEX", "'='", "'\\n'", "'{'", "'}'", "'^'", "'<'", "'>'", + "'*'", "','", "'$'", "'|'", "'/'", "'+'", "'?'", "'.'", "'\"'", "'('", + "')'", "'['", "']'", "'-'", "$accept", "goal", "initlex", "sect1", + "sect1end", "startconddecl", "namelist1", "options", "optionlist", + "option", "sect2", "initforrule", "flexrule", "scon_stk_ptr", "scon", + "namelist2", "sconname", "rule", "re", "re2", "series", "singleton", + "fullccl", "braceccl", "ccl", "ccl_expr", "string", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short int 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, 61, 10, + 123, 125, 94, 60, 62, 42, 44, 36, 124, 47, + 43, 63, 46, 34, 40, 41, 91, 93, 45 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 69, 70, 71, 72, 72, 72, 72, 73, 74, + 74, 75, 75, 75, 76, 77, 77, 78, 78, 78, + 78, 78, 78, 79, 79, 79, 80, 81, 81, 81, + 81, 82, 83, 83, 83, 84, 84, 84, 85, 86, + 86, 86, 86, 87, 87, 88, 89, 89, 89, 89, + 89, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 91, 91, 91, 92, 92, 93, 93, + 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 95, 95 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 5, 0, 3, 2, 0, 1, 1, 1, + 1, 2, 1, 1, 2, 2, 0, 3, 3, 3, + 3, 3, 3, 5, 5, 0, 0, 2, 1, 1, + 1, 0, 4, 3, 0, 3, 1, 1, 1, 2, + 3, 2, 1, 3, 1, 2, 2, 1, 6, 5, + 4, 2, 2, 2, 6, 5, 4, 1, 1, 1, + 3, 3, 1, 3, 3, 1, 3, 4, 4, 2, + 2, 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, 2, 0 +}; + +/* 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 unsigned char yydefact[] = +{ + 3, 0, 0, 1, 7, 0, 8, 9, 10, 16, + 25, 0, 5, 14, 34, 13, 12, 4, 0, 0, + 0, 0, 0, 0, 15, 31, 2, 26, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 25, 0, 17, + 19, 20, 21, 18, 22, 33, 37, 38, 0, 36, + 34, 30, 62, 59, 29, 0, 57, 97, 0, 71, + 0, 28, 42, 0, 44, 47, 58, 65, 32, 0, + 24, 27, 0, 0, 71, 0, 23, 41, 0, 45, + 39, 0, 46, 0, 51, 52, 53, 0, 0, 35, + 96, 60, 61, 0, 69, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 83, 82, 84, 85, 86, + 87, 88, 89, 94, 90, 91, 92, 95, 93, 66, + 70, 43, 40, 0, 0, 64, 63, 67, 0, 50, + 0, 56, 0, 68, 0, 49, 0, 55, 48, 54 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yysigned_char yydefgoto[] = +{ + -1, 1, 2, 5, 10, 11, 17, 12, 13, 24, + 14, 26, 60, 36, 27, 48, 49, 61, 62, 63, + 64, 65, 66, 67, 75, 120, 72 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -52 +static const short int yypact[] = +{ + -52, 17, 103, -52, -52, 113, -52, -52, -52, -52, + -52, 48, -52, 114, 6, -52, -52, 42, 7, 12, + 58, 77, 88, 89, -52, 43, -52, 73, -52, 130, + 131, 132, 133, 134, 135, 90, 91, -52, -1, -52, + -52, -52, -52, -52, -52, -52, -52, -52, 40, -52, + 44, -52, -52, -52, -52, 39, -52, -52, 39, 93, + 97, -52, -12, 39, 49, 61, -31, -52, -52, 139, + -52, -52, 1, -51, -52, 0, -52, -52, 39, -52, + 75, 144, 61, 145, -52, -52, -52, 84, 84, -52, + -52, -52, -52, 50, 83, -52, -52, -52, -52, -52, + -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, + -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, + -52, 49, -52, -40, 10, -52, -52, -52, 149, -52, + 9, -52, -3, -52, 108, -52, 107, -52, -52, -52 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const short int yypgoto[] = +{ + -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, + 118, 129, -52, -52, -52, -52, 92, 102, -48, -52, + 80, -21, -52, 47, 85, -52, -52 +}; + +/* 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 -27 +static const short int yytable[] = +{ + 51, 136, 52, 94, 90, 129, -26, 78, 53, 54, + 73, 87, 88, 134, 92, 80, 130, 3, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 52, 82, 137, 77, 78, 79, 53, 15, + 28, 55, 52, 94, 135, 29, 16, 131, 53, 25, + 30, 56, 57, 58, 91, 59, 132, 119, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 46, 81, 68, 70, 69, 25, 35, 47, + 82, 56, 57, 58, 4, 59, 31, 83, -6, -6, + -6, 56, 57, 58, -6, 59, 84, 127, 6, 7, + 8, 85, 86, 37, 9, 32, 18, 19, 20, 21, + 22, 23, 122, 78, 125, 126, 33, 34, 39, 40, + 41, 42, 43, 44, 45, 74, 76, 47, 123, 124, + 59, 128, 133, 138, 139, 50, 38, 71, 121, 93, + 0, 89 +}; + +static const yysigned_char yycheck[] = +{ + 1, 4, 3, 3, 3, 45, 0, 58, 9, 10, + 58, 42, 43, 4, 65, 63, 56, 0, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 3, 64, 47, 57, 58, 59, 9, 1, + 8, 52, 3, 3, 45, 48, 8, 47, 9, 53, + 48, 62, 63, 64, 63, 66, 56, 67, 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, 44, 54, 51, 56, 53, 55, 8, + 121, 62, 63, 64, 1, 66, 48, 46, 5, 6, + 7, 62, 63, 64, 11, 66, 55, 67, 5, 6, + 7, 60, 61, 50, 11, 48, 12, 13, 14, 15, + 16, 17, 57, 58, 87, 88, 48, 48, 8, 8, + 8, 8, 8, 8, 54, 52, 49, 8, 4, 4, + 66, 68, 3, 45, 47, 37, 27, 55, 78, 74, + -1, 69 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 70, 71, 0, 1, 72, 5, 6, 7, 11, + 73, 74, 76, 77, 79, 1, 8, 75, 12, 13, + 14, 15, 16, 17, 78, 53, 80, 83, 8, 48, + 48, 48, 48, 48, 48, 55, 82, 50, 80, 8, + 8, 8, 8, 8, 8, 54, 1, 8, 84, 85, + 79, 1, 3, 9, 10, 52, 62, 63, 64, 66, + 81, 86, 87, 88, 89, 90, 91, 92, 54, 56, + 51, 86, 95, 87, 52, 93, 49, 57, 58, 59, + 87, 44, 90, 46, 55, 60, 61, 42, 43, 85, + 3, 63, 65, 93, 3, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 67, + 94, 89, 57, 4, 4, 92, 92, 67, 68, 45, + 56, 47, 56, 3, 4, 45, 4, 47, 45, 47 +}; + +#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; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (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 (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) +#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 (YYLEX_PARAM) +#else +# define YYLEX yylex () +#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 (0) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short int *bottom, short int *top) +#else +static void +yy_stack_print (bottom, top) + short int *bottom; + short int *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; 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 (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; +#endif +{ + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]); +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (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. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# 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. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +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 == '"') + { + 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 yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +#endif /* YYERROR_VERBOSE */ + + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} + +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + 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 */ + + + +/* The look-ahead symbol. */ +int yychar; + +/* The semantic value of the look-ahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) +#else +int +yyparse () + ; +#endif +#endif +{ + + 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; + + /* 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. */ + short int yyssa[YYINITDEPTH]; + short int *yyss = yyssa; + short int *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp; + + + +#define YYPOPSTACK (yyvsp--, yyssp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + 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; + + 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; + short int *yyss1 = yyss; + + + /* 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), + + &yystacksize); + + 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; + + { + short int *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + 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. */ +/* yyresume: */ + + /* 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; + + /* 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; + + *++yyvsp = yylval; + + + /* 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: + /* 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]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: +#line 119 "parse.y" + { /* add default rule */ + int def_rule; + + pat = cclinit(); + cclnegate( pat ); + + def_rule = mkstate( -pat ); + + /* Remember the number of the default rule so we + * don't generate "can't match" warnings for it. + */ + default_rule = num_rules; + + finish_rule( def_rule, false, 0, 0, 0); + + for ( i = 1; i <= lastsc; ++i ) + scset[i] = mkbranch( scset[i], def_rule ); + + if ( spprdflt ) + add_action( + "YY_FATAL_ERROR( \"flex scanner jammed\" )" ); + else + add_action( "ECHO" ); + + add_action( ";\n\tYY_BREAK\n" ); + } + break; + + case 3: +#line 148 "parse.y" + { /* initialize for processing rules */ + + /* Create default DFA start condition. */ + scinstal( "INITIAL", false ); + } + break; + + case 7: +#line 159 "parse.y" + { synerr( _("unknown error processing section 1") ); } + break; + + case 8: +#line 163 "parse.y" + { + check_options(); + scon_stk = allocate_integer_array( lastsc + 1 ); + scon_stk_ptr = 0; + } + break; + + case 9: +#line 171 "parse.y" + { xcluflg = false; } + break; + + case 10: +#line 174 "parse.y" + { xcluflg = true; } + break; + + case 11: +#line 178 "parse.y" + { scinstal( nmstr, xcluflg ); } + break; + + case 12: +#line 181 "parse.y" + { scinstal( nmstr, xcluflg ); } + break; + + case 13: +#line 184 "parse.y" + { synerr( _("bad start condition list") ); } + break; + + case 17: +#line 195 "parse.y" + { + outfilename = copy_string( nmstr ); + did_outfilename = 1; + } + break; + + case 18: +#line 200 "parse.y" + { extra_type = copy_string( nmstr ); } + break; + + case 19: +#line 202 "parse.y" + { prefix = copy_string( nmstr ); } + break; + + case 20: +#line 204 "parse.y" + { yyclass = copy_string( nmstr ); } + break; + + case 21: +#line 206 "parse.y" + { headerfilename = copy_string( nmstr ); } + break; + + case 22: +#line 208 "parse.y" + { tablesext = true; tablesfilename = copy_string( nmstr ); } + break; + + case 23: +#line 212 "parse.y" + { scon_stk_ptr = (yyvsp[-3]); } + break; + + case 24: +#line 214 "parse.y" + { scon_stk_ptr = (yyvsp[-3]); } + break; + + case 26: +#line 219 "parse.y" + { + /* Initialize for a parse of one rule. */ + trlcontxt = variable_trail_rule = varlength = false; + trailcnt = headcnt = rulelen = 0; + current_state_type = STATE_NORMAL; + previous_continued_action = continued_action; + in_rule = true; + + new_rule(); + } + break; + + case 27: +#line 232 "parse.y" + { + pat = (yyvsp[0]); + finish_rule( pat, variable_trail_rule, + headcnt, trailcnt , previous_continued_action); + + if ( scon_stk_ptr > 0 ) + { + for ( i = 1; i <= scon_stk_ptr; ++i ) + scbol[scon_stk[i]] = + mkbranch( scbol[scon_stk[i]], + pat ); + } + + else + { + /* Add to all non-exclusive start conditions, + * including the default (0) start condition. + */ + + for ( i = 1; i <= lastsc; ++i ) + if ( ! scxclu[i] ) + scbol[i] = mkbranch( scbol[i], + pat ); + } + + if ( ! bol_needed ) + { + bol_needed = true; + + if ( performance_report > 1 ) + pinpoint_message( + "'^' operator results in sub-optimal performance" ); + } + } + break; + + case 28: +#line 268 "parse.y" + { + pat = (yyvsp[0]); + finish_rule( pat, variable_trail_rule, + headcnt, trailcnt , previous_continued_action); + + if ( scon_stk_ptr > 0 ) + { + for ( i = 1; i <= scon_stk_ptr; ++i ) + scset[scon_stk[i]] = + mkbranch( scset[scon_stk[i]], + pat ); + } + + else + { + for ( i = 1; i <= lastsc; ++i ) + if ( ! scxclu[i] ) + scset[i] = + mkbranch( scset[i], + pat ); + } + } + break; + + case 29: +#line 292 "parse.y" + { + if ( scon_stk_ptr > 0 ) + build_eof_action(); + + else + { + /* This EOF applies to all start conditions + * which don't already have EOF actions. + */ + for ( i = 1; i <= lastsc; ++i ) + if ( ! sceof[i] ) + scon_stk[++scon_stk_ptr] = i; + + if ( scon_stk_ptr == 0 ) + warn( + "all start conditions already have <<EOF>> rules" ); + + else + build_eof_action(); + } + } + break; + + case 30: +#line 315 "parse.y" + { synerr( _("unrecognized rule") ); } + break; + + case 31: +#line 319 "parse.y" + { (yyval) = scon_stk_ptr; } + break; + + case 32: +#line 323 "parse.y" + { (yyval) = (yyvsp[-2]); } + break; + + case 33: +#line 326 "parse.y" + { + (yyval) = scon_stk_ptr; + + for ( i = 1; i <= lastsc; ++i ) + { + int j; + + for ( j = 1; j <= scon_stk_ptr; ++j ) + if ( scon_stk[j] == i ) + break; + + if ( j > scon_stk_ptr ) + scon_stk[++scon_stk_ptr] = i; + } + } + break; + + case 34: +#line 343 "parse.y" + { (yyval) = scon_stk_ptr; } + break; + + case 37: +#line 351 "parse.y" + { synerr( _("bad start condition list") ); } + break; + + case 38: +#line 355 "parse.y" + { + if ( (scnum = sclookup( nmstr )) == 0 ) + format_pinpoint_message( + "undeclared start condition %s", + nmstr ); + else + { + for ( i = 1; i <= scon_stk_ptr; ++i ) + if ( scon_stk[i] == scnum ) + { + format_warn( + "<%s> specified twice", + scname[scnum] ); + break; + } + + if ( i > scon_stk_ptr ) + scon_stk[++scon_stk_ptr] = scnum; + } + } + break; + + case 39: +#line 378 "parse.y" + { + if ( transchar[lastst[(yyvsp[0])]] != SYM_EPSILON ) + /* Provide final transition \now/ so it + * will be marked as a trailing context + * state. + */ + (yyvsp[0]) = link_machines( (yyvsp[0]), + mkstate( SYM_EPSILON ) ); + + mark_beginning_as_normal( (yyvsp[0]) ); + current_state_type = STATE_NORMAL; + + if ( previous_continued_action ) + { + /* We need to treat this as variable trailing + * context so that the backup does not happen + * in the action but before the action switch + * statement. If the backup happens in the + * action, then the rules "falling into" this + * one's action will *also* do the backup, + * erroneously. + */ + if ( ! varlength || headcnt != 0 ) + warn( + "trailing context made variable due to preceding '|' action" ); + + /* Mark as variable. */ + varlength = true; + headcnt = 0; + + } + + if ( lex_compat || (varlength && headcnt == 0) ) + { /* variable trailing context rule */ + /* Mark the first part of the rule as the + * accepting "head" part of a trailing + * context rule. + * + * By the way, we didn't do this at the + * beginning of this production because back + * then current_state_type was set up for a + * trail rule, and add_accept() can create + * a new state ... + */ + add_accept( (yyvsp[-1]), + num_rules | YY_TRAILING_HEAD_MASK ); + variable_trail_rule = true; + } + + else + trailcnt = rulelen; + + (yyval) = link_machines( (yyvsp[-1]), (yyvsp[0]) ); + } + break; + + case 40: +#line 434 "parse.y" + { synerr( _("trailing context used twice") ); } + break; + + case 41: +#line 437 "parse.y" + { + headcnt = 0; + trailcnt = 1; + rulelen = 1; + varlength = false; + + current_state_type = STATE_TRAILING_CONTEXT; + + if ( trlcontxt ) + { + synerr( _("trailing context used twice") ); + (yyval) = mkstate( SYM_EPSILON ); + } + + else if ( previous_continued_action ) + { + /* See the comment in the rule for "re2 re" + * above. + */ + warn( + "trailing context made variable due to preceding '|' action" ); + + varlength = true; + } + + if ( lex_compat || varlength ) + { + /* Again, see the comment in the rule for + * "re2 re" above. + */ + add_accept( (yyvsp[-1]), + num_rules | YY_TRAILING_HEAD_MASK ); + variable_trail_rule = true; + } + + trlcontxt = true; + + eps = mkstate( SYM_EPSILON ); + (yyval) = link_machines( (yyvsp[-1]), + link_machines( eps, mkstate( '\n' ) ) ); + } + break; + + case 42: +#line 480 "parse.y" + { + (yyval) = (yyvsp[0]); + + if ( trlcontxt ) + { + if ( lex_compat || (varlength && headcnt == 0) ) + /* Both head and trail are + * variable-length. + */ + variable_trail_rule = true; + else + trailcnt = rulelen; + } + } + break; + + case 43: +#line 498 "parse.y" + { + varlength = true; + (yyval) = mkor( (yyvsp[-2]), (yyvsp[0]) ); + } + break; + + case 44: +#line 504 "parse.y" + { (yyval) = (yyvsp[0]); } + break; + + case 45: +#line 509 "parse.y" + { + /* This rule is written separately so the + * reduction will occur before the trailing + * series is parsed. + */ + + if ( trlcontxt ) + synerr( _("trailing context used twice") ); + else + trlcontxt = true; + + if ( varlength ) + /* We hope the trailing context is + * fixed-length. + */ + varlength = false; + else + headcnt = rulelen; + + rulelen = 0; + + current_state_type = STATE_TRAILING_CONTEXT; + (yyval) = (yyvsp[-1]); + } + break; + + case 46: +#line 536 "parse.y" + { + /* This is where concatenation of adjacent patterns + * gets done. + */ + (yyval) = link_machines( (yyvsp[-1]), (yyvsp[0]) ); + } + break; + + case 47: +#line 544 "parse.y" + { (yyval) = (yyvsp[0]); } + break; + + case 48: +#line 547 "parse.y" + { + varlength = true; + + if ( (yyvsp[-3]) > (yyvsp[-1]) || (yyvsp[-3]) < 0 ) + { + synerr( _("bad iteration values") ); + (yyval) = (yyvsp[-5]); + } + else + { + if ( (yyvsp[-3]) == 0 ) + { + if ( (yyvsp[-1]) <= 0 ) + { + synerr( + _("bad iteration values") ); + (yyval) = (yyvsp[-5]); + } + else + (yyval) = mkopt( + mkrep( (yyvsp[-5]), 1, (yyvsp[-1]) ) ); + } + else + (yyval) = mkrep( (yyvsp[-5]), (yyvsp[-3]), (yyvsp[-1]) ); + } + } + break; + + case 49: +#line 575 "parse.y" + { + varlength = true; + + if ( (yyvsp[-2]) <= 0 ) + { + synerr( _("iteration value must be positive") ); + (yyval) = (yyvsp[-4]); + } + + else + (yyval) = mkrep( (yyvsp[-4]), (yyvsp[-2]), INFINITE_REPEAT ); + } + break; + + case 50: +#line 589 "parse.y" + { + /* The series could be something like "(foo)", + * in which case we have no idea what its length + * is, so we punt here. + */ + varlength = true; + + if ( (yyvsp[-1]) <= 0 ) + { + synerr( _("iteration value must be positive") + ); + (yyval) = (yyvsp[-3]); + } + + else + (yyval) = link_machines( (yyvsp[-3]), + copysingl( (yyvsp[-3]), (yyvsp[-1]) - 1 ) ); + } + break; + + case 51: +#line 611 "parse.y" + { + varlength = true; + + (yyval) = mkclos( (yyvsp[-1]) ); + } + break; + + case 52: +#line 618 "parse.y" + { + varlength = true; + (yyval) = mkposcl( (yyvsp[-1]) ); + } + break; + + case 53: +#line 624 "parse.y" + { + varlength = true; + (yyval) = mkopt( (yyvsp[-1]) ); + } + break; + + case 54: +#line 630 "parse.y" + { + varlength = true; + + if ( (yyvsp[-3]) > (yyvsp[-1]) || (yyvsp[-3]) < 0 ) + { + synerr( _("bad iteration values") ); + (yyval) = (yyvsp[-5]); + } + else + { + if ( (yyvsp[-3]) == 0 ) + { + if ( (yyvsp[-1]) <= 0 ) + { + synerr( + _("bad iteration values") ); + (yyval) = (yyvsp[-5]); + } + else + (yyval) = mkopt( + mkrep( (yyvsp[-5]), 1, (yyvsp[-1]) ) ); + } + else + (yyval) = mkrep( (yyvsp[-5]), (yyvsp[-3]), (yyvsp[-1]) ); + } + } + break; + + case 55: +#line 658 "parse.y" + { + varlength = true; + + if ( (yyvsp[-2]) <= 0 ) + { + synerr( _("iteration value must be positive") ); + (yyval) = (yyvsp[-4]); + } + + else + (yyval) = mkrep( (yyvsp[-4]), (yyvsp[-2]), INFINITE_REPEAT ); + } + break; + + case 56: +#line 672 "parse.y" + { + /* The singleton could be something like "(foo)", + * in which case we have no idea what its length + * is, so we punt here. + */ + varlength = true; + + if ( (yyvsp[-1]) <= 0 ) + { + synerr( _("iteration value must be positive") ); + (yyval) = (yyvsp[-3]); + } + + else + (yyval) = link_machines( (yyvsp[-3]), + copysingl( (yyvsp[-3]), (yyvsp[-1]) - 1 ) ); + } + break; + + case 57: +#line 691 "parse.y" + { + if ( ! madeany ) + { + /* Create the '.' character class. */ + ccldot = cclinit(); + ccladd( ccldot, '\n' ); + cclnegate( ccldot ); + + if ( useecs ) + mkeccl( ccltbl + cclmap[ccldot], + ccllen[ccldot], nextecm, + ecgroup, csize, csize ); + + /* Create the (?s:'.') character class. */ + cclany = cclinit(); + cclnegate( cclany ); + + if ( useecs ) + mkeccl( ccltbl + cclmap[cclany], + ccllen[cclany], nextecm, + ecgroup, csize, csize ); + + madeany = true; + } + + ++rulelen; + + if (sf_dot_all()) + (yyval) = mkstate( -cclany ); + else + (yyval) = mkstate( -ccldot ); + } + break; + + case 58: +#line 725 "parse.y" + { + /* Sort characters for fast searching. We + * use a shell sort since this list could + * be large. + */ + cshell( ccltbl + cclmap[(yyvsp[0])], ccllen[(yyvsp[0])], true ); + + if ( useecs ) + mkeccl( ccltbl + cclmap[(yyvsp[0])], ccllen[(yyvsp[0])], + nextecm, ecgroup, csize, csize ); + + ++rulelen; + + if (ccl_has_nl[(yyvsp[0])]) + rule_has_nl[num_rules] = true; + + (yyval) = mkstate( -(yyvsp[0]) ); + } + break; + + case 59: +#line 745 "parse.y" + { + ++rulelen; + + if (ccl_has_nl[(yyvsp[0])]) + rule_has_nl[num_rules] = true; + + (yyval) = mkstate( -(yyvsp[0]) ); + } + break; + + case 60: +#line 755 "parse.y" + { (yyval) = (yyvsp[-1]); } + break; + + case 61: +#line 758 "parse.y" + { (yyval) = (yyvsp[-1]); } + break; + + case 62: +#line 761 "parse.y" + { + ++rulelen; + + if ((yyvsp[0]) == nlch) + rule_has_nl[num_rules] = true; + + if (sf_case_ins() && has_case((yyvsp[0]))) + /* create an alternation, as in (a|A) */ + (yyval) = mkor (mkstate((yyvsp[0])), mkstate(reverse_case((yyvsp[0])))); + else + (yyval) = mkstate( (yyvsp[0]) ); + } + break; + + case 63: +#line 775 "parse.y" + { (yyval) = ccl_set_diff ((yyvsp[-2]), (yyvsp[0])); } + break; + + case 64: +#line 776 "parse.y" + { (yyval) = ccl_set_union ((yyvsp[-2]), (yyvsp[0])); } + break; + + case 66: +#line 782 "parse.y" + { (yyval) = (yyvsp[-1]); } + break; + + case 67: +#line 785 "parse.y" + { + cclnegate( (yyvsp[-1]) ); + (yyval) = (yyvsp[-1]); + } + break; + + case 68: +#line 792 "parse.y" + { + + if (sf_case_ins()) + { + + /* If one end of the range has case and the other + * does not, or the cases are different, then we're not + * sure what range the user is trying to express. + * Examples: [@-z] or [S-t] + */ + if (has_case ((yyvsp[-2])) != has_case ((yyvsp[0])) + || (has_case ((yyvsp[-2])) && (b_islower ((yyvsp[-2])) != b_islower ((yyvsp[0])))) + || (has_case ((yyvsp[-2])) && (b_isupper ((yyvsp[-2])) != b_isupper ((yyvsp[0]))))) + format_warn3 ( + _("the character range [%c-%c] is ambiguous in a case-insensitive scanner"), + (yyvsp[-2]), (yyvsp[0])); + + /* If the range spans uppercase characters but not + * lowercase (or vice-versa), then should we automatically + * include lowercase characters in the range? + * Example: [@-_] spans [a-z] but not [A-Z] + */ + else if (!has_case ((yyvsp[-2])) && !has_case ((yyvsp[0])) && !range_covers_case ((yyvsp[-2]), (yyvsp[0]))) + format_warn3 ( + _("the character range [%c-%c] is ambiguous in a case-insensitive scanner"), + (yyvsp[-2]), (yyvsp[0])); + } + + if ( (yyvsp[-2]) > (yyvsp[0]) ) + synerr( _("negative range in character class") ); + + else + { + for ( i = (yyvsp[-2]); i <= (yyvsp[0]); ++i ) + ccladd( (yyvsp[-3]), i ); + + /* Keep track if this ccl is staying in + * alphabetical order. + */ + cclsorted = cclsorted && ((yyvsp[-2]) > lastchar); + lastchar = (yyvsp[0]); + + /* Do it again for upper/lowercase */ + if (sf_case_ins() && has_case((yyvsp[-2])) && has_case((yyvsp[0]))){ + (yyvsp[-2]) = reverse_case ((yyvsp[-2])); + (yyvsp[0]) = reverse_case ((yyvsp[0])); + + for ( i = (yyvsp[-2]); i <= (yyvsp[0]); ++i ) + ccladd( (yyvsp[-3]), i ); + + cclsorted = cclsorted && ((yyvsp[-2]) > lastchar); + lastchar = (yyvsp[0]); + } + + } + + (yyval) = (yyvsp[-3]); + } + break; + + case 69: +#line 852 "parse.y" + { + ccladd( (yyvsp[-1]), (yyvsp[0]) ); + cclsorted = cclsorted && ((yyvsp[0]) > lastchar); + lastchar = (yyvsp[0]); + + /* Do it again for upper/lowercase */ + if (sf_case_ins() && has_case((yyvsp[0]))){ + (yyvsp[0]) = reverse_case ((yyvsp[0])); + ccladd ((yyvsp[-1]), (yyvsp[0])); + + cclsorted = cclsorted && ((yyvsp[0]) > lastchar); + lastchar = (yyvsp[0]); + } + + (yyval) = (yyvsp[-1]); + } + break; + + case 70: +#line 870 "parse.y" + { + /* Too hard to properly maintain cclsorted. */ + cclsorted = false; + (yyval) = (yyvsp[-1]); + } + break; + + case 71: +#line 877 "parse.y" + { + cclsorted = true; + lastchar = 0; + currccl = (yyval) = cclinit(); + } + break; + + case 72: +#line 885 "parse.y" + { CCL_EXPR(isalnum); } + break; + + case 73: +#line 886 "parse.y" + { CCL_EXPR(isalpha); } + break; + + case 74: +#line 887 "parse.y" + { CCL_EXPR(IS_BLANK); } + break; + + case 75: +#line 888 "parse.y" + { CCL_EXPR(iscntrl); } + break; + + case 76: +#line 889 "parse.y" + { CCL_EXPR(isdigit); } + break; + + case 77: +#line 890 "parse.y" + { CCL_EXPR(isgraph); } + break; + + case 78: +#line 891 "parse.y" + { + CCL_EXPR(islower); + if (sf_case_ins()) + CCL_EXPR(isupper); + } + break; + + case 79: +#line 896 "parse.y" + { CCL_EXPR(isprint); } + break; + + case 80: +#line 897 "parse.y" + { CCL_EXPR(ispunct); } + break; + + case 81: +#line 898 "parse.y" + { CCL_EXPR(isspace); } + break; + + case 82: +#line 899 "parse.y" + { CCL_EXPR(isxdigit); } + break; + + case 83: +#line 900 "parse.y" + { + CCL_EXPR(isupper); + if (sf_case_ins()) + CCL_EXPR(islower); + } + break; + + case 84: +#line 906 "parse.y" + { CCL_NEG_EXPR(isalnum); } + break; + + case 85: +#line 907 "parse.y" + { CCL_NEG_EXPR(isalpha); } + break; + + case 86: +#line 908 "parse.y" + { CCL_NEG_EXPR(IS_BLANK); } + break; + + case 87: +#line 909 "parse.y" + { CCL_NEG_EXPR(iscntrl); } + break; + + case 88: +#line 910 "parse.y" + { CCL_NEG_EXPR(isdigit); } + break; + + case 89: +#line 911 "parse.y" + { CCL_NEG_EXPR(isgraph); } + break; + + case 90: +#line 912 "parse.y" + { CCL_NEG_EXPR(isprint); } + break; + + case 91: +#line 913 "parse.y" + { CCL_NEG_EXPR(ispunct); } + break; + + case 92: +#line 914 "parse.y" + { CCL_NEG_EXPR(isspace); } + break; + + case 93: +#line 915 "parse.y" + { CCL_NEG_EXPR(isxdigit); } + break; + + case 94: +#line 916 "parse.y" + { + if ( sf_case_ins() ) + warn(_("[:^lower:] is ambiguous in case insensitive scanner")); + else + CCL_NEG_EXPR(islower); + } + break; + + case 95: +#line 922 "parse.y" + { + if ( sf_case_ins() ) + warn(_("[:^upper:] ambiguous in case insensitive scanner")); + else + CCL_NEG_EXPR(isupper); + } + break; + + case 96: +#line 931 "parse.y" + { + if ( (yyvsp[0]) == nlch ) + rule_has_nl[num_rules] = true; + + ++rulelen; + + if (sf_case_ins() && has_case((yyvsp[0]))) + (yyval) = mkor (mkstate((yyvsp[0])), mkstate(reverse_case((yyvsp[0])))); + else + (yyval) = mkstate ((yyvsp[0])); + + (yyval) = link_machines( (yyvsp[-1]), (yyval)); + } + break; + + case 97: +#line 946 "parse.y" + { (yyval) = mkstate( SYM_EPSILON ); } + break; + + + default: break; + } + +/* Line 1126 of yacc.c. */ +#line 2423 "parse.c" + + yyvsp -= yylen; + yyssp -= yylen; + + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* 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 + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + char *yymsg = 0; +# define 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; + 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 && yysize <= YYSTACK_ALLOC_MAXIMUM) + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg) + { + /* 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 = 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 (yymsg); + YYSTACK_FREE (yymsg); + } + else + { + yyerror (YY_("syntax error")); + goto yyexhaustedlab; + } + } + else +#endif /* YYERROR_VERBOSE */ + yyerror (YY_("syntax error")); + } + + + + 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); + 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 (0) + goto yyerrorlab; + +yyvsp -= yylen; + yyssp -= yylen; + 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; + + + yydestruct ("Error: popping", yystos[yystate], yyvsp); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + *++yyvsp = yylval; + + + /* 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); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK; + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +} + + +#line 949 "parse.y" + + + +/* build_eof_action - build the "<<EOF>>" action for the active start + * conditions + */ + +void build_eof_action() + { + register int i; + char action_text[MAXLINE]; + + for ( i = 1; i <= scon_stk_ptr; ++i ) + { + if ( sceof[scon_stk[i]] ) + format_pinpoint_message( + "multiple <<EOF>> rules for start condition %s", + scname[scon_stk[i]] ); + + else + { + sceof[scon_stk[i]] = true; + snprintf( action_text, sizeof(action_text), "case YY_STATE_EOF(%s):\n", + scname[scon_stk[i]] ); + add_action( action_text ); + } + } + + line_directive_out( (FILE *) 0, 1 ); + + /* This isn't a normal rule after all - don't count it as + * such, so we don't have any holes in the rule numbering + * (which make generating "rule can never match" warnings + * more difficult. + */ + --num_rules; + ++num_eof_rules; + } + + +/* format_synerr - write out formatted syntax error */ + +void format_synerr( msg, arg ) +const char *msg, arg[]; + { + char errmsg[MAXLINE]; + + (void) snprintf( errmsg, sizeof(errmsg), msg, arg ); + synerr( errmsg ); + } + + +/* synerr - report a syntax error */ + +void synerr( str ) +const char *str; + { + syntaxerror = true; + pinpoint_message( str ); + } + + +/* format_warn - write out formatted warning */ + +void format_warn( msg, arg ) +const char *msg, arg[]; + { + char warn_msg[MAXLINE]; + + snprintf( warn_msg, sizeof(warn_msg), msg, arg ); + warn( warn_msg ); + } + + +/* warn - report a warning, unless -w was given */ + +void warn( str ) +const char *str; + { + line_warning( str, linenum ); + } + +/* format_pinpoint_message - write out a message formatted with one string, + * pinpointing its location + */ + +void format_pinpoint_message( msg, arg ) +const char *msg, arg[]; + { + char errmsg[MAXLINE]; + + snprintf( errmsg, sizeof(errmsg), msg, arg ); + pinpoint_message( errmsg ); + } + + +/* pinpoint_message - write out a message, pinpointing its location */ + +void pinpoint_message( str ) +const char *str; + { + line_pinpoint( str, linenum ); + } + + +/* line_warning - report a warning at a given line, unless -w was given */ + +void line_warning( str, line ) +const char *str; +int line; + { + char warning[MAXLINE]; + + if ( ! nowarn ) + { + snprintf( warning, sizeof(warning), "warning, %s", str ); + line_pinpoint( warning, line ); + } + } + + +/* line_pinpoint - write out a message, pinpointing it at the given line */ + +void line_pinpoint( str, line ) +const char *str; +int line; + { + fprintf( stderr, "%s:%d: %s\n", infilename, line, str ); + } + + +/* yyerror - eat up an error message from the parser; + * currently, messages are ignore + */ + +void yyerror( msg ) +const char *msg; + { + } + diff --git a/parse.h b/parse.h new file mode 100644 index 000000000000..393c0ebc013e --- /dev/null +++ b/parse.h @@ -0,0 +1,139 @@ +/* A Bison parser, made by GNU Bison 2.1. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 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, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 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 { + CHAR = 258, + NUMBER = 259, + SECTEND = 260, + SCDECL = 261, + XSCDECL = 262, + NAME = 263, + PREVCCL = 264, + EOF_OP = 265, + OPTION_OP = 266, + OPT_OUTFILE = 267, + OPT_PREFIX = 268, + OPT_YYCLASS = 269, + OPT_HEADER = 270, + OPT_EXTRA_TYPE = 271, + OPT_TABLES = 272, + CCE_ALNUM = 273, + CCE_ALPHA = 274, + CCE_BLANK = 275, + CCE_CNTRL = 276, + CCE_DIGIT = 277, + CCE_GRAPH = 278, + CCE_LOWER = 279, + CCE_PRINT = 280, + CCE_PUNCT = 281, + CCE_SPACE = 282, + CCE_UPPER = 283, + CCE_XDIGIT = 284, + CCE_NEG_ALNUM = 285, + CCE_NEG_ALPHA = 286, + CCE_NEG_BLANK = 287, + CCE_NEG_CNTRL = 288, + CCE_NEG_DIGIT = 289, + CCE_NEG_GRAPH = 290, + CCE_NEG_LOWER = 291, + CCE_NEG_PRINT = 292, + CCE_NEG_PUNCT = 293, + CCE_NEG_SPACE = 294, + CCE_NEG_UPPER = 295, + CCE_NEG_XDIGIT = 296, + CCL_OP_UNION = 297, + CCL_OP_DIFF = 298, + BEGIN_REPEAT_POSIX = 299, + END_REPEAT_POSIX = 300, + BEGIN_REPEAT_FLEX = 301, + END_REPEAT_FLEX = 302 + }; +#endif +/* Tokens. */ +#define CHAR 258 +#define NUMBER 259 +#define SECTEND 260 +#define SCDECL 261 +#define XSCDECL 262 +#define NAME 263 +#define PREVCCL 264 +#define EOF_OP 265 +#define OPTION_OP 266 +#define OPT_OUTFILE 267 +#define OPT_PREFIX 268 +#define OPT_YYCLASS 269 +#define OPT_HEADER 270 +#define OPT_EXTRA_TYPE 271 +#define OPT_TABLES 272 +#define CCE_ALNUM 273 +#define CCE_ALPHA 274 +#define CCE_BLANK 275 +#define CCE_CNTRL 276 +#define CCE_DIGIT 277 +#define CCE_GRAPH 278 +#define CCE_LOWER 279 +#define CCE_PRINT 280 +#define CCE_PUNCT 281 +#define CCE_SPACE 282 +#define CCE_UPPER 283 +#define CCE_XDIGIT 284 +#define CCE_NEG_ALNUM 285 +#define CCE_NEG_ALPHA 286 +#define CCE_NEG_BLANK 287 +#define CCE_NEG_CNTRL 288 +#define CCE_NEG_DIGIT 289 +#define CCE_NEG_GRAPH 290 +#define CCE_NEG_LOWER 291 +#define CCE_NEG_PRINT 292 +#define CCE_NEG_PUNCT 293 +#define CCE_NEG_SPACE 294 +#define CCE_NEG_UPPER 295 +#define CCE_NEG_XDIGIT 296 +#define CCL_OP_UNION 297 +#define CCL_OP_DIFF 298 +#define BEGIN_REPEAT_POSIX 299 +#define END_REPEAT_POSIX 300 +#define BEGIN_REPEAT_FLEX 301 +#define END_REPEAT_FLEX 302 + + + + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +typedef int YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +extern YYSTYPE yylval; + + + diff --git a/usr.bin/lex/parse.y b/parse.y index 8dbd12581eee..871ff7e6b6db 100644 --- a/usr.bin/lex/parse.y +++ b/parse.y @@ -1,99 +1,105 @@ /* parse.y - parser for flex input */ %token CHAR NUMBER SECTEND SCDECL XSCDECL NAME PREVCCL EOF_OP -%token OPTION_OP OPT_OUTFILE OPT_PREFIX OPT_YYCLASS +%token OPTION_OP OPT_OUTFILE OPT_PREFIX OPT_YYCLASS OPT_HEADER OPT_EXTRA_TYPE +%token OPT_TABLES %token CCE_ALNUM CCE_ALPHA CCE_BLANK CCE_CNTRL CCE_DIGIT CCE_GRAPH %token CCE_LOWER CCE_PRINT CCE_PUNCT CCE_SPACE CCE_UPPER CCE_XDIGIT -%{ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. +%token CCE_NEG_ALNUM CCE_NEG_ALPHA CCE_NEG_BLANK CCE_NEG_CNTRL CCE_NEG_DIGIT CCE_NEG_GRAPH +%token CCE_NEG_LOWER CCE_NEG_PRINT CCE_NEG_PUNCT CCE_NEG_SPACE CCE_NEG_UPPER CCE_NEG_XDIGIT + +%left CCL_OP_DIFF CCL_OP_UNION + +/* + *POSIX and AT&T lex place the + * precedence of the repeat operator, {}, below that of concatenation. + * Thus, ab{3} is ababab. Most other POSIX utilities use an Extended + * Regular Expression (ERE) precedence that has the repeat operator + * higher than concatenation. This causes ab{3} to yield abbb. * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * In order to support the POSIX and AT&T precedence and the flex + * precedence we define two token sets for the begin and end tokens of + * the repeat operator, '{' and '}'. The lexical scanner chooses + * which tokens to return based on whether posix_compat or lex_compat + * are specified. Specifying either posix_compat or lex_compat will + * cause flex to parse scanner files as per the AT&T and + * POSIX-mandated behavior. */ -/* $Header: /home/daffy/u0/vern/flex/RCS/parse.y,v 2.28 95/04/21 11:51:51 vern Exp $ */ +%token BEGIN_REPEAT_POSIX END_REPEAT_POSIX BEGIN_REPEAT_FLEX END_REPEAT_FLEX -/* Some versions of bison are broken in that they use alloca() but don't - * declare it properly. The following is the patented (just kidding!) - * #ifdef chud to fix the problem, courtesy of Francois Pinard. - */ -#ifdef YYBISON -/* AIX requires this to be the first thing in the file. What a piece. */ -# ifdef _AIX - #pragma alloca -# endif -#endif +%{ +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ #include "flexdef.h" +#include "tables.h" -/* The remainder of the alloca() cruft has to come after including flexdef.h, - * so HAVE_ALLOCA_H is (possibly) defined. - */ -#ifdef YYBISON -# ifdef __GNUC__ -# ifndef alloca -# define alloca __builtin_alloca -# endif -# else -# if HAVE_ALLOCA_H -# include <alloca.h> -# else -# ifdef __hpux -void *alloca (); -# else -# ifdef __TURBOC__ -# include <malloc.h> -# else -char *alloca (); -# endif -# endif -# endif -# endif -#endif - -/* Bletch, ^^^^ that was ugly! */ - - -int pat, scnum, eps, headcnt, trailcnt, anyccl, lastchar, i, rulelen; +int pat, scnum, eps, headcnt, trailcnt, lastchar, i, rulelen; int trlcontxt, xcluflg, currccl, cclsorted, varlength, variable_trail_rule; int *scon_stk; int scon_stk_ptr; static int madeany = false; /* whether we've made the '.' character class */ +static int ccldot, cclany; int previous_continued_action; /* whether the previous rule's action was '|' */ +#define format_warn3(fmt, a1, a2) \ + do{ \ + char fw3_msg[MAXLINE];\ + snprintf( fw3_msg, MAXLINE,(fmt), (a1), (a2) );\ + warn( fw3_msg );\ + }while(0) + /* Expand a POSIX character class expression. */ #define CCL_EXPR(func) \ - { \ + do{ \ int c; \ for ( c = 0; c < csize; ++c ) \ if ( isascii(c) && func(c) ) \ ccladd( currccl, c ); \ - } + }while(0) + +/* negated class */ +#define CCL_NEG_EXPR(func) \ + do{ \ + int c; \ + for ( c = 0; c < csize; ++c ) \ + if ( !func(c) ) \ + ccladd( currccl, c ); \ + }while(0) /* While POSIX defines isblank(), it's not ANSI C. */ #define IS_BLANK(c) ((c) == ' ' || (c) == '\t') @@ -123,7 +129,7 @@ goal : initlex sect1 sect1end sect2 initforrule */ default_rule = num_rules; - finish_rule( def_rule, false, 0, 0 ); + finish_rule( def_rule, false, 0, 0, 0); for ( i = 1; i <= lastsc; ++i ) scset[i] = mkbranch( scset[i], def_rule ); @@ -150,7 +156,7 @@ sect1 : sect1 startconddecl namelist1 | sect1 options | | error - { synerr( "unknown error processing section 1" ); } + { synerr( _("unknown error processing section 1") ); } ; sect1end : SECTEND @@ -175,7 +181,7 @@ namelist1 : namelist1 NAME { scinstal( nmstr, xcluflg ); } | error - { synerr( "bad start condition list" ); } + { synerr( _("bad start condition list") ); } ; options : OPTION_OP optionlist @@ -190,10 +196,16 @@ option : OPT_OUTFILE '=' NAME outfilename = copy_string( nmstr ); did_outfilename = 1; } + | OPT_EXTRA_TYPE '=' NAME + { extra_type = copy_string( nmstr ); } | OPT_PREFIX '=' NAME { prefix = copy_string( nmstr ); } | OPT_YYCLASS '=' NAME { yyclass = copy_string( nmstr ); } + | OPT_HEADER '=' NAME + { headerfilename = copy_string( nmstr ); } + | OPT_TABLES '=' NAME + { tablesext = true; tablesfilename = copy_string( nmstr ); } ; sect2 : sect2 scon initforrule flexrule '\n' @@ -220,7 +232,7 @@ flexrule : '^' rule { pat = $2; finish_rule( pat, variable_trail_rule, - headcnt, trailcnt ); + headcnt, trailcnt , previous_continued_action); if ( scon_stk_ptr > 0 ) { @@ -256,7 +268,7 @@ flexrule : '^' rule { pat = $1; finish_rule( pat, variable_trail_rule, - headcnt, trailcnt ); + headcnt, trailcnt , previous_continued_action); if ( scon_stk_ptr > 0 ) { @@ -300,7 +312,7 @@ flexrule : '^' rule } | error - { synerr( "unrecognized rule" ); } + { synerr( _("unrecognized rule") ); } ; scon_stk_ptr : @@ -336,7 +348,7 @@ namelist2 : namelist2 ',' sconname | sconname | error - { synerr( "bad start condition list" ); } + { synerr( _("bad start condition list") ); } ; sconname : NAME @@ -392,6 +404,7 @@ rule : re2 re /* Mark as variable. */ varlength = true; headcnt = 0; + } if ( lex_compat || (varlength && headcnt == 0) ) @@ -418,7 +431,7 @@ rule : re2 re } | re2 re '$' - { synerr( "trailing context used twice" ); } + { synerr( _("trailing context used twice") ); } | re '$' { @@ -431,7 +444,7 @@ rule : re2 re if ( trlcontxt ) { - synerr( "trailing context used twice" ); + synerr( _("trailing context used twice") ); $$ = mkstate( SYM_EPSILON ); } @@ -500,7 +513,7 @@ re2 : re '/' */ if ( trlcontxt ) - synerr( "trailing context used twice" ); + synerr( _("trailing context used twice") ); else trlcontxt = true; @@ -529,6 +542,69 @@ series : series singleton | singleton { $$ = $1; } + + | series BEGIN_REPEAT_POSIX NUMBER ',' NUMBER END_REPEAT_POSIX + { + varlength = true; + + if ( $3 > $5 || $3 < 0 ) + { + synerr( _("bad iteration values") ); + $$ = $1; + } + else + { + if ( $3 == 0 ) + { + if ( $5 <= 0 ) + { + synerr( + _("bad iteration values") ); + $$ = $1; + } + else + $$ = mkopt( + mkrep( $1, 1, $5 ) ); + } + else + $$ = mkrep( $1, $3, $5 ); + } + } + + | series BEGIN_REPEAT_POSIX NUMBER ',' END_REPEAT_POSIX + { + varlength = true; + + if ( $3 <= 0 ) + { + synerr( _("iteration value must be positive") ); + $$ = $1; + } + + else + $$ = mkrep( $1, $3, INFINITE_REPEAT ); + } + + | series BEGIN_REPEAT_POSIX NUMBER END_REPEAT_POSIX + { + /* The series could be something like "(foo)", + * in which case we have no idea what its length + * is, so we punt here. + */ + varlength = true; + + if ( $3 <= 0 ) + { + synerr( _("iteration value must be positive") + ); + $$ = $1; + } + + else + $$ = link_machines( $1, + copysingl( $1, $3 - 1 ) ); + } + ; singleton : singleton '*' @@ -550,13 +626,13 @@ singleton : singleton '*' $$ = mkopt( $1 ); } - | singleton '{' NUMBER ',' NUMBER '}' + | singleton BEGIN_REPEAT_FLEX NUMBER ',' NUMBER END_REPEAT_FLEX { varlength = true; if ( $3 > $5 || $3 < 0 ) { - synerr( "bad iteration values" ); + synerr( _("bad iteration values") ); $$ = $1; } else @@ -566,7 +642,7 @@ singleton : singleton '*' if ( $5 <= 0 ) { synerr( - "bad iteration values" ); + _("bad iteration values") ); $$ = $1; } else @@ -578,21 +654,21 @@ singleton : singleton '*' } } - | singleton '{' NUMBER ',' '}' + | singleton BEGIN_REPEAT_FLEX NUMBER ',' END_REPEAT_FLEX { varlength = true; if ( $3 <= 0 ) { - synerr( "iteration value must be positive" ); + synerr( _("iteration value must be positive") ); $$ = $1; } else - $$ = mkrep( $1, $3, INFINITY ); + $$ = mkrep( $1, $3, INFINITE_REPEAT ); } - | singleton '{' NUMBER '}' + | singleton BEGIN_REPEAT_FLEX NUMBER END_REPEAT_FLEX { /* The singleton could be something like "(foo)", * in which case we have no idea what its length @@ -602,7 +678,7 @@ singleton : singleton '*' if ( $3 <= 0 ) { - synerr( "iteration value must be positive" ); + synerr( _("iteration value must be positive") ); $$ = $1; } @@ -616,26 +692,37 @@ singleton : singleton '*' if ( ! madeany ) { /* Create the '.' character class. */ - anyccl = cclinit(); - ccladd( anyccl, '\n' ); - cclnegate( anyccl ); + ccldot = cclinit(); + ccladd( ccldot, '\n' ); + cclnegate( ccldot ); + + if ( useecs ) + mkeccl( ccltbl + cclmap[ccldot], + ccllen[ccldot], nextecm, + ecgroup, csize, csize ); - if ( useecs ) - mkeccl( ccltbl + cclmap[anyccl], - ccllen[anyccl], nextecm, - ecgroup, csize, csize ); + /* Create the (?s:'.') character class. */ + cclany = cclinit(); + cclnegate( cclany ); + + if ( useecs ) + mkeccl( ccltbl + cclmap[cclany], + ccllen[cclany], nextecm, + ecgroup, csize, csize ); madeany = true; } ++rulelen; - $$ = mkstate( -anyccl ); + if (sf_dot_all()) + $$ = mkstate( -cclany ); + else + $$ = mkstate( -ccldot ); } | fullccl { - if ( ! cclsorted ) /* Sort characters for fast searching. We * use a shell sort since this list could * be large. @@ -648,6 +735,9 @@ singleton : singleton '*' ++rulelen; + if (ccl_has_nl[$1]) + rule_has_nl[num_rules] = true; + $$ = mkstate( -$1 ); } @@ -655,6 +745,9 @@ singleton : singleton '*' { ++rulelen; + if (ccl_has_nl[$1]) + rule_has_nl[num_rules] = true; + $$ = mkstate( -$1 ); } @@ -668,15 +761,25 @@ singleton : singleton '*' { ++rulelen; - if ( caseins && $1 >= 'A' && $1 <= 'Z' ) - $1 = clower( $1 ); + if ($1 == nlch) + rule_has_nl[num_rules] = true; - $$ = mkstate( $1 ); + if (sf_case_ins() && has_case($1)) + /* create an alternation, as in (a|A) */ + $$ = mkor (mkstate($1), mkstate(reverse_case($1))); + else + $$ = mkstate( $1 ); } ; +fullccl: + fullccl CCL_OP_DIFF braceccl { $$ = ccl_set_diff ($1, $3); } + | fullccl CCL_OP_UNION braceccl { $$ = ccl_set_union ($1, $3); } + | braceccl + ; -fullccl : '[' ccl ']' - { $$ = $2; } +braceccl: + + '[' ccl ']' { $$ = $2; } | '[' '^' ccl ']' { @@ -687,16 +790,35 @@ fullccl : '[' ccl ']' ccl : ccl CHAR '-' CHAR { - if ( caseins ) - { - if ( $2 >= 'A' && $2 <= 'Z' ) - $2 = clower( $2 ); - if ( $4 >= 'A' && $4 <= 'Z' ) - $4 = clower( $4 ); - } + + if (sf_case_ins()) + { + + /* If one end of the range has case and the other + * does not, or the cases are different, then we're not + * sure what range the user is trying to express. + * Examples: [@-z] or [S-t] + */ + if (has_case ($2) != has_case ($4) + || (has_case ($2) && (b_islower ($2) != b_islower ($4))) + || (has_case ($2) && (b_isupper ($2) != b_isupper ($4)))) + format_warn3 ( + _("the character range [%c-%c] is ambiguous in a case-insensitive scanner"), + $2, $4); + + /* If the range spans uppercase characters but not + * lowercase (or vice-versa), then should we automatically + * include lowercase characters in the range? + * Example: [@-_] spans [a-z] but not [A-Z] + */ + else if (!has_case ($2) && !has_case ($4) && !range_covers_case ($2, $4)) + format_warn3 ( + _("the character range [%c-%c] is ambiguous in a case-insensitive scanner"), + $2, $4); + } if ( $2 > $4 ) - synerr( "negative range in character class" ); + synerr( _("negative range in character class") ); else { @@ -708,6 +830,19 @@ ccl : ccl CHAR '-' CHAR */ cclsorted = cclsorted && ($2 > lastchar); lastchar = $4; + + /* Do it again for upper/lowercase */ + if (sf_case_ins() && has_case($2) && has_case($4)){ + $2 = reverse_case ($2); + $4 = reverse_case ($4); + + for ( i = $2; i <= $4; ++i ) + ccladd( $1, i ); + + cclsorted = cclsorted && ($2 > lastchar); + lastchar = $4; + } + } $$ = $1; @@ -715,12 +850,19 @@ ccl : ccl CHAR '-' CHAR | ccl CHAR { - if ( caseins && $2 >= 'A' && $2 <= 'Z' ) - $2 = clower( $2 ); - ccladd( $1, $2 ); cclsorted = cclsorted && ($2 > lastchar); lastchar = $2; + + /* Do it again for upper/lowercase */ + if (sf_case_ins() && has_case($2)){ + $2 = reverse_case ($2); + ccladd ($1, $2); + + cclsorted = cclsorted && ($2 > lastchar); + lastchar = $2; + } + $$ = $1; } @@ -739,33 +881,65 @@ ccl : ccl CHAR '-' CHAR } ; -ccl_expr: CCE_ALNUM { CCL_EXPR(isalnum) } - | CCE_ALPHA { CCL_EXPR(isalpha) } - | CCE_BLANK { CCL_EXPR(IS_BLANK) } - | CCE_CNTRL { CCL_EXPR(iscntrl) } - | CCE_DIGIT { CCL_EXPR(isdigit) } - | CCE_GRAPH { CCL_EXPR(isgraph) } - | CCE_LOWER { CCL_EXPR(islower) } - | CCE_PRINT { CCL_EXPR(isprint) } - | CCE_PUNCT { CCL_EXPR(ispunct) } - | CCE_SPACE { CCL_EXPR(isspace) } +ccl_expr: + CCE_ALNUM { CCL_EXPR(isalnum); } + | CCE_ALPHA { CCL_EXPR(isalpha); } + | CCE_BLANK { CCL_EXPR(IS_BLANK); } + | CCE_CNTRL { CCL_EXPR(iscntrl); } + | CCE_DIGIT { CCL_EXPR(isdigit); } + | CCE_GRAPH { CCL_EXPR(isgraph); } + | CCE_LOWER { + CCL_EXPR(islower); + if (sf_case_ins()) + CCL_EXPR(isupper); + } + | CCE_PRINT { CCL_EXPR(isprint); } + | CCE_PUNCT { CCL_EXPR(ispunct); } + | CCE_SPACE { CCL_EXPR(isspace); } + | CCE_XDIGIT { CCL_EXPR(isxdigit); } | CCE_UPPER { - if ( caseins ) - CCL_EXPR(islower) + CCL_EXPR(isupper); + if (sf_case_ins()) + CCL_EXPR(islower); + } + + | CCE_NEG_ALNUM { CCL_NEG_EXPR(isalnum); } + | CCE_NEG_ALPHA { CCL_NEG_EXPR(isalpha); } + | CCE_NEG_BLANK { CCL_NEG_EXPR(IS_BLANK); } + | CCE_NEG_CNTRL { CCL_NEG_EXPR(iscntrl); } + | CCE_NEG_DIGIT { CCL_NEG_EXPR(isdigit); } + | CCE_NEG_GRAPH { CCL_NEG_EXPR(isgraph); } + | CCE_NEG_PRINT { CCL_NEG_EXPR(isprint); } + | CCE_NEG_PUNCT { CCL_NEG_EXPR(ispunct); } + | CCE_NEG_SPACE { CCL_NEG_EXPR(isspace); } + | CCE_NEG_XDIGIT { CCL_NEG_EXPR(isxdigit); } + | CCE_NEG_LOWER { + if ( sf_case_ins() ) + warn(_("[:^lower:] is ambiguous in case insensitive scanner")); else - CCL_EXPR(isupper) + CCL_NEG_EXPR(islower); + } + | CCE_NEG_UPPER { + if ( sf_case_ins() ) + warn(_("[:^upper:] ambiguous in case insensitive scanner")); + else + CCL_NEG_EXPR(isupper); } - | CCE_XDIGIT { CCL_EXPR(isxdigit) } ; string : string CHAR { - if ( caseins && $2 >= 'A' && $2 <= 'Z' ) - $2 = clower( $2 ); + if ( $2 == nlch ) + rule_has_nl[num_rules] = true; ++rulelen; - $$ = link_machines( $1, mkstate( $2 ) ); + if (sf_case_ins() && has_case($2)) + $$ = mkor (mkstate($2), mkstate(reverse_case($2))); + else + $$ = mkstate ($2); + + $$ = link_machines( $1, $$); } | @@ -794,7 +968,7 @@ void build_eof_action() else { sceof[scon_stk[i]] = true; - sprintf( action_text, "case YY_STATE_EOF(%s):\n", + snprintf( action_text, sizeof(action_text), "case YY_STATE_EOF(%s):\n", scname[scon_stk[i]] ); add_action( action_text ); } @@ -815,11 +989,11 @@ void build_eof_action() /* format_synerr - write out formatted syntax error */ void format_synerr( msg, arg ) -char msg[], arg[]; +const char *msg, arg[]; { char errmsg[MAXLINE]; - (void) sprintf( errmsg, msg, arg ); + (void) snprintf( errmsg, sizeof(errmsg), msg, arg ); synerr( errmsg ); } @@ -827,7 +1001,7 @@ char msg[], arg[]; /* synerr - report a syntax error */ void synerr( str ) -char str[]; +const char *str; { syntaxerror = true; pinpoint_message( str ); @@ -837,11 +1011,11 @@ char str[]; /* format_warn - write out formatted warning */ void format_warn( msg, arg ) -char msg[], arg[]; +const char *msg, arg[]; { char warn_msg[MAXLINE]; - (void) sprintf( warn_msg, msg, arg ); + snprintf( warn_msg, sizeof(warn_msg), msg, arg ); warn( warn_msg ); } @@ -849,7 +1023,7 @@ char msg[], arg[]; /* warn - report a warning, unless -w was given */ void warn( str ) -char str[]; +const char *str; { line_warning( str, linenum ); } @@ -859,11 +1033,11 @@ char str[]; */ void format_pinpoint_message( msg, arg ) -char msg[], arg[]; +const char *msg, arg[]; { char errmsg[MAXLINE]; - (void) sprintf( errmsg, msg, arg ); + snprintf( errmsg, sizeof(errmsg), msg, arg ); pinpoint_message( errmsg ); } @@ -871,7 +1045,7 @@ char msg[], arg[]; /* pinpoint_message - write out a message, pinpointing its location */ void pinpoint_message( str ) -char str[]; +const char *str; { line_pinpoint( str, linenum ); } @@ -880,14 +1054,14 @@ char str[]; /* line_warning - report a warning at a given line, unless -w was given */ void line_warning( str, line ) -char str[]; +const char *str; int line; { char warning[MAXLINE]; if ( ! nowarn ) { - sprintf( warning, "warning, %s", str ); + snprintf( warning, sizeof(warning), "warning, %s", str ); line_pinpoint( warning, line ); } } @@ -896,10 +1070,10 @@ int line; /* line_pinpoint - write out a message, pinpointing it at the given line */ void line_pinpoint( str, line ) -char str[]; +const char *str; int line; { - fprintf( stderr, "\"%s\", line %d: %s\n", infilename, line, str ); + fprintf( stderr, "%s:%d: %s\n", infilename, line, str ); } @@ -908,6 +1082,6 @@ int line; */ void yyerror( msg ) -char msg[]; +const char *msg; { } diff --git a/regex.c b/regex.c new file mode 100644 index 000000000000..553397174f10 --- /dev/null +++ b/regex.c @@ -0,0 +1,164 @@ +/** regex - regular expression functions related to POSIX regex lib. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" + + +static const char* REGEXP_LINEDIR = "^#line ([[:digit:]]+) \"(.*)\""; +static const char* REGEXP_BLANK_LINE = "^[[:space:]]*$"; + +regex_t regex_linedir; /**< matches line directives */ +regex_t regex_blank_line; /**< matches blank lines */ + + +/** Initialize the regular expressions. + * @return true upon success. + */ +bool flex_init_regex(void) +{ + flex_regcomp(®ex_linedir, REGEXP_LINEDIR, REG_EXTENDED); + flex_regcomp(®ex_blank_line, REGEXP_BLANK_LINE, REG_EXTENDED); + + return true; +} + +/** Compiles a regular expression or dies trying. + * @param preg Same as for regcomp(). + * @param regex Same as for regcomp(). + * @param cflags Same as for regcomp(). + */ +void flex_regcomp(regex_t *preg, const char *regex, int cflags) +{ + int err; + + memset (preg, 0, sizeof (regex_t)); + + if ((err = regcomp (preg, regex, cflags)) != 0) { + const int errbuf_sz = 200; + char * errbuf=0; + + errbuf = (char*)flex_alloc(errbuf_sz *sizeof(char)); + regerror (err, preg, errbuf, errbuf_sz); + snprintf (errbuf, errbuf_sz, "regcomp failed: %s\n", errbuf); + + flexfatal (errbuf); + free(errbuf); + } +} + +/** Extract a copy of the match, or NULL if no match. + * @param m A match as returned by regexec(). + * @param src The source string that was passed to regexec(). + * @return The allocated string. + */ +char *regmatch_dup (regmatch_t * m, const char *src) +{ + char *str; + int len; + + if (m == NULL || m->rm_so < 0) + return NULL; + len = m->rm_eo - m->rm_so; + str = (char *) flex_alloc ((len + 1) * sizeof (char)); + strncpy (str, src + m->rm_so, len); + str[len] = 0; + return str; +} + +/** Copy the match. + * @param m A match as returned by regexec(). + * @param dest The destination buffer. + * @param src The source string that was passed to regexec(). + * @return dest + */ +char *regmatch_cpy (regmatch_t * m, char *dest, const char *src) +{ + if (m == NULL || m->rm_so < 0) { + if (dest) + dest[0] = '\0'; + return dest; + } + + snprintf (dest, regmatch_len(m), "%s", src + m->rm_so); + return dest; +} + +/** Get the length in characters of the match. + * @param m A match as returned by regexec(). + * @param src The source string that was passed to regexec(). + * @return The length of the match. + */ +int regmatch_len (regmatch_t * m) +{ + if (m == NULL || m->rm_so < 0) { + return 0; + } + + return m->rm_eo - m->rm_so; +} + + + +/** Convert a regmatch_t object to an integer using the strtol() function. + * @param m A match as returned by regexec(). + * @param src The source string that was passed to regexec(). + * @param endptr Same as the second argument to strtol(). + * @param base Same as the third argument to strtol(). + * @return The converted integer or error (Return value is the same as for strtol()). + */ +int regmatch_strtol (regmatch_t * m, const char *src, char **endptr, + int base) +{ + int n = 0; + +#define bufsz 20 + char buf[bufsz]; + char *s; + + if (m == NULL || m->rm_so < 0) + return 0; + + if (regmatch_len (m) < bufsz) + s = regmatch_cpy (m, buf, src); + else + s = regmatch_dup (m, src); + + n = strtol (s, endptr, base); + + if (s != buf) + free (s); + + return n; +} + +/** Check for empty or non-existent match. + * @param m A match as returned by regexec(). + * @return false if match length is non-zero. + * Note that reg_empty returns true even if match did not occur at all. + */ +bool regmatch_empty (regmatch_t * m) +{ + return (m == NULL || m->rm_so < 0 || m->rm_so == m->rm_eo); +} + +/* vim:set expandtab cindent tabstop=4 softtabstop=4 shiftwidth=4 textwidth=0: */ diff --git a/scan.c b/scan.c new file mode 100644 index 000000000000..d7f5db325b5b --- /dev/null +++ b/scan.c @@ -0,0 +1,5201 @@ + +#line 3 "scan.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 35 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <stdlib.h> + +/* end standard C headers. */ + +/* 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 + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#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 */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* 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) + +/* 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 yyrestart(yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int yyleng; + +extern FILE *yyin, *yyout; + +#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 yytext. */ \ + 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 yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + 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 yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* 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. */ + +/* 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)] + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart (FILE *input_file ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +void yy_delete_buffer (YY_BUFFER_STATE b ); +void yy_flush_buffer (YY_BUFFER_STATE b ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state (void ); + +static void yyensure_buffer_stack (void ); +static void yy_load_buffer_state (void ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); + +void *yyalloc (yy_size_t ); +void *yyrealloc (void *,yy_size_t ); +void yyfree (void * ); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +typedef unsigned char YY_CHAR; + +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; + +typedef int yy_state_type; + +extern int yylineno; + +int yylineno = 1; + +extern char *yytext; +#define yytext_ptr yytext + +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[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + (yytext_ptr) -= (yy_more_len); \ + yyleng = (size_t) (yy_cp - (yytext_ptr)); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 251 +#define YY_END_OF_BUFFER 252 +/* 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_acclist[1223] = + { 0, + 248, 248, 252, 250, 251, 9, 250, 251, 20, 250, + 251, 250, 251, 18, 250, 251, 1, 9, 250, 251, + 19, 20, 250, 251, 250, 251, 250, 251, 250, 251, + 250, 251, 17, 18, 250, 251, 164, 250, 251, 149, + 164, 250, 251, 150, 250, 251, 164, 250, 251, 142, + 164, 250, 251, 164, 250, 251, 161, 163, 164, 250, + 251, 162, 163, 164, 250, 251, 163, 164, 250, 251, + 163, 164, 250, 251, 164, 250, 251, 164, 250, 251, + 164, 250, 251, 163, 164, 250, 251, 148, 149, 164, + 250, 251, 138, 150, 250, 251, 164, 250, 251, 164, + + 250, 251, 140, 164, 250, 251, 141, 164, 250, 251, + 136, 250, 251, 137, 250, 251, 136, 250, 251, 135, + 136, 250, 251, 134, 136, 250, 251, 135, 136, 250, + 251, 248, 249, 250, 251, 248, 249, 250, 251, 249, + 250, 251, 249, 250, 251, 41, 250, 251, 42, 250, + 251, 41, 250, 251, 41, 250, 251, 41, 250, 251, + 41, 250, 251, 41, 250, 251, 41, 250, 251, 50, + 250, 251, 49, 250, 251, 51, 250, 251, 250, 251, + 170, 250, 251, 170, 250, 251, 165, 250, 251, 170, + 250, 251, 166, 170, 250, 251, 167, 170, 250, 251, + + 169, 170, 250, 251, 171, 250, 251, 219, 250, 251, + 220, 250, 251, 219, 250, 251, 217, 219, 250, 251, + 216, 219, 250, 251, 218, 219, 250, 251, 172, 250, + 251, 174, 250, 251, 172, 250, 251, 173, 250, 251, + 172, 250, 251, 186, 250, 251, 186, 250, 251, 186, + 250, 251, 186, 250, 251, 188, 190, 250, 251, 190, + 250, 251, 188, 190, 250, 251, 188, 190, 250, 251, + 188, 190, 250, 251, 188, 190, 250, 251, 189, 190, + 250, 251, 233, 239, 250, 251, 238, 250, 251, 233, + 239, 250, 251, 237, 239, 250, 251, 239, 250, 251, + + 239, 250, 251, 235, 239, 250, 251, 235, 239, 250, + 251, 235, 239, 250, 251, 234, 239, 250, 251, 234, + 239, 250, 251, 229, 239, 250, 251, 230, 239, 250, + 251, 250, 251, 131, 250, 251, 250, 251, 25, 250, + 251, 26, 250, 251, 25, 250, 251, 22, 250, 251, + 25, 250, 251, 25, 250, 251, 240, 244, 250, 251, + 242, 250, 251, 240, 244, 250, 251, 243, 244, 250, + 251, 244, 250, 251, 227, 250, 251, 227, 250, 251, + 228, 250, 251, 227, 250, 251, 227, 250, 251, 227, + 250, 251, 227, 250, 251, 227, 250, 251, 227, 250, + + 251, 227, 250, 251, 130, 250, 251, 53, 130, 250, + 251, 52, 250, 251, 130, 250, 251, 130, 250, 251, + 130, 250, 251, 130, 250, 251, 54, 130, 250, 251, + 130, 250, 251, 130, 250, 251, 130, 250, 251, 130, + 250, 251, 130, 250, 251, 130, 250, 251, 130, 250, + 251, 130, 250, 251, 130, 250, 251, 130, 250, 251, + 130, 250, 251, 130, 250, 251, 130, 250, 251, 130, + 250, 251, 130, 250, 251, 130, 250, 251, 130, 250, + 251, 130, 250, 251, 130, 250, 251, 130, 250, 251, + 130, 250, 251, 37, 250, 251, 34, 250, 251, 37, + + 250, 251, 35, 37, 250, 251, 48, 250, 251, 45, + 250, 251, 250, 251, 48, 250, 251, 48, 250, 251, + 44, 250, 251, 43, 250, 251, 176, 250, 251, 175, + 250, 251, 177, 250, 251, 178, 250, 251, 179, 250, + 251, 180, 250, 251, 181, 250, 251, 182, 250, 251, + 183, 250, 251, 32, 250, 251, 33, 250, 251, 32, + 250, 251, 31, 250, 251, 29, 250, 251, 30, 250, + 251, 29, 250, 251, 28, 250, 251, 9, 20, 18, + 1, 9, 19, 20, 16, 10, 16, 4, 16, 5, + 2, 17, 18, 149, 150, 144, 160, 158, 154, 154, + + 245, 245, 245, 143, 148, 149, 138, 150, 140, 141, + 153, 139, 137, 135, 134, 134, 132, 135, 133, 135, + 248, 248, 246, 247, 42, 39, 40, 50, 49, 51, + 165, 165, 168, 169, 220, 216, 174, 184, 185, 190, + 187, 233, 238, 236, 222, 235, 235, 235, 231, 232, + 131, 26, 21, 23, 24, 240, 242, 241, 228, 221, + 225, 226, 53, 52, 129, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 55, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 36, 35, 45, + + 46, 47, 32, 33, 30, 27, 16, 10, 16, 14, + 4, 16, 5, 6, 145, 146, 159, 154, 154, 154, + 154, 154, 245, 245, 156, 155, 157, 139, 145, 147, + 153, 132, 135, 133, 135, 38, 235, 235, 221, 130, + 130, 130, 130, 130, 130, 130, 67, 130, 130, 130, + 130, 72, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 14, 15, 4, + 8, 16, 5, 154, 154, 154, 154, 154, 154, 154, + + 245, 157, 235, 235, 56, 57, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 73, 130, 74, + 130, 130, 130, 130, 130, 79, 130, 130, 130, 130, + 130, 130, 130, 130, 84, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 93, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 15, 8, 16, 8, + 16, 8, 16, 154, 154, 154, 154, 154, 154, 154, + 215, 235, 235, 58, 130, 130, 130, 60, 130, 130, + 64, 130, 130, 130, 130, 130, 70, 130, 130, 130, + 130, 75, 130, 130, 130, 130, 130, 130, 130, 130, + + 130, 130, 130, 130, 87, 130, 130, 130, 130, 130, + 91, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 3, 8, 16, 7, 8, 16, 154, 154, + 154, 223, 224, 223, 235, 224, 235, 130, 130, 130, + 63, 130, 130, 130, 130, 130, 130, 130, 130, 126, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 124, + 130, 130, 86, 130, 130, 89, 130, 130, 90, 130, + 130, 130, 130, 105, 130, 130, 95, 130, 130, 96, + 130, 12, 13, 152, 151, 152, 130, 130, 130, 130, + 130, 130, 130, 68, 130, 130, 71, 130, 130, 130, + + 130, 130, 130, 130, 123, 130, 130, 83, 130, 130, + 130, 88, 130, 130, 92, 130, 103, 130, 125, 130, + 130, 130, 151, 130, 130, 130, 130, 130, 130, 130, + 69, 130, 130, 130, 130, 130, 80, 130, 130, 130, + 130, 130, 130, 130, 114, 94, 130, 130, 115, 11, + 191, 215, 192, 215, 193, 215, 194, 215, 195, 215, + 196, 215, 197, 215, 198, 215, 199, 215, 200, 215, + 201, 215, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 85, 130, 130, 130, + 116, 104, 130, 117, 202, 215, 203, 215, 204, 215, + + 205, 215, 206, 215, 207, 215, 208, 215, 209, 215, + 210, 215, 211, 215, 212, 215, 213, 215, 130, 130, + 130, 130, 130, 130, 130, 122, 130, 130, 130, 77, + 130, 130, 130, 130, 130, 130, 110, 120, 118, 111, + 121, 119, 214, 215, 130, 130, 130, 130, 130, 130, + 130, 126, 130, 76, 130, 130, 82, 130, 130, 127, + 130, 130, 106, 108, 107, 109, 130, 130, 130, 65, + 130, 130, 130, 130, 130, 78, 130, 130, 112, 113, + 98, 99, 130, 130, 130, 130, 130, 130, 130, 128, + 130, 97, 101, 130, 130, 130, 130, 130, 68, 130, + + 130, 100, 102, 130, 130, 62, 130, 66, 130, 130, + 130, 130, 61, 130, 69, 130, 130, 130, 81, 130, + 59, 130 + } ; + +static yyconst flex_int16_t yy_accept[1108] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 2, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, + 6, 9, 12, 14, 17, 21, 25, 27, 29, 31, + 33, 37, 40, 44, 47, 50, 54, 57, 62, 67, + 71, 75, 78, 81, 84, 88, 93, 97, 100, 103, + 107, 111, 114, 117, 120, 124, 128, 132, 136, 140, + 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, + + 173, 176, 179, 181, 184, 187, 190, 193, 197, 201, + 205, 208, 211, 214, 217, 221, 225, 229, 232, 235, + 238, 241, 244, 247, 250, 253, 256, 260, 263, 267, + 271, 275, 279, 283, 287, 290, 294, 298, 301, 304, + 308, 312, 316, 320, 324, 328, 332, 334, 337, 339, + 342, 345, 348, 351, 354, 357, 361, 364, 368, 372, + 375, 378, 381, 384, 387, 390, 393, 396, 399, 402, + 405, 408, 412, 415, 418, 421, 424, 427, 431, 434, + 437, 440, 443, 446, 449, 452, 455, 458, 461, 464, + 467, 470, 473, 476, 479, 482, 485, 488, 491, 494, + + 497, 500, 503, 507, 510, 513, 515, 518, 521, 524, + 527, 530, 533, 536, 539, 542, 545, 548, 551, 554, + 557, 560, 563, 566, 569, 572, 575, 578, 579, 580, + 580, 581, 583, 585, 585, 585, 585, 586, 588, 588, + 588, 588, 588, 589, 590, 591, 591, 592, 594, 595, + 596, 596, 596, 596, 597, 597, 598, 599, 599, 600, + 601, 601, 602, 603, 604, 604, 604, 605, 605, 607, + 609, 609, 609, 609, 610, 611, 612, 613, 613, 614, + 615, 616, 617, 619, 621, 622, 623, 624, 625, 626, + 626, 626, 627, 628, 628, 629, 630, 631, 631, 632, + + 632, 633, 634, 635, 636, 637, 638, 638, 639, 640, + 641, 642, 643, 644, 644, 645, 645, 646, 647, 648, + 649, 650, 651, 651, 652, 652, 653, 654, 655, 656, + 657, 658, 659, 659, 659, 660, 661, 662, 663, 664, + 665, 665, 666, 666, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 707, 708, 710, + 710, 711, 711, 711, 711, 711, 711, 712, 713, 714, + + 714, 715, 715, 716, 716, 717, 717, 718, 718, 719, + 720, 720, 721, 722, 723, 724, 725, 726, 727, 727, + 728, 730, 731, 731, 732, 732, 734, 736, 736, 736, + 736, 737, 737, 737, 737, 737, 737, 737, 737, 737, + 737, 737, 737, 737, 737, 738, 739, 740, 740, 740, + 741, 742, 743, 744, 745, 746, 747, 749, 750, 751, + 752, 754, 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, + 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 786, 787, 788, 788, 788, 788, 788, + + 790, 790, 790, 790, 790, 790, 790, 791, 793, 794, + 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, + 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, + 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, + 803, 803, 803, 803, 803, 803, 804, 805, 806, 807, + 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, + 818, 820, 822, 823, 824, 825, 826, 828, 829, 830, + 831, 832, 833, 834, 835, 837, 838, 839, 840, 841, + 842, 843, 844, 845, 846, 848, 849, 850, 851, 852, + 853, 854, 855, 856, 857, 857, 857, 857, 857, 858, + + 858, 858, 858, 858, 858, 860, 862, 864, 864, 865, + 866, 867, 868, 869, 870, 871, 871, 871, 871, 871, + 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, + 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, + 872, 872, 872, 872, 873, 874, 876, 877, 878, 880, + 881, 883, 884, 885, 886, 887, 889, 890, 891, 892, + 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, + 904, 905, 907, 908, 909, 910, 911, 913, 914, 915, + 916, 917, 918, 919, 920, 921, 922, 923, 923, 923, + 923, 923, 924, 924, 924, 924, 926, 927, 929, 929, + + 930, 931, 932, 932, 932, 933, 934, 934, 934, 934, + 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, + 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, + 934, 936, 938, 939, 940, 941, 943, 944, 945, 946, + 947, 948, 949, 950, 952, 953, 954, 955, 956, 957, + 958, 959, 960, 962, 963, 965, 966, 968, 969, 971, + 972, 973, 974, 976, 976, 977, 979, 980, 980, 982, + 982, 982, 982, 982, 982, 983, 983, 984, 984, 985, + 985, 987, 987, 987, 987, 987, 987, 987, 987, 987, + 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, + + 987, 987, 987, 987, 987, 987, 988, 989, 990, 991, + 992, 993, 994, 996, 997, 999, 1000, 1001, 1002, 1003, + 1004, 1005, 1007, 1008, 1010, 1011, 1012, 1014, 1015, 1017, + 1019, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1022, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1025, 1026, 1027, 1028, 1029, + 1030, 1031, 1033, 1034, 1035, 1036, 1037, 1039, 1040, 1041, + 1042, 1043, 1044, 1045, 1045, 1045, 1046, 1046, 1046, 1046, + + 1046, 1046, 1046, 1048, 1049, 1049, 1049, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1051, 1051, 1053, + 1055, 1057, 1059, 1061, 1063, 1065, 1067, 1069, 1071, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, + 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1089, 1090, 1091, + 1091, 1091, 1091, 1091, 1091, 1091, 1092, 1092, 1094, 1094, + 1094, 1094, 1094, 1094, 1095, 1095, 1095, 1095, 1095, 1095, + 1097, 1099, 1101, 1103, 1105, 1107, 1109, 1111, 1113, 1115, + 1117, 1119, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, + + 1128, 1129, 1130, 1132, 1133, 1134, 1135, 1136, 1137, 1137, + 1137, 1138, 1138, 1139, 1140, 1141, 1141, 1141, 1141, 1142, + 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1145, 1146, 1147, + 1148, 1149, 1150, 1151, 1152, 1154, 1156, 1157, 1159, 1160, + 1162, 1163, 1164, 1165, 1165, 1166, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1168, 1169, 1170, 1172, 1173, 1174, + 1175, 1176, 1178, 1179, 1180, 1181, 1182, 1182, 1182, 1182, + 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1192, + 1193, 1193, 1194, 1194, 1195, 1196, 1197, 1198, 1199, 1201, + 1202, 1203, 1204, 1205, 1206, 1208, 1210, 1211, 1212, 1213, + + 1215, 1217, 1218, 1219, 1221, 1223, 1223 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 6, 7, 8, 9, 1, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 19, 19, + 19, 19, 19, 19, 20, 21, 22, 23, 1, 24, + 25, 26, 27, 1, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 44, + 53, 54, 55, 56, 57, 1, 58, 59, 60, 61, + + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 44, 74, 75, 76, 77, 78, 79, 80, + 81, 44, 82, 83, 84, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 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[85] = + { 0, + 1, 1, 2, 1, 3, 4, 1, 1, 1, 5, + 1, 6, 1, 7, 1, 8, 1, 5, 9, 9, + 9, 9, 10, 1, 1, 1, 1, 11, 11, 11, + 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 13, 14, 15, 1, 16, 11, 11, 11, + 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 5, 1, 17 + } ; + +static yyconst flex_int16_t yy_base[1201] = + { 0, + 0, 84, 167, 250, 171, 184, 174, 179, 192, 233, + 196, 200, 334, 0, 3343, 3340, 203, 416, 206, 211, + 187, 216, 276, 417, 500, 0, 210, 223, 421, 427, + 436, 440, 583, 588, 669, 0, 277, 299, 584, 751, + 579, 580, 576, 732, 279, 305, 310, 444, 3378, 3975, + 228, 3975, 3371, 0, 322, 3975, 3358, 423, 827, 3328, + 0, 3975, 755, 3975, 3337, 3975, 448, 3312, 3975, 3975, + 3323, 3291, 222, 408, 444, 764, 3975, 3311, 230, 3289, + 3975, 3975, 3975, 3306, 0, 3306, 164, 3304, 3975, 3236, + 3217, 3975, 3975, 3266, 239, 119, 3215, 3212, 3180, 0, + + 3248, 3975, 3243, 3975, 476, 3227, 3222, 3975, 3168, 0, + 3975, 3975, 3975, 3203, 3975, 464, 3975, 3975, 3975, 3186, + 3975, 742, 3975, 3161, 751, 180, 3975, 3975, 3171, 0, + 3149, 757, 3975, 0, 3975, 3149, 3975, 200, 3138, 0, + 429, 241, 3097, 3092, 3975, 3975, 306, 3975, 323, 3975, + 3975, 3126, 3108, 3072, 3069, 0, 3975, 3115, 3975, 0, + 3975, 446, 3975, 3114, 3031, 3098, 435, 371, 3045, 3026, + 3975, 3076, 3975, 3074, 3070, 439, 440, 3975, 578, 751, + 586, 562, 735, 752, 0, 572, 577, 588, 786, 749, + 396, 809, 727, 582, 747, 753, 764, 769, 580, 3975, + + 3975, 3067, 588, 3975, 3975, 3053, 3002, 2996, 3975, 3975, + 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 0, + 3975, 3046, 3975, 3975, 3975, 3018, 2986, 837, 3975, 2998, + 0, 847, 3975, 2997, 817, 777, 0, 0, 891, 903, + 912, 924, 0, 774, 0, 451, 3975, 0, 858, 3975, + 2996, 2914, 472, 3975, 2974, 2953, 3975, 791, 236, 822, + 899, 3975, 275, 0, 2873, 2872, 3975, 2871, 949, 3975, + 2949, 2850, 2918, 2906, 3975, 0, 3975, 796, 3975, 0, + 0, 2925, 0, 0, 2597, 3975, 3975, 3975, 3975, 795, + 794, 3975, 3975, 484, 0, 2597, 3975, 877, 2596, 2594, + + 2594, 3975, 0, 3975, 918, 3975, 1005, 3975, 3975, 3975, + 3975, 0, 3975, 611, 3975, 0, 3975, 0, 853, 851, + 3975, 3975, 490, 3975, 608, 3975, 3975, 3975, 3975, 0, + 3975, 3975, 596, 2510, 3975, 0, 3975, 3975, 2588, 3975, + 2581, 3975, 894, 906, 0, 911, 717, 727, 923, 728, + 2571, 882, 930, 889, 902, 916, 917, 940, 928, 923, + 940, 933, 0, 932, 3975, 935, 939, 951, 956, 1059, + 964, 965, 1052, 955, 957, 1099, 2578, 3975, 1078, 3975, + 3975, 3975, 0, 3975, 3975, 3975, 987, 0, 0, 1087, + 3975, 2576, 1132, 985, 1046, 1058, 0, 1058, 0, 1009, + + 3975, 1016, 3975, 1057, 3975, 1099, 3975, 1068, 731, 1088, + 1095, 1178, 1244, 1280, 988, 0, 3975, 3975, 2492, 1162, + 3975, 3975, 1081, 0, 1086, 0, 0, 1098, 1105, 1100, + 3975, 1167, 1245, 1246, 1247, 1250, 2539, 1248, 1249, 1258, + 1244, 1251, 1259, 1321, 1233, 1224, 0, 1072, 1228, 1243, + 1261, 1287, 1298, 1289, 1298, 1287, 0, 1299, 1228, 1308, + 0, 1280, 1298, 1307, 1316, 1314, 1316, 2532, 1322, 1337, + 1338, 1340, 1342, 1342, 1348, 1353, 1356, 1347, 1357, 1362, + 1366, 1358, 1353, 1356, 1377, 1366, 1370, 1371, 1367, 1383, + 1384, 1379, 1391, 1392, 1381, 1388, 1397, 1275, 1455, 3975, + + 1439, 1463, 1444, 1415, 1412, 1415, 0, 1409, 0, 1429, + 1492, 1558, 1594, 1524, 2449, 1564, 1639, 3975, 3975, 1537, + 1556, 1560, 1407, 2427, 1558, 1563, 1559, 1564, 1572, 1584, + 1574, 1562, 1615, 1619, 1609, 1625, 1626, 1643, 1614, 1651, + 1662, 1658, 1664, 1665, 1616, 1616, 1637, 3975, 3975, 1638, + 1631, 2352, 1634, 1641, 1655, 1650, 1677, 1679, 1671, 1689, + 0, 0, 1690, 1677, 1681, 1697, 0, 2348, 1684, 1694, + 2274, 1686, 1685, 1695, 0, 1692, 1711, 1704, 1703, 1701, + 1713, 1703, 1704, 1712, 0, 1717, 1731, 1731, 1719, 1723, + 1722, 1741, 1726, 1742, 1734, 1747, 1741, 2241, 3975, 1464, + + 1485, 1729, 1743, 1740, 0, 1721, 1591, 2173, 1585, 2139, + 1771, 1807, 1417, 962, 1426, 1755, 2049, 1745, 1769, 3975, + 1774, 1782, 1789, 1775, 1796, 1791, 1810, 1800, 1820, 1822, + 1821, 1823, 1832, 1831, 1838, 1840, 1853, 1856, 1854, 1855, + 1863, 1865, 1861, 1846, 1862, 0, 1853, 1864, 0, 1857, + 0, 2008, 1866, 1862, 1869, 0, 1874, 1893, 1870, 0, + 1888, 1875, 1886, 1882, 1880, 1878, 1897, 1876, 1882, 1889, + 1889, 0, 1904, 1895, 1899, 1919, 0, 1907, 1909, 1908, + 1923, 1791, 1924, 1925, 1919, 1747, 1917, 1918, 1918, 1938, + 1924, 1726, 1599, 1927, 1937, 1970, 3975, 1702, 1652, 1923, + + 1755, 1941, 1625, 1618, 3975, 3975, 1961, 1977, 1966, 1969, + 1956, 1979, 1983, 1986, 1989, 1984, 1992, 1987, 1994, 1990, + 1988, 1995, 2007, 2004, 2016, 2022, 1996, 2028, 2018, 2026, + 0, 0, 1620, 1990, 2009, 0, 2035, 2020, 2035, 2029, + 2024, 2025, 2029, 1589, 2049, 2041, 2052, 2048, 2053, 2054, + 2044, 2057, 0, 2064, 0, 2048, 0, 1576, 0, 2064, + 2070, 2056, 0, 2096, 2062, 0, 2067, 2108, 0, 1531, + 2072, 2078, 1438, 1853, 3975, 2105, 3975, 2068, 3975, 1463, + 3975, 1407, 1402, 1348, 1345, 1314, 1307, 1269, 1260, 1256, + 1210, 1158, 2106, 2111, 2097, 2118, 2122, 2129, 2125, 2140, + + 2131, 2136, 2141, 2143, 2156, 2131, 2138, 2147, 2101, 2151, + 2138, 2153, 0, 2141, 0, 2144, 2165, 2153, 2159, 2158, + 2165, 0, 2165, 0, 2167, 2169, 0, 2178, 0, 0, + 0, 2183, 2167, 2179, 2210, 2178, 2189, 2188, 2189, 2202, + 2186, 2194, 2218, 2196, 2202, 1119, 1114, 2206, 2118, 3975, + 1106, 1100, 1081, 1068, 1065, 1061, 1057, 972, 968, 965, + 914, 925, 893, 881, 874, 869, 865, 861, 854, 843, + 807, 802, 776, 2235, 2212, 2226, 2221, 2227, 2239, 2238, + 2228, 0, 2228, 2239, 2242, 2252, 0, 2238, 2244, 2249, + 2244, 2258, 2263, 2269, 2255, 3975, 2263, 2265, 2265, 2281, + + 2265, 2262, 0, 2285, 2288, 2274, 3975, 2277, 2280, 2295, + 2279, 2280, 2283, 2303, 2283, 2330, 3975, 2335, 3975, 3975, + 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 735, + 612, 608, 598, 441, 374, 261, 245, 202, 152, 149, + 137, 165, 2296, 2303, 2304, 2320, 2326, 2316, 2324, 2329, + 2324, 2316, 2319, 2335, 2324, 2327, 0, 2332, 2328, 2327, + 2332, 2345, 2348, 2352, 2344, 3975, 2338, 0, 2338, 2343, + 2357, 2362, 2357, 3975, 2371, 2356, 2359, 2358, 2380, 3975, + 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, + 3975, 128, 2384, 2382, 2373, 2387, 2376, 2378, 2378, 0, + + 2395, 2396, 0, 2385, 2384, 2405, 2403, 2401, 2405, 2413, + 3975, 2401, 3975, 3975, 3975, 2409, 2416, 2404, 3975, 3975, + 2400, 2422, 2422, 2414, 2417, 2417, 3975, 2421, 2421, 2418, + 2424, 2441, 2442, 2443, 0, 0, 2453, 0, 2436, 0, + 2451, 3975, 3975, 2445, 3975, 3975, 2446, 2457, 2445, 2461, + 2464, 2462, 2468, 2473, 2466, 2460, 0, 2462, 2459, 2461, + 2483, 0, 2463, 3975, 3975, 3975, 2484, 2488, 2476, 2482, + 3975, 2495, 2485, 2497, 2495, 2501, 2506, 2493, 0, 3975, + 2496, 3975, 2508, 2498, 2506, 2503, 2506, 2505, 0, 2520, + 3975, 3975, 2522, 2514, 0, 0, 2529, 2514, 2515, 0, + + 0, 2533, 2539, 0, 0, 3975, 2601, 2618, 2635, 2652, + 2669, 2686, 2703, 2720, 2737, 2754, 2771, 2788, 2805, 2822, + 2839, 2856, 2873, 2890, 2907, 2917, 2933, 2942, 2958, 2975, + 2986, 3002, 3019, 3036, 3053, 3063, 3079, 3096, 3113, 3127, + 3137, 3153, 3170, 3187, 3204, 3215, 2009, 3227, 3244, 3254, + 3270, 3287, 3294, 3300, 3316, 3326, 3342, 3359, 3376, 2564, + 3386, 3403, 3420, 3437, 3454, 3471, 3488, 3505, 3522, 3532, + 3548, 3562, 3572, 3588, 3605, 3622, 3639, 3650, 3662, 3679, + 3696, 3713, 3730, 3740, 3749, 3765, 3782, 3799, 2571, 3809, + 3826, 3843, 3860, 3877, 3885, 3890, 3906, 3923, 3940, 3957 + + } ; + +static yyconst flex_int16_t yy_def[1201] = + { 0, + 1106, 1106, 1107, 1107, 1108, 1109, 1110, 1110, 1111, 1111, + 1112, 1112, 1106, 13, 1113, 1113, 1114, 1114, 1115, 1115, + 1116, 1116, 1117, 1117, 1106, 25, 1118, 1118, 1119, 1119, + 1120, 1120, 1121, 1121, 1106, 35, 1122, 1122, 1123, 1123, + 1113, 1113, 1113, 1113, 1124, 1124, 1125, 1125, 1106, 1106, + 1106, 1106, 1106, 1126, 1106, 1106, 1106, 1106, 1127, 1106, + 1128, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1129, 1130, 1131, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1132, 1133, 1132, 1134, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1135, + + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1136, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1130, 1106, 1106, 1130, 1137, 1106, 1106, 1106, 1138, + 1106, 1130, 1106, 1139, 1106, 1139, 1106, 1140, 1106, 1141, + 1141, 1141, 1106, 1106, 1106, 1106, 1142, 1106, 1142, 1106, + 1106, 1106, 1106, 1106, 1106, 1143, 1106, 1143, 1106, 1144, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1145, 1106, 1106, 1106, 1146, 1146, + 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1147, + 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1106, + + 1106, 1148, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1149, + 1106, 1149, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1150, 1106, 1106, 1106, 1106, 1106, 1151, 1152, 1106, 1106, + 1106, 1106, 1153, 1151, 1154, 1155, 1106, 1156, 1106, 1106, + 1106, 1106, 1157, 1106, 1106, 1106, 1106, 1106, 1158, 1158, + 1159, 1106, 1106, 1160, 1106, 1106, 1106, 1161, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1162, 1106, 1106, 1106, 1163, + 1164, 1164, 1165, 1166, 1167, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1168, 1169, 1106, 1106, 1106, 1106, 1106, + + 1106, 1106, 1170, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1171, 1106, 1172, 1106, 1172, 1106, 1173, 1173, 1173, + 1106, 1106, 1174, 1106, 1174, 1106, 1106, 1106, 1106, 1175, + 1106, 1106, 1106, 1106, 1106, 1176, 1106, 1106, 1106, 1106, + 1177, 1106, 1106, 1106, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1106, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1179, 1106, 1106, 1106, + 1106, 1106, 1180, 1106, 1106, 1106, 1106, 1181, 1182, 1183, + 1106, 1106, 1106, 1106, 1106, 1106, 1184, 1181, 1185, 1186, + + 1106, 1186, 1106, 1187, 1106, 1187, 1106, 1106, 1188, 1188, + 1188, 1106, 1188, 1188, 1106, 1189, 1106, 1106, 1190, 1106, + 1106, 1106, 1106, 1191, 1106, 1192, 1193, 1106, 1106, 1194, + 1106, 1194, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1196, 1196, 1197, 1106, 1106, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1106, 1106, 1183, 1183, 1106, + + 1183, 1183, 1106, 1106, 1106, 1106, 1184, 1198, 1185, 1106, + 1106, 1188, 414, 412, 412, 1188, 414, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1195, 1196, 1196, 1106, 1106, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1106, 1106, 1106, 1106, 1106, 1183, + + 1183, 1106, 1106, 1106, 1198, 1198, 1198, 1106, 511, 511, + 1188, 414, 1188, 1188, 1188, 1106, 1106, 1106, 1106, 1106, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1196, 1196, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1106, 1106, 1106, + 1106, 1106, 1199, 1106, 1106, 1198, 1106, 1198, 1106, 1188, + + 1188, 1188, 1106, 1106, 1106, 1106, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1196, 1196, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1106, 1178, 1178, 1178, 1106, 1178, 1106, + 1106, 1106, 1106, 1199, 1106, 1199, 1106, 1106, 1106, 1106, + 1106, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + + 1195, 1195, 1195, 1195, 1195, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1106, 1106, 1106, 1106, 1106, 1106, 1178, 1178, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1200, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + + 1106, 1106, 1178, 1178, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1200, 1106, 1200, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1195, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1178, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1106, + 1106, 1106, 1106, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1106, 1106, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + + 1178, 1178, 1178, 1178, 1178, 0, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106 + + } ; + +static yyconst flex_int16_t yy_nxt[4060] = + { 0, + 50, 51, 52, 50, 53, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 50, 50, 50, 50, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 50, 50, 50, 50, 55, 56, 50, 57, 50, + 58, 50, 59, 50, 50, 50, 50, 50, 50, 50, + + 50, 60, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 50, 50, 50, 50, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 50, 50, 50, 63, 64, + 291, 65, 66, 83, 67, 84, 89, 68, 69, 70, + 70, 89, 1027, 70, 71, 86, 83, 992, 84, 50, + 72, 991, 87, 70, 93, 309, 94, 101, 102, 291, + + 103, 101, 102, 990, 103, 113, 989, 114, 119, 315, + 120, 121, 148, 119, 149, 120, 121, 115, 50, 73, + 74, 116, 116, 116, 116, 148, 90, 149, 91, 228, + 229, 90, 230, 91, 309, 93, 95, 94, 276, 124, + 125, 99, 126, 96, 97, 283, 98, 284, 75, 70, + 70, 76, 77, 316, 78, 66, 988, 67, 79, 122, + 68, 69, 70, 70, 122, 95, 70, 71, 124, 125, + 290, 126, 96, 80, 260, 261, 70, 95, 128, 201, + 129, 221, 202, 222, 96, 97, 117, 98, 410, 411, + 223, 130, 320, 415, 415, 203, 203, 203, 203, 987, + + 290, 201, 73, 74, 202, 81, 95, 221, 324, 222, + 325, 277, 225, 96, 226, 986, 223, 203, 203, 203, + 203, 320, 227, 232, 233, 324, 234, 325, 131, 132, + 133, 75, 70, 70, 104, 105, 106, 104, 107, 104, + 104, 104, 104, 104, 104, 104, 108, 104, 108, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 109, + 104, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 104, 104, 104, 104, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 104, 104, 104, 113, 128, + 114, 129, 291, 151, 235, 152, 263, 263, 985, 151, + 115, 152, 130, 153, 116, 116, 116, 116, 157, 153, + 158, 159, 157, 366, 158, 159, 225, 333, 226, 254, + 254, 291, 255, 401, 334, 402, 227, 265, 264, 266, + 319, 236, 267, 267, 267, 267, 290, 343, 344, 131, + 132, 133, 366, 154, 405, 155, 406, 298, 299, 154, + 300, 155, 305, 305, 305, 305, 431, 264, 432, 160, + 319, 236, 324, 160, 325, 984, 290, 343, 344, 117, + + 134, 134, 135, 134, 136, 137, 134, 134, 134, 138, + 134, 134, 134, 134, 134, 134, 134, 139, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 141, 140, 140, 140, 140, 140, + 140, 142, 143, 134, 144, 134, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 141, 140, 140, 140, 140, 140, 140, + 142, 145, 134, 146, 162, 163, 205, 164, 206, 162, + 163, 165, 164, 353, 211, 211, 165, 333, 216, 351, + + 166, 212, 212, 358, 334, 166, 379, 379, 379, 379, + 324, 217, 325, 352, 213, 213, 346, 359, 347, 360, + 315, 218, 348, 353, 214, 214, 219, 167, 371, 215, + 215, 376, 167, 358, 168, 169, 207, 170, 208, 168, + 169, 217, 170, 352, 213, 213, 346, 359, 347, 360, + 218, 348, 983, 214, 214, 219, 167, 371, 215, 215, + 376, 167, 982, 168, 316, 209, 981, 210, 168, 171, + 172, 173, 171, 174, 175, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 176, 177, + 171, 171, 171, 178, 171, 171, 179, 180, 181, 182, + + 183, 184, 185, 186, 187, 185, 185, 188, 189, 190, + 191, 192, 185, 193, 194, 195, 196, 197, 198, 185, + 199, 171, 171, 171, 171, 171, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 185, 185, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 185, 199, + 171, 171, 171, 205, 216, 206, 249, 250, 370, 251, + 263, 263, 452, 252, 354, 269, 270, 217, 271, 263, + 263, 453, 272, 456, 372, 263, 263, 218, 349, 356, + 364, 273, 219, 410, 411, 355, 350, 274, 370, 980, + 365, 452, 264, 373, 354, 374, 375, 217, 941, 357, + + 453, 264, 456, 207, 372, 208, 218, 264, 349, 356, + 364, 219, 387, 361, 355, 398, 350, 362, 235, 275, + 365, 264, 408, 373, 940, 374, 375, 425, 357, 939, + 264, 428, 209, 429, 210, 238, 264, 253, 228, 229, + 367, 230, 387, 361, 412, 398, 253, 362, 232, 233, + 368, 234, 408, 369, 239, 236, 240, 425, 240, 249, + 250, 428, 251, 429, 240, 938, 252, 240, 241, 242, + 367, 240, 243, 244, 410, 411, 937, 245, 298, 299, + 368, 300, 369, 936, 239, 236, 240, 935, 240, 445, + 446, 934, 390, 391, 240, 392, 933, 240, 241, 242, + + 240, 243, 244, 932, 390, 391, 245, 392, 246, 393, + 393, 393, 393, 390, 391, 931, 392, 413, 413, 445, + 446, 393, 393, 393, 393, 390, 391, 458, 392, 448, + 393, 393, 393, 393, 461, 394, 305, 305, 305, 305, + 253, 449, 393, 393, 393, 393, 450, 930, 462, 414, + 269, 270, 454, 271, 395, 464, 458, 272, 459, 448, + 451, 463, 460, 461, 394, 396, 273, 465, 929, 455, + 466, 449, 274, 468, 467, 469, 450, 462, 414, 470, + 471, 472, 454, 473, 395, 464, 474, 476, 459, 451, + 463, 480, 460, 482, 481, 396, 475, 465, 455, 485, + + 466, 486, 468, 467, 275, 469, 262, 262, 470, 471, + 472, 401, 473, 402, 410, 411, 474, 476, 401, 928, + 402, 480, 927, 482, 481, 475, 926, 497, 485, 504, + 486, 253, 433, 434, 435, 436, 437, 437, 438, 437, + 437, 437, 437, 439, 437, 437, 437, 440, 437, 437, + 441, 437, 442, 437, 437, 443, 437, 497, 504, 405, + 444, 406, 433, 434, 435, 436, 437, 437, 438, 437, + 437, 437, 437, 439, 437, 437, 437, 440, 437, 441, + 437, 442, 437, 437, 443, 437, 477, 483, 499, 500, + 478, 501, 505, 506, 484, 479, 379, 379, 379, 379, + + 508, 405, 431, 406, 432, 502, 502, 502, 502, 510, + 511, 925, 520, 512, 512, 924, 477, 483, 548, 923, + 478, 505, 922, 506, 484, 479, 487, 521, 488, 522, + 508, 489, 490, 503, 391, 921, 392, 491, 492, 510, + 410, 411, 520, 493, 494, 513, 523, 548, 495, 409, + 393, 393, 393, 393, 920, 496, 487, 521, 488, 522, + 919, 489, 490, 519, 519, 519, 519, 491, 492, 431, + 914, 432, 493, 494, 513, 913, 523, 495, 409, 409, + 861, 409, 409, 409, 409, 409, 409, 409, 409, 409, + 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, + + 409, 409, 409, 409, 409, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, + 410, 411, 860, 515, 409, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 409, + 409, 409, 516, 516, 546, 547, 524, 524, 524, 524, + 524, 524, 524, 524, 549, 558, 550, 599, 859, 600, + 524, 524, 858, 525, 526, 528, 533, 527, 551, 535, + 530, 857, 529, 534, 546, 547, 410, 411, 517, 517, + + 517, 517, 531, 549, 558, 532, 550, 517, 517, 517, + 517, 517, 517, 525, 526, 528, 533, 527, 551, 535, + 530, 529, 552, 534, 560, 553, 554, 555, 556, 856, + 557, 531, 410, 411, 532, 559, 855, 517, 517, 517, + 517, 517, 517, 1106, 561, 562, 563, 565, 536, 537, + 538, 539, 552, 560, 540, 553, 554, 555, 556, 541, + 557, 564, 567, 542, 568, 559, 543, 854, 544, 569, + 853, 545, 570, 561, 571, 562, 563, 565, 536, 537, + 538, 539, 572, 573, 540, 574, 575, 576, 577, 541, + 564, 578, 567, 542, 568, 543, 581, 544, 582, 569, + + 545, 579, 570, 583, 571, 584, 585, 580, 586, 587, + 606, 588, 572, 573, 589, 574, 575, 576, 577, 590, + 591, 578, 592, 593, 852, 594, 581, 582, 598, 851, + 595, 579, 583, 596, 597, 584, 585, 580, 586, 587, + 588, 500, 602, 600, 589, 503, 391, 603, 392, 590, + 591, 619, 592, 593, 594, 604, 499, 500, 598, 501, + 595, 608, 596, 597, 601, 500, 599, 501, 600, 410, + 411, 259, 602, 502, 502, 502, 502, 603, 410, 411, + 619, 502, 502, 502, 502, 604, 601, 500, 850, 501, + 607, 608, 409, 409, 848, 409, 409, 409, 409, 409, + + 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, + 409, 409, 409, 409, 409, 409, 409, 409, 409, 609, + 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, + 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, + 609, 609, 609, 609, 410, 411, 613, 610, 409, 609, + 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, + 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, + 609, 609, 609, 409, 409, 409, 611, 611, 616, 409, + 524, 524, 614, 614, 524, 524, 524, 845, 617, 618, + 623, 828, 696, 697, 524, 698, 524, 625, 621, 626, + + 622, 775, 629, 776, 817, 624, 524, 700, 616, 628, + 410, 411, 612, 612, 612, 612, 410, 411, 617, 618, + 623, 612, 612, 612, 612, 612, 612, 625, 621, 626, + 622, 524, 629, 627, 624, 806, 524, 524, 524, 628, + 409, 524, 630, 781, 632, 644, 643, 524, 524, 636, + 780, 612, 612, 612, 612, 612, 612, 615, 615, 615, + 615, 631, 627, 633, 634, 524, 615, 615, 615, 615, + 615, 615, 630, 524, 632, 644, 643, 779, 646, 636, + 524, 645, 647, 635, 524, 649, 524, 524, 650, 651, + 652, 631, 653, 633, 634, 637, 615, 615, 615, 615, + + 615, 615, 639, 638, 697, 640, 641, 642, 646, 654, + 645, 647, 656, 635, 649, 655, 658, 650, 657, 651, + 652, 659, 606, 660, 637, 661, 662, 692, 664, 665, + 669, 639, 667, 638, 640, 668, 641, 642, 670, 654, + 671, 672, 656, 673, 675, 655, 658, 657, 674, 676, + 677, 659, 660, 678, 661, 679, 662, 664, 680, 665, + 669, 667, 681, 683, 668, 682, 684, 670, 685, 687, + 671, 672, 686, 673, 675, 688, 690, 674, 676, 677, + 693, 689, 691, 678, 694, 679, 695, 703, 680, 701, + 701, 705, 681, 683, 682, 684, 524, 524, 685, 687, + + 706, 686, 607, 768, 524, 688, 690, 410, 411, 693, + 689, 524, 691, 524, 694, 695, 708, 703, 524, 710, + 705, 707, 524, 410, 411, 702, 702, 702, 702, 709, + 706, 711, 524, 712, 702, 702, 702, 702, 702, 702, + 714, 713, 524, 524, 524, 524, 708, 764, 710, 715, + 707, 716, 717, 524, 524, 775, 718, 776, 721, 709, + 524, 711, 524, 712, 702, 702, 702, 702, 702, 702, + 714, 713, 719, 723, 720, 524, 524, 524, 524, 715, + 724, 716, 717, 524, 722, 524, 718, 524, 721, 726, + 728, 752, 731, 732, 734, 727, 730, 748, 733, 736, + + 741, 738, 719, 723, 720, 725, 735, 729, 743, 740, + 724, 739, 742, 722, 744, 745, 746, 747, 749, 726, + 728, 731, 750, 732, 734, 727, 730, 733, 751, 736, + 741, 738, 753, 754, 725, 755, 735, 729, 740, 756, + 739, 757, 742, 744, 758, 745, 746, 747, 749, 759, + 761, 750, 760, 762, 763, 765, 766, 767, 751, 769, + 770, 753, 754, 771, 755, 772, 773, 777, 778, 756, + 757, 696, 697, 758, 698, 410, 411, 409, 524, 759, + 761, 760, 762, 524, 763, 765, 766, 767, 524, 769, + 770, 524, 771, 410, 411, 772, 773, 777, 778, 524, + + 782, 524, 786, 784, 783, 524, 524, 785, 524, 524, + 524, 524, 524, 787, 524, 791, 524, 524, 524, 363, + 363, 807, 793, 737, 795, 802, 524, 788, 796, 524, + 782, 786, 789, 784, 783, 790, 792, 785, 524, 797, + 524, 794, 798, 787, 524, 791, 799, 800, 524, 804, + 524, 807, 793, 808, 795, 802, 788, 803, 796, 805, + 811, 789, 801, 809, 790, 792, 812, 813, 797, 814, + 794, 815, 798, 810, 704, 816, 799, 800, 818, 804, + 819, 820, 808, 821, 822, 823, 825, 803, 824, 805, + 811, 826, 801, 809, 827, 829, 812, 813, 814, 830, + + 815, 831, 838, 810, 816, 839, 846, 775, 818, 776, + 819, 820, 849, 821, 822, 823, 825, 824, 847, 524, + 917, 826, 918, 827, 864, 829, 832, 833, 524, 830, + 831, 834, 838, 524, 835, 839, 846, 836, 840, 841, + 524, 849, 837, 842, 524, 878, 843, 524, 847, 844, + 863, 524, 862, 524, 864, 865, 832, 833, 524, 868, + 866, 834, 524, 524, 835, 524, 875, 836, 840, 841, + 876, 837, 872, 842, 878, 867, 843, 870, 524, 844, + 863, 862, 871, 880, 869, 865, 882, 873, 877, 868, + 866, 874, 879, 881, 409, 883, 875, 884, 699, 885, + + 876, 886, 872, 887, 867, 888, 870, 889, 890, 891, + 892, 871, 880, 869, 894, 882, 873, 895, 877, 896, + 902, 874, 879, 881, 883, 901, 893, 884, 885, 903, + 904, 886, 887, 905, 907, 888, 906, 889, 890, 891, + 892, 897, 692, 911, 894, 898, 895, 912, 899, 896, + 902, 915, 943, 908, 901, 893, 909, 524, 900, 903, + 904, 944, 946, 905, 907, 906, 910, 945, 947, 948, + 950, 897, 911, 949, 951, 898, 912, 952, 899, 953, + 915, 942, 943, 908, 954, 955, 909, 900, 956, 666, + 957, 944, 946, 958, 959, 910, 945, 960, 947, 948, + + 950, 961, 949, 962, 951, 963, 964, 952, 965, 953, + 942, 966, 967, 954, 968, 955, 969, 971, 956, 957, + 970, 972, 973, 958, 959, 974, 975, 960, 976, 979, + 961, 977, 917, 962, 918, 963, 964, 917, 965, 918, + 966, 967, 993, 994, 968, 995, 969, 971, 978, 970, + 996, 972, 973, 997, 974, 975, 998, 976, 979, 999, + 1000, 977, 1001, 663, 1002, 1003, 1004, 648, 1005, 1006, + 1007, 993, 1008, 994, 1009, 995, 1010, 978, 1011, 1012, + 996, 1013, 1014, 997, 1015, 1016, 998, 1017, 1018, 999, + 1000, 1019, 1001, 1002, 1003, 1020, 1004, 1005, 1021, 1006, + + 1007, 1008, 1022, 1009, 1025, 1010, 1023, 1026, 1011, 1012, + 1024, 1013, 1014, 1015, 1016, 1028, 1017, 1029, 1018, 1030, + 1031, 1019, 1032, 1033, 1034, 1020, 1035, 1036, 1021, 1037, + 1038, 1022, 1039, 1025, 1040, 1023, 1041, 1026, 1042, 1024, + 1043, 1044, 1045, 1046, 1047, 1028, 1048, 1029, 1030, 1049, + 1031, 1032, 1033, 1034, 1050, 1057, 1035, 1036, 1037, 1038, + 1051, 1052, 1039, 1053, 1040, 1054, 1041, 1055, 1042, 1056, + 1043, 1044, 1045, 1046, 1047, 1048, 1058, 1059, 1060, 1049, + 1061, 620, 1062, 1063, 1050, 1057, 1064, 1065, 1066, 1051, + 1052, 1067, 1053, 1068, 1054, 1069, 1055, 1070, 1056, 1071, + + 1072, 1073, 1074, 1075, 409, 1076, 1058, 1059, 1060, 1077, + 1061, 1062, 1078, 1063, 1079, 1080, 1064, 1065, 1066, 1081, + 1067, 1082, 1083, 1068, 1084, 1069, 1085, 1070, 1086, 1071, + 1072, 1073, 1074, 1075, 1076, 1087, 1088, 1089, 1077, 1090, + 1091, 1092, 1078, 1079, 1093, 1080, 1094, 566, 1095, 1081, + 1082, 1096, 1083, 1097, 1084, 1098, 1085, 1099, 1086, 1100, + 1101, 524, 1102, 1103, 1104, 1087, 1088, 1089, 1090, 1091, + 1105, 1092, 416, 1093, 416, 420, 1094, 1095, 391, 518, + 1096, 518, 1097, 378, 457, 1098, 342, 1099, 1100, 339, + 1101, 1102, 1103, 336, 1104, 301, 299, 301, 296, 286, + + 1105, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + + 100, 100, 100, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + + 147, 147, 147, 147, 147, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 161, + 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, + + 220, 220, 220, 220, 220, 220, 220, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 231, 231, 282, 231, 231, 423, + 422, 421, 231, 237, 237, 237, 237, 237, 237, 237, + 237, 237, 237, 237, 237, 237, 237, 237, 237, 248, + 248, 270, 248, 248, 420, 418, 417, 248, 259, 407, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 262, 254, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 268, 268, 268, 403, 268, 268, 250, 233, + + 229, 268, 280, 386, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 281, + 385, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, 384, 285, + 382, 285, 285, 295, 381, 380, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 303, 303, 378, 303, 303, 342, 340, 339, 303, 308, + 338, 308, 308, 308, 308, 308, 308, 308, 308, 308, + 308, 308, 308, 308, 308, 308, 311, 337, 311, 311, + + 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, + 317, 311, 311, 312, 336, 312, 335, 331, 312, 312, + 312, 312, 312, 329, 328, 327, 312, 314, 326, 314, + 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, + 314, 314, 314, 314, 318, 318, 322, 318, 318, 321, + 317, 313, 318, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 330, 307, 330, 310, 330, 330, 330, 330, 330, 330, + 330, 330, 330, 307, 330, 330, 330, 332, 306, 332, + 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, + + 332, 332, 332, 332, 341, 304, 341, 341, 341, 341, + 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, + 341, 345, 345, 302, 299, 345, 345, 377, 301, 377, + 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, + 377, 377, 377, 377, 383, 297, 383, 383, 383, 296, + 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, + 383, 231, 231, 294, 231, 231, 293, 292, 289, 231, + 388, 288, 388, 388, 388, 388, 388, 388, 388, 388, + 388, 388, 388, 388, 388, 388, 388, 389, 287, 389, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + + 389, 389, 389, 389, 397, 397, 286, 282, 279, 397, + 399, 399, 278, 270, 258, 399, 400, 400, 400, 400, + 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, + 400, 400, 400, 248, 248, 257, 248, 248, 256, 250, + 247, 248, 404, 404, 404, 404, 404, 404, 404, 404, + 404, 404, 404, 404, 404, 404, 404, 404, 404, 409, + 233, 409, 409, 409, 409, 409, 409, 409, 409, 409, + 409, 409, 409, 229, 409, 409, 259, 1106, 259, 259, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 419, 419, 111, 419, 419, 111, 1106, + + 1106, 419, 419, 424, 1106, 424, 424, 424, 424, 424, + 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, + 280, 1106, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 281, 1106, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 426, 1106, 426, 426, 426, 426, + 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + 426, 427, 1106, 427, 427, 427, 427, 427, 427, 427, + 427, 427, 427, 427, 427, 427, 427, 427, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, + + 1106, 285, 1106, 285, 285, 430, 430, 430, 430, 430, + 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, + 430, 430, 295, 1106, 1106, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 295, 295, 303, + 303, 1106, 303, 303, 1106, 1106, 1106, 303, 312, 1106, + 312, 1106, 1106, 312, 312, 312, 312, 312, 1106, 1106, + 1106, 312, 314, 1106, 314, 314, 314, 314, 314, 314, + 314, 314, 314, 314, 314, 314, 314, 314, 314, 318, + 318, 1106, 318, 318, 1106, 1106, 1106, 318, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + + 323, 323, 323, 323, 323, 330, 1106, 330, 1106, 330, + 330, 330, 330, 330, 330, 330, 330, 330, 1106, 330, + 330, 330, 447, 1106, 447, 447, 447, 447, 447, 447, + 447, 447, 447, 447, 447, 447, 447, 447, 447, 341, + 1106, 341, 341, 341, 341, 341, 341, 341, 341, 341, + 341, 341, 341, 341, 341, 341, 345, 345, 1106, 1106, + 345, 345, 377, 1106, 377, 377, 377, 377, 377, 377, + 377, 377, 377, 377, 377, 377, 377, 377, 377, 383, + 1106, 383, 383, 383, 1106, 383, 383, 383, 383, 383, + 383, 383, 383, 383, 383, 383, 388, 1106, 388, 388, + + 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, + 388, 388, 388, 389, 1106, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, + 498, 498, 498, 498, 498, 498, 498, 507, 507, 1106, + 507, 507, 1106, 1106, 1106, 507, 509, 509, 1106, 509, + 509, 1106, 1106, 1106, 509, 400, 400, 400, 400, 400, + 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, + 400, 400, 404, 404, 404, 404, 404, 404, 404, 404, + 404, 404, 404, 404, 404, 404, 404, 404, 404, 409, + + 1106, 409, 409, 409, 409, 409, 409, 409, 409, 409, + 409, 409, 409, 1106, 409, 409, 419, 419, 1106, 419, + 419, 1106, 1106, 1106, 419, 419, 424, 1106, 424, 424, + 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, + 424, 424, 424, 426, 1106, 426, 426, 426, 426, 426, + 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + 427, 1106, 427, 427, 427, 427, 427, 427, 427, 427, + 427, 427, 427, 427, 427, 427, 427, 430, 430, 430, + 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, + 430, 430, 430, 430, 437, 437, 437, 318, 318, 1106, + + 318, 318, 1106, 1106, 1106, 318, 447, 1106, 447, 447, + 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, + 447, 447, 447, 605, 1106, 605, 605, 605, 605, 605, + 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, + 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, + 774, 774, 774, 774, 774, 774, 774, 916, 916, 916, + 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, + 916, 916, 916, 916, 49, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106 + } ; + +static yyconst flex_int16_t yy_chk[4060] = + { 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, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, + 96, 3, 3, 5, 3, 5, 7, 3, 3, 3, + 3, 8, 992, 3, 3, 6, 6, 942, 6, 21, + 3, 941, 6, 3, 9, 126, 9, 11, 11, 96, + + 11, 12, 12, 940, 12, 17, 939, 17, 19, 138, + 19, 19, 27, 20, 27, 20, 20, 17, 22, 3, + 3, 17, 17, 17, 17, 28, 7, 28, 7, 51, + 51, 8, 51, 8, 126, 10, 9, 10, 79, 21, + 21, 10, 21, 9, 9, 87, 9, 87, 3, 3, + 3, 4, 4, 138, 4, 4, 938, 4, 4, 19, + 4, 4, 4, 4, 20, 9, 4, 4, 22, 22, + 95, 22, 9, 4, 73, 73, 4, 10, 23, 37, + 23, 45, 37, 45, 10, 10, 17, 10, 259, 259, + 45, 23, 142, 263, 263, 37, 37, 37, 37, 937, + + 95, 38, 4, 4, 38, 4, 10, 46, 147, 46, + 147, 79, 47, 10, 47, 936, 46, 38, 38, 38, + 38, 142, 47, 55, 55, 149, 55, 149, 23, 23, + 23, 4, 4, 4, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 18, 24, + 18, 24, 168, 29, 58, 29, 74, 74, 935, 30, + 18, 30, 24, 29, 18, 18, 18, 18, 31, 30, + 31, 31, 32, 191, 32, 32, 48, 162, 48, 67, + 67, 168, 67, 246, 162, 246, 48, 75, 74, 75, + 141, 58, 75, 75, 75, 75, 167, 176, 177, 24, + 24, 24, 191, 29, 253, 29, 253, 105, 105, 30, + 105, 30, 116, 116, 116, 116, 294, 74, 294, 31, + 141, 58, 323, 32, 323, 934, 167, 176, 177, 18, + + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 33, 33, 39, 33, 39, 34, + 34, 33, 34, 182, 41, 42, 34, 333, 43, 181, + + 33, 41, 42, 186, 333, 34, 203, 203, 203, 203, + 325, 43, 325, 181, 41, 42, 179, 187, 179, 188, + 314, 43, 179, 182, 41, 42, 43, 33, 194, 41, + 42, 199, 34, 186, 33, 33, 39, 33, 39, 34, + 34, 43, 34, 181, 41, 42, 179, 187, 179, 188, + 43, 179, 933, 41, 42, 43, 33, 194, 41, 42, + 199, 34, 932, 33, 314, 39, 931, 39, 34, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 40, 44, 40, 63, 63, 193, 63, + 122, 122, 347, 63, 183, 76, 76, 44, 76, 125, + 125, 348, 76, 350, 195, 132, 132, 44, 180, 184, + 190, 76, 44, 409, 409, 183, 180, 76, 193, 930, + 190, 347, 122, 196, 183, 197, 198, 44, 873, 184, + + 348, 125, 350, 40, 195, 40, 44, 132, 180, 184, + 190, 44, 236, 189, 183, 244, 180, 189, 235, 76, + 190, 122, 258, 196, 872, 197, 198, 278, 184, 871, + 125, 290, 40, 291, 40, 59, 132, 63, 228, 228, + 192, 228, 236, 189, 260, 244, 76, 189, 232, 232, + 192, 232, 258, 192, 59, 235, 59, 278, 59, 249, + 249, 290, 249, 291, 59, 870, 249, 59, 59, 59, + 192, 59, 59, 59, 260, 260, 869, 59, 298, 298, + 192, 298, 192, 868, 59, 235, 59, 867, 59, 319, + 320, 866, 239, 239, 59, 239, 865, 59, 59, 59, + + 59, 59, 59, 864, 240, 240, 59, 240, 59, 239, + 239, 239, 239, 241, 241, 863, 241, 261, 261, 319, + 320, 240, 240, 240, 240, 242, 242, 352, 242, 343, + 241, 241, 241, 241, 354, 239, 305, 305, 305, 305, + 249, 344, 242, 242, 242, 242, 346, 862, 355, 261, + 269, 269, 349, 269, 241, 357, 352, 269, 353, 343, + 346, 356, 353, 354, 239, 242, 269, 358, 861, 349, + 359, 344, 269, 360, 359, 361, 346, 355, 261, 362, + 364, 366, 349, 367, 241, 357, 368, 369, 353, 346, + 356, 371, 353, 372, 371, 242, 368, 358, 349, 374, + + 359, 375, 360, 359, 269, 361, 415, 415, 362, 364, + 366, 400, 367, 400, 614, 614, 368, 369, 402, 860, + 402, 371, 859, 372, 371, 368, 858, 387, 374, 394, + 375, 269, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 387, 394, 404, + 307, 404, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 370, 373, 390, 390, + 370, 390, 395, 396, 373, 370, 379, 379, 379, 379, + + 398, 406, 430, 406, 430, 390, 390, 390, 390, 408, + 410, 857, 423, 411, 411, 856, 370, 373, 448, 855, + 370, 395, 854, 396, 373, 370, 376, 425, 376, 428, + 398, 376, 376, 393, 393, 853, 393, 376, 376, 408, + 410, 410, 423, 376, 376, 411, 429, 448, 376, 411, + 393, 393, 393, 393, 852, 376, 376, 425, 376, 428, + 851, 376, 376, 420, 420, 420, 420, 376, 376, 432, + 847, 432, 376, 376, 411, 846, 429, 376, 412, 412, + 792, 412, 412, 412, 412, 412, 412, 412, 412, 412, + 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, + + 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, + 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, + 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, + 412, 412, 791, 412, 412, 412, 412, 412, 412, 412, + 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, + 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, + 412, 412, 413, 413, 445, 446, 441, 433, 434, 435, + 438, 439, 436, 442, 449, 459, 450, 498, 790, 498, + 440, 443, 789, 433, 434, 436, 441, 435, 451, 443, + 439, 788, 438, 442, 445, 446, 413, 413, 414, 414, + + 414, 414, 440, 449, 459, 440, 450, 414, 414, 414, + 414, 414, 414, 433, 434, 436, 441, 435, 451, 443, + 439, 438, 452, 442, 462, 453, 454, 455, 456, 787, + 458, 440, 414, 414, 440, 460, 786, 414, 414, 414, + 414, 414, 414, 444, 463, 464, 465, 467, 444, 444, + 444, 444, 452, 462, 444, 453, 454, 455, 456, 444, + 458, 466, 469, 444, 470, 460, 444, 785, 444, 471, + 784, 444, 472, 463, 473, 464, 465, 467, 444, 444, + 444, 444, 474, 475, 444, 476, 477, 478, 479, 444, + 466, 480, 469, 444, 470, 444, 482, 444, 483, 471, + + 444, 481, 472, 484, 473, 485, 486, 481, 487, 488, + 508, 489, 474, 475, 490, 476, 477, 478, 479, 491, + 492, 480, 493, 494, 783, 495, 482, 483, 497, 782, + 496, 481, 484, 496, 496, 485, 486, 481, 487, 488, + 489, 501, 504, 501, 490, 503, 503, 505, 503, 491, + 492, 523, 493, 494, 495, 506, 499, 499, 497, 499, + 496, 510, 496, 496, 502, 502, 600, 502, 600, 613, + 613, 613, 504, 499, 499, 499, 499, 505, 615, 615, + 523, 502, 502, 502, 502, 506, 601, 601, 780, 601, + 508, 510, 511, 511, 773, 511, 511, 511, 511, 511, + + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 514, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 512, 512, 520, 514, + 525, 527, 516, 516, 532, 526, 528, 770, 521, 522, + 526, 758, 607, 607, 529, 607, 531, 528, 525, 529, + + 525, 693, 532, 693, 744, 527, 530, 609, 520, 531, + 512, 512, 513, 513, 513, 513, 516, 516, 521, 522, + 526, 513, 513, 513, 513, 513, 513, 528, 525, 529, + 525, 535, 532, 530, 527, 733, 539, 533, 545, 531, + 609, 534, 533, 704, 535, 546, 545, 536, 537, 539, + 703, 513, 513, 513, 513, 513, 513, 517, 517, 517, + 517, 534, 530, 536, 537, 538, 517, 517, 517, 517, + 517, 517, 533, 540, 535, 546, 545, 699, 550, 539, + 542, 547, 551, 538, 541, 553, 543, 544, 554, 555, + 556, 534, 557, 536, 537, 540, 517, 517, 517, 517, + + 517, 517, 542, 541, 698, 542, 543, 544, 550, 557, + 547, 551, 558, 538, 553, 557, 560, 554, 559, 555, + 556, 563, 606, 564, 540, 565, 566, 692, 569, 570, + 574, 542, 572, 541, 542, 573, 543, 544, 576, 557, + 577, 578, 558, 579, 581, 557, 560, 559, 580, 582, + 583, 563, 564, 584, 565, 586, 566, 569, 587, 570, + 574, 572, 588, 590, 573, 589, 591, 576, 592, 594, + 577, 578, 593, 579, 581, 595, 596, 580, 582, 583, + 602, 595, 597, 584, 603, 586, 604, 616, 587, 611, + 611, 618, 588, 590, 589, 591, 621, 624, 592, 594, + + 619, 593, 606, 686, 622, 595, 596, 701, 701, 602, + 595, 623, 597, 626, 603, 604, 622, 616, 625, 624, + 618, 621, 628, 611, 611, 612, 612, 612, 612, 623, + 619, 625, 627, 626, 612, 612, 612, 612, 612, 612, + 628, 627, 629, 631, 630, 632, 622, 682, 624, 629, + 621, 630, 631, 634, 633, 774, 632, 774, 634, 623, + 635, 625, 636, 626, 612, 612, 612, 612, 612, 612, + 628, 627, 633, 636, 633, 637, 639, 640, 638, 629, + 637, 630, 631, 643, 635, 641, 632, 642, 634, 639, + 641, 668, 644, 645, 648, 640, 643, 664, 647, 650, + + 655, 653, 633, 636, 633, 638, 648, 642, 658, 654, + 637, 653, 657, 635, 659, 661, 662, 663, 665, 639, + 641, 644, 666, 645, 648, 640, 643, 647, 667, 650, + 655, 653, 669, 670, 638, 671, 648, 642, 654, 673, + 653, 674, 657, 659, 675, 661, 662, 663, 665, 676, + 679, 666, 678, 680, 681, 683, 684, 685, 667, 687, + 688, 669, 670, 689, 671, 690, 691, 694, 695, 673, + 674, 696, 696, 675, 696, 700, 700, 700, 711, 676, + 679, 678, 680, 707, 681, 683, 684, 685, 709, 687, + 688, 710, 689, 702, 702, 690, 691, 694, 695, 708, + + 707, 712, 711, 709, 708, 713, 716, 710, 714, 718, + 721, 715, 720, 712, 717, 716, 719, 722, 727, 1147, + 1147, 734, 718, 652, 720, 727, 724, 713, 721, 723, + 707, 711, 714, 709, 708, 715, 717, 710, 725, 722, + 729, 719, 723, 712, 726, 716, 724, 725, 730, 729, + 728, 734, 718, 735, 720, 727, 713, 728, 721, 730, + 738, 714, 726, 737, 715, 717, 739, 740, 722, 741, + 719, 742, 723, 737, 617, 743, 724, 725, 745, 729, + 746, 747, 735, 748, 749, 750, 752, 728, 751, 730, + 738, 754, 726, 737, 756, 760, 739, 740, 741, 761, + + 742, 762, 765, 737, 743, 767, 771, 776, 745, 776, + 746, 747, 778, 748, 749, 750, 752, 751, 772, 795, + 849, 754, 849, 756, 795, 760, 764, 764, 793, 761, + 762, 764, 765, 794, 764, 767, 771, 764, 768, 768, + 796, 778, 764, 768, 797, 809, 768, 799, 772, 768, + 794, 798, 793, 801, 795, 796, 764, 764, 802, 799, + 797, 764, 800, 803, 764, 804, 806, 764, 768, 768, + 807, 764, 803, 768, 809, 798, 768, 801, 805, 768, + 794, 793, 802, 811, 800, 796, 814, 804, 808, 799, + 797, 805, 810, 812, 610, 816, 806, 817, 608, 818, + + 807, 819, 803, 820, 798, 821, 801, 823, 825, 826, + 828, 802, 811, 800, 832, 814, 804, 833, 808, 834, + 837, 805, 810, 812, 816, 836, 828, 817, 818, 838, + 839, 819, 820, 840, 842, 821, 841, 823, 825, 826, + 828, 835, 598, 844, 832, 835, 833, 845, 835, 834, + 837, 848, 875, 843, 836, 828, 843, 874, 835, 838, + 839, 876, 878, 840, 842, 841, 843, 877, 879, 880, + 883, 835, 844, 881, 884, 835, 845, 885, 835, 886, + 848, 874, 875, 843, 888, 889, 843, 835, 890, 571, + 891, 876, 878, 892, 893, 843, 877, 894, 879, 880, + + 883, 895, 881, 897, 884, 898, 899, 885, 900, 886, + 874, 901, 902, 888, 904, 889, 905, 908, 890, 891, + 906, 909, 910, 892, 893, 911, 912, 894, 913, 915, + 895, 914, 916, 897, 916, 898, 899, 918, 900, 918, + 901, 902, 943, 944, 904, 945, 905, 908, 914, 906, + 946, 909, 910, 947, 911, 912, 948, 913, 915, 949, + 950, 914, 951, 568, 952, 953, 954, 552, 955, 956, + 958, 943, 959, 944, 960, 945, 961, 914, 962, 963, + 946, 964, 965, 947, 967, 969, 948, 970, 971, 949, + 950, 972, 951, 952, 953, 973, 954, 955, 975, 956, + + 958, 959, 976, 960, 978, 961, 977, 979, 962, 963, + 977, 964, 965, 967, 969, 993, 970, 994, 971, 995, + 996, 972, 997, 998, 999, 973, 1001, 1002, 975, 1004, + 1005, 976, 1006, 978, 1007, 977, 1008, 979, 1009, 977, + 1010, 1012, 1016, 1017, 1018, 993, 1021, 994, 995, 1022, + 996, 997, 998, 999, 1023, 1031, 1001, 1002, 1004, 1005, + 1024, 1025, 1006, 1026, 1007, 1028, 1008, 1029, 1009, 1030, + 1010, 1012, 1016, 1017, 1018, 1021, 1032, 1033, 1034, 1022, + 1037, 524, 1039, 1041, 1023, 1031, 1044, 1047, 1048, 1024, + 1025, 1049, 1026, 1050, 1028, 1051, 1029, 1052, 1030, 1053, + + 1054, 1055, 1056, 1058, 515, 1059, 1032, 1033, 1034, 1060, + 1037, 1039, 1061, 1041, 1063, 1067, 1044, 1047, 1048, 1068, + 1049, 1069, 1070, 1050, 1072, 1051, 1073, 1052, 1074, 1053, + 1054, 1055, 1056, 1058, 1059, 1075, 1076, 1077, 1060, 1078, + 1081, 1083, 1061, 1063, 1084, 1067, 1085, 468, 1086, 1068, + 1069, 1087, 1070, 1088, 1072, 1090, 1073, 1093, 1074, 1094, + 1097, 437, 1098, 1099, 1102, 1075, 1076, 1077, 1078, 1081, + 1103, 1083, 1160, 1084, 1160, 419, 1085, 1086, 392, 1189, + 1087, 1189, 1088, 377, 351, 1090, 341, 1093, 1094, 339, + 1097, 1098, 1099, 334, 1102, 301, 300, 299, 296, 285, + + 1103, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, + 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1108, 1108, + 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, + 1108, 1108, 1108, 1108, 1108, 1109, 1109, 1109, 1109, 1109, + 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, + 1109, 1109, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1111, + 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, + 1111, 1111, 1111, 1111, 1111, 1111, 1112, 1112, 1112, 1112, + 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, + + 1112, 1112, 1112, 1113, 1113, 1113, 1113, 1113, 1113, 1113, + 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, + 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, + 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1115, 1115, 1115, + 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, + 1115, 1115, 1115, 1115, 1116, 1116, 1116, 1116, 1116, 1116, + 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, + 1116, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, + 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1118, 1118, + 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, + + 1118, 1118, 1118, 1118, 1118, 1119, 1119, 1119, 1119, 1119, + 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, + 1119, 1119, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, + 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1121, + 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, + 1121, 1121, 1121, 1121, 1121, 1121, 1122, 1122, 1122, 1122, + 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, + 1122, 1122, 1122, 1123, 1123, 1123, 1123, 1123, 1123, 1123, + 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, + 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, + + 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, + 1125, 1125, 1125, 1125, 1126, 1126, 282, 1126, 1126, 274, + 273, 272, 1126, 1127, 1127, 1127, 1127, 1127, 1127, 1127, + 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1128, + 1128, 271, 1128, 1128, 268, 266, 265, 1128, 1129, 256, + 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, + 1129, 1129, 1129, 1129, 1129, 1130, 255, 1130, 1130, 1130, + 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, + 1130, 1130, 1131, 1131, 1131, 252, 1131, 1131, 251, 234, + + 230, 1131, 1132, 227, 1132, 1132, 1132, 1132, 1132, 1132, + 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1133, + 226, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, + 1133, 1133, 1133, 1133, 1133, 1133, 1134, 1134, 1134, 1134, + 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 222, 1134, + 208, 1134, 1134, 1135, 207, 206, 1135, 1135, 1135, 1135, + 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, + 1136, 1136, 202, 1136, 1136, 175, 174, 172, 1136, 1137, + 170, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, + 1137, 1137, 1137, 1137, 1137, 1137, 1138, 169, 1138, 1138, + + 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, + 166, 1138, 1138, 1139, 165, 1139, 164, 158, 1139, 1139, + 1139, 1139, 1139, 155, 154, 153, 1139, 1140, 152, 1140, + 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, + 1140, 1140, 1140, 1140, 1141, 1141, 144, 1141, 1141, 143, + 139, 136, 1141, 1142, 1142, 1142, 1142, 1142, 1142, 1142, + 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, + 1143, 131, 1143, 129, 1143, 1143, 1143, 1143, 1143, 1143, + 1143, 1143, 1143, 124, 1143, 1143, 1143, 1144, 120, 1144, + 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, + + 1144, 1144, 1144, 1144, 1145, 114, 1145, 1145, 1145, 1145, + 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, + 1145, 1146, 1146, 109, 107, 1146, 1146, 1148, 106, 1148, + 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, + 1148, 1148, 1148, 1148, 1149, 103, 1149, 1149, 1149, 101, + 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, + 1149, 1150, 1150, 99, 1150, 1150, 98, 97, 94, 1150, + 1151, 91, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, + 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1152, 90, 1152, + 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, + + 1152, 1152, 1152, 1152, 1153, 1153, 88, 86, 84, 1153, + 1154, 1154, 80, 78, 72, 1154, 1155, 1155, 1155, 1155, + 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, + 1155, 1155, 1155, 1156, 1156, 71, 1156, 1156, 68, 65, + 60, 1156, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, + 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1158, + 57, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, + 1158, 1158, 1158, 53, 1158, 1158, 1159, 49, 1159, 1159, + 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + 1159, 1159, 1159, 1161, 1161, 16, 1161, 1161, 15, 0, + + 0, 1161, 1161, 1162, 0, 1162, 1162, 1162, 1162, 1162, + 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, + 1163, 0, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, + 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1164, 0, 1164, + 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, + 1164, 1164, 1164, 1164, 1165, 0, 1165, 1165, 1165, 1165, + 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, + 1165, 1166, 0, 1166, 1166, 1166, 1166, 1166, 1166, 1166, + 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + + 0, 1167, 0, 1167, 1167, 1168, 1168, 1168, 1168, 1168, + 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, + 1168, 1168, 1169, 0, 0, 1169, 1169, 1169, 1169, 1169, + 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1170, + 1170, 0, 1170, 1170, 0, 0, 0, 1170, 1171, 0, + 1171, 0, 0, 1171, 1171, 1171, 1171, 1171, 0, 0, + 0, 1171, 1172, 0, 1172, 1172, 1172, 1172, 1172, 1172, + 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1173, + 1173, 0, 1173, 1173, 0, 0, 0, 1173, 1174, 1174, + 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, + + 1174, 1174, 1174, 1174, 1174, 1175, 0, 1175, 0, 1175, + 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 0, 1175, + 1175, 1175, 1176, 0, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1177, + 0, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, + 1177, 1177, 1177, 1177, 1177, 1177, 1178, 1178, 0, 0, + 1178, 1178, 1179, 0, 1179, 1179, 1179, 1179, 1179, 1179, + 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1180, + 0, 1180, 1180, 1180, 0, 1180, 1180, 1180, 1180, 1180, + 1180, 1180, 1180, 1180, 1180, 1180, 1181, 0, 1181, 1181, + + 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, + 1181, 1181, 1181, 1182, 0, 1182, 1182, 1182, 1182, 1182, + 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, + 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, + 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1184, 1184, 0, + 1184, 1184, 0, 0, 0, 1184, 1185, 1185, 0, 1185, + 1185, 0, 0, 0, 1185, 1186, 1186, 1186, 1186, 1186, + 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, + 1186, 1186, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, + 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1188, + + 0, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, + 1188, 1188, 1188, 0, 1188, 1188, 1190, 1190, 0, 1190, + 1190, 0, 0, 0, 1190, 1190, 1191, 0, 1191, 1191, + 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, + 1191, 1191, 1191, 1192, 0, 1192, 1192, 1192, 1192, 1192, + 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, + 1193, 0, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, + 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1194, 1194, 1194, + 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, + 1194, 1194, 1194, 1194, 1195, 1195, 1195, 1196, 1196, 0, + + 1196, 1196, 0, 0, 0, 1196, 1197, 0, 1197, 1197, + 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, + 1197, 1197, 1197, 1198, 0, 1198, 1198, 1198, 1198, 1198, + 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, + 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, + 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1200, 1200, 1200, + 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, + 1200, 1200, 1200, 1200, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106 + } ; + +extern int yy_flex_debug; +int yy_flex_debug = 0; + +static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; +static char *yy_full_match; +static int yy_lp; +#define REJECT \ +{ \ +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ +yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ +++(yy_lp); \ +goto find_rule; \ +} + +static int yy_more_flag = 0; +static int yy_more_len = 0; +#define yymore() ((yy_more_flag) = 1) +#define YY_MORE_ADJ (yy_more_len) +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "scan.l" +/* scan.l - scanner for flex input -*-C-*- */ +#line 4 "scan.l" +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" +#include "parse.h" +extern bool tablesverify, tablesext; +extern int trlcontxt; /* Set in parse.y for each rule. */ +extern const char *escaped_qstart, *escaped_qend; + +#define ACTION_ECHO add_action( yytext ) +#define ACTION_IFDEF(def, should_define) \ + { \ + if ( should_define ) \ + action_define( def, 1 ); \ + } + +#define ACTION_ECHO_QSTART add_action (escaped_qstart) +#define ACTION_ECHO_QEND add_action (escaped_qend) + +#define ACTION_M4_IFDEF(def, should_define) \ + do{ \ + if ( should_define ) \ + buf_m4_define( &m4defs_buf, def, NULL);\ + else \ + buf_m4_undefine( &m4defs_buf, def);\ + } while(0) + +#define MARK_END_OF_PROLOG mark_prolog(); + +#define YY_DECL \ + int flexscan() + +#define RETURNCHAR \ + yylval = (unsigned char) yytext[0]; \ + return CHAR; + +#define RETURNNAME \ + if(yyleng < MAXLINE) \ + { \ + strcpy( nmstr, yytext ); \ + } \ + else \ + { \ + synerr(_("Input line too long\n")); \ + FLEX_EXIT(EXIT_FAILURE); \ + } \ + return NAME; + +#define PUT_BACK_STRING(str, start) \ + for ( i = strlen( str ) - 1; i >= start; --i ) \ + unput((str)[i]) + +#define CHECK_REJECT(str) \ + if ( all_upper( str ) ) \ + reject = true; + +#define CHECK_YYMORE(str) \ + if ( all_lower( str ) ) \ + yymore_used = true; + +#define YY_USER_INIT \ + if ( getenv("POSIXLY_CORRECT") ) \ + posix_compat = true; + + + + + + + + +#line 1977 "scan.c" + +#define INITIAL 0 +#define SECT2 1 +#define SECT2PROLOG 2 +#define SECT3 3 +#define CODEBLOCK 4 +#define PICKUPDEF 5 +#define SC 6 +#define CARETISBOL 7 +#define NUM 8 +#define QUOTE 9 +#define FIRSTCCL 10 +#define CCL 11 +#define ACTION 12 +#define RECOVER 13 +#define COMMENT 14 +#define ACTION_STRING 15 +#define PERCENT_BRACE_ACTION 16 +#define OPTION 17 +#define LINEDIR 18 +#define CODEBLOCK_MATCH_BRACE 19 +#define GROUP_WITH_PARAMS 20 +#define GROUP_MINUS_PARAMS 21 +#define EXTENDED_COMMENT 22 +#define COMMENT_DISCARD 23 + +#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. + */ +#include <unistd.h> +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy (void ); + +int yyget_debug (void ); + +void yyset_debug (int debug_flag ); + +YY_EXTRA_TYPE yyget_extra (void ); + +void yyset_extra (YY_EXTRA_TYPE user_defined ); + +FILE *yyget_in (void ); + +void yyset_in (FILE * in_str ); + +FILE *yyget_out (void ); + +void yyset_out (FILE * out_str ); + +int yyget_leng (void ); + +char *yyget_text (void ); + +int yyget_lineno (void ); + +void yyset_lineno (int line_number ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (void ); +#else +extern int yywrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#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 + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + + static int yy_start_stack_ptr = 0; + static int yy_start_stack_depth = 0; + static int *yy_start_stack = NULL; + + static void yy_push_state (int new_state ); + + static void yy_pop_state (void ); + +/* 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 +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO fwrite( yytext, yyleng, 1, yyout ) +#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) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + int n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#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 +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (void); + +#define YY_DECL int yylex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * 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 + +#define YY_RULE_SETUP \ + if ( yyleng > 0 ) \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ + (yytext[yyleng - 1] == '\n'); \ + YY_USER_ACTION + +/** 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; + +#line 131 "scan.l" + + static int bracelevel, didadef, indented_code; + static int doing_rule_action = false; + static int option_sense; + + int doing_codeblock = false; + int i, brace_depth=0, brace_start_line=0; + Char nmdef[MAXLINE]; + + +#line 2204 "scan.c" + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + /* Create the reject buffer large enough to save one state per allowed character. */ + if ( ! (yy_state_buf) ) + (yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE ); + if ( ! (yy_state_buf) ) + YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + (yy_more_len) = 0; + if ( (yy_more_flag) ) + { + (yy_more_len) = (yy_c_buf_p) - (yytext_ptr); + (yy_more_flag) = 0; + } + yy_cp = (yy_c_buf_p); + + /* Support of yytext. */ + *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; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*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 >= 1107 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *(yy_state_ptr)++ = yy_current_state; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 3975 ); + +yy_find_action: + yy_current_state = *--(yy_state_ptr); + (yy_lp) = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[(yy_lp)]; + { + (yy_full_match) = yy_cp; + break; + } + } + --yy_cp; + yy_current_state = *--(yy_state_ptr); + (yy_lp) = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + +case 1: +YY_RULE_SETUP +#line 142 "scan.l" +indented_code = true; BEGIN(CODEBLOCK); + YY_BREAK +case 2: +YY_RULE_SETUP +#line 143 "scan.l" +ACTION_ECHO; yy_push_state( COMMENT ); + YY_BREAK +case 3: +YY_RULE_SETUP +#line 144 "scan.l" +yy_push_state( LINEDIR ); + YY_BREAK +case 4: +YY_RULE_SETUP +#line 145 "scan.l" +return SCDECL; + YY_BREAK +case 5: +YY_RULE_SETUP +#line 146 "scan.l" +return XSCDECL; + YY_BREAK +case 6: +/* rule 6 can match eol */ +YY_RULE_SETUP +#line 147 "scan.l" +{ + ++linenum; + line_directive_out( (FILE *) 0, 1 ); + indented_code = false; + BEGIN(CODEBLOCK); + } + YY_BREAK +case 7: +/* rule 7 can match eol */ +YY_RULE_SETUP +#line 153 "scan.l" +{ + brace_start_line = linenum; + ++linenum; + buf_linedir( &top_buf, infilename?infilename:"<stdin>", linenum); + brace_depth = 1; + yy_push_state(CODEBLOCK_MATCH_BRACE); + } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 161 "scan.l" +synerr( _("malformed '%top' directive") ); + YY_BREAK +case 9: +YY_RULE_SETUP +#line 163 "scan.l" +/* discard */ + YY_BREAK +case 10: +YY_RULE_SETUP +#line 165 "scan.l" +{ + sectnum = 2; + bracelevel = 0; + mark_defs1(); + line_directive_out( (FILE *) 0, 1 ); + BEGIN(SECT2PROLOG); + return SECTEND; + } + YY_BREAK +case 11: +/* rule 11 can match eol */ +YY_RULE_SETUP +#line 174 "scan.l" +yytext_is_array = false; ++linenum; + YY_BREAK +case 12: +/* rule 12 can match eol */ +YY_RULE_SETUP +#line 175 "scan.l" +yytext_is_array = true; ++linenum; + YY_BREAK +case 13: +YY_RULE_SETUP +#line 177 "scan.l" +BEGIN(OPTION); return OPTION_OP; + YY_BREAK +case 14: +/* rule 14 can match eol */ +YY_RULE_SETUP +#line 179 "scan.l" +++linenum; /* ignore */ + YY_BREAK +case 15: +/* rule 15 can match eol */ +YY_RULE_SETUP +#line 180 "scan.l" +++linenum; /* ignore */ + YY_BREAK +/* xgettext: no-c-format */ +case 16: +/* rule 16 can match eol */ +YY_RULE_SETUP +#line 183 "scan.l" +synerr( _( "unrecognized '%' directive" ) ); + YY_BREAK +case 17: +YY_RULE_SETUP +#line 185 "scan.l" +{ + if(yyleng < MAXLINE) + { + strcpy( nmstr, yytext ); + } + else + { + synerr( _("Input line too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } + + didadef = false; + BEGIN(PICKUPDEF); + } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 200 "scan.l" +RETURNNAME; + YY_BREAK +case 19: +/* rule 19 can match eol */ +YY_RULE_SETUP +#line 201 "scan.l" +++linenum; /* allows blank lines in section 1 */ + YY_BREAK +case 20: +/* rule 20 can match eol */ +YY_RULE_SETUP +#line 202 "scan.l" +ACTION_ECHO; ++linenum; /* maybe end of comment line */ + YY_BREAK + + +case 21: +YY_RULE_SETUP +#line 207 "scan.l" +ACTION_ECHO; yy_pop_state(); + YY_BREAK +case 22: +YY_RULE_SETUP +#line 208 "scan.l" +ACTION_ECHO; + YY_BREAK +case 23: +YY_RULE_SETUP +#line 209 "scan.l" +ACTION_ECHO_QSTART; + YY_BREAK +case 24: +YY_RULE_SETUP +#line 210 "scan.l" +ACTION_ECHO_QEND; + YY_BREAK +case 25: +YY_RULE_SETUP +#line 211 "scan.l" +ACTION_ECHO; + YY_BREAK +case 26: +/* rule 26 can match eol */ +YY_RULE_SETUP +#line 212 "scan.l" +++linenum; ACTION_ECHO; + YY_BREAK + + +/* This is the same as COMMENT, but is discarded rather than output. */ +case 27: +YY_RULE_SETUP +#line 217 "scan.l" +yy_pop_state(); + YY_BREAK +case 28: +YY_RULE_SETUP +#line 218 "scan.l" +; + YY_BREAK +case 29: +YY_RULE_SETUP +#line 219 "scan.l" +; + YY_BREAK +case 30: +/* rule 30 can match eol */ +YY_RULE_SETUP +#line 220 "scan.l" +++linenum; + YY_BREAK + + +case 31: +YY_RULE_SETUP +#line 224 "scan.l" +yy_pop_state(); + YY_BREAK +case 32: +YY_RULE_SETUP +#line 225 "scan.l" +; + YY_BREAK +case 33: +/* rule 33 can match eol */ +YY_RULE_SETUP +#line 226 "scan.l" +++linenum; + YY_BREAK + + +case 34: +/* rule 34 can match eol */ +YY_RULE_SETUP +#line 230 "scan.l" +yy_pop_state(); + YY_BREAK +case 35: +YY_RULE_SETUP +#line 231 "scan.l" +linenum = myctoi( yytext ); + YY_BREAK +case 36: +YY_RULE_SETUP +#line 233 "scan.l" +{ + flex_free( (void *) infilename ); + infilename = copy_string( yytext + 1 ); + infilename[strlen( infilename ) - 1] = '\0'; + } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 238 "scan.l" +/* ignore spurious characters */ + YY_BREAK + + +case 38: +/* rule 38 can match eol */ +YY_RULE_SETUP +#line 242 "scan.l" +++linenum; BEGIN(INITIAL); + YY_BREAK +case 39: +YY_RULE_SETUP +#line 244 "scan.l" +ACTION_ECHO_QSTART; + YY_BREAK +case 40: +YY_RULE_SETUP +#line 245 "scan.l" +ACTION_ECHO_QEND; + YY_BREAK +case 41: +YY_RULE_SETUP +#line 246 "scan.l" +ACTION_ECHO; + YY_BREAK +case 42: +/* rule 42 can match eol */ +YY_RULE_SETUP +#line 248 "scan.l" +{ + ++linenum; + ACTION_ECHO; + if ( indented_code ) + BEGIN(INITIAL); + } + YY_BREAK + + +case 43: +YY_RULE_SETUP +#line 257 "scan.l" +{ + if( --brace_depth == 0){ + /* TODO: Matched. */ + yy_pop_state(); + }else + buf_strnappend(&top_buf, yytext, yyleng); + } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 265 "scan.l" +{ + brace_depth++; + buf_strnappend(&top_buf, yytext, yyleng); + } + YY_BREAK +case 45: +/* rule 45 can match eol */ +YY_RULE_SETUP +#line 270 "scan.l" +{ + ++linenum; + buf_strnappend(&top_buf, yytext, yyleng); + } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 275 "scan.l" +buf_strnappend(&top_buf, escaped_qstart, strlen(escaped_qstart)); + YY_BREAK +case 47: +YY_RULE_SETUP +#line 276 "scan.l" +buf_strnappend(&top_buf, escaped_qend, strlen(escaped_qend)); + YY_BREAK +case 48: +YY_RULE_SETUP +#line 278 "scan.l" +{ + buf_strnappend(&top_buf, yytext, yyleng); + } + YY_BREAK +case YY_STATE_EOF(CODEBLOCK_MATCH_BRACE): +#line 282 "scan.l" +{ + linenum = brace_start_line; + synerr(_("Unmatched '{'")); + yyterminate(); + } + YY_BREAK + + +case 49: +YY_RULE_SETUP +#line 291 "scan.l" +/* separates name and definition */ + YY_BREAK +case 50: +YY_RULE_SETUP +#line 293 "scan.l" +{ + if(yyleng < MAXLINE) + { + strcpy( (char *) nmdef, yytext ); + } + else + { + synerr( _("Input line too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } + /* Skip trailing whitespace. */ + for ( i = strlen( (char *) nmdef ) - 1; + i >= 0 && (nmdef[i] == ' ' || nmdef[i] == '\t'); + --i ) + ; + + nmdef[i + 1] = '\0'; + + ndinstal( nmstr, nmdef ); + didadef = true; + } + YY_BREAK +case 51: +/* rule 51 can match eol */ +YY_RULE_SETUP +#line 315 "scan.l" +{ + if ( ! didadef ) + synerr( _( "incomplete name definition" ) ); + BEGIN(INITIAL); + ++linenum; + } + YY_BREAK + + +case 52: +/* rule 52 can match eol */ +YY_RULE_SETUP +#line 325 "scan.l" +++linenum; BEGIN(INITIAL); + YY_BREAK +case 53: +YY_RULE_SETUP +#line 326 "scan.l" +option_sense = true; + YY_BREAK +case 54: +YY_RULE_SETUP +#line 328 "scan.l" +return '='; + YY_BREAK +case 55: +YY_RULE_SETUP +#line 330 "scan.l" +option_sense = ! option_sense; + YY_BREAK +case 56: +YY_RULE_SETUP +#line 332 "scan.l" +csize = option_sense ? 128 : 256; + YY_BREAK +case 57: +YY_RULE_SETUP +#line 333 "scan.l" +csize = option_sense ? 256 : 128; + YY_BREAK +case 58: +YY_RULE_SETUP +#line 335 "scan.l" +long_align = option_sense; + YY_BREAK +case 59: +YY_RULE_SETUP +#line 336 "scan.l" +{ + ACTION_M4_IFDEF( "M4""_YY_ALWAYS_INTERACTIVE", option_sense ); + interactive = option_sense; + } + YY_BREAK +case 60: +YY_RULE_SETUP +#line 340 "scan.l" +yytext_is_array = option_sense; + YY_BREAK +case 61: +YY_RULE_SETUP +#line 341 "scan.l" +ansi_func_defs = option_sense; + YY_BREAK +case 62: +YY_RULE_SETUP +#line 342 "scan.l" +ansi_func_protos = option_sense; + YY_BREAK +case 63: +YY_RULE_SETUP +#line 343 "scan.l" +backing_up_report = option_sense; + YY_BREAK +case 64: +YY_RULE_SETUP +#line 344 "scan.l" +interactive = ! option_sense; + YY_BREAK +case 65: +YY_RULE_SETUP +#line 345 "scan.l" +bison_bridge_lval = option_sense; + YY_BREAK +case 66: +YY_RULE_SETUP +#line 346 "scan.l" +{ if((bison_bridge_lloc = option_sense)) + bison_bridge_lval = true; + } + YY_BREAK +case 67: +YY_RULE_SETUP +#line 349 "scan.l" +C_plus_plus = option_sense; + YY_BREAK +case 68: +YY_RULE_SETUP +#line 350 "scan.l" +sf_set_case_ins(!option_sense); + YY_BREAK +case 69: +YY_RULE_SETUP +#line 351 "scan.l" +sf_set_case_ins(option_sense); + YY_BREAK +case 70: +YY_RULE_SETUP +#line 352 "scan.l" +ddebug = option_sense; + YY_BREAK +case 71: +YY_RULE_SETUP +#line 353 "scan.l" +spprdflt = ! option_sense; + YY_BREAK +case 72: +YY_RULE_SETUP +#line 354 "scan.l" +useecs = option_sense; + YY_BREAK +case 73: +YY_RULE_SETUP +#line 355 "scan.l" +{ + useecs = usemecs = false; + use_read = fullspd = true; + } + YY_BREAK +case 74: +YY_RULE_SETUP +#line 359 "scan.l" +{ + useecs = usemecs = false; + use_read = fulltbl = true; + } + YY_BREAK +case 75: +YY_RULE_SETUP +#line 363 "scan.l" +ACTION_IFDEF("YY_NO_INPUT", ! option_sense); + YY_BREAK +case 76: +YY_RULE_SETUP +#line 364 "scan.l" +interactive = option_sense; + YY_BREAK +case 77: +YY_RULE_SETUP +#line 365 "scan.l" +lex_compat = option_sense; + YY_BREAK +case 78: +YY_RULE_SETUP +#line 366 "scan.l" +posix_compat = option_sense; + YY_BREAK +case 79: +YY_RULE_SETUP +#line 367 "scan.l" +{ + ACTION_M4_IFDEF( "M4""_YY_MAIN", option_sense); + /* Override yywrap */ + if( option_sense == true ) + do_yywrap = false; + } + YY_BREAK +case 80: +YY_RULE_SETUP +#line 373 "scan.l" +usemecs = option_sense; + YY_BREAK +case 81: +YY_RULE_SETUP +#line 374 "scan.l" +{ + ACTION_M4_IFDEF( "M4""_YY_NEVER_INTERACTIVE", option_sense ); + interactive = !option_sense; + } + YY_BREAK +case 82: +YY_RULE_SETUP +#line 378 "scan.l" +performance_report += option_sense ? 1 : -1; + YY_BREAK +case 83: +YY_RULE_SETUP +#line 379 "scan.l" +yytext_is_array = ! option_sense; + YY_BREAK +case 84: +YY_RULE_SETUP +#line 380 "scan.l" +use_read = option_sense; + YY_BREAK +case 85: +YY_RULE_SETUP +#line 381 "scan.l" +reentrant = option_sense; + YY_BREAK +case 86: +YY_RULE_SETUP +#line 382 "scan.l" +reject_really_used = option_sense; + YY_BREAK +case 87: +YY_RULE_SETUP +#line 383 "scan.l" +ACTION_M4_IFDEF( "M4""_YY_STACK_USED", option_sense ); + YY_BREAK +case 88: +YY_RULE_SETUP +#line 384 "scan.l" +do_stdinit = option_sense; + YY_BREAK +case 89: +YY_RULE_SETUP +#line 385 "scan.l" +use_stdout = option_sense; + YY_BREAK +case 90: +YY_RULE_SETUP +#line 386 "scan.l" +ACTION_IFDEF("YY_NO_UNISTD_H", ! option_sense); + YY_BREAK +case 91: +YY_RULE_SETUP +#line 387 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_UNPUT", ! option_sense); + YY_BREAK +case 92: +YY_RULE_SETUP +#line 388 "scan.l" +printstats = option_sense; + YY_BREAK +case 93: +YY_RULE_SETUP +#line 389 "scan.l" +nowarn = ! option_sense; + YY_BREAK +case 94: +YY_RULE_SETUP +#line 390 "scan.l" +do_yylineno = option_sense; ACTION_M4_IFDEF("M4""_YY_USE_LINENO", option_sense); + YY_BREAK +case 95: +YY_RULE_SETUP +#line 391 "scan.l" +yymore_really_used = option_sense; + YY_BREAK +case 96: +YY_RULE_SETUP +#line 392 "scan.l" +do_yywrap = option_sense; + YY_BREAK +case 97: +YY_RULE_SETUP +#line 394 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_PUSH_STATE", ! option_sense); + YY_BREAK +case 98: +YY_RULE_SETUP +#line 395 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_POP_STATE", ! option_sense); + YY_BREAK +case 99: +YY_RULE_SETUP +#line 396 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_TOP_STATE", ! option_sense); + YY_BREAK +case 100: +YY_RULE_SETUP +#line 398 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BUFFER", ! option_sense); + YY_BREAK +case 101: +YY_RULE_SETUP +#line 399 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BYTES", ! option_sense); + YY_BREAK +case 102: +YY_RULE_SETUP +#line 400 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_SCAN_STRING", ! option_sense); + YY_BREAK +case 103: +YY_RULE_SETUP +#line 402 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_FLEX_ALLOC", ! option_sense); + YY_BREAK +case 104: +YY_RULE_SETUP +#line 403 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_FLEX_REALLOC", ! option_sense); + YY_BREAK +case 105: +YY_RULE_SETUP +#line 404 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_FLEX_FREE", ! option_sense); + YY_BREAK +case 106: +YY_RULE_SETUP +#line 406 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_GET_DEBUG", ! option_sense); + YY_BREAK +case 107: +YY_RULE_SETUP +#line 407 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_SET_DEBUG", ! option_sense); + YY_BREAK +case 108: +YY_RULE_SETUP +#line 408 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_GET_EXTRA", ! option_sense); + YY_BREAK +case 109: +YY_RULE_SETUP +#line 409 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_SET_EXTRA", ! option_sense); + YY_BREAK +case 110: +YY_RULE_SETUP +#line 410 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_GET_LENG", ! option_sense); + YY_BREAK +case 111: +YY_RULE_SETUP +#line 411 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_GET_TEXT", ! option_sense); + YY_BREAK +case 112: +YY_RULE_SETUP +#line 412 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_GET_LINENO", ! option_sense); + YY_BREAK +case 113: +YY_RULE_SETUP +#line 413 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_SET_LINENO", ! option_sense); + YY_BREAK +case 114: +YY_RULE_SETUP +#line 414 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_GET_IN", ! option_sense); + YY_BREAK +case 115: +YY_RULE_SETUP +#line 415 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_SET_IN", ! option_sense); + YY_BREAK +case 116: +YY_RULE_SETUP +#line 416 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_GET_OUT", ! option_sense); + YY_BREAK +case 117: +YY_RULE_SETUP +#line 417 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_SET_OUT", ! option_sense); + YY_BREAK +case 118: +YY_RULE_SETUP +#line 418 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_GET_LVAL", ! option_sense); + YY_BREAK +case 119: +YY_RULE_SETUP +#line 419 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_SET_LVAL", ! option_sense); + YY_BREAK +case 120: +YY_RULE_SETUP +#line 420 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_GET_LLOC", ! option_sense); + YY_BREAK +case 121: +YY_RULE_SETUP +#line 421 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_SET_LLOC", ! option_sense); + YY_BREAK +case 122: +YY_RULE_SETUP +#line 423 "scan.l" +return OPT_EXTRA_TYPE; + YY_BREAK +case 123: +YY_RULE_SETUP +#line 424 "scan.l" +return OPT_OUTFILE; + YY_BREAK +case 124: +YY_RULE_SETUP +#line 425 "scan.l" +return OPT_PREFIX; + YY_BREAK +case 125: +YY_RULE_SETUP +#line 426 "scan.l" +return OPT_YYCLASS; + YY_BREAK +case 126: +YY_RULE_SETUP +#line 427 "scan.l" +return OPT_HEADER; + YY_BREAK +case 127: +YY_RULE_SETUP +#line 428 "scan.l" +return OPT_TABLES; + YY_BREAK +case 128: +YY_RULE_SETUP +#line 429 "scan.l" +{ + tablesverify = option_sense; + if(!tablesext && option_sense) + tablesext = true; + } + YY_BREAK +case 129: +YY_RULE_SETUP +#line 436 "scan.l" +{ + if(yyleng-1 < MAXLINE) + { + strcpy( nmstr, yytext + 1 ); + } + else + { + synerr( _("Input line too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } + nmstr[strlen( nmstr ) - 1] = '\0'; + return NAME; + } + YY_BREAK +case 130: +YY_RULE_SETUP +#line 450 "scan.l" +{ + format_synerr( _( "unrecognized %%option: %s" ), + yytext ); + BEGIN(RECOVER); + } + YY_BREAK + +case 131: +/* rule 131 can match eol */ +YY_RULE_SETUP +#line 457 "scan.l" +++linenum; BEGIN(INITIAL); + YY_BREAK + +case 132: +YY_RULE_SETUP +#line 461 "scan.l" +++bracelevel; yyless( 2 ); /* eat only %{ */ + YY_BREAK +case 133: +YY_RULE_SETUP +#line 462 "scan.l" +--bracelevel; yyless( 2 ); /* eat only %} */ + YY_BREAK +case 134: +YY_RULE_SETUP +#line 464 "scan.l" +ACTION_ECHO; /* indented code in prolog */ + YY_BREAK +case 135: +YY_RULE_SETUP +#line 466 "scan.l" +{ /* non-indented code */ + if ( bracelevel <= 0 ) + { /* not in %{ ... %} */ + yyless( 0 ); /* put it all back */ + yy_set_bol( 1 ); + mark_prolog(); + BEGIN(SECT2); + } + else + ACTION_ECHO; + } + YY_BREAK +case 136: +YY_RULE_SETUP +#line 478 "scan.l" +ACTION_ECHO; + YY_BREAK +case 137: +/* rule 137 can match eol */ +YY_RULE_SETUP +#line 479 "scan.l" +++linenum; ACTION_ECHO; + YY_BREAK +case YY_STATE_EOF(SECT2PROLOG): +#line 481 "scan.l" +{ + mark_prolog(); + sectnum = 0; + yyterminate(); /* to stop the parser */ + } + YY_BREAK + + +case 138: +/* rule 138 can match eol */ +YY_RULE_SETUP +#line 489 "scan.l" +++linenum; /* allow blank lines in section 2 */ + YY_BREAK +case 139: +YY_RULE_SETUP +#line 491 "scan.l" +{ + indented_code = false; + doing_codeblock = true; + bracelevel = 1; + BEGIN(PERCENT_BRACE_ACTION); + } + YY_BREAK +case 140: +YY_RULE_SETUP +#line 498 "scan.l" +{ + /* Allow "<" to appear in (?x) patterns. */ + if (!sf_skip_ws()) + BEGIN(SC); + return '<'; + } + YY_BREAK +case 141: +YY_RULE_SETUP +#line 504 "scan.l" +return '^'; + YY_BREAK +case 142: +YY_RULE_SETUP +#line 505 "scan.l" +BEGIN(QUOTE); return '"'; + YY_BREAK +case 143: +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ +(yy_c_buf_p) = yy_cp = yy_bp + 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 506 "scan.l" +{ + BEGIN(NUM); + if ( lex_compat || posix_compat ) + return BEGIN_REPEAT_POSIX; + else + return BEGIN_REPEAT_FLEX; + } + YY_BREAK +case 144: +/* rule 144 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ +(yy_c_buf_p) = yy_cp = yy_bp + 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 513 "scan.l" +return '$'; + YY_BREAK +case 145: +YY_RULE_SETUP +#line 515 "scan.l" +{ + bracelevel = 1; + BEGIN(PERCENT_BRACE_ACTION); + + if ( in_rule ) + { + doing_rule_action = true; + in_rule = false; + return '\n'; + } + } + YY_BREAK +case 146: +/* rule 146 can match eol */ +YY_RULE_SETUP +#line 526 "scan.l" +{ + if (sf_skip_ws()){ + /* We're in the middle of a (?x: ) pattern. */ + /* Push back everything starting at the "|" */ + size_t amt; + amt = strchr (yytext, '|') - yytext; + yyless(amt); + } + else { + continued_action = true; + ++linenum; + return '\n'; + } + } + YY_BREAK +case 147: +YY_RULE_SETUP +#line 541 "scan.l" +{ + + if (sf_skip_ws()){ + /* We're in the middle of a (?x: ) pattern. */ + yy_push_state(COMMENT_DISCARD); + } + else{ + yyless( yyleng - 2 ); /* put back '/', '*' */ + bracelevel = 0; + continued_action = false; + BEGIN(ACTION); + } + } + YY_BREAK +case 148: +YY_RULE_SETUP +#line 555 "scan.l" +/* allow indented rules */ ; + YY_BREAK +case 149: +YY_RULE_SETUP +#line 557 "scan.l" +{ + if (sf_skip_ws()){ + /* We're in the middle of a (?x: ) pattern. */ + } + else{ + /* This rule is separate from the one below because + * otherwise we get variable trailing context, so + * we can't build the scanner using -{f,F}. + */ + bracelevel = 0; + continued_action = false; + BEGIN(ACTION); + + if ( in_rule ) + { + doing_rule_action = true; + in_rule = false; + return '\n'; + } + } + } + YY_BREAK +case 150: +/* rule 150 can match eol */ +YY_RULE_SETUP +#line 579 "scan.l" +{ + if (sf_skip_ws()){ + /* We're in the middle of a (?x: ) pattern. */ + ++linenum; + } + else{ + bracelevel = 0; + continued_action = false; + BEGIN(ACTION); + unput( '\n' ); /* so <ACTION> sees it */ + + if ( in_rule ) + { + doing_rule_action = true; + in_rule = false; + return '\n'; + } + } + } + YY_BREAK +case 151: +#line 600 "scan.l" +case 152: +YY_RULE_SETUP +#line 600 "scan.l" +return EOF_OP; + YY_BREAK +case 153: +YY_RULE_SETUP +#line 602 "scan.l" +{ + sectnum = 3; + BEGIN(SECT3); + outn("/* Begin user sect3 */"); + yyterminate(); /* to stop the parser */ + } + YY_BREAK +case 154: +YY_RULE_SETUP +#line 609 "scan.l" +{ + int cclval; + + if(yyleng < MAXLINE) + { + strcpy( nmstr, yytext ); + } + else + { + synerr( _("Input line too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } + + /* Check to see if we've already encountered this + * ccl. + */ + if (0 /* <--- This "0" effectively disables the reuse of a + * character class (purely based on its source text). + * The reason it was disabled is so yacc/bison can parse + * ccl operations, such as ccl difference and union. + */ + && (cclval = ccllookup( (Char *) nmstr )) != 0 ) + { + if ( input() != ']' ) + synerr( _( "bad character class" ) ); + + yylval = cclval; + ++cclreuse; + return PREVCCL; + } + else + { + /* We fudge a bit. We know that this ccl will + * soon be numbered as lastccl + 1 by cclinit. + */ + cclinstal( (Char *) nmstr, lastccl + 1 ); + + /* Push back everything but the leading bracket + * so the ccl can be rescanned. + */ + yyless( 1 ); + + BEGIN(FIRSTCCL); + return '['; + } + } + YY_BREAK +case 155: +YY_RULE_SETUP +#line 655 "scan.l" +return CCL_OP_DIFF; + YY_BREAK +case 156: +YY_RULE_SETUP +#line 656 "scan.l" +return CCL_OP_UNION; + YY_BREAK +/* Check for :space: at the end of the rule so we don't + * wrap the expanded regex in '(' ')' -- breaking trailing + * context. + */ +case 157: +/* rule 157 can match eol */ +YY_RULE_SETUP +#line 663 "scan.l" +{ + register Char *nmdefptr; + int end_is_ws, end_ch; + + end_ch = yytext[yyleng-1]; + end_is_ws = end_ch != '}' ? 1 : 0; + + if(yyleng-1 < MAXLINE) + { + strcpy( nmstr, yytext + 1 ); + } + else + { + synerr( _("Input line too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } +nmstr[yyleng - 2 - end_is_ws] = '\0'; /* chop trailing brace */ + + if ( (nmdefptr = ndlookup( nmstr )) == 0 ) + format_synerr( + _( "undefined definition {%s}" ), + nmstr ); + + else + { /* push back name surrounded by ()'s */ + int len = strlen( (char *) nmdefptr ); + if (end_is_ws) + unput(end_ch); + + if ( lex_compat || nmdefptr[0] == '^' || + (len > 0 && nmdefptr[len - 1] == '$') + || (end_is_ws && trlcontxt && !sf_skip_ws())) + { /* don't use ()'s after all */ + PUT_BACK_STRING((char *) nmdefptr, 0); + + if ( nmdefptr[0] == '^' ) + BEGIN(CARETISBOL); + } + + else + { + unput(')'); + PUT_BACK_STRING((char *) nmdefptr, 0); + unput('('); + } + } + } + YY_BREAK +case 158: +YY_RULE_SETUP +#line 711 "scan.l" +{ + if (sf_skip_ws()) + yy_push_state(COMMENT_DISCARD); + else{ + /* Push back the "*" and return "/" as usual. */ + yyless(1); + return '/'; + } + } + YY_BREAK +case 159: +YY_RULE_SETUP +#line 721 "scan.l" +{ + if (lex_compat || posix_compat){ + /* Push back the "?#" and treat it like a normal parens. */ + yyless(1); + sf_push(); + return '('; + } + else + yy_push_state(EXTENDED_COMMENT); + } + YY_BREAK +case 160: +YY_RULE_SETUP +#line 731 "scan.l" +{ + sf_push(); + if (lex_compat || posix_compat) + /* Push back the "?" and treat it like a normal parens. */ + yyless(1); + else + BEGIN(GROUP_WITH_PARAMS); + return '('; + } + YY_BREAK +case 161: +YY_RULE_SETUP +#line 740 "scan.l" +sf_push(); return '('; + YY_BREAK +case 162: +YY_RULE_SETUP +#line 741 "scan.l" +sf_pop(); return ')'; + YY_BREAK +case 163: +YY_RULE_SETUP +#line 743 "scan.l" +return (unsigned char) yytext[0]; + YY_BREAK +case 164: +YY_RULE_SETUP +#line 744 "scan.l" +RETURNCHAR; + YY_BREAK + + +case 165: +/* rule 165 can match eol */ +YY_RULE_SETUP +#line 749 "scan.l" +++linenum; /* Allow blank lines & continuations */ + YY_BREAK +case 166: +YY_RULE_SETUP +#line 750 "scan.l" +return (unsigned char) yytext[0]; + YY_BREAK +case 167: +YY_RULE_SETUP +#line 751 "scan.l" +BEGIN(SECT2); return '>'; + YY_BREAK +case 168: +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ +(yy_c_buf_p) = yy_cp = yy_bp + 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 752 "scan.l" +BEGIN(CARETISBOL); return '>'; + YY_BREAK +case 169: +YY_RULE_SETUP +#line 753 "scan.l" +RETURNNAME; + YY_BREAK +case 170: +YY_RULE_SETUP +#line 754 "scan.l" +{ + format_synerr( _( "bad <start condition>: %s" ), + yytext ); + } + YY_BREAK + +case 171: +YY_RULE_SETUP +#line 760 "scan.l" +BEGIN(SECT2); return '^'; + YY_BREAK + +case 172: +YY_RULE_SETUP +#line 764 "scan.l" +RETURNCHAR; + YY_BREAK +case 173: +YY_RULE_SETUP +#line 765 "scan.l" +BEGIN(SECT2); return '"'; + YY_BREAK +case 174: +/* rule 174 can match eol */ +YY_RULE_SETUP +#line 767 "scan.l" +{ + synerr( _( "missing quote" ) ); + BEGIN(SECT2); + ++linenum; + return '"'; + } + YY_BREAK + + +case 175: +YY_RULE_SETUP +#line 776 "scan.l" +BEGIN(SECT2); + YY_BREAK +case 176: +YY_RULE_SETUP +#line 777 "scan.l" +BEGIN(GROUP_MINUS_PARAMS); + YY_BREAK +case 177: +YY_RULE_SETUP +#line 778 "scan.l" +sf_set_case_ins(1); + YY_BREAK +case 178: +YY_RULE_SETUP +#line 779 "scan.l" +sf_set_dot_all(1); + YY_BREAK +case 179: +YY_RULE_SETUP +#line 780 "scan.l" +sf_set_skip_ws(1); + YY_BREAK + + +case 180: +YY_RULE_SETUP +#line 783 "scan.l" +BEGIN(SECT2); + YY_BREAK +case 181: +YY_RULE_SETUP +#line 784 "scan.l" +sf_set_case_ins(0); + YY_BREAK +case 182: +YY_RULE_SETUP +#line 785 "scan.l" +sf_set_dot_all(0); + YY_BREAK +case 183: +YY_RULE_SETUP +#line 786 "scan.l" +sf_set_skip_ws(0); + YY_BREAK + + +case 184: +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ +(yy_c_buf_p) = yy_cp = yy_bp + 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 790 "scan.l" +BEGIN(CCL); return '^'; + YY_BREAK +case 185: +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ +(yy_c_buf_p) = yy_cp = yy_bp + 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 791 "scan.l" +return '^'; + YY_BREAK +case 186: +YY_RULE_SETUP +#line 792 "scan.l" +BEGIN(CCL); RETURNCHAR; + YY_BREAK + + +case 187: +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ +(yy_c_buf_p) = yy_cp = yy_bp + 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 796 "scan.l" +return '-'; + YY_BREAK +case 188: +YY_RULE_SETUP +#line 797 "scan.l" +RETURNCHAR; + YY_BREAK +case 189: +YY_RULE_SETUP +#line 798 "scan.l" +BEGIN(SECT2); return ']'; + YY_BREAK +case 190: +/* rule 190 can match eol */ +YY_RULE_SETUP +#line 799 "scan.l" +{ + synerr( _( "bad character class" ) ); + BEGIN(SECT2); + return ']'; + } + YY_BREAK + + +case 191: +YY_RULE_SETUP +#line 807 "scan.l" +BEGIN(CCL); return CCE_ALNUM; + YY_BREAK +case 192: +YY_RULE_SETUP +#line 808 "scan.l" +BEGIN(CCL); return CCE_ALPHA; + YY_BREAK +case 193: +YY_RULE_SETUP +#line 809 "scan.l" +BEGIN(CCL); return CCE_BLANK; + YY_BREAK +case 194: +YY_RULE_SETUP +#line 810 "scan.l" +BEGIN(CCL); return CCE_CNTRL; + YY_BREAK +case 195: +YY_RULE_SETUP +#line 811 "scan.l" +BEGIN(CCL); return CCE_DIGIT; + YY_BREAK +case 196: +YY_RULE_SETUP +#line 812 "scan.l" +BEGIN(CCL); return CCE_GRAPH; + YY_BREAK +case 197: +YY_RULE_SETUP +#line 813 "scan.l" +BEGIN(CCL); return CCE_LOWER; + YY_BREAK +case 198: +YY_RULE_SETUP +#line 814 "scan.l" +BEGIN(CCL); return CCE_PRINT; + YY_BREAK +case 199: +YY_RULE_SETUP +#line 815 "scan.l" +BEGIN(CCL); return CCE_PUNCT; + YY_BREAK +case 200: +YY_RULE_SETUP +#line 816 "scan.l" +BEGIN(CCL); return CCE_SPACE; + YY_BREAK +case 201: +YY_RULE_SETUP +#line 817 "scan.l" +BEGIN(CCL); return CCE_UPPER; + YY_BREAK +case 202: +YY_RULE_SETUP +#line 818 "scan.l" +BEGIN(CCL); return CCE_XDIGIT; + YY_BREAK +case 203: +YY_RULE_SETUP +#line 820 "scan.l" +BEGIN(CCL); return CCE_NEG_ALNUM; + YY_BREAK +case 204: +YY_RULE_SETUP +#line 821 "scan.l" +BEGIN(CCL); return CCE_NEG_ALPHA; + YY_BREAK +case 205: +YY_RULE_SETUP +#line 822 "scan.l" +BEGIN(CCL); return CCE_NEG_BLANK; + YY_BREAK +case 206: +YY_RULE_SETUP +#line 823 "scan.l" +BEGIN(CCL); return CCE_NEG_CNTRL; + YY_BREAK +case 207: +YY_RULE_SETUP +#line 824 "scan.l" +BEGIN(CCL); return CCE_NEG_DIGIT; + YY_BREAK +case 208: +YY_RULE_SETUP +#line 825 "scan.l" +BEGIN(CCL); return CCE_NEG_GRAPH; + YY_BREAK +case 209: +YY_RULE_SETUP +#line 826 "scan.l" +BEGIN(CCL); return CCE_NEG_LOWER; + YY_BREAK +case 210: +YY_RULE_SETUP +#line 827 "scan.l" +BEGIN(CCL); return CCE_NEG_PRINT; + YY_BREAK +case 211: +YY_RULE_SETUP +#line 828 "scan.l" +BEGIN(CCL); return CCE_NEG_PUNCT; + YY_BREAK +case 212: +YY_RULE_SETUP +#line 829 "scan.l" +BEGIN(CCL); return CCE_NEG_SPACE; + YY_BREAK +case 213: +YY_RULE_SETUP +#line 830 "scan.l" +BEGIN(CCL); return CCE_NEG_UPPER; + YY_BREAK +case 214: +YY_RULE_SETUP +#line 831 "scan.l" +BEGIN(CCL); return CCE_NEG_XDIGIT; + YY_BREAK +case 215: +YY_RULE_SETUP +#line 832 "scan.l" +{ + format_synerr( + _( "bad character class expression: %s" ), + yytext ); + BEGIN(CCL); return CCE_ALNUM; + } + YY_BREAK + + +case 216: +YY_RULE_SETUP +#line 841 "scan.l" +{ + yylval = myctoi( yytext ); + return NUMBER; + } + YY_BREAK +case 217: +YY_RULE_SETUP +#line 846 "scan.l" +return ','; + YY_BREAK +case 218: +YY_RULE_SETUP +#line 847 "scan.l" +{ + BEGIN(SECT2); + if ( lex_compat || posix_compat ) + return END_REPEAT_POSIX; + else + return END_REPEAT_FLEX; + } + YY_BREAK +case 219: +YY_RULE_SETUP +#line 855 "scan.l" +{ + synerr( _( "bad character inside {}'s" ) ); + BEGIN(SECT2); + return '}'; + } + YY_BREAK +case 220: +/* rule 220 can match eol */ +YY_RULE_SETUP +#line 861 "scan.l" +{ + synerr( _( "missing }" ) ); + BEGIN(SECT2); + ++linenum; + return '}'; + } + YY_BREAK + + +case 221: +YY_RULE_SETUP +#line 871 "scan.l" +bracelevel = 0; + YY_BREAK +case 222: +YY_RULE_SETUP +#line 873 "scan.l" +ACTION_ECHO; yy_push_state( COMMENT ); + YY_BREAK + +case 223: +YY_RULE_SETUP +#line 876 "scan.l" +{ + ACTION_ECHO; + CHECK_REJECT(yytext); + } + YY_BREAK +case 224: +YY_RULE_SETUP +#line 880 "scan.l" +{ + ACTION_ECHO; + CHECK_YYMORE(yytext); + } + YY_BREAK + +case 225: +YY_RULE_SETUP +#line 886 "scan.l" +ACTION_ECHO_QEND; + YY_BREAK +case 226: +YY_RULE_SETUP +#line 887 "scan.l" +ACTION_ECHO_QEND; + YY_BREAK +case 227: +YY_RULE_SETUP +#line 888 "scan.l" +ACTION_ECHO; + YY_BREAK +case 228: +/* rule 228 can match eol */ +YY_RULE_SETUP +#line 889 "scan.l" +{ + ++linenum; + ACTION_ECHO; + if ( bracelevel == 0 || + (doing_codeblock && indented_code) ) + { + if ( doing_rule_action ) + add_action( "\tYY_BREAK\n" ); + + doing_rule_action = doing_codeblock = false; + BEGIN(SECT2); + } + } + YY_BREAK + +/* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */ + +case 229: +YY_RULE_SETUP +#line 907 "scan.l" +ACTION_ECHO; ++bracelevel; + YY_BREAK +case 230: +YY_RULE_SETUP +#line 908 "scan.l" +ACTION_ECHO; --bracelevel; + YY_BREAK +case 231: +YY_RULE_SETUP +#line 909 "scan.l" +ACTION_ECHO_QEND; + YY_BREAK +case 232: +YY_RULE_SETUP +#line 910 "scan.l" +ACTION_ECHO_QEND; + YY_BREAK +case 233: +YY_RULE_SETUP +#line 911 "scan.l" +ACTION_ECHO; + YY_BREAK +case 234: +YY_RULE_SETUP +#line 912 "scan.l" +ACTION_ECHO; + YY_BREAK +case 235: +YY_RULE_SETUP +#line 913 "scan.l" +ACTION_ECHO; + YY_BREAK +case 236: +YY_RULE_SETUP +#line 914 "scan.l" +ACTION_ECHO; /* character constant */ + YY_BREAK +case 237: +YY_RULE_SETUP +#line 915 "scan.l" +ACTION_ECHO; BEGIN(ACTION_STRING); + YY_BREAK +case 238: +/* rule 238 can match eol */ +YY_RULE_SETUP +#line 916 "scan.l" +{ + ++linenum; + ACTION_ECHO; + if ( bracelevel == 0 ) + { + if ( doing_rule_action ) + add_action( "\tYY_BREAK\n" ); + + doing_rule_action = false; + BEGIN(SECT2); + } + } + YY_BREAK +case 239: +YY_RULE_SETUP +#line 928 "scan.l" +ACTION_ECHO; + YY_BREAK + + +case 240: +YY_RULE_SETUP +#line 932 "scan.l" +ACTION_ECHO; + YY_BREAK +case 241: +YY_RULE_SETUP +#line 933 "scan.l" +ACTION_ECHO; + YY_BREAK +case 242: +/* rule 242 can match eol */ +YY_RULE_SETUP +#line 934 "scan.l" +++linenum; ACTION_ECHO; BEGIN(ACTION); + YY_BREAK +case 243: +YY_RULE_SETUP +#line 935 "scan.l" +ACTION_ECHO; BEGIN(ACTION); + YY_BREAK +case 244: +YY_RULE_SETUP +#line 936 "scan.l" +ACTION_ECHO; + YY_BREAK + +case YY_STATE_EOF(COMMENT): +case YY_STATE_EOF(COMMENT_DISCARD): +case YY_STATE_EOF(ACTION): +case YY_STATE_EOF(ACTION_STRING): +#line 939 "scan.l" +{ + synerr( _( "EOF encountered inside an action" ) ); + yyterminate(); + } + YY_BREAK +case YY_STATE_EOF(EXTENDED_COMMENT): +case YY_STATE_EOF(GROUP_WITH_PARAMS): +case YY_STATE_EOF(GROUP_MINUS_PARAMS): +#line 944 "scan.l" +{ + synerr( _( "EOF encountered inside pattern" ) ); + yyterminate(); + } + YY_BREAK +case 245: +YY_RULE_SETUP +#line 949 "scan.l" +{ + yylval = myesc( (Char *) yytext ); + + if ( YY_START == FIRSTCCL ) + BEGIN(CCL); + + return CHAR; + } + YY_BREAK + +case 246: +YY_RULE_SETUP +#line 960 "scan.l" +fwrite (escaped_qstart, 1, strlen(escaped_qstart), yyout); + YY_BREAK +case 247: +YY_RULE_SETUP +#line 961 "scan.l" +fwrite (escaped_qend, 1, strlen(escaped_qend), yyout); + YY_BREAK +case 248: +/* rule 248 can match eol */ +YY_RULE_SETUP +#line 962 "scan.l" +ECHO; + YY_BREAK +case 249: +/* rule 249 can match eol */ +YY_RULE_SETUP +#line 963 "scan.l" +ECHO; + YY_BREAK +case YY_STATE_EOF(SECT3): +#line 964 "scan.l" +sectnum = 0; yyterminate(); + YY_BREAK + +case 250: +/* rule 250 can match eol */ +YY_RULE_SETUP +#line 967 "scan.l" +format_synerr( _( "bad character: %s" ), yytext ); + YY_BREAK +case 251: +YY_RULE_SETUP +#line 969 "scan.l" +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK +#line 4111 "scan.c" + case YY_STATE_EOF(INITIAL): + case YY_STATE_EOF(SECT2): + case YY_STATE_EOF(CODEBLOCK): + case YY_STATE_EOF(PICKUPDEF): + case YY_STATE_EOF(SC): + case YY_STATE_EOF(CARETISBOL): + case YY_STATE_EOF(NUM): + case YY_STATE_EOF(QUOTE): + case YY_STATE_EOF(FIRSTCCL): + case YY_STATE_EOF(CCL): + case YY_STATE_EOF(RECOVER): + case YY_STATE_EOF(PERCENT_BRACE_ACTION): + case YY_STATE_EOF(OPTION): + case YY_STATE_EOF(LINEDIR): + yyterminate(); + + 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 yyin at a new source and called + * yylex(). 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 = yyin; + 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 + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, 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 yylex */ + +/* 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 + */ +static int yy_get_next_buffer (void) +{ + 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 + { + int 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. */ + + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); + + } + + 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), (size_t) 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; + yyrestart(yyin ); + } + + 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; + + if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + (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 */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + 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 >= 1107 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *(yy_state_ptr)++ = yy_current_state; + } + + 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 ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + + register YY_CHAR yy_c = 1; + 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 >= 1107 ) + 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 == 1106); + if ( ! yy_is_jam ) + *(yy_state_ptr)++ = yy_current_state; + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#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. */ + yyrestart(yyin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap( ) ) + 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 yytext */ + (yy_hold_char) = *++(yy_c_buf_p); + + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** 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 . + */ + void yyrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_init_buffer(YY_CURRENT_BUFFER,input_file ); + yy_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_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; + yy_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void yy_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = 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. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_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 *) yyalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + void yy_delete_buffer (YY_BUFFER_STATE b ) +{ + + 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 ) + yyfree((void *) b->yy_ch_buf ); + + yyfree((void *) b ); +} + +#ifndef __cplusplus +extern int isatty (int ); +#endif /* __cplusplus */ + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + yy_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() 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; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + 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. + * + */ + void yy_flush_buffer (YY_BUFFER_STATE b ) +{ + 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 ) + yy_load_buffer_state( ); +} + +/** 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. + * + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(); + + /* This block is copied from yy_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 yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void yypop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (void) +{ + 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**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + 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**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + /* 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; + } +} + +/** 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 yy_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) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_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; + + yy_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr 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 + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) +{ + + return yy_scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() 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 yy_scan_bytes (yyconst char * yybytes, int _yybytes_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 = _yybytes_len + 2; + buf = (char *) yyalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_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; +} + + static void yy_push_state (int new_state ) +{ + if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) + { + yy_size_t new_size; + + (yy_start_stack_depth) += YY_START_STACK_INCR; + new_size = (yy_start_stack_depth) * sizeof( int ); + + if ( ! (yy_start_stack) ) + (yy_start_stack) = (int *) yyalloc(new_size ); + + else + (yy_start_stack) = (int *) yyrealloc((void *) (yy_start_stack),new_size ); + + if ( ! (yy_start_stack) ) + YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); + } + + (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; + + BEGIN(new_state); +} + + static void yy_pop_state (void) +{ + if ( --(yy_start_stack_ptr) < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int yyget_lineno (void) +{ + + return yylineno; +} + +/** Get the input stream. + * + */ +FILE *yyget_in (void) +{ + return yyin; +} + +/** Get the output stream. + * + */ +FILE *yyget_out (void) +{ + return yyout; +} + +/** Get the length of the current token. + * + */ +int yyget_leng (void) +{ + return yyleng; +} + +/** Get the current token. + * + */ + +char *yyget_text (void) +{ + return yytext; +} + +/** Set the current line number. + * @param line_number + * + */ +void yyset_lineno (int line_number ) +{ + + yylineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * in_str ) +{ + yyin = in_str ; +} + +void yyset_out (FILE * out_str ) +{ + yyout = out_str ; +} + +int yyget_debug (void) +{ + return yy_flex_debug; +} + +void yyset_debug (int bdebug ) +{ + yy_flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + + (yy_start_stack_ptr) = 0; + (yy_start_stack_depth) = 0; + (yy_start_stack) = NULL; + + (yy_state_buf) = 0; + (yy_state_ptr) = 0; + (yy_full_match) = 0; + (yy_lp) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = (FILE *) 0; + yyout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Destroy the start condition stack. */ + yyfree((yy_start_stack) ); + (yy_start_stack) = NULL; + + yyfree ( (yy_state_buf) ); + (yy_state_buf) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * 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 *yyalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *yyrealloc (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 yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 969 "scan.l" + + + + +int yywrap() + { + if ( --num_input_files > 0 ) + { + set_input_file( *++input_files ); + return 0; + } + + else + return 1; + } + + +/* set_input_file - open the given file (if NULL, stdin) for scanning */ + +void set_input_file( file ) +char *file; + { + if ( file && strcmp( file, "-" ) ) + { + infilename = copy_string( file ); + yyin = fopen( infilename, "r" ); + + if ( yyin == NULL ) + lerrsf( _( "can't open %s" ), file ); + } + + else + { + yyin = stdin; + infilename = copy_string( "<stdin>" ); + } + + linenum = 1; + } + + +/* Wrapper routines for accessing the scanner's malloc routines. */ + +void *flex_alloc( size ) +size_t size; + { + return (void *) malloc( size ); + } + +void *flex_realloc( ptr, size ) +void *ptr; +size_t size; + { + return (void *) realloc( ptr, size ); + } + +void flex_free( ptr ) +void *ptr; + { + if ( ptr ) + free( ptr ); + } + diff --git a/scan.l b/scan.l new file mode 100644 index 000000000000..23158764112f --- /dev/null +++ b/scan.l @@ -0,0 +1,1029 @@ +/* scan.l - scanner for flex input -*-C-*- */ + +%{ +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" +#include "parse.h" +extern bool tablesverify, tablesext; +extern int trlcontxt; /* Set in parse.y for each rule. */ +extern const char *escaped_qstart, *escaped_qend; + +#define ACTION_ECHO add_action( yytext ) +#define ACTION_IFDEF(def, should_define) \ + { \ + if ( should_define ) \ + action_define( def, 1 ); \ + } + +#define ACTION_ECHO_QSTART add_action (escaped_qstart) +#define ACTION_ECHO_QEND add_action (escaped_qend) + +#define ACTION_M4_IFDEF(def, should_define) \ + do{ \ + if ( should_define ) \ + buf_m4_define( &m4defs_buf, def, NULL);\ + else \ + buf_m4_undefine( &m4defs_buf, def);\ + } while(0) + +#define MARK_END_OF_PROLOG mark_prolog(); + +#define YY_DECL \ + int flexscan() + +#define RETURNCHAR \ + yylval = (unsigned char) yytext[0]; \ + return CHAR; + +#define RETURNNAME \ + if(yyleng < MAXLINE) \ + { \ + strcpy( nmstr, yytext ); \ + } \ + else \ + { \ + synerr(_("Input line too long\n")); \ + FLEX_EXIT(EXIT_FAILURE); \ + } \ + return NAME; + +#define PUT_BACK_STRING(str, start) \ + for ( i = strlen( str ) - 1; i >= start; --i ) \ + unput((str)[i]) + +#define CHECK_REJECT(str) \ + if ( all_upper( str ) ) \ + reject = true; + +#define CHECK_YYMORE(str) \ + if ( all_lower( str ) ) \ + yymore_used = true; + +#define YY_USER_INIT \ + if ( getenv("POSIXLY_CORRECT") ) \ + posix_compat = true; + +%} + +%option caseless nodefault stack noyy_top_state +%option nostdinit + +%x SECT2 SECT2PROLOG SECT3 CODEBLOCK PICKUPDEF SC CARETISBOL NUM QUOTE +%x FIRSTCCL CCL ACTION RECOVER COMMENT ACTION_STRING PERCENT_BRACE_ACTION +%x OPTION LINEDIR CODEBLOCK_MATCH_BRACE +%x GROUP_WITH_PARAMS +%x GROUP_MINUS_PARAMS +%x EXTENDED_COMMENT +%x COMMENT_DISCARD + +WS [[:blank:]]+ +OPTWS [[:blank:]]* +NOT_WS [^[:blank:]\r\n] + +NL \r?\n + +NAME ([[:alpha:]_][[:alnum:]_-]*) +NOT_NAME [^[:alpha:]_*\n]+ + +SCNAME {NAME} + +ESCSEQ (\\([^\n]|[0-7]{1,3}|x[[:xdigit:]]{1,2})) + +FIRST_CCL_CHAR ([^\\\n]|{ESCSEQ}) +CCL_CHAR ([^\\\n\]]|{ESCSEQ}) +CCL_EXPR ("[:"^?[[:alpha:]]+":]") + +LEXOPT [aceknopr] + +M4QSTART "[[" +M4QEND "]]" + +%% + static int bracelevel, didadef, indented_code; + static int doing_rule_action = false; + static int option_sense; + + int doing_codeblock = false; + int i, brace_depth=0, brace_start_line=0; + Char nmdef[MAXLINE]; + + +<INITIAL>{ + ^{WS} indented_code = true; BEGIN(CODEBLOCK); + ^"/*" ACTION_ECHO; yy_push_state( COMMENT ); + ^#{OPTWS}line{WS} yy_push_state( LINEDIR ); + ^"%s"{NAME}? return SCDECL; + ^"%x"{NAME}? return XSCDECL; + ^"%{".*{NL} { + ++linenum; + line_directive_out( (FILE *) 0, 1 ); + indented_code = false; + BEGIN(CODEBLOCK); + } + ^"%top"[[:blank:]]*"{"[[:blank:]]*{NL} { + brace_start_line = linenum; + ++linenum; + buf_linedir( &top_buf, infilename?infilename:"<stdin>", linenum); + brace_depth = 1; + yy_push_state(CODEBLOCK_MATCH_BRACE); + } + + ^"%top".* synerr( _("malformed '%top' directive") ); + + {WS} /* discard */ + + ^"%%".* { + sectnum = 2; + bracelevel = 0; + mark_defs1(); + line_directive_out( (FILE *) 0, 1 ); + BEGIN(SECT2PROLOG); + return SECTEND; + } + + ^"%pointer".*{NL} yytext_is_array = false; ++linenum; + ^"%array".*{NL} yytext_is_array = true; ++linenum; + + ^"%option" BEGIN(OPTION); return OPTION_OP; + + ^"%"{LEXOPT}{OPTWS}[[:digit:]]*{OPTWS}{NL} ++linenum; /* ignore */ + ^"%"{LEXOPT}{WS}.*{NL} ++linenum; /* ignore */ + + /* xgettext: no-c-format */ + ^"%"[^sxaceknopr{}].* synerr( _( "unrecognized '%' directive" ) ); + + ^{NAME} { + if(yyleng < MAXLINE) + { + strcpy( nmstr, yytext ); + } + else + { + synerr( _("Input line too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } + + didadef = false; + BEGIN(PICKUPDEF); + } + + {SCNAME} RETURNNAME; + ^{OPTWS}{NL} ++linenum; /* allows blank lines in section 1 */ + {OPTWS}{NL} ACTION_ECHO; ++linenum; /* maybe end of comment line */ +} + + +<COMMENT>{ + "*/" ACTION_ECHO; yy_pop_state(); + "*" ACTION_ECHO; + {M4QSTART} ACTION_ECHO_QSTART; + {M4QEND} ACTION_ECHO_QEND; + [^*\n] ACTION_ECHO; + {NL} ++linenum; ACTION_ECHO; +} + +<COMMENT_DISCARD>{ + /* This is the same as COMMENT, but is discarded rather than output. */ + "*/" yy_pop_state(); + "*" ; + [^*\n] ; + {NL} ++linenum; +} + +<EXTENDED_COMMENT>{ + ")" yy_pop_state(); + [^\n\)]+ ; + {NL} ++linenum; +} + +<LINEDIR>{ + \n yy_pop_state(); + [[:digit:]]+ linenum = myctoi( yytext ); + + \"[^"\n]*\" { + flex_free( (void *) infilename ); + infilename = copy_string( yytext + 1 ); + infilename[strlen( infilename ) - 1] = '\0'; + } + . /* ignore spurious characters */ +} + +<CODEBLOCK>{ + ^"%}".*{NL} ++linenum; BEGIN(INITIAL); + + {M4QSTART} ACTION_ECHO_QSTART; + {M4QEND} ACTION_ECHO_QEND; + . ACTION_ECHO; + + {NL} { + ++linenum; + ACTION_ECHO; + if ( indented_code ) + BEGIN(INITIAL); + } +} + +<CODEBLOCK_MATCH_BRACE>{ + "}" { + if( --brace_depth == 0){ + /* TODO: Matched. */ + yy_pop_state(); + }else + buf_strnappend(&top_buf, yytext, yyleng); + } + + "{" { + brace_depth++; + buf_strnappend(&top_buf, yytext, yyleng); + } + + {NL} { + ++linenum; + buf_strnappend(&top_buf, yytext, yyleng); + } + + {M4QSTART} buf_strnappend(&top_buf, escaped_qstart, strlen(escaped_qstart)); + {M4QEND} buf_strnappend(&top_buf, escaped_qend, strlen(escaped_qend)); + + [^{}\r\n] { + buf_strnappend(&top_buf, yytext, yyleng); + } + + <<EOF>> { + linenum = brace_start_line; + synerr(_("Unmatched '{'")); + yyterminate(); + } +} + + +<PICKUPDEF>{ + {WS} /* separates name and definition */ + + {NOT_WS}[^\r\n]* { + if(yyleng < MAXLINE) + { + strcpy( (char *) nmdef, yytext ); + } + else + { + synerr( _("Input line too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } + /* Skip trailing whitespace. */ + for ( i = strlen( (char *) nmdef ) - 1; + i >= 0 && (nmdef[i] == ' ' || nmdef[i] == '\t'); + --i ) + ; + + nmdef[i + 1] = '\0'; + + ndinstal( nmstr, nmdef ); + didadef = true; + } + + {NL} { + if ( ! didadef ) + synerr( _( "incomplete name definition" ) ); + BEGIN(INITIAL); + ++linenum; + } +} + + +<OPTION>{ + {NL} ++linenum; BEGIN(INITIAL); + {WS} option_sense = true; + + "=" return '='; + + no option_sense = ! option_sense; + + 7bit csize = option_sense ? 128 : 256; + 8bit csize = option_sense ? 256 : 128; + + align long_align = option_sense; + always-interactive { + ACTION_M4_IFDEF( "M4""_YY_ALWAYS_INTERACTIVE", option_sense ); + interactive = option_sense; + } + array yytext_is_array = option_sense; + ansi-definitions ansi_func_defs = option_sense; + ansi-prototypes ansi_func_protos = option_sense; + backup backing_up_report = option_sense; + batch interactive = ! option_sense; + bison-bridge bison_bridge_lval = option_sense; + bison-locations { if((bison_bridge_lloc = option_sense)) + bison_bridge_lval = true; + } + "c++" C_plus_plus = option_sense; + caseful|case-sensitive sf_set_case_ins(!option_sense); + caseless|case-insensitive sf_set_case_ins(option_sense); + debug ddebug = option_sense; + default spprdflt = ! option_sense; + ecs useecs = option_sense; + fast { + useecs = usemecs = false; + use_read = fullspd = true; + } + full { + useecs = usemecs = false; + use_read = fulltbl = true; + } + input ACTION_IFDEF("YY_NO_INPUT", ! option_sense); + interactive interactive = option_sense; + lex-compat lex_compat = option_sense; + posix-compat posix_compat = option_sense; + main { + ACTION_M4_IFDEF( "M4""_YY_MAIN", option_sense); + /* Override yywrap */ + if( option_sense == true ) + do_yywrap = false; + } + meta-ecs usemecs = option_sense; + never-interactive { + ACTION_M4_IFDEF( "M4""_YY_NEVER_INTERACTIVE", option_sense ); + interactive = !option_sense; + } + perf-report performance_report += option_sense ? 1 : -1; + pointer yytext_is_array = ! option_sense; + read use_read = option_sense; + reentrant reentrant = option_sense; + reject reject_really_used = option_sense; + stack ACTION_M4_IFDEF( "M4""_YY_STACK_USED", option_sense ); + stdinit do_stdinit = option_sense; + stdout use_stdout = option_sense; + unistd ACTION_IFDEF("YY_NO_UNISTD_H", ! option_sense); + unput ACTION_M4_IFDEF("M4""_YY_NO_UNPUT", ! option_sense); + verbose printstats = option_sense; + warn nowarn = ! option_sense; + yylineno do_yylineno = option_sense; ACTION_M4_IFDEF("M4""_YY_USE_LINENO", option_sense); + yymore yymore_really_used = option_sense; + yywrap do_yywrap = option_sense; + + yy_push_state ACTION_M4_IFDEF("M4""_YY_NO_PUSH_STATE", ! option_sense); + yy_pop_state ACTION_M4_IFDEF("M4""_YY_NO_POP_STATE", ! option_sense); + yy_top_state ACTION_M4_IFDEF("M4""_YY_NO_TOP_STATE", ! option_sense); + + yy_scan_buffer ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BUFFER", ! option_sense); + yy_scan_bytes ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BYTES", ! option_sense); + yy_scan_string ACTION_M4_IFDEF("M4""_YY_NO_SCAN_STRING", ! option_sense); + + yyalloc ACTION_M4_IFDEF("M4""_YY_NO_FLEX_ALLOC", ! option_sense); + yyrealloc ACTION_M4_IFDEF("M4""_YY_NO_FLEX_REALLOC", ! option_sense); + yyfree ACTION_M4_IFDEF("M4""_YY_NO_FLEX_FREE", ! option_sense); + + yyget_debug ACTION_M4_IFDEF("M4""_YY_NO_GET_DEBUG", ! option_sense); + yyset_debug ACTION_M4_IFDEF("M4""_YY_NO_SET_DEBUG", ! option_sense); + yyget_extra ACTION_M4_IFDEF("M4""_YY_NO_GET_EXTRA", ! option_sense); + yyset_extra ACTION_M4_IFDEF("M4""_YY_NO_SET_EXTRA", ! option_sense); + yyget_leng ACTION_M4_IFDEF("M4""_YY_NO_GET_LENG", ! option_sense); + yyget_text ACTION_M4_IFDEF("M4""_YY_NO_GET_TEXT", ! option_sense); + yyget_lineno ACTION_M4_IFDEF("M4""_YY_NO_GET_LINENO", ! option_sense); + yyset_lineno ACTION_M4_IFDEF("M4""_YY_NO_SET_LINENO", ! option_sense); + yyget_in ACTION_M4_IFDEF("M4""_YY_NO_GET_IN", ! option_sense); + yyset_in ACTION_M4_IFDEF("M4""_YY_NO_SET_IN", ! option_sense); + yyget_out ACTION_M4_IFDEF("M4""_YY_NO_GET_OUT", ! option_sense); + yyset_out ACTION_M4_IFDEF("M4""_YY_NO_SET_OUT", ! option_sense); + yyget_lval ACTION_M4_IFDEF("M4""_YY_NO_GET_LVAL", ! option_sense); + yyset_lval ACTION_M4_IFDEF("M4""_YY_NO_SET_LVAL", ! option_sense); + yyget_lloc ACTION_M4_IFDEF("M4""_YY_NO_GET_LLOC", ! option_sense); + yyset_lloc ACTION_M4_IFDEF("M4""_YY_NO_SET_LLOC", ! option_sense); + + extra-type return OPT_EXTRA_TYPE; + outfile return OPT_OUTFILE; + prefix return OPT_PREFIX; + yyclass return OPT_YYCLASS; + header(-file)? return OPT_HEADER; + tables-file return OPT_TABLES; + tables-verify { + tablesverify = option_sense; + if(!tablesext && option_sense) + tablesext = true; + } + + + \"[^"\n]*\" { + if(yyleng-1 < MAXLINE) + { + strcpy( nmstr, yytext + 1 ); + } + else + { + synerr( _("Input line too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } + nmstr[strlen( nmstr ) - 1] = '\0'; + return NAME; + } + + (([a-mo-z]|n[a-np-z])[[:alpha:]\-+]*)|. { + format_synerr( _( "unrecognized %%option: %s" ), + yytext ); + BEGIN(RECOVER); + } +} + +<RECOVER>.*{NL} ++linenum; BEGIN(INITIAL); + + +<SECT2PROLOG>{ + ^"%{".* ++bracelevel; yyless( 2 ); /* eat only %{ */ + ^"%}".* --bracelevel; yyless( 2 ); /* eat only %} */ + + ^{WS}.* ACTION_ECHO; /* indented code in prolog */ + + ^{NOT_WS}.* { /* non-indented code */ + if ( bracelevel <= 0 ) + { /* not in %{ ... %} */ + yyless( 0 ); /* put it all back */ + yy_set_bol( 1 ); + mark_prolog(); + BEGIN(SECT2); + } + else + ACTION_ECHO; + } + + . ACTION_ECHO; + {NL} ++linenum; ACTION_ECHO; + + <<EOF>> { + mark_prolog(); + sectnum = 0; + yyterminate(); /* to stop the parser */ + } +} + +<SECT2>{ + ^{OPTWS}{NL} ++linenum; /* allow blank lines in section 2 */ + + ^{OPTWS}"%{" { + indented_code = false; + doing_codeblock = true; + bracelevel = 1; + BEGIN(PERCENT_BRACE_ACTION); + } + + ^{OPTWS}"<" { + /* Allow "<" to appear in (?x) patterns. */ + if (!sf_skip_ws()) + BEGIN(SC); + return '<'; + } + ^{OPTWS}"^" return '^'; + \" BEGIN(QUOTE); return '"'; + "{"/[[:digit:]] { + BEGIN(NUM); + if ( lex_compat || posix_compat ) + return BEGIN_REPEAT_POSIX; + else + return BEGIN_REPEAT_FLEX; + } + "$"/([[:blank:]]|{NL}) return '$'; + + {WS}"%{" { + bracelevel = 1; + BEGIN(PERCENT_BRACE_ACTION); + + if ( in_rule ) + { + doing_rule_action = true; + in_rule = false; + return '\n'; + } + } + {WS}"|".*{NL} { + if (sf_skip_ws()){ + /* We're in the middle of a (?x: ) pattern. */ + /* Push back everything starting at the "|" */ + size_t amt; + amt = strchr (yytext, '|') - yytext; + yyless(amt); + } + else { + continued_action = true; + ++linenum; + return '\n'; + } + } + + ^{WS}"/*" { + + if (sf_skip_ws()){ + /* We're in the middle of a (?x: ) pattern. */ + yy_push_state(COMMENT_DISCARD); + } + else{ + yyless( yyleng - 2 ); /* put back '/', '*' */ + bracelevel = 0; + continued_action = false; + BEGIN(ACTION); + } + } + + ^{WS} /* allow indented rules */ ; + + {WS} { + if (sf_skip_ws()){ + /* We're in the middle of a (?x: ) pattern. */ + } + else{ + /* This rule is separate from the one below because + * otherwise we get variable trailing context, so + * we can't build the scanner using -{f,F}. + */ + bracelevel = 0; + continued_action = false; + BEGIN(ACTION); + + if ( in_rule ) + { + doing_rule_action = true; + in_rule = false; + return '\n'; + } + } + } + + {OPTWS}{NL} { + if (sf_skip_ws()){ + /* We're in the middle of a (?x: ) pattern. */ + ++linenum; + } + else{ + bracelevel = 0; + continued_action = false; + BEGIN(ACTION); + unput( '\n' ); /* so <ACTION> sees it */ + + if ( in_rule ) + { + doing_rule_action = true; + in_rule = false; + return '\n'; + } + } + } + + ^{OPTWS}"<<EOF>>" | + "<<EOF>>" return EOF_OP; + + ^"%%".* { + sectnum = 3; + BEGIN(SECT3); + outn("/* Begin user sect3 */"); + yyterminate(); /* to stop the parser */ + } + + "["({FIRST_CCL_CHAR}|{CCL_EXPR})({CCL_CHAR}|{CCL_EXPR})* { + int cclval; + + if(yyleng < MAXLINE) + { + strcpy( nmstr, yytext ); + } + else + { + synerr( _("Input line too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } + + /* Check to see if we've already encountered this + * ccl. + */ + if (0 /* <--- This "0" effectively disables the reuse of a + * character class (purely based on its source text). + * The reason it was disabled is so yacc/bison can parse + * ccl operations, such as ccl difference and union. + */ + && (cclval = ccllookup( (Char *) nmstr )) != 0 ) + { + if ( input() != ']' ) + synerr( _( "bad character class" ) ); + + yylval = cclval; + ++cclreuse; + return PREVCCL; + } + else + { + /* We fudge a bit. We know that this ccl will + * soon be numbered as lastccl + 1 by cclinit. + */ + cclinstal( (Char *) nmstr, lastccl + 1 ); + + /* Push back everything but the leading bracket + * so the ccl can be rescanned. + */ + yyless( 1 ); + + BEGIN(FIRSTCCL); + return '['; + } + } + "{-}" return CCL_OP_DIFF; + "{+}" return CCL_OP_UNION; + + + /* Check for :space: at the end of the rule so we don't + * wrap the expanded regex in '(' ')' -- breaking trailing + * context. + */ + "{"{NAME}"}"[[:space:]]? { + register Char *nmdefptr; + int end_is_ws, end_ch; + + end_ch = yytext[yyleng-1]; + end_is_ws = end_ch != '}' ? 1 : 0; + + if(yyleng-1 < MAXLINE) + { + strcpy( nmstr, yytext + 1 ); + } + else + { + synerr( _("Input line too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } +nmstr[yyleng - 2 - end_is_ws] = '\0'; /* chop trailing brace */ + + if ( (nmdefptr = ndlookup( nmstr )) == 0 ) + format_synerr( + _( "undefined definition {%s}" ), + nmstr ); + + else + { /* push back name surrounded by ()'s */ + int len = strlen( (char *) nmdefptr ); + if (end_is_ws) + unput(end_ch); + + if ( lex_compat || nmdefptr[0] == '^' || + (len > 0 && nmdefptr[len - 1] == '$') + || (end_is_ws && trlcontxt && !sf_skip_ws())) + { /* don't use ()'s after all */ + PUT_BACK_STRING((char *) nmdefptr, 0); + + if ( nmdefptr[0] == '^' ) + BEGIN(CARETISBOL); + } + + else + { + unput(')'); + PUT_BACK_STRING((char *) nmdefptr, 0); + unput('('); + } + } + } + + "/*" { + if (sf_skip_ws()) + yy_push_state(COMMENT_DISCARD); + else{ + /* Push back the "*" and return "/" as usual. */ + yyless(1); + return '/'; + } + } + + "(?#" { + if (lex_compat || posix_compat){ + /* Push back the "?#" and treat it like a normal parens. */ + yyless(1); + sf_push(); + return '('; + } + else + yy_push_state(EXTENDED_COMMENT); + } + "(?" { + sf_push(); + if (lex_compat || posix_compat) + /* Push back the "?" and treat it like a normal parens. */ + yyless(1); + else + BEGIN(GROUP_WITH_PARAMS); + return '('; + } + "(" sf_push(); return '('; + ")" sf_pop(); return ')'; + + [/|*+?.(){}] return (unsigned char) yytext[0]; + . RETURNCHAR; +} + + +<SC>{ + {OPTWS}{NL}{OPTWS} ++linenum; /* Allow blank lines & continuations */ + [,*] return (unsigned char) yytext[0]; + ">" BEGIN(SECT2); return '>'; + ">"/^ BEGIN(CARETISBOL); return '>'; + {SCNAME} RETURNNAME; + . { + format_synerr( _( "bad <start condition>: %s" ), + yytext ); + } +} + +<CARETISBOL>"^" BEGIN(SECT2); return '^'; + + +<QUOTE>{ + [^"\n] RETURNCHAR; + \" BEGIN(SECT2); return '"'; + + {NL} { + synerr( _( "missing quote" ) ); + BEGIN(SECT2); + ++linenum; + return '"'; + } +} + +<GROUP_WITH_PARAMS>{ + ":" BEGIN(SECT2); + "-" BEGIN(GROUP_MINUS_PARAMS); + i sf_set_case_ins(1); + s sf_set_dot_all(1); + x sf_set_skip_ws(1); +} +<GROUP_MINUS_PARAMS>{ + ":" BEGIN(SECT2); + i sf_set_case_ins(0); + s sf_set_dot_all(0); + x sf_set_skip_ws(0); +} + +<FIRSTCCL>{ + "^"/[^-\]\n] BEGIN(CCL); return '^'; + "^"/("-"|"]") return '^'; + . BEGIN(CCL); RETURNCHAR; +} + +<CCL>{ + -/[^\]\n] return '-'; + [^\]\n] RETURNCHAR; + "]" BEGIN(SECT2); return ']'; + .|{NL} { + synerr( _( "bad character class" ) ); + BEGIN(SECT2); + return ']'; + } +} + +<FIRSTCCL,CCL>{ + "[:alnum:]" BEGIN(CCL); return CCE_ALNUM; + "[:alpha:]" BEGIN(CCL); return CCE_ALPHA; + "[:blank:]" BEGIN(CCL); return CCE_BLANK; + "[:cntrl:]" BEGIN(CCL); return CCE_CNTRL; + "[:digit:]" BEGIN(CCL); return CCE_DIGIT; + "[:graph:]" BEGIN(CCL); return CCE_GRAPH; + "[:lower:]" BEGIN(CCL); return CCE_LOWER; + "[:print:]" BEGIN(CCL); return CCE_PRINT; + "[:punct:]" BEGIN(CCL); return CCE_PUNCT; + "[:space:]" BEGIN(CCL); return CCE_SPACE; + "[:upper:]" BEGIN(CCL); return CCE_UPPER; + "[:xdigit:]" BEGIN(CCL); return CCE_XDIGIT; + + "[:^alnum:]" BEGIN(CCL); return CCE_NEG_ALNUM; + "[:^alpha:]" BEGIN(CCL); return CCE_NEG_ALPHA; + "[:^blank:]" BEGIN(CCL); return CCE_NEG_BLANK; + "[:^cntrl:]" BEGIN(CCL); return CCE_NEG_CNTRL; + "[:^digit:]" BEGIN(CCL); return CCE_NEG_DIGIT; + "[:^graph:]" BEGIN(CCL); return CCE_NEG_GRAPH; + "[:^lower:]" BEGIN(CCL); return CCE_NEG_LOWER; + "[:^print:]" BEGIN(CCL); return CCE_NEG_PRINT; + "[:^punct:]" BEGIN(CCL); return CCE_NEG_PUNCT; + "[:^space:]" BEGIN(CCL); return CCE_NEG_SPACE; + "[:^upper:]" BEGIN(CCL); return CCE_NEG_UPPER; + "[:^xdigit:]" BEGIN(CCL); return CCE_NEG_XDIGIT; + {CCL_EXPR} { + format_synerr( + _( "bad character class expression: %s" ), + yytext ); + BEGIN(CCL); return CCE_ALNUM; + } +} + +<NUM>{ + [[:digit:]]+ { + yylval = myctoi( yytext ); + return NUMBER; + } + + "," return ','; + "}" { + BEGIN(SECT2); + if ( lex_compat || posix_compat ) + return END_REPEAT_POSIX; + else + return END_REPEAT_FLEX; + } + + . { + synerr( _( "bad character inside {}'s" ) ); + BEGIN(SECT2); + return '}'; + } + + {NL} { + synerr( _( "missing }" ) ); + BEGIN(SECT2); + ++linenum; + return '}'; + } +} + + +<PERCENT_BRACE_ACTION>{ + {OPTWS}"%}".* bracelevel = 0; + + <ACTION>"/*" ACTION_ECHO; yy_push_state( COMMENT ); + + <CODEBLOCK,ACTION>{ + "reject" { + ACTION_ECHO; + CHECK_REJECT(yytext); + } + "yymore" { + ACTION_ECHO; + CHECK_YYMORE(yytext); + } + } + + {M4QSTART} ACTION_ECHO_QEND; + {M4QEND} ACTION_ECHO_QEND; + . ACTION_ECHO; + {NL} { + ++linenum; + ACTION_ECHO; + if ( bracelevel == 0 || + (doing_codeblock && indented_code) ) + { + if ( doing_rule_action ) + add_action( "\tYY_BREAK\n" ); + + doing_rule_action = doing_codeblock = false; + BEGIN(SECT2); + } + } +} + + + /* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */ +<ACTION>{ + "{" ACTION_ECHO; ++bracelevel; + "}" ACTION_ECHO; --bracelevel; + {M4QSTART} ACTION_ECHO_QEND; + {M4QEND} ACTION_ECHO_QEND; + [^[:alpha:]_{}"'/\n\[\]]+ ACTION_ECHO; + [\[\]] ACTION_ECHO; + {NAME} ACTION_ECHO; + "'"([^'\\\n]|\\.)*"'" ACTION_ECHO; /* character constant */ + \" ACTION_ECHO; BEGIN(ACTION_STRING); + {NL} { + ++linenum; + ACTION_ECHO; + if ( bracelevel == 0 ) + { + if ( doing_rule_action ) + add_action( "\tYY_BREAK\n" ); + + doing_rule_action = false; + BEGIN(SECT2); + } + } + . ACTION_ECHO; +} + +<ACTION_STRING>{ + [^"\\\n]+ ACTION_ECHO; + \\. ACTION_ECHO; + {NL} ++linenum; ACTION_ECHO; BEGIN(ACTION); + \" ACTION_ECHO; BEGIN(ACTION); + . ACTION_ECHO; +} + +<COMMENT,COMMENT_DISCARD,ACTION,ACTION_STRING><<EOF>> { + synerr( _( "EOF encountered inside an action" ) ); + yyterminate(); + } + +<EXTENDED_COMMENT,GROUP_WITH_PARAMS,GROUP_MINUS_PARAMS><<EOF>> { + synerr( _( "EOF encountered inside pattern" ) ); + yyterminate(); + } + +<SECT2,QUOTE,FIRSTCCL,CCL>{ESCSEQ} { + yylval = myesc( (Char *) yytext ); + + if ( YY_START == FIRSTCCL ) + BEGIN(CCL); + + return CHAR; + } + + +<SECT3>{ + {M4QSTART} fwrite (escaped_qstart, 1, strlen(escaped_qstart), yyout); + {M4QEND} fwrite (escaped_qend, 1, strlen(escaped_qend), yyout); + [^\[\]\n]*(\n?) ECHO; + (.|\n) ECHO; + <<EOF>> sectnum = 0; yyterminate(); +} + +<*>.|\n format_synerr( _( "bad character: %s" ), yytext ); + +%% + + +int yywrap() + { + if ( --num_input_files > 0 ) + { + set_input_file( *++input_files ); + return 0; + } + + else + return 1; + } + + +/* set_input_file - open the given file (if NULL, stdin) for scanning */ + +void set_input_file( file ) +char *file; + { + if ( file && strcmp( file, "-" ) ) + { + infilename = copy_string( file ); + yyin = fopen( infilename, "r" ); + + if ( yyin == NULL ) + lerrsf( _( "can't open %s" ), file ); + } + + else + { + yyin = stdin; + infilename = copy_string( "<stdin>" ); + } + + linenum = 1; + } + + +/* Wrapper routines for accessing the scanner's malloc routines. */ + +void *flex_alloc( size ) +size_t size; + { + return (void *) malloc( size ); + } + +void *flex_realloc( ptr, size ) +void *ptr; +size_t size; + { + return (void *) realloc( ptr, size ); + } + +void flex_free( ptr ) +void *ptr; + { + if ( ptr ) + free( ptr ); + } diff --git a/scanflags.c b/scanflags.c new file mode 100644 index 000000000000..20ff501116f2 --- /dev/null +++ b/scanflags.c @@ -0,0 +1,66 @@ +/* scanflags - flags used by scanning. */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" + +scanflags_t* _sf_stk = NULL; +size_t _sf_top_ix=0, _sf_max=0; + +void +sf_push (void) +{ + if (_sf_top_ix + 1 >= _sf_max) + _sf_stk = (scanflags_t*) flex_realloc ( (void*) _sf_stk, sizeof(scanflags_t) * (_sf_max += 32)); + + // copy the top element + _sf_stk[_sf_top_ix + 1] = _sf_stk[_sf_top_ix]; + ++_sf_top_ix; +} + +void +sf_pop (void) +{ + assert(_sf_top_ix > 0); + --_sf_top_ix; +} + +/* one-time initialization. Should be called before any sf_ functions. */ +void +sf_init (void) +{ + assert(_sf_stk == NULL); + _sf_stk = (scanflags_t*) flex_alloc ( sizeof(scanflags_t) * (_sf_max = 32)); + _sf_stk[_sf_top_ix] = 0; +} + +/* vim:set expandtab cindent tabstop=4 softtabstop=4 shiftwidth=4 textwidth=0: */ diff --git a/scanopt.c b/scanopt.c new file mode 100644 index 000000000000..2c8d59319dbf --- /dev/null +++ b/scanopt.c @@ -0,0 +1,874 @@ +/* flex - tool to generate fast lexical analyzers */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" +#include "scanopt.h" + + +/* Internal structures */ + +#ifdef HAVE_STRCASECMP +#define STRCASECMP(a,b) strcasecmp(a,b) +#else +static int STRCASECMP PROTO ((const char *, const char *)); + +static int STRCASECMP (a, b) + const char *a; + const char *b; +{ + while (tolower (*a++) == tolower (*b++)) ; + return b - a; +} +#endif + +#define ARG_NONE 0x01 +#define ARG_REQ 0x02 +#define ARG_OPT 0x04 +#define IS_LONG 0x08 + +struct _aux { + int flags; /* The above hex flags. */ + int namelen; /* Length of the actual option word, e.g., "--file[=foo]" is 4 */ + int printlen; /* Length of entire string, e.g., "--file[=foo]" is 12 */ +}; + + +struct _scanopt_t { + const optspec_t *options; /* List of options. */ + struct _aux *aux; /* Auxiliary data about options. */ + int optc; /* Number of options. */ + int argc; /* Number of args. */ + char **argv; /* Array of strings. */ + int index; /* Used as: argv[index][subscript]. */ + int subscript; + char no_err_msg; /* If true, do not print errors. */ + char has_long; + char has_short; +}; + +/* Accessor functions. These WOULD be one-liners, but portability calls. */ +static const char *NAME PROTO ((struct _scanopt_t *, int)); +static int PRINTLEN PROTO ((struct _scanopt_t *, int)); +static int RVAL PROTO ((struct _scanopt_t *, int)); +static int FLAGS PROTO ((struct _scanopt_t *, int)); +static const char *DESC PROTO ((struct _scanopt_t *, int)); +static int scanopt_err PROTO ((struct _scanopt_t *, int, int, int)); +static int matchlongopt PROTO ((char *, char **, int *, char **, int *)); +static int find_opt +PROTO ((struct _scanopt_t *, int, char *, int, int *, int *opt_offset)); + +static const char *NAME (s, i) + struct _scanopt_t *s; + int i; +{ + return s->options[i].opt_fmt + + ((s->aux[i].flags & IS_LONG) ? 2 : 1); +} + +static int PRINTLEN (s, i) + struct _scanopt_t *s; + int i; +{ + return s->aux[i].printlen; +} + +static int RVAL (s, i) + struct _scanopt_t *s; + int i; +{ + return s->options[i].r_val; +} + +static int FLAGS (s, i) + struct _scanopt_t *s; + int i; +{ + return s->aux[i].flags; +} + +static const char *DESC (s, i) + struct _scanopt_t *s; + int i; +{ + return s->options[i].desc ? s->options[i].desc : ""; +} + +#ifndef NO_SCANOPT_USAGE +static int get_cols PROTO ((void)); + +static int get_cols () +{ + char *env; + int cols = 80; /* default */ + +#ifdef HAVE_NCURSES_H + initscr (); + endwin (); + if (COLS > 0) + return COLS; +#endif + + if ((env = getenv ("COLUMNS")) != NULL) + cols = atoi (env); + + return cols; +} +#endif + +/* Macro to check for NULL before assigning a value. */ +#define SAFE_ASSIGN(ptr,val) \ + do{ \ + if((ptr)!=NULL) \ + *(ptr) = val; \ + }while(0) + +/* Macro to assure we reset subscript whenever we adjust s->index.*/ +#define INC_INDEX(s,n) \ + do{ \ + (s)->index += (n); \ + (s)->subscript= 0; \ + }while(0) + +scanopt_t *scanopt_init (options, argc, argv, flags) + const optspec_t *options; + int argc; + char **argv; + int flags; +{ + int i; + struct _scanopt_t *s; + s = (struct _scanopt_t *) malloc (sizeof (struct _scanopt_t)); + + s->options = options; + s->optc = 0; + s->argc = argc; + s->argv = (char **) argv; + s->index = 1; + s->subscript = 0; + s->no_err_msg = (flags & SCANOPT_NO_ERR_MSG); + s->has_long = 0; + s->has_short = 0; + + /* Determine option count. (Find entry with all zeros). */ + s->optc = 0; + while (options[s->optc].opt_fmt + || options[s->optc].r_val || options[s->optc].desc) + s->optc++; + + /* Build auxiliary data */ + s->aux = (struct _aux *) malloc (s->optc * sizeof (struct _aux)); + + for (i = 0; i < s->optc; i++) { + const char *p, *pname; + const struct optspec_t *opt; + struct _aux *aux; + + opt = s->options + i; + aux = s->aux + i; + + aux->flags = ARG_NONE; + + if (opt->opt_fmt[0] == '-' && opt->opt_fmt[1] == '-') { + aux->flags |= IS_LONG; + pname = opt->opt_fmt + 2; + s->has_long = 1; + } + else { + pname = opt->opt_fmt + 1; + s->has_short = 1; + } + aux->printlen = strlen (opt->opt_fmt); + + aux->namelen = 0; + for (p = pname + 1; *p; p++) { + /* detect required arg */ + if (*p == '=' || isspace (*p) + || !(aux->flags & IS_LONG)) { + if (aux->namelen == 0) + aux->namelen = p - pname; + aux->flags |= ARG_REQ; + aux->flags &= ~ARG_NONE; + } + /* detect optional arg. This overrides required arg. */ + if (*p == '[') { + if (aux->namelen == 0) + aux->namelen = p - pname; + aux->flags &= ~(ARG_REQ | ARG_NONE); + aux->flags |= ARG_OPT; + break; + } + } + if (aux->namelen == 0) + aux->namelen = p - pname; + } + return (scanopt_t *) s; +} + +#ifndef NO_SCANOPT_USAGE +/* these structs are for scanopt_usage(). */ +struct usg_elem { + int idx; + struct usg_elem *next; + struct usg_elem *alias; +}; +typedef struct usg_elem usg_elem; + + +/* Prints a usage message based on contents of optlist. + * Parameters: + * scanner - The scanner, already initialized with scanopt_init(). + * fp - The file stream to write to. + * usage - Text to be prepended to option list. + * Return: Always returns 0 (zero). + * The output looks something like this: + +[indent][option, alias1, alias2...][indent][description line1 + description line2...] + */ +int scanopt_usage (scanner, fp, usage) + scanopt_t *scanner; + FILE *fp; + const char *usage; +{ + struct _scanopt_t *s; + int i, columns, indent = 2; + usg_elem *byr_val = NULL; /* option indices sorted by r_val */ + usg_elem *store; /* array of preallocated elements. */ + int store_idx = 0; + usg_elem *ue; + int maxlen[2]; + int desccol = 0; + int print_run = 0; + + maxlen[0] = 0; + maxlen[1] = 0; + + s = (struct _scanopt_t *) scanner; + + if (usage) { + fprintf (fp, "%s\n", usage); + } + else { + /* Find the basename of argv[0] */ + const char *p; + + p = s->argv[0] + strlen (s->argv[0]); + while (p != s->argv[0] && *p != '/') + --p; + if (*p == '/') + p++; + + fprintf (fp, _("Usage: %s [OPTIONS]...\n"), p); + } + fprintf (fp, "\n"); + + /* Sort by r_val and string. Yes, this is O(n*n), but n is small. */ + store = (usg_elem *) malloc (s->optc * sizeof (usg_elem)); + for (i = 0; i < s->optc; i++) { + + /* grab the next preallocate node. */ + ue = store + store_idx++; + ue->idx = i; + ue->next = ue->alias = NULL; + + /* insert into list. */ + if (!byr_val) + byr_val = ue; + else { + int found_alias = 0; + usg_elem **ue_curr, **ptr_if_no_alias = NULL; + + ue_curr = &byr_val; + while (*ue_curr) { + if (RVAL (s, (*ue_curr)->idx) == + RVAL (s, ue->idx)) { + /* push onto the alias list. */ + ue_curr = &((*ue_curr)->alias); + found_alias = 1; + break; + } + if (!ptr_if_no_alias + && + STRCASECMP (NAME (s, (*ue_curr)->idx), + NAME (s, ue->idx)) > 0) { + ptr_if_no_alias = ue_curr; + } + ue_curr = &((*ue_curr)->next); + } + if (!found_alias && ptr_if_no_alias) + ue_curr = ptr_if_no_alias; + ue->next = *ue_curr; + *ue_curr = ue; + } + } + +#if 0 + if (1) { + printf ("ORIGINAL:\n"); + for (i = 0; i < s->optc; i++) + printf ("%2d: %s\n", i, NAME (s, i)); + printf ("SORTED:\n"); + ue = byr_val; + while (ue) { + usg_elem *ue2; + + printf ("%2d: %s\n", ue->idx, NAME (s, ue->idx)); + for (ue2 = ue->alias; ue2; ue2 = ue2->next) + printf (" +---> %2d: %s\n", ue2->idx, + NAME (s, ue2->idx)); + ue = ue->next; + } + } +#endif + + /* Now build each row of output. */ + + /* first pass calculate how much room we need. */ + for (ue = byr_val; ue; ue = ue->next) { + usg_elem *ap; + int len = 0; + int nshort = 0, nlong = 0; + + +#define CALC_LEN(i) do {\ + if(FLAGS(s,i) & IS_LONG) \ + len += (nlong++||nshort) ? 2+PRINTLEN(s,i) : PRINTLEN(s,i);\ + else\ + len += (nshort++||nlong)? 2+PRINTLEN(s,i) : PRINTLEN(s,i);\ + }while(0) + + if (!(FLAGS (s, ue->idx) & IS_LONG)) + CALC_LEN (ue->idx); + + /* do short aliases first. */ + for (ap = ue->alias; ap; ap = ap->next) { + if (FLAGS (s, ap->idx) & IS_LONG) + continue; + CALC_LEN (ap->idx); + } + + if (FLAGS (s, ue->idx) & IS_LONG) + CALC_LEN (ue->idx); + + /* repeat the above loop, this time for long aliases. */ + for (ap = ue->alias; ap; ap = ap->next) { + if (!(FLAGS (s, ap->idx) & IS_LONG)) + continue; + CALC_LEN (ap->idx); + } + + if (len > maxlen[0]) + maxlen[0] = len; + + /* It's much easier to calculate length for description column! */ + len = strlen (DESC (s, ue->idx)); + if (len > maxlen[1]) + maxlen[1] = len; + } + + /* Determine how much room we have, and how much we will allocate to each col. + * Do not address pathological cases. Output will just be ugly. */ + columns = get_cols () - 1; + if (maxlen[0] + maxlen[1] + indent * 2 > columns) { + /* col 0 gets whatever it wants. we'll wrap the desc col. */ + maxlen[1] = columns - (maxlen[0] + indent * 2); + if (maxlen[1] < 14) /* 14 is arbitrary lower limit on desc width. */ + maxlen[1] = INT_MAX; + } + desccol = maxlen[0] + indent * 2; + +#define PRINT_SPACES(fp,n)\ + do{\ + int _n;\ + _n=(n);\ + while(_n-- > 0)\ + fputc(' ',(fp));\ + }while(0) + + + /* Second pass (same as above loop), this time we print. */ + /* Sloppy hack: We iterate twice. The first time we print short and long options. + The second time we print those lines that have ONLY long options. */ + while (print_run++ < 2) { + for (ue = byr_val; ue; ue = ue->next) { + usg_elem *ap; + int nwords = 0, nchars = 0, has_short = 0; + +/* TODO: get has_short schtick to work */ + has_short = !(FLAGS (s, ue->idx) & IS_LONG); + for (ap = ue->alias; ap; ap = ap->next) { + if (!(FLAGS (s, ap->idx) & IS_LONG)) { + has_short = 1; + break; + } + } + if ((print_run == 1 && !has_short) || + (print_run == 2 && has_short)) + continue; + + PRINT_SPACES (fp, indent); + nchars += indent; + +/* Print, adding a ", " between aliases. */ +#define PRINT_IT(i) do{\ + if(nwords++)\ + nchars+=fprintf(fp,", ");\ + nchars+=fprintf(fp,"%s",s->options[i].opt_fmt);\ + }while(0) + + if (!(FLAGS (s, ue->idx) & IS_LONG)) + PRINT_IT (ue->idx); + + /* print short aliases first. */ + for (ap = ue->alias; ap; ap = ap->next) { + if (!(FLAGS (s, ap->idx) & IS_LONG)) + PRINT_IT (ap->idx); + } + + + if (FLAGS (s, ue->idx) & IS_LONG) + PRINT_IT (ue->idx); + + /* repeat the above loop, this time for long aliases. */ + for (ap = ue->alias; ap; ap = ap->next) { + if (FLAGS (s, ap->idx) & IS_LONG) + PRINT_IT (ap->idx); + } + + /* pad to desccol */ + PRINT_SPACES (fp, desccol - nchars); + + /* Print description, wrapped to maxlen[1] columns. */ + if (1) { + const char *pstart; + + pstart = DESC (s, ue->idx); + while (1) { + int n = 0; + const char *lastws = NULL, *p; + + p = pstart; + + while (*p && n < maxlen[1] + && *p != '\n') { + if (isspace (*p) + || *p == '-') lastws = + p; + n++; + p++; + } + + if (!*p) { /* hit end of desc. done. */ + fprintf (fp, "%s\n", + pstart); + break; + } + else if (*p == '\n') { /* print everything up to here then wrap. */ + fprintf (fp, "%.*s\n", n, + pstart); + PRINT_SPACES (fp, desccol); + pstart = p + 1; + continue; + } + else { /* we hit the edge of the screen. wrap at space if possible. */ + if (lastws) { + fprintf (fp, + "%.*s\n", + lastws - + pstart, + pstart); + pstart = + lastws + 1; + } + else { + fprintf (fp, + "%.*s\n", + n, + pstart); + pstart = p + 1; + } + PRINT_SPACES (fp, desccol); + continue; + } + } + } + } + } /* end while */ + free (store); + return 0; +} +#endif /* no scanopt_usage */ + + +static int scanopt_err (s, opt_offset, is_short, err) + struct _scanopt_t *s; + int opt_offset; + int is_short; + int err; +{ + const char *optname = ""; + char optchar[2]; + const optspec_t *opt = NULL; + + if (opt_offset >= 0) + opt = s->options + opt_offset; + + if (!s->no_err_msg) { + + if (s->index > 0 && s->index < s->argc) { + if (is_short) { + optchar[0] = + s->argv[s->index][s->subscript]; + optchar[1] = '\0'; + optname = optchar; + } + else { + optname = s->argv[s->index]; + } + } + + fprintf (stderr, "%s: ", s->argv[0]); + switch (err) { + case SCANOPT_ERR_ARG_NOT_ALLOWED: + fprintf (stderr, + _ + ("option `%s' doesn't allow an argument\n"), + optname); + break; + case SCANOPT_ERR_ARG_NOT_FOUND: + fprintf (stderr, + _("option `%s' requires an argument\n"), + optname); + break; + case SCANOPT_ERR_OPT_AMBIGUOUS: + fprintf (stderr, _("option `%s' is ambiguous\n"), + optname); + break; + case SCANOPT_ERR_OPT_UNRECOGNIZED: + fprintf (stderr, _("Unrecognized option `%s'\n"), + optname); + break; + default: + fprintf (stderr, _("Unknown error=(%d)\n"), err); + break; + } + } + return err; +} + + +/* Internal. Match str against the regex ^--([^=]+)(=(.*))? + * return 1 if *looks* like a long option. + * 'str' is the only input argument, the rest of the arguments are output only. + * optname will point to str + 2 + * + */ +static int matchlongopt (str, optname, optlen, arg, arglen) + char *str; + char **optname; + int *optlen; + char **arg; + int *arglen; +{ + char *p; + + *optname = *arg = (char *) 0; + *optlen = *arglen = 0; + + /* Match regex /--./ */ + p = str; + if (p[0] != '-' || p[1] != '-' || !p[2]) + return 0; + + p += 2; + *optname = (char *) p; + + /* find the end of optname */ + while (*p && *p != '=') + ++p; + + *optlen = p - *optname; + + if (!*p) + /* an option with no '=...' part. */ + return 1; + + + /* We saw an '=' char. The rest of p is the arg. */ + p++; + *arg = p; + while (*p) + ++p; + *arglen = p - *arg; + + return 1; +} + + +/* Internal. Look up long or short option by name. + * Long options must match a non-ambiguous prefix, or exact match. + * Short options must be exact. + * Return boolean true if found and no error. + * Error stored in err_code or zero if no error. */ +static int find_opt (s, lookup_long, optstart, len, err_code, opt_offset) + struct _scanopt_t *s; + int lookup_long; + char *optstart; + int len; + int *err_code; + int *opt_offset; +{ + int nmatch = 0, lastr_val = 0, i; + + *err_code = 0; + *opt_offset = -1; + + if (!optstart) + return 0; + + for (i = 0; i < s->optc; i++) { + char *optname; + + optname = + (char *) (s->options[i].opt_fmt + + (lookup_long ? 2 : 1)); + + if (lookup_long && (s->aux[i].flags & IS_LONG)) { + if (len > s->aux[i].namelen) + continue; + + if (strncmp (optname, optstart, len) == 0) { + nmatch++; + *opt_offset = i; + + /* exact match overrides all. */ + if (len == s->aux[i].namelen) { + nmatch = 1; + break; + } + + /* ambiguity is ok between aliases. */ + if (lastr_val + && lastr_val == + s->options[i].r_val) nmatch--; + lastr_val = s->options[i].r_val; + } + } + else if (!lookup_long && !(s->aux[i].flags & IS_LONG)) { + if (optname[0] == optstart[0]) { + nmatch++; + *opt_offset = i; + } + } + } + + if (nmatch == 0) { + *err_code = SCANOPT_ERR_OPT_UNRECOGNIZED; + *opt_offset = -1; + } + else if (nmatch > 1) { + *err_code = SCANOPT_ERR_OPT_AMBIGUOUS; + *opt_offset = -1; + } + + return *err_code ? 0 : 1; +} + + +int scanopt (svoid, arg, optindex) + scanopt_t *svoid; + char **arg; + int *optindex; +{ + char *optname = NULL, *optarg = NULL, *pstart; + int namelen = 0, arglen = 0; + int errcode = 0, has_next; + const optspec_t *optp; + struct _scanopt_t *s; + struct _aux *auxp; + int is_short; + int opt_offset = -1; + + s = (struct _scanopt_t *) svoid; + + /* Normalize return-parameters. */ + SAFE_ASSIGN (arg, NULL); + SAFE_ASSIGN (optindex, s->index); + + if (s->index >= s->argc) + return 0; + + /* pstart always points to the start of our current scan. */ + pstart = s->argv[s->index] + s->subscript; + if (!pstart) + return 0; + + if (s->subscript == 0) { + + /* test for exact match of "--" */ + if (pstart[0] == '-' && pstart[1] == '-' && !pstart[2]) { + SAFE_ASSIGN (optindex, s->index + 1); + INC_INDEX (s, 1); + return 0; + } + + /* Match an opt. */ + if (matchlongopt + (pstart, &optname, &namelen, &optarg, &arglen)) { + + /* it LOOKS like an opt, but is it one?! */ + if (!find_opt + (s, 1, optname, namelen, &errcode, + &opt_offset)) { + scanopt_err (s, opt_offset, 0, errcode); + return errcode; + } + /* We handle this below. */ + is_short = 0; + + /* Check for short opt. */ + } + else if (pstart[0] == '-' && pstart[1]) { + /* Pass through to below. */ + is_short = 1; + s->subscript++; + pstart++; + } + + else { + /* It's not an option. We're done. */ + return 0; + } + } + + /* We have to re-check the subscript status because it + * may have changed above. */ + + if (s->subscript != 0) { + + /* we are somewhere in a run of short opts, + * e.g., at the 'z' in `tar -xzf` */ + + optname = pstart; + namelen = 1; + is_short = 1; + + if (!find_opt + (s, 0, pstart, namelen, &errcode, &opt_offset)) { + return scanopt_err (s, opt_offset, 1, errcode); + } + + optarg = pstart + 1; + if (!*optarg) { + optarg = NULL; + arglen = 0; + } + else + arglen = strlen (optarg); + } + + /* At this point, we have a long or short option matched at opt_offset into + * the s->options array (and corresponding aux array). + * A trailing argument is in {optarg,arglen}, if any. + */ + + /* Look ahead in argv[] to see if there is something + * that we can use as an argument (if needed). */ + has_next = s->index + 1 < s->argc + && strcmp ("--", s->argv[s->index + 1]) != 0; + + optp = s->options + opt_offset; + auxp = s->aux + opt_offset; + + /* case: no args allowed */ + if (auxp->flags & ARG_NONE) { + if (optarg && !is_short) { + scanopt_err (s, opt_offset, is_short, errcode = + SCANOPT_ERR_ARG_NOT_ALLOWED); + INC_INDEX (s, 1); + return errcode; + } + else if (!optarg) + INC_INDEX (s, 1); + else + s->subscript++; + return optp->r_val; + } + + /* case: required */ + if (auxp->flags & ARG_REQ) { + if (!optarg && !has_next) + return scanopt_err (s, opt_offset, is_short, + SCANOPT_ERR_ARG_NOT_FOUND); + + if (!optarg) { + /* Let the next argv element become the argument. */ + SAFE_ASSIGN (arg, s->argv[s->index + 1]); + INC_INDEX (s, 2); + } + else { + SAFE_ASSIGN (arg, (char *) optarg); + INC_INDEX (s, 1); + } + return optp->r_val; + } + + /* case: optional */ + if (auxp->flags & ARG_OPT) { + SAFE_ASSIGN (arg, optarg); + INC_INDEX (s, 1); + return optp->r_val; + } + + + /* Should not reach here. */ + return 0; +} + + +int scanopt_destroy (svoid) + scanopt_t *svoid; +{ + struct _scanopt_t *s; + + s = (struct _scanopt_t *) svoid; + if (s) { + if (s->aux) + free (s->aux); + free (s); + } + return 0; +} + + +/* vim:set tabstop=8 softtabstop=4 shiftwidth=4: */ diff --git a/scanopt.h b/scanopt.h new file mode 100644 index 000000000000..359a18a8b467 --- /dev/null +++ b/scanopt.h @@ -0,0 +1,132 @@ +/* flex - tool to generate fast lexical analyzers */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#ifndef SCANOPT_H +#define SCANOPT_H + +#include "flexdef.h" + + +#ifndef NO_SCANOPT_USAGE +/* Used by scanopt_usage for pretty-printing. */ +#ifdef HAVE_NCURSES_H +#include <ncurses.h> +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#ifndef PROTO +#define PROTO(args) args +#endif +/* Error codes. */ enum scanopt_err_t { + SCANOPT_ERR_OPT_UNRECOGNIZED = -1, /* Unrecognized option. */ + SCANOPT_ERR_OPT_AMBIGUOUS = -2, /* It matched more than one option name. */ + SCANOPT_ERR_ARG_NOT_FOUND = -3, /* The required arg was not found. */ + SCANOPT_ERR_ARG_NOT_ALLOWED = -4 /* Option does not take an argument. */ + }; + + +/* flags passed to scanopt_init */ + enum scanopt_flag_t { + SCANOPT_NO_ERR_MSG = 0x01 /* Suppress printing to stderr. */ + }; + +/* Specification for a single option. */ + struct optspec_t { + const char *opt_fmt; /* e.g., "--foo=FILE", "-f FILE", "-n [NUM]" */ + int r_val; /* Value to be returned by scanopt_ex(). */ + const char *desc; /* Brief description of this option, or NULL. */ + }; + typedef struct optspec_t optspec_t; + + +/* Used internally by scanopt() to maintain state. */ +/* Never modify these value directly. */ + typedef void *scanopt_t; + + +/* Initializes scanner and checks option list for errors. + * Parameters: + * options - Array of options. + * argc - Same as passed to main(). + * argv - Same as passed to main(). First element is skipped. + * flags - Control behavior. + * Return: A malloc'd pointer . + */ + scanopt_t *scanopt_init PROTO ((const optspec_t * options, + int argc, char **argv, int flags)); + +/* Frees memory used by scanner. + * Always returns 0. */ + int scanopt_destroy PROTO ((scanopt_t * scanner)); + +#ifndef NO_SCANOPT_USAGE +/* Prints a usage message based on contents of optlist. + * Parameters: + * scanner - The scanner, already initialized with scanopt_init(). + * fp - The file stream to write to. + * usage - Text to be prepended to option list. May be NULL. + * Return: Always returns 0 (zero). + */ + int scanopt_usage + PROTO ( + (scanopt_t * scanner, FILE * fp, + const char *usage)); +#endif + +/* Scans command-line options in argv[]. + * Parameters: + * scanner - The scanner, already initialized with scanopt_init(). + * optarg - Return argument, may be NULL. + * On success, it points to start of an argument. + * optindex - Return argument, may be NULL. + * On success or failure, it is the index of this option. + * If return is zero, then optindex is the NEXT valid option index. + * + * Return: > 0 on success. Return value is from optspec_t->rval. + * == 0 if at end of options. + * < 0 on error (return value is an error code). + * + */ + int scanopt + PROTO ( + (scanopt_t * scanner, char **optarg, + int *optindex)); + +#ifdef __cplusplus +} +#endif +#endif +/* vim:set tabstop=8 softtabstop=4 shiftwidth=4: */ diff --git a/skel.c b/skel.c new file mode 100644 index 000000000000..ee9f6ef30b5c --- /dev/null +++ b/skel.c @@ -0,0 +1,3713 @@ +/* File created from flex.skl via mkskel.sh */ + +#include "flexdef.h" + +const char *skel[] = { + "%# -*-C-*- vi: set ft=c:", + "%# This file is processed in several stages.", + "%# Here are the stages, as best as I can describe:", + "%#", + "%# 1. flex.skl is processed through GNU m4 during the", + "%# pre-compilation stage of flex. Only macros starting", + "%# with `m4_' are processed, and quoting is normal.", + "%#", + "%# 2. The preprocessed skeleton is translated verbatim into a", + "%# C array, saved as \"skel.c\" and compiled into the flex binary.", + "%#", + "%# 3. At runtime, the skeleton is generated and filtered (again)", + "%# through m4. Macros beginning with `m4_' will be processed.", + "%# The quoting is \"[[\" and \"]]\" so we don't interfere with", + "%# user code.", + "%# ", + "%# All generate macros for the m4 stage contain the text \"m4\" or \"M4\"", + "%# in them. This is to distinguish them from CPP macros.", + "%# The exception to this rule is YY_G, which is an m4 macro, ", + "%# but it needs to be remain short because it is used everywhere.", + "%#", + "/* A lexical scanner generated by flex */", + "", + "%# Macros for preproc stage.", + "", + "", + "%# Macros for runtime processing stage.", + "m4_changecom", + "m4_changequote", + "m4_changequote([[, ]])", + "", + "%# ", + "%# Lines in this skeleton starting with a \"%\" character are \"control lines\"", + "%# and affect the generation of the scanner. The possible control codes are", + "%# listed and processed in misc.c.", + "%#", + "%# %# - A comment. The current line is omitted from the generated scanner.", + "%# %if-c++-only - The following lines are printed for C++ scanners ONLY.", + "%# %if-c-only - The following lines are NOT printed for C++ scanners.", + "%# %if-c-or-c++ - The following lines are printed in BOTH C and C++ scanners.", + "%# %if-reentrant - Print for reentrant scanners.(push)", + "%# %if-not-reentrant - Print for non-reentrant scanners. (push)", + "%# %if-bison-bridge - Print for bison-bridge. (push)", + "%# %if-not-bison-bridge - Print for non-bison-bridge. (push)", + "%# %endif - pop from the previous if code.", + "%# %% - A stop-point, where code is inserted by flex.", + "%# Each stop-point is numbered here and also in the code generator.", + "%# (See gen.c, etc. for details.)", + "%# %not-for-header - Begin code that should NOT appear in a \".h\" file.", + "%# %ok-for-header - %c and %e are used for building a header file.", + "%# %if-tables-serialization", + "%#", + "%# All control-lines EXCEPT comment lines (\"%#\") will be inserted into", + "%# the generated scanner as a C-style comment. This is to aid those who", + "%# edit the skeleton.", + "%#", + "", + "%not-for-header", + "%if-c-only", + "%if-not-reentrant", + "m4_ifelse(M4_YY_PREFIX,yy,,", + "#define yy_create_buffer M4_YY_PREFIX[[_create_buffer]]", + "#define yy_delete_buffer M4_YY_PREFIX[[_delete_buffer]]", + "#define yy_flex_debug M4_YY_PREFIX[[_flex_debug]]", + "#define yy_init_buffer M4_YY_PREFIX[[_init_buffer]]", + "#define yy_flush_buffer M4_YY_PREFIX[[_flush_buffer]]", + "#define yy_load_buffer_state M4_YY_PREFIX[[_load_buffer_state]]", + "#define yy_switch_to_buffer M4_YY_PREFIX[[_switch_to_buffer]]", + "#define yyin M4_YY_PREFIX[[in]]", + "#define yyleng M4_YY_PREFIX[[leng]]", + "#define yylex M4_YY_PREFIX[[lex]]", + "#define yylineno M4_YY_PREFIX[[lineno]]", + "#define yyout M4_YY_PREFIX[[out]]", + "#define yyrestart M4_YY_PREFIX[[restart]]", + "#define yytext M4_YY_PREFIX[[text]]", + "#define yywrap M4_YY_PREFIX[[wrap]]", + "#define yyalloc M4_YY_PREFIX[[alloc]]", + "#define yyrealloc M4_YY_PREFIX[[realloc]]", + "#define yyfree M4_YY_PREFIX[[free]]", + ")", + "%endif", + "%endif", + "%ok-for-header", + "", + "#define FLEX_SCANNER", + "#define YY_FLEX_MAJOR_VERSION 2", + "#define YY_FLEX_MINOR_VERSION 5", + "#define YY_FLEX_SUBMINOR_VERSION 35", + "#if YY_FLEX_SUBMINOR_VERSION > 0", + "#define FLEX_BETA", + "#endif", + "", + "%# Some negated symbols", + "m4_ifdef( [[M4_YY_IN_HEADER]], , [[m4_define([[M4_YY_NOT_IN_HEADER]], [[]])]])", + "m4_ifdef( [[M4_YY_REENTRANT]], , [[m4_define([[M4_YY_NOT_REENTRANT]], [[]])]])", + "", + "%# This is the m4 way to say \"(stack_used || is_reentrant)", + "m4_ifdef( [[M4_YY_STACK_USED]], [[m4_define([[M4_YY_HAS_START_STACK_VARS]])]])", + "m4_ifdef( [[M4_YY_REENTRANT]], [[m4_define([[M4_YY_HAS_START_STACK_VARS]])]])", + "", + "%# Prefixes.", + "%# The complexity here is necessary so that m4 preserves", + "%# the argument lists to each C function.", + "", + "", + "m4_ifdef( [[M4_YY_PREFIX]],, [[m4_define([[M4_YY_PREFIX]], [[yy]])]])", + "", + "", + "", + "%if-c++-only", + " /* The c++ scanner is a mess. The FlexLexer.h header file relies on the", + " * following macro. This is required in order to pass the c++-multiple-scanners", + " * test in the regression suite. We get reports that it breaks inheritance.", + " * We will address this in a future release of flex, or omit the C++ scanner", + " * altogether.", + " */", + " #define yyFlexLexer M4_YY_PREFIX[[FlexLexer]]", + "%endif", + "", + "%if-c-only", + " m4_define(yy[[_create_buffer]], [[M4_YY_PREFIX[[_create_buffer]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[_delete_buffer]], [[M4_YY_PREFIX[[_delete_buffer]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[_scan_buffer]], [[M4_YY_PREFIX[[_scan_buffer]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[_scan_string]], [[M4_YY_PREFIX[[_scan_string]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[_scan_bytes]], [[M4_YY_PREFIX[[_scan_bytes]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[_init_buffer]], [[M4_YY_PREFIX[[_init_buffer]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[_flush_buffer]], [[M4_YY_PREFIX[[_flush_buffer]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[_load_buffer_state]], [[M4_YY_PREFIX[[_load_buffer_state]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[_switch_to_buffer]], [[M4_YY_PREFIX[[_switch_to_buffer]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[push_buffer_state]], [[M4_YY_PREFIX[[push_buffer_state]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[pop_buffer_state]], [[M4_YY_PREFIX[[pop_buffer_state]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[ensure_buffer_stack]], [[M4_YY_PREFIX[[ensure_buffer_stack]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[lex]], [[M4_YY_PREFIX[[lex]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[restart]], [[M4_YY_PREFIX[[restart]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[lex_init]], [[M4_YY_PREFIX[[lex_init]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[lex_init_extra]], [[M4_YY_PREFIX[[lex_init_extra]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[lex_destroy]], [[M4_YY_PREFIX[[lex_destroy]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[get_debug]], [[M4_YY_PREFIX[[get_debug]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[set_debug]], [[M4_YY_PREFIX[[set_debug]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[get_extra]], [[M4_YY_PREFIX[[get_extra]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[set_extra]], [[M4_YY_PREFIX[[set_extra]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[get_in]], [[M4_YY_PREFIX[[get_in]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[set_in]], [[M4_YY_PREFIX[[set_in]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[get_out]], [[M4_YY_PREFIX[[get_out]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[set_out]], [[M4_YY_PREFIX[[set_out]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[get_leng]], [[M4_YY_PREFIX[[get_leng]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[get_text]], [[M4_YY_PREFIX[[get_text]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[get_lineno]], [[M4_YY_PREFIX[[get_lineno]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[set_lineno]], [[M4_YY_PREFIX[[set_lineno]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_ifdef( [[M4_YY_REENTRANT]],", + " [[", + " m4_define(yy[[get_column]], [[M4_YY_PREFIX[[get_column]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[set_column]], [[M4_YY_PREFIX[[set_column]]m4_ifelse($#,0,,[[($@)]])]])", + " ]])", + " m4_define(yy[[wrap]], [[M4_YY_PREFIX[[wrap]]m4_ifelse($#,0,,[[($@)]])]])", + "%endif", + "", + "m4_ifdef( [[M4_YY_BISON_LVAL]],", + "[[", + " m4_define(yy[[get_lval]], [[M4_YY_PREFIX[[get_lval]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[set_lval]], [[M4_YY_PREFIX[[set_lval]]m4_ifelse($#,0,,[[($@)]])]])", + "]])", + "", + "m4_ifdef( [[<M4_YY_BISON_LLOC>]],", + "[[", + " m4_define(yy[[get_lloc]], [[M4_YY_PREFIX[[get_lloc]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[set_lloc]], [[M4_YY_PREFIX[[set_lloc]]m4_ifelse($#,0,,[[($@)]])]])", + "]])", + "", + "", + " m4_define(yy[[alloc]], [[M4_YY_PREFIX[[alloc]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[realloc]], [[M4_YY_PREFIX[[realloc]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[free]], [[M4_YY_PREFIX[[free]]m4_ifelse($#,0,,[[($@)]])]])", + "", + "%if-c-only", + "m4_ifdef( [[M4_YY_NOT_REENTRANT]],", + "[[", + " m4_define(yy[[text]], [[M4_YY_PREFIX[[text]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[leng]], [[M4_YY_PREFIX[[leng]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[in]], [[M4_YY_PREFIX[[in]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[out]], [[M4_YY_PREFIX[[out]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[_flex_debug]], [[M4_YY_PREFIX[[_flex_debug]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[lineno]], [[M4_YY_PREFIX[[lineno]]m4_ifelse($#,0,,[[($@)]])]])", + "]])", + "%endif", + "", + "", + "m4_ifdef( [[M4_YY_TABLES_EXTERNAL]],", + "[[", + " m4_define(yy[[tables_fload]], [[M4_YY_PREFIX[[tables_fload]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[tables_destroy]], [[M4_YY_PREFIX[[tables_destroy]]m4_ifelse($#,0,,[[($@)]])]])", + " m4_define(yy[[TABLES_NAME]], [[M4_YY_PREFIX[[TABLES_NAME]]m4_ifelse($#,0,,[[($@)]])]])", + "]])", + "", + "/* 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", + "#include <sys/types.h>", + "#include <netinet/in.h>", + "%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", + "", + "/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,", + " * if you want the limit (max/min) macros for int types. ", + " */", + "#ifndef __STDC_LIMIT_MACROS", + "#define __STDC_LIMIT_MACROS 1", + "#endif", + "", + "#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", + "/* begin standard C++ headers. */", + "#include <iostream> ", + "#include <errno.h>", + "#include <cstdlib>", + "#include <cstring>", + "/* end standard C++ headers. */", + "%endif", + "", + "#ifdef __cplusplus", + "", + "/* The \"const\" storage-class-modifier is valid. */", + "#define YY_USE_CONST", + "", + "#else /* ! __cplusplus */", + "", + "/* C99 requires __STDC__ to be defined as 1. */", + "#if defined (__STDC__)", + "", + "#define YY_USE_CONST", + "", + "#endif /* defined (__STDC__) */", + "#endif /* ! __cplusplus */", + "", + "#ifdef YY_USE_CONST", + "#define yyconst const", + "#else", + "#define yyconst", + "#endif", + "", + "%# For compilers that can not handle prototypes.", + "%# e.g.,", + "%# The function prototype", + "%# int foo(int x, char* y);", + "%# ", + "%# ...should be written as", + "%# int foo M4_YY_PARAMS(int x, char* y);", + "%# ", + "%# ...which could possibly generate", + "%# int foo ();", + "%# ", + "m4_ifdef( [[M4_YY_NO_ANSI_FUNC_PROTOS]],", + "[[", + " m4_define( [[M4_YY_PARAMS]], [[()]])", + "]],", + "[[", + " m4_define( [[M4_YY_PARAMS]], [[($*)]])", + "]])", + "", + "%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", + "", + "/* An opaque pointer. */", + "#ifndef YY_TYPEDEF_YY_SCANNER_T", + "#define YY_TYPEDEF_YY_SCANNER_T", + "typedef void* yyscan_t;", + "#endif", + "", + "%# Declare yyguts variable", + "m4_define( [[M4_YY_DECL_GUTS_VAR]], [[struct yyguts_t * yyg = (struct yyguts_t*)yyscanner]])", + "%# For use wherever a Global is accessed or assigned.", + "m4_define( [[YY_G]], [[yyg->$1]])", + "", + "%# For use in function prototypes to append the additional argument.", + "m4_define( [[M4_YY_PROTO_LAST_ARG]], [[, yyscan_t yyscanner]])", + "m4_define( [[M4_YY_PROTO_ONLY_ARG]], [[yyscan_t yyscanner]])", + "", + "%# For use in function definitions to append the additional argument.", + "m4_ifdef( [[M4_YY_NO_ANSI_FUNC_DEFS]],", + "[[", + " m4_define( [[M4_YY_DEF_LAST_ARG]], [[, yyscanner]])", + " m4_define( [[M4_YY_DEF_ONLY_ARG]], [[yyscanner]])", + "]],", + "[[", + " m4_define( [[M4_YY_DEF_LAST_ARG]], [[, yyscan_t yyscanner]])", + " m4_define( [[M4_YY_DEF_ONLY_ARG]], [[yyscan_t yyscanner]])", + "]])", + "m4_define( [[M4_YY_DECL_LAST_ARG]], [[yyscan_t yyscanner;]])", + "", + "%# For use in function calls to pass the additional argument.", + "m4_define( [[M4_YY_CALL_LAST_ARG]], [[, yyscanner]])", + "m4_define( [[M4_YY_CALL_ONLY_ARG]], [[yyscanner]])", + "", + "%# For use in function documentation to adjust for additional argument.", + "m4_define( [[M4_YY_DOC_PARAM]], [[@param yyscanner The scanner object.]])", + "", + "/* For convenience, these vars (plus the bison vars far below)", + " are macros in the reentrant scanner. */", + "#define yyin YY_G(yyin_r)", + "#define yyout YY_G(yyout_r)", + "#define yyextra YY_G(yyextra_r)", + "#define yyleng YY_G(yyleng_r)", + "#define yytext YY_G(yytext_r)", + "#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)", + "#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)", + "#define yy_flex_debug YY_G(yy_flex_debug_r)", + "", + "m4_define( [[M4_YY_INCR_LINENO]],", + "[[ ", + " do{ yylineno++;", + " yycolumn=0;", + " }while(0)", + "]])", + "", + "%endif", + "", + "", + "", + "%if-not-reentrant", + "", + "m4_define( [[M4_YY_INCR_LINENO]],", + "[[ ", + " yylineno++;", + "]])", + "", + "%# Define these macros to be no-ops.", + "m4_define( [[M4_YY_DECL_GUTS_VAR]], [[m4_dnl]])", + "m4_define( [[YY_G]], [[($1)]])", + "m4_define( [[M4_YY_PROTO_LAST_ARG]])", + "m4_define( [[M4_YY_PROTO_ONLY_ARG]], [[void]])", + "m4_define( [[M4_YY_DEF_LAST_ARG]])", + "", + "m4_ifdef( [[M4_YY_NO_ANSI_FUNC_DEFS]],", + "[[", + " m4_define( [[M4_YY_DEF_ONLY_ARG]])", + "]],", + "[[", + " m4_define( [[M4_YY_DEF_ONLY_ARG]], [[void]])", + "]])", + "m4_define([[M4_YY_DECL_LAST_ARG]])", + "m4_define([[M4_YY_CALL_LAST_ARG]])", + "m4_define([[M4_YY_CALL_ONLY_ARG]])", + "m4_define( [[M4_YY_DOC_PARAM]], [[]])", + "", + "%endif", + "", + "", + "m4_ifdef( [[M4_YY_NO_ANSI_FUNC_DEFS]],", + "[[", + "%# For compilers that need traditional function definitions.", + "%# e.g.,", + "%# The function prototype taking 2 arguments", + "%# int foo (int x, char* y)", + "%#", + "%# ...should be written as", + "%# int foo YYFARGS2(int,x, char*,y)", + "%#", + "%# ...which could possibly generate", + "%# int foo (x,y,yyscanner)", + "%# int x;", + "%# char * y;", + "%# yyscan_t yyscanner;", + "%#", + "%# Generate traditional function defs", + " m4_define( [[YYFARGS0]], [[(M4_YY_DEF_ONLY_ARG) [[\\]]", + " M4_YY_DECL_LAST_ARG]])", + " m4_define( [[YYFARGS1]], [[($2 M4_YY_DEF_LAST_ARG) [[\\]]", + " $1 $2; [[\\]]", + " M4_YY_DECL_LAST_ARG]])", + " m4_define( [[YYFARGS2]], [[($2,$4 M4_YY_DEF_LAST_ARG) [[\\]]", + " $1 $2; [[\\]]", + " $3 $4; [[\\]]", + " M4_YY_DECL_LAST_ARG]])", + " m4_define( [[YYFARGS3]], [[($2,$4,$6 M4_YY_DEF_LAST_ARG) [[\\]]", + " $1 $2; [[\\]]", + " $3 $4; [[\\]]", + " $5 $6; [[\\]]", + " M4_YY_DECL_LAST_ARG]])", + "]],", + "[[", + "%# Generate C99 function defs.", + " m4_define( [[YYFARGS0]], [[(M4_YY_DEF_ONLY_ARG)]])", + " m4_define( [[YYFARGS1]], [[($1 $2 M4_YY_DEF_LAST_ARG)]])", + " m4_define( [[YYFARGS2]], [[($1 $2, $3 $4 M4_YY_DEF_LAST_ARG)]])", + " m4_define( [[YYFARGS3]], [[($1 $2, $3 $4, $5 $6 M4_YY_DEF_LAST_ARG)]])", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* 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_G(yy_start) = 1 + 2 *", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* 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_G(yy_start) - 1) / 2)", + "#define YYSTATE YY_START", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* Action number for EOF rule of a given start state. */", + "#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* Special action meaning \"start processing a new file\". */", + "#define YY_NEW_FILE yyrestart( yyin M4_YY_CALL_LAST_ARG )", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "#define YY_END_OF_BUFFER_CHAR 0", + "]])", + "", + "/* Size of default input buffer. */", + "#ifndef YY_BUF_SIZE", + "#define YY_BUF_SIZE 16384", + "#endif", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* The state buf must be large enough to hold one state per character in the main buffer.", + " */", + "#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))", + "]])", + "", + "", + "#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 yyleng;", + "%endif", + "", + "%if-c-only", + "%if-not-reentrant", + "extern FILE *yyin, *yyout;", + "%endif", + "%endif", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "#define EOB_ACT_CONTINUE_SCAN 0", + "#define EOB_ACT_END_OF_FILE 1", + "#define EOB_ACT_LAST_MATCH 2", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + " m4_ifdef( [[M4_YY_USE_LINENO]],", + " [[", + " /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires", + " * access to the local variable yy_act. Since yyless() is a macro, it would break", + " * existing scanners that call yyless() from OUTSIDE yylex. ", + " * One obvious solution it to make yy_act a global. I tried that, and saw", + " * a 5% performance hit in a non-yylineno scanner, because yy_act is", + " * normally declared as a register variable-- so it is not worth it.", + " */", + " #define YY_LESS_LINENO(n) \\", + " do { \\", + " int yyl;\\", + " for ( yyl = n; yyl < yyleng; ++yyl )\\", + " if ( yytext[yyl] == '\\n' )\\", + " --yylineno;\\", + " }while(0)", + " ]],", + " [[", + " #define YY_LESS_LINENO(n)", + " ]])", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* Return all but the first \"n\" matched characters back to the input stream. */", + "#define yyless(n) \\", + " do \\", + " { \\", + " /* Undo effects of setting up yytext. */ \\", + " int yyless_macro_arg = (n); \\", + " YY_LESS_LINENO(yyless_macro_arg);\\", + " *yy_cp = YY_G(yy_hold_char); \\", + " YY_RESTORE_YY_MORE_OFFSET \\", + " YY_G(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \\", + " YY_DO_BEFORE_ACTION; /* set up yytext again */ \\", + " } \\", + " while ( 0 )", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "#define unput(c) yyunput( c, YY_G(yytext_ptr) M4_YY_CALL_LAST_ARG )", + "]])", + "", + "#ifndef YY_TYPEDEF_YY_SIZE_T", + "#define YY_TYPEDEF_YY_SIZE_T", + "typedef size_t 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", + " std::istream* yy_input_file;", + "%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;", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "#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 yyrestart()), so that the user can continue scanning by", + " * just pointing yyin 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", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* 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_G(yy_buffer_stack) \\", + " ? YY_G(yy_buffer_stack)[YY_G(yy_buffer_stack_top)] \\", + " : NULL)", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* 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_G(yy_buffer_stack)[YY_G(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 yytext is formed. */", + "static char yy_hold_char;", + "static int yy_n_chars; /* number of characters read into yy_ch_buf */", + "int yyleng;", + "", + "/* Points to current character in buffer. */", + "static char *yy_c_buf_p = (char *) 0;", + "static int yy_init = 0; /* whether we need to initialize */", + "static int yy_start = 0; /* start state number */", + "", + "/* Flag which is used to allow yywrap()'s to do buffer switches", + " * instead of setting up a fresh yyin. A bit of a hack ...", + " */", + "static int yy_did_buffer_switch_on_eof;", + "%ok-for-header", + "%endif", + "", + "void yyrestart M4_YY_PARAMS( FILE *input_file M4_YY_PROTO_LAST_ARG );", + "void yy_switch_to_buffer M4_YY_PARAMS( YY_BUFFER_STATE new_buffer M4_YY_PROTO_LAST_ARG );", + "YY_BUFFER_STATE yy_create_buffer M4_YY_PARAMS( FILE *file, int size M4_YY_PROTO_LAST_ARG );", + "void yy_delete_buffer M4_YY_PARAMS( YY_BUFFER_STATE b M4_YY_PROTO_LAST_ARG );", + "void yy_flush_buffer M4_YY_PARAMS( YY_BUFFER_STATE b M4_YY_PROTO_LAST_ARG );", + "void yypush_buffer_state M4_YY_PARAMS( YY_BUFFER_STATE new_buffer M4_YY_PROTO_LAST_ARG );", + "void yypop_buffer_state M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "static void yyensure_buffer_stack M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "static void yy_load_buffer_state M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "static void yy_init_buffer M4_YY_PARAMS( YY_BUFFER_STATE b, FILE *file M4_YY_PROTO_LAST_ARG );", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER M4_YY_CALL_LAST_ARG)", + "]])", + "", + "YY_BUFFER_STATE yy_scan_buffer M4_YY_PARAMS( char *base, yy_size_t size M4_YY_PROTO_LAST_ARG );", + "YY_BUFFER_STATE yy_scan_string M4_YY_PARAMS( yyconst char *yy_str M4_YY_PROTO_LAST_ARG );", + "YY_BUFFER_STATE yy_scan_bytes M4_YY_PARAMS( yyconst char *bytes, int len M4_YY_PROTO_LAST_ARG );", + "", + "%endif", + "", + "void *yyalloc M4_YY_PARAMS( yy_size_t M4_YY_PROTO_LAST_ARG );", + "void *yyrealloc M4_YY_PARAMS( void *, yy_size_t M4_YY_PROTO_LAST_ARG );", + "void yyfree M4_YY_PARAMS( void * M4_YY_PROTO_LAST_ARG );", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "#define yy_new_buffer yy_create_buffer", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "#define yy_set_interactive(is_interactive) \\", + " { \\", + " if ( ! YY_CURRENT_BUFFER ){ \\", + " yyensure_buffer_stack (M4_YY_CALL_ONLY_ARG); \\", + " YY_CURRENT_BUFFER_LVALUE = \\", + " yy_create_buffer( yyin, YY_BUF_SIZE M4_YY_CALL_LAST_ARG); \\", + " } \\", + " YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \\", + " }", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "#define yy_set_bol(at_bol) \\", + " { \\", + " if ( ! YY_CURRENT_BUFFER ){\\", + " yyensure_buffer_stack (M4_YY_CALL_ONLY_ARG); \\", + " YY_CURRENT_BUFFER_LVALUE = \\", + " yy_create_buffer( yyin, YY_BUF_SIZE M4_YY_CALL_LAST_ARG); \\", + " } \\", + " YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \\", + " }", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)", + "]])", + "", + "%% [1.0] yytext/yyin/yyout/yy_state_type/yylineno etc. def's & init go here", + "", + "%if-c-only Standard (non-C++) definition", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "static yy_state_type yy_get_previous_state M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "static yy_state_type yy_try_NUL_trans M4_YY_PARAMS( yy_state_type current_state M4_YY_PROTO_LAST_ARG);", + "static int yy_get_next_buffer M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "static void yy_fatal_error M4_YY_PARAMS( yyconst char msg[] M4_YY_PROTO_LAST_ARG );", + "]])", + "", + "%endif", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* Done after the current pattern has been matched and before the", + " * corresponding action - sets up yytext.", + " */", + "#define YY_DO_BEFORE_ACTION \\", + " YY_G(yytext_ptr) = yy_bp; \\", + "%% [2.0] code to fiddle yytext and yyleng for yymore() goes here \\", + " YY_G(yy_hold_char) = *yy_cp; \\", + " *yy_cp = '\\0'; \\", + "%% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \\", + " YY_G(yy_c_buf_p) = yy_cp;", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "%% [4.0] data tables for the DFA and the user's section 1 definitions go here", + "]])", + "", + "m4_ifdef( [[M4_YY_IN_HEADER]], [[#ifdef YY_HEADER_EXPORT_START_CONDITIONS]])", + "M4_YY_SC_DEFS", + "m4_ifdef( [[M4_YY_IN_HEADER]], [[#endif]])", + "", + "m4_ifdef( [[M4_YY_NO_UNISTD_H]],,", + "[[", + "#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", + "#include <unistd.h>", + "%endif", + "#endif", + "]])", + "", + "m4_ifdef( [[M4_EXTRA_TYPE_DEFS]],", + "[[", + "#define YY_EXTRA_TYPE M4_EXTRA_TYPE_DEFS", + "]],", + "[[", + "#ifndef YY_EXTRA_TYPE", + "#define YY_EXTRA_TYPE void *", + "#endif", + "]]", + ")", + "", + "%if-c-only Reentrant structure and macros (non-C++).", + "%if-reentrant", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* Holds the entire state of the reentrant scanner. */", + "struct yyguts_t", + " {", + "", + " /* User-defined. Not touched by flex. */", + " YY_EXTRA_TYPE yyextra_r;", + "", + " /* The rest are the same as the globals declared in the non-reentrant scanner. */", + " FILE *yyin_r, *yyout_r;", + " size_t yy_buffer_stack_top; /**< index of top of stack. */", + " size_t yy_buffer_stack_max; /**< capacity of stack. */", + " YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */", + " char yy_hold_char;", + " int yy_n_chars;", + " int yyleng_r;", + " char *yy_c_buf_p;", + " int yy_init;", + " int yy_start;", + " int yy_did_buffer_switch_on_eof;", + " int yy_start_stack_ptr;", + " int yy_start_stack_depth;", + " int *yy_start_stack;", + " yy_state_type yy_last_accepting_state;", + " char* yy_last_accepting_cpos;", + "", + " int yylineno_r;", + " int yy_flex_debug_r;", + "", + "m4_ifdef( [[M4_YY_USES_REJECT]],", + "[[", + " yy_state_type *yy_state_buf;", + " yy_state_type *yy_state_ptr;", + " char *yy_full_match;", + " int yy_lp;", + "", + " /* These are only needed for trailing context rules,", + " * but there's no conditional variable for that yet. */", + " int yy_looking_for_trail_begin;", + " int yy_full_lp;", + " int *yy_full_state;", + "]])", + "", + "m4_ifdef( [[M4_YY_TEXT_IS_ARRAY]],", + "[[", + " char yytext_r[YYLMAX];", + " char *yytext_ptr;", + " int yy_more_offset;", + " int yy_prev_more_offset;", + "]],", + "[[", + " char *yytext_r;", + " int yy_more_flag;", + " int yy_more_len;", + "]])", + "", + "m4_ifdef( [[M4_YY_BISON_LVAL]],", + "[[", + " YYSTYPE * yylval_r;", + "]])", + "", + "m4_ifdef( [[<M4_YY_BISON_LLOC>]],", + "[[", + " YYLTYPE * yylloc_r;", + "]])", + "", + " }; /* end struct yyguts_t */", + "]])", + "", + "", + "%if-c-only", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "static int yy_init_globals M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "]])", + "%endif", + "", + "%if-reentrant", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + " m4_ifdef( [[M4_YY_BISON_LVAL]],", + " [[", + " /* This must go here because YYSTYPE and YYLTYPE are included", + " * from bison output in section 1.*/", + " # define yylval YY_G(yylval_r)", + " ]])", + "", + " m4_ifdef( [[<M4_YY_BISON_LLOC>]],", + " [[", + " # define yylloc YY_G(yylloc_r)", + " ]])", + "]])", + "", + "int yylex_init M4_YY_PARAMS(yyscan_t* scanner);", + "", + "int yylex_init_extra M4_YY_PARAMS( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);", + "", + "%endif", + "", + "%endif End reentrant structures and macros.", + "", + "/* Accessor methods to globals.", + " These are made visible to non-reentrant scanners for convenience. */", + "", + "m4_ifdef( [[M4_YY_NO_DESTROY]],,", + "[[", + "int yylex_destroy M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_GET_DEBUG]],,", + "[[", + "int yyget_debug M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_SET_DEBUG]],,", + "[[", + "void yyset_debug M4_YY_PARAMS( int debug_flag M4_YY_PROTO_LAST_ARG );", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_GET_EXTRA]],,", + "[[", + "YY_EXTRA_TYPE yyget_extra M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_SET_EXTRA]],,", + "[[", + "void yyset_extra M4_YY_PARAMS( YY_EXTRA_TYPE user_defined M4_YY_PROTO_LAST_ARG );", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_GET_IN]],,", + "[[", + "FILE *yyget_in M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_SET_IN]],,", + "[[", + "void yyset_in M4_YY_PARAMS( FILE * in_str M4_YY_PROTO_LAST_ARG );", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_GET_OUT]],,", + "[[", + "FILE *yyget_out M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_SET_OUT]],,", + "[[", + "void yyset_out M4_YY_PARAMS( FILE * out_str M4_YY_PROTO_LAST_ARG );", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_GET_LENG]],,", + "[[", + "int yyget_leng M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_GET_TEXT]],,", + "[[", + "char *yyget_text M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_GET_LINENO]],,", + "[[", + "int yyget_lineno M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_SET_LINENO]],,", + "[[", + "void yyset_lineno M4_YY_PARAMS( int line_number M4_YY_PROTO_LAST_ARG );", + "]])", + "", + "%if-bison-bridge", + "m4_ifdef( [[M4_YY_NO_GET_LVAL]],,", + "[[", + "YYSTYPE * yyget_lval M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "]])", + "", + "void yyset_lval M4_YY_PARAMS( YYSTYPE * yylval_param M4_YY_PROTO_LAST_ARG );", + "", + "m4_ifdef( [[<M4_YY_BISON_LLOC>]],", + "[[", + " m4_ifdef( [[M4_YY_NO_GET_LLOC]],,", + " [[", + " YYLTYPE *yyget_lloc M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + " ]])", + "", + " m4_ifdef( [[M4_YY_NO_SET_LLOC]],,", + " [[", + " void yyset_lloc M4_YY_PARAMS( YYLTYPE * yylloc_param M4_YY_PROTO_LAST_ARG );", + " ]])", + "]])", + "%endif", + "", + "/* Macros after this point can all be overridden by user definitions in", + " * section 1.", + " */", + "", + "#ifndef YY_SKIP_YYWRAP", + "#ifdef __cplusplus", + "extern \"C\" int yywrap M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "#else", + "extern int yywrap M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "#endif", + "#endif", + "", + "%not-for-header", + " m4_ifdef( [[M4_YY_NO_UNPUT]],,", + " [[", + " static void yyunput M4_YY_PARAMS( int c, char *buf_ptr M4_YY_PROTO_LAST_ARG);", + " ]])", + "%ok-for-header", + "%endif", + "", + "#ifndef yytext_ptr", + "static void yy_flex_strncpy M4_YY_PARAMS( char *, yyconst char *, int M4_YY_PROTO_LAST_ARG);", + "#endif", + "", + "#ifdef YY_NEED_STRLEN", + "static int yy_flex_strlen M4_YY_PARAMS( yyconst char * M4_YY_PROTO_LAST_ARG);", + "#endif", + "", + "#ifndef YY_NO_INPUT", + "%if-c-only Standard (non-C++) definition", + "%not-for-header", + "#ifdef __cplusplus", + "static int yyinput M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "#else", + "static int input M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "#endif", + "%ok-for-header", + "%endif", + "#endif", + "", + "", + "%if-c-only", + "%# TODO: This is messy.", + "m4_ifdef( [[M4_YY_STACK_USED]],", + "[[", + "", + "m4_ifdef( [[M4_YY_NOT_REENTRANT]],", + "[[", + " m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + " [[", + " static int yy_start_stack_ptr = 0;", + " static int yy_start_stack_depth = 0;", + " static int *yy_start_stack = NULL;", + " ]])", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + " m4_ifdef( [[M4_YY_NO_PUSH_STATE]],,", + " [[", + " static void yy_push_state M4_YY_PARAMS( int new_state M4_YY_PROTO_LAST_ARG);", + " ]])", + " m4_ifdef( [[M4_YY_NO_POP_STATE]],,", + " [[", + " static void yy_pop_state M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + " ]])", + " m4_ifdef( [[M4_YY_NO_TOP_STATE]],,", + " [[", + " static int yy_top_state M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + " ]])", + "]])", + "", + "]],", + "[[", + "m4_define( [[M4_YY_NO_PUSH_STATE]])", + "m4_define( [[M4_YY_NO_POP_STATE]])", + "m4_define( [[M4_YY_NO_TOP_STATE]])", + "]])", + "%endif", + "", + "/* Amount of stuff to slurp up with each read. */", + "#ifndef YY_READ_BUF_SIZE", + "#define YY_READ_BUF_SIZE 8192", + "#endif", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* 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 fwrite( yytext, yyleng, 1, yyout )", + "%endif", + "%if-c++-only C++ definition", + "#define ECHO LexerOutput( yytext, yyleng )", + "%endif", + "#endif", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* 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-c++-only C++ definition \\", + " if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \\", + " YY_FATAL_ERROR( \"input in flex scanner failed\" );", + "%endif", + "", + "#endif", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* 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", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* Report a fatal error. */", + "#ifndef YY_FATAL_ERROR", + "%if-c-only", + "#define YY_FATAL_ERROR(msg) yy_fatal_error( msg M4_YY_CALL_LAST_ARG)", + "%endif", + "%if-c++-only", + "#define YY_FATAL_ERROR(msg) LexerError( msg )", + "%endif", + "#endif", + "]])", + "", + "%if-tables-serialization structures and prototypes", + "#ifdef FLEX_SCANNER", + "/*", + "dnl tables_shared.h - tables serialization header", + "dnl", + "dnl Copyright (c) 1990 The Regents of the University of California.", + "dnl All rights reserved.", + "dnl", + "dnl This code is derived from software contributed to Berkeley by", + "dnl Vern Paxson.", + "dnl", + "dnl The United States Government has rights in this work pursuant", + "dnl to contract no. DE-AC03-76SF00098 between the United States", + "dnl Department of Energy and the University of California.", + "dnl", + "dnl This file is part of flex.", + "dnl", + "dnl Redistribution and use in source and binary forms, with or without", + "dnl modification, are permitted provided that the following conditions", + "dnl are met:", + "dnl", + "dnl 1. Redistributions of source code must retain the above copyright", + "dnl notice, this list of conditions and the following disclaimer.", + "dnl 2. Redistributions in binary form must reproduce the above copyright", + "dnl notice, this list of conditions and the following disclaimer in the", + "dnl documentation and/or other materials provided with the distribution.", + "dnl", + "dnl Neither the name of the University nor the names of its contributors", + "dnl may be used to endorse or promote products derived from this software", + "dnl without specific prior written permission.", + "dnl", + "dnl THIS SOFTWARE IS PROVIDED `AS IS' AND WITHOUT ANY EXPRESS OR", + "dnl IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED", + "dnl WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR", + "dnl PURPOSE.", + "", + "dnl", + "dnl This file is meant to be included in both the skeleton and the actual", + "dnl flex code (hence the name \"_shared\").", + "*/", + "#ifndef yyskel_static", + "#define yyskel_static static", + "#endif", + "#else", + "#ifndef yyskel_static", + "#define yyskel_static", + "#endif", + "#endif", + "", + "/* Structures and prototypes for serializing flex tables. The", + " * binary format is documented in the manual.", + " *", + " * Design considerations:", + " *", + " * - The format allows many tables per file.", + " * - The tables can be streamed.", + " * - All data is stored in network byte order.", + " * - We do not hinder future unicode support.", + " * - We can lookup tables by name.", + " */", + "", + "/** Magic number for serialized format. */", + "#ifndef YYTBL_MAGIC", + "#define YYTBL_MAGIC 0xF13C57B1", + "#endif", + "", + "/** Calculate (0-7) = number bytes needed to pad n to next 64-bit boundary. */", + "#ifndef yypad64", + "#define yypad64(n) ((8-((n)%8))%8)", + "#endif", + "", + "", + "#ifndef YYTABLES_TYPES", + "#define YYTABLES_TYPES", + "/** Possible values for td_id field. Each one corresponds to a", + " * scanner table of the same name.", + " */", + "enum yytbl_id {", + " YYTD_ID_ACCEPT = 0x01, /**< 1-dim ints */", + " YYTD_ID_BASE = 0x02, /**< 1-dim ints */", + " YYTD_ID_CHK = 0x03, /**< 1-dim ints */", + " YYTD_ID_DEF = 0x04, /**< 1-dim ints */", + " YYTD_ID_EC = 0x05, /**< 1-dim ints */", + " YYTD_ID_META = 0x06, /**< 1-dim ints */", + " YYTD_ID_NUL_TRANS = 0x07, /**< 1-dim ints, maybe indices */", + " YYTD_ID_NXT = 0x08, /**< may be 2 dimensional ints */", + " YYTD_ID_RULE_CAN_MATCH_EOL = 0x09, /**< 1-dim ints */", + " YYTD_ID_START_STATE_LIST = 0x0A, /**< 1-dim indices into trans tbl */", + " YYTD_ID_TRANSITION = 0x0B, /**< structs */", + " YYTD_ID_ACCLIST = 0x0C /**< 1-dim ints */", + "};", + "", + "/** bit flags for t_flags field of struct yytbl_data */", + "enum yytbl_flags {", + " /* These first three are mutually exclusive */", + " YYTD_DATA8 = 0x01, /**< data is an array of type flex_int8_t */", + " YYTD_DATA16 = 0x02, /**< data is an array of type flex_int16_t */", + " YYTD_DATA32 = 0x04, /**< data is an array of type flex_int32_t */", + "", + " /* These two are mutually exclusive. */", + " YYTD_PTRANS = 0x08, /**< data is a list of indexes of entries", + " into the expanded yy_transition", + " array. See notes in manual. */", + " YYTD_STRUCT = 0x10 /**< data consists of yy_trans_info structs */", + "};", + "", + "/* The serialized tables header. */", + "struct yytbl_hdr {", + " flex_uint32_t th_magic; /**< Must be 0xF13C57B1 (comes from \"Flex Table\") */", + " flex_uint32_t th_hsize; /**< Size of this header in bytes. */", + " flex_uint32_t th_ssize; /**< Size of this dataset, in bytes, including header. */", + " flex_uint16_t th_flags; /**< Currently unused, must be 0 */", + " char *th_version; /**< Flex version string. NUL terminated. */", + " char *th_name; /**< The name of this table set. NUL terminated. */", + "};", + "", + "/** A single serialized table */", + "struct yytbl_data {", + " flex_uint16_t td_id; /**< enum yytbl_id table identifier */", + " flex_uint16_t td_flags; /**< how to interpret this data */", + " flex_uint32_t td_hilen; /**< num elements in highest dimension array */", + " flex_uint32_t td_lolen; /**< num elements in lowest dimension array */", + " void *td_data; /**< table data */", + "};", + "#endif", + "", + "/** Extract corresponding data size_t from td_flags */", + "#ifndef YYTDFLAGS2BYTES", + "#define YYTDFLAGS2BYTES(td_flags)\\", + " (((td_flags) & YYTD_DATA8)\\", + " ? sizeof(flex_int8_t)\\", + " :(((td_flags) & YYTD_DATA16)\\", + " ? sizeof(flex_int16_t)\\", + " :sizeof(flex_int32_t)))", + "#endif", + "", + "#ifdef FLEX_SCANNER", + "%not-for-header", + "#endif", + "yyskel_static flex_int32_t yytbl_calc_total_len (const struct yytbl_data *tbl);", + "#ifdef FLEX_SCANNER", + "%ok-for-header", + "#endif", + "", + "/* vim:set noexpandtab cindent tabstop=8 softtabstop=0 shiftwidth=8 textwidth=0: */", + "", + "", + "/* Load the DFA tables from the given stream. */", + "int yytables_fload M4_YY_PARAMS(FILE * fp M4_YY_PROTO_LAST_ARG);", + "", + "/* Unload the tables from memory. */", + "int yytables_destroy M4_YY_PARAMS(M4_YY_PROTO_ONLY_ARG);", + "%not-for-header", + "", + "/** Describes a mapping from a serialized table id to its deserialized state in", + " * this scanner. This is the bridge between our \"generic\" deserialization code", + " * and the specifics of this scanner. ", + " */", + "struct yytbl_dmap {", + " enum yytbl_id dm_id;/**< table identifier */", + " void **dm_arr; /**< address of pointer to store the deserialized table. */", + " size_t dm_sz; /**< local sizeof() each element in table. */", + "};", + "", + "/** A {0,0,0}-terminated list of structs, forming the map */", + "static struct yytbl_dmap yydmap[] =", + "{", + "%tables-yydmap generated elements", + " {0,0,0}", + "};", + "", + "/** A tables-reader object to maintain some state in the read. */", + "struct yytbl_reader {", + " FILE * fp; /**< input stream */", + " flex_uint32_t bread; /**< bytes read since beginning of current tableset */", + "};", + "", + "%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", + "", + "", + "m4_define( [[M4_YY_LEX_PROTO]], [[M4_YY_PARAMS(M4_YY_PROTO_ONLY_ARG)]])", + "m4_define( [[M4_YY_LEX_DECLARATION]], [[YYFARGS0(void)]])", + "", + "m4_ifdef( [[M4_YY_BISON_LVAL]],", + "[[", + " m4_dnl The bison pure parser is used. Redefine yylex to", + " m4_dnl accept the lval parameter.", + "", + " m4_define( [[M4_YY_LEX_PROTO]], [[\\]]", + " [[M4_YY_PARAMS(YYSTYPE * yylval_param M4_YY_PROTO_LAST_ARG)]])", + " m4_define( [[M4_YY_LEX_DECLARATION]], [[\\]]", + " [[YYFARGS1(YYSTYPE *,yylval_param)]])", + "]])", + "", + "m4_ifdef( [[<M4_YY_BISON_LLOC>]],", + "[[", + " m4_dnl Locations are used. yylex should also accept the ylloc parameter.", + "", + " m4_define( [[M4_YY_LEX_PROTO]], [[\\]]", + " [[M4_YY_PARAMS(YYSTYPE * yylval_param, YYLTYPE * yylloc_param M4_YY_PROTO_LAST_ARG)]])", + " m4_define( [[M4_YY_LEX_DECLARATION]], [[\\]]", + " [[YYFARGS2(YYSTYPE *,yylval_param, YYLTYPE *,yylloc_param)]])", + "]])", + "", + "extern int yylex M4_YY_LEX_PROTO;", + "", + "#define YY_DECL int yylex M4_YY_LEX_DECLARATION", + "%endif", + "%if-c++-only C++ definition", + "#define YY_DECL int yyFlexLexer::yylex()", + "%endif", + "#endif /* !YY_DECL */", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* Code executed at the beginning of each rule, after yytext and yyleng", + " * have been set up.", + " */", + "#ifndef YY_USER_ACTION", + "#define YY_USER_ACTION", + "#endif", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* Code executed at the end of each rule. */", + "#ifndef YY_BREAK", + "#define YY_BREAK break;", + "#endif", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "%% [6.0] YY_RULE_SETUP definition goes here", + "]])", + "", + "%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;", + " M4_YY_DECL_GUTS_VAR();", + "", + "m4_ifdef( [[M4_YY_NOT_REENTRANT]],", + "[[", + " m4_ifdef( [[M4_YY_BISON_LVAL]],", + " [[", + " YYSTYPE * yylval;", + " ]])", + " m4_ifdef( [[<M4_YY_BISON_LLOC>]],", + " [[", + " YYLTYPE * yylloc;", + " ]])", + "]])", + "", + "%% [7.0] user's declarations go here", + "", + "m4_ifdef( [[M4_YY_BISON_LVAL]],", + "[[", + " yylval = yylval_param;", + "]])", + "", + "m4_ifdef( [[<M4_YY_BISON_LLOC>]],", + "[[", + " yylloc = yylloc_param;", + "]])", + "", + " if ( !YY_G(yy_init) )", + " {", + " YY_G(yy_init) = 1;", + "", + "#ifdef YY_USER_INIT", + " YY_USER_INIT;", + "#endif", + "", + "m4_ifdef( [[M4_YY_USES_REJECT]],", + "[[", + " /* Create the reject buffer large enough to save one state per allowed character. */", + " if ( ! YY_G(yy_state_buf) )", + " YY_G(yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE M4_YY_CALL_LAST_ARG);", + " if ( ! YY_G(yy_state_buf) )", + " YY_FATAL_ERROR( \"out of dynamic memory in yylex()\" );", + "]])", + "", + " if ( ! YY_G(yy_start) )", + " YY_G(yy_start) = 1; /* first start state */", + "", + " if ( ! yyin )", + "%if-c-only", + " yyin = stdin;", + "%endif", + "%if-c++-only", + " yyin = & std::cin;", + "%endif", + "", + " if ( ! yyout )", + "%if-c-only", + " yyout = stdout;", + "%endif", + "%if-c++-only", + " yyout = & std::cout;", + "%endif", + "", + " if ( ! YY_CURRENT_BUFFER ) {", + " yyensure_buffer_stack (M4_YY_CALL_ONLY_ARG);", + " YY_CURRENT_BUFFER_LVALUE =", + " yy_create_buffer( yyin, YY_BUF_SIZE M4_YY_CALL_LAST_ARG);", + " }", + "", + " yy_load_buffer_state( M4_YY_CALL_ONLY_ARG );", + " }", + "", + " while ( 1 ) /* loops until end-of-file is reached */", + " {", + "%% [8.0] yymore()-related code goes here", + " yy_cp = YY_G(yy_c_buf_p);", + "", + " /* Support of yytext. */", + " *yy_cp = YY_G(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_find_action:", + "%% [10.0] code to find the action number goes here", + "", + " YY_DO_BEFORE_ACTION;", + "", + "%% [11.0] code for yylineno update goes here", + "", + "do_action: /* This label is used only to access EOF actions. */", + "", + "%% [12.0] debug code goes here", + "", + " switch ( yy_act )", + " { /* beginning of action switch */", + "%% [13.0] actions go here", + "", + " case YY_END_OF_BUFFER:", + " {", + " /* Amount of text matched not including the EOB char. */", + " int yy_amount_of_matched_text = (int) (yy_cp - YY_G(yytext_ptr)) - 1;", + "", + " /* Undo the effects of YY_DO_BEFORE_ACTION. */", + " *yy_cp = YY_G(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 yyin at a new source and called", + " * yylex(). 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_G(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;", + " YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;", + " 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_G(yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(yy_n_chars)] )", + " { /* This was really a NUL. */", + " yy_state_type yy_next_state;", + "", + " YY_G(yy_c_buf_p) = YY_G(yytext_ptr) + yy_amount_of_matched_text;", + "", + " yy_current_state = yy_get_previous_state( M4_YY_CALL_ONLY_ARG );", + "", + " /* 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 M4_YY_CALL_LAST_ARG);", + "", + " yy_bp = YY_G(yytext_ptr) + YY_MORE_ADJ;", + "", + " if ( yy_next_state )", + " {", + " /* Consume the NUL. */", + " yy_cp = ++YY_G(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", + " goto yy_find_action;", + " }", + " }", + "", + " else switch ( yy_get_next_buffer( M4_YY_CALL_ONLY_ARG ) )", + " {", + " case EOB_ACT_END_OF_FILE:", + " {", + " YY_G(yy_did_buffer_switch_on_eof) = 0;", + "", + " if ( yywrap( M4_YY_CALL_ONLY_ARG ) )", + " {", + " /* Note: because we've taken care in", + " * yy_get_next_buffer() to have set up", + " * yytext, 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_G(yy_c_buf_p) = YY_G(yytext_ptr) + YY_MORE_ADJ;", + "", + " yy_act = YY_STATE_EOF(YY_START);", + " goto do_action;", + " }", + "", + " else", + " {", + " if ( ! YY_G(yy_did_buffer_switch_on_eof) )", + " YY_NEW_FILE;", + " }", + " break;", + " }", + "", + " case EOB_ACT_CONTINUE_SCAN:", + " YY_G(yy_c_buf_p) =", + " YY_G(yytext_ptr) + yy_amount_of_matched_text;", + "", + " yy_current_state = yy_get_previous_state( M4_YY_CALL_ONLY_ARG );", + "", + " yy_cp = YY_G(yy_c_buf_p);", + " yy_bp = YY_G(yytext_ptr) + YY_MORE_ADJ;", + " goto yy_match;", + "", + " case EOB_ACT_LAST_MATCH:", + " YY_G(yy_c_buf_p) =", + " &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(yy_n_chars)];", + "", + " yy_current_state = yy_get_previous_state( M4_YY_CALL_ONLY_ARG );", + "", + " yy_cp = YY_G(yy_c_buf_p);", + " yy_bp = YY_G(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 yylex */", + "%ok-for-header", + "", + "%if-c++-only", + "%not-for-header", + "/* The contents of this function are C++ specific, so the YY_G macro is not used.", + " */", + "yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout )", + "{", + " yyin = arg_yyin;", + " yyout = arg_yyout;", + " yy_c_buf_p = 0;", + " yy_init = 0;", + " yy_start = 0;", + " yy_flex_debug = 0;", + " yylineno = 1; // this will only get updated if %option yylineno", + "", + " yy_did_buffer_switch_on_eof = 0;", + "", + " yy_looking_for_trail_begin = 0;", + " yy_more_flag = 0;", + " yy_more_len = 0;", + " yy_more_offset = yy_prev_more_offset = 0;", + "", + " yy_start_stack_ptr = yy_start_stack_depth = 0;", + " yy_start_stack = NULL;", + "", + " yy_buffer_stack = 0;", + " yy_buffer_stack_top = 0;", + " yy_buffer_stack_max = 0;", + "", + "", + "m4_ifdef( [[M4_YY_USES_REJECT]],", + "[[", + " yy_state_buf = new yy_state_type[YY_STATE_BUF_SIZE];", + "]],", + "[[", + " yy_state_buf = 0;", + "]])", + "}", + "", + "/* The contents of this function are C++ specific, so the YY_G macro is not used.", + " */", + "yyFlexLexer::~yyFlexLexer()", + "{", + " delete [] yy_state_buf;", + " yyfree( yy_start_stack M4_YY_CALL_LAST_ARG );", + " yy_delete_buffer( YY_CURRENT_BUFFER M4_YY_CALL_LAST_ARG);", + " yyfree( yy_buffer_stack M4_YY_CALL_LAST_ARG );", + "}", + "", + "/* The contents of this function are C++ specific, so the YY_G macro is not used.", + " */", + "void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out )", + "{", + " if ( new_in )", + " {", + " yy_delete_buffer( YY_CURRENT_BUFFER M4_YY_CALL_LAST_ARG);", + " yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE M4_YY_CALL_LAST_ARG) M4_YY_CALL_LAST_ARG);", + " }", + "", + " if ( new_out )", + " yyout = new_out;", + "}", + "", + "#ifdef YY_INTERACTIVE", + "int yyFlexLexer::LexerInput( char* buf, int /* max_size */ )", + "#else", + "int yyFlexLexer::LexerInput( char* buf, int max_size )", + "#endif", + "{", + " if ( yyin->eof() || yyin->fail() )", + " return 0;", + "", + "#ifdef YY_INTERACTIVE", + " yyin->get( buf[0] );", + "", + " if ( yyin->eof() )", + " return 0;", + "", + " if ( yyin->bad() )", + " return -1;", + "", + " return 1;", + "", + "#else", + " (void) yyin->read( buf, max_size );", + "", + " if ( yyin->bad() )", + " return -1;", + " else", + " return yyin->gcount();", + "#endif", + "}", + "", + "void yyFlexLexer::LexerOutput( const char* buf, int size )", + "{", + " (void) yyout->write( buf, size );", + "}", + "%ok-for-header", + "%endif", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/* 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 YYFARGS0(void)", + "%endif", + "%if-c++-only", + "int yyFlexLexer::yy_get_next_buffer()", + "%endif", + "{", + " M4_YY_DECL_GUTS_VAR();", + " register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;", + " register char *source = YY_G(yytext_ptr);", + " register int number_to_move, i;", + " int ret_val;", + "", + " if ( YY_G(yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(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_G(yy_c_buf_p) - YY_G(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_G(yy_c_buf_p) - YY_G(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_G(yy_n_chars) = 0;", + "", + " else", + " {", + " int 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. */", + "m4_ifdef( [[M4_YY_USES_REJECT]],", + "[[", + " YY_FATAL_ERROR(", + "\"input buffer overflow, can't enlarge buffer because scanner uses REJECT\" );", + "]],", + "[[", + " /* just a shorter name for the current buffer */", + " YY_BUFFER_STATE b = YY_CURRENT_BUFFER;", + "", + " int yy_c_buf_p_offset =", + " (int) (YY_G(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. */", + " yyrealloc( (void *) b->yy_ch_buf,", + " b->yy_buf_size + 2 M4_YY_CALL_LAST_ARG );", + " }", + " 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_G(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_G(yy_n_chars), (size_t) num_to_read );", + "", + " YY_CURRENT_BUFFER_LVALUE->yy_n_chars = YY_G(yy_n_chars);", + " }", + "", + " if ( YY_G(yy_n_chars) == 0 )", + " {", + " if ( number_to_move == YY_MORE_ADJ )", + " {", + " ret_val = EOB_ACT_END_OF_FILE;", + " yyrestart( yyin M4_YY_CALL_LAST_ARG);", + " }", + "", + " 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;", + "", + " if ((yy_size_t) (YY_G(yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {", + " /* Extend the array by 50%, plus the number we really need. */", + " yy_size_t new_size = YY_G(yy_n_chars) + number_to_move + (YY_G(yy_n_chars) >> 1);", + " YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(", + " (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, new_size M4_YY_CALL_LAST_ARG );", + " if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )", + " YY_FATAL_ERROR( \"out of dynamic memory in yy_get_next_buffer()\" );", + " }", + "", + " YY_G(yy_n_chars) += number_to_move;", + " YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;", + " YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;", + "", + " YY_G(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 YYFARGS0(void)", + "%endif", + "%if-c++-only", + " yy_state_type yyFlexLexer::yy_get_previous_state()", + "%endif", + "{", + " register yy_state_type yy_current_state;", + " register char *yy_cp;", + " M4_YY_DECL_GUTS_VAR();", + "", + "%% [15.0] code to get the start state into yy_current_state goes here", + "", + " for ( yy_cp = YY_G(yytext_ptr) + YY_MORE_ADJ; yy_cp < YY_G(yy_c_buf_p); ++yy_cp )", + " {", + "%% [16.0] code to find the next state goes here", + " }", + "", + " 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 YYFARGS1( yy_state_type, yy_current_state)", + "%endif", + "%if-c++-only", + " yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state )", + "%endif", + "{", + " register int yy_is_jam;", + " M4_YY_DECL_GUTS_VAR(); /* This var may be unused depending upon options. */", + "%% [17.0] code to find the next state, and perhaps do backing up, goes here", + "", + " return yy_is_jam ? 0 : yy_current_state;", + "}", + "", + "", + "%if-c-only", + "m4_ifdef( [[M4_YY_NO_UNPUT]],,", + "[[", + " static void yyunput YYFARGS2( int,c, register char *,yy_bp)", + "%endif", + "%if-c++-only", + " void yyFlexLexer::yyunput( int c, register char* yy_bp)", + "%endif", + "{", + " register char *yy_cp;", + " M4_YY_DECL_GUTS_VAR();", + "", + " yy_cp = YY_G(yy_c_buf_p);", + "", + " /* undo effects of setting up yytext */", + " *yy_cp = YY_G(yy_hold_char);", + "", + " if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )", + " { /* need to shift things up to make room */", + " /* +2 for EOB chars. */", + " register int number_to_move = YY_G(yy_n_chars) + 2;", + " register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[", + " YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];", + " register char *source =", + " &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];", + "", + " while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )", + " *--dest = *--source;", + "", + " yy_cp += (int) (dest - source);", + " yy_bp += (int) (dest - source);", + " YY_CURRENT_BUFFER_LVALUE->yy_n_chars =", + " YY_G(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;", + "", + " if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )", + " YY_FATAL_ERROR( \"flex scanner push-back overflow\" );", + " }", + "", + " *--yy_cp = (char) c;", + "", + "%% [18.0] update yylineno here", + "m4_ifdef( [[M4_YY_USE_LINENO]],", + "[[", + " if ( c == '\\n' ){", + " --yylineno;", + " }", + "]])", + "", + " YY_G(yytext_ptr) = yy_bp;", + " YY_G(yy_hold_char) = *yy_cp;", + " YY_G(yy_c_buf_p) = yy_cp;", + "}", + "%if-c-only", + "]])", + "%endif", + "", + "%if-c-only", + "#ifndef YY_NO_INPUT", + "#ifdef __cplusplus", + " static int yyinput YYFARGS0(void)", + "#else", + " static int input YYFARGS0(void)", + "#endif", + "", + "%endif", + "%if-c++-only", + " int yyFlexLexer::yyinput()", + "%endif", + "{", + " int c;", + " M4_YY_DECL_GUTS_VAR();", + "", + " *YY_G(yy_c_buf_p) = YY_G(yy_hold_char);", + "", + " if ( *YY_G(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_G(yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(yy_n_chars)] )", + " /* This was really a NUL. */", + " *YY_G(yy_c_buf_p) = '\\0';", + "", + " else", + " { /* need more input */", + " int offset = YY_G(yy_c_buf_p) - YY_G(yytext_ptr);", + " ++YY_G(yy_c_buf_p);", + "", + " switch ( yy_get_next_buffer( M4_YY_CALL_ONLY_ARG ) )", + " {", + " 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. */", + " yyrestart( yyin M4_YY_CALL_LAST_ARG);", + "", + " /*FALLTHROUGH*/", + "", + " case EOB_ACT_END_OF_FILE:", + " {", + " if ( yywrap( M4_YY_CALL_ONLY_ARG ) )", + " return EOF;", + "", + " if ( ! YY_G(yy_did_buffer_switch_on_eof) )", + " YY_NEW_FILE;", + "#ifdef __cplusplus", + " return yyinput(M4_YY_CALL_ONLY_ARG);", + "#else", + " return input(M4_YY_CALL_ONLY_ARG);", + "#endif", + " }", + "", + " case EOB_ACT_CONTINUE_SCAN:", + " YY_G(yy_c_buf_p) = YY_G(yytext_ptr) + offset;", + " break;", + " }", + " }", + " }", + "", + " c = *(unsigned char *) YY_G(yy_c_buf_p); /* cast for 8-bit char's */", + " *YY_G(yy_c_buf_p) = '\\0'; /* preserve yytext */", + " YY_G(yy_hold_char) = *++YY_G(yy_c_buf_p);", + "", + "%% [19.0] update BOL and yylineno", + "", + " return c;", + "}", + "%if-c-only", + "#endif /* ifndef YY_NO_INPUT */", + "%endif", + "", + "/** Immediately switch to a different input stream.", + " * @param input_file A readable stream.", + " * M4_YY_DOC_PARAM", + " * @note This function does not reset the start condition to @c INITIAL .", + " */", + "%if-c-only", + " void yyrestart YYFARGS1( FILE *,input_file)", + "%endif", + "%if-c++-only", + " void yyFlexLexer::yyrestart( std::istream* input_file )", + "%endif", + "{", + " M4_YY_DECL_GUTS_VAR();", + "", + " if ( ! YY_CURRENT_BUFFER ){", + " yyensure_buffer_stack (M4_YY_CALL_ONLY_ARG);", + " YY_CURRENT_BUFFER_LVALUE =", + " yy_create_buffer( yyin, YY_BUF_SIZE M4_YY_CALL_LAST_ARG);", + " }", + "", + " yy_init_buffer( YY_CURRENT_BUFFER, input_file M4_YY_CALL_LAST_ARG);", + " yy_load_buffer_state( M4_YY_CALL_ONLY_ARG );", + "}", + "", + "/** Switch to a different input buffer.", + " * @param new_buffer The new input buffer.", + " * M4_YY_DOC_PARAM", + " */", + "%if-c-only", + " void yy_switch_to_buffer YYFARGS1( YY_BUFFER_STATE ,new_buffer)", + "%endif", + "%if-c++-only", + " void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )", + "%endif", + "{", + " M4_YY_DECL_GUTS_VAR();", + "", + " /* TODO. We should be able to replace this entire function body", + " * with", + " * yypop_buffer_state();", + " * yypush_buffer_state(new_buffer);", + " */", + " yyensure_buffer_stack (M4_YY_CALL_ONLY_ARG);", + " if ( YY_CURRENT_BUFFER == new_buffer )", + " return;", + "", + " if ( YY_CURRENT_BUFFER )", + " {", + " /* Flush out information for old buffer. */", + " *YY_G(yy_c_buf_p) = YY_G(yy_hold_char);", + " YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = YY_G(yy_c_buf_p);", + " YY_CURRENT_BUFFER_LVALUE->yy_n_chars = YY_G(yy_n_chars);", + " }", + "", + " YY_CURRENT_BUFFER_LVALUE = new_buffer;", + " yy_load_buffer_state( M4_YY_CALL_ONLY_ARG );", + "", + " /* We don't actually know whether we did this switch during", + " * EOF (yywrap()) processing, but the only time this flag", + " * is looked at is after yywrap() is called, so it's safe", + " * to go ahead and always set it.", + " */", + " YY_G(yy_did_buffer_switch_on_eof) = 1;", + "}", + "", + "", + "%if-c-only", + "static void yy_load_buffer_state YYFARGS0(void)", + "%endif", + "%if-c++-only", + " void yyFlexLexer::yy_load_buffer_state()", + "%endif", + "{", + " M4_YY_DECL_GUTS_VAR();", + " YY_G(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;", + " YY_G(yytext_ptr) = YY_G(yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;", + " yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;", + " YY_G(yy_hold_char) = *YY_G(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.", + " * M4_YY_DOC_PARAM", + " * @return the allocated buffer state.", + " */", + "%if-c-only", + " YY_BUFFER_STATE yy_create_buffer YYFARGS2( FILE *,file, int ,size)", + "%endif", + "%if-c++-only", + " YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size )", + "%endif", + "{", + " YY_BUFFER_STATE b;", + " m4_dnl M4_YY_DECL_GUTS_VAR();", + "", + " b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) M4_YY_CALL_LAST_ARG );", + " if ( ! b )", + " YY_FATAL_ERROR( \"out of dynamic memory in yy_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 *) yyalloc( b->yy_buf_size + 2 M4_YY_CALL_LAST_ARG );", + " if ( ! b->yy_ch_buf )", + " YY_FATAL_ERROR( \"out of dynamic memory in yy_create_buffer()\" );", + "", + " b->yy_is_our_buffer = 1;", + "", + " yy_init_buffer( b, file M4_YY_CALL_LAST_ARG);", + "", + " return b;", + "}", + "", + "/** Destroy the buffer.", + " * @param b a buffer created with yy_create_buffer()", + " * M4_YY_DOC_PARAM", + " */", + "%if-c-only", + " void yy_delete_buffer YYFARGS1( YY_BUFFER_STATE ,b)", + "%endif", + "%if-c++-only", + " void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b )", + "%endif", + "{", + " M4_YY_DECL_GUTS_VAR();", + "", + " 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 )", + " yyfree( (void *) b->yy_ch_buf M4_YY_CALL_LAST_ARG );", + "", + " yyfree( (void *) b M4_YY_CALL_LAST_ARG );", + "}", + "", + "", + "%if-c-only", + "m4_ifdef( [[M4_YY_ALWAYS_INTERACTIVE]],,", + "[[", + " m4_ifdef( [[M4_YY_NEVER_INTERACTIVE]],,", + " [[", + "#ifndef __cplusplus", + "extern int isatty M4_YY_PARAMS( int );", + "#endif /* __cplusplus */", + " ]])", + "]])", + "%endif", + "", + "%if-c++-only", + "m4_ifdef( [[M4_YY_NEVER_INTERACTIVE]],,", + "[[", + "extern \"C\" int isatty M4_YY_PARAMS( int );", + "]])", + "%endif", + "", + "/* Initializes or reinitializes a buffer.", + " * This function is sometimes called more than once on the same buffer,", + " * such as during a yyrestart() or at EOF.", + " */", + "%if-c-only", + " static void yy_init_buffer YYFARGS2( YY_BUFFER_STATE ,b, FILE *,file)", + "%endif", + "%if-c++-only", + " void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file )", + "%endif", + "", + "{", + " int oerrno = errno;", + " M4_YY_DECL_GUTS_VAR();", + "", + " yy_flush_buffer( b M4_YY_CALL_LAST_ARG);", + "", + " b->yy_input_file = file;", + " b->yy_fill_buffer = 1;", + "", + " /* If b is the current buffer, then yy_init_buffer was _probably_", + " * called from yyrestart() 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", + "m4_ifdef( [[M4_YY_ALWAYS_INTERACTIVE]],", + "[[", + " b->yy_is_interactive = 1;", + "]],", + "[[", + " m4_ifdef( [[M4_YY_NEVER_INTERACTIVE]],", + " [[", + " b->yy_is_interactive = 0;", + " ]],", + " [[", + " b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;", + " ]])", + "]])", + "%endif", + "%if-c++-only", + " b->yy_is_interactive = 0;", + "%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.", + " * M4_YY_DOC_PARAM", + " */", + "%if-c-only", + " void yy_flush_buffer YYFARGS1( YY_BUFFER_STATE ,b)", + "%endif", + "%if-c++-only", + " void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b )", + "%endif", + "{", + " M4_YY_DECL_GUTS_VAR();", + " 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 )", + " yy_load_buffer_state( M4_YY_CALL_ONLY_ARG );", + "}", + "", + "%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.", + " * M4_YY_DOC_PARAM", + " */", + "%if-c-only", + "void yypush_buffer_state YYFARGS1(YY_BUFFER_STATE,new_buffer)", + "%endif", + "%if-c++-only", + "void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer)", + "%endif", + "{", + " M4_YY_DECL_GUTS_VAR();", + " if (new_buffer == NULL)", + " return;", + "", + " yyensure_buffer_stack(M4_YY_CALL_ONLY_ARG);", + "", + " /* This block is copied from yy_switch_to_buffer. */", + " if ( YY_CURRENT_BUFFER )", + " {", + " /* Flush out information for old buffer. */", + " *YY_G(yy_c_buf_p) = YY_G(yy_hold_char);", + " YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = YY_G(yy_c_buf_p);", + " YY_CURRENT_BUFFER_LVALUE->yy_n_chars = YY_G(yy_n_chars);", + " }", + "", + " /* Only push if top exists. Otherwise, replace top. */", + " if (YY_CURRENT_BUFFER)", + " YY_G(yy_buffer_stack_top)++;", + " YY_CURRENT_BUFFER_LVALUE = new_buffer;", + "", + " /* copied from yy_switch_to_buffer. */", + " yy_load_buffer_state( M4_YY_CALL_ONLY_ARG );", + " YY_G(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.", + " * M4_YY_DOC_PARAM", + " */", + "%if-c-only", + "void yypop_buffer_state YYFARGS0(void)", + "%endif", + "%if-c++-only", + "void yyFlexLexer::yypop_buffer_state (void)", + "%endif", + "{", + " M4_YY_DECL_GUTS_VAR();", + " if (!YY_CURRENT_BUFFER)", + " return;", + "", + " yy_delete_buffer(YY_CURRENT_BUFFER M4_YY_CALL_LAST_ARG);", + " YY_CURRENT_BUFFER_LVALUE = NULL;", + " if (YY_G(yy_buffer_stack_top) > 0)", + " --YY_G(yy_buffer_stack_top);", + "", + " if (YY_CURRENT_BUFFER) {", + " yy_load_buffer_state( M4_YY_CALL_ONLY_ARG );", + " YY_G(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 yyensure_buffer_stack YYFARGS0(void)", + "%endif", + "%if-c++-only", + "void yyFlexLexer::yyensure_buffer_stack(void)", + "%endif", + "{", + " int num_to_alloc;", + " M4_YY_DECL_GUTS_VAR();", + "", + " if (!YY_G(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_G(yy_buffer_stack) = (struct yy_buffer_state**)yyalloc", + " (num_to_alloc * sizeof(struct yy_buffer_state*)", + " M4_YY_CALL_LAST_ARG);", + " if ( ! YY_G(yy_buffer_stack) )", + " YY_FATAL_ERROR( \"out of dynamic memory in yyensure_buffer_stack()\" );", + " ", + " ", + " memset(YY_G(yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));", + " ", + " YY_G(yy_buffer_stack_max) = num_to_alloc;", + " YY_G(yy_buffer_stack_top) = 0;", + " return;", + " }", + "", + " if (YY_G(yy_buffer_stack_top) >= (YY_G(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_G(yy_buffer_stack_max) + grow_size;", + " YY_G(yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc", + " (YY_G(yy_buffer_stack),", + " num_to_alloc * sizeof(struct yy_buffer_state*)", + " M4_YY_CALL_LAST_ARG);", + " if ( ! YY_G(yy_buffer_stack) )", + " YY_FATAL_ERROR( \"out of dynamic memory in yyensure_buffer_stack()\" );", + "", + " /* zero only the new slots.*/", + " memset(YY_G(yy_buffer_stack) + YY_G(yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));", + " YY_G(yy_buffer_stack_max) = num_to_alloc;", + " }", + "}", + "%endif", + "", + "", + "", + "", + "m4_ifdef( [[M4_YY_NO_SCAN_BUFFER]],,", + "[[", + "%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", + " * M4_YY_DOC_PARAM", + " * @return the newly allocated buffer state object. ", + " */", + "YY_BUFFER_STATE yy_scan_buffer YYFARGS2( char *,base, yy_size_t ,size)", + "{", + " YY_BUFFER_STATE b;", + " m4_dnl M4_YY_DECL_GUTS_VAR();", + "", + " 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) yyalloc( sizeof( struct yy_buffer_state ) M4_YY_CALL_LAST_ARG );", + " if ( ! b )", + " YY_FATAL_ERROR( \"out of dynamic memory in yy_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;", + "", + " yy_switch_to_buffer( b M4_YY_CALL_LAST_ARG );", + "", + " return b;", + "}", + "%endif", + "]])", + "", + "", + "m4_ifdef( [[M4_YY_NO_SCAN_STRING]],,", + "[[", + "%if-c-only", + "/** Setup the input buffer state to scan a string. The next call to yylex() will", + " * scan from a @e copy of @a str.", + " * @param yystr a NUL-terminated string to scan", + " * M4_YY_DOC_PARAM", + " * @return the newly allocated buffer state object.", + " * @note If you want to scan bytes that may contain NUL values, then use", + " * yy_scan_bytes() instead.", + " */", + "YY_BUFFER_STATE yy_scan_string YYFARGS1( yyconst char *, yystr)", + "{", + " m4_dnl M4_YY_DECL_GUTS_VAR();", + "", + " return yy_scan_bytes( yystr, strlen(yystr) M4_YY_CALL_LAST_ARG);", + "}", + "%endif", + "]])", + "", + "", + "m4_ifdef( [[M4_YY_NO_SCAN_BYTES]],,", + "[[", + "%if-c-only", + "/** Setup the input buffer state to scan the given bytes. The next call to yylex() 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.", + " * M4_YY_DOC_PARAM", + " * @return the newly allocated buffer state object.", + " */", + "YY_BUFFER_STATE yy_scan_bytes YYFARGS2( yyconst char *,yybytes, int ,_yybytes_len)", + "{", + " YY_BUFFER_STATE b;", + " char *buf;", + " yy_size_t n;", + " int i;", + " m4_dnl M4_YY_DECL_GUTS_VAR();", + "", + " /* Get memory for full buffer, including space for trailing EOB's. */", + " n = _yybytes_len + 2;", + " buf = (char *) yyalloc( n M4_YY_CALL_LAST_ARG );", + " if ( ! buf )", + " YY_FATAL_ERROR( \"out of dynamic memory in yy_scan_bytes()\" );", + "", + " for ( i = 0; i < _yybytes_len; ++i )", + " buf[i] = yybytes[i];", + "", + " buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;", + "", + " b = yy_scan_buffer( buf, n M4_YY_CALL_LAST_ARG);", + " if ( ! b )", + " YY_FATAL_ERROR( \"bad buffer in yy_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", + "]])", + "", + "", + "m4_ifdef( [[M4_YY_NO_PUSH_STATE]],,", + "[[", + "%if-c-only", + " static void yy_push_state YYFARGS1( int ,new_state)", + "%endif", + "%if-c++-only", + " void yyFlexLexer::yy_push_state( int new_state )", + "%endif", + "{", + " M4_YY_DECL_GUTS_VAR();", + " if ( YY_G(yy_start_stack_ptr) >= YY_G(yy_start_stack_depth) )", + " {", + " yy_size_t new_size;", + "", + " YY_G(yy_start_stack_depth) += YY_START_STACK_INCR;", + " new_size = YY_G(yy_start_stack_depth) * sizeof( int );", + "", + " if ( ! YY_G(yy_start_stack) )", + " YY_G(yy_start_stack) = (int *) yyalloc( new_size M4_YY_CALL_LAST_ARG );", + "", + " else", + " YY_G(yy_start_stack) = (int *) yyrealloc(", + " (void *) YY_G(yy_start_stack), new_size M4_YY_CALL_LAST_ARG );", + "", + " if ( ! YY_G(yy_start_stack) )", + " YY_FATAL_ERROR( \"out of memory expanding start-condition stack\" );", + " }", + "", + " YY_G(yy_start_stack)[YY_G(yy_start_stack_ptr)++] = YY_START;", + "", + " BEGIN(new_state);", + "}", + "]])", + "", + "", + "m4_ifdef( [[M4_YY_NO_POP_STATE]],,", + "[[", + "%if-c-only", + " static void yy_pop_state YYFARGS0(void)", + "%endif", + "%if-c++-only", + " void yyFlexLexer::yy_pop_state()", + "%endif", + "{", + " M4_YY_DECL_GUTS_VAR();", + " if ( --YY_G(yy_start_stack_ptr) < 0 )", + " YY_FATAL_ERROR( \"start-condition stack underflow\" );", + "", + " BEGIN(YY_G(yy_start_stack)[YY_G(yy_start_stack_ptr)]);", + "}", + "]])", + "", + "", + "m4_ifdef( [[M4_YY_NO_TOP_STATE]],,", + "[[", + "%if-c-only", + " static int yy_top_state YYFARGS0(void)", + "%endif", + "%if-c++-only", + " int yyFlexLexer::yy_top_state()", + "%endif", + "{", + " M4_YY_DECL_GUTS_VAR();", + " return YY_G(yy_start_stack)[YY_G(yy_start_stack_ptr) - 1];", + "}", + "]])", + "", + "#ifndef YY_EXIT_FAILURE", + "#define YY_EXIT_FAILURE 2", + "#endif", + "", + "%if-c-only", + "static void yy_fatal_error YYFARGS1(yyconst char*, msg)", + "{", + " m4_dnl M4_YY_DECL_GUTS_VAR();", + " (void) fprintf( stderr, \"%s\\n\", msg );", + " exit( YY_EXIT_FAILURE );", + "}", + "%endif", + "%if-c++-only", + "void yyFlexLexer::LexerError( yyconst char msg[] )", + "{", + " M4_YY_DECL_GUTS_VAR();", + " std::cerr << msg << std::endl;", + " exit( YY_EXIT_FAILURE );", + "}", + "%endif", + "", + "/* Redefine yyless() so it works in section 3 code. */", + "", + "#undef yyless", + "#define yyless(n) \\", + " do \\", + " { \\", + " /* Undo effects of setting up yytext. */ \\", + " int yyless_macro_arg = (n); \\", + " YY_LESS_LINENO(yyless_macro_arg);\\", + " yytext[yyleng] = YY_G(yy_hold_char); \\", + " YY_G(yy_c_buf_p) = yytext + yyless_macro_arg; \\", + " YY_G(yy_hold_char) = *YY_G(yy_c_buf_p); \\", + " *YY_G(yy_c_buf_p) = '\\0'; \\", + " yyleng = yyless_macro_arg; \\", + " } \\", + " while ( 0 )", + "", + "", + "", + "/* Accessor methods (get/set functions) to struct members. */", + "", + "%if-c-only", + "%if-reentrant", + "m4_ifdef( [[M4_YY_NO_GET_EXTRA]],,", + "[[", + "/** Get the user-defined data for this scanner.", + " * M4_YY_DOC_PARAM", + " */", + "YY_EXTRA_TYPE yyget_extra YYFARGS0(void)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " return yyextra;", + "}", + "]])", + "%endif", + "", + "m4_ifdef( [[M4_YY_NO_GET_LINENO]],,", + "[[", + "/** Get the current line number.", + " * M4_YY_DOC_PARAM", + " */", + "int yyget_lineno YYFARGS0(void)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " ", + " m4_ifdef( [[M4_YY_REENTRANT]],", + " [[", + " if (! YY_CURRENT_BUFFER)", + " return 0;", + " ]])", + " return yylineno;", + "}", + "]])", + "", + "m4_ifdef( [[M4_YY_REENTRANT]],", + "[[", + "m4_ifdef( [[M4_YY_NO_GET_COLUMN]],,", + "[[", + "/** Get the current column number.", + " * M4_YY_DOC_PARAM", + " */", + "int yyget_column YYFARGS0(void)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " ", + " m4_ifdef( [[M4_YY_REENTRANT]],", + " [[", + " if (! YY_CURRENT_BUFFER)", + " return 0;", + " ]])", + " return yycolumn;", + "}", + "]])", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_GET_IN]],,", + "[[", + "/** Get the input stream.", + " * M4_YY_DOC_PARAM", + " */", + "FILE *yyget_in YYFARGS0(void)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " return yyin;", + "}", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_GET_OUT]],,", + "[[", + "/** Get the output stream.", + " * M4_YY_DOC_PARAM", + " */", + "FILE *yyget_out YYFARGS0(void)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " return yyout;", + "}", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_GET_LENG]],,", + "[[", + "/** Get the length of the current token.", + " * M4_YY_DOC_PARAM", + " */", + "int yyget_leng YYFARGS0(void)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " return yyleng;", + "}", + "]])", + "", + "/** Get the current token.", + " * M4_YY_DOC_PARAM", + " */", + "m4_ifdef( [[M4_YY_NO_GET_TEXT]],,", + "[[", + "char *yyget_text YYFARGS0(void)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " return yytext;", + "}", + "]])", + "", + "%if-reentrant", + "m4_ifdef( [[M4_YY_NO_SET_EXTRA]],,", + "[[", + "/** Set the user-defined data. This data is never touched by the scanner.", + " * @param user_defined The data to be associated with this scanner.", + " * M4_YY_DOC_PARAM", + " */", + "void yyset_extra YYFARGS1( YY_EXTRA_TYPE ,user_defined)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " yyextra = user_defined ;", + "}", + "]])", + "%endif", + "", + "m4_ifdef( [[M4_YY_NO_SET_LINENO]],,", + "[[", + "/** Set the current line number.", + " * @param line_number", + " * M4_YY_DOC_PARAM", + " */", + "void yyset_lineno YYFARGS1( int ,line_number)", + "{", + " M4_YY_DECL_GUTS_VAR();", + "", + " m4_ifdef( [[M4_YY_REENTRANT]],", + " [[", + " /* lineno is only valid if an input buffer exists. */", + " if (! YY_CURRENT_BUFFER )", + " yy_fatal_error( \"yyset_lineno called with no buffer\" M4_YY_CALL_LAST_ARG); ", + " ]])", + " yylineno = line_number;", + "}", + "]])", + "", + "m4_ifdef( [[M4_YY_REENTRANT]],", + "[[", + "m4_ifdef( [[M4_YY_NO_SET_COLUMN]],,", + "[[", + "/** Set the current column.", + " * @param line_number", + " * M4_YY_DOC_PARAM", + " */", + "void yyset_column YYFARGS1( int , column_no)", + "{", + " M4_YY_DECL_GUTS_VAR();", + "", + " m4_ifdef( [[M4_YY_REENTRANT]],", + " [[", + " /* column is only valid if an input buffer exists. */", + " if (! YY_CURRENT_BUFFER )", + " yy_fatal_error( \"yyset_column called with no buffer\" M4_YY_CALL_LAST_ARG); ", + " ]])", + " yycolumn = column_no;", + "}", + "]])", + "]])", + "", + "", + "m4_ifdef( [[M4_YY_NO_SET_IN]],,", + "[[", + "/** Set the input stream. This does not discard the current", + " * input buffer.", + " * @param in_str A readable stream.", + " * M4_YY_DOC_PARAM", + " * @see yy_switch_to_buffer", + " */", + "void yyset_in YYFARGS1( FILE * ,in_str)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " yyin = in_str ;", + "}", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_SET_OUT]],,", + "[[", + "void yyset_out YYFARGS1( FILE * ,out_str)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " yyout = out_str ;", + "}", + "]])", + "", + "", + "m4_ifdef( [[M4_YY_NO_GET_DEBUG]],,", + "[[", + "int yyget_debug YYFARGS0(void)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " return yy_flex_debug;", + "}", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_SET_DEBUG]],,", + "[[", + "void yyset_debug YYFARGS1( int ,bdebug)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " yy_flex_debug = bdebug ;", + "}", + "]])", + "%endif", + "", + "%if-reentrant", + "/* Accessor methods for yylval and yylloc */", + "", + "%if-bison-bridge", + "m4_ifdef( [[M4_YY_NO_GET_LVAL]],,", + "[[", + "YYSTYPE * yyget_lval YYFARGS0(void)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " return yylval;", + "}", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_SET_LVAL]],,", + "[[", + "void yyset_lval YYFARGS1( YYSTYPE * ,yylval_param)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " yylval = yylval_param;", + "}", + "]])", + "", + "m4_ifdef( [[<M4_YY_BISON_LLOC>]],", + "[[", + " m4_ifdef( [[M4_YY_NO_GET_LLOC]],,", + " [[", + "YYLTYPE *yyget_lloc YYFARGS0(void)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " return yylloc;", + "}", + " ]])", + "", + " m4_ifdef( [[M4_YY_NO_SET_LLOC]],,", + " [[", + "void yyset_lloc YYFARGS1( YYLTYPE * ,yylloc_param)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " yylloc = yylloc_param;", + "}", + " ]])", + "]])", + "", + "%endif", + "", + "", + "/* User-visible API */", + "", + "/* yylex_init is special because it creates the scanner itself, so it is", + " * the ONLY reentrant function that doesn't take the scanner as the last argument.", + " * That's why we explicitly handle the declaration, instead of using our macros.", + " */", + "m4_ifdef( [[M4_YY_NO_ANSI_FUNC_DEFS]],", + "[[", + "int yylex_init( ptr_yy_globals )", + " yyscan_t* ptr_yy_globals;", + "]],", + "[[", + "int yylex_init(yyscan_t* ptr_yy_globals)", + "]])", + "{", + " if (ptr_yy_globals == NULL){", + " errno = EINVAL;", + " return 1;", + " }", + "", + " *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL );", + "", + " if (*ptr_yy_globals == NULL){", + " errno = ENOMEM;", + " return 1;", + " }", + "", + " /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */", + " memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));", + "", + " return yy_init_globals ( *ptr_yy_globals );", + "}", + "", + "", + "/* yylex_init_extra has the same functionality as yylex_init, but follows the", + " * convention of taking the scanner as the last argument. Note however, that", + " * this is a *pointer* to a scanner, as it will be allocated by this call (and", + " * is the reason, too, why this function also must handle its own declaration).", + " * The user defined value in the first argument will be available to yyalloc in", + " * the yyextra field.", + " */", + "m4_ifdef( [[M4_YY_NO_ANSI_FUNC_DEFS]],", + "[[", + "int yylex_init_extra( yy_user_defined, ptr_yy_globals )", + " YY_EXTRA_TYPE yy_user_defined;", + " yyscan_t* ptr_yy_globals;", + "]],", + "[[", + "int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals )", + "]])", + "{", + " struct yyguts_t dummy_yyguts;", + "", + " yyset_extra (yy_user_defined, &dummy_yyguts);", + "", + " if (ptr_yy_globals == NULL){", + " errno = EINVAL;", + " return 1;", + " }", + " ", + " *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );", + " ", + " if (*ptr_yy_globals == NULL){", + " errno = ENOMEM;", + " return 1;", + " }", + " ", + " /* By setting to 0xAA, we expose bugs in", + " yy_init_globals. Leave at 0x00 for releases. */", + " memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));", + " ", + " yyset_extra (yy_user_defined, *ptr_yy_globals);", + " ", + " return yy_init_globals ( *ptr_yy_globals );", + "}", + "", + "%endif if-c-only", + "", + "", + "%if-c-only", + "static int yy_init_globals YYFARGS0(void)", + "{", + " M4_YY_DECL_GUTS_VAR();", + " /* Initialization is the same as for the non-reentrant scanner.", + " * This function is called from yylex_destroy(), so don't allocate here.", + " */", + "", + "m4_ifdef( [[M4_YY_USE_LINENO]],", + "[[", + " m4_ifdef( [[M4_YY_NOT_REENTRANT]],", + " [[", + " /* We do not touch yylineno unless the option is enabled. */", + " yylineno = 1;", + " ]])", + "]])", + " YY_G(yy_buffer_stack) = 0;", + " YY_G(yy_buffer_stack_top) = 0;", + " YY_G(yy_buffer_stack_max) = 0;", + " YY_G(yy_c_buf_p) = (char *) 0;", + " YY_G(yy_init) = 0;", + " YY_G(yy_start) = 0;", + "", + "m4_ifdef( [[M4_YY_HAS_START_STACK_VARS]],", + "[[", + " YY_G(yy_start_stack_ptr) = 0;", + " YY_G(yy_start_stack_depth) = 0;", + " YY_G(yy_start_stack) = NULL;", + "]])", + "", + "m4_ifdef( [[M4_YY_USES_REJECT]],", + "[[", + " YY_G(yy_state_buf) = 0;", + " YY_G(yy_state_ptr) = 0;", + " YY_G(yy_full_match) = 0;", + " YY_G(yy_lp) = 0;", + "]])", + "", + "m4_ifdef( [[M4_YY_TEXT_IS_ARRAY]],", + "[[", + " YY_G(yytext_ptr) = 0;", + " YY_G(yy_more_offset) = 0;", + " YY_G(yy_prev_more_offset) = 0;", + "]])", + "", + "/* Defined in main.c */", + "#ifdef YY_STDINIT", + " yyin = stdin;", + " yyout = stdout;", + "#else", + " yyin = (FILE *) 0;", + " yyout = (FILE *) 0;", + "#endif", + "", + " /* For future reference: Set errno on error, since we are called by", + " * yylex_init()", + " */", + " return 0;", + "}", + "%endif", + "", + "", + "%if-c-only SNIP! this currently causes conflicts with the c++ scanner", + "/* yylex_destroy is for both reentrant and non-reentrant scanners. */", + "int yylex_destroy YYFARGS0(void)", + "{", + " M4_YY_DECL_GUTS_VAR();", + "", + " /* Pop the buffer stack, destroying each element. */", + " while(YY_CURRENT_BUFFER){", + " yy_delete_buffer( YY_CURRENT_BUFFER M4_YY_CALL_LAST_ARG );", + " YY_CURRENT_BUFFER_LVALUE = NULL;", + " yypop_buffer_state(M4_YY_CALL_ONLY_ARG);", + " }", + "", + " /* Destroy the stack itself. */", + " yyfree(YY_G(yy_buffer_stack) M4_YY_CALL_LAST_ARG);", + " YY_G(yy_buffer_stack) = NULL;", + "", + "m4_ifdef( [[M4_YY_HAS_START_STACK_VARS]],", + "[[", + " /* Destroy the start condition stack. */", + " yyfree( YY_G(yy_start_stack) M4_YY_CALL_LAST_ARG );", + " YY_G(yy_start_stack) = NULL;", + "]])", + "", + "m4_ifdef( [[M4_YY_USES_REJECT]],", + "[[", + " yyfree ( YY_G(yy_state_buf) M4_YY_CALL_LAST_ARG);", + " YY_G(yy_state_buf) = NULL;", + "]])", + "", + " /* Reset the globals. This is important in a non-reentrant scanner so the next time", + " * yylex() is called, initialization will occur. */", + " yy_init_globals( M4_YY_CALL_ONLY_ARG);", + "", + "%if-reentrant", + " /* Destroy the main struct (reentrant only). */", + " yyfree ( yyscanner M4_YY_CALL_LAST_ARG );", + " yyscanner = NULL;", + "%endif", + " return 0;", + "}", + "%endif", + "", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "/*", + " * Internal utility routines.", + " */", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "#ifndef yytext_ptr", + "static void yy_flex_strncpy YYFARGS3( char*,s1, yyconst char *,s2, int,n)", + "{", + " register int i;", + " for ( i = 0; i < n; ++i )", + " s1[i] = s2[i];", + "}", + "#endif", + "]])", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "#ifdef YY_NEED_STRLEN", + "static int yy_flex_strlen YYFARGS1( yyconst char *,s)", + "{", + " register int n;", + " for ( n = 0; s[n]; ++n )", + " ;", + "", + " return n;", + "}", + "#endif", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_FLEX_ALLOC]],,", + "[[", + "void *yyalloc YYFARGS1( yy_size_t ,size)", + "{", + " return (void *) malloc( size );", + "}", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_FLEX_REALLOC]],,", + "[[", + "void *yyrealloc YYFARGS2( 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 );", + "}", + "]])", + "", + "m4_ifdef( [[M4_YY_NO_FLEX_FREE]],,", + "[[", + "void yyfree YYFARGS1( void *,ptr)", + "{", + " free( (char *) ptr ); /* see yyrealloc() for (char *) cast */", + "}", + "]])", + "", + "%if-tables-serialization definitions", + "#ifdef FLEX_SCANNER", + "/*", + "dnl tables_shared.c - tables serialization code", + "dnl ", + "dnl Copyright (c) 1990 The Regents of the University of California.", + "dnl All rights reserved.", + "dnl ", + "dnl This code is derived from software contributed to Berkeley by", + "dnl Vern Paxson.", + "dnl ", + "dnl The United States Government has rights in this work pursuant", + "dnl to contract no. DE-AC03-76SF00098 between the United States", + "dnl Department of Energy and the University of California.", + "dnl ", + "dnl This file is part of flex.", + "dnl ", + "dnl Redistribution and use in source and binary forms, with or without", + "dnl modification, are permitted provided that the following conditions", + "dnl are met:", + "dnl ", + "dnl 1. Redistributions of source code must retain the above copyright", + "dnl notice, this list of conditions and the following disclaimer.", + "dnl 2. Redistributions in binary form must reproduce the above copyright", + "dnl notice, this list of conditions and the following disclaimer in the", + "dnl documentation and/or other materials provided with the distribution.", + "dnl ", + "dnl Neither the name of the University nor the names of its contributors", + "dnl may be used to endorse or promote products derived from this software", + "dnl without specific prior written permission.", + "dnl ", + "dnl THIS SOFTWARE IS PROVIDED `AS IS' AND WITHOUT ANY EXPRESS OR", + "dnl IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED", + "dnl WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR", + "dnl PURPOSE.", + "dnl ", + "*/", + "", + "/* This file is meant to be included in both the skeleton and the actual", + " * flex code (hence the name \"_shared\"). ", + " */", + "#ifndef yyskel_static", + "#define yyskel_static static", + "#endif", + "#else", + "#include \"flexdef.h\"", + "#include \"tables.h\"", + "#ifndef yyskel_static", + "#define yyskel_static", + "#endif", + "#endif", + "", + "", + "/** Get the number of integers in this table. This is NOT the", + " * same thing as the number of elements.", + " * @param td the table ", + " * @return the number of integers in the table", + " */", + "yyskel_static flex_int32_t yytbl_calc_total_len (const struct yytbl_data *tbl)", + "{", + " flex_int32_t n;", + "", + " /* total number of ints */", + " n = tbl->td_lolen;", + " if (tbl->td_hilen > 0)", + " n *= tbl->td_hilen;", + "", + " if (tbl->td_id == YYTD_ID_TRANSITION)", + " n *= 2;", + " return n;", + "}", + "", + "", + "static int yytbl_read8 (void *v, struct yytbl_reader * rd)", + "{", + " errno = 0;", + " if (fread (v, sizeof (flex_uint8_t), 1, rd->fp) != 1){", + " errno = EIO;", + " return -1;", + " }", + " rd->bread += sizeof(flex_uint8_t);", + " return 0;", + "}", + "", + "static int yytbl_read16 (void *v, struct yytbl_reader * rd)", + "{", + " errno = 0;", + " if (fread (v, sizeof (flex_uint16_t), 1, rd->fp) != 1){", + " errno = EIO;", + " return -1;", + " }", + " *((flex_uint16_t *) v) = ntohs (*((flex_uint16_t *) v));", + " rd->bread += sizeof(flex_uint16_t);", + " return 0;", + "}", + "", + "static int yytbl_read32 (void *v, struct yytbl_reader * rd)", + "{", + " errno = 0;", + " if (fread (v, sizeof (flex_uint32_t), 1, rd->fp) != 1){", + " errno = EIO;", + " return -1;", + " }", + " *((flex_uint32_t *) v) = ntohl (*((flex_uint32_t *) v));", + " rd->bread += sizeof(flex_uint32_t);", + " return 0;", + "}", + "", + "/** Read the header */", + "static int yytbl_hdr_read YYFARGS2(struct yytbl_hdr *, th, struct yytbl_reader *, rd)", + "{", + " int bytes;", + " memset (th, 0, sizeof (struct yytbl_hdr));", + "", + " if (yytbl_read32 (&(th->th_magic), rd) != 0)", + " return -1;", + "", + " if (th->th_magic != YYTBL_MAGIC){", + " yy_fatal_error(\"bad magic number\" /*TODO: not fatal.*/ M4_YY_CALL_LAST_ARG);", + " return -1;", + " }", + "", + " if (yytbl_read32 (&(th->th_hsize), rd) != 0", + " || yytbl_read32 (&(th->th_ssize), rd) != 0", + " || yytbl_read16 (&(th->th_flags), rd) != 0)", + " return -1;", + "", + " /* Sanity check on header size. Greater than 1k suggests some funny business. */", + " if (th->th_hsize < 16 || th->th_hsize > 1024){", + " yy_fatal_error(\"insane header size detected\" /*TODO: not fatal.*/ M4_YY_CALL_LAST_ARG);", + " return -1;", + " }", + "", + " /* Allocate enough space for the version and name fields */", + " bytes = th->th_hsize - 14;", + " th->th_version = (char *) yyalloc (bytes M4_YY_CALL_LAST_ARG);", + " if ( ! th->th_version )", + " YY_FATAL_ERROR( \"out of dynamic memory in yytbl_hdr_read()\" );", + "", + " /* we read it all into th_version, and point th_name into that data */", + " if (fread (th->th_version, 1, bytes, rd->fp) != bytes){", + " errno = EIO;", + " yyfree(th->th_version M4_YY_CALL_LAST_ARG);", + " th->th_version = NULL;", + " return -1;", + " }", + " else", + " rd->bread += bytes;", + "", + " th->th_name = th->th_version + strlen (th->th_version) + 1;", + " return 0;", + "}", + "", + "/** lookup id in the dmap list.", + " * @param dmap pointer to first element in list", + " * @return NULL if not found.", + " */", + "static struct yytbl_dmap *yytbl_dmap_lookup YYFARGS2(struct yytbl_dmap *, dmap,", + " int, id)", + "{", + " while (dmap->dm_id)", + " if (dmap->dm_id == id)", + " return dmap;", + " else", + " dmap++;", + " return NULL;", + "}", + "", + "/** Read a table while mapping its contents to the local array. ", + " * @param dmap used to performing mapping", + " * @return 0 on success", + " */", + "static int yytbl_data_load YYFARGS2(struct yytbl_dmap *, dmap, struct yytbl_reader*, rd)", + "{", + " struct yytbl_data td;", + " struct yytbl_dmap *transdmap=0;", + " int len, i, rv, inner_loop_count;", + " void *p=0;", + "", + " memset (&td, 0, sizeof (struct yytbl_data));", + "", + " if (yytbl_read16 (&td.td_id, rd) != 0", + " || yytbl_read16 (&td.td_flags, rd) != 0", + " || yytbl_read32 (&td.td_hilen, rd) != 0", + " || yytbl_read32 (&td.td_lolen, rd) != 0)", + " return -1;", + "", + " /* Lookup the map for the transition table so we have it in case we need it", + " * inside the loop below. This scanner might not even have a transition", + " * table, which is ok.", + " */", + " transdmap = yytbl_dmap_lookup (dmap, YYTD_ID_TRANSITION M4_YY_CALL_LAST_ARG);", + "", + " if ((dmap = yytbl_dmap_lookup (dmap, td.td_id M4_YY_CALL_LAST_ARG)) == NULL){", + " yy_fatal_error(\"table id not found in map.\" /*TODO: not fatal.*/ M4_YY_CALL_LAST_ARG);", + " return -1;", + " }", + "", + " /* Allocate space for table.", + " * The --full yy_transition table is a special case, since we", + " * need the dmap.dm_sz entry to tell us the sizeof the individual", + " * struct members.", + " */", + " {", + " size_t bytes;", + "", + " if ((td.td_flags & YYTD_STRUCT))", + " bytes = sizeof(struct yy_trans_info) * td.td_lolen * (td.td_hilen ? td.td_hilen : 1);", + " else", + " bytes = td.td_lolen * (td.td_hilen ? td.td_hilen : 1) * dmap->dm_sz;", + "", + " if(M4_YY_TABLES_VERIFY)", + " /* We point to the array itself */", + " p = dmap->dm_arr; ", + " else", + " /* We point to the address of a pointer. */", + " *dmap->dm_arr = p = (void *) yyalloc (bytes M4_YY_CALL_LAST_ARG);", + " if ( ! p )", + " YY_FATAL_ERROR( \"out of dynamic memory in yytbl_data_load()\" );", + " }", + "", + " /* If it's a struct, we read 2 integers to get one element */", + " if ((td.td_flags & YYTD_STRUCT) != 0)", + " inner_loop_count = 2;", + " else", + " inner_loop_count = 1;", + "", + " /* read and map each element.", + " * This loop iterates once for each element of the td_data array.", + " * Notice that we increment 'i' in the inner loop.", + " */", + " len = yytbl_calc_total_len (&td);", + " for (i = 0; i < len; ){", + " int j;", + "", + "", + " /* This loop really executes exactly 1 or 2 times.", + " * The second time is to handle the second member of the", + " * YYTD_STRUCT for the yy_transition array.", + " */", + " for (j = 0; j < inner_loop_count; j++, i++) {", + " flex_int32_t t32;", + "", + " /* read into t32 no matter what the real size is. */", + " {", + " flex_int16_t t16;", + " flex_int8_t t8;", + "", + " switch (YYTDFLAGS2BYTES (td.td_flags)) {", + " case sizeof (flex_int32_t):", + " rv = yytbl_read32 (&t32, rd);", + " break;", + " case sizeof (flex_int16_t):", + " rv = yytbl_read16 (&t16, rd);", + " t32 = t16;", + " break;", + " case sizeof (flex_int8_t):", + " rv = yytbl_read8 (&t8, rd);", + " t32 = t8;", + " break;", + " default: ", + " yy_fatal_error(\"invalid td_flags\" /*TODO: not fatal.*/ M4_YY_CALL_LAST_ARG);", + " return -1;", + " }", + " }", + " if (rv != 0)", + " return -1;", + "", + " /* copy into the deserialized array... */", + "", + " if ((td.td_flags & YYTD_STRUCT)) {", + " /* t32 is the j'th member of a two-element struct. */", + " void *v;", + "", + " v = j == 0 ? &(((struct yy_trans_info *) p)->yy_verify)", + " : &(((struct yy_trans_info *) p)->yy_nxt);", + "", + " switch (dmap->dm_sz) {", + " case sizeof (flex_int32_t):", + " if (M4_YY_TABLES_VERIFY){", + " if( ((flex_int32_t *) v)[0] != (flex_int32_t) t32)", + " yy_fatal_error(\"tables verification failed at YYTD_STRUCT flex_int32_t\" M4_YY_CALL_LAST_ARG);", + " }else", + " ((flex_int32_t *) v)[0] = (flex_int32_t) t32;", + " break;", + " case sizeof (flex_int16_t):", + " if (M4_YY_TABLES_VERIFY ){", + " if(((flex_int16_t *) v)[0] != (flex_int16_t) t32)", + " yy_fatal_error(\"tables verification failed at YYTD_STRUCT flex_int16_t\" M4_YY_CALL_LAST_ARG);", + " }else", + " ((flex_int16_t *) v)[0] = (flex_int16_t) t32;", + " break;", + " case sizeof(flex_int8_t):", + " if (M4_YY_TABLES_VERIFY ){", + " if( ((flex_int8_t *) v)[0] != (flex_int8_t) t32)", + " yy_fatal_error(\"tables verification failed at YYTD_STRUCT flex_int8_t\" M4_YY_CALL_LAST_ARG);", + " }else", + " ((flex_int8_t *) v)[0] = (flex_int8_t) t32;", + " break;", + " default:", + " yy_fatal_error(\"invalid dmap->dm_sz for struct\" /*TODO: not fatal.*/ M4_YY_CALL_LAST_ARG);", + " return -1;", + " }", + "", + " /* if we're done with j, increment p */", + " if (j == 1)", + " p = (struct yy_trans_info *) p + 1;", + " }", + " else if ((td.td_flags & YYTD_PTRANS)) {", + " /* t32 is an index into the transition array. */", + " struct yy_trans_info *v;", + "", + "", + " if (!transdmap){", + " yy_fatal_error(\"transition table not found\" /*TODO: not fatal.*/ M4_YY_CALL_LAST_ARG);", + " return -1;", + " }", + " ", + " if( M4_YY_TABLES_VERIFY)", + " v = &(((struct yy_trans_info *) (transdmap->dm_arr))[t32]);", + " else", + " v = &((*((struct yy_trans_info **) (transdmap->dm_arr)))[t32]);", + "", + " if(M4_YY_TABLES_VERIFY ){", + " if( ((struct yy_trans_info **) p)[0] != v)", + " yy_fatal_error(\"tables verification failed at YYTD_PTRANS\" M4_YY_CALL_LAST_ARG);", + " }else", + " ((struct yy_trans_info **) p)[0] = v;", + " ", + " /* increment p */", + " p = (struct yy_trans_info **) p + 1;", + " }", + " else {", + " /* t32 is a plain int. copy data, then incrememnt p. */", + " switch (dmap->dm_sz) {", + " case sizeof (flex_int32_t):", + " if(M4_YY_TABLES_VERIFY ){", + " if( ((flex_int32_t *) p)[0] != (flex_int32_t) t32)", + " yy_fatal_error(\"tables verification failed at flex_int32_t\" M4_YY_CALL_LAST_ARG);", + " }else", + " ((flex_int32_t *) p)[0] = (flex_int32_t) t32;", + " p = ((flex_int32_t *) p) + 1;", + " break;", + " case sizeof (flex_int16_t):", + " if(M4_YY_TABLES_VERIFY ){", + " if( ((flex_int16_t *) p)[0] != (flex_int16_t) t32)", + " yy_fatal_error(\"tables verification failed at flex_int16_t\" M4_YY_CALL_LAST_ARG);", + " }else", + " ((flex_int16_t *) p)[0] = (flex_int16_t) t32;", + " p = ((flex_int16_t *) p) + 1;", + " break;", + " case sizeof (flex_int8_t):", + " if(M4_YY_TABLES_VERIFY ){", + " if( ((flex_int8_t *) p)[0] != (flex_int8_t) t32)", + " yy_fatal_error(\"tables verification failed at flex_int8_t\" M4_YY_CALL_LAST_ARG);", + " }else", + " ((flex_int8_t *) p)[0] = (flex_int8_t) t32;", + " p = ((flex_int8_t *) p) + 1;", + " break;", + " default:", + " yy_fatal_error(\"invalid dmap->dm_sz for plain int\" /*TODO: not fatal.*/ M4_YY_CALL_LAST_ARG);", + " return -1;", + " }", + " }", + " }", + "", + " }", + "", + " /* Now eat padding. */", + " {", + " int pad;", + " pad = yypad64(rd->bread);", + " while(--pad >= 0){", + " flex_int8_t t8;", + " if(yytbl_read8(&t8,rd) != 0)", + " return -1;", + " }", + " }", + "", + " return 0;", + "}", + "", + "%define-yytables The name for this specific scanner's tables.", + "", + "/* Find the key and load the DFA tables from the given stream. */", + "static int yytbl_fload YYFARGS2(FILE *, fp, const char *, key)", + "{", + " int rv=0;", + " struct yytbl_hdr th;", + " struct yytbl_reader rd;", + "", + " rd.fp = fp;", + " th.th_version = NULL;", + "", + " /* Keep trying until we find the right set of tables or end of file. */", + " while (!feof(rd.fp)) {", + " rd.bread = 0;", + " if (yytbl_hdr_read (&th, &rd M4_YY_CALL_LAST_ARG) != 0){", + " rv = -1;", + " goto return_rv;", + " }", + "", + " /* A NULL key means choose the first set of tables. */", + " if (key == NULL)", + " break;", + "", + " if (strcmp(th.th_name,key) != 0){", + " /* Skip ahead to next set */", + " fseek(rd.fp, th.th_ssize - th.th_hsize, SEEK_CUR);", + " yyfree(th.th_version M4_YY_CALL_LAST_ARG);", + " th.th_version = NULL;", + " }", + " else", + " break;", + " }", + "", + " while (rd.bread < th.th_ssize){", + " /* Load the data tables */", + " if(yytbl_data_load (yydmap,&rd M4_YY_CALL_LAST_ARG) != 0){", + " rv = -1;", + " goto return_rv;", + " }", + " }", + "", + "return_rv:", + " if(th.th_version){", + " yyfree(th.th_version M4_YY_CALL_LAST_ARG);", + " th.th_version = NULL;", + " }", + "", + " return rv;", + "}", + "", + "/** Load the DFA tables for this scanner from the given stream. */", + "int yytables_fload YYFARGS1(FILE *, fp)", + "{", + "", + " if( yytbl_fload(fp, YYTABLES_NAME M4_YY_CALL_LAST_ARG) != 0)", + " return -1;", + " return 0;", + "}", + "", + "/** Destroy the loaded tables, freeing memory, etc.. */", + "int yytables_destroy YYFARGS0(void)", + "{ ", + " struct yytbl_dmap *dmap=0;", + "", + " if(!M4_YY_TABLES_VERIFY){", + " /* Walk the dmap, freeing the pointers */", + " for(dmap=yydmap; dmap->dm_id; dmap++) {", + " void * v;", + " v = dmap->dm_arr;", + " if(v && *(char**)v){", + " yyfree(*(char**)v M4_YY_CALL_LAST_ARG);", + " *(char**)v = NULL;", + " }", + " }", + " }", + "", + " return 0;", + "}", + "", + "/* end table serialization code definitions */", + "%endif", + "", + "", + "m4_ifdef([[M4_YY_MAIN]], [[", + "int main M4_YY_PARAMS(void);", + "", + "int main ()", + "{", + "", + "%if-reentrant", + " yyscan_t lexer;", + " yylex_init(&lexer);", + " yylex( lexer );", + " yylex_destroy( lexer);", + "", + "%endif", + "%if-not-reentrant", + " yylex();", + "%endif", + "", + " return 0;", + "}", + "]])", + "", + "%ok-for-header", + "m4_ifdef( [[M4_YY_IN_HEADER]],", + "[[", + "#undef YY_NEW_FILE", + "#undef YY_FLUSH_BUFFER", + "#undef yy_set_bol", + "#undef yy_new_buffer", + "#undef yy_set_interactive", + "#undef YY_DO_BEFORE_ACTION", + "", + "#ifdef YY_DECL_IS_OURS", + "#undef YY_DECL_IS_OURS", + "#undef YY_DECL", + "#endif", + "]])", + 0 +}; diff --git a/sym.c b/sym.c new file mode 100644 index 000000000000..8d0b2e9e6f68 --- /dev/null +++ b/sym.c @@ -0,0 +1,272 @@ +/* sym - symbol table routines */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" + +/* Variables for symbol tables: + * sctbl - start-condition symbol table + * ndtbl - name-definition symbol table + * ccltab - character class text symbol table + */ + +struct hash_entry { + struct hash_entry *prev, *next; + char *name; + char *str_val; + int int_val; +}; + +typedef struct hash_entry **hash_table; + +#define NAME_TABLE_HASH_SIZE 101 +#define START_COND_HASH_SIZE 101 +#define CCL_HASH_SIZE 101 + +static struct hash_entry *ndtbl[NAME_TABLE_HASH_SIZE]; +static struct hash_entry *sctbl[START_COND_HASH_SIZE]; +static struct hash_entry *ccltab[CCL_HASH_SIZE]; + + +/* declare functions that have forward references */ + +static int addsym PROTO ((register char[], char *, int, hash_table, int)); +static struct hash_entry *findsym PROTO ((register const char *sym, + hash_table table, + + int table_size)); +static int hashfunct PROTO ((register const char *, int)); + + +/* addsym - add symbol and definitions to symbol table + * + * -1 is returned if the symbol already exists, and the change not made. + */ + +static int addsym (sym, str_def, int_def, table, table_size) + register char sym[]; + char *str_def; + int int_def; + hash_table table; + int table_size; +{ + int hash_val = hashfunct (sym, table_size); + register struct hash_entry *sym_entry = table[hash_val]; + register struct hash_entry *new_entry; + register struct hash_entry *successor; + + while (sym_entry) { + if (!strcmp (sym, sym_entry->name)) { /* entry already exists */ + return -1; + } + + sym_entry = sym_entry->next; + } + + /* create new entry */ + new_entry = (struct hash_entry *) + flex_alloc (sizeof (struct hash_entry)); + + if (new_entry == NULL) + flexfatal (_("symbol table memory allocation failed")); + + if ((successor = table[hash_val]) != 0) { + new_entry->next = successor; + successor->prev = new_entry; + } + else + new_entry->next = NULL; + + new_entry->prev = NULL; + new_entry->name = sym; + new_entry->str_val = str_def; + new_entry->int_val = int_def; + + table[hash_val] = new_entry; + + return 0; +} + + +/* cclinstal - save the text of a character class */ + +void cclinstal (ccltxt, cclnum) + Char ccltxt[]; + int cclnum; +{ + /* We don't bother checking the return status because we are not + * called unless the symbol is new. + */ + + (void) addsym ((char *) copy_unsigned_string (ccltxt), + (char *) 0, cclnum, ccltab, CCL_HASH_SIZE); +} + + +/* ccllookup - lookup the number associated with character class text + * + * Returns 0 if there's no CCL associated with the text. + */ + +int ccllookup (ccltxt) + Char ccltxt[]; +{ + return findsym ((char *) ccltxt, ccltab, CCL_HASH_SIZE)->int_val; +} + + +/* findsym - find symbol in symbol table */ + +static struct hash_entry *findsym (sym, table, table_size) + register const char *sym; + hash_table table; + int table_size; +{ + static struct hash_entry empty_entry = { + (struct hash_entry *) 0, (struct hash_entry *) 0, + (char *) 0, (char *) 0, 0, + }; + register struct hash_entry *sym_entry = + + table[hashfunct (sym, table_size)]; + + while (sym_entry) { + if (!strcmp (sym, sym_entry->name)) + return sym_entry; + sym_entry = sym_entry->next; + } + + return &empty_entry; +} + +/* hashfunct - compute the hash value for "str" and hash size "hash_size" */ + +static int hashfunct (str, hash_size) + register const char *str; + int hash_size; +{ + register int hashval; + register int locstr; + + hashval = 0; + locstr = 0; + + while (str[locstr]) { + hashval = (hashval << 1) + (unsigned char) str[locstr++]; + hashval %= hash_size; + } + + return hashval; +} + + +/* ndinstal - install a name definition */ + +void ndinstal (name, definition) + const char *name; + Char definition[]; +{ + + if (addsym (copy_string (name), + (char *) copy_unsigned_string (definition), 0, + ndtbl, NAME_TABLE_HASH_SIZE)) + synerr (_("name defined twice")); +} + + +/* ndlookup - lookup a name definition + * + * Returns a nil pointer if the name definition does not exist. + */ + +Char *ndlookup (nd) + const char *nd; +{ + return (Char *) findsym (nd, ndtbl, NAME_TABLE_HASH_SIZE)->str_val; +} + + +/* scextend - increase the maximum number of start conditions */ + +void scextend () +{ + current_max_scs += MAX_SCS_INCREMENT; + + ++num_reallocs; + + scset = reallocate_integer_array (scset, current_max_scs); + scbol = reallocate_integer_array (scbol, current_max_scs); + scxclu = reallocate_integer_array (scxclu, current_max_scs); + sceof = reallocate_integer_array (sceof, current_max_scs); + scname = reallocate_char_ptr_array (scname, current_max_scs); +} + + +/* scinstal - make a start condition + * + * NOTE + * The start condition is "exclusive" if xcluflg is true. + */ + +void scinstal (str, xcluflg) + const char *str; + int xcluflg; +{ + + if (++lastsc >= current_max_scs) + scextend (); + + scname[lastsc] = copy_string (str); + + if (addsym (scname[lastsc], (char *) 0, lastsc, + sctbl, START_COND_HASH_SIZE)) + format_pinpoint_message (_ + ("start condition %s declared twice"), +str); + + scset[lastsc] = mkstate (SYM_EPSILON); + scbol[lastsc] = mkstate (SYM_EPSILON); + scxclu[lastsc] = xcluflg; + sceof[lastsc] = false; +} + + +/* sclookup - lookup the number associated with a start condition + * + * Returns 0 if no such start condition. + */ + +int sclookup (str) + const char *str; +{ + return findsym (str, sctbl, START_COND_HASH_SIZE)->int_val; +} diff --git a/tables.c b/tables.c new file mode 100644 index 000000000000..daa2e878d995 --- /dev/null +++ b/tables.c @@ -0,0 +1,497 @@ +/* tables.c - tables serialization code + * + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Vern Paxson. + * + * The United States Government has rights in this work pursuant + * to contract no. DE-AC03-76SF00098 between the United States + * Department of Energy and the University of California. + * + * This file is part of flex. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + + +#include "flexdef.h" +#include "tables.h" + +/** Convert size_t to t_flag. + * @param n in {1,2,4} + * @return YYTD_DATA*. + */ +#define BYTES2TFLAG(n)\ + (((n) == sizeof(flex_int8_t))\ + ? YYTD_DATA8\ + :(((n)== sizeof(flex_int16_t))\ + ? YYTD_DATA16\ + : YYTD_DATA32)) + +/** Clear YYTD_DATA* bit flags + * @return the flag with the YYTD_DATA* bits cleared + */ +#define TFLAGS_CLRDATA(flg) ((flg) & ~(YYTD_DATA8 | YYTD_DATA16 | YYTD_DATA32)) + +int yytbl_write32 (struct yytbl_writer *wr, flex_uint32_t v); +int yytbl_write16 (struct yytbl_writer *wr, flex_uint16_t v); +int yytbl_write8 (struct yytbl_writer *wr, flex_uint8_t v); +int yytbl_writen (struct yytbl_writer *wr, void *v, flex_int32_t len); +static flex_int32_t yytbl_data_geti (const struct yytbl_data *tbl, int i); +static flex_int32_t yytbl_data_getijk (const struct yytbl_data *tbl, int i, + int j, int k); + + +/** Initialize the table writer. + * @param wr an uninitialized writer + * @param the output file + * @return 0 on success + */ +int yytbl_writer_init (struct yytbl_writer *wr, FILE * out) +{ + wr->out = out; + wr->total_written = 0; + return 0; +} + +/** Initialize a table header. + * @param th The uninitialized structure + * @param version_str the version string + * @param name the name of this table set + */ +int yytbl_hdr_init (struct yytbl_hdr *th, const char *version_str, + const char *name) +{ + memset (th, 0, sizeof (struct yytbl_hdr)); + + th->th_magic = YYTBL_MAGIC; + th->th_hsize = 14 + strlen (version_str) + 1 + strlen (name) + 1; + th->th_hsize += yypad64 (th->th_hsize); + th->th_ssize = 0; // Not known at this point. + th->th_flags = 0; + th->th_version = copy_string (version_str); + th->th_name = copy_string (name); + return 0; +} + +/** Allocate and initialize a table data structure. + * @param tbl a pointer to an uninitialized table + * @param id the table identifier + * @return 0 on success + */ +int yytbl_data_init (struct yytbl_data *td, enum yytbl_id id) +{ + + memset (td, 0, sizeof (struct yytbl_data)); + td->td_id = id; + td->td_flags = YYTD_DATA32; + return 0; +} + +/** Clean up table and data array. + * @param td will be destroyed + * @return 0 on success + */ +int yytbl_data_destroy (struct yytbl_data *td) +{ + if (td->td_data) + free (td->td_data); + td->td_data = 0; + free (td); + return 0; +} + +/** Write enough padding to bring the file pointer to a 64-bit boundary. */ +static int yytbl_write_pad64 (struct yytbl_writer *wr) +{ + int pad, bwritten = 0; + + pad = yypad64 (wr->total_written); + while (pad-- > 0) + if (yytbl_write8 (wr, 0) < 0) + return -1; + else + bwritten++; + return bwritten; +} + +/** write the header. + * @param out the output stream + * @param th table header to be written + * @return -1 on error, or bytes written on success. + */ +int yytbl_hdr_fwrite (struct yytbl_writer *wr, const struct yytbl_hdr *th) +{ + int sz, rv; + int bwritten = 0; + + if (yytbl_write32 (wr, th->th_magic) < 0 + || yytbl_write32 (wr, th->th_hsize) < 0) + flex_die (_("th_magic|th_hsize write32 failed")); + bwritten += 8; + + if (fgetpos (wr->out, &(wr->th_ssize_pos)) != 0) + flex_die (_("fgetpos failed")); + + if (yytbl_write32 (wr, th->th_ssize) < 0 + || yytbl_write16 (wr, th->th_flags) < 0) + flex_die (_("th_ssize|th_flags write failed")); + bwritten += 6; + + sz = strlen (th->th_version) + 1; + if ((rv = yytbl_writen (wr, th->th_version, sz)) != sz) + flex_die (_("th_version writen failed")); + bwritten += rv; + + sz = strlen (th->th_name) + 1; + if ((rv = yytbl_writen (wr, th->th_name, sz)) != sz) + flex_die (_("th_name writen failed")); + bwritten += rv; + + /* add padding */ + if ((rv = yytbl_write_pad64 (wr)) < 0) + flex_die (_("pad64 failed")); + bwritten += rv; + + /* Sanity check */ + if (bwritten != (int) th->th_hsize) + flex_die (_("pad64 failed")); + + return bwritten; +} + + +/** Write this table. + * @param out the file writer + * @param td table data to be written + * @return -1 on error, or bytes written on success. + */ +int yytbl_data_fwrite (struct yytbl_writer *wr, struct yytbl_data *td) +{ + int rv; + flex_int32_t bwritten = 0; + flex_int32_t i, total_len; + fpos_t pos; + + if ((rv = yytbl_write16 (wr, td->td_id)) < 0) + return -1; + bwritten += rv; + + if ((rv = yytbl_write16 (wr, td->td_flags)) < 0) + return -1; + bwritten += rv; + + if ((rv = yytbl_write32 (wr, td->td_hilen)) < 0) + return -1; + bwritten += rv; + + if ((rv = yytbl_write32 (wr, td->td_lolen)) < 0) + return -1; + bwritten += rv; + + total_len = yytbl_calc_total_len (td); + for (i = 0; i < total_len; i++) { + switch (YYTDFLAGS2BYTES (td->td_flags)) { + case sizeof (flex_int8_t): + rv = yytbl_write8 (wr, yytbl_data_geti (td, i)); + break; + case sizeof (flex_int16_t): + rv = yytbl_write16 (wr, yytbl_data_geti (td, i)); + break; + case sizeof (flex_int32_t): + rv = yytbl_write32 (wr, yytbl_data_geti (td, i)); + break; + default: + flex_die (_("invalid td_flags detected")); + } + if (rv < 0) { + flex_die (_("error while writing tables")); + return -1; + } + bwritten += rv; + } + + /* Sanity check */ + if (bwritten != (int) (12 + total_len * YYTDFLAGS2BYTES (td->td_flags))) { + flex_die (_("insanity detected")); + return -1; + } + + /* add padding */ + if ((rv = yytbl_write_pad64 (wr)) < 0) { + flex_die (_("pad64 failed")); + return -1; + } + bwritten += rv; + + /* Now go back and update the th_hsize member */ + if (fgetpos (wr->out, &pos) != 0 + || fsetpos (wr->out, &(wr->th_ssize_pos)) != 0 + || yytbl_write32 (wr, wr->total_written) < 0 + || fsetpos (wr->out, &pos)) { + flex_die (_("get|set|fwrite32 failed")); + return -1; + } + else + /* Don't count the int we just wrote. */ + wr->total_written -= sizeof (flex_int32_t); + return bwritten; +} + +/** Write n bytes. + * @param wr the table writer + * @param v data to be written + * @param len number of bytes + * @return -1 on error. number of bytes written on success. + */ +int yytbl_writen (struct yytbl_writer *wr, void *v, flex_int32_t len) +{ + int rv; + + rv = fwrite (v, 1, len, wr->out); + if (rv != len) + return -1; + wr->total_written += len; + return len; +} + +/** Write four bytes in network byte order + * @param wr the table writer + * @param v a dword in host byte order + * @return -1 on error. number of bytes written on success. + */ +int yytbl_write32 (struct yytbl_writer *wr, flex_uint32_t v) +{ + flex_uint32_t vnet; + size_t bytes, rv; + + vnet = htonl (v); + bytes = sizeof (flex_uint32_t); + rv = fwrite (&vnet, bytes, 1, wr->out); + if (rv != 1) + return -1; + wr->total_written += bytes; + return bytes; +} + +/** Write two bytes in network byte order. + * @param wr the table writer + * @param v a word in host byte order + * @return -1 on error. number of bytes written on success. + */ +int yytbl_write16 (struct yytbl_writer *wr, flex_uint16_t v) +{ + flex_uint16_t vnet; + size_t bytes, rv; + + vnet = htons (v); + bytes = sizeof (flex_uint16_t); + rv = fwrite (&vnet, bytes, 1, wr->out); + if (rv != 1) + return -1; + wr->total_written += bytes; + return bytes; +} + +/** Write a byte. + * @param wr the table writer + * @param v the value to be written + * @return -1 on error. number of bytes written on success. + */ +int yytbl_write8 (struct yytbl_writer *wr, flex_uint8_t v) +{ + size_t bytes, rv; + + bytes = sizeof (flex_uint8_t); + rv = fwrite (&v, bytes, 1, wr->out); + if (rv != 1) + return -1; + wr->total_written += bytes; + return bytes; +} + + +/** Extract data element [i][j] from array data tables. + * @param tbl data table + * @param i index into higher dimension array. i should be zero for one-dimensional arrays. + * @param j index into lower dimension array. + * @param k index into struct, must be 0 or 1. Only valid for YYTD_ID_TRANSITION table + * @return data[i][j + k] + */ +static flex_int32_t yytbl_data_getijk (const struct yytbl_data *tbl, int i, + int j, int k) +{ + flex_int32_t lo; + + k %= 2; + lo = tbl->td_lolen; + + switch (YYTDFLAGS2BYTES (tbl->td_flags)) { + case sizeof (flex_int8_t): + return ((flex_int8_t *) (tbl->td_data))[(i * lo + j) * (k + 1) + + k]; + case sizeof (flex_int16_t): + return ((flex_int16_t *) (tbl->td_data))[(i * lo + j) * (k + + 1) + + k]; + case sizeof (flex_int32_t): + return ((flex_int32_t *) (tbl->td_data))[(i * lo + j) * (k + + 1) + + k]; + default: + flex_die (_("invalid td_flags detected")); + break; + } + + return 0; +} + +/** Extract data element [i] from array data tables treated as a single flat array of integers. + * Be careful for 2-dimensional arrays or for YYTD_ID_TRANSITION, which is an array + * of structs. + * @param tbl data table + * @param i index into array. + * @return data[i] + */ +static flex_int32_t yytbl_data_geti (const struct yytbl_data *tbl, int i) +{ + + switch (YYTDFLAGS2BYTES (tbl->td_flags)) { + case sizeof (flex_int8_t): + return ((flex_int8_t *) (tbl->td_data))[i]; + case sizeof (flex_int16_t): + return ((flex_int16_t *) (tbl->td_data))[i]; + case sizeof (flex_int32_t): + return ((flex_int32_t *) (tbl->td_data))[i]; + default: + flex_die (_("invalid td_flags detected")); + break; + } + return 0; +} + +/** Set data element [i] in array data tables treated as a single flat array of integers. + * Be careful for 2-dimensional arrays or for YYTD_ID_TRANSITION, which is an array + * of structs. + * @param tbl data table + * @param i index into array. + * @param newval new value for data[i] + */ +static void yytbl_data_seti (const struct yytbl_data *tbl, int i, + flex_int32_t newval) +{ + + switch (YYTDFLAGS2BYTES (tbl->td_flags)) { + case sizeof (flex_int8_t): + ((flex_int8_t *) (tbl->td_data))[i] = (flex_int8_t) newval; + break; + case sizeof (flex_int16_t): + ((flex_int16_t *) (tbl->td_data))[i] = (flex_int16_t) newval; + break; + case sizeof (flex_int32_t): + ((flex_int32_t *) (tbl->td_data))[i] = (flex_int32_t) newval; + break; + default: + flex_die (_("invalid td_flags detected")); + break; + } +} + +/** Calculate the number of bytes needed to hold the largest + * absolute value in this data array. + * @param tbl the data table + * @return sizeof(n) where n in {flex_int8_t, flex_int16_t, flex_int32_t} + */ +static size_t min_int_size (struct yytbl_data *tbl) +{ + flex_uint32_t i, total_len; + flex_int32_t max = 0; + + total_len = yytbl_calc_total_len (tbl); + + for (i = 0; i < total_len; i++) { + flex_int32_t n; + + n = abs (yytbl_data_geti (tbl, i)); + + if (n > max) + max = n; + } + + if (max <= INT8_MAX) + return sizeof (flex_int8_t); + else if (max <= INT16_MAX) + return sizeof (flex_int16_t); + else + return sizeof (flex_int32_t); +} + +/** Transform data to smallest possible of (int32, int16, int8). + * For example, we may have generated an int32 array due to user options + * (e.g., %option align), but if the maximum value in that array + * is 80 (for example), then we can serialize it with only 1 byte per int. + * This is NOT the same as compressed DFA tables. We're just trying + * to save storage space here. + * + * @param tbl the table to be compressed + */ +void yytbl_data_compress (struct yytbl_data *tbl) +{ + flex_int32_t i, newsz, total_len; + struct yytbl_data newtbl; + + yytbl_data_init (&newtbl, tbl->td_id); + newtbl.td_hilen = tbl->td_hilen; + newtbl.td_lolen = tbl->td_lolen; + newtbl.td_flags = tbl->td_flags; + + newsz = min_int_size (tbl); + + + if (newsz == (int) YYTDFLAGS2BYTES (tbl->td_flags)) + /* No change in this table needed. */ + return; + + if (newsz > (int) YYTDFLAGS2BYTES (tbl->td_flags)) { + flex_die (_("detected negative compression")); + return; + } + + total_len = yytbl_calc_total_len (tbl); + newtbl.td_data = calloc (total_len, newsz); + newtbl.td_flags = + TFLAGS_CLRDATA (newtbl.td_flags) | BYTES2TFLAG (newsz); + + for (i = 0; i < total_len; i++) { + flex_int32_t g; + + g = yytbl_data_geti (tbl, i); + yytbl_data_seti (&newtbl, i, g); + } + + + /* Now copy over the old table */ + free (tbl->td_data); + *tbl = newtbl; +} + +/* vim:set noexpandtab cindent tabstop=8 softtabstop=0 shiftwidth=8 textwidth=0: */ diff --git a/tables.h b/tables.h new file mode 100644 index 000000000000..2e4afe5505c7 --- /dev/null +++ b/tables.h @@ -0,0 +1,85 @@ +/* tables.h - tables serialization code + * + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Vern Paxson. + * + * The United States Government has rights in this work pursuant + * to contract no. DE-AC03-76SF00098 between the United States + * Department of Energy and the University of California. + * + * This file is part of flex. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + +#ifndef TABLES_H +#define TABLES_H + +#ifdef __cplusplus +/* *INDENT-OFF* */ +extern "C" { +/* *INDENT-ON* */ +#endif + +/* Tables serialization API declarations. */ +#include "tables_shared.h" +struct yytbl_writer { + FILE *out; + flex_uint32_t total_written; + /**< bytes written so far */ + fpos_t th_ssize_pos; + /**< position of th_ssize */ +}; + +/* These are used by main.c, gen.c, etc. + * tablesext - if true, create external tables + * tablesfilename - filename for external tables + * tablesname - name that goes in serialized data, e.g., "yytables" + * tableswr - writer for external tables + * tablesverify - true if tables-verify option specified + * gentables - true if we should spit out the normal C tables + */ +extern bool tablesext, tablesverify,gentables; +extern char *tablesfilename, *tablesname; +extern struct yytbl_writer tableswr; + +int yytbl_writer_init (struct yytbl_writer *, FILE *); +int yytbl_hdr_init (struct yytbl_hdr *th, const char *version_str, + const char *name); +int yytbl_data_init (struct yytbl_data *tbl, enum yytbl_id id); +int yytbl_data_destroy (struct yytbl_data *td); +int yytbl_hdr_fwrite (struct yytbl_writer *wr, + const struct yytbl_hdr *th); +int yytbl_data_fwrite (struct yytbl_writer *wr, struct yytbl_data *td); +void yytbl_data_compress (struct yytbl_data *tbl); +struct yytbl_data *mkftbl (void); + + +#ifdef __cplusplus +/* *INDENT-OFF* */ +} +/* *INDENT-ON* */ +#endif +#endif + +/* vim:set expandtab cindent tabstop=4 softtabstop=4 shiftwidth=4 textwidth=0: */ diff --git a/tables_shared.c b/tables_shared.c new file mode 100644 index 000000000000..b962666c8c8c --- /dev/null +++ b/tables_shared.c @@ -0,0 +1,70 @@ +#ifdef FLEX_SCANNER +/* +dnl tables_shared.c - tables serialization code +dnl +dnl Copyright (c) 1990 The Regents of the University of California. +dnl All rights reserved. +dnl +dnl This code is derived from software contributed to Berkeley by +dnl Vern Paxson. +dnl +dnl The United States Government has rights in this work pursuant +dnl to contract no. DE-AC03-76SF00098 between the United States +dnl Department of Energy and the University of California. +dnl +dnl This file is part of flex. +dnl +dnl Redistribution and use in source and binary forms, with or without +dnl modification, are permitted provided that the following conditions +dnl are met: +dnl +dnl 1. Redistributions of source code must retain the above copyright +dnl notice, this list of conditions and the following disclaimer. +dnl 2. Redistributions in binary form must reproduce the above copyright +dnl notice, this list of conditions and the following disclaimer in the +dnl documentation and/or other materials provided with the distribution. +dnl +dnl Neither the name of the University nor the names of its contributors +dnl may be used to endorse or promote products derived from this software +dnl without specific prior written permission. +dnl +dnl THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +dnl IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +dnl WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +dnl PURPOSE. +dnl +*/ + +/* This file is meant to be included in both the skeleton and the actual + * flex code (hence the name "_shared"). + */ +#ifndef yyskel_static +#define yyskel_static static +#endif +#else +#include "flexdef.h" +#include "tables.h" +#ifndef yyskel_static +#define yyskel_static +#endif +#endif + + +/** Get the number of integers in this table. This is NOT the + * same thing as the number of elements. + * @param td the table + * @return the number of integers in the table + */ +yyskel_static flex_int32_t yytbl_calc_total_len (const struct yytbl_data *tbl) +{ + flex_int32_t n; + + /* total number of ints */ + n = tbl->td_lolen; + if (tbl->td_hilen > 0) + n *= tbl->td_hilen; + + if (tbl->td_id == YYTD_ID_TRANSITION) + n *= 2; + return n; +} diff --git a/tables_shared.h b/tables_shared.h new file mode 100644 index 000000000000..bbf9910a96aa --- /dev/null +++ b/tables_shared.h @@ -0,0 +1,144 @@ +#ifdef FLEX_SCANNER +/* +dnl tables_shared.h - tables serialization header +dnl +dnl Copyright (c) 1990 The Regents of the University of California. +dnl All rights reserved. +dnl +dnl This code is derived from software contributed to Berkeley by +dnl Vern Paxson. +dnl +dnl The United States Government has rights in this work pursuant +dnl to contract no. DE-AC03-76SF00098 between the United States +dnl Department of Energy and the University of California. +dnl +dnl This file is part of flex. +dnl +dnl Redistribution and use in source and binary forms, with or without +dnl modification, are permitted provided that the following conditions +dnl are met: +dnl +dnl 1. Redistributions of source code must retain the above copyright +dnl notice, this list of conditions and the following disclaimer. +dnl 2. Redistributions in binary form must reproduce the above copyright +dnl notice, this list of conditions and the following disclaimer in the +dnl documentation and/or other materials provided with the distribution. +dnl +dnl Neither the name of the University nor the names of its contributors +dnl may be used to endorse or promote products derived from this software +dnl without specific prior written permission. +dnl +dnl THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +dnl IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +dnl WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +dnl PURPOSE. + +dnl +dnl This file is meant to be included in both the skeleton and the actual +dnl flex code (hence the name "_shared"). +*/ +#ifndef yyskel_static +#define yyskel_static static +#endif +#else +#ifndef yyskel_static +#define yyskel_static +#endif +#endif + +/* Structures and prototypes for serializing flex tables. The + * binary format is documented in the manual. + * + * Design considerations: + * + * - The format allows many tables per file. + * - The tables can be streamed. + * - All data is stored in network byte order. + * - We do not hinder future unicode support. + * - We can lookup tables by name. + */ + +/** Magic number for serialized format. */ +#ifndef YYTBL_MAGIC +#define YYTBL_MAGIC 0xF13C57B1 +#endif + +/** Calculate (0-7) = number bytes needed to pad n to next 64-bit boundary. */ +#ifndef yypad64 +#define yypad64(n) ((8-((n)%8))%8) +#endif + + +#ifndef YYTABLES_TYPES +#define YYTABLES_TYPES +/** Possible values for td_id field. Each one corresponds to a + * scanner table of the same name. + */ +enum yytbl_id { + YYTD_ID_ACCEPT = 0x01, /**< 1-dim ints */ + YYTD_ID_BASE = 0x02, /**< 1-dim ints */ + YYTD_ID_CHK = 0x03, /**< 1-dim ints */ + YYTD_ID_DEF = 0x04, /**< 1-dim ints */ + YYTD_ID_EC = 0x05, /**< 1-dim ints */ + YYTD_ID_META = 0x06, /**< 1-dim ints */ + YYTD_ID_NUL_TRANS = 0x07, /**< 1-dim ints, maybe indices */ + YYTD_ID_NXT = 0x08, /**< may be 2 dimensional ints */ + YYTD_ID_RULE_CAN_MATCH_EOL = 0x09, /**< 1-dim ints */ + YYTD_ID_START_STATE_LIST = 0x0A, /**< 1-dim indices into trans tbl */ + YYTD_ID_TRANSITION = 0x0B, /**< structs */ + YYTD_ID_ACCLIST = 0x0C /**< 1-dim ints */ +}; + +/** bit flags for t_flags field of struct yytbl_data */ +enum yytbl_flags { + /* These first three are mutually exclusive */ + YYTD_DATA8 = 0x01, /**< data is an array of type flex_int8_t */ + YYTD_DATA16 = 0x02, /**< data is an array of type flex_int16_t */ + YYTD_DATA32 = 0x04, /**< data is an array of type flex_int32_t */ + + /* These two are mutually exclusive. */ + YYTD_PTRANS = 0x08, /**< data is a list of indexes of entries + into the expanded `yy_transition' + array. See notes in manual. */ + YYTD_STRUCT = 0x10 /**< data consists of yy_trans_info structs */ +}; + +/* The serialized tables header. */ +struct yytbl_hdr { + flex_uint32_t th_magic; /**< Must be 0xF13C57B1 (comes from "Flex Table") */ + flex_uint32_t th_hsize; /**< Size of this header in bytes. */ + flex_uint32_t th_ssize; /**< Size of this dataset, in bytes, including header. */ + flex_uint16_t th_flags; /**< Currently unused, must be 0 */ + char *th_version; /**< Flex version string. NUL terminated. */ + char *th_name; /**< The name of this table set. NUL terminated. */ +}; + +/** A single serialized table */ +struct yytbl_data { + flex_uint16_t td_id; /**< enum yytbl_id table identifier */ + flex_uint16_t td_flags; /**< how to interpret this data */ + flex_uint32_t td_hilen; /**< num elements in highest dimension array */ + flex_uint32_t td_lolen; /**< num elements in lowest dimension array */ + void *td_data; /**< table data */ +}; +#endif + +/** Extract corresponding data size_t from td_flags */ +#ifndef YYTDFLAGS2BYTES +#define YYTDFLAGS2BYTES(td_flags)\ + (((td_flags) & YYTD_DATA8)\ + ? sizeof(flex_int8_t)\ + :(((td_flags) & YYTD_DATA16)\ + ? sizeof(flex_int16_t)\ + :sizeof(flex_int32_t))) +#endif + +#ifdef FLEX_SCANNER +%not-for-header +#endif +yyskel_static flex_int32_t yytbl_calc_total_len (const struct yytbl_data *tbl); +#ifdef FLEX_SCANNER +%ok-for-header +#endif + +/* vim:set noexpandtab cindent tabstop=8 softtabstop=0 shiftwidth=8 textwidth=0: */ diff --git a/usr.bin/lex/tblcmp.c b/tblcmp.c index 41c88096bf6f..a56aaabce179 100644 --- a/usr.bin/lex/tblcmp.c +++ b/tblcmp.c @@ -1,43 +1,46 @@ /* tblcmp - table compression routines */ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ -/* $Header: /home/daffy/u0/vern/flex/RCS/tblcmp.c,v 2.11 94/11/05 17:08:28 vern Exp $ */ +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ #include "flexdef.h" /* declarations for functions that have forward references */ -void mkentry PROTO((register int*, int, int, int, int)); -void mkprot PROTO((int[], int, int)); -void mktemplate PROTO((int[], int, int)); -void mv2front PROTO((int)); -int tbldiff PROTO((int[], int, int[])); +void mkentry PROTO ((register int *, int, int, int, int)); +void mkprot PROTO ((int[], int, int)); +void mktemplate PROTO ((int[], int, int)); +void mv2front PROTO ((int)); +int tbldiff PROTO ((int[], int, int[])); /* bldtbl - build table entries for dfa state @@ -75,11 +78,11 @@ int tbldiff PROTO((int[], int, int[])); * cost only one difference. */ -void bldtbl( state, statenum, totaltrans, comstate, comfreq ) -int state[], statenum, totaltrans, comstate, comfreq; - { - int extptr, extrct[2][CSIZE + 1]; - int mindiff, minprot, i, d; +void bldtbl (state, statenum, totaltrans, comstate, comfreq) + int state[], statenum, totaltrans, comstate, comfreq; +{ + int extptr, extrct[2][CSIZE + 1]; + int mindiff, minprot, i, d; /* If extptr is 0 then the first array of extrct holds the result * of the "best difference" to date, which is those transitions @@ -97,35 +100,32 @@ int state[], statenum, totaltrans, comstate, comfreq; * compact its tables. */ - if ( (totaltrans * 100) < (numecs * PROTO_SIZE_PERCENTAGE) ) - mkentry( state, numecs, statenum, JAMSTATE, totaltrans ); + if ((totaltrans * 100) < (numecs * PROTO_SIZE_PERCENTAGE)) + mkentry (state, numecs, statenum, JAMSTATE, totaltrans); - else - { + else { /* "checkcom" is true if we should only check "state" against * protos which have the same "comstate" value. */ - int checkcom = + int checkcom = + comfreq * 100 > totaltrans * CHECK_COM_PERCENTAGE; minprot = firstprot; mindiff = totaltrans; - if ( checkcom ) - { + if (checkcom) { /* Find first proto which has the same "comstate". */ - for ( i = firstprot; i != NIL; i = protnext[i] ) - if ( protcomst[i] == comstate ) - { + for (i = firstprot; i != NIL; i = protnext[i]) + if (protcomst[i] == comstate) { minprot = i; - mindiff = tbldiff( state, minprot, - extrct[extptr] ); + mindiff = tbldiff (state, minprot, + extrct[extptr]); break; - } - } + } + } - else - { + else { /* Since we've decided that the most common destination * out of "state" does not occur with a high enough * frequency, we set the "comstate" to zero, assuring @@ -134,13 +134,12 @@ int state[], statenum, totaltrans, comstate, comfreq; */ comstate = 0; - if ( firstprot != NIL ) - { + if (firstprot != NIL) { minprot = firstprot; - mindiff = tbldiff( state, minprot, - extrct[extptr] ); - } + mindiff = tbldiff (state, minprot, + extrct[extptr]); } + } /* We now have the first interesting proto in "minprot". If * it matches within the tolerances set for the first proto, @@ -148,58 +147,55 @@ int state[], statenum, totaltrans, comstate, comfreq; * to see if we have any other reasonable matches. */ - if ( mindiff * 100 > totaltrans * FIRST_MATCH_DIFF_PERCENTAGE ) - { + if (mindiff * 100 > + totaltrans * FIRST_MATCH_DIFF_PERCENTAGE) { /* Not a good enough match. Scan the rest of the * protos. */ - for ( i = minprot; i != NIL; i = protnext[i] ) - { - d = tbldiff( state, i, extrct[1 - extptr] ); - if ( d < mindiff ) - { + for (i = minprot; i != NIL; i = protnext[i]) { + d = tbldiff (state, i, extrct[1 - extptr]); + if (d < mindiff) { extptr = 1 - extptr; mindiff = d; minprot = i; - } } } + } /* Check if the proto we've decided on as our best bet is close * enough to the state we want to match to be usable. */ - if ( mindiff * 100 > totaltrans * ACCEPTABLE_DIFF_PERCENTAGE ) - { + if (mindiff * 100 > + totaltrans * ACCEPTABLE_DIFF_PERCENTAGE) { /* No good. If the state is homogeneous enough, * we make a template out of it. Otherwise, we * make a proto. */ - if ( comfreq * 100 >= - totaltrans * TEMPLATE_SAME_PERCENTAGE ) - mktemplate( state, statenum, comstate ); + if (comfreq * 100 >= + totaltrans * TEMPLATE_SAME_PERCENTAGE) + mktemplate (state, statenum, + comstate); - else - { - mkprot( state, statenum, comstate ); - mkentry( state, numecs, statenum, - JAMSTATE, totaltrans ); - } + else { + mkprot (state, statenum, comstate); + mkentry (state, numecs, statenum, + JAMSTATE, totaltrans); } + } - else - { /* use the proto */ - mkentry( extrct[extptr], numecs, statenum, - prottbl[minprot], mindiff ); + else { /* use the proto */ + mkentry (extrct[extptr], numecs, statenum, + prottbl[minprot], mindiff); /* If this state was sufficiently different from the * proto we built it from, make it, too, a proto. */ - if ( mindiff * 100 >= - totaltrans * NEW_PROTO_DIFF_PERCENTAGE ) - mkprot( state, statenum, comstate ); + if (mindiff * 100 >= + totaltrans * NEW_PROTO_DIFF_PERCENTAGE) + mkprot (state, statenum, comstate); /* Since mkprot added a new proto to the proto queue, * it's possible that "minprot" is no longer on the @@ -211,10 +207,10 @@ int state[], statenum, totaltrans, comstate, comfreq; * following call will do nothing. */ - mv2front( minprot ); - } + mv2front (minprot); } } +} /* cmptmps - compress template table entries @@ -225,62 +221,56 @@ int state[], statenum, totaltrans, comstate, comfreq; * classes. */ -void cmptmps() - { - int tmpstorage[CSIZE + 1]; +void cmptmps () +{ + int tmpstorage[CSIZE + 1]; register int *tmp = tmpstorage, i, j; - int totaltrans, trans; + int totaltrans, trans; peakpairs = numtemps * numecs + tblend; - if ( usemecs ) - { + if (usemecs) { /* Create equivalence classes based on data gathered on * template transitions. */ - nummecs = cre8ecs( tecfwd, tecbck, numecs ); - } + nummecs = cre8ecs (tecfwd, tecbck, numecs); + } else nummecs = numecs; - while ( lastdfa + numtemps + 1 >= current_max_dfas ) - increase_max_dfas(); + while (lastdfa + numtemps + 1 >= current_max_dfas) + increase_max_dfas (); /* Loop through each template. */ - for ( i = 1; i <= numtemps; ++i ) - { + for (i = 1; i <= numtemps; ++i) { /* Number of non-jam transitions out of this template. */ totaltrans = 0; - for ( j = 1; j <= numecs; ++j ) - { + for (j = 1; j <= numecs; ++j) { trans = tnxt[numecs * i + j]; - if ( usemecs ) - { + if (usemecs) { /* The absolute value of tecbck is the * meta-equivalence class of a given * equivalence class, as set up by cre8ecs(). */ - if ( tecbck[j] > 0 ) - { + if (tecbck[j] > 0) { tmp[tecbck[j]] = trans; - if ( trans > 0 ) + if (trans > 0) ++totaltrans; - } } + } - else - { + else { tmp[j] = trans; - if ( trans > 0 ) + if (trans > 0) ++totaltrans; - } } + } /* It is assumed (in a rather subtle way) in the skeleton * that if we're using meta-equivalence classes, the def[] @@ -290,28 +280,29 @@ void cmptmps() */ /* Leave room for the jam-state after the last real state. */ - mkentry( tmp, nummecs, lastdfa + i + 1, JAMSTATE, totaltrans ); - } + mkentry (tmp, nummecs, lastdfa + i + 1, JAMSTATE, + totaltrans); } +} /* expand_nxt_chk - expand the next check arrays */ -void expand_nxt_chk() - { +void expand_nxt_chk () +{ register int old_max = current_max_xpairs; current_max_xpairs += MAX_XPAIRS_INCREMENT; ++num_reallocs; - nxt = reallocate_integer_array( nxt, current_max_xpairs ); - chk = reallocate_integer_array( chk, current_max_xpairs ); + nxt = reallocate_integer_array (nxt, current_max_xpairs); + chk = reallocate_integer_array (chk, current_max_xpairs); - zero_out( (char *) (chk + old_max), - (size_t) (MAX_XPAIRS_INCREMENT * sizeof( int )) ); - } + zero_out ((char *) (chk + old_max), + (size_t) (MAX_XPAIRS_INCREMENT * sizeof (int))); +} /* find_table_space - finds a space in the table for a state to be placed @@ -333,9 +324,9 @@ void expand_nxt_chk() * and an action number will be added in [-1]. */ -int find_table_space( state, numtrans ) -int *state, numtrans; - { +int find_table_space (state, numtrans) + int *state, numtrans; +{ /* Firstfree is the position of the first possible occurrence of two * consecutive unused records in the chk and nxt arrays. */ @@ -346,19 +337,18 @@ int *state, numtrans; /* If there are too many out-transitions, put the state at the end of * nxt and chk. */ - if ( numtrans > MAX_XTIONS_FULL_INTERIOR_FIT ) - { + if (numtrans > MAX_XTIONS_FULL_INTERIOR_FIT) { /* If table is empty, return the first available spot in * chk/nxt, which should be 1. */ - if ( tblend < 2 ) + if (tblend < 2) return 1; /* Start searching for table space near the end of * chk/nxt arrays. */ i = tblend - numecs; - } + } else /* Start searching for table space from the beginning @@ -367,21 +357,18 @@ int *state, numtrans; */ i = firstfree; - while ( 1 ) /* loops until a space is found */ - { - while ( i + numecs >= current_max_xpairs ) - expand_nxt_chk(); + while (1) { /* loops until a space is found */ + while (i + numecs >= current_max_xpairs) + expand_nxt_chk (); /* Loops until space for end-of-buffer and action number * are found. */ - while ( 1 ) - { + while (1) { /* Check for action number space. */ - if ( chk[i - 1] == 0 ) - { + if (chk[i - 1] == 0) { /* Check for end-of-buffer space. */ - if ( chk[i] == 0 ) + if (chk[i] == 0) break; else @@ -391,19 +378,19 @@ int *state, numtrans; * so we skip a space. */ i += 2; - } + } else ++i; - while ( i + numecs >= current_max_xpairs ) - expand_nxt_chk(); - } + while (i + numecs >= current_max_xpairs) + expand_nxt_chk (); + } /* If we started search from the beginning, store the new * firstfree for the next call of find_table_space(). */ - if ( numtrans <= MAX_XTIONS_FULL_INTERIOR_FIT ) + if (numtrans <= MAX_XTIONS_FULL_INTERIOR_FIT) firstfree = i + 1; /* Check to see if all elements in chk (and therefore nxt) @@ -413,18 +400,18 @@ int *state, numtrans; state_ptr = &state[1]; ptr_to_last_entry_in_state = &chk[i + numecs + 1]; - for ( chk_ptr = &chk[i + 1]; - chk_ptr != ptr_to_last_entry_in_state; ++chk_ptr ) - if ( *(state_ptr++) != 0 && *chk_ptr != 0 ) + for (chk_ptr = &chk[i + 1]; + chk_ptr != ptr_to_last_entry_in_state; ++chk_ptr) + if (*(state_ptr++) != 0 && *chk_ptr != 0) break; - if ( chk_ptr == ptr_to_last_entry_in_state ) + if (chk_ptr == ptr_to_last_entry_in_state) return i; else - ++i; - } + ++i; } +} /* inittbl - initialize transition tables @@ -432,18 +419,19 @@ int *state, numtrans; * Initializes "firstfree" to be one beyond the end of the table. Initializes * all "chk" entries to be zero. */ -void inittbl() - { +void inittbl () +{ register int i; - zero_out( (char *) chk, (size_t) (current_max_xpairs * sizeof( int )) ); + zero_out ((char *) chk, + + (size_t) (current_max_xpairs * sizeof (int))); tblend = 0; firstfree = tblend + 1; numtemps = 0; - if ( usemecs ) - { + if (usemecs) { /* Set up doubly-linked meta-equivalence classes; these * are sets of equivalence classes which all have identical * transitions out of TEMPLATES. @@ -451,39 +439,37 @@ void inittbl() tecbck[1] = NIL; - for ( i = 2; i <= numecs; ++i ) - { + for (i = 2; i <= numecs; ++i) { tecbck[i] = i - 1; tecfwd[i - 1] = i; - } + } tecfwd[numecs] = NIL; - } } +} /* mkdeftbl - make the default, "jam" table entries */ -void mkdeftbl() - { - int i; +void mkdeftbl () +{ + int i; jamstate = lastdfa + 1; - ++tblend; /* room for transition on end-of-buffer character */ + ++tblend; /* room for transition on end-of-buffer character */ - while ( tblend + numecs >= current_max_xpairs ) - expand_nxt_chk(); + while (tblend + numecs >= current_max_xpairs) + expand_nxt_chk (); /* Add in default end-of-buffer transition. */ nxt[tblend] = end_of_buffer_state; chk[tblend] = jamstate; - for ( i = 1; i <= numecs; ++i ) - { + for (i = 1; i <= numecs; ++i) { nxt[tblend + i] = 0; chk[tblend + i] = jamstate; - } + } jambase = tblend; @@ -492,7 +478,7 @@ void mkdeftbl() tblend += numecs; ++numtemps; - } +} /* mkentry - create base/def and nxt/chk entries for transition array @@ -514,46 +500,42 @@ void mkdeftbl() * state array. */ -void mkentry( state, numchars, statenum, deflink, totaltrans ) -register int *state; -int numchars, statenum, deflink, totaltrans; - { +void mkentry (state, numchars, statenum, deflink, totaltrans) + register int *state; + int numchars, statenum, deflink, totaltrans; +{ register int minec, maxec, i, baseaddr; - int tblbase, tbllast; + int tblbase, tbllast; - if ( totaltrans == 0 ) - { /* there are no out-transitions */ - if ( deflink == JAMSTATE ) + if (totaltrans == 0) { /* there are no out-transitions */ + if (deflink == JAMSTATE) base[statenum] = JAMSTATE; else base[statenum] = 0; def[statenum] = deflink; return; - } + } - for ( minec = 1; minec <= numchars; ++minec ) - { - if ( state[minec] != SAME_TRANS ) - if ( state[minec] != 0 || deflink != JAMSTATE ) + for (minec = 1; minec <= numchars; ++minec) { + if (state[minec] != SAME_TRANS) + if (state[minec] != 0 || deflink != JAMSTATE) break; - } + } - if ( totaltrans == 1 ) - { + if (totaltrans == 1) { /* There's only one out-transition. Save it for later to fill * in holes in the tables. */ - stack1( statenum, minec, state[minec], deflink ); + stack1 (statenum, minec, state[minec], deflink); return; - } + } - for ( maxec = numchars; maxec > 0; --maxec ) - { - if ( state[maxec] != SAME_TRANS ) - if ( state[maxec] != 0 || deflink != JAMSTATE ) + for (maxec = numchars; maxec > 0; --maxec) { + if (state[maxec] != SAME_TRANS) + if (state[maxec] != 0 || deflink != JAMSTATE) break; - } + } /* Whether we try to fit the state table in the middle of the table * entries we have already generated, or if we just take the state @@ -565,131 +547,121 @@ int numchars, statenum, deflink, totaltrans; */ /* Find the first transition of state that we need to worry about. */ - if ( totaltrans * 100 <= numchars * INTERIOR_FIT_PERCENTAGE ) - { + if (totaltrans * 100 <= numchars * INTERIOR_FIT_PERCENTAGE) { /* Attempt to squeeze it into the middle of the tables. */ baseaddr = firstfree; - while ( baseaddr < minec ) - { + while (baseaddr < minec) { /* Using baseaddr would result in a negative base * address below; find the next free slot. */ - for ( ++baseaddr; chk[baseaddr] != 0; ++baseaddr ) - ; - } + for (++baseaddr; chk[baseaddr] != 0; ++baseaddr) ; + } - while ( baseaddr + maxec - minec + 1 >= current_max_xpairs ) - expand_nxt_chk(); + while (baseaddr + maxec - minec + 1 >= current_max_xpairs) + expand_nxt_chk (); - for ( i = minec; i <= maxec; ++i ) - if ( state[i] != SAME_TRANS && - (state[i] != 0 || deflink != JAMSTATE) && - chk[baseaddr + i - minec] != 0 ) - { /* baseaddr unsuitable - find another */ - for ( ++baseaddr; - baseaddr < current_max_xpairs && - chk[baseaddr] != 0; ++baseaddr ) - ; + for (i = minec; i <= maxec; ++i) + if (state[i] != SAME_TRANS && + (state[i] != 0 || deflink != JAMSTATE) && + chk[baseaddr + i - minec] != 0) { /* baseaddr unsuitable - find another */ + for (++baseaddr; + baseaddr < current_max_xpairs && + chk[baseaddr] != 0; ++baseaddr) ; - while ( baseaddr + maxec - minec + 1 >= - current_max_xpairs ) - expand_nxt_chk(); + while (baseaddr + maxec - minec + 1 >= + current_max_xpairs) + expand_nxt_chk (); /* Reset the loop counter so we'll start all * over again next time it's incremented. */ i = minec - 1; - } - } + } + } - else - { + else { /* Ensure that the base address we eventually generate is * non-negative. */ - baseaddr = MAX( tblend + 1, minec ); - } + baseaddr = MAX (tblend + 1, minec); + } tblbase = baseaddr - minec; tbllast = tblbase + maxec; - while ( tbllast + 1 >= current_max_xpairs ) - expand_nxt_chk(); + while (tbllast + 1 >= current_max_xpairs) + expand_nxt_chk (); base[statenum] = tblbase; def[statenum] = deflink; - for ( i = minec; i <= maxec; ++i ) - if ( state[i] != SAME_TRANS ) - if ( state[i] != 0 || deflink != JAMSTATE ) - { + for (i = minec; i <= maxec; ++i) + if (state[i] != SAME_TRANS) + if (state[i] != 0 || deflink != JAMSTATE) { nxt[tblbase + i] = state[i]; chk[tblbase + i] = statenum; - } + } - if ( baseaddr == firstfree ) + if (baseaddr == firstfree) /* Find next free slot in tables. */ - for ( ++firstfree; chk[firstfree] != 0; ++firstfree ) - ; + for (++firstfree; chk[firstfree] != 0; ++firstfree) ; - tblend = MAX( tblend, tbllast ); - } + tblend = MAX (tblend, tbllast); +} /* mk1tbl - create table entries for a state (or state fragment) which * has only one out-transition */ -void mk1tbl( state, sym, onenxt, onedef ) -int state, sym, onenxt, onedef; - { - if ( firstfree < sym ) +void mk1tbl (state, sym, onenxt, onedef) + int state, sym, onenxt, onedef; +{ + if (firstfree < sym) firstfree = sym; - while ( chk[firstfree] != 0 ) - if ( ++firstfree >= current_max_xpairs ) - expand_nxt_chk(); + while (chk[firstfree] != 0) + if (++firstfree >= current_max_xpairs) + expand_nxt_chk (); base[state] = firstfree - sym; def[state] = onedef; chk[firstfree] = state; nxt[firstfree] = onenxt; - if ( firstfree > tblend ) - { + if (firstfree > tblend) { tblend = firstfree++; - if ( firstfree >= current_max_xpairs ) - expand_nxt_chk(); - } + if (firstfree >= current_max_xpairs) + expand_nxt_chk (); } +} /* mkprot - create new proto entry */ -void mkprot( state, statenum, comstate ) -int state[], statenum, comstate; - { - int i, slot, tblbase; +void mkprot (state, statenum, comstate) + int state[], statenum, comstate; +{ + int i, slot, tblbase; - if ( ++numprots >= MSP || numecs * numprots >= PROT_SAVE_SIZE ) - { + if (++numprots >= MSP || numecs * numprots >= PROT_SAVE_SIZE) { /* Gotta make room for the new proto by dropping last entry in * the queue. */ slot = lastprot; lastprot = protprev[lastprot]; protnext[lastprot] = NIL; - } + } else slot = numprots; protnext[slot] = firstprot; - if ( firstprot != NIL ) + if (firstprot != NIL) protprev[firstprot] = slot; firstprot = slot; @@ -699,21 +671,21 @@ int state[], statenum, comstate; /* Copy state into save area so it can be compared with rapidly. */ tblbase = numecs * (slot - 1); - for ( i = 1; i <= numecs; ++i ) + for (i = 1; i <= numecs; ++i) protsave[tblbase + i] = state[i]; - } +} /* mktemplate - create a template entry based on a state, and connect the state * to it */ -void mktemplate( state, statenum, comstate ) -int state[], statenum, comstate; - { - int i, numdiff, tmpbase, tmp[CSIZE + 1]; - Char transset[CSIZE + 1]; - int tsptr; +void mktemplate (state, statenum, comstate) + int state[], statenum, comstate; +{ + int i, numdiff, tmpbase, tmp[CSIZE + 1]; + Char transset[CSIZE + 1]; + int tsptr; ++numtemps; @@ -726,60 +698,58 @@ int state[], statenum, comstate; tmpbase = numtemps * numecs; - if ( tmpbase + numecs >= current_max_template_xpairs ) - { - current_max_template_xpairs += MAX_TEMPLATE_XPAIRS_INCREMENT; + if (tmpbase + numecs >= current_max_template_xpairs) { + current_max_template_xpairs += + MAX_TEMPLATE_XPAIRS_INCREMENT; ++num_reallocs; - tnxt = reallocate_integer_array( tnxt, - current_max_template_xpairs ); - } + tnxt = reallocate_integer_array (tnxt, + current_max_template_xpairs); + } - for ( i = 1; i <= numecs; ++i ) - if ( state[i] == 0 ) + for (i = 1; i <= numecs; ++i) + if (state[i] == 0) tnxt[tmpbase + i] = 0; - else - { + else { transset[tsptr++] = i; tnxt[tmpbase + i] = comstate; - } + } - if ( usemecs ) - mkeccl( transset, tsptr, tecfwd, tecbck, numecs, 0 ); + if (usemecs) + mkeccl (transset, tsptr, tecfwd, tecbck, numecs, 0); - mkprot( tnxt + tmpbase, -numtemps, comstate ); + mkprot (tnxt + tmpbase, -numtemps, comstate); /* We rely on the fact that mkprot adds things to the beginning * of the proto queue. */ - numdiff = tbldiff( state, firstprot, tmp ); - mkentry( tmp, numecs, statenum, -numtemps, numdiff ); - } + numdiff = tbldiff (state, firstprot, tmp); + mkentry (tmp, numecs, statenum, -numtemps, numdiff); +} /* mv2front - move proto queue element to front of queue */ -void mv2front( qelm ) -int qelm; - { - if ( firstprot != qelm ) - { - if ( qelm == lastprot ) +void mv2front (qelm) + int qelm; +{ + if (firstprot != qelm) { + if (qelm == lastprot) lastprot = protprev[lastprot]; protnext[protprev[qelm]] = protnext[qelm]; - if ( protnext[qelm] != NIL ) + if (protnext[qelm] != NIL) protprev[protnext[qelm]] = protprev[qelm]; protprev[qelm] = NIL; protnext[qelm] = firstprot; protprev[firstprot] = qelm; firstprot = qelm; - } } +} /* place_state - place a state into full speed transition table @@ -789,12 +759,12 @@ int qelm; * Transnum is the number of out-transitions for the state. */ -void place_state( state, statenum, transnum ) -int *state, statenum, transnum; - { +void place_state (state, statenum, transnum) + int *state, statenum, transnum; +{ register int i; register int *state_ptr; - int position = find_table_space( state, transnum ); + int position = find_table_space (state, transnum); /* "base" is the table of start positions. */ base[statenum] = position; @@ -814,16 +784,15 @@ int *state, statenum, transnum; /* Place the state into chk and nxt. */ state_ptr = &state[1]; - for ( i = 1; i <= numecs; ++i, ++state_ptr ) - if ( *state_ptr != 0 ) - { + for (i = 1; i <= numecs; ++i, ++state_ptr) + if (*state_ptr != 0) { chk[position + i] = i; nxt[position + i] = *state_ptr; - } + } - if ( position + numecs > tblend ) + if (position + numecs > tblend) tblend = position + numecs; - } +} /* stack1 - save states with only one out-transition to be processed later @@ -833,21 +802,20 @@ int *state, statenum, transnum; * no room, we process the sucker right now. */ -void stack1( statenum, sym, nextstate, deflink ) -int statenum, sym, nextstate, deflink; - { - if ( onesp >= ONE_STACK_SIZE - 1 ) - mk1tbl( statenum, sym, nextstate, deflink ); +void stack1 (statenum, sym, nextstate, deflink) + int statenum, sym, nextstate, deflink; +{ + if (onesp >= ONE_STACK_SIZE - 1) + mk1tbl (statenum, sym, nextstate, deflink); - else - { + else { ++onesp; onestate[onesp] = statenum; onesym[onesp] = sym; onenext[onesp] = nextstate; onedef[onesp] = deflink; - } } +} /* tbldiff - compute differences between two state tables @@ -864,24 +832,22 @@ int statenum, sym, nextstate, deflink; * number is "numecs" minus the number of "SAME_TRANS" entries in "ext". */ -int tbldiff( state, pr, ext ) -int state[], pr, ext[]; - { +int tbldiff (state, pr, ext) + int state[], pr, ext[]; +{ register int i, *sp = state, *ep = ext, *protp; register int numdiff = 0; protp = &protsave[numecs * (pr - 1)]; - for ( i = numecs; i > 0; --i ) - { - if ( *++protp == *++sp ) + for (i = numecs; i > 0; --i) { + if (*++protp == *++sp) *++ep = SAME_TRANS; - else - { + else { *++ep = *sp; ++numdiff; - } } + } return numdiff; - } +} diff --git a/usr.bin/lex/COPYING b/usr.bin/lex/COPYING deleted file mode 100644 index dcb775e7c606..000000000000 --- a/usr.bin/lex/COPYING +++ /dev/null @@ -1,38 +0,0 @@ -Flex carries the copyright used for BSD software, slightly modified -because it originated at the Lawrence Berkeley (not Livermore!) Laboratory, -which operates under a contract with the Department of Energy: - - Copyright (c) 1990 The Regents of the University of California. - All rights reserved. - - This code is derived from software contributed to Berkeley by - Vern Paxson. - - The United States Government has rights in this work pursuant - to contract no. DE-AC03-76SF00098 between the United States - Department of Energy and the University of California. - - Redistribution and use in source and binary forms are permitted - provided that: (1) source distributions retain this entire - copyright notice and comment, and (2) distributions including - binaries display the following acknowledgement: ``This product - includes software developed by the University of California, - Berkeley and its contributors'' in the documentation or other - materials provided with the distribution and in all advertising - materials mentioning features or use of this software. Neither the - name of the University nor the names of its contributors may be - used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE. - -This basically says "do whatever you please with this software except -remove this notice or take advantage of the University's (or the flex -authors') name". - -Note that the "flex.skl" scanner skeleton carries no copyright notice. -You are free to do whatever you please with scanners generated using flex; -for them, you are not even bound by the above copyright. diff --git a/usr.bin/lex/Makefile b/usr.bin/lex/Makefile deleted file mode 100644 index 7f88e6eea4de..000000000000 --- a/usr.bin/lex/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# $Id$ -# -# By default, flex will be configured to generate 8-bit scanners only if the -# -8 flag is given. If you want it to always generate 8-bit scanners, add -# "-DDEFAULT_CSIZE=256" to CFLAGS. Note that doing so will double the size -# of all uncompressed scanners. -# -# Bootstrapping of lex is handled automatically. -# ALso note that flex.skel no longer gets installed. -# -# XXX Todo: -# Install as lex++, and install FlexLexer.h - -PROG= lex -LINKS= ${BINDIR}/lex ${BINDIR}/flex -#LINKS+= ${BINDIR}/lex ${BINDIR}/lex++ ${BINDIR}/flex ${BINDIR}/flex++ - -SRCS= ccl.c dfa.c ecs.c gen.c main.c misc.c nfa.c parse.y \ - skel.c sym.c tblcmp.c yylex.c -OBJS+= scan.o -LFLAGS+= -is -CFLAGS+= -I. -I${.CURDIR} -MAN1= flex.1 flexdoc.1 -MLINKS= flex.1 lex.1 flexdoc.1 lexdoc.1 - -CLEANFILES+= parse.c parse.h scan.c y.tab.h - - -SUBDIR= lib - -.depend: parse.h - -parse.c parse.h: parse.y - $(YACC) -d $(.CURDIR)/parse.y - mv y.tab.c parse.c - mv y.tab.h parse.h - -.if exists(/usr/bin/lex) -scan.o: parse.c -.else -# We must bootstrap -scan.o: scan.c parse.h - -scan.c: - @echo "Bootstrapping flex" - @rm -f scan.c - @cp -pf ${.CURDIR}/initscan.c scan.c -.endif - -test: check -check: $(PROG) - ./$(PROG) $(LFLAGS) -t $(COMPRESSION) $(.CURDIR)/scan.l \ - | sed s,\"$(.CURDIR)/scan.l",\"scan.l", \ - | diff $(.CURDIR)/initscan.c - - @echo "Check successful" - -.include <bsd.prog.mk> diff --git a/usr.bin/lex/README b/usr.bin/lex/README deleted file mode 100644 index 7a4224dca3b7..000000000000 --- a/usr.bin/lex/README +++ /dev/null @@ -1,60 +0,0 @@ -This is release 2.5 of flex. See "version.h" for the exact patch-level. - -See the file "NEWS" to find out what is new in this Flex release. - -Read the file "INSTALL" for general installation directives. Peek near -the beginning of the file "Makefile.in" for special DEFS values. On most -systems, you can just run the "configure" script and type "make" to build -flex; then "make check" to test whether it built correctly; and if it did, -then "make install" to install it. - -If you're feeling adventurous, you can also issue "make bigcheck" (be -prepared to wait a while). - -Note that flex is distributed under a copyright very similar to that of -BSD Unix, and not under the GNU General Public License (GPL), except for -the "configure" script, which is covered by the GPL. - -Many thanks to the 2.5 beta-testers for finding bugs and helping test and -increase portability: Stan Adermann, Scott David Daniels, Charles Elliott, -Joe Gayda, Chris Meier, James Nordby, Terrence O'Kane, Karsten Pahnke, -Francois Pinard, Pat Rankin, Andreas Scherer, Marc Wiese, Nathan Zelle. - -Please send bug reports and feedback to: Vern Paxson (vern@ee.lbl.gov). - - -The flex distribution consists of the following files: - - README This message - - NEWS Differences between the various releases - - INSTALL General installation information - - COPYING flex's copyright - - conf.in, configure.in, configure, Makefile.in, install.sh, - mkinstalldirs - elements of the "autoconf" auto-configuration process - - flexdef.h, parse.y, scan.l, ccl.c, dfa.c, ecs.c, gen.c, main.c, - misc.c, nfa.c, sym.c, tblcmp.c, yylex.c - source files - - version.h version of this flex release - - flex.skl flex scanner skeleton - mkskel.sh script for converting flex.skl to C source file skel.c - skel.c pre-converted C version of flex.skl - - libmain.c flex library (-lfl) sources - libyywrap.c - - initscan.c pre-flex'd version of scan.l - - FlexLexer.h header file for C++ lexer class - - flex.1 user documentation - - MISC/ a directory containing miscellaneous contributions. - See MISC/README for details. diff --git a/usr.bin/lex/ccl.c b/usr.bin/lex/ccl.c deleted file mode 100644 index fe28463923e0..000000000000 --- a/usr.bin/lex/ccl.c +++ /dev/null @@ -1,149 +0,0 @@ -/* ccl - routines for character classes */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* $Header: /home/daffy/u0/vern/flex/RCS/ccl.c,v 2.9 93/09/16 20:32:14 vern Exp $ */ - -#include "flexdef.h" - -/* ccladd - add a single character to a ccl */ - -void ccladd( cclp, ch ) -int cclp; -int ch; - { - int ind, len, newpos, i; - - check_char( ch ); - - len = ccllen[cclp]; - ind = cclmap[cclp]; - - /* check to see if the character is already in the ccl */ - - for ( i = 0; i < len; ++i ) - if ( ccltbl[ind + i] == ch ) - return; - - newpos = ind + len; - - if ( newpos >= current_max_ccl_tbl_size ) - { - current_max_ccl_tbl_size += MAX_CCL_TBL_SIZE_INCREMENT; - - ++num_reallocs; - - ccltbl = reallocate_Character_array( ccltbl, - current_max_ccl_tbl_size ); - } - - ccllen[cclp] = len + 1; - ccltbl[newpos] = ch; - } - - -/* cclinit - return an empty ccl */ - -int cclinit() - { - if ( ++lastccl >= current_maxccls ) - { - current_maxccls += MAX_CCLS_INCREMENT; - - ++num_reallocs; - - cclmap = reallocate_integer_array( cclmap, current_maxccls ); - ccllen = reallocate_integer_array( ccllen, current_maxccls ); - cclng = reallocate_integer_array( cclng, current_maxccls ); - } - - if ( lastccl == 1 ) - /* we're making the first ccl */ - cclmap[lastccl] = 0; - - else - /* The new pointer is just past the end of the last ccl. - * Since the cclmap points to the \first/ character of a - * ccl, adding the length of the ccl to the cclmap pointer - * will produce a cursor to the first free space. - */ - cclmap[lastccl] = cclmap[lastccl - 1] + ccllen[lastccl - 1]; - - ccllen[lastccl] = 0; - cclng[lastccl] = 0; /* ccl's start out life un-negated */ - - return lastccl; - } - - -/* cclnegate - negate the given ccl */ - -void cclnegate( cclp ) -int cclp; - { - cclng[cclp] = 1; - } - - -/* list_character_set - list the members of a set of characters in CCL form - * - * Writes to the given file a character-class representation of those - * characters present in the given CCL. A character is present if it - * has a non-zero value in the cset array. - */ - -void list_character_set( file, cset ) -FILE *file; -int cset[]; - { - register int i; - - putc( '[', file ); - - for ( i = 0; i < csize; ++i ) - { - if ( cset[i] ) - { - register int start_char = i; - - putc( ' ', file ); - - fputs( readable_form( i ), file ); - - while ( ++i < csize && cset[i] ) - ; - - if ( i - 1 > start_char ) - /* this was a run */ - fprintf( file, "-%s", readable_form( i - 1 ) ); - - putc( ' ', file ); - } - } - - putc( ']', file ); - } diff --git a/usr.bin/lex/config.h b/usr.bin/lex/config.h deleted file mode 100644 index dc4481c4a050..000000000000 --- a/usr.bin/lex/config.h +++ /dev/null @@ -1,26 +0,0 @@ -/* config.h. Generated automatically by configure. */ -/* $Header: /home/daffy/u0/vern/flex/RCS/conf.in,v 1.2 95/01/09 12:11:51 vern Exp $ */ - -/* Define to empty if the keyword does not work. */ -/* #undef const */ - -/* Define to `unsigned' if <sys/types.h> doesn't define. */ -/* #undef size_t */ - -/* Define if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define if you have the <malloc.h> header file. */ -/* #undef HAVE_MALLOC_H */ - -/* Define if you have the <string.h> header file. */ -#define HAVE_STRING_H 1 - -/* Define if you have the <sys/types.h> header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define if you have <alloca.h> and it should be used (not on Ultrix). */ -/* #undef HAVE_ALLOCA_H */ - -/* Define if platform-specific command line handling is necessary. */ -/* #undef NEED_ARGV_FIXUP */ diff --git a/usr.bin/lex/flex.skl b/usr.bin/lex/flex.skl deleted file mode 100644 index 71a9cb649f9c..000000000000 --- a/usr.bin/lex/flex.skl +++ /dev/null @@ -1,1541 +0,0 @@ -/* A lexical scanner generated by flex */ - -/* Scanner skeleton version: - * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $ - */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 - -%- -#include <stdio.h> -%* - - -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus -#endif -#endif - - -#ifdef __cplusplus - -#include <stdlib.h> -%+ -class istream; -%* -#include <unistd.h> - -/* Use prototypes in function declarations. */ -#define YY_USE_PROTOS - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -#if __STDC__ - -#define YY_USE_PROTOS -#define YY_USE_CONST - -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ - -#ifdef __TURBOC__ - #pragma warn -rch - #pragma warn -use -#include <io.h> -#include <stdlib.h> -#define YY_USE_CONST -#define YY_USE_PROTOS -#endif - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - - -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* 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) - -/* 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 yyrestart( yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#define YY_BUF_SIZE 16384 - -typedef struct yy_buffer_state *YY_BUFFER_STATE; - -extern int yyleng; -%- -extern FILE *yyin, *yyout; -%* - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -/* The funky do-while in the following #define is used to turn the definition - * int a single C statement (which needs a semi-colon terminator). This - * avoids problems with code like: - * - * if ( condition_holds ) - * yyless( 5 ); - * else - * do_something_else(); - * - * Prior to using the do-while the compiler would get upset at the - * "else" because it interpreted the "if" statement as being all - * done when it reached the ';' after the yyless() call. - */ - -/* Return all but the first 'n' matched characters back to the input stream. */ - -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - *yy_cp = yy_hold_char; \ - YY_RESTORE_YY_MORE_OFFSET \ - yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext 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). - */ -typedef unsigned int yy_size_t; - - -struct yy_buffer_state - { -%- - FILE *yy_input_file; -%+ - istream* yy_input_file; -%* - - 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; - - /* 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 yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - }; - -%- Standard (non-C++) definition -static YY_BUFFER_STATE yy_current_buffer = 0; -%* - -/* 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". - */ -#define YY_CURRENT_BUFFER yy_current_buffer - - -%- Standard (non-C++) definition -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; - -static int yy_n_chars; /* number of characters read into yy_ch_buf */ - - -int yyleng; - -/* 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 yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart YY_PROTO(( FILE *input_file )); - -void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); -void yy_load_buffer_state YY_PROTO(( void )); -YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); -void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); -void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); -void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); -#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) - -YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); -YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); -YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); -%* - -static void *yy_flex_alloc YY_PROTO(( yy_size_t )); -static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); -static void yy_flex_free YY_PROTO(( void * )); - -#define yy_new_buffer yy_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) - -%% yytext/yyin/yyout/yy_state_type/yylineno etc. def's & init go here - -%- Standard (non-C++) definition -static yy_state_type yy_get_previous_state YY_PROTO(( void )); -static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); -static int yy_get_next_buffer YY_PROTO(( void )); -static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); -%* - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - yytext_ptr = yy_bp; \ -%% code to fiddle yytext and yyleng for yymore() goes here - yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ -%% code to copy yytext_ptr to yytext[] goes here, if %array - yy_c_buf_p = yy_cp; - -%% data tables for the DFA and the user's section 1 definitions go here - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap YY_PROTO(( void )); -#else -extern int yywrap YY_PROTO(( void )); -#endif -#endif - -%- -#ifndef YY_NO_UNPUT -static void yyunput YY_PROTO(( int c, char *buf_ptr )); -#endif -%* - -#ifndef yytext_ptr -static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen YY_PROTO(( yyconst char * )); -#endif - -#ifndef YY_NO_INPUT -%- Standard (non-C++) definition -#ifdef __cplusplus -static int yyinput YY_PROTO(( void )); -#else -static int input YY_PROTO(( void )); -#endif -%* -#endif - -#if YY_STACK_USED -static int yy_start_stack_ptr = 0; -static int yy_start_stack_depth = 0; -static int *yy_start_stack = 0; -#ifndef YY_NO_PUSH_STATE -static void yy_push_state YY_PROTO(( int new_state )); -#endif -#ifndef YY_NO_POP_STATE -static void yy_pop_state YY_PROTO(( void )); -#endif -#ifndef YY_NO_TOP_STATE -static int yy_top_state YY_PROTO(( void )); -#endif - -#else -#define YY_NO_PUSH_STATE 1 -#define YY_NO_POP_STATE 1 -#define YY_NO_TOP_STATE 1 -#endif - -#ifdef YY_MALLOC_DECL -YY_MALLOC_DECL -#else -#if __STDC__ -#ifndef __cplusplus -#include <stdlib.h> -#endif -#else -/* Just try to get by without declaring the routines. This will fail - * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) - * or sizeof(void*) != sizeof(int). - */ -#endif -#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 -%- 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( yytext, yyleng, 1, yyout ) -%+ C++ definition -#define ECHO LexerOutput( yytext, yyleng ) -%* -#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) \ -%% fread()/read() definition of YY_INPUT goes here unless we're doing C++ -%+ C++ definition - if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); -%* -#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 -%- -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -%+ -#define YY_FATAL_ERROR(msg) LexerError( msg ) -%* -#endif - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -%- Standard (non-C++) definition -#define YY_DECL int yylex YY_PROTO(( void )) -%+ C++ definition -#define YY_DECL int yyFlexLexer::yylex() -%* -#endif - -/* Code executed at the beginning of each rule, after yytext and yyleng - * 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 - -%% YY_RULE_SETUP definition goes here - -YY_DECL - { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -%% user's declarations go here - - if ( yy_init ) - { - yy_init = 0; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! yy_start ) - yy_start = 1; /* first start state */ - - if ( ! yyin ) -%- - yyin = stdin; -%+ - yyin = &cin; -%* - - if ( ! yyout ) -%- - yyout = stdout; -%+ - yyout = &cout; -%* - - if ( ! yy_current_buffer ) - yy_current_buffer = - yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_load_buffer_state(); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { -%% yymore()-related code goes here - yy_cp = yy_c_buf_p; - - /* Support of yytext. */ - *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; - -%% code to set up and find next match goes here - -yy_find_action: -%% code to find the action number goes here - - YY_DO_BEFORE_ACTION; - -%% code for yylineno update goes here - -do_action: /* This label is used only to access EOF actions. */ - -%% debug code goes here - - switch ( yy_act ) - { /* beginning of action switch */ -%% actions go here - - 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->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 yyin at a new source and called - * yylex(). 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->yy_n_chars; - yy_current_buffer->yy_input_file = yyin; - yy_current_buffer->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->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 - { -%% code to do back-up for compressed tables and set up yy_cp goes here - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - yy_did_buffer_switch_on_eof = 0; - - if ( yywrap() ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, 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->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 yylex */ - -%+ -yyFlexLexer::yyFlexLexer( istream* arg_yyin, ostream* arg_yyout ) - { - yyin = arg_yyin; - yyout = arg_yyout; - yy_c_buf_p = 0; - yy_init = 1; - yy_start = 0; - yy_flex_debug = 0; - yylineno = 1; // this will only get updated if %option yylineno - - yy_did_buffer_switch_on_eof = 0; - - yy_looking_for_trail_begin = 0; - yy_more_flag = 0; - yy_more_len = 0; - yy_more_offset = yy_prev_more_offset = 0; - - yy_start_stack_ptr = yy_start_stack_depth = 0; - yy_start_stack = 0; - - yy_current_buffer = 0; - -#ifdef YY_USES_REJECT - yy_state_buf = new yy_state_type[YY_BUF_SIZE + 2]; -#else - yy_state_buf = 0; -#endif - } - -yyFlexLexer::~yyFlexLexer() - { - delete yy_state_buf; - yy_delete_buffer( yy_current_buffer ); - } - -void yyFlexLexer::switch_streams( istream* new_in, ostream* new_out ) - { - if ( new_in ) - { - yy_delete_buffer( yy_current_buffer ); - yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); - } - - if ( new_out ) - yyout = new_out; - } - -#ifdef YY_INTERACTIVE -int yyFlexLexer::LexerInput( char* buf, int /* max_size */ ) -#else -int yyFlexLexer::LexerInput( char* buf, int max_size ) -#endif - { - if ( yyin->eof() || yyin->fail() ) - return 0; - -#ifdef YY_INTERACTIVE - yyin->get( buf[0] ); - - if ( yyin->eof() ) - return 0; - - if ( yyin->bad() ) - return -1; - - return 1; - -#else - (void) yyin->read( buf, max_size ); - - if ( yyin->bad() ) - return -1; - else - return yyin->gcount(); -#endif - } - -void yyFlexLexer::LexerOutput( const char* buf, int size ) - { - (void) yyout->write( buf, size ); - } -%* - -/* 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 - */ - -%- -static int yy_get_next_buffer() -%+ -int yyFlexLexer::yy_get_next_buffer() -%* - { - register char *dest = yy_current_buffer->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->yy_ch_buf[yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( yy_current_buffer->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->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->yy_n_chars = yy_n_chars = 0; - - else - { - int num_to_read = - yy_current_buffer->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ -#ifdef YY_USES_REJECT - YY_FATAL_ERROR( -"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); -#else - - /* 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. */ - yy_flex_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->yy_buf_size - - number_to_move - 1; -#endif - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), - yy_n_chars, num_to_read ); - - yy_current_buffer->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; - yyrestart( yyin ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - yy_n_chars += number_to_move; - yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; - yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; - - return ret_val; - } - - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - -%- -static yy_state_type yy_get_previous_state() -%+ -yy_state_type yyFlexLexer::yy_get_previous_state() -%* - { - register yy_state_type yy_current_state; - register char *yy_cp; - -%% code to get the start state into yy_current_state goes here - - for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) - { -%% code to find the next state goes here - } - - 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 ); - */ - -%- -#ifdef YY_USE_PROTOS -static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) -#else -static yy_state_type yy_try_NUL_trans( yy_current_state ) -yy_state_type yy_current_state; -#endif -%+ -yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) -%* - { - register int yy_is_jam; -%% code to find the next state, and perhaps do backing up, goes here - - return yy_is_jam ? 0 : yy_current_state; - } - - -%- -#ifndef YY_NO_UNPUT -#ifdef YY_USE_PROTOS -static void yyunput( int c, register char *yy_bp ) -#else -static void yyunput( c, yy_bp ) -int c; -register char *yy_bp; -#endif -%+ -void yyFlexLexer::yyunput( int c, register char* yy_bp ) -%* - { - register char *yy_cp = yy_c_buf_p; - - /* undo effects of setting up yytext */ - *yy_cp = yy_hold_char; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - /* +2 for EOB chars. */ - register int number_to_move = yy_n_chars + 2; - register char *dest = &yy_current_buffer->yy_ch_buf[ - yy_current_buffer->yy_buf_size + 2]; - register char *source = - &yy_current_buffer->yy_ch_buf[number_to_move]; - - while ( source > yy_current_buffer->yy_ch_buf ) - *--dest = *--source; - - yy_cp += (int) (dest - source); - yy_bp += (int) (dest - source); - yy_current_buffer->yy_n_chars = - yy_n_chars = yy_current_buffer->yy_buf_size; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - *--yy_cp = (char) c; - -%% update yylineno here - - yytext_ptr = yy_bp; - yy_hold_char = *yy_cp; - yy_c_buf_p = yy_cp; - } -%- -#endif /* ifndef YY_NO_UNPUT */ -%* - - -%- -#ifdef __cplusplus -static int yyinput() -#else -static int input() -#endif -%+ -int yyFlexLexer::yyinput() -%* - { - 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->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. */ - yyrestart( yyin ); - - /* fall through */ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap() ) - 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 yytext */ - yy_hold_char = *++yy_c_buf_p; - -%% update BOL and yylineno - - return c; - } - - -%- -#ifdef YY_USE_PROTOS -void yyrestart( FILE *input_file ) -#else -void yyrestart( input_file ) -FILE *input_file; -#endif -%+ -void yyFlexLexer::yyrestart( istream* input_file ) -%* - { - if ( ! yy_current_buffer ) - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_init_buffer( yy_current_buffer, input_file ); - yy_load_buffer_state(); - } - - -%- -#ifdef YY_USE_PROTOS -void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -#else -void yy_switch_to_buffer( new_buffer ) -YY_BUFFER_STATE new_buffer; -#endif -%+ -void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -%* - { - 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->yy_buf_pos = yy_c_buf_p; - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - yy_current_buffer = new_buffer; - yy_load_buffer_state(); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yy_did_buffer_switch_on_eof = 1; - } - - -%- -#ifdef YY_USE_PROTOS -void yy_load_buffer_state( void ) -#else -void yy_load_buffer_state() -#endif -%+ -void yyFlexLexer::yy_load_buffer_state() -%* - { - yy_n_chars = yy_current_buffer->yy_n_chars; - yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; - yyin = yy_current_buffer->yy_input_file; - yy_hold_char = *yy_c_buf_p; - } - - -%- -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) -#else -YY_BUFFER_STATE yy_create_buffer( file, size ) -FILE *file; -int size; -#endif -%+ -YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( istream* file, int size ) -%* - { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_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 *) yy_flex_alloc( b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer( b, file ); - - return b; - } - - -%- -#ifdef YY_USE_PROTOS -void yy_delete_buffer( YY_BUFFER_STATE b ) -#else -void yy_delete_buffer( b ) -YY_BUFFER_STATE b; -#endif -%+ -void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) -%* - { - if ( ! b ) - return; - - if ( b == yy_current_buffer ) - yy_current_buffer = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yy_flex_free( (void *) b->yy_ch_buf ); - - yy_flex_free( (void *) b ); - } - - -%- -#ifndef YY_ALWAYS_INTERACTIVE -#ifndef YY_NEVER_INTERACTIVE -extern int isatty YY_PROTO(( int )); -#endif -#endif - -#ifdef YY_USE_PROTOS -void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) -#else -void yy_init_buffer( b, file ) -YY_BUFFER_STATE b; -FILE *file; -#endif - -%+ -extern "C" int isatty YY_PROTO(( int )); -void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, istream* file ) -%* - - { - yy_flush_buffer( b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - -%- -#if YY_ALWAYS_INTERACTIVE - b->yy_is_interactive = 1; -#else -#if YY_NEVER_INTERACTIVE - b->yy_is_interactive = 0; -#else - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; -#endif -#endif -%+ - b->yy_is_interactive = 0; -%* - } - - -%- -#ifdef YY_USE_PROTOS -void yy_flush_buffer( YY_BUFFER_STATE b ) -#else -void yy_flush_buffer( b ) -YY_BUFFER_STATE b; -#endif - -%+ -void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) -%* - { - 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 ) - yy_load_buffer_state(); - } -%* - - -#ifndef YY_NO_SCAN_BUFFER -%- -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) -#else -YY_BUFFER_STATE yy_scan_buffer( base, size ) -char *base; -yy_size_t size; -#endif - { - 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) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_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; - - yy_switch_to_buffer( b ); - - return b; - } -%* -#endif - - -#ifndef YY_NO_SCAN_STRING -%- -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) -#else -YY_BUFFER_STATE yy_scan_string( yy_str ) -yyconst char *yy_str; -#endif - { - int len; - for ( len = 0; yy_str[len]; ++len ) - ; - - return yy_scan_bytes( yy_str, len ); - } -%* -#endif - - -#ifndef YY_NO_SCAN_BYTES -%- -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) -#else -YY_BUFFER_STATE yy_scan_bytes( bytes, len ) -yyconst char *bytes; -int len; -#endif - { - 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 *) yy_flex_alloc( n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < len; ++i ) - buf[i] = bytes[i]; - - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer( buf, n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_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_NO_PUSH_STATE -%- -#ifdef YY_USE_PROTOS -static void yy_push_state( int new_state ) -#else -static void yy_push_state( new_state ) -int new_state; -#endif -%+ -void yyFlexLexer::yy_push_state( int new_state ) -%* - { - if ( yy_start_stack_ptr >= yy_start_stack_depth ) - { - yy_size_t new_size; - - yy_start_stack_depth += YY_START_STACK_INCR; - new_size = yy_start_stack_depth * sizeof( int ); - - if ( ! yy_start_stack ) - yy_start_stack = (int *) yy_flex_alloc( new_size ); - - else - yy_start_stack = (int *) yy_flex_realloc( - (void *) yy_start_stack, new_size ); - - if ( ! yy_start_stack ) - YY_FATAL_ERROR( - "out of memory expanding start-condition stack" ); - } - - yy_start_stack[yy_start_stack_ptr++] = YY_START; - - BEGIN(new_state); - } -#endif - - -#ifndef YY_NO_POP_STATE -%- -static void yy_pop_state() -%+ -void yyFlexLexer::yy_pop_state() -%* - { - if ( --yy_start_stack_ptr < 0 ) - YY_FATAL_ERROR( "start-condition stack underflow" ); - - BEGIN(yy_start_stack[yy_start_stack_ptr]); - } -#endif - - -#ifndef YY_NO_TOP_STATE -%- -static int yy_top_state() -%+ -int yyFlexLexer::yy_top_state() -%* - { - return yy_start_stack[yy_start_stack_ptr - 1]; - } -#endif - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -%- -#ifdef YY_USE_PROTOS -static void yy_fatal_error( yyconst char msg[] ) -#else -static void yy_fatal_error( msg ) -char msg[]; -#endif - { - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); - } - -%+ - -void yyFlexLexer::LexerError( yyconst char msg[] ) - { - cerr << msg << '\n'; - exit( YY_EXIT_FAILURE ); - } -%* - - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - yytext[yyleng] = yy_hold_char; \ - yy_c_buf_p = yytext + n; \ - yy_hold_char = *yy_c_buf_p; \ - *yy_c_buf_p = '\0'; \ - yyleng = n; \ - } \ - while ( 0 ) - - -/* Internal utility routines. */ - -#ifndef yytext_ptr -#ifdef YY_USE_PROTOS -static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) -#else -static void yy_flex_strncpy( s1, s2, n ) -char *s1; -yyconst char *s2; -int n; -#endif - { - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; - } -#endif - -#ifdef YY_NEED_STRLEN -#ifdef YY_USE_PROTOS -static int yy_flex_strlen( yyconst char *s ) -#else -static int yy_flex_strlen( s ) -yyconst char *s; -#endif - { - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; - } -#endif - - -#ifdef YY_USE_PROTOS -static void *yy_flex_alloc( yy_size_t size ) -#else -static void *yy_flex_alloc( size ) -yy_size_t size; -#endif - { - return (void *) malloc( size ); - } - -#ifdef YY_USE_PROTOS -static void *yy_flex_realloc( void *ptr, yy_size_t size ) -#else -static void *yy_flex_realloc( ptr, size ) -void *ptr; -yy_size_t size; -#endif - { - /* 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 ); - } - -#ifdef YY_USE_PROTOS -static void yy_flex_free( void *ptr ) -#else -static void yy_flex_free( ptr ) -void *ptr; -#endif - { - free( ptr ); - } - -#if YY_MAIN -int main() - { - yylex(); - return 0; - } -#endif diff --git a/usr.bin/lex/gen.c b/usr.bin/lex/gen.c deleted file mode 100644 index abf404c0786f..000000000000 --- a/usr.bin/lex/gen.c +++ /dev/null @@ -1,1625 +0,0 @@ -/* gen - actual generation (writing) of flex scanners */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* $Header: /home/daffy/u0/vern/flex/RCS/gen.c,v 2.56 96/05/25 20:43:38 vern Exp $ */ - -#include "flexdef.h" - - -/* declare functions that have forward references */ - -void gen_next_state PROTO((int)); -void genecs PROTO((void)); -void indent_put2s PROTO((char [], char [])); -void indent_puts PROTO((char [])); - - -static int indent_level = 0; /* each level is 8 spaces */ - -#define indent_up() (++indent_level) -#define indent_down() (--indent_level) -#define set_indent(indent_val) indent_level = indent_val - -/* Almost everything is done in terms of arrays starting at 1, so provide - * a null entry for the zero element of all C arrays. (The exception - * to this is that the fast table representation generally uses the - * 0 elements of its arrays, too.) - */ -static char C_int_decl[] = "static yyconst int %s[%d] =\n { 0,\n"; -static char C_short_decl[] = "static yyconst short int %s[%d] =\n { 0,\n"; -static char C_long_decl[] = "static yyconst long int %s[%d] =\n { 0,\n"; -static char C_state_decl[] = - "static yyconst yy_state_type %s[%d] =\n { 0,\n"; - - -/* Indent to the current level. */ - -void do_indent() - { - register int i = indent_level * 8; - - while ( i >= 8 ) - { - outc( '\t' ); - i -= 8; - } - - while ( i > 0 ) - { - outc( ' ' ); - --i; - } - } - - -/* Generate the code to keep backing-up information. */ - -void gen_backing_up() - { - if ( reject || num_backing_up == 0 ) - return; - - if ( fullspd ) - indent_puts( "if ( yy_current_state[-1].yy_nxt )" ); - else - indent_puts( "if ( yy_accept[yy_current_state] )" ); - - indent_up(); - indent_puts( "{" ); - indent_puts( "yy_last_accepting_state = yy_current_state;" ); - indent_puts( "yy_last_accepting_cpos = yy_cp;" ); - indent_puts( "}" ); - indent_down(); - } - - -/* Generate the code to perform the backing up. */ - -void gen_bu_action() - { - if ( reject || num_backing_up == 0 ) - return; - - set_indent( 3 ); - - indent_puts( "case 0: /* must back up */" ); - indent_puts( "/* undo the effects of YY_DO_BEFORE_ACTION */" ); - indent_puts( "*yy_cp = yy_hold_char;" ); - - if ( fullspd || fulltbl ) - indent_puts( "yy_cp = yy_last_accepting_cpos + 1;" ); - else - /* Backing-up info for compressed tables is taken \after/ - * yy_cp has been incremented for the next state. - */ - indent_puts( "yy_cp = yy_last_accepting_cpos;" ); - - indent_puts( "yy_current_state = yy_last_accepting_state;" ); - indent_puts( "goto yy_find_action;" ); - outc( '\n' ); - - set_indent( 0 ); - } - - -/* genctbl - generates full speed compressed transition table */ - -void genctbl() - { - register int i; - int end_of_buffer_action = num_rules + 1; - - /* Table of verify for transition and offset to next state. */ - out_dec( "static yyconst struct yy_trans_info yy_transition[%d] =\n", - tblend + numecs + 1 ); - outn( " {" ); - - /* We want the transition to be represented as the offset to the - * next state, not the actual state number, which is what it currently - * is. The offset is base[nxt[i]] - (base of current state)]. That's - * just the difference between the starting points of the two involved - * states (to - from). - * - * First, though, we need to find some way to put in our end-of-buffer - * flags and states. We do this by making a state with absolutely no - * transitions. We put it at the end of the table. - */ - - /* We need to have room in nxt/chk for two more slots: One for the - * action and one for the end-of-buffer transition. We now *assume* - * that we're guaranteed the only character we'll try to index this - * nxt/chk pair with is EOB, i.e., 0, so we don't have to make sure - * there's room for jam entries for other characters. - */ - - while ( tblend + 2 >= current_max_xpairs ) - expand_nxt_chk(); - - while ( lastdfa + 1 >= current_max_dfas ) - increase_max_dfas(); - - base[lastdfa + 1] = tblend + 2; - nxt[tblend + 1] = end_of_buffer_action; - chk[tblend + 1] = numecs + 1; - chk[tblend + 2] = 1; /* anything but EOB */ - - /* So that "make test" won't show arb. differences. */ - nxt[tblend + 2] = 0; - - /* Make sure every state has an end-of-buffer transition and an - * action #. - */ - for ( i = 0; i <= lastdfa; ++i ) - { - int anum = dfaacc[i].dfaacc_state; - int offset = base[i]; - - chk[offset] = EOB_POSITION; - chk[offset - 1] = ACTION_POSITION; - nxt[offset - 1] = anum; /* action number */ - } - - for ( i = 0; i <= tblend; ++i ) - { - if ( chk[i] == EOB_POSITION ) - transition_struct_out( 0, base[lastdfa + 1] - i ); - - else if ( chk[i] == ACTION_POSITION ) - transition_struct_out( 0, nxt[i] ); - - else if ( chk[i] > numecs || chk[i] == 0 ) - transition_struct_out( 0, 0 ); /* unused slot */ - - else /* verify, transition */ - transition_struct_out( chk[i], - base[nxt[i]] - (i - chk[i]) ); - } - - - /* Here's the final, end-of-buffer state. */ - transition_struct_out( chk[tblend + 1], nxt[tblend + 1] ); - transition_struct_out( chk[tblend + 2], nxt[tblend + 2] ); - - outn( " };\n" ); - - /* Table of pointers to start states. */ - out_dec( - "static yyconst struct yy_trans_info *yy_start_state_list[%d] =\n", - lastsc * 2 + 1 ); - outn( " {" ); /* } so vi doesn't get confused */ - - for ( i = 0; i <= lastsc * 2; ++i ) - out_dec( " &yy_transition[%d],\n", base[i] ); - - dataend(); - - if ( useecs ) - genecs(); - } - - -/* Generate equivalence-class tables. */ - -void genecs() - { - register int i, j; - int numrows; - - out_str_dec( C_int_decl, "yy_ec", csize ); - - for ( i = 1; i < csize; ++i ) - { - if ( caseins && (i >= 'A') && (i <= 'Z') ) - ecgroup[i] = ecgroup[clower( i )]; - - ecgroup[i] = ABS( ecgroup[i] ); - mkdata( ecgroup[i] ); - } - - dataend(); - - if ( trace ) - { - fputs( _( "\n\nEquivalence Classes:\n\n" ), stderr ); - - numrows = csize / 8; - - for ( j = 0; j < numrows; ++j ) - { - for ( i = j; i < csize; i = i + numrows ) - { - fprintf( stderr, "%4s = %-2d", - readable_form( i ), ecgroup[i] ); - - putc( ' ', stderr ); - } - - putc( '\n', stderr ); - } - } - } - - -/* Generate the code to find the action number. */ - -void gen_find_action() - { - if ( fullspd ) - indent_puts( "yy_act = yy_current_state[-1].yy_nxt;" ); - - else if ( fulltbl ) - indent_puts( "yy_act = yy_accept[yy_current_state];" ); - - else if ( reject ) - { - indent_puts( "yy_current_state = *--yy_state_ptr;" ); - indent_puts( "yy_lp = yy_accept[yy_current_state];" ); - - outn( - "find_rule: /* we branch to this label when backing up */" ); - - indent_puts( - "for ( ; ; ) /* until we find what rule we matched */" ); - - indent_up(); - - indent_puts( "{" ); - - indent_puts( - "if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] )" ); - indent_up(); - indent_puts( "{" ); - indent_puts( "yy_act = yy_acclist[yy_lp];" ); - - if ( variable_trailing_context_rules ) - { - indent_puts( "if ( yy_act & YY_TRAILING_HEAD_MASK ||" ); - indent_puts( " yy_looking_for_trail_begin )" ); - indent_up(); - indent_puts( "{" ); - - indent_puts( - "if ( yy_act == yy_looking_for_trail_begin )" ); - indent_up(); - indent_puts( "{" ); - indent_puts( "yy_looking_for_trail_begin = 0;" ); - indent_puts( "yy_act &= ~YY_TRAILING_HEAD_MASK;" ); - indent_puts( "break;" ); - indent_puts( "}" ); - indent_down(); - - indent_puts( "}" ); - indent_down(); - - indent_puts( "else if ( yy_act & YY_TRAILING_MASK )" ); - indent_up(); - indent_puts( "{" ); - indent_puts( - "yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK;" ); - indent_puts( - "yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK;" ); - - if ( real_reject ) - { - /* Remember matched text in case we back up - * due to REJECT. - */ - indent_puts( "yy_full_match = yy_cp;" ); - indent_puts( "yy_full_state = yy_state_ptr;" ); - indent_puts( "yy_full_lp = yy_lp;" ); - } - - indent_puts( "}" ); - indent_down(); - - indent_puts( "else" ); - indent_up(); - indent_puts( "{" ); - indent_puts( "yy_full_match = yy_cp;" ); - indent_puts( "yy_full_state = yy_state_ptr;" ); - indent_puts( "yy_full_lp = yy_lp;" ); - indent_puts( "break;" ); - indent_puts( "}" ); - indent_down(); - - indent_puts( "++yy_lp;" ); - indent_puts( "goto find_rule;" ); - } - - else - { - /* Remember matched text in case we back up due to - * trailing context plus REJECT. - */ - indent_up(); - indent_puts( "{" ); - indent_puts( "yy_full_match = yy_cp;" ); - indent_puts( "break;" ); - indent_puts( "}" ); - indent_down(); - } - - indent_puts( "}" ); - indent_down(); - - indent_puts( "--yy_cp;" ); - - /* We could consolidate the following two lines with those at - * the beginning, but at the cost of complaints that we're - * branching inside a loop. - */ - indent_puts( "yy_current_state = *--yy_state_ptr;" ); - indent_puts( "yy_lp = yy_accept[yy_current_state];" ); - - indent_puts( "}" ); - - indent_down(); - } - - else - { /* compressed */ - indent_puts( "yy_act = yy_accept[yy_current_state];" ); - - if ( interactive && ! reject ) - { - /* Do the guaranteed-needed backing up to figure out - * the match. - */ - indent_puts( "if ( yy_act == 0 )" ); - indent_up(); - indent_puts( "{ /* have to back up */" ); - indent_puts( "yy_cp = yy_last_accepting_cpos;" ); - indent_puts( - "yy_current_state = yy_last_accepting_state;" ); - indent_puts( "yy_act = yy_accept[yy_current_state];" ); - indent_puts( "}" ); - indent_down(); - } - } - } - - -/* genftbl - generate full transition table */ - -void genftbl() - { - register int i; - int end_of_buffer_action = num_rules + 1; - - out_str_dec( long_align ? C_long_decl : C_short_decl, - "yy_accept", lastdfa + 1 ); - - dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action; - - for ( i = 1; i <= lastdfa; ++i ) - { - register int anum = dfaacc[i].dfaacc_state; - - mkdata( anum ); - - if ( trace && anum ) - fprintf( stderr, _( "state # %d accepts: [%d]\n" ), - i, anum ); - } - - dataend(); - - if ( useecs ) - genecs(); - - /* Don't have to dump the actual full table entries - they were - * created on-the-fly. - */ - } - - -/* Generate the code to find the next compressed-table state. */ - -void gen_next_compressed_state( char_map ) -char *char_map; - { - indent_put2s( "register YY_CHAR yy_c = %s;", char_map ); - - /* Save the backing-up info \before/ computing the next state - * because we always compute one more state than needed - we - * always proceed until we reach a jam state - */ - gen_backing_up(); - - indent_puts( -"while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )" ); - indent_up(); - indent_puts( "{" ); - indent_puts( "yy_current_state = (int) yy_def[yy_current_state];" ); - - if ( usemecs ) - { - /* We've arrange it so that templates are never chained - * to one another. This means we can afford to make a - * very simple test to see if we need to convert to - * yy_c's meta-equivalence class without worrying - * about erroneously looking up the meta-equivalence - * class twice - */ - do_indent(); - - /* lastdfa + 2 is the beginning of the templates */ - out_dec( "if ( yy_current_state >= %d )\n", lastdfa + 2 ); - - indent_up(); - indent_puts( "yy_c = yy_meta[(unsigned int) yy_c];" ); - indent_down(); - } - - indent_puts( "}" ); - indent_down(); - - indent_puts( -"yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];" ); - } - - -/* Generate the code to find the next match. */ - -void gen_next_match() - { - /* NOTE - changes in here should be reflected in gen_next_state() and - * gen_NUL_trans(). - */ - char *char_map = useecs ? - "yy_ec[YY_SC_TO_UI(*yy_cp)]" : - "YY_SC_TO_UI(*yy_cp)"; - - char *char_map_2 = useecs ? - "yy_ec[YY_SC_TO_UI(*++yy_cp)]" : - "YY_SC_TO_UI(*++yy_cp)"; - - if ( fulltbl ) - { - indent_put2s( - "while ( (yy_current_state = yy_nxt[yy_current_state][%s]) > 0 )", - char_map ); - - indent_up(); - - if ( num_backing_up > 0 ) - { - indent_puts( "{" ); /* } for vi */ - gen_backing_up(); - outc( '\n' ); - } - - indent_puts( "++yy_cp;" ); - - if ( num_backing_up > 0 ) - /* { for vi */ - indent_puts( "}" ); - - indent_down(); - - outc( '\n' ); - indent_puts( "yy_current_state = -yy_current_state;" ); - } - - else if ( fullspd ) - { - indent_puts( "{" ); /* } for vi */ - indent_puts( - "register yyconst struct yy_trans_info *yy_trans_info;\n" ); - indent_puts( "register YY_CHAR yy_c;\n" ); - indent_put2s( "for ( yy_c = %s;", char_map ); - indent_puts( - " (yy_trans_info = &yy_current_state[(unsigned int) yy_c])->" ); - indent_puts( "yy_verify == yy_c;" ); - indent_put2s( " yy_c = %s )", char_map_2 ); - - indent_up(); - - if ( num_backing_up > 0 ) - indent_puts( "{" ); /* } for vi */ - - indent_puts( "yy_current_state += yy_trans_info->yy_nxt;" ); - - if ( num_backing_up > 0 ) - { - outc( '\n' ); - gen_backing_up(); /* { for vi */ - indent_puts( "}" ); - } - - indent_down(); /* { for vi */ - indent_puts( "}" ); - } - - else - { /* compressed */ - indent_puts( "do" ); - - indent_up(); - indent_puts( "{" ); /* } for vi */ - - gen_next_state( false ); - - indent_puts( "++yy_cp;" ); - - /* { for vi */ - indent_puts( "}" ); - indent_down(); - - do_indent(); - - if ( interactive ) - out_dec( "while ( yy_base[yy_current_state] != %d );\n", - jambase ); - else - out_dec( "while ( yy_current_state != %d );\n", - jamstate ); - - if ( ! reject && ! interactive ) - { - /* Do the guaranteed-needed backing up to figure out - * the match. - */ - indent_puts( "yy_cp = yy_last_accepting_cpos;" ); - indent_puts( - "yy_current_state = yy_last_accepting_state;" ); - } - } - } - - -/* Generate the code to find the next state. */ - -void gen_next_state( worry_about_NULs ) -int worry_about_NULs; - { /* NOTE - changes in here should be reflected in gen_next_match() */ - char char_map[256]; - - if ( worry_about_NULs && ! nultrans ) - { - if ( useecs ) - (void) sprintf( char_map, - "(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : %d)", - NUL_ec ); - else - (void) sprintf( char_map, - "(*yy_cp ? YY_SC_TO_UI(*yy_cp) : %d)", NUL_ec ); - } - - else - strcpy( char_map, useecs ? - "yy_ec[YY_SC_TO_UI(*yy_cp)]" : "YY_SC_TO_UI(*yy_cp)" ); - - if ( worry_about_NULs && nultrans ) - { - if ( ! fulltbl && ! fullspd ) - /* Compressed tables back up *before* they match. */ - gen_backing_up(); - - indent_puts( "if ( *yy_cp )" ); - indent_up(); - indent_puts( "{" ); /* } for vi */ - } - - if ( fulltbl ) - indent_put2s( - "yy_current_state = yy_nxt[yy_current_state][%s];", - char_map ); - - else if ( fullspd ) - indent_put2s( - "yy_current_state += yy_current_state[%s].yy_nxt;", - char_map ); - - else - gen_next_compressed_state( char_map ); - - if ( worry_about_NULs && nultrans ) - { - /* { for vi */ - indent_puts( "}" ); - indent_down(); - indent_puts( "else" ); - indent_up(); - indent_puts( - "yy_current_state = yy_NUL_trans[yy_current_state];" ); - indent_down(); - } - - if ( fullspd || fulltbl ) - gen_backing_up(); - - if ( reject ) - indent_puts( "*yy_state_ptr++ = yy_current_state;" ); - } - - -/* Generate the code to make a NUL transition. */ - -void gen_NUL_trans() - { /* NOTE - changes in here should be reflected in gen_next_match() */ - /* Only generate a definition for "yy_cp" if we'll generate code - * that uses it. Otherwise lint and the like complain. - */ - int need_backing_up = (num_backing_up > 0 && ! reject); - - if ( need_backing_up && (! nultrans || fullspd || fulltbl) ) - /* We're going to need yy_cp lying around for the call - * below to gen_backing_up(). - */ - indent_puts( "register char *yy_cp = yy_c_buf_p;" ); - - outc( '\n' ); - - if ( nultrans ) - { - indent_puts( - "yy_current_state = yy_NUL_trans[yy_current_state];" ); - indent_puts( "yy_is_jam = (yy_current_state == 0);" ); - } - - else if ( fulltbl ) - { - do_indent(); - out_dec( "yy_current_state = yy_nxt[yy_current_state][%d];\n", - NUL_ec ); - indent_puts( "yy_is_jam = (yy_current_state <= 0);" ); - } - - else if ( fullspd ) - { - do_indent(); - out_dec( "register int yy_c = %d;\n", NUL_ec ); - - indent_puts( - "register yyconst struct yy_trans_info *yy_trans_info;\n" ); - indent_puts( - "yy_trans_info = &yy_current_state[(unsigned int) yy_c];" ); - indent_puts( "yy_current_state += yy_trans_info->yy_nxt;" ); - - indent_puts( - "yy_is_jam = (yy_trans_info->yy_verify != yy_c);" ); - } - - else - { - char NUL_ec_str[20]; - - (void) sprintf( NUL_ec_str, "%d", NUL_ec ); - gen_next_compressed_state( NUL_ec_str ); - - do_indent(); - out_dec( "yy_is_jam = (yy_current_state == %d);\n", jamstate ); - - if ( reject ) - { - /* Only stack this state if it's a transition we - * actually make. If we stack it on a jam, then - * the state stack and yy_c_buf_p get out of sync. - */ - indent_puts( "if ( ! yy_is_jam )" ); - indent_up(); - indent_puts( "*yy_state_ptr++ = yy_current_state;" ); - indent_down(); - } - } - - /* If we've entered an accepting state, back up; note that - * compressed tables have *already* done such backing up, so - * we needn't bother with it again. - */ - if ( need_backing_up && (fullspd || fulltbl) ) - { - outc( '\n' ); - indent_puts( "if ( ! yy_is_jam )" ); - indent_up(); - indent_puts( "{" ); - gen_backing_up(); - indent_puts( "}" ); - indent_down(); - } - } - - -/* Generate the code to find the start state. */ - -void gen_start_state() - { - if ( fullspd ) - { - if ( bol_needed ) - { - indent_puts( - "yy_current_state = yy_start_state_list[yy_start + YY_AT_BOL()];" ); - } - else - indent_puts( - "yy_current_state = yy_start_state_list[yy_start];" ); - } - - else - { - indent_puts( "yy_current_state = yy_start;" ); - - if ( bol_needed ) - indent_puts( "yy_current_state += YY_AT_BOL();" ); - - if ( reject ) - { - /* Set up for storing up states. */ - indent_puts( "yy_state_ptr = yy_state_buf;" ); - indent_puts( "*yy_state_ptr++ = yy_current_state;" ); - } - } - } - - -/* gentabs - generate data statements for the transition tables */ - -void gentabs() - { - int i, j, k, *accset, nacc, *acc_array, total_states; - int end_of_buffer_action = num_rules + 1; - - acc_array = allocate_integer_array( current_max_dfas ); - nummt = 0; - - /* The compressed table format jams by entering the "jam state", - * losing information about the previous state in the process. - * In order to recover the previous state, we effectively need - * to keep backing-up information. - */ - ++num_backing_up; - - if ( reject ) - { - /* Write out accepting list and pointer list. - * - * First we generate the "yy_acclist" array. In the process, - * we compute the indices that will go into the "yy_accept" - * array, and save the indices in the dfaacc array. - */ - int EOB_accepting_list[2]; - - /* Set up accepting structures for the End Of Buffer state. */ - EOB_accepting_list[0] = 0; - EOB_accepting_list[1] = end_of_buffer_action; - accsiz[end_of_buffer_state] = 1; - dfaacc[end_of_buffer_state].dfaacc_set = EOB_accepting_list; - - out_str_dec( long_align ? C_long_decl : C_short_decl, - "yy_acclist", MAX( numas, 1 ) + 1 ); - - j = 1; /* index into "yy_acclist" array */ - - for ( i = 1; i <= lastdfa; ++i ) - { - acc_array[i] = j; - - if ( accsiz[i] != 0 ) - { - accset = dfaacc[i].dfaacc_set; - nacc = accsiz[i]; - - if ( trace ) - fprintf( stderr, - _( "state # %d accepts: " ), - i ); - - for ( k = 1; k <= nacc; ++k ) - { - int accnum = accset[k]; - - ++j; - - if ( variable_trailing_context_rules && - ! (accnum & YY_TRAILING_HEAD_MASK) && - accnum > 0 && accnum <= num_rules && - rule_type[accnum] == RULE_VARIABLE ) - { - /* Special hack to flag - * accepting number as part - * of trailing context rule. - */ - accnum |= YY_TRAILING_MASK; - } - - mkdata( accnum ); - - if ( trace ) - { - fprintf( stderr, "[%d]", - accset[k] ); - - if ( k < nacc ) - fputs( ", ", stderr ); - else - putc( '\n', stderr ); - } - } - } - } - - /* add accepting number for the "jam" state */ - acc_array[i] = j; - - dataend(); - } - - else - { - dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action; - - for ( i = 1; i <= lastdfa; ++i ) - acc_array[i] = dfaacc[i].dfaacc_state; - - /* add accepting number for jam state */ - acc_array[i] = 0; - } - - /* Spit out "yy_accept" array. If we're doing "reject", it'll be - * pointers into the "yy_acclist" array. Otherwise it's actual - * accepting numbers. In either case, we just dump the numbers. - */ - - /* "lastdfa + 2" is the size of "yy_accept"; includes room for C arrays - * beginning at 0 and for "jam" state. - */ - k = lastdfa + 2; - - if ( reject ) - /* We put a "cap" on the table associating lists of accepting - * numbers with state numbers. This is needed because we tell - * where the end of an accepting list is by looking at where - * the list for the next state starts. - */ - ++k; - - out_str_dec( long_align ? C_long_decl : C_short_decl, "yy_accept", k ); - - for ( i = 1; i <= lastdfa; ++i ) - { - mkdata( acc_array[i] ); - - if ( ! reject && trace && acc_array[i] ) - fprintf( stderr, _( "state # %d accepts: [%d]\n" ), - i, acc_array[i] ); - } - - /* Add entry for "jam" state. */ - mkdata( acc_array[i] ); - - if ( reject ) - /* Add "cap" for the list. */ - mkdata( acc_array[i] ); - - dataend(); - - if ( useecs ) - genecs(); - - if ( usemecs ) - { - /* Write out meta-equivalence classes (used to index - * templates with). - */ - - if ( trace ) - fputs( _( "\n\nMeta-Equivalence Classes:\n" ), - stderr ); - - out_str_dec( C_int_decl, "yy_meta", numecs + 1 ); - - for ( i = 1; i <= numecs; ++i ) - { - if ( trace ) - fprintf( stderr, "%d = %d\n", - i, ABS( tecbck[i] ) ); - - mkdata( ABS( tecbck[i] ) ); - } - - dataend(); - } - - total_states = lastdfa + numtemps; - - out_str_dec( (tblend >= MAX_SHORT || long_align) ? - C_long_decl : C_short_decl, - "yy_base", total_states + 1 ); - - for ( i = 1; i <= lastdfa; ++i ) - { - register int d = def[i]; - - if ( base[i] == JAMSTATE ) - base[i] = jambase; - - if ( d == JAMSTATE ) - def[i] = jamstate; - - else if ( d < 0 ) - { - /* Template reference. */ - ++tmpuses; - def[i] = lastdfa - d + 1; - } - - mkdata( base[i] ); - } - - /* Generate jam state's base index. */ - mkdata( base[i] ); - - for ( ++i /* skip jam state */; i <= total_states; ++i ) - { - mkdata( base[i] ); - def[i] = jamstate; - } - - dataend(); - - out_str_dec( (total_states >= MAX_SHORT || long_align) ? - C_long_decl : C_short_decl, - "yy_def", total_states + 1 ); - - for ( i = 1; i <= total_states; ++i ) - mkdata( def[i] ); - - dataend(); - - out_str_dec( (total_states >= MAX_SHORT || long_align) ? - C_long_decl : C_short_decl, - "yy_nxt", tblend + 1 ); - - for ( i = 1; i <= tblend; ++i ) - { - /* Note, the order of the following test is important. - * If chk[i] is 0, then nxt[i] is undefined. - */ - if ( chk[i] == 0 || nxt[i] == 0 ) - nxt[i] = jamstate; /* new state is the JAM state */ - - mkdata( nxt[i] ); - } - - dataend(); - - out_str_dec( (total_states >= MAX_SHORT || long_align) ? - C_long_decl : C_short_decl, - "yy_chk", tblend + 1 ); - - for ( i = 1; i <= tblend; ++i ) - { - if ( chk[i] == 0 ) - ++nummt; - - mkdata( chk[i] ); - } - - dataend(); - } - - -/* Write out a formatted string (with a secondary string argument) at the - * current indentation level, adding a final newline. - */ - -void indent_put2s( fmt, arg ) -char fmt[], arg[]; - { - do_indent(); - out_str( fmt, arg ); - outn( "" ); - } - - -/* Write out a string at the current indentation level, adding a final - * newline. - */ - -void indent_puts( str ) -char str[]; - { - do_indent(); - outn( str ); - } - - -/* make_tables - generate transition tables and finishes generating output file - */ - -void make_tables() - { - register int i; - int did_eof_rule = false; - - skelout(); - - /* First, take care of YY_DO_BEFORE_ACTION depending on yymore - * being used. - */ - set_indent( 1 ); - - if ( yymore_used && ! yytext_is_array ) - { - indent_puts( "yytext_ptr -= yy_more_len; \\" ); - indent_puts( "yyleng = (int) (yy_cp - yytext_ptr); \\" ); - } - - else - indent_puts( "yyleng = (int) (yy_cp - yy_bp); \\" ); - - /* Now also deal with copying yytext_ptr to yytext if needed. */ - skelout(); - if ( yytext_is_array ) - { - if ( yymore_used ) - indent_puts( - "if ( yyleng + yy_more_offset >= YYLMAX ) \\" ); - else - indent_puts( "if ( yyleng >= YYLMAX ) \\" ); - - indent_up(); - indent_puts( - "YY_FATAL_ERROR( \"token too large, exceeds YYLMAX\" ); \\" ); - indent_down(); - - if ( yymore_used ) - { - indent_puts( -"yy_flex_strncpy( &yytext[yy_more_offset], yytext_ptr, yyleng + 1 ); \\" ); - indent_puts( "yyleng += yy_more_offset; \\" ); - indent_puts( - "yy_prev_more_offset = yy_more_offset; \\" ); - indent_puts( "yy_more_offset = 0; \\" ); - } - else - { - indent_puts( - "yy_flex_strncpy( yytext, yytext_ptr, yyleng + 1 ); \\" ); - } - } - - set_indent( 0 ); - - skelout(); - - - out_dec( "#define YY_NUM_RULES %d\n", num_rules ); - out_dec( "#define YY_END_OF_BUFFER %d\n", num_rules + 1 ); - - if ( fullspd ) - { - /* Need to define the transet type as a size large - * enough to hold the biggest offset. - */ - int total_table_size = tblend + numecs + 1; - char *trans_offset_type = - (total_table_size >= MAX_SHORT || long_align) ? - "long" : "short"; - - set_indent( 0 ); - indent_puts( "struct yy_trans_info" ); - indent_up(); - indent_puts( "{" ); /* } for vi */ - - if ( long_align ) - indent_puts( "long yy_verify;" ); - else - indent_puts( "short yy_verify;" ); - - /* In cases where its sister yy_verify *is* a "yes, there is - * a transition", yy_nxt is the offset (in records) to the - * next state. In most cases where there is no transition, - * the value of yy_nxt is irrelevant. If yy_nxt is the -1th - * record of a state, though, then yy_nxt is the action number - * for that state. - */ - - indent_put2s( "%s yy_nxt;", trans_offset_type ); - indent_puts( "};" ); - indent_down(); - } - - if ( fullspd ) - genctbl(); - else if ( fulltbl ) - genftbl(); - else - gentabs(); - - /* Definitions for backing up. We don't need them if REJECT - * is being used because then we use an alternative backin-up - * technique instead. - */ - if ( num_backing_up > 0 && ! reject ) - { - if ( ! C_plus_plus ) - { - indent_puts( - "static yy_state_type yy_last_accepting_state;" ); - indent_puts( - "static char *yy_last_accepting_cpos;\n" ); - } - } - - if ( nultrans ) - { - out_str_dec( C_state_decl, "yy_NUL_trans", lastdfa + 1 ); - - for ( i = 1; i <= lastdfa; ++i ) - { - if ( fullspd ) - out_dec( " &yy_transition[%d],\n", base[i] ); - else - mkdata( nultrans[i] ); - } - - dataend(); - } - - if ( ddebug ) - { /* Spit out table mapping rules to line numbers. */ - if ( ! C_plus_plus ) - { - indent_puts( "extern int yy_flex_debug;" ); - indent_puts( "int yy_flex_debug = 1;\n" ); - } - - out_str_dec( long_align ? C_long_decl : C_short_decl, - "yy_rule_linenum", num_rules ); - for ( i = 1; i < num_rules; ++i ) - mkdata( rule_linenum[i] ); - dataend(); - } - - if ( reject ) - { - /* Declare state buffer variables. */ - if ( ! C_plus_plus ) - { - outn( - "static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;" ); - outn( "static char *yy_full_match;" ); - outn( "static int yy_lp;" ); - } - - if ( variable_trailing_context_rules ) - { - if ( ! C_plus_plus ) - { - outn( - "static int yy_looking_for_trail_begin = 0;" ); - outn( "static int yy_full_lp;" ); - outn( "static int *yy_full_state;" ); - } - - out_hex( "#define YY_TRAILING_MASK 0x%x\n", - (unsigned int) YY_TRAILING_MASK ); - out_hex( "#define YY_TRAILING_HEAD_MASK 0x%x\n", - (unsigned int) YY_TRAILING_HEAD_MASK ); - } - - outn( "#define REJECT \\" ); - outn( "{ \\" ); /* } for vi */ - outn( - "*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \\" ); - outn( - "yy_cp = yy_full_match; /* restore poss. backed-over text */ \\" ); - - if ( variable_trailing_context_rules ) - { - outn( - "yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \\" ); - outn( - "yy_state_ptr = yy_full_state; /* restore orig. state */ \\" ); - outn( - "yy_current_state = *yy_state_ptr; /* restore curr. state */ \\" ); - } - - outn( "++yy_lp; \\" ); - outn( "goto find_rule; \\" ); - /* { for vi */ - outn( "}" ); - } - - else - { - outn( - "/* The intent behind this definition is that it'll catch" ); - outn( " * any uses of REJECT which flex missed." ); - outn( " */" ); - outn( "#define REJECT reject_used_but_not_detected" ); - } - - if ( yymore_used ) - { - if ( ! C_plus_plus ) - { - if ( yytext_is_array ) - { - indent_puts( "static int yy_more_offset = 0;" ); - indent_puts( - "static int yy_prev_more_offset = 0;" ); - } - else - { - indent_puts( "static int yy_more_flag = 0;" ); - indent_puts( "static int yy_more_len = 0;" ); - } - } - - if ( yytext_is_array ) - { - indent_puts( - "#define yymore() (yy_more_offset = yy_flex_strlen( yytext ))" ); - indent_puts( "#define YY_NEED_STRLEN" ); - indent_puts( "#define YY_MORE_ADJ 0" ); - indent_puts( "#define YY_RESTORE_YY_MORE_OFFSET \\" ); - indent_up(); - indent_puts( "{ \\" ); - indent_puts( "yy_more_offset = yy_prev_more_offset; \\" ); - indent_puts( "yyleng -= yy_more_offset; \\" ); - indent_puts( "}" ); - indent_down(); - } - else - { - indent_puts( "#define yymore() (yy_more_flag = 1)" ); - indent_puts( "#define YY_MORE_ADJ yy_more_len" ); - indent_puts( "#define YY_RESTORE_YY_MORE_OFFSET" ); - } - } - - else - { - indent_puts( "#define yymore() yymore_used_but_not_detected" ); - indent_puts( "#define YY_MORE_ADJ 0" ); - indent_puts( "#define YY_RESTORE_YY_MORE_OFFSET" ); - } - - if ( ! C_plus_plus ) - { - if ( yytext_is_array ) - { - outn( "#ifndef YYLMAX" ); - outn( "#define YYLMAX 8192" ); - outn( "#endif\n" ); - outn( "char yytext[YYLMAX];" ); - outn( "char *yytext_ptr;" ); - } - - else - outn( "char *yytext;" ); - } - - out( &action_array[defs1_offset] ); - - line_directive_out( stdout, 0 ); - - skelout(); - - if ( ! C_plus_plus ) - { - if ( use_read ) - { - outn( -"\tif ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \\" ); - outn( - "\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" );" ); - } - - else - { - outn( - "\tif ( yy_current_buffer->yy_is_interactive ) \\" ); - outn( "\t\t{ \\" ); - outn( "\t\tint c = '*', n; \\" ); - outn( "\t\tfor ( n = 0; n < max_size && \\" ); - outn( "\t\t\t (c = getc( yyin )) != EOF && c != '\\n'; ++n ) \\" ); - outn( "\t\t\tbuf[n] = (char) c; \\" ); - outn( "\t\tif ( c == '\\n' ) \\" ); - outn( "\t\t\tbuf[n++] = (char) c; \\" ); - outn( "\t\tif ( c == EOF && ferror( yyin ) ) \\" ); - outn( - "\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\" ); - outn( "\t\tresult = n; \\" ); - outn( "\t\t} \\" ); - outn( - "\telse if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \\" ); - outn( "\t\t && ferror( yyin ) ) \\" ); - outn( - "\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" );" ); - } - } - - skelout(); - - indent_puts( "#define YY_RULE_SETUP \\" ); - indent_up(); - if ( bol_needed ) - { - indent_puts( "if ( yyleng > 0 ) \\" ); - indent_up(); - indent_puts( "yy_current_buffer->yy_at_bol = \\" ); - indent_puts( "\t\t(yytext[yyleng - 1] == '\\n'); \\" ); - indent_down(); - } - indent_puts( "YY_USER_ACTION" ); - indent_down(); - - skelout(); - - /* Copy prolog to output file. */ - out( &action_array[prolog_offset] ); - - line_directive_out( stdout, 0 ); - - skelout(); - - set_indent( 2 ); - - if ( yymore_used && ! yytext_is_array ) - { - indent_puts( "yy_more_len = 0;" ); - indent_puts( "if ( yy_more_flag )" ); - indent_up(); - indent_puts( "{" ); - indent_puts( "yy_more_len = yy_c_buf_p - yytext_ptr;" ); - indent_puts( "yy_more_flag = 0;" ); - indent_puts( "}" ); - indent_down(); - } - - skelout(); - - gen_start_state(); - - /* Note, don't use any indentation. */ - outn( "yy_match:" ); - gen_next_match(); - - skelout(); - set_indent( 2 ); - gen_find_action(); - - skelout(); - if ( do_yylineno ) - { - indent_puts( "if ( yy_act != YY_END_OF_BUFFER )" ); - indent_up(); - indent_puts( "{" ); - indent_puts( "int yyl;" ); - indent_puts( "for ( yyl = 0; yyl < yyleng; ++yyl )" ); - indent_up(); - indent_puts( "if ( yytext[yyl] == '\\n' )" ); - indent_up(); - indent_puts( "++yylineno;" ); - indent_down(); - indent_down(); - indent_puts( "}" ); - indent_down(); - } - - skelout(); - if ( ddebug ) - { - indent_puts( "if ( yy_flex_debug )" ); - indent_up(); - - indent_puts( "{" ); - indent_puts( "if ( yy_act == 0 )" ); - indent_up(); - indent_puts( C_plus_plus ? - "cerr << \"--scanner backing up\\n\";" : - "fprintf( stderr, \"--scanner backing up\\n\" );" ); - indent_down(); - - do_indent(); - out_dec( "else if ( yy_act < %d )\n", num_rules ); - indent_up(); - - if ( C_plus_plus ) - { - indent_puts( - "cerr << \"--accepting rule at line \" << yy_rule_linenum[yy_act] <<" ); - indent_puts( - " \"(\\\"\" << yytext << \"\\\")\\n\";" ); - } - else - { - indent_puts( - "fprintf( stderr, \"--accepting rule at line %d (\\\"%s\\\")\\n\"," ); - - indent_puts( - " yy_rule_linenum[yy_act], yytext );" ); - } - - indent_down(); - - do_indent(); - out_dec( "else if ( yy_act == %d )\n", num_rules ); - indent_up(); - - if ( C_plus_plus ) - { - indent_puts( -"cerr << \"--accepting default rule (\\\"\" << yytext << \"\\\")\\n\";" ); - } - else - { - indent_puts( - "fprintf( stderr, \"--accepting default rule (\\\"%s\\\")\\n\"," ); - indent_puts( " yytext );" ); - } - - indent_down(); - - do_indent(); - out_dec( "else if ( yy_act == %d )\n", num_rules + 1 ); - indent_up(); - - indent_puts( C_plus_plus ? - "cerr << \"--(end of buffer or a NUL)\\n\";" : - "fprintf( stderr, \"--(end of buffer or a NUL)\\n\" );" ); - - indent_down(); - - do_indent(); - outn( "else" ); - indent_up(); - - if ( C_plus_plus ) - { - indent_puts( - "cerr << \"--EOF (start condition \" << YY_START << \")\\n\";" ); - } - else - { - indent_puts( - "fprintf( stderr, \"--EOF (start condition %d)\\n\", YY_START );" ); - } - - indent_down(); - - indent_puts( "}" ); - indent_down(); - } - - /* Copy actions to output file. */ - skelout(); - indent_up(); - gen_bu_action(); - out( &action_array[action_offset] ); - - line_directive_out( stdout, 0 ); - - /* generate cases for any missing EOF rules */ - for ( i = 1; i <= lastsc; ++i ) - if ( ! sceof[i] ) - { - do_indent(); - out_str( "case YY_STATE_EOF(%s):\n", scname[i] ); - did_eof_rule = true; - } - - if ( did_eof_rule ) - { - indent_up(); - indent_puts( "yyterminate();" ); - indent_down(); - } - - - /* Generate code for handling NUL's, if needed. */ - - /* First, deal with backing up and setting up yy_cp if the scanner - * finds that it should JAM on the NUL. - */ - skelout(); - set_indent( 4 ); - - if ( fullspd || fulltbl ) - indent_puts( "yy_cp = yy_c_buf_p;" ); - - else - { /* compressed table */ - if ( ! reject && ! interactive ) - { - /* Do the guaranteed-needed backing up to figure - * out the match. - */ - indent_puts( "yy_cp = yy_last_accepting_cpos;" ); - indent_puts( - "yy_current_state = yy_last_accepting_state;" ); - } - - else - /* Still need to initialize yy_cp, though - * yy_current_state was set up by - * yy_get_previous_state(). - */ - indent_puts( "yy_cp = yy_c_buf_p;" ); - } - - - /* Generate code for yy_get_previous_state(). */ - set_indent( 1 ); - skelout(); - - gen_start_state(); - - set_indent( 2 ); - skelout(); - gen_next_state( true ); - - set_indent( 1 ); - skelout(); - gen_NUL_trans(); - - skelout(); - if ( do_yylineno ) - { /* update yylineno inside of unput() */ - indent_puts( "if ( c == '\\n' )" ); - indent_up(); - indent_puts( "--yylineno;" ); - indent_down(); - } - - skelout(); - /* Update BOL and yylineno inside of input(). */ - if ( bol_needed ) - { - indent_puts( "yy_current_buffer->yy_at_bol = (c == '\\n');" ); - if ( do_yylineno ) - { - indent_puts( "if ( yy_current_buffer->yy_at_bol )" ); - indent_up(); - indent_puts( "++yylineno;" ); - indent_down(); - } - } - - else if ( do_yylineno ) - { - indent_puts( "if ( c == '\\n' )" ); - indent_up(); - indent_puts( "++yylineno;" ); - indent_down(); - } - - skelout(); - - /* Copy remainder of input to output. */ - - line_directive_out( stdout, 1 ); - - if ( sectnum == 3 ) - (void) flexscan(); /* copy remainder of input to output */ - } diff --git a/usr.bin/lex/initscan.c b/usr.bin/lex/initscan.c deleted file mode 100644 index 1ca9fa58d7cb..000000000000 --- a/usr.bin/lex/initscan.c +++ /dev/null @@ -1,3697 +0,0 @@ -#line 2 "scan.c" -/* A lexical scanner generated by flex */ - -/* Scanner skeleton version: - * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $ - */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 - -#include <stdio.h> - - -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus -#endif -#endif - - -#ifdef __cplusplus - -#include <stdlib.h> -#include <unistd.h> - -/* Use prototypes in function declarations. */ -#define YY_USE_PROTOS - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -#if __STDC__ - -#define YY_USE_PROTOS -#define YY_USE_CONST - -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ - -#ifdef __TURBOC__ - #pragma warn -rch - #pragma warn -use -#include <io.h> -#include <stdlib.h> -#define YY_USE_CONST -#define YY_USE_PROTOS -#endif - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - - -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* 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) - -/* 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 yyrestart( yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#define YY_BUF_SIZE 16384 - -typedef struct yy_buffer_state *YY_BUFFER_STATE; - -extern int yyleng; -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -/* The funky do-while in the following #define is used to turn the definition - * int a single C statement (which needs a semi-colon terminator). This - * avoids problems with code like: - * - * if ( condition_holds ) - * yyless( 5 ); - * else - * do_something_else(); - * - * Prior to using the do-while the compiler would get upset at the - * "else" because it interpreted the "if" statement as being all - * done when it reached the ';' after the yyless() call. - */ - -/* Return all but the first 'n' matched characters back to the input stream. */ - -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - *yy_cp = yy_hold_char; \ - YY_RESTORE_YY_MORE_OFFSET \ - yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext 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). - */ -typedef unsigned int yy_size_t; - - -struct yy_buffer_state - { - FILE *yy_input_file; - - 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; - - /* 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 yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - }; - -static YY_BUFFER_STATE yy_current_buffer = 0; - -/* 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". - */ -#define YY_CURRENT_BUFFER yy_current_buffer - - -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; - -static int yy_n_chars; /* number of characters read into yy_ch_buf */ - - -int yyleng; - -/* 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 yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart YY_PROTO(( FILE *input_file )); - -void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); -void yy_load_buffer_state YY_PROTO(( void )); -YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); -void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); -void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); -void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); -#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) - -YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); -YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); -YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); - -static void *yy_flex_alloc YY_PROTO(( yy_size_t )); -static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); -static void yy_flex_free YY_PROTO(( void * )); - -#define yy_new_buffer yy_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) - -typedef unsigned char YY_CHAR; -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; -typedef int yy_state_type; -extern char *yytext; -#define yytext_ptr yytext - -static yy_state_type yy_get_previous_state YY_PROTO(( void )); -static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); -static int yy_get_next_buffer YY_PROTO(( void )); -static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - yytext_ptr = yy_bp; \ - yyleng = (int) (yy_cp - yy_bp); \ - yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ - yy_c_buf_p = yy_cp; - -#define YY_NUM_RULES 165 -#define YY_END_OF_BUFFER 166 -static yyconst short int yy_accept[769] = - { 0, - 0, 0, 0, 0, 87, 87, 163, 163, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 166, 164, - 7, 18, 164, 16, 1, 17, 164, 164, 164, 164, - 15, 108, 100, 101, 108, 93, 108, 107, 108, 108, - 108, 107, 99, 89, 108, 108, 91, 92, 87, 88, - 87, 86, 85, 86, 86, 163, 163, 28, 29, 28, - 28, 28, 28, 28, 28, 31, 30, 32, 31, 113, - 109, 110, 112, 114, 141, 142, 141, 139, 138, 140, - - 115, 117, 115, 116, 115, 120, 120, 120, 120, 122, - 124, 122, 122, 122, 122, 123, 151, 155, 151, 154, - 156, 156, 152, 152, 152, 149, 150, 164, 82, 164, - 21, 22, 21, 20, 157, 159, 157, 160, 161, 147, - 147, 148, 147, 147, 147, 147, 147, 147, 147, 81, - 34, 33, 81, 81, 81, 81, 35, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 26, 23, 26, 24, - 7, 18, 0, 16, 1, 17, 0, 0, 0, 14, - 8, 0, 0, 0, 0, 4, 5, 0, 2, 15, - - 100, 101, 0, 0, 0, 95, 0, 0, 105, 105, - 0, 162, 162, 162, 94, 0, 99, 89, 0, 0, - 0, 91, 92, 104, 90, 0, 87, 88, 86, 85, - 85, 83, 84, 163, 163, 28, 29, 28, 28, 28, - 28, 31, 30, 32, 111, 112, 142, 138, 117, 0, - 118, 119, 124, 121, 151, 155, 0, 153, 0, 144, - 152, 152, 152, 0, 82, 0, 21, 22, 21, 19, - 157, 159, 158, 147, 147, 147, 148, 143, 147, 147, - 147, 34, 33, 0, 80, 0, 0, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - - 81, 81, 81, 36, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 0, 25, 24, 0, 14, 8, - 0, 12, 0, 0, 0, 0, 0, 4, 5, 0, - 6, 0, 96, 0, 97, 0, 0, 105, 105, 0, - 105, 105, 105, 162, 162, 0, 106, 90, 98, 0, - 104, 0, 83, 84, 28, 28, 28, 27, 28, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 152, 152, 143, 143, 147, 147, 0, 0, 81, - 81, 81, 81, 81, 44, 81, 81, 81, 49, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - - 81, 81, 81, 81, 81, 81, 81, 81, 0, 81, - 81, 81, 81, 0, 0, 0, 12, 0, 0, 0, - 0, 0, 0, 4, 5, 0, 105, 105, 105, 105, - 105, 105, 162, 0, 0, 28, 28, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 152, 152, 147, 147, 37, 38, 81, 81, 81, 81, - 81, 81, 81, 81, 50, 51, 81, 81, 81, 55, - 81, 81, 81, 81, 81, 81, 60, 81, 81, 81, - 81, 81, 81, 67, 0, 0, 0, 81, 81, 81, - 81, 0, 13, 0, 0, 0, 0, 0, 0, 105, - - 105, 105, 105, 105, 105, 0, 0, 28, 28, 137, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 152, 152, 147, 147, 39, 81, 41, 81, - 43, 81, 81, 81, 47, 81, 52, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 62, 81, 81, 65, - 81, 0, 0, 0, 0, 81, 81, 81, 81, 3, - 0, 0, 0, 0, 105, 105, 105, 0, 0, 28, - 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 145, 146, 145, 146, 81, 42, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - - 81, 78, 61, 81, 64, 81, 0, 0, 0, 0, - 81, 81, 69, 70, 0, 10, 0, 11, 0, 103, - 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 81, 81, 81, 45, 81, 48, - 81, 81, 81, 81, 77, 81, 59, 63, 66, 0, - 0, 0, 0, 79, 81, 0, 102, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, - 81, 81, 46, 81, 81, 56, 81, 81, 0, 0, - 0, 0, 68, 0, 9, 0, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 0, 81, 81, - - 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, - 136, 81, 81, 81, 81, 54, 81, 81, 0, 0, - 0, 0, 0, 0, 81, 81, 81, 53, 81, 58, - 0, 0, 0, 0, 0, 0, 81, 81, 81, 81, - 72, 0, 0, 0, 0, 73, 81, 81, 81, 81, - 71, 0, 75, 0, 81, 81, 81, 74, 76, 81, - 81, 81, 81, 81, 81, 57, 40, 0 - } ; - -static yyconst int yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 1, 5, 6, 7, 8, 1, 9, 10, - 10, 11, 12, 13, 14, 10, 15, 16, 16, 16, - 16, 16, 16, 16, 17, 18, 19, 20, 1, 21, - 22, 23, 10, 1, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 47, - 26, 27, 28, 29, 30, 1, 31, 32, 33, 34, - - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 47, 56, 57, 58, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 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 int yy_meta[59] = - { 0, - 1, 1, 2, 1, 3, 1, 1, 1, 4, 1, - 5, 6, 1, 7, 4, 8, 8, 8, 8, 1, - 1, 1, 1, 9, 10, 1, 11, 12, 1, 13, - 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 4, 1, 16 - } ; - -static yyconst short int yy_base[858] = - { 0, - 0, 58, 115, 172, 120, 129, 2712, 2711, 230, 2705, - 136, 141, 288, 0, 2683, 2682, 144, 151, 185, 191, - 178, 188, 344, 347, 375, 0, 125, 131, 147, 216, - 431, 434, 461, 0, 519, 0, 205, 349, 2710, 2716, - 353, 2716, 2706, 0, 360, 2716, 2705, 144, 570, 2696, - 0, 2716, 577, 2716, 2703, 2716, 438, 2716, 2684, 126, - 149, 427, 591, 2716, 2701, 141, 2682, 2716, 0, 2716, - 2699, 0, 2699, 2697, 155, 2696, 2716, 0, 2716, 2695, - 2716, 0, 2662, 2641, 2637, 0, 2692, 2716, 2690, 2716, - 2716, 2663, 0, 2716, 2716, 2716, 2688, 2716, 431, 2716, - - 2716, 2716, 2687, 2716, 567, 2716, 2669, 571, 164, 2716, - 2716, 2685, 0, 2667, 573, 2716, 0, 2716, 2683, 2716, - 573, 2674, 0, 2649, 2628, 2716, 2716, 222, 2716, 356, - 448, 2716, 450, 2667, 0, 2716, 2678, 2716, 0, 0, - 198, 2716, 2677, 2621, 2716, 2667, 0, 2642, 2621, 2716, - 2673, 2716, 2671, 2668, 2640, 2639, 2716, 544, 2639, 579, - 2634, 2635, 318, 0, 2623, 2631, 424, 562, 2614, 587, - 2629, 2613, 2618, 2626, 2629, 2604, 2716, 2716, 2653, 612, - 634, 2716, 2654, 0, 637, 2716, 2653, 600, 2616, 0, - 0, 641, 647, 651, 669, 0, 0, 453, 2716, 0, - - 672, 2716, 2651, 2597, 605, 2716, 2649, 2616, 620, 657, - 645, 2716, 662, 0, 2716, 2592, 688, 2716, 2646, 2592, - 2636, 2625, 2716, 0, 2716, 2610, 0, 2716, 0, 0, - 2642, 0, 0, 2640, 2716, 0, 2716, 0, 2602, 2598, - 745, 0, 2638, 2716, 2716, 0, 2716, 688, 2716, 773, - 2716, 2716, 2716, 2716, 0, 2716, 673, 2716, 0, 2716, - 0, 2599, 2595, 690, 2716, 698, 707, 2716, 709, 2716, - 0, 2716, 2716, 0, 596, 2579, 2716, 827, 0, 2596, - 2592, 2632, 2716, 2628, 2716, 2593, 2592, 0, 642, 2582, - 563, 2617, 2579, 620, 2578, 2577, 2583, 669, 2570, 2584, - - 2572, 0, 2569, 2716, 2570, 2571, 2579, 2582, 685, 125, - 2570, 2567, 2566, 688, 2608, 2716, 716, 2568, 0, 0, - 720, 2716, 2608, 884, 2562, 2559, 2569, 0, 0, 723, - 2716, 739, 2716, 805, 2716, 808, 2562, 787, 869, 876, - 930, 881, 973, 800, 0, 2548, 2716, 2716, 2716, 2570, - 0, 2559, 0, 0, 2568, 2557, 0, 2716, 0, 1009, - 2581, 678, 870, 871, 874, 879, 913, 992, 974, 1013, - 885, 2565, 2554, 0, 1067, 2563, 2552, 2546, 2545, 2557, - 2562, 2561, 2550, 2557, 0, 2554, 2537, 2556, 0, 2536, - 2543, 2533, 2548, 2568, 2537, 2549, 2544, 2542, 2541, 2532, - - 2539, 2540, 2538, 2539, 578, 2520, 2538, 2525, 860, 2526, - 2528, 2521, 2517, 2529, 817, 1044, 2716, 822, 1095, 914, - 2532, 2523, 2517, 0, 0, 2524, 1102, 1025, 1142, 2539, - 1028, 1163, 2716, 2513, 2521, 2523, 2507, 0, 2526, 1058, - 891, 1014, 1019, 894, 1038, 1080, 1072, 1086, 1083, 1081, - 2520, 2504, 2518, 2502, 2716, 2716, 2505, 2493, 2492, 2495, - 2507, 1148, 2507, 2492, 0, 0, 2492, 2493, 2507, 0, - 2525, 2490, 2498, 2522, 2485, 2495, 0, 2500, 2491, 2487, - 2479, 2479, 2483, 0, 875, 2494, 2481, 2494, 2480, 2475, - 2491, 2519, 2716, 920, 999, 2465, 2474, 2468, 2494, 2496, - - 1105, 1184, 1081, 902, 969, 2479, 2491, 2463, 2477, 2716, - 165, 1090, 1144, 1143, 1147, 1163, 1095, 1145, 1037, 1085, - 1150, 1173, 2461, 2475, 2459, 2473, 0, 2458, 0, 2460, - 0, 1165, 2454, 2469, 0, 2461, 0, 2471, 2410, 2414, - 2434, 2400, 2393, 2405, 2385, 2382, 0, 2383, 2335, 0, - 2335, 2330, 2326, 2309, 2278, 2259, 2269, 2268, 2256, 2297, - 1046, 2238, 2242, 2253, 1179, 1142, 1145, 2247, 2246, 0, - 0, 1191, 1192, 1172, 1201, 1202, 1204, 1205, 1206, 1207, - 1209, 1210, 1208, 0, 0, 0, 0, 2254, 0, 2221, - 2229, 2218, 2208, 2200, 2209, 2198, 2195, 2165, 2168, 2149, - - 2132, 0, 0, 2129, 0, 2139, 2143, 2134, 2124, 2137, - 2117, 2116, 0, 0, 1228, 2716, 1232, 2716, 2111, 2716, - 2117, 2716, 2115, 2114, 2108, 2107, 2106, 2103, 2102, 2098, - 2095, 2063, 2047, 1213, 2012, 1986, 1975, 0, 1954, 0, - 1947, 1950, 1941, 1945, 0, 1942, 0, 0, 0, 1938, - 1940, 1934, 1905, 0, 1872, 1234, 2716, 1888, 1882, 1881, - 1864, 1848, 1832, 1828, 1827, 1826, 1823, 1806, 1809, 1784, - 1787, 1772, 0, 1781, 1786, 0, 1766, 1767, 1759, 1744, - 1213, 1736, 0, 1236, 2716, 1245, 2716, 2716, 2716, 2716, - 2716, 2716, 2716, 2716, 2716, 2716, 2716, 1750, 1727, 1720, - - 1701, 1687, 1670, 1681, 1667, 1679, 1659, 689, 1658, 1671, - 2716, 1657, 1627, 1621, 1635, 0, 1603, 1596, 1595, 1608, - 1602, 1587, 1586, 1583, 1581, 1587, 1555, 0, 1547, 0, - 1527, 1507, 1520, 1503, 1483, 1482, 1485, 1443, 1440, 1228, - 2716, 1225, 1224, 1206, 1210, 2716, 1213, 1202, 1018, 948, - 2716, 945, 2716, 884, 780, 771, 779, 2716, 2716, 689, - 673, 581, 408, 318, 86, 0, 0, 2716, 1263, 1279, - 1295, 1311, 1327, 1343, 1359, 1375, 1391, 1407, 1423, 1439, - 1455, 1471, 1481, 1496, 1505, 1520, 1536, 1545, 1560, 1576, - 1592, 1608, 1624, 1634, 1649, 1659, 1674, 1690, 1706, 1718, - - 1728, 1743, 1759, 1775, 1791, 1807, 1817, 1832, 1843, 1236, - 1858, 1874, 1890, 1898, 1905, 1920, 1936, 1952, 1968, 1977, - 1985, 2001, 2017, 2033, 2049, 2065, 2081, 2097, 2113, 2123, - 2138, 2148, 2155, 2170, 2182, 2192, 2207, 2223, 2239, 2255, - 2265, 2280, 2291, 2306, 2322, 2338, 2354, 2364, 2373, 2388, - 2404, 2420, 2429, 2437, 2453, 2469, 2485 - } ; - -static yyconst short int yy_def[858] = - { 0, - 768, 768, 769, 769, 770, 771, 772, 772, 768, 9, - 773, 773, 768, 13, 774, 774, 775, 775, 776, 776, - 777, 777, 778, 778, 768, 25, 779, 779, 780, 780, - 781, 781, 768, 33, 768, 35, 782, 782, 768, 768, - 768, 768, 768, 783, 768, 768, 768, 768, 784, 768, - 785, 768, 768, 768, 768, 768, 768, 768, 768, 786, - 787, 788, 768, 768, 768, 768, 768, 768, 789, 768, - 789, 790, 791, 790, 790, 792, 768, 793, 768, 793, - 768, 794, 794, 794, 793, 795, 768, 768, 795, 768, - 768, 768, 796, 768, 768, 768, 768, 768, 768, 768, - - 768, 768, 768, 768, 787, 768, 768, 787, 797, 768, - 768, 768, 798, 768, 787, 768, 799, 768, 799, 768, - 800, 768, 801, 801, 801, 768, 768, 802, 768, 802, - 803, 768, 803, 768, 804, 768, 804, 768, 805, 806, - 806, 768, 806, 806, 768, 806, 807, 807, 807, 768, - 768, 768, 768, 808, 768, 768, 768, 809, 809, 809, - 809, 809, 809, 809, 809, 809, 809, 810, 809, 809, - 809, 809, 809, 809, 809, 809, 768, 768, 811, 768, - 768, 768, 768, 783, 768, 768, 768, 768, 768, 812, - 813, 768, 768, 768, 768, 814, 815, 816, 768, 785, - - 768, 768, 768, 768, 817, 768, 768, 768, 818, 818, - 819, 768, 768, 820, 768, 821, 768, 768, 768, 768, - 768, 768, 768, 822, 768, 768, 823, 768, 824, 825, - 825, 826, 827, 828, 768, 829, 768, 830, 830, 830, - 768, 831, 768, 768, 768, 832, 768, 768, 768, 833, - 768, 768, 768, 768, 834, 768, 835, 768, 835, 768, - 836, 836, 836, 837, 768, 837, 838, 768, 838, 768, - 839, 768, 768, 840, 840, 840, 768, 768, 841, 841, - 841, 768, 768, 842, 768, 768, 768, 843, 843, 843, - 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, - - 843, 843, 843, 768, 843, 843, 843, 843, 843, 843, - 843, 843, 843, 843, 844, 768, 768, 768, 845, 846, - 847, 768, 768, 768, 768, 768, 768, 848, 849, 850, - 768, 850, 768, 851, 768, 851, 768, 852, 852, 852, - 768, 852, 852, 768, 853, 854, 768, 768, 768, 768, - 855, 768, 826, 827, 830, 830, 241, 768, 241, 241, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 836, 836, 278, 278, 841, 841, 768, 768, 843, - 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, - 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, - - 843, 843, 843, 843, 843, 843, 843, 843, 768, 843, - 843, 843, 843, 768, 847, 847, 768, 847, 847, 768, - 768, 768, 768, 848, 849, 768, 341, 852, 343, 341, - 852, 343, 768, 768, 768, 830, 830, 360, 768, 833, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 836, 836, 841, 841, 768, 768, 843, 843, 843, 843, - 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, - 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, - 843, 843, 843, 843, 768, 768, 768, 843, 843, 843, - 843, 768, 768, 847, 847, 768, 768, 768, 768, 427, - - 852, 343, 852, 852, 852, 768, 768, 830, 830, 768, - 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 836, 836, 841, 841, 843, 843, 843, 843, - 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, - 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, - 843, 768, 768, 768, 768, 843, 843, 843, 843, 768, - 856, 768, 768, 768, 852, 852, 852, 768, 768, 830, - 830, 833, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 836, 836, 841, 841, 843, 843, 843, - 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, - - 843, 843, 843, 843, 843, 843, 768, 768, 768, 768, - 843, 843, 843, 843, 856, 768, 856, 768, 768, 768, - 768, 768, 833, 833, 833, 833, 833, 833, 833, 833, - 833, 833, 833, 833, 843, 843, 843, 843, 843, 843, - 843, 843, 843, 843, 843, 843, 843, 843, 843, 768, - 768, 768, 768, 843, 843, 857, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 833, 843, - 843, 843, 843, 843, 843, 843, 843, 843, 768, 768, - 768, 768, 843, 857, 768, 857, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 843, 843, - - 843, 843, 843, 843, 843, 768, 768, 768, 768, 768, - 768, 843, 843, 843, 843, 843, 843, 843, 768, 768, - 768, 768, 768, 768, 843, 843, 843, 843, 843, 843, - 768, 768, 768, 768, 768, 768, 843, 843, 843, 843, - 768, 768, 768, 768, 768, 768, 843, 843, 843, 843, - 768, 768, 768, 768, 843, 843, 843, 768, 768, 843, - 843, 843, 843, 843, 843, 843, 843, 0, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768 - } ; - -static yyconst short int yy_nxt[2775] = - { 0, - 40, 41, 42, 43, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 44, 44, 40, 40, 40, 40, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 40, 40, 40, 40, 45, - 46, 47, 40, 48, 40, 49, 40, 40, 40, 40, - 40, 40, 50, 40, 40, 40, 40, 40, 40, 40, - 40, 51, 51, 40, 40, 40, 40, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 40, 40, 40, 53, 54, 55, 56, - 767, 57, 70, 71, 58, 58, 58, 129, 130, 58, - 73, 70, 74, 129, 130, 59, 75, 87, 88, 89, - 60, 61, 87, 88, 89, 188, 96, 97, 224, 132, - 133, 210, 211, 96, 97, 404, 98, 134, 405, 99, - 99, 99, 99, 98, 213, 213, 99, 99, 99, 99, - 62, 58, 58, 63, 64, 65, 56, 252, 57, 66, - 40, 58, 58, 58, 439, 189, 58, 102, 103, 104, - 40, 252, 67, 102, 103, 104, 225, 60, 61, 275, - - 68, 100, 214, 107, 108, 276, 109, 178, 100, 179, - 232, 105, 233, 107, 108, 572, 109, 105, 132, 133, - 180, 180, 180, 180, 265, 266, 134, 62, 58, 58, - 78, 78, 79, 80, 78, 78, 78, 78, 78, 78, - 81, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 82, 82, 78, 78, 78, 78, 82, - 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 83, 82, 82, - 82, 82, 82, 82, 84, 78, 78, 78, 90, 90, - 40, 90, 90, 90, 90, 90, 90, 90, 91, 90, - - 91, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 92, 93, 93, 90, 90, 90, 90, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 90, 90, 90, 111, 112, 296, 111, - 112, 178, 766, 179, 181, 182, 183, 113, 265, 266, - 113, 185, 186, 187, 180, 180, 180, 180, 297, 114, - 115, 116, 114, 115, 116, 117, 117, 118, 119, 120, - 117, 117, 117, 121, 117, 117, 117, 117, 117, 122, - 117, 117, 117, 117, 117, 117, 117, 117, 123, 123, - - 117, 117, 117, 117, 123, 123, 123, 123, 123, 123, - 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, - 123, 123, 124, 123, 123, 123, 123, 123, 123, 125, - 126, 117, 127, 136, 137, 138, 136, 137, 138, 206, - 206, 207, 215, 215, 215, 215, 248, 248, 248, 248, - 268, 269, 268, 269, 300, 331, 332, 139, 301, 765, - 139, 140, 141, 142, 143, 140, 140, 140, 144, 140, - 140, 145, 140, 140, 140, 146, 140, 140, 140, 140, - 140, 140, 140, 140, 147, 147, 140, 140, 140, 140, - 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, - - 147, 147, 147, 147, 147, 147, 147, 147, 148, 147, - 147, 147, 147, 147, 147, 149, 140, 140, 140, 150, - 151, 152, 153, 154, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 155, 156, 150, 150, 150, - 157, 150, 150, 150, 150, 150, 150, 150, 150, 158, - 159, 160, 161, 162, 163, 164, 164, 165, 164, 164, - 166, 167, 168, 169, 170, 164, 171, 172, 164, 173, - 174, 175, 164, 176, 150, 150, 150, 191, 201, 202, - 203, 258, 213, 213, 204, 289, 213, 213, 213, 213, - 292, 290, 217, 218, 219, 383, 303, 275, 220, 259, - - 192, 188, 193, 276, 193, 221, 304, 335, 336, 293, - 193, 222, 384, 193, 194, 195, 480, 193, 196, 223, - 214, 306, 481, 197, 214, 198, 214, 317, 317, 317, - 317, 307, 764, 205, 308, 181, 182, 183, 185, 186, - 187, 189, 321, 322, 323, 339, 340, 205, 321, 322, - 323, 387, 321, 322, 323, 388, 324, 324, 324, 324, - 342, 342, 324, 324, 324, 324, 324, 324, 324, 324, - 321, 322, 323, 201, 202, 203, 341, 344, 344, 204, - 380, 258, 339, 340, 324, 324, 324, 324, 325, 217, - 218, 219, 265, 266, 381, 220, 326, 439, 343, 259, - - 265, 266, 221, 248, 248, 248, 248, 673, 222, 268, - 269, 268, 269, 327, 392, 402, 223, 409, 393, 440, - 410, 416, 417, 418, 403, 331, 332, 763, 205, 411, - 412, 317, 317, 317, 317, 419, 419, 419, 419, 721, - 413, 331, 332, 722, 205, 357, 357, 358, 359, 357, - 357, 357, 357, 357, 357, 360, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 357, 360, 360, - 357, 357, 357, 357, 360, 360, 360, 360, 360, 360, - 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, - 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, - - 357, 357, 357, 362, 363, 364, 365, 335, 336, 366, - 335, 336, 339, 340, 367, 212, 212, 762, 368, 493, - 494, 369, 761, 370, 417, 494, 371, 374, 374, 760, - 374, 374, 374, 374, 374, 374, 374, 375, 374, 374, - 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, - 375, 375, 374, 374, 374, 374, 375, 375, 375, 375, - 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, - 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, - 375, 375, 374, 374, 374, 420, 322, 323, 427, 439, - 439, 428, 428, 439, 339, 340, 431, 431, 439, 324, - - 324, 324, 324, 338, 439, 485, 339, 340, 486, 487, - 439, 441, 443, 439, 442, 420, 322, 323, 450, 552, - 759, 513, 493, 494, 516, 553, 444, 339, 340, 429, - 338, 338, 439, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 430, 430, 339, 340, 445, 338, 338, - 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, - 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, - 430, 430, 430, 430, 430, 338, 338, 338, 432, 432, - 432, 432, 758, 439, 339, 340, 432, 757, 339, 340, - - 495, 417, 418, 432, 432, 432, 432, 432, 432, 360, - 360, 439, 438, 360, 360, 360, 360, 360, 360, 448, - 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, - 360, 360, 439, 439, 360, 360, 360, 360, 439, 446, - 501, 501, 447, 504, 504, 416, 417, 418, 616, 617, - 339, 340, 638, 339, 340, 515, 439, 439, 449, 419, - 419, 419, 419, 514, 360, 360, 360, 375, 375, 580, - 375, 375, 375, 375, 375, 375, 375, 439, 375, 375, - 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, - 517, 439, 375, 375, 375, 375, 495, 417, 418, 439, - - 439, 511, 439, 512, 439, 439, 339, 340, 209, 439, - 419, 419, 419, 419, 439, 519, 520, 581, 518, 522, - 566, 566, 375, 375, 375, 500, 500, 573, 521, 578, - 339, 340, 500, 500, 500, 500, 500, 500, 500, 500, - 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, - 500, 500, 500, 500, 500, 500, 500, 502, 502, 502, - 502, 532, 439, 439, 439, 502, 439, 339, 340, 439, - 339, 340, 502, 502, 502, 502, 502, 502, 505, 505, - 505, 505, 439, 533, 582, 576, 505, 574, 579, 534, - 575, 439, 439, 505, 505, 505, 505, 505, 505, 567, - - 567, 567, 567, 590, 339, 340, 338, 567, 577, 583, - 439, 439, 625, 591, 567, 567, 567, 567, 567, 567, - 439, 439, 624, 439, 439, 439, 439, 439, 439, 439, - 616, 617, 439, 623, 616, 617, 685, 686, 685, 686, - 756, 628, 626, 632, 708, 755, 634, 685, 686, 302, - 302, 627, 629, 754, 753, 630, 631, 633, 752, 751, - 750, 709, 669, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 72, 72, 72, 72, 72, - - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 106, 106, 106, 106, 106, 106, 106, 106, 106, - - 106, 106, 106, 106, 106, 106, 106, 110, 110, 110, - 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 177, 177, 177, 177, 177, 177, 177, 184, 184, 184, - 184, 749, 748, 184, 184, 184, 190, 190, 190, 190, - - 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, - 190, 200, 200, 200, 200, 747, 746, 200, 200, 200, - 209, 745, 209, 209, 209, 209, 209, 209, 209, 209, - 209, 209, 209, 209, 209, 209, 212, 744, 212, 212, - 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, - 212, 212, 216, 216, 216, 743, 742, 216, 216, 216, - 227, 741, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 229, 740, 229, 229, - 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, - 229, 229, 230, 739, 230, 230, 230, 230, 230, 230, - - 230, 230, 230, 230, 230, 230, 230, 230, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 236, 738, 236, 236, 737, 236, - 236, 236, 736, 735, 236, 236, 734, 733, 732, 236, - 238, 238, 238, 238, 731, 730, 238, 238, 238, 242, - 729, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 246, 246, 246, 246, 728, - 727, 246, 246, 246, 251, 726, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 254, 725, 254, 254, 254, 254, 254, 254, 254, 254, - - 254, 724, 254, 254, 254, 254, 255, 723, 720, 719, - 255, 255, 255, 255, 718, 717, 255, 255, 257, 716, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 261, 261, 261, 261, 715, 714, - 261, 261, 261, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 267, - 267, 267, 267, 713, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 271, 712, 711, 271, 271, - 271, 271, 271, 271, 271, 710, 271, 271, 271, 271, - 271, 273, 707, 273, 273, 273, 273, 273, 273, 273, - - 273, 273, 273, 273, 273, 273, 273, 274, 706, 274, - 274, 705, 274, 274, 274, 704, 703, 274, 274, 702, - 701, 700, 274, 279, 279, 279, 279, 699, 698, 279, - 279, 279, 284, 697, 284, 284, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 284, 284, 288, 288, - 696, 288, 288, 695, 694, 693, 288, 288, 315, 692, - 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, - 315, 315, 315, 315, 319, 691, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 320, 690, 320, 320, 320, 320, 320, 320, 320, 320, - - 320, 320, 320, 320, 320, 320, 328, 328, 689, 688, - 328, 328, 328, 329, 329, 687, 683, 329, 329, 329, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 330, 330, 330, 330, 330, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 338, 682, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 681, 338, 338, 338, 338, 209, 680, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, - 209, 209, 209, 209, 345, 345, 679, 678, 677, 676, - 345, 346, 346, 346, 346, 675, 674, 346, 346, 346, - - 346, 351, 673, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 227, 672, 227, - 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 229, 671, 229, 229, 229, 229, 229, - 229, 229, 229, 229, 229, 229, 229, 229, 229, 230, - 670, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 353, 668, 353, 353, 353, - 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, - 353, 354, 667, 354, 354, 354, 354, 354, 354, 354, - 354, 354, 354, 354, 354, 354, 354, 234, 234, 234, - - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 236, 666, 236, 236, 665, 236, 236, - 236, 664, 663, 236, 236, 662, 661, 660, 236, 238, - 238, 238, 238, 659, 658, 238, 238, 238, 242, 657, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 246, 246, 246, 246, 656, 655, - 246, 246, 246, 361, 361, 654, 653, 652, 361, 361, - 255, 651, 650, 649, 255, 255, 255, 255, 648, 647, - 255, 255, 257, 646, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 261, 261, - - 261, 261, 645, 644, 261, 261, 261, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 267, 267, 267, 267, 643, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 271, - 642, 641, 271, 271, 271, 271, 271, 271, 271, 640, - 271, 271, 271, 271, 271, 274, 639, 274, 274, 638, - 274, 274, 274, 637, 636, 274, 274, 635, 622, 621, - 274, 279, 279, 279, 279, 620, 619, 279, 279, 279, - 284, 618, 284, 284, 284, 284, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 288, 288, 560, 288, - - 288, 614, 613, 612, 288, 288, 315, 611, 315, 315, - 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, - 315, 315, 319, 610, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 320, 609, - 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, - 320, 320, 320, 320, 415, 415, 415, 415, 415, 415, - 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, - 424, 424, 424, 424, 608, 607, 424, 424, 424, 425, - 425, 425, 425, 606, 605, 425, 425, 425, 330, 330, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - - 330, 330, 330, 330, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 338, 604, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 603, 338, 338, 338, 338, 433, 433, 602, 601, - 600, 599, 433, 346, 346, 346, 346, 598, 597, 346, - 346, 346, 346, 351, 596, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 615, - 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, - 615, 615, 615, 615, 615, 684, 684, 684, 684, 684, - 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, - - 684, 595, 594, 593, 592, 589, 588, 587, 586, 585, - 584, 571, 570, 569, 568, 565, 564, 563, 562, 561, - 560, 559, 558, 557, 556, 555, 554, 551, 550, 549, - 548, 547, 546, 545, 544, 543, 542, 541, 540, 539, - 538, 537, 536, 535, 531, 530, 529, 528, 527, 526, - 525, 524, 523, 510, 509, 508, 507, 506, 503, 499, - 498, 497, 496, 492, 491, 490, 489, 488, 484, 483, - 482, 479, 478, 477, 476, 475, 474, 473, 472, 471, - 470, 469, 468, 467, 466, 465, 464, 463, 462, 461, - 460, 459, 458, 457, 456, 455, 454, 453, 452, 451, - - 439, 437, 436, 435, 434, 347, 426, 423, 422, 421, - 322, 414, 316, 408, 407, 406, 401, 400, 399, 398, - 397, 396, 395, 394, 391, 390, 389, 386, 385, 382, - 379, 378, 285, 282, 377, 376, 278, 373, 372, 243, - 356, 355, 235, 231, 352, 350, 349, 348, 218, 347, - 337, 206, 333, 202, 318, 186, 182, 316, 314, 313, - 312, 311, 310, 309, 305, 299, 298, 295, 294, 291, - 287, 286, 285, 283, 282, 281, 280, 260, 278, 277, - 272, 270, 263, 262, 260, 256, 250, 253, 250, 249, - 247, 245, 244, 243, 241, 240, 239, 237, 235, 228, - - 231, 228, 226, 218, 208, 202, 199, 186, 182, 768, - 94, 94, 85, 77, 77, 39, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768 - } ; - -static yyconst short int yy_chk[2775] = - { 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, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, - 765, 3, 5, 5, 3, 3, 3, 27, 27, 3, - 6, 6, 6, 28, 28, 3, 6, 11, 11, 11, - 3, 3, 12, 12, 12, 48, 17, 17, 66, 29, - 29, 60, 60, 18, 18, 310, 17, 29, 310, 17, - 17, 17, 17, 18, 61, 61, 18, 18, 18, 18, - 3, 3, 3, 4, 4, 4, 4, 109, 4, 4, - 21, 4, 4, 4, 511, 48, 4, 19, 19, 19, - 22, 109, 4, 20, 20, 20, 66, 4, 4, 141, - - 4, 17, 61, 21, 21, 141, 21, 37, 18, 37, - 75, 19, 75, 22, 22, 511, 22, 20, 30, 30, - 37, 37, 37, 37, 128, 128, 30, 4, 4, 4, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 23, 23, 163, 24, - 24, 38, 764, 38, 41, 41, 41, 23, 130, 130, - 24, 45, 45, 45, 38, 38, 38, 38, 163, 23, - 23, 23, 24, 24, 24, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 31, 31, 31, 32, 32, 32, 57, - 57, 57, 62, 62, 62, 62, 99, 99, 99, 99, - 131, 131, 133, 133, 167, 198, 198, 31, 167, 763, - 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 49, 53, 53, - 53, 121, 105, 105, 53, 158, 108, 108, 115, 115, - 160, 158, 63, 63, 63, 291, 168, 275, 63, 121, - - 49, 188, 49, 275, 49, 63, 168, 205, 205, 160, - 49, 63, 291, 49, 49, 49, 405, 49, 49, 63, - 105, 170, 405, 49, 108, 49, 115, 180, 180, 180, - 180, 170, 762, 53, 170, 181, 181, 181, 185, 185, - 185, 188, 192, 192, 192, 209, 209, 63, 193, 193, - 193, 294, 194, 194, 194, 294, 192, 192, 192, 192, - 211, 211, 193, 193, 193, 193, 194, 194, 194, 194, - 195, 195, 195, 201, 201, 201, 210, 213, 213, 201, - 289, 257, 210, 210, 195, 195, 195, 195, 192, 217, - 217, 217, 264, 264, 289, 217, 194, 362, 211, 257, - - 266, 266, 217, 248, 248, 248, 248, 761, 217, 267, - 267, 269, 269, 195, 298, 309, 217, 314, 298, 362, - 314, 321, 321, 321, 309, 330, 330, 760, 201, 314, - 314, 317, 317, 317, 317, 321, 321, 321, 321, 708, - 314, 332, 332, 708, 217, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - - 241, 241, 241, 250, 250, 250, 250, 334, 334, 250, - 336, 336, 338, 338, 250, 344, 344, 757, 250, 415, - 415, 250, 756, 250, 418, 418, 250, 278, 278, 755, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 324, 324, 324, 339, 363, - 364, 340, 340, 365, 339, 339, 342, 342, 366, 324, - - 324, 324, 324, 340, 371, 409, 342, 342, 409, 409, - 441, 363, 365, 444, 364, 420, 420, 420, 371, 485, - 754, 441, 494, 494, 444, 485, 366, 504, 504, 340, - 341, 341, 367, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 367, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 343, 343, - 343, 343, 752, 369, 505, 505, 343, 750, 343, 343, - - 495, 495, 495, 343, 343, 343, 343, 343, 343, 360, - 360, 368, 360, 360, 360, 360, 360, 360, 360, 369, - 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, - 360, 360, 370, 442, 360, 360, 360, 360, 443, 368, - 428, 428, 368, 431, 431, 416, 416, 416, 561, 561, - 428, 428, 749, 431, 431, 443, 519, 445, 370, 416, - 416, 416, 416, 442, 360, 360, 360, 375, 375, 519, - 375, 375, 375, 375, 375, 375, 375, 440, 375, 375, - 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, - 445, 447, 375, 375, 375, 375, 419, 419, 419, 446, - - 450, 440, 449, 440, 520, 448, 503, 503, 503, 512, - 419, 419, 419, 419, 517, 447, 448, 520, 446, 450, - 501, 501, 375, 375, 375, 427, 427, 512, 449, 517, - 501, 501, 427, 427, 427, 427, 427, 427, 427, 427, - 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, - 427, 427, 427, 427, 427, 427, 427, 429, 429, 429, - 429, 462, 514, 513, 518, 429, 515, 566, 566, 521, - 567, 567, 429, 429, 429, 429, 429, 429, 432, 432, - 432, 432, 516, 462, 521, 515, 432, 513, 518, 462, - 514, 574, 522, 432, 432, 432, 432, 432, 432, 502, - - 502, 502, 502, 532, 565, 565, 565, 502, 516, 522, - 572, 573, 574, 532, 502, 502, 502, 502, 502, 502, - 575, 576, 573, 577, 578, 579, 580, 583, 581, 582, - 615, 615, 634, 572, 617, 617, 656, 656, 684, 684, - 748, 577, 575, 581, 681, 747, 583, 686, 686, 810, - 810, 576, 578, 745, 744, 579, 580, 582, 743, 742, - 740, 681, 634, 769, 769, 769, 769, 769, 769, 769, - 769, 769, 769, 769, 769, 769, 769, 769, 769, 770, - 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, - 770, 770, 770, 770, 770, 771, 771, 771, 771, 771, - - 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, - 771, 772, 772, 772, 772, 772, 772, 772, 772, 772, - 772, 772, 772, 772, 772, 772, 772, 773, 773, 773, - 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, - 773, 773, 773, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, 774, 775, - 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, - 775, 775, 775, 775, 775, 776, 776, 776, 776, 776, - 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, - 776, 777, 777, 777, 777, 777, 777, 777, 777, 777, - - 777, 777, 777, 777, 777, 777, 777, 778, 778, 778, - 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, - 778, 778, 778, 779, 779, 779, 779, 779, 779, 779, - 779, 779, 779, 779, 779, 779, 779, 779, 779, 780, - 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, - 780, 780, 780, 780, 780, 781, 781, 781, 781, 781, - 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, - 781, 782, 782, 782, 782, 782, 782, 782, 782, 782, - 782, 782, 782, 782, 782, 782, 782, 783, 783, 783, - 783, 739, 738, 783, 783, 783, 784, 784, 784, 784, - - 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, - 784, 785, 785, 785, 785, 737, 736, 785, 785, 785, - 786, 735, 786, 786, 786, 786, 786, 786, 786, 786, - 786, 786, 786, 786, 786, 786, 787, 734, 787, 787, - 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, - 787, 787, 788, 788, 788, 733, 732, 788, 788, 788, - 789, 731, 789, 789, 789, 789, 789, 789, 789, 789, - 789, 789, 789, 789, 789, 789, 790, 729, 790, 790, - 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, - 790, 790, 791, 727, 791, 791, 791, 791, 791, 791, - - 791, 791, 791, 791, 791, 791, 791, 791, 792, 792, - 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, - 792, 792, 792, 792, 793, 726, 793, 793, 725, 793, - 793, 793, 724, 723, 793, 793, 722, 721, 720, 793, - 794, 794, 794, 794, 719, 718, 794, 794, 794, 795, - 717, 795, 795, 795, 795, 795, 795, 795, 795, 795, - 795, 795, 795, 795, 795, 796, 796, 796, 796, 715, - 714, 796, 796, 796, 797, 713, 797, 797, 797, 797, - 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - 798, 712, 798, 798, 798, 798, 798, 798, 798, 798, - - 798, 710, 798, 798, 798, 798, 799, 709, 707, 706, - 799, 799, 799, 799, 705, 704, 799, 799, 800, 703, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 801, 801, 801, 801, 702, 701, - 801, 801, 801, 802, 802, 802, 802, 802, 802, 802, - 802, 802, 802, 802, 802, 802, 802, 802, 802, 803, - 803, 803, 803, 700, 803, 803, 803, 803, 803, 803, - 803, 803, 803, 803, 803, 804, 699, 698, 804, 804, - 804, 804, 804, 804, 804, 682, 804, 804, 804, 804, - 804, 805, 680, 805, 805, 805, 805, 805, 805, 805, - - 805, 805, 805, 805, 805, 805, 805, 806, 679, 806, - 806, 678, 806, 806, 806, 677, 675, 806, 806, 674, - 672, 671, 806, 807, 807, 807, 807, 670, 669, 807, - 807, 807, 808, 668, 808, 808, 808, 808, 808, 808, - 808, 808, 808, 808, 808, 808, 808, 808, 809, 809, - 667, 809, 809, 666, 665, 664, 809, 809, 811, 663, - 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, - 811, 811, 811, 811, 812, 662, 812, 812, 812, 812, - 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, - 813, 661, 813, 813, 813, 813, 813, 813, 813, 813, - - 813, 813, 813, 813, 813, 813, 814, 814, 660, 659, - 814, 814, 814, 815, 815, 658, 655, 815, 815, 815, - 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, - 816, 816, 816, 816, 816, 816, 817, 817, 817, 817, - 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, - 817, 817, 818, 653, 818, 818, 818, 818, 818, 818, - 818, 818, 818, 652, 818, 818, 818, 818, 819, 651, - 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, - 819, 819, 819, 819, 820, 820, 650, 646, 644, 643, - 820, 821, 821, 821, 821, 642, 641, 821, 821, 821, - - 821, 822, 639, 822, 822, 822, 822, 822, 822, 822, - 822, 822, 822, 822, 822, 822, 822, 823, 637, 823, - 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, - 823, 823, 823, 824, 636, 824, 824, 824, 824, 824, - 824, 824, 824, 824, 824, 824, 824, 824, 824, 825, - 635, 825, 825, 825, 825, 825, 825, 825, 825, 825, - 825, 825, 825, 825, 825, 826, 633, 826, 826, 826, - 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, - 826, 827, 632, 827, 827, 827, 827, 827, 827, 827, - 827, 827, 827, 827, 827, 827, 827, 828, 828, 828, - - 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, - 828, 828, 828, 829, 631, 829, 829, 630, 829, 829, - 829, 629, 628, 829, 829, 627, 626, 625, 829, 830, - 830, 830, 830, 624, 623, 830, 830, 830, 831, 621, - 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, - 831, 831, 831, 831, 832, 832, 832, 832, 619, 612, - 832, 832, 832, 833, 833, 611, 610, 609, 833, 833, - 834, 608, 607, 606, 834, 834, 834, 834, 604, 601, - 834, 834, 835, 600, 835, 835, 835, 835, 835, 835, - 835, 835, 835, 835, 835, 835, 835, 835, 836, 836, - - 836, 836, 599, 598, 836, 836, 836, 837, 837, 837, - 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, - 837, 837, 837, 838, 838, 838, 838, 597, 838, 838, - 838, 838, 838, 838, 838, 838, 838, 838, 838, 839, - 596, 595, 839, 839, 839, 839, 839, 839, 839, 594, - 839, 839, 839, 839, 839, 840, 593, 840, 840, 592, - 840, 840, 840, 591, 590, 840, 840, 588, 569, 568, - 840, 841, 841, 841, 841, 564, 563, 841, 841, 841, - 842, 562, 842, 842, 842, 842, 842, 842, 842, 842, - 842, 842, 842, 842, 842, 842, 843, 843, 560, 843, - - 843, 559, 558, 557, 843, 843, 844, 556, 844, 844, - 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, - 844, 844, 845, 555, 845, 845, 845, 845, 845, 845, - 845, 845, 845, 845, 845, 845, 845, 845, 846, 554, - 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, - 846, 846, 846, 846, 847, 847, 847, 847, 847, 847, - 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, - 848, 848, 848, 848, 553, 552, 848, 848, 848, 849, - 849, 849, 849, 551, 549, 849, 849, 849, 850, 850, - 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, - - 850, 850, 850, 850, 851, 851, 851, 851, 851, 851, - 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, - 852, 548, 852, 852, 852, 852, 852, 852, 852, 852, - 852, 546, 852, 852, 852, 852, 853, 853, 545, 544, - 543, 542, 853, 854, 854, 854, 854, 541, 540, 854, - 854, 854, 854, 855, 539, 855, 855, 855, 855, 855, - 855, 855, 855, 855, 855, 855, 855, 855, 855, 856, - 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, - 856, 856, 856, 856, 856, 857, 857, 857, 857, 857, - 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, - - 857, 538, 536, 534, 533, 530, 528, 526, 525, 524, - 523, 509, 508, 507, 506, 500, 499, 498, 497, 496, - 492, 491, 490, 489, 488, 487, 486, 483, 482, 481, - 480, 479, 478, 476, 475, 474, 473, 472, 471, 469, - 468, 467, 464, 463, 461, 460, 459, 458, 457, 454, - 453, 452, 451, 439, 437, 436, 435, 434, 430, 426, - 423, 422, 421, 414, 413, 412, 411, 410, 408, 407, - 406, 404, 403, 402, 401, 400, 399, 398, 397, 396, - 395, 394, 393, 392, 391, 390, 388, 387, 386, 384, - 383, 382, 381, 380, 379, 378, 377, 376, 373, 372, - - 361, 356, 355, 352, 350, 346, 337, 327, 326, 325, - 323, 318, 315, 313, 312, 311, 308, 307, 306, 305, - 303, 301, 300, 299, 297, 296, 295, 293, 292, 290, - 287, 286, 284, 282, 281, 280, 276, 263, 262, 243, - 240, 239, 234, 231, 226, 222, 221, 220, 219, 216, - 208, 207, 204, 203, 189, 187, 183, 179, 176, 175, - 174, 173, 172, 171, 169, 166, 165, 162, 161, 159, - 156, 155, 154, 153, 151, 149, 148, 146, 144, 143, - 137, 134, 125, 124, 122, 119, 114, 112, 107, 103, - 97, 92, 89, 87, 85, 84, 83, 80, 76, 74, - - 73, 71, 67, 65, 59, 55, 50, 47, 43, 39, - 16, 15, 10, 8, 7, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768 - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -/* 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 *yytext; -#line 1 "scan.l" -#define INITIAL 0 -/* scan.l - scanner for flex input */ -#line 4 "scan.l" -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* $Header: /home/daffy/u0/vern/flex/RCS/scan.l,v 2.56 95/04/24 12:17:19 vern Exp $ */ - -#include "flexdef.h" -#include "parse.h" - -#define ACTION_ECHO add_action( yytext ) -#define ACTION_IFDEF(def, should_define) \ - { \ - if ( should_define ) \ - action_define( def, 1 ); \ - } - -#define MARK_END_OF_PROLOG mark_prolog(); - -#define YY_DECL \ - int flexscan() - -#define RETURNCHAR \ - yylval = (unsigned char) yytext[0]; \ - return CHAR; - -#define RETURNNAME \ - strcpy( nmstr, yytext ); \ - return NAME; - -#define PUT_BACK_STRING(str, start) \ - for ( i = strlen( str ) - 1; i >= start; --i ) \ - unput((str)[i]) - -#define CHECK_REJECT(str) \ - if ( all_upper( str ) ) \ - reject = true; - -#define CHECK_YYMORE(str) \ - if ( all_lower( str ) ) \ - yymore_used = true; -#define YY_STACK_USED 1 -#define YY_NO_TOP_STATE 1 -#define SECT2 1 -#define SECT2PROLOG 2 -#define SECT3 3 -#define CODEBLOCK 4 -#define PICKUPDEF 5 -#define SC 6 -#define CARETISBOL 7 -#define NUM 8 -#define QUOTE 9 - -#define FIRSTCCL 10 -#define CCL 11 -#define ACTION 12 -#define RECOVER 13 -#define COMMENT 14 -#define ACTION_STRING 15 -#define PERCENT_BRACE_ACTION 16 - -#define OPTION 17 -#define LINEDIR 18 - -#line 1333 "scan.c" - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap YY_PROTO(( void )); -#else -extern int yywrap YY_PROTO(( void )); -#endif -#endif - -#ifndef YY_NO_UNPUT -static void yyunput YY_PROTO(( int c, char *buf_ptr )); -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen YY_PROTO(( yyconst char * )); -#endif - -#ifndef YY_NO_INPUT -#ifdef __cplusplus -static int yyinput YY_PROTO(( void )); -#else -static int input YY_PROTO(( void )); -#endif -#endif - -#if YY_STACK_USED -static int yy_start_stack_ptr = 0; -static int yy_start_stack_depth = 0; -static int *yy_start_stack = 0; -#ifndef YY_NO_PUSH_STATE -static void yy_push_state YY_PROTO(( int new_state )); -#endif -#ifndef YY_NO_POP_STATE -static void yy_pop_state YY_PROTO(( void )); -#endif -#ifndef YY_NO_TOP_STATE -static int yy_top_state YY_PROTO(( void )); -#endif - -#else -#define YY_NO_PUSH_STATE 1 -#define YY_NO_POP_STATE 1 -#define YY_NO_TOP_STATE 1 -#endif - -#ifdef YY_MALLOC_DECL -YY_MALLOC_DECL -#else -#if __STDC__ -#ifndef __cplusplus -#include <stdlib.h> -#endif -#else -/* Just try to get by without declaring the routines. This will fail - * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) - * or sizeof(void*) != sizeof(int). - */ -#endif -#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 -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) -#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) \ - if ( yy_current_buffer->yy_is_interactive ) \ - { \ - int c = '*', n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ - && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); -#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 -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL int yylex YY_PROTO(( void )) -#endif - -/* Code executed at the beginning of each rule, after yytext and yyleng - * 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 - -#define YY_RULE_SETUP \ - if ( yyleng > 0 ) \ - yy_current_buffer->yy_at_bol = \ - (yytext[yyleng - 1] == '\n'); \ - YY_USER_ACTION - -YY_DECL - { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -#line 94 "scan.l" - - static int bracelevel, didadef, indented_code; - static int doing_rule_action = false; - static int option_sense; - - int doing_codeblock = false; - int i; - Char nmdef[MAXLINE], myesc(); - - -#line 1498 "scan.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 ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! yy_current_buffer ) - yy_current_buffer = - yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_load_buffer_state(); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = yy_c_buf_p; - - /* Support of yytext. */ - *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; - - 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 >= 769 ) - 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_base[yy_current_state] != 2716 ); - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - if ( yy_act == 0 ) - { /* have to back up */ - yy_cp = yy_last_accepting_cpos; - yy_current_state = yy_last_accepting_state; - yy_act = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - - -do_action: /* This label is used only to access EOF actions. */ - - - switch ( yy_act ) - { /* beginning of action switch */ - 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: -YY_RULE_SETUP -#line 105 "scan.l" -indented_code = true; BEGIN(CODEBLOCK); - YY_BREAK -case 2: -YY_RULE_SETUP -#line 106 "scan.l" -ACTION_ECHO; yy_push_state( COMMENT ); - YY_BREAK -case 3: -YY_RULE_SETUP -#line 107 "scan.l" -yy_push_state( LINEDIR ); - YY_BREAK -case 4: -YY_RULE_SETUP -#line 108 "scan.l" -return SCDECL; - YY_BREAK -case 5: -YY_RULE_SETUP -#line 109 "scan.l" -return XSCDECL; - YY_BREAK -case 6: -YY_RULE_SETUP -#line 110 "scan.l" -{ - ++linenum; - line_directive_out( (FILE *) 0, 1 ); - indented_code = false; - BEGIN(CODEBLOCK); - } - YY_BREAK -case 7: -YY_RULE_SETUP -#line 117 "scan.l" -/* discard */ - YY_BREAK -case 8: -YY_RULE_SETUP -#line 119 "scan.l" -{ - sectnum = 2; - bracelevel = 0; - mark_defs1(); - line_directive_out( (FILE *) 0, 1 ); - BEGIN(SECT2PROLOG); - return SECTEND; - } - YY_BREAK -case 9: -YY_RULE_SETUP -#line 128 "scan.l" -yytext_is_array = false; ++linenum; - YY_BREAK -case 10: -YY_RULE_SETUP -#line 129 "scan.l" -yytext_is_array = true; ++linenum; - YY_BREAK -case 11: -YY_RULE_SETUP -#line 131 "scan.l" -BEGIN(OPTION); return OPTION_OP; - YY_BREAK -case 12: -YY_RULE_SETUP -#line 133 "scan.l" -++linenum; /* ignore */ - YY_BREAK -case 13: -YY_RULE_SETUP -#line 134 "scan.l" -++linenum; /* ignore */ - YY_BREAK -case 14: -YY_RULE_SETUP -#line 136 "scan.l" -synerr( _( "unrecognized '%' directive" ) ); - YY_BREAK -case 15: -YY_RULE_SETUP -#line 138 "scan.l" -{ - strcpy( nmstr, yytext ); - didadef = false; - BEGIN(PICKUPDEF); - } - YY_BREAK -case 16: -YY_RULE_SETUP -#line 144 "scan.l" -RETURNNAME; - YY_BREAK -case 17: -YY_RULE_SETUP -#line 145 "scan.l" -++linenum; /* allows blank lines in section 1 */ - YY_BREAK -case 18: -YY_RULE_SETUP -#line 146 "scan.l" -ACTION_ECHO; ++linenum; /* maybe end of comment line */ - YY_BREAK - - -case 19: -YY_RULE_SETUP -#line 151 "scan.l" -ACTION_ECHO; yy_pop_state(); - YY_BREAK -case 20: -YY_RULE_SETUP -#line 152 "scan.l" -ACTION_ECHO; - YY_BREAK -case 21: -YY_RULE_SETUP -#line 153 "scan.l" -ACTION_ECHO; - YY_BREAK -case 22: -YY_RULE_SETUP -#line 154 "scan.l" -++linenum; ACTION_ECHO; - YY_BREAK - - -case 23: -YY_RULE_SETUP -#line 158 "scan.l" -yy_pop_state(); - YY_BREAK -case 24: -YY_RULE_SETUP -#line 159 "scan.l" -linenum = myctoi( yytext ); - YY_BREAK -case 25: -YY_RULE_SETUP -#line 161 "scan.l" -{ - flex_free( (void *) infilename ); - infilename = copy_string( yytext + 1 ); - infilename[strlen( infilename ) - 1] = '\0'; - } - YY_BREAK -case 26: -YY_RULE_SETUP -#line 166 "scan.l" -/* ignore spurious characters */ - YY_BREAK - - -case 27: -YY_RULE_SETUP -#line 170 "scan.l" -++linenum; BEGIN(INITIAL); - YY_BREAK -case 28: -YY_RULE_SETUP -#line 172 "scan.l" -ACTION_ECHO; - YY_BREAK -case 29: -YY_RULE_SETUP -#line 174 "scan.l" -{ - ++linenum; - ACTION_ECHO; - if ( indented_code ) - BEGIN(INITIAL); - } - YY_BREAK - - -case 30: -YY_RULE_SETUP -#line 184 "scan.l" -/* separates name and definition */ - YY_BREAK -case 31: -YY_RULE_SETUP -#line 186 "scan.l" -{ - strcpy( (char *) nmdef, yytext ); - - /* Skip trailing whitespace. */ - for ( i = strlen( (char *) nmdef ) - 1; - i >= 0 && (nmdef[i] == ' ' || nmdef[i] == '\t'); - --i ) - ; - - nmdef[i + 1] = '\0'; - - ndinstal( nmstr, nmdef ); - didadef = true; - } - YY_BREAK -case 32: -YY_RULE_SETUP -#line 201 "scan.l" -{ - if ( ! didadef ) - synerr( _( "incomplete name definition" ) ); - BEGIN(INITIAL); - ++linenum; - } - YY_BREAK - - -case 33: -YY_RULE_SETUP -#line 211 "scan.l" -++linenum; BEGIN(INITIAL); - YY_BREAK -case 34: -YY_RULE_SETUP -#line 212 "scan.l" -option_sense = true; - YY_BREAK -case 35: -YY_RULE_SETUP -#line 214 "scan.l" -return '='; - YY_BREAK -case 36: -YY_RULE_SETUP -#line 216 "scan.l" -option_sense = ! option_sense; - YY_BREAK -case 37: -YY_RULE_SETUP -#line 218 "scan.l" -csize = option_sense ? 128 : 256; - YY_BREAK -case 38: -YY_RULE_SETUP -#line 219 "scan.l" -csize = option_sense ? 256 : 128; - YY_BREAK -case 39: -YY_RULE_SETUP -#line 221 "scan.l" -long_align = option_sense; - YY_BREAK -case 40: -YY_RULE_SETUP -#line 222 "scan.l" -{ - action_define( "YY_ALWAYS_INTERACTIVE", option_sense ); - } - YY_BREAK -case 41: -YY_RULE_SETUP -#line 225 "scan.l" -yytext_is_array = option_sense; - YY_BREAK -case 42: -YY_RULE_SETUP -#line 226 "scan.l" -backing_up_report = option_sense; - YY_BREAK -case 43: -YY_RULE_SETUP -#line 227 "scan.l" -interactive = ! option_sense; - YY_BREAK -case 44: -YY_RULE_SETUP -#line 228 "scan.l" -C_plus_plus = option_sense; - YY_BREAK -case 45: -YY_RULE_SETUP -#line 229 "scan.l" -caseins = ! option_sense; - YY_BREAK -case 46: -YY_RULE_SETUP -#line 230 "scan.l" -caseins = option_sense; - YY_BREAK -case 47: -YY_RULE_SETUP -#line 231 "scan.l" -ddebug = option_sense; - YY_BREAK -case 48: -YY_RULE_SETUP -#line 232 "scan.l" -spprdflt = ! option_sense; - YY_BREAK -case 49: -YY_RULE_SETUP -#line 233 "scan.l" -useecs = option_sense; - YY_BREAK -case 50: -YY_RULE_SETUP -#line 234 "scan.l" -{ - useecs = usemecs = false; - use_read = fullspd = true; - } - YY_BREAK -case 51: -YY_RULE_SETUP -#line 238 "scan.l" -{ - useecs = usemecs = false; - use_read = fulltbl = true; - } - YY_BREAK -case 52: -YY_RULE_SETUP -#line 242 "scan.l" -ACTION_IFDEF("YY_NO_INPUT", ! option_sense); - YY_BREAK -case 53: -YY_RULE_SETUP -#line 243 "scan.l" -interactive = option_sense; - YY_BREAK -case 54: -YY_RULE_SETUP -#line 244 "scan.l" -lex_compat = option_sense; - YY_BREAK -case 55: -YY_RULE_SETUP -#line 245 "scan.l" -{ - action_define( "YY_MAIN", option_sense ); - do_yywrap = ! option_sense; - } - YY_BREAK -case 56: -YY_RULE_SETUP -#line 249 "scan.l" -usemecs = option_sense; - YY_BREAK -case 57: -YY_RULE_SETUP -#line 250 "scan.l" -{ - action_define( "YY_NEVER_INTERACTIVE", option_sense ); - } - YY_BREAK -case 58: -YY_RULE_SETUP -#line 253 "scan.l" -performance_report += option_sense ? 1 : -1; - YY_BREAK -case 59: -YY_RULE_SETUP -#line 254 "scan.l" -yytext_is_array = ! option_sense; - YY_BREAK -case 60: -YY_RULE_SETUP -#line 255 "scan.l" -use_read = option_sense; - YY_BREAK -case 61: -YY_RULE_SETUP -#line 256 "scan.l" -reject_really_used = option_sense; - YY_BREAK -case 62: -YY_RULE_SETUP -#line 257 "scan.l" -action_define( "YY_STACK_USED", option_sense ); - YY_BREAK -case 63: -YY_RULE_SETUP -#line 258 "scan.l" -do_stdinit = option_sense; - YY_BREAK -case 64: -YY_RULE_SETUP -#line 259 "scan.l" -use_stdout = option_sense; - YY_BREAK -case 65: -YY_RULE_SETUP -#line 260 "scan.l" -ACTION_IFDEF("YY_NO_UNPUT", ! option_sense); - YY_BREAK -case 66: -YY_RULE_SETUP -#line 261 "scan.l" -printstats = option_sense; - YY_BREAK -case 67: -YY_RULE_SETUP -#line 262 "scan.l" -nowarn = ! option_sense; - YY_BREAK -case 68: -YY_RULE_SETUP -#line 263 "scan.l" -do_yylineno = option_sense; - YY_BREAK -case 69: -YY_RULE_SETUP -#line 264 "scan.l" -yymore_really_used = option_sense; - YY_BREAK -case 70: -YY_RULE_SETUP -#line 265 "scan.l" -do_yywrap = option_sense; - YY_BREAK -case 71: -YY_RULE_SETUP -#line 267 "scan.l" -ACTION_IFDEF("YY_NO_PUSH_STATE", ! option_sense); - YY_BREAK -case 72: -YY_RULE_SETUP -#line 268 "scan.l" -ACTION_IFDEF("YY_NO_POP_STATE", ! option_sense); - YY_BREAK -case 73: -YY_RULE_SETUP -#line 269 "scan.l" -ACTION_IFDEF("YY_NO_TOP_STATE", ! option_sense); - YY_BREAK -case 74: -YY_RULE_SETUP -#line 271 "scan.l" -ACTION_IFDEF("YY_NO_SCAN_BUFFER", ! option_sense); - YY_BREAK -case 75: -YY_RULE_SETUP -#line 272 "scan.l" -ACTION_IFDEF("YY_NO_SCAN_BYTES", ! option_sense); - YY_BREAK -case 76: -YY_RULE_SETUP -#line 273 "scan.l" -ACTION_IFDEF("YY_NO_SCAN_STRING", ! option_sense); - YY_BREAK -case 77: -YY_RULE_SETUP -#line 275 "scan.l" -return OPT_OUTFILE; - YY_BREAK -case 78: -YY_RULE_SETUP -#line 276 "scan.l" -return OPT_PREFIX; - YY_BREAK -case 79: -YY_RULE_SETUP -#line 277 "scan.l" -return OPT_YYCLASS; - YY_BREAK -case 80: -YY_RULE_SETUP -#line 279 "scan.l" -{ - strcpy( nmstr, yytext + 1 ); - nmstr[strlen( nmstr ) - 1] = '\0'; - return NAME; - } - YY_BREAK -case 81: -YY_RULE_SETUP -#line 285 "scan.l" -{ - format_synerr( _( "unrecognized %%option: %s" ), - yytext ); - BEGIN(RECOVER); - } - YY_BREAK - -case 82: -YY_RULE_SETUP -#line 292 "scan.l" -++linenum; BEGIN(INITIAL); - YY_BREAK - -case 83: -YY_RULE_SETUP -#line 296 "scan.l" -++bracelevel; yyless( 2 ); /* eat only %{ */ - YY_BREAK -case 84: -YY_RULE_SETUP -#line 297 "scan.l" ---bracelevel; yyless( 2 ); /* eat only %} */ - YY_BREAK -case 85: -YY_RULE_SETUP -#line 299 "scan.l" -ACTION_ECHO; /* indented code in prolog */ - YY_BREAK -case 86: -YY_RULE_SETUP -#line 301 "scan.l" -{ /* non-indented code */ - if ( bracelevel <= 0 ) - { /* not in %{ ... %} */ - yyless( 0 ); /* put it all back */ - yy_set_bol( 1 ); - mark_prolog(); - BEGIN(SECT2); - } - else - ACTION_ECHO; - } - YY_BREAK -case 87: -YY_RULE_SETUP -#line 313 "scan.l" -ACTION_ECHO; - YY_BREAK -case 88: -YY_RULE_SETUP -#line 314 "scan.l" -++linenum; ACTION_ECHO; - YY_BREAK -case YY_STATE_EOF(SECT2PROLOG): -#line 316 "scan.l" -{ - mark_prolog(); - sectnum = 0; - yyterminate(); /* to stop the parser */ - } - YY_BREAK - - -case 89: -YY_RULE_SETUP -#line 324 "scan.l" -++linenum; /* allow blank lines in section 2 */ - YY_BREAK -case 90: -YY_RULE_SETUP -#line 326 "scan.l" -{ - indented_code = false; - doing_codeblock = true; - bracelevel = 1; - BEGIN(PERCENT_BRACE_ACTION); - } - YY_BREAK -case 91: -YY_RULE_SETUP -#line 333 "scan.l" -BEGIN(SC); return '<'; - YY_BREAK -case 92: -YY_RULE_SETUP -#line 334 "scan.l" -return '^'; - YY_BREAK -case 93: -YY_RULE_SETUP -#line 335 "scan.l" -BEGIN(QUOTE); return '"'; - YY_BREAK -case 94: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp = yy_bp + 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 336 "scan.l" -BEGIN(NUM); return '{'; - YY_BREAK -case 95: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp = yy_bp + 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 337 "scan.l" -return '$'; - YY_BREAK -case 96: -YY_RULE_SETUP -#line 339 "scan.l" -{ - bracelevel = 1; - BEGIN(PERCENT_BRACE_ACTION); - - if ( in_rule ) - { - doing_rule_action = true; - in_rule = false; - return '\n'; - } - } - YY_BREAK -case 97: -YY_RULE_SETUP -#line 350 "scan.l" -continued_action = true; ++linenum; return '\n'; - YY_BREAK -case 98: -YY_RULE_SETUP -#line 352 "scan.l" -{ - yyless( yyleng - 2 ); /* put back '/', '*' */ - bracelevel = 0; - continued_action = false; - BEGIN(ACTION); - } - YY_BREAK -case 99: -YY_RULE_SETUP -#line 359 "scan.l" -/* allow indented rules */ - YY_BREAK -case 100: -YY_RULE_SETUP -#line 361 "scan.l" -{ - /* This rule is separate from the one below because - * otherwise we get variable trailing context, so - * we can't build the scanner using -{f,F}. - */ - bracelevel = 0; - continued_action = false; - BEGIN(ACTION); - - if ( in_rule ) - { - doing_rule_action = true; - in_rule = false; - return '\n'; - } - } - YY_BREAK -case 101: -YY_RULE_SETUP -#line 378 "scan.l" -{ - bracelevel = 0; - continued_action = false; - BEGIN(ACTION); - unput( '\n' ); /* so <ACTION> sees it */ - - if ( in_rule ) - { - doing_rule_action = true; - in_rule = false; - return '\n'; - } - } - YY_BREAK -case 102: -#line 393 "scan.l" -case 103: -YY_RULE_SETUP -#line 393 "scan.l" -return EOF_OP; - YY_BREAK -case 104: -YY_RULE_SETUP -#line 395 "scan.l" -{ - sectnum = 3; - BEGIN(SECT3); - yyterminate(); /* to stop the parser */ - } - YY_BREAK -case 105: -YY_RULE_SETUP -#line 401 "scan.l" -{ - int cclval; - - strcpy( nmstr, yytext ); - - /* Check to see if we've already encountered this - * ccl. - */ - if ( (cclval = ccllookup( (Char *) nmstr )) != 0 ) - { - if ( input() != ']' ) - synerr( _( "bad character class" ) ); - - yylval = cclval; - ++cclreuse; - return PREVCCL; - } - else - { - /* We fudge a bit. We know that this ccl will - * soon be numbered as lastccl + 1 by cclinit. - */ - cclinstal( (Char *) nmstr, lastccl + 1 ); - - /* Push back everything but the leading bracket - * so the ccl can be rescanned. - */ - yyless( 1 ); - - BEGIN(FIRSTCCL); - return '['; - } - } - YY_BREAK -case 106: -YY_RULE_SETUP -#line 435 "scan.l" -{ - register Char *nmdefptr; - Char *ndlookup(); - - strcpy( nmstr, yytext + 1 ); - nmstr[yyleng - 2] = '\0'; /* chop trailing brace */ - - if ( (nmdefptr = ndlookup( nmstr )) == 0 ) - format_synerr( - _( "undefined definition {%s}" ), - nmstr ); - - else - { /* push back name surrounded by ()'s */ - int len = strlen( (char *) nmdefptr ); - - if ( lex_compat || nmdefptr[0] == '^' || - (len > 0 && nmdefptr[len - 1] == '$') ) - { /* don't use ()'s after all */ - PUT_BACK_STRING((char *) nmdefptr, 0); - - if ( nmdefptr[0] == '^' ) - BEGIN(CARETISBOL); - } - - else - { - unput(')'); - PUT_BACK_STRING((char *) nmdefptr, 0); - unput('('); - } - } - } - YY_BREAK -case 107: -YY_RULE_SETUP -#line 469 "scan.l" -return (unsigned char) yytext[0]; - YY_BREAK -case 108: -YY_RULE_SETUP -#line 470 "scan.l" -RETURNCHAR; - YY_BREAK - - -case 109: -YY_RULE_SETUP -#line 475 "scan.l" -return (unsigned char) yytext[0]; - YY_BREAK -case 110: -YY_RULE_SETUP -#line 476 "scan.l" -BEGIN(SECT2); return '>'; - YY_BREAK -case 111: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp = yy_bp + 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 477 "scan.l" -BEGIN(CARETISBOL); return '>'; - YY_BREAK -case 112: -YY_RULE_SETUP -#line 478 "scan.l" -RETURNNAME; - YY_BREAK -case 113: -YY_RULE_SETUP -#line 479 "scan.l" -{ - format_synerr( _( "bad <start condition>: %s" ), - yytext ); - } - YY_BREAK - -case 114: -YY_RULE_SETUP -#line 485 "scan.l" -BEGIN(SECT2); return '^'; - YY_BREAK - -case 115: -YY_RULE_SETUP -#line 489 "scan.l" -RETURNCHAR; - YY_BREAK -case 116: -YY_RULE_SETUP -#line 490 "scan.l" -BEGIN(SECT2); return '"'; - YY_BREAK -case 117: -YY_RULE_SETUP -#line 492 "scan.l" -{ - synerr( _( "missing quote" ) ); - BEGIN(SECT2); - ++linenum; - return '"'; - } - YY_BREAK - - -case 118: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp = yy_bp + 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 502 "scan.l" -BEGIN(CCL); return '^'; - YY_BREAK -case 119: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp = yy_bp + 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 503 "scan.l" -return '^'; - YY_BREAK -case 120: -YY_RULE_SETUP -#line 504 "scan.l" -BEGIN(CCL); RETURNCHAR; - YY_BREAK - - -case 121: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp = yy_bp + 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 508 "scan.l" -return '-'; - YY_BREAK -case 122: -YY_RULE_SETUP -#line 509 "scan.l" -RETURNCHAR; - YY_BREAK -case 123: -YY_RULE_SETUP -#line 510 "scan.l" -BEGIN(SECT2); return ']'; - YY_BREAK -case 124: -YY_RULE_SETUP -#line 511 "scan.l" -{ - synerr( _( "bad character class" ) ); - BEGIN(SECT2); - return ']'; - } - YY_BREAK - - -case 125: -YY_RULE_SETUP -#line 519 "scan.l" -BEGIN(CCL); return CCE_ALNUM; - YY_BREAK -case 126: -YY_RULE_SETUP -#line 520 "scan.l" -BEGIN(CCL); return CCE_ALPHA; - YY_BREAK -case 127: -YY_RULE_SETUP -#line 521 "scan.l" -BEGIN(CCL); return CCE_BLANK; - YY_BREAK -case 128: -YY_RULE_SETUP -#line 522 "scan.l" -BEGIN(CCL); return CCE_CNTRL; - YY_BREAK -case 129: -YY_RULE_SETUP -#line 523 "scan.l" -BEGIN(CCL); return CCE_DIGIT; - YY_BREAK -case 130: -YY_RULE_SETUP -#line 524 "scan.l" -BEGIN(CCL); return CCE_GRAPH; - YY_BREAK -case 131: -YY_RULE_SETUP -#line 525 "scan.l" -BEGIN(CCL); return CCE_LOWER; - YY_BREAK -case 132: -YY_RULE_SETUP -#line 526 "scan.l" -BEGIN(CCL); return CCE_PRINT; - YY_BREAK -case 133: -YY_RULE_SETUP -#line 527 "scan.l" -BEGIN(CCL); return CCE_PUNCT; - YY_BREAK -case 134: -YY_RULE_SETUP -#line 528 "scan.l" -BEGIN(CCL); return CCE_SPACE; - YY_BREAK -case 135: -YY_RULE_SETUP -#line 529 "scan.l" -BEGIN(CCL); return CCE_UPPER; - YY_BREAK -case 136: -YY_RULE_SETUP -#line 530 "scan.l" -BEGIN(CCL); return CCE_XDIGIT; - YY_BREAK -case 137: -YY_RULE_SETUP -#line 531 "scan.l" -{ - format_synerr( - _( "bad character class expression: %s" ), - yytext ); - BEGIN(CCL); return CCE_ALNUM; - } - YY_BREAK - - -case 138: -YY_RULE_SETUP -#line 540 "scan.l" -{ - yylval = myctoi( yytext ); - return NUMBER; - } - YY_BREAK -case 139: -YY_RULE_SETUP -#line 545 "scan.l" -return ','; - YY_BREAK -case 140: -YY_RULE_SETUP -#line 546 "scan.l" -BEGIN(SECT2); return '}'; - YY_BREAK -case 141: -YY_RULE_SETUP -#line 548 "scan.l" -{ - synerr( _( "bad character inside {}'s" ) ); - BEGIN(SECT2); - return '}'; - } - YY_BREAK -case 142: -YY_RULE_SETUP -#line 554 "scan.l" -{ - synerr( _( "missing }" ) ); - BEGIN(SECT2); - ++linenum; - return '}'; - } - YY_BREAK - - -case 143: -YY_RULE_SETUP -#line 564 "scan.l" -bracelevel = 0; - YY_BREAK -case 144: -YY_RULE_SETUP -#line 566 "scan.l" -ACTION_ECHO; yy_push_state( COMMENT ); - YY_BREAK - -case 145: -YY_RULE_SETUP -#line 569 "scan.l" -{ - ACTION_ECHO; - CHECK_REJECT(yytext); - } - YY_BREAK -case 146: -YY_RULE_SETUP -#line 573 "scan.l" -{ - ACTION_ECHO; - CHECK_YYMORE(yytext); - } - YY_BREAK - -case 147: -YY_RULE_SETUP -#line 579 "scan.l" -ACTION_ECHO; - YY_BREAK -case 148: -YY_RULE_SETUP -#line 580 "scan.l" -{ - ++linenum; - ACTION_ECHO; - if ( bracelevel == 0 || - (doing_codeblock && indented_code) ) - { - if ( doing_rule_action ) - add_action( "\tYY_BREAK\n" ); - - doing_rule_action = doing_codeblock = false; - BEGIN(SECT2); - } - } - YY_BREAK - -/* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */ - -case 149: -YY_RULE_SETUP -#line 598 "scan.l" -ACTION_ECHO; ++bracelevel; - YY_BREAK -case 150: -YY_RULE_SETUP -#line 599 "scan.l" -ACTION_ECHO; --bracelevel; - YY_BREAK -case 151: -YY_RULE_SETUP -#line 600 "scan.l" -ACTION_ECHO; - YY_BREAK -case 152: -YY_RULE_SETUP -#line 601 "scan.l" -ACTION_ECHO; - YY_BREAK -case 153: -YY_RULE_SETUP -#line 602 "scan.l" -ACTION_ECHO; /* character constant */ - YY_BREAK -case 154: -YY_RULE_SETUP -#line 603 "scan.l" -ACTION_ECHO; BEGIN(ACTION_STRING); - YY_BREAK -case 155: -YY_RULE_SETUP -#line 604 "scan.l" -{ - ++linenum; - ACTION_ECHO; - if ( bracelevel == 0 ) - { - if ( doing_rule_action ) - add_action( "\tYY_BREAK\n" ); - - doing_rule_action = false; - BEGIN(SECT2); - } - } - YY_BREAK -case 156: -YY_RULE_SETUP -#line 616 "scan.l" -ACTION_ECHO; - YY_BREAK - - -case 157: -YY_RULE_SETUP -#line 620 "scan.l" -ACTION_ECHO; - YY_BREAK -case 158: -YY_RULE_SETUP -#line 621 "scan.l" -ACTION_ECHO; - YY_BREAK -case 159: -YY_RULE_SETUP -#line 622 "scan.l" -++linenum; ACTION_ECHO; - YY_BREAK -case 160: -YY_RULE_SETUP -#line 623 "scan.l" -ACTION_ECHO; BEGIN(ACTION); - YY_BREAK -case 161: -YY_RULE_SETUP -#line 624 "scan.l" -ACTION_ECHO; - YY_BREAK - -case YY_STATE_EOF(COMMENT): -case YY_STATE_EOF(ACTION): -case YY_STATE_EOF(ACTION_STRING): -#line 627 "scan.l" -{ - synerr( _( "EOF encountered inside an action" ) ); - yyterminate(); - } - YY_BREAK -case 162: -YY_RULE_SETUP -#line 633 "scan.l" -{ - yylval = myesc( (Char *) yytext ); - - if ( YY_START == FIRSTCCL ) - BEGIN(CCL); - - return CHAR; - } - YY_BREAK - -case 163: -YY_RULE_SETUP -#line 644 "scan.l" -ECHO; - YY_BREAK -case YY_STATE_EOF(SECT3): -#line 645 "scan.l" -sectnum = 0; yyterminate(); - YY_BREAK - -case 164: -YY_RULE_SETUP -#line 648 "scan.l" -format_synerr( _( "bad character: %s" ), yytext ); - YY_BREAK -case 165: -YY_RULE_SETUP -#line 650 "scan.l" -YY_FATAL_ERROR( "flex scanner jammed" ); - YY_BREAK -#line 2736 "scan.c" -case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(SECT2): -case YY_STATE_EOF(CODEBLOCK): -case YY_STATE_EOF(PICKUPDEF): -case YY_STATE_EOF(SC): -case YY_STATE_EOF(CARETISBOL): -case YY_STATE_EOF(NUM): -case YY_STATE_EOF(QUOTE): -case YY_STATE_EOF(FIRSTCCL): -case YY_STATE_EOF(CCL): -case YY_STATE_EOF(RECOVER): -case YY_STATE_EOF(PERCENT_BRACE_ACTION): -case YY_STATE_EOF(OPTION): -case YY_STATE_EOF(LINEDIR): - yyterminate(); - - 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->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 yyin at a new source and called - * yylex(). 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->yy_n_chars; - yy_current_buffer->yy_input_file = yyin; - yy_current_buffer->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->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 - { - yy_cp = yy_c_buf_p; - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - yy_did_buffer_switch_on_eof = 0; - - if ( yywrap() ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, 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->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 yylex */ - - -/* 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 - */ - -static int yy_get_next_buffer() - { - register char *dest = yy_current_buffer->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->yy_ch_buf[yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( yy_current_buffer->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->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->yy_n_chars = yy_n_chars = 0; - - else - { - int num_to_read = - yy_current_buffer->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ -#ifdef YY_USES_REJECT - YY_FATAL_ERROR( -"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); -#else - - /* 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. */ - yy_flex_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->yy_buf_size - - number_to_move - 1; -#endif - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), - yy_n_chars, num_to_read ); - - yy_current_buffer->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; - yyrestart( yyin ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - yy_n_chars += number_to_move; - yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; - yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; - - return ret_val; - } - - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - -static yy_state_type yy_get_previous_state() - { - register yy_state_type yy_current_state; - register char *yy_cp; - - 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 ) - { - 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 >= 769 ) - 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 ); - */ - -#ifdef YY_USE_PROTOS -static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) -#else -static yy_state_type yy_try_NUL_trans( yy_current_state ) -yy_state_type yy_current_state; -#endif - { - register int yy_is_jam; - 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 >= 769 ) - 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 == 768); - - return yy_is_jam ? 0 : yy_current_state; - } - - -#ifndef YY_NO_UNPUT -#ifdef YY_USE_PROTOS -static void yyunput( int c, register char *yy_bp ) -#else -static void yyunput( c, yy_bp ) -int c; -register char *yy_bp; -#endif - { - register char *yy_cp = yy_c_buf_p; - - /* undo effects of setting up yytext */ - *yy_cp = yy_hold_char; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - /* +2 for EOB chars. */ - register int number_to_move = yy_n_chars + 2; - register char *dest = &yy_current_buffer->yy_ch_buf[ - yy_current_buffer->yy_buf_size + 2]; - register char *source = - &yy_current_buffer->yy_ch_buf[number_to_move]; - - while ( source > yy_current_buffer->yy_ch_buf ) - *--dest = *--source; - - yy_cp += (int) (dest - source); - yy_bp += (int) (dest - source); - yy_current_buffer->yy_n_chars = - yy_n_chars = yy_current_buffer->yy_buf_size; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - *--yy_cp = (char) c; - - - yytext_ptr = yy_bp; - yy_hold_char = *yy_cp; - yy_c_buf_p = yy_cp; - } -#endif /* ifndef YY_NO_UNPUT */ - - -#ifdef __cplusplus -static int yyinput() -#else -static int input() -#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->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. */ - yyrestart( yyin ); - - /* fall through */ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap() ) - 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 yytext */ - yy_hold_char = *++yy_c_buf_p; - - yy_current_buffer->yy_at_bol = (c == '\n'); - - return c; - } - - -#ifdef YY_USE_PROTOS -void yyrestart( FILE *input_file ) -#else -void yyrestart( input_file ) -FILE *input_file; -#endif - { - if ( ! yy_current_buffer ) - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_init_buffer( yy_current_buffer, input_file ); - yy_load_buffer_state(); - } - - -#ifdef YY_USE_PROTOS -void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -#else -void yy_switch_to_buffer( new_buffer ) -YY_BUFFER_STATE new_buffer; -#endif - { - 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->yy_buf_pos = yy_c_buf_p; - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - yy_current_buffer = new_buffer; - yy_load_buffer_state(); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yy_did_buffer_switch_on_eof = 1; - } - - -#ifdef YY_USE_PROTOS -void yy_load_buffer_state( void ) -#else -void yy_load_buffer_state() -#endif - { - yy_n_chars = yy_current_buffer->yy_n_chars; - yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; - yyin = yy_current_buffer->yy_input_file; - yy_hold_char = *yy_c_buf_p; - } - - -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) -#else -YY_BUFFER_STATE yy_create_buffer( file, size ) -FILE *file; -int size; -#endif - { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_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 *) yy_flex_alloc( b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer( b, file ); - - return b; - } - - -#ifdef YY_USE_PROTOS -void yy_delete_buffer( YY_BUFFER_STATE b ) -#else -void yy_delete_buffer( b ) -YY_BUFFER_STATE b; -#endif - { - if ( ! b ) - return; - - if ( b == yy_current_buffer ) - yy_current_buffer = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yy_flex_free( (void *) b->yy_ch_buf ); - - yy_flex_free( (void *) b ); - } - - -#ifndef YY_ALWAYS_INTERACTIVE -#ifndef YY_NEVER_INTERACTIVE -extern int isatty YY_PROTO(( int )); -#endif -#endif - -#ifdef YY_USE_PROTOS -void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) -#else -void yy_init_buffer( b, file ) -YY_BUFFER_STATE b; -FILE *file; -#endif - - - { - yy_flush_buffer( b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - -#if YY_ALWAYS_INTERACTIVE - b->yy_is_interactive = 1; -#else -#if YY_NEVER_INTERACTIVE - b->yy_is_interactive = 0; -#else - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; -#endif -#endif - } - - -#ifdef YY_USE_PROTOS -void yy_flush_buffer( YY_BUFFER_STATE b ) -#else -void yy_flush_buffer( b ) -YY_BUFFER_STATE b; -#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 ) - yy_load_buffer_state(); - } - - -#ifndef YY_NO_SCAN_BUFFER -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) -#else -YY_BUFFER_STATE yy_scan_buffer( base, size ) -char *base; -yy_size_t size; -#endif - { - 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) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_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; - - yy_switch_to_buffer( b ); - - return b; - } -#endif - - -#ifndef YY_NO_SCAN_STRING -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) -#else -YY_BUFFER_STATE yy_scan_string( yy_str ) -yyconst char *yy_str; -#endif - { - int len; - for ( len = 0; yy_str[len]; ++len ) - ; - - return yy_scan_bytes( yy_str, len ); - } -#endif - - -#ifndef YY_NO_SCAN_BYTES -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) -#else -YY_BUFFER_STATE yy_scan_bytes( bytes, len ) -yyconst char *bytes; -int len; -#endif - { - 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 *) yy_flex_alloc( n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < len; ++i ) - buf[i] = bytes[i]; - - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer( buf, n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_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_NO_PUSH_STATE -#ifdef YY_USE_PROTOS -static void yy_push_state( int new_state ) -#else -static void yy_push_state( new_state ) -int new_state; -#endif - { - if ( yy_start_stack_ptr >= yy_start_stack_depth ) - { - yy_size_t new_size; - - yy_start_stack_depth += YY_START_STACK_INCR; - new_size = yy_start_stack_depth * sizeof( int ); - - if ( ! yy_start_stack ) - yy_start_stack = (int *) yy_flex_alloc( new_size ); - - else - yy_start_stack = (int *) yy_flex_realloc( - (void *) yy_start_stack, new_size ); - - if ( ! yy_start_stack ) - YY_FATAL_ERROR( - "out of memory expanding start-condition stack" ); - } - - yy_start_stack[yy_start_stack_ptr++] = YY_START; - - BEGIN(new_state); - } -#endif - - -#ifndef YY_NO_POP_STATE -static void yy_pop_state() - { - if ( --yy_start_stack_ptr < 0 ) - YY_FATAL_ERROR( "start-condition stack underflow" ); - - BEGIN(yy_start_stack[yy_start_stack_ptr]); - } -#endif - - -#ifndef YY_NO_TOP_STATE -static int yy_top_state() - { - return yy_start_stack[yy_start_stack_ptr - 1]; - } -#endif - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -#ifdef YY_USE_PROTOS -static void yy_fatal_error( yyconst char msg[] ) -#else -static void yy_fatal_error( msg ) -char msg[]; -#endif - { - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); - } - - - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - yytext[yyleng] = yy_hold_char; \ - yy_c_buf_p = yytext + n; \ - yy_hold_char = *yy_c_buf_p; \ - *yy_c_buf_p = '\0'; \ - yyleng = n; \ - } \ - while ( 0 ) - - -/* Internal utility routines. */ - -#ifndef yytext_ptr -#ifdef YY_USE_PROTOS -static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) -#else -static void yy_flex_strncpy( s1, s2, n ) -char *s1; -yyconst char *s2; -int n; -#endif - { - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; - } -#endif - -#ifdef YY_NEED_STRLEN -#ifdef YY_USE_PROTOS -static int yy_flex_strlen( yyconst char *s ) -#else -static int yy_flex_strlen( s ) -yyconst char *s; -#endif - { - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; - } -#endif - - -#ifdef YY_USE_PROTOS -static void *yy_flex_alloc( yy_size_t size ) -#else -static void *yy_flex_alloc( size ) -yy_size_t size; -#endif - { - return (void *) malloc( size ); - } - -#ifdef YY_USE_PROTOS -static void *yy_flex_realloc( void *ptr, yy_size_t size ) -#else -static void *yy_flex_realloc( ptr, size ) -void *ptr; -yy_size_t size; -#endif - { - /* 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 ); - } - -#ifdef YY_USE_PROTOS -static void yy_flex_free( void *ptr ) -#else -static void yy_flex_free( ptr ) -void *ptr; -#endif - { - free( ptr ); - } - -#if YY_MAIN -int main() - { - yylex(); - return 0; - } -#endif -#line 650 "scan.l" - - - -int yywrap() - { - if ( --num_input_files > 0 ) - { - set_input_file( *++input_files ); - return 0; - } - - else - return 1; - } - - -/* set_input_file - open the given file (if NULL, stdin) for scanning */ - -void set_input_file( file ) -char *file; - { - if ( file && strcmp( file, "-" ) ) - { - infilename = copy_string( file ); - yyin = fopen( infilename, "r" ); - - if ( yyin == NULL ) - lerrsf( _( "can't open %s" ), file ); - } - - else - { - yyin = stdin; - infilename = copy_string( "<stdin>" ); - } - - linenum = 1; - } - - -/* Wrapper routines for accessing the scanner's malloc routines. */ - -void *flex_alloc( size ) -size_t size; - { - return (void *) malloc( size ); - } - -void *flex_realloc( ptr, size ) -void *ptr; -size_t size; - { - return (void *) realloc( ptr, size ); - } - -void flex_free( ptr ) -void *ptr; - { - if ( ptr ) - free( ptr ); - } diff --git a/usr.bin/lex/lex.1 b/usr.bin/lex/lex.1 deleted file mode 100644 index f79a3ef409e5..000000000000 --- a/usr.bin/lex/lex.1 +++ /dev/null @@ -1,4060 +0,0 @@ -.TH FLEX 1 "April 1995" "Version 2.5" -.SH NAME -flex \- fast lexical analyzer generator -.SH SYNOPSIS -.B flex -.B [\-bcdfhilnpstvwBFILTV78+? \-C[aefFmr] \-ooutput \-Pprefix \-Sskeleton] -.B [\-\-help \-\-version] -.I [filename ...] -.SH OVERVIEW -This manual describes -.I flex, -a tool for generating programs that perform pattern-matching on text. The -manual includes both tutorial and reference sections: -.nf - - Description - a brief overview of the tool - - Some Simple Examples - - Format Of The Input File - - Patterns - the extended regular expressions used by flex - - How The Input Is Matched - the rules for determining what has been matched - - Actions - how to specify what to do when a pattern is matched - - The Generated Scanner - details regarding the scanner that flex produces; - how to control the input source - - Start Conditions - introducing context into your scanners, and - managing "mini-scanners" - - Multiple Input Buffers - how to manipulate multiple input sources; how to - scan from strings instead of files - - End-of-file Rules - special rules for matching the end of the input - - Miscellaneous Macros - a summary of macros available to the actions - - Values Available To The User - a summary of values available to the actions - - Interfacing With Yacc - connecting flex scanners together with yacc parsers - - Options - flex command-line options, and the "%option" - directive - - Performance Considerations - how to make your scanner go as fast as possible - - Generating C++ Scanners - the (experimental) facility for generating C++ - scanner classes - - Incompatibilities With Lex And POSIX - how flex differs from AT&T lex and the POSIX lex - standard - - Diagnostics - those error messages produced by flex (or scanners - it generates) whose meanings might not be apparent - - Files - files used by flex - - Deficiencies / Bugs - known problems with flex - - See Also - other documentation, related tools - - Author - includes contact information - -.fi -.SH DESCRIPTION -.I flex -is a tool for generating -.I scanners: -programs which recognized lexical patterns in text. -.I flex -reads -the given input files, or its standard input if no file names are given, -for a description of a scanner to generate. The description is in -the form of pairs -of regular expressions and C code, called -.I rules. flex -generates as output a C source file, -.B lex.yy.c, -which defines a routine -.B yylex(). -This file is compiled and linked with the -.B \-lfl -library to produce an executable. When the executable is run, -it analyzes its input for occurrences -of the regular expressions. Whenever it finds one, it executes -the corresponding C code. -.SH SOME SIMPLE EXAMPLES -.PP -First some simple examples to get the flavor of how one uses -.I flex. -The following -.I flex -input specifies a scanner which whenever it encounters the string -"username" will replace it with the user's login name: -.nf - - %% - username printf( "%s", getlogin() ); - -.fi -By default, any text not matched by a -.I flex -scanner -is copied to the output, so the net effect of this scanner is -to copy its input file to its output with each occurrence -of "username" expanded. -In this input, there is just one rule. "username" is the -.I pattern -and the "printf" is the -.I action. -The "%%" marks the beginning of the rules. -.PP -Here's another simple example: -.nf - - int num_lines = 0, num_chars = 0; - - %% - \\n ++num_lines; ++num_chars; - . ++num_chars; - - %% - main() - { - yylex(); - printf( "# of lines = %d, # of chars = %d\\n", - num_lines, num_chars ); - } - -.fi -This scanner counts the number of characters and the number -of lines in its input (it produces no output other than the -final report on the counts). The first line -declares two globals, "num_lines" and "num_chars", which are accessible -both inside -.B yylex() -and in the -.B main() -routine declared after the second "%%". There are two rules, one -which matches a newline ("\\n") and increments both the line count and -the character count, and one which matches any character other than -a newline (indicated by the "." regular expression). -.PP -A somewhat more complicated example: -.nf - - /* scanner for a toy Pascal-like language */ - - %{ - /* need this for the call to atof() below */ - #include <math.h> - %} - - DIGIT [0-9] - ID [a-z][a-z0-9]* - - %% - - {DIGIT}+ { - printf( "An integer: %s (%d)\\n", yytext, - atoi( yytext ) ); - } - - {DIGIT}+"."{DIGIT}* { - printf( "A float: %s (%g)\\n", yytext, - atof( yytext ) ); - } - - if|then|begin|end|procedure|function { - printf( "A keyword: %s\\n", yytext ); - } - - {ID} printf( "An identifier: %s\\n", yytext ); - - "+"|"-"|"*"|"/" printf( "An operator: %s\\n", yytext ); - - "{"[^}\\n]*"}" /* eat up one-line comments */ - - [ \\t\\n]+ /* eat up whitespace */ - - . printf( "Unrecognized character: %s\\n", yytext ); - - %% - - main( argc, argv ) - int argc; - char **argv; - { - ++argv, --argc; /* skip over program name */ - if ( argc > 0 ) - yyin = fopen( argv[0], "r" ); - else - yyin = stdin; - - yylex(); - } - -.fi -This is the beginnings of a simple scanner for a language like -Pascal. It identifies different types of -.I tokens -and reports on what it has seen. -.PP -The details of this example will be explained in the following -sections. -.SH FORMAT OF THE INPUT FILE -The -.I flex -input file consists of three sections, separated by a line with just -.B %% -in it: -.nf - - definitions - %% - rules - %% - user code - -.fi -The -.I definitions -section contains declarations of simple -.I name -definitions to simplify the scanner specification, and declarations of -.I start conditions, -which are explained in a later section. -.PP -Name definitions have the form: -.nf - - name definition - -.fi -The "name" is a word beginning with a letter or an underscore ('_') -followed by zero or more letters, digits, '_', or '-' (dash). -The definition is taken to begin at the first non-white-space character -following the name and continuing to the end of the line. -The definition can subsequently be referred to using "{name}", which -will expand to "(definition)". For example, -.nf - - DIGIT [0-9] - ID [a-z][a-z0-9]* - -.fi -defines "DIGIT" to be a regular expression which matches a -single digit, and -"ID" to be a regular expression which matches a letter -followed by zero-or-more letters-or-digits. -A subsequent reference to -.nf - - {DIGIT}+"."{DIGIT}* - -.fi -is identical to -.nf - - ([0-9])+"."([0-9])* - -.fi -and matches one-or-more digits followed by a '.' followed -by zero-or-more digits. -.PP -The -.I rules -section of the -.I flex -input contains a series of rules of the form: -.nf - - pattern action - -.fi -where the pattern must be unindented and the action must begin -on the same line. -.PP -See below for a further description of patterns and actions. -.PP -Finally, the user code section is simply copied to -.B lex.yy.c -verbatim. -It is used for companion routines which call or are called -by the scanner. The presence of this section is optional; -if it is missing, the second -.B %% -in the input file may be skipped, too. -.PP -In the definitions and rules sections, any -.I indented -text or text enclosed in -.B %{ -and -.B %} -is copied verbatim to the output (with the %{}'s removed). -The %{}'s must appear unindented on lines by themselves. -.PP -In the rules section, -any indented or %{} text appearing before the -first rule may be used to declare variables -which are local to the scanning routine and (after the declarations) -code which is to be executed whenever the scanning routine is entered. -Other indented or %{} text in the rule section is still copied to the output, -but its meaning is not well-defined and it may well cause compile-time -errors (this feature is present for -.I POSIX -compliance; see below for other such features). -.PP -In the definitions section (but not in the rules section), -an unindented comment (i.e., a line -beginning with "/*") is also copied verbatim to the output up -to the next "*/". -.SH PATTERNS -The patterns in the input are written using an extended set of regular -expressions. These are: -.nf - - x match the character 'x' - . any character (byte) except newline - [xyz] a "character class"; in this case, the pattern - matches either an 'x', a 'y', or a 'z' - [abj-oZ] a "character class" with a range in it; matches - an 'a', a 'b', any letter from 'j' through 'o', - or a 'Z' - [^A-Z] a "negated character class", i.e., any character - but those in the class. In this case, any - character EXCEPT an uppercase letter. - [^A-Z\\n] any character EXCEPT an uppercase letter or - a newline - r* zero or more r's, where r is any regular expression - r+ one or more r's - r? zero or one r's (that is, "an optional r") - r{2,5} anywhere from two to five r's - r{2,} two or more r's - r{4} exactly 4 r's - {name} the expansion of the "name" definition - (see above) - "[xyz]\\"foo" - the literal string: [xyz]"foo - \\X if X is an 'a', 'b', 'f', 'n', 'r', 't', or 'v', - then the ANSI-C interpretation of \\x. - Otherwise, a literal 'X' (used to escape - operators such as '*') - \\0 a NUL character (ASCII code 0) - \\123 the character with octal value 123 - \\x2a the character with hexadecimal value 2a - (r) match an r; parentheses are used to override - precedence (see below) - - - rs the regular expression r followed by the - regular expression s; called "concatenation" - - - r|s either an r or an s - - - r/s an r but only if it is followed by an s. The - text matched by s is included when determining - whether this rule is the "longest match", - but is then returned to the input before - the action is executed. So the action only - sees the text matched by r. This type - of pattern is called trailing context". - (There are some combinations of r/s that flex - cannot match correctly; see notes in the - Deficiencies / Bugs section below regarding - "dangerous trailing context".) - ^r an r, but only at the beginning of a line (i.e., - which just starting to scan, or right after a - newline has been scanned). - r$ an r, but only at the end of a line (i.e., just - before a newline). Equivalent to "r/\\n". - - Note that flex's notion of "newline" is exactly - whatever the C compiler used to compile flex - interprets '\\n' as; in particular, on some DOS - systems you must either filter out \\r's in the - input yourself, or explicitly use r/\\r\\n for "r$". - - - <s>r an r, but only in start condition s (see - below for discussion of start conditions) - <s1,s2,s3>r - same, but in any of start conditions s1, - s2, or s3 - <*>r an r in any start condition, even an exclusive one. - - - <<EOF>> an end-of-file - <s1,s2><<EOF>> - an end-of-file when in start condition s1 or s2 - -.fi -Note that inside of a character class, all regular expression operators -lose their special meaning except escape ('\\') and the character class -operators, '-', ']', and, at the beginning of the class, '^'. -.PP -The regular expressions listed above are grouped according to -precedence, from highest precedence at the top to lowest at the bottom. -Those grouped together have equal precedence. For example, -.nf - - foo|bar* - -.fi -is the same as -.nf - - (foo)|(ba(r*)) - -.fi -since the '*' operator has higher precedence than concatenation, -and concatenation higher than alternation ('|'). This pattern -therefore matches -.I either -the string "foo" -.I or -the string "ba" followed by zero-or-more r's. -To match "foo" or zero-or-more "bar"'s, use: -.nf - - foo|(bar)* - -.fi -and to match zero-or-more "foo"'s-or-"bar"'s: -.nf - - (foo|bar)* - -.fi -.PP -In addition to characters and ranges of characters, character classes -can also contain character class -.I expressions. -These are expressions enclosed inside -.B [: -and -.B :] -delimiters (which themselves must appear between the '[' and ']' of the -character class; other elements may occur inside the character class, too). -The valid expressions are: -.nf - - [:alnum:] [:alpha:] [:blank:] - [:cntrl:] [:digit:] [:graph:] - [:lower:] [:print:] [:punct:] - [:space:] [:upper:] [:xdigit:] - -.fi -These expressions all designate a set of characters equivalent to -the corresponding standard C -.B isXXX -function. For example, -.B [:alnum:] -designates those characters for which -.B isalnum() -returns true - i.e., any alphabetic or numeric. -Some systems don't provide -.B isblank(), -so flex defines -.B [:blank:] -as a blank or a tab. -.PP -For example, the following character classes are all equivalent: -.nf - - [[:alnum:]] - [[:alpha:][:digit:] - [[:alpha:]0-9] - [a-zA-Z0-9] - -.fi -If your scanner is case-insensitive (the -.B \-i -flag), then -.B [:upper:] -and -.B [:lower:] -are equivalent to -.B [:alpha:]. -.PP -Some notes on patterns: -.IP - -A negated character class such as the example "[^A-Z]" -above -.I will match a newline -unless "\\n" (or an equivalent escape sequence) is one of the -characters explicitly present in the negated character class -(e.g., "[^A-Z\\n]"). This is unlike how many other regular -expression tools treat negated character classes, but unfortunately -the inconsistency is historically entrenched. -Matching newlines means that a pattern like [^"]* can match the entire -input unless there's another quote in the input. -.IP - -A rule can have at most one instance of trailing context (the '/' operator -or the '$' operator). The start condition, '^', and "<<EOF>>" patterns -can only occur at the beginning of a pattern, and, as well as with '/' and '$', -cannot be grouped inside parentheses. A '^' which does not occur at -the beginning of a rule or a '$' which does not occur at the end of -a rule loses its special properties and is treated as a normal character. -.IP -The following are illegal: -.nf - - foo/bar$ - <sc1>foo<sc2>bar - -.fi -Note that the first of these, can be written "foo/bar\\n". -.IP -The following will result in '$' or '^' being treated as a normal character: -.nf - - foo|(bar$) - foo|^bar - -.fi -If what's wanted is a "foo" or a bar-followed-by-a-newline, the following -could be used (the special '|' action is explained below): -.nf - - foo | - bar$ /* action goes here */ - -.fi -A similar trick will work for matching a foo or a -bar-at-the-beginning-of-a-line. -.SH HOW THE INPUT IS MATCHED -When the generated scanner is run, it analyzes its input looking -for strings which match any of its patterns. If it finds more than -one match, it takes the one matching the most text (for trailing -context rules, this includes the length of the trailing part, even -though it will then be returned to the input). If it finds two -or more matches of the same length, the -rule listed first in the -.I flex -input file is chosen. -.PP -Once the match is determined, the text corresponding to the match -(called the -.I token) -is made available in the global character pointer -.B yytext, -and its length in the global integer -.B yyleng. -The -.I action -corresponding to the matched pattern is then executed (a more -detailed description of actions follows), and then the remaining -input is scanned for another match. -.PP -If no match is found, then the -.I default rule -is executed: the next character in the input is considered matched and -copied to the standard output. Thus, the simplest legal -.I flex -input is: -.nf - - %% - -.fi -which generates a scanner that simply copies its input (one character -at a time) to its output. -.PP -Note that -.B yytext -can be defined in two different ways: either as a character -.I pointer -or as a character -.I array. -You can control which definition -.I flex -uses by including one of the special directives -.B %pointer -or -.B %array -in the first (definitions) section of your flex input. The default is -.B %pointer, -unless you use the -.B -l -lex compatibility option, in which case -.B yytext -will be an array. -The advantage of using -.B %pointer -is substantially faster scanning and no buffer overflow when matching -very large tokens (unless you run out of dynamic memory). The disadvantage -is that you are restricted in how your actions can modify -.B yytext -(see the next section), and calls to the -.B unput() -function destroys the present contents of -.B yytext, -which can be a considerable porting headache when moving between different -.I lex -versions. -.PP -The advantage of -.B %array -is that you can then modify -.B yytext -to your heart's content, and calls to -.B unput() -do not destroy -.B yytext -(see below). Furthermore, existing -.I lex -programs sometimes access -.B yytext -externally using declarations of the form: -.nf - extern char yytext[]; -.fi -This definition is erroneous when used with -.B %pointer, -but correct for -.B %array. -.PP -.B %array -defines -.B yytext -to be an array of -.B YYLMAX -characters, which defaults to a fairly large value. You can change -the size by simply #define'ing -.B YYLMAX -to a different value in the first section of your -.I flex -input. As mentioned above, with -.B %pointer -yytext grows dynamically to accommodate large tokens. While this means your -.B %pointer -scanner can accommodate very large tokens (such as matching entire blocks -of comments), bear in mind that each time the scanner must resize -.B yytext -it also must rescan the entire token from the beginning, so matching such -tokens can prove slow. -.B yytext -presently does -.I not -dynamically grow if a call to -.B unput() -results in too much text being pushed back; instead, a run-time error results. -.PP -Also note that you cannot use -.B %array -with C++ scanner classes -(the -.B c++ -option; see below). -.SH ACTIONS -Each pattern in a rule has a corresponding action, which can be any -arbitrary C statement. The pattern ends at the first non-escaped -whitespace character; the remainder of the line is its action. If the -action is empty, then when the pattern is matched the input token -is simply discarded. For example, here is the specification for a program -which deletes all occurrences of "zap me" from its input: -.nf - - %% - "zap me" - -.fi -(It will copy all other characters in the input to the output since -they will be matched by the default rule.) -.PP -Here is a program which compresses multiple blanks and tabs down to -a single blank, and throws away whitespace found at the end of a line: -.nf - - %% - [ \\t]+ putchar( ' ' ); - [ \\t]+$ /* ignore this token */ - -.fi -.PP -If the action contains a '{', then the action spans till the balancing '}' -is found, and the action may cross multiple lines. -.I flex -knows about C strings and comments and won't be fooled by braces found -within them, but also allows actions to begin with -.B %{ -and will consider the action to be all the text up to the next -.B %} -(regardless of ordinary braces inside the action). -.PP -An action consisting solely of a vertical bar ('|') means "same as -the action for the next rule." See below for an illustration. -.PP -Actions can include arbitrary C code, including -.B return -statements to return a value to whatever routine called -.B yylex(). -Each time -.B yylex() -is called it continues processing tokens from where it last left -off until it either reaches -the end of the file or executes a return. -.PP -Actions are free to modify -.B yytext -except for lengthening it (adding -characters to its end--these will overwrite later characters in the -input stream). This however does not apply when using -.B %array -(see above); in that case, -.B yytext -may be freely modified in any way. -.PP -Actions are free to modify -.B yyleng -except they should not do so if the action also includes use of -.B yymore() -(see below). -.PP -There are a number of special directives which can be included within -an action: -.IP - -.B ECHO -copies yytext to the scanner's output. -.IP - -.B BEGIN -followed by the name of a start condition places the scanner in the -corresponding start condition (see below). -.IP - -.B REJECT -directs the scanner to proceed on to the "second best" rule which matched the -input (or a prefix of the input). The rule is chosen as described -above in "How the Input is Matched", and -.B yytext -and -.B yyleng -set up appropriately. -It may either be one which matched as much text -as the originally chosen rule but came later in the -.I flex -input file, or one which matched less text. -For example, the following will both count the -words in the input and call the routine special() whenever "frob" is seen: -.nf - - int word_count = 0; - %% - - frob special(); REJECT; - [^ \\t\\n]+ ++word_count; - -.fi -Without the -.B REJECT, -any "frob"'s in the input would not be counted as words, since the -scanner normally executes only one action per token. -Multiple -.B REJECT's -are allowed, each one finding the next best choice to the currently -active rule. For example, when the following scanner scans the token -"abcd", it will write "abcdabcaba" to the output: -.nf - - %% - a | - ab | - abc | - abcd ECHO; REJECT; - .|\\n /* eat up any unmatched character */ - -.fi -(The first three rules share the fourth's action since they use -the special '|' action.) -.B REJECT -is a particularly expensive feature in terms of scanner performance; -if it is used in -.I any -of the scanner's actions it will slow down -.I all -of the scanner's matching. Furthermore, -.B REJECT -cannot be used with the -.I -Cf -or -.I -CF -options (see below). -.IP -Note also that unlike the other special actions, -.B REJECT -is a -.I branch; -code immediately following it in the action will -.I not -be executed. -.IP - -.B yymore() -tells the scanner that the next time it matches a rule, the corresponding -token should be -.I appended -onto the current value of -.B yytext -rather than replacing it. For example, given the input "mega-kludge" -the following will write "mega-mega-kludge" to the output: -.nf - - %% - mega- ECHO; yymore(); - kludge ECHO; - -.fi -First "mega-" is matched and echoed to the output. Then "kludge" -is matched, but the previous "mega-" is still hanging around at the -beginning of -.B yytext -so the -.B ECHO -for the "kludge" rule will actually write "mega-kludge". -.PP -Two notes regarding use of -.B yymore(). -First, -.B yymore() -depends on the value of -.I yyleng -correctly reflecting the size of the current token, so you must not -modify -.I yyleng -if you are using -.B yymore(). -Second, the presence of -.B yymore() -in the scanner's action entails a minor performance penalty in the -scanner's matching speed. -.IP - -.B yyless(n) -returns all but the first -.I n -characters of the current token back to the input stream, where they -will be rescanned when the scanner looks for the next match. -.B yytext -and -.B yyleng -are adjusted appropriately (e.g., -.B yyleng -will now be equal to -.I n -). For example, on the input "foobar" the following will write out -"foobarbar": -.nf - - %% - foobar ECHO; yyless(3); - [a-z]+ ECHO; - -.fi -An argument of 0 to -.B yyless -will cause the entire current input string to be scanned again. Unless you've -changed how the scanner will subsequently process its input (using -.B BEGIN, -for example), this will result in an endless loop. -.PP -Note that -.B yyless -is a macro and can only be used in the flex input file, not from -other source files. -.IP - -.B unput(c) -puts the character -.I c -back onto the input stream. It will be the next character scanned. -The following action will take the current token and cause it -to be rescanned enclosed in parentheses. -.nf - - { - int i; - /* Copy yytext because unput() trashes yytext */ - char *yycopy = strdup( yytext ); - unput( ')' ); - for ( i = yyleng - 1; i >= 0; --i ) - unput( yycopy[i] ); - unput( '(' ); - free( yycopy ); - } - -.fi -Note that since each -.B unput() -puts the given character back at the -.I beginning -of the input stream, pushing back strings must be done back-to-front. -.PP -An important potential problem when using -.B unput() -is that if you are using -.B %pointer -(the default), a call to -.B unput() -.I destroys -the contents of -.I yytext, -starting with its rightmost character and devouring one character to -the left with each call. If you need the value of yytext preserved -after a call to -.B unput() -(as in the above example), -you must either first copy it elsewhere, or build your scanner using -.B %array -instead (see How The Input Is Matched). -.PP -Finally, note that you cannot put back -.B EOF -to attempt to mark the input stream with an end-of-file. -.IP - -.B input() -reads the next character from the input stream. For example, -the following is one way to eat up C comments: -.nf - - %% - "/*" { - register int c; - - for ( ; ; ) - { - while ( (c = input()) != '*' && - c != EOF ) - ; /* eat up text of comment */ - - if ( c == '*' ) - { - while ( (c = input()) == '*' ) - ; - if ( c == '/' ) - break; /* found the end */ - } - - if ( c == EOF ) - { - error( "EOF in comment" ); - break; - } - } - } - -.fi -(Note that if the scanner is compiled using -.B C++, -then -.B input() -is instead referred to as -.B yyinput(), -in order to avoid a name clash with the -.B C++ -stream by the name of -.I input.) -.IP - -.B YY_FLUSH_BUFFER -flushes the scanner's internal buffer -so that the next time the scanner attempts to match a token, it will -first refill the buffer using -.B YY_INPUT -(see The Generated Scanner, below). This action is a special case -of the more general -.B yy_flush_buffer() -function, described below in the section Multiple Input Buffers. -.IP - -.B yyterminate() -can be used in lieu of a return statement in an action. It terminates -the scanner and returns a 0 to the scanner's caller, indicating "all done". -By default, -.B yyterminate() -is also called when an end-of-file is encountered. It is a macro and -may be redefined. -.SH THE GENERATED SCANNER -The output of -.I flex -is the file -.B lex.yy.c, -which contains the scanning routine -.B yylex(), -a number of tables used by it for matching tokens, and a number -of auxiliary routines and macros. By default, -.B yylex() -is declared as follows: -.nf - - int yylex() - { - ... various definitions and the actions in here ... - } - -.fi -(If your environment supports function prototypes, then it will -be "int yylex( void )".) This definition may be changed by defining -the "YY_DECL" macro. For example, you could use: -.nf - - #define YY_DECL float lexscan( a, b ) float a, b; - -.fi -to give the scanning routine the name -.I lexscan, -returning a float, and taking two floats as arguments. Note that -if you give arguments to the scanning routine using a -K&R-style/non-prototyped function declaration, you must terminate -the definition with a semi-colon (;). -.PP -Whenever -.B yylex() -is called, it scans tokens from the global input file -.I yyin -(which defaults to stdin). It continues until it either reaches -an end-of-file (at which point it returns the value 0) or -one of its actions executes a -.I return -statement. -.PP -If the scanner reaches an end-of-file, subsequent calls are undefined -unless either -.I yyin -is pointed at a new input file (in which case scanning continues from -that file), or -.B yyrestart() -is called. -.B yyrestart() -takes one argument, a -.B FILE * -pointer (which can be nil, if you've set up -.B YY_INPUT -to scan from a source other than -.I yyin), -and initializes -.I yyin -for scanning from that file. Essentially there is no difference between -just assigning -.I yyin -to a new input file or using -.B yyrestart() -to do so; the latter is available for compatibility with previous versions -of -.I flex, -and because it can be used to switch input files in the middle of scanning. -It can also be used to throw away the current input buffer, by calling -it with an argument of -.I yyin; -but better is to use -.B YY_FLUSH_BUFFER -(see above). -Note that -.B yyrestart() -does -.I not -reset the start condition to -.B INITIAL -(see Start Conditions, below). -.PP -If -.B yylex() -stops scanning due to executing a -.I return -statement in one of the actions, the scanner may then be called again and it -will resume scanning where it left off. -.PP -By default (and for purposes of efficiency), the scanner uses -block-reads rather than simple -.I getc() -calls to read characters from -.I yyin. -The nature of how it gets its input can be controlled by defining the -.B YY_INPUT -macro. -YY_INPUT's calling sequence is "YY_INPUT(buf,result,max_size)". Its -action is to place up to -.I max_size -characters in the character array -.I buf -and return in the integer variable -.I result -either the -number of characters read or the constant YY_NULL (0 on Unix systems) -to indicate EOF. The default YY_INPUT reads from the -global file-pointer "yyin". -.PP -A sample definition of YY_INPUT (in the definitions -section of the input file): -.nf - - %{ - #define YY_INPUT(buf,result,max_size) \\ - { \\ - int c = getchar(); \\ - result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \\ - } - %} - -.fi -This definition will change the input processing to occur -one character at a time. -.PP -When the scanner receives an end-of-file indication from YY_INPUT, -it then checks the -.B yywrap() -function. If -.B yywrap() -returns false (zero), then it is assumed that the -function has gone ahead and set up -.I yyin -to point to another input file, and scanning continues. If it returns -true (non-zero), then the scanner terminates, returning 0 to its -caller. Note that in either case, the start condition remains unchanged; -it does -.I not -revert to -.B INITIAL. -.PP -If you do not supply your own version of -.B yywrap(), -then you must either use -.B %option noyywrap -(in which case the scanner behaves as though -.B yywrap() -returned 1), or you must link with -.B \-lfl -to obtain the default version of the routine, which always returns 1. -.PP -Three routines are available for scanning from in-memory buffers rather -than files: -.B yy_scan_string(), yy_scan_bytes(), -and -.B yy_scan_buffer(). -See the discussion of them below in the section Multiple Input Buffers. -.PP -The scanner writes its -.B ECHO -output to the -.I yyout -global (default, stdout), which may be redefined by the user simply -by assigning it to some other -.B FILE -pointer. -.SH START CONDITIONS -.I flex -provides a mechanism for conditionally activating rules. Any rule -whose pattern is prefixed with "<sc>" will only be active when -the scanner is in the start condition named "sc". For example, -.nf - - <STRING>[^"]* { /* eat up the string body ... */ - ... - } - -.fi -will be active only when the scanner is in the "STRING" start -condition, and -.nf - - <INITIAL,STRING,QUOTE>\\. { /* handle an escape ... */ - ... - } - -.fi -will be active only when the current start condition is -either "INITIAL", "STRING", or "QUOTE". -.PP -Start conditions -are declared in the definitions (first) section of the input -using unindented lines beginning with either -.B %s -or -.B %x -followed by a list of names. -The former declares -.I inclusive -start conditions, the latter -.I exclusive -start conditions. A start condition is activated using the -.B BEGIN -action. Until the next -.B BEGIN -action is executed, rules with the given start -condition will be active and -rules with other start conditions will be inactive. -If the start condition is -.I inclusive, -then rules with no start conditions at all will also be active. -If it is -.I exclusive, -then -.I only -rules qualified with the start condition will be active. -A set of rules contingent on the same exclusive start condition -describe a scanner which is independent of any of the other rules in the -.I flex -input. Because of this, -exclusive start conditions make it easy to specify "mini-scanners" -which scan portions of the input that are syntactically different -from the rest (e.g., comments). -.PP -If the distinction between inclusive and exclusive start conditions -is still a little vague, here's a simple example illustrating the -connection between the two. The set of rules: -.nf - - %s example - %% - - <example>foo do_something(); - - bar something_else(); - -.fi -is equivalent to -.nf - - %x example - %% - - <example>foo do_something(); - - <INITIAL,example>bar something_else(); - -.fi -Without the -.B <INITIAL,example> -qualifier, the -.I bar -pattern in the second example wouldn't be active (i.e., couldn't match) -when in start condition -.B example. -If we just used -.B <example> -to qualify -.I bar, -though, then it would only be active in -.B example -and not in -.B INITIAL, -while in the first example it's active in both, because in the first -example the -.B example -startion condition is an -.I inclusive -.B (%s) -start condition. -.PP -Also note that the special start-condition specifier -.B <*> -matches every start condition. Thus, the above example could also -have been written; -.nf - - %x example - %% - - <example>foo do_something(); - - <*>bar something_else(); - -.fi -.PP -The default rule (to -.B ECHO -any unmatched character) remains active in start conditions. It -is equivalent to: -.nf - - <*>.|\\n ECHO; - -.fi -.PP -.B BEGIN(0) -returns to the original state where only the rules with -no start conditions are active. This state can also be -referred to as the start-condition "INITIAL", so -.B BEGIN(INITIAL) -is equivalent to -.B BEGIN(0). -(The parentheses around the start condition name are not required but -are considered good style.) -.PP -.B BEGIN -actions can also be given as indented code at the beginning -of the rules section. For example, the following will cause -the scanner to enter the "SPECIAL" start condition whenever -.B yylex() -is called and the global variable -.I enter_special -is true: -.nf - - int enter_special; - - %x SPECIAL - %% - if ( enter_special ) - BEGIN(SPECIAL); - - <SPECIAL>blahblahblah - ...more rules follow... - -.fi -.PP -To illustrate the uses of start conditions, -here is a scanner which provides two different interpretations -of a string like "123.456". By default it will treat it as -three tokens, the integer "123", a dot ('.'), and the integer "456". -But if the string is preceded earlier in the line by the string -"expect-floats" -it will treat it as a single token, the floating-point number -123.456: -.nf - - %{ - #include <math.h> - %} - %s expect - - %% - expect-floats BEGIN(expect); - - <expect>[0-9]+"."[0-9]+ { - printf( "found a float, = %f\\n", - atof( yytext ) ); - } - <expect>\\n { - /* that's the end of the line, so - * we need another "expect-number" - * before we'll recognize any more - * numbers - */ - BEGIN(INITIAL); - } - - [0-9]+ { - printf( "found an integer, = %d\\n", - atoi( yytext ) ); - } - - "." printf( "found a dot\\n" ); - -.fi -Here is a scanner which recognizes (and discards) C comments while -maintaining a count of the current input line. -.nf - - %x comment - %% - int line_num = 1; - - "/*" BEGIN(comment); - - <comment>[^*\\n]* /* eat anything that's not a '*' */ - <comment>"*"+[^*/\\n]* /* eat up '*'s not followed by '/'s */ - <comment>\\n ++line_num; - <comment>"*"+"/" BEGIN(INITIAL); - -.fi -This scanner goes to a bit of trouble to match as much -text as possible with each rule. In general, when attempting to write -a high-speed scanner try to match as much possible in each rule, as -it's a big win. -.PP -Note that start-conditions names are really integer values and -can be stored as such. Thus, the above could be extended in the -following fashion: -.nf - - %x comment foo - %% - int line_num = 1; - int comment_caller; - - "/*" { - comment_caller = INITIAL; - BEGIN(comment); - } - - ... - - <foo>"/*" { - comment_caller = foo; - BEGIN(comment); - } - - <comment>[^*\\n]* /* eat anything that's not a '*' */ - <comment>"*"+[^*/\\n]* /* eat up '*'s not followed by '/'s */ - <comment>\\n ++line_num; - <comment>"*"+"/" BEGIN(comment_caller); - -.fi -Furthermore, you can access the current start condition using -the integer-valued -.B YY_START -macro. For example, the above assignments to -.I comment_caller -could instead be written -.nf - - comment_caller = YY_START; - -.fi -Flex provides -.B YYSTATE -as an alias for -.B YY_START -(since that is what's used by AT&T -.I lex). -.PP -Note that start conditions do not have their own name-space; %s's and %x's -declare names in the same fashion as #define's. -.PP -Finally, here's an example of how to match C-style quoted strings using -exclusive start conditions, including expanded escape sequences (but -not including checking for a string that's too long): -.nf - - %x str - - %% - char string_buf[MAX_STR_CONST]; - char *string_buf_ptr; - - - \\" string_buf_ptr = string_buf; BEGIN(str); - - <str>\\" { /* saw closing quote - all done */ - BEGIN(INITIAL); - *string_buf_ptr = '\\0'; - /* return string constant token type and - * value to parser - */ - } - - <str>\\n { - /* error - unterminated string constant */ - /* generate error message */ - } - - <str>\\\\[0-7]{1,3} { - /* octal escape sequence */ - int result; - - (void) sscanf( yytext + 1, "%o", &result ); - - if ( result > 0xff ) - /* error, constant is out-of-bounds */ - - *string_buf_ptr++ = result; - } - - <str>\\\\[0-9]+ { - /* generate error - bad escape sequence; something - * like '\\48' or '\\0777777' - */ - } - - <str>\\\\n *string_buf_ptr++ = '\\n'; - <str>\\\\t *string_buf_ptr++ = '\\t'; - <str>\\\\r *string_buf_ptr++ = '\\r'; - <str>\\\\b *string_buf_ptr++ = '\\b'; - <str>\\\\f *string_buf_ptr++ = '\\f'; - - <str>\\\\(.|\\n) *string_buf_ptr++ = yytext[1]; - - <str>[^\\\\\\n\\"]+ { - char *yptr = yytext; - - while ( *yptr ) - *string_buf_ptr++ = *yptr++; - } - -.fi -.PP -Often, such as in some of the examples above, you wind up writing a -whole bunch of rules all preceded by the same start condition(s). Flex -makes this a little easier and cleaner by introducing a notion of -start condition -.I scope. -A start condition scope is begun with: -.nf - - <SCs>{ - -.fi -where -.I SCs -is a list of one or more start conditions. Inside the start condition -scope, every rule automatically has the prefix -.I <SCs> -applied to it, until a -.I '}' -which matches the initial -.I '{'. -So, for example, -.nf - - <ESC>{ - "\\\\n" return '\\n'; - "\\\\r" return '\\r'; - "\\\\f" return '\\f'; - "\\\\0" return '\\0'; - } - -.fi -is equivalent to: -.nf - - <ESC>"\\\\n" return '\\n'; - <ESC>"\\\\r" return '\\r'; - <ESC>"\\\\f" return '\\f'; - <ESC>"\\\\0" return '\\0'; - -.fi -Start condition scopes may be nested. -.PP -Three routines are available for manipulating stacks of start conditions: -.TP -.B void yy_push_state(int new_state) -pushes the current start condition onto the top of the start condition -stack and switches to -.I new_state -as though you had used -.B BEGIN new_state -(recall that start condition names are also integers). -.TP -.B void yy_pop_state() -pops the top of the stack and switches to it via -.B BEGIN. -.TP -.B int yy_top_state() -returns the top of the stack without altering the stack's contents. -.PP -The start condition stack grows dynamically and so has no built-in -size limitation. If memory is exhausted, program execution aborts. -.PP -To use start condition stacks, your scanner must include a -.B %option stack -directive (see Options below). -.SH MULTIPLE INPUT BUFFERS -Some scanners (such as those which support "include" files) -require reading from several input streams. As -.I flex -scanners do a large amount of buffering, one cannot control -where the next input will be read from by simply writing a -.B YY_INPUT -which is sensitive to the scanning context. -.B YY_INPUT -is only called when the scanner reaches the end of its buffer, which -may be a long time after scanning a statement such as an "include" -which requires switching the input source. -.PP -To negotiate these sorts of problems, -.I flex -provides a mechanism for creating and switching between multiple -input buffers. An input buffer is created by using: -.nf - - YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) - -.fi -which takes a -.I FILE -pointer and a size and creates a buffer associated with the given -file and large enough to hold -.I size -characters (when in doubt, use -.B YY_BUF_SIZE -for the size). It returns a -.B YY_BUFFER_STATE -handle, which may then be passed to other routines (see below). The -.B YY_BUFFER_STATE -type is a pointer to an opaque -.B struct yy_buffer_state -structure, so you may safely initialize YY_BUFFER_STATE variables to -.B ((YY_BUFFER_STATE) 0) -if you wish, and also refer to the opaque structure in order to -correctly declare input buffers in source files other than that -of your scanner. Note that the -.I FILE -pointer in the call to -.B yy_create_buffer -is only used as the value of -.I yyin -seen by -.B YY_INPUT; -if you redefine -.B YY_INPUT -so it no longer uses -.I yyin, -then you can safely pass a nil -.I FILE -pointer to -.B yy_create_buffer. -You select a particular buffer to scan from using: -.nf - - void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) - -.fi -switches the scanner's input buffer so subsequent tokens will -come from -.I new_buffer. -Note that -.B yy_switch_to_buffer() -may be used by yywrap() to set things up for continued scanning, instead -of opening a new file and pointing -.I yyin -at it. Note also that switching input sources via either -.B yy_switch_to_buffer() -or -.B yywrap() -does -.I not -change the start condition. -.nf - - void yy_delete_buffer( YY_BUFFER_STATE buffer ) - -.fi -is used to reclaim the storage associated with a buffer. ( -.B buffer -can be nil, in which case the routine does nothing.) -You can also clear the current contents of a buffer using: -.nf - - void yy_flush_buffer( YY_BUFFER_STATE buffer ) - -.fi -This function discards the buffer's contents, -so the next time the scanner attempts to match a token from the -buffer, it will first fill the buffer anew using -.B YY_INPUT. -.PP -.B yy_new_buffer() -is an alias for -.B yy_create_buffer(), -provided for compatibility with the C++ use of -.I new -and -.I delete -for creating and destroying dynamic objects. -.PP -Finally, the -.B YY_CURRENT_BUFFER -macro returns a -.B YY_BUFFER_STATE -handle to the current buffer. -.PP -Here is an example of using these features for writing a scanner -which expands include files (the -.B <<EOF>> -feature is discussed below): -.nf - - /* the "incl" state is used for picking up the name - * of an include file - */ - %x incl - - %{ - #define MAX_INCLUDE_DEPTH 10 - YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; - int include_stack_ptr = 0; - %} - - %% - include BEGIN(incl); - - [a-z]+ ECHO; - [^a-z\\n]*\\n? ECHO; - - <incl>[ \\t]* /* eat the whitespace */ - <incl>[^ \\t\\n]+ { /* got the include file name */ - if ( include_stack_ptr >= MAX_INCLUDE_DEPTH ) - { - fprintf( stderr, "Includes nested too deeply" ); - exit( 1 ); - } - - include_stack[include_stack_ptr++] = - YY_CURRENT_BUFFER; - - yyin = fopen( yytext, "r" ); - - if ( ! yyin ) - error( ... ); - - yy_switch_to_buffer( - yy_create_buffer( yyin, YY_BUF_SIZE ) ); - - BEGIN(INITIAL); - } - - <<EOF>> { - if ( --include_stack_ptr < 0 ) - { - yyterminate(); - } - - else - { - yy_delete_buffer( YY_CURRENT_BUFFER ); - yy_switch_to_buffer( - include_stack[include_stack_ptr] ); - } - } - -.fi -Three routines are available for setting up input buffers for -scanning in-memory strings instead of files. All of them create -a new input buffer for scanning the string, and return a corresponding -.B YY_BUFFER_STATE -handle (which you should delete with -.B yy_delete_buffer() -when done with it). They also switch to the new buffer using -.B yy_switch_to_buffer(), -so the next call to -.B yylex() -will start scanning the string. -.TP -.B yy_scan_string(const char *str) -scans a NUL-terminated string. -.TP -.B yy_scan_bytes(const char *bytes, int len) -scans -.I len -bytes (including possibly NUL's) -starting at location -.I bytes. -.PP -Note that both of these functions create and scan a -.I copy -of the string or bytes. (This may be desirable, since -.B yylex() -modifies the contents of the buffer it is scanning.) You can avoid the -copy by using: -.TP -.B yy_scan_buffer(char *base, yy_size_t size) -which scans in place the buffer starting at -.I base, -consisting of -.I size -bytes, the last two bytes of which -.I must -be -.B YY_END_OF_BUFFER_CHAR -(ASCII NUL). -These last two bytes are not scanned; thus, scanning -consists of -.B base[0] -through -.B base[size-2], -inclusive. -.IP -If you fail to set up -.I base -in this manner (i.e., forget the final two -.B YY_END_OF_BUFFER_CHAR -bytes), then -.B yy_scan_buffer() -returns a nil pointer instead of creating a new input buffer. -.IP -The type -.B yy_size_t -is an integral type to which you can cast an integer expression -reflecting the size of the buffer. -.SH END-OF-FILE RULES -The special rule "<<EOF>>" indicates -actions which are to be taken when an end-of-file is -encountered and yywrap() returns non-zero (i.e., indicates -no further files to process). The action must finish -by doing one of four things: -.IP - -assigning -.I yyin -to a new input file (in previous versions of flex, after doing the -assignment you had to call the special action -.B YY_NEW_FILE; -this is no longer necessary); -.IP - -executing a -.I return -statement; -.IP - -executing the special -.B yyterminate() -action; -.IP - -or, switching to a new buffer using -.B yy_switch_to_buffer() -as shown in the example above. -.PP -<<EOF>> rules may not be used with other -patterns; they may only be qualified with a list of start -conditions. If an unqualified <<EOF>> rule is given, it -applies to -.I all -start conditions which do not already have <<EOF>> actions. To -specify an <<EOF>> rule for only the initial start condition, use -.nf - - <INITIAL><<EOF>> - -.fi -.PP -These rules are useful for catching things like unclosed comments. -An example: -.nf - - %x quote - %% - - ...other rules for dealing with quotes... - - <quote><<EOF>> { - error( "unterminated quote" ); - yyterminate(); - } - <<EOF>> { - if ( *++filelist ) - yyin = fopen( *filelist, "r" ); - else - yyterminate(); - } - -.fi -.SH MISCELLANEOUS MACROS -The macro -.B YY_USER_ACTION -can be defined to provide an action -which is always executed prior to the matched rule's action. For example, -it could be #define'd to call a routine to convert yytext to lower-case. -When -.B YY_USER_ACTION -is invoked, the variable -.I yy_act -gives the number of the matched rule (rules are numbered starting with 1). -Suppose you want to profile how often each of your rules is matched. The -following would do the trick: -.nf - - #define YY_USER_ACTION ++ctr[yy_act] - -.fi -where -.I ctr -is an array to hold the counts for the different rules. Note that -the macro -.B YY_NUM_RULES -gives the total number of rules (including the default rule, even if -you use -.B \-s), -so a correct declaration for -.I ctr -is: -.nf - - int ctr[YY_NUM_RULES]; - -.fi -.PP -The macro -.B YY_USER_INIT -may be defined to provide an action which is always executed before -the first scan (and before the scanner's internal initializations are done). -For example, it could be used to call a routine to read -in a data table or open a logging file. -.PP -The macro -.B yy_set_interactive(is_interactive) -can be used to control whether the current buffer is considered -.I interactive. -An interactive buffer is processed more slowly, -but must be used when the scanner's input source is indeed -interactive to avoid problems due to waiting to fill buffers -(see the discussion of the -.B \-I -flag below). A non-zero value -in the macro invocation marks the buffer as interactive, a zero -value as non-interactive. Note that use of this macro overrides -.B %option always-interactive -or -.B %option never-interactive -(see Options below). -.B yy_set_interactive() -must be invoked prior to beginning to scan the buffer that is -(or is not) to be considered interactive. -.PP -The macro -.B yy_set_bol(at_bol) -can be used to control whether the current buffer's scanning -context for the next token match is done as though at the -beginning of a line. A non-zero macro argument makes rules anchored with -'^' active, while a zero argument makes '^' rules inactive. -.PP -The macro -.B YY_AT_BOL() -returns true if the next token scanned from the current buffer -will have '^' rules active, false otherwise. -.PP -In the generated scanner, the actions are all gathered in one large -switch statement and separated using -.B YY_BREAK, -which may be redefined. By default, it is simply a "break", to separate -each rule's action from the following rule's. -Redefining -.B YY_BREAK -allows, for example, C++ users to -#define YY_BREAK to do nothing (while being very careful that every -rule ends with a "break" or a "return"!) to avoid suffering from -unreachable statement warnings where because a rule's action ends with -"return", the -.B YY_BREAK -is inaccessible. -.SH VALUES AVAILABLE TO THE USER -This section summarizes the various values available to the user -in the rule actions. -.IP - -.B char *yytext -holds the text of the current token. It may be modified but not lengthened -(you cannot append characters to the end). -.IP -If the special directive -.B %array -appears in the first section of the scanner description, then -.B yytext -is instead declared -.B char yytext[YYLMAX], -where -.B YYLMAX -is a macro definition that you can redefine in the first section -if you don't like the default value (generally 8KB). Using -.B %array -results in somewhat slower scanners, but the value of -.B yytext -becomes immune to calls to -.I input() -and -.I unput(), -which potentially destroy its value when -.B yytext -is a character pointer. The opposite of -.B %array -is -.B %pointer, -which is the default. -.IP -You cannot use -.B %array -when generating C++ scanner classes -(the -.B \-+ -flag). -.IP - -.B int yyleng -holds the length of the current token. -.IP - -.B FILE *yyin -is the file which by default -.I flex -reads from. It may be redefined but doing so only makes sense before -scanning begins or after an EOF has been encountered. Changing it in -the midst of scanning will have unexpected results since -.I flex -buffers its input; use -.B yyrestart() -instead. -Once scanning terminates because an end-of-file -has been seen, you can assign -.I yyin -at the new input file and then call the scanner again to continue scanning. -.IP - -.B void yyrestart( FILE *new_file ) -may be called to point -.I yyin -at the new input file. The switch-over to the new file is immediate -(any previously buffered-up input is lost). Note that calling -.B yyrestart() -with -.I yyin -as an argument thus throws away the current input buffer and continues -scanning the same input file. -.IP - -.B FILE *yyout -is the file to which -.B ECHO -actions are done. It can be reassigned by the user. -.IP - -.B YY_CURRENT_BUFFER -returns a -.B YY_BUFFER_STATE -handle to the current buffer. -.IP - -.B YY_START -returns an integer value corresponding to the current start -condition. You can subsequently use this value with -.B BEGIN -to return to that start condition. -.SH INTERFACING WITH YACC -One of the main uses of -.I flex -is as a companion to the -.I yacc -parser-generator. -.I yacc -parsers expect to call a routine named -.B yylex() -to find the next input token. The routine is supposed to -return the type of the next token as well as putting any associated -value in the global -.B yylval. -To use -.I flex -with -.I yacc, -one specifies the -.B \-d -option to -.I yacc -to instruct it to generate the file -.B y.tab.h -containing definitions of all the -.B %tokens -appearing in the -.I yacc -input. This file is then included in the -.I flex -scanner. For example, if one of the tokens is "TOK_NUMBER", -part of the scanner might look like: -.nf - - %{ - #include "y.tab.h" - %} - - %% - - [0-9]+ yylval = atoi( yytext ); return TOK_NUMBER; - -.fi -.SH OPTIONS -.I flex -has the following options: -.TP -.B \-b -Generate backing-up information to -.I lex.backup. -This is a list of scanner states which require backing up -and the input characters on which they do so. By adding rules one -can remove backing-up states. If -.I all -backing-up states are eliminated and -.B \-Cf -or -.B \-CF -is used, the generated scanner will run faster (see the -.B \-p -flag). Only users who wish to squeeze every last cycle out of their -scanners need worry about this option. (See the section on Performance -Considerations below.) -.TP -.B \-c -is a do-nothing, deprecated option included for POSIX compliance. -.TP -.B \-d -makes the generated scanner run in -.I debug -mode. Whenever a pattern is recognized and the global -.B yy_flex_debug -is non-zero (which is the default), -the scanner will write to -.I stderr -a line of the form: -.nf - - --accepting rule at line 53 ("the matched text") - -.fi -The line number refers to the location of the rule in the file -defining the scanner (i.e., the file that was fed to flex). Messages -are also generated when the scanner backs up, accepts the -default rule, reaches the end of its input buffer (or encounters -a NUL; at this point, the two look the same as far as the scanner's concerned), -or reaches an end-of-file. -.TP -.B \-f -specifies -.I fast scanner. -No table compression is done and stdio is bypassed. -The result is large but fast. This option is equivalent to -.B \-Cfr -(see below). -.TP -.B \-h -generates a "help" summary of -.I flex's -options to -.I stdout -and then exits. -.B \-? -and -.B \-\-help -are synonyms for -.B \-h. -.TP -.B \-i -instructs -.I flex -to generate a -.I case-insensitive -scanner. The case of letters given in the -.I flex -input patterns will -be ignored, and tokens in the input will be matched regardless of case. The -matched text given in -.I yytext -will have the preserved case (i.e., it will not be folded). -.TP -.B \-l -turns on maximum compatibility with the original AT&T -.I lex -implementation. Note that this does not mean -.I full -compatibility. Use of this option costs a considerable amount of -performance, and it cannot be used with the -.B \-+, -f, -F, -Cf, -or -.B -CF -options. For details on the compatibilities it provides, see the section -"Incompatibilities With Lex And POSIX" below. This option also results -in the name -.B YY_FLEX_LEX_COMPAT -being #define'd in the generated scanner. -.TP -.B \-n -is another do-nothing, deprecated option included only for -POSIX compliance. -.TP -.B \-p -generates a performance report to stderr. The report -consists of comments regarding features of the -.I flex -input file which will cause a serious loss of performance in the resulting -scanner. If you give the flag twice, you will also get comments regarding -features that lead to minor performance losses. -.IP -Note that the use of -.B REJECT, -.B %option yylineno, -and variable trailing context (see the Deficiencies / Bugs section below) -entails a substantial performance penalty; use of -.I yymore(), -the -.B ^ -operator, -and the -.B \-I -flag entail minor performance penalties. -.TP -.B \-s -causes the -.I default rule -(that unmatched scanner input is echoed to -.I stdout) -to be suppressed. If the scanner encounters input that does not -match any of its rules, it aborts with an error. This option is -useful for finding holes in a scanner's rule set. -.TP -.B \-t -instructs -.I flex -to write the scanner it generates to standard output instead -of -.B lex.yy.c. -.TP -.B \-v -specifies that -.I flex -should write to -.I stderr -a summary of statistics regarding the scanner it generates. -Most of the statistics are meaningless to the casual -.I flex -user, but the first line identifies the version of -.I flex -(same as reported by -.B \-V), -and the next line the flags used when generating the scanner, including -those that are on by default. -.TP -.B \-w -suppresses warning messages. -.TP -.B \-B -instructs -.I flex -to generate a -.I batch -scanner, the opposite of -.I interactive -scanners generated by -.B \-I -(see below). In general, you use -.B \-B -when you are -.I certain -that your scanner will never be used interactively, and you want to -squeeze a -.I little -more performance out of it. If your goal is instead to squeeze out a -.I lot -more performance, you should be using the -.B \-Cf -or -.B \-CF -options (discussed below), which turn on -.B \-B -automatically anyway. -.TP -.B \-F -specifies that the -.ul -fast -scanner table representation should be used (and stdio -bypassed). This representation is -about as fast as the full table representation -.B (-f), -and for some sets of patterns will be considerably smaller (and for -others, larger). In general, if the pattern set contains both "keywords" -and a catch-all, "identifier" rule, such as in the set: -.nf - - "case" return TOK_CASE; - "switch" return TOK_SWITCH; - ... - "default" return TOK_DEFAULT; - [a-z]+ return TOK_ID; - -.fi -then you're better off using the full table representation. If only -the "identifier" rule is present and you then use a hash table or some such -to detect the keywords, you're better off using -.B -F. -.IP -This option is equivalent to -.B \-CFr -(see below). It cannot be used with -.B \-+. -.TP -.B \-I -instructs -.I flex -to generate an -.I interactive -scanner. An interactive scanner is one that only looks ahead to decide -what token has been matched if it absolutely must. It turns out that -always looking one extra character ahead, even if the scanner has already -seen enough text to disambiguate the current token, is a bit faster than -only looking ahead when necessary. But scanners that always look ahead -give dreadful interactive performance; for example, when a user types -a newline, it is not recognized as a newline token until they enter -.I another -token, which often means typing in another whole line. -.IP -.I Flex -scanners default to -.I interactive -unless you use the -.B \-Cf -or -.B \-CF -table-compression options (see below). That's because if you're looking -for high-performance you should be using one of these options, so if you -didn't, -.I flex -assumes you'd rather trade off a bit of run-time performance for intuitive -interactive behavior. Note also that you -.I cannot -use -.B \-I -in conjunction with -.B \-Cf -or -.B \-CF. -Thus, this option is not really needed; it is on by default for all those -cases in which it is allowed. -.IP -You can force a scanner to -.I not -be interactive by using -.B \-B -(see above). -.TP -.B \-L -instructs -.I flex -not to generate -.B #line -directives. Without this option, -.I flex -peppers the generated scanner -with #line directives so error messages in the actions will be correctly -located with respect to either the original -.I flex -input file (if the errors are due to code in the input file), or -.B lex.yy.c -(if the errors are -.I flex's -fault -- you should report these sorts of errors to the email address -given below). -.TP -.B \-T -makes -.I flex -run in -.I trace -mode. It will generate a lot of messages to -.I stderr -concerning -the form of the input and the resultant non-deterministic and deterministic -finite automata. This option is mostly for use in maintaining -.I flex. -.TP -.B \-V -prints the version number to -.I stdout -and exits. -.B \-\-version -is a synonym for -.B \-V. -.TP -.B \-7 -instructs -.I flex -to generate a 7-bit scanner, i.e., one which can only recognized 7-bit -characters in its input. The advantage of using -.B \-7 -is that the scanner's tables can be up to half the size of those generated -using the -.B \-8 -option (see below). The disadvantage is that such scanners often hang -or crash if their input contains an 8-bit character. -.IP -Note, however, that unless you generate your scanner using the -.B \-Cf -or -.B \-CF -table compression options, use of -.B \-7 -will save only a small amount of table space, and make your scanner -considerably less portable. -.I Flex's -default behavior is to generate an 8-bit scanner unless you use the -.B \-Cf -or -.B \-CF, -in which case -.I flex -defaults to generating 7-bit scanners unless your site was always -configured to generate 8-bit scanners (as will often be the case -with non-USA sites). You can tell whether flex generated a 7-bit -or an 8-bit scanner by inspecting the flag summary in the -.B \-v -output as described above. -.IP -Note that if you use -.B \-Cfe -or -.B \-CFe -(those table compression options, but also using equivalence classes as -discussed see below), flex still defaults to generating an 8-bit -scanner, since usually with these compression options full 8-bit tables -are not much more expensive than 7-bit tables. -.TP -.B \-8 -instructs -.I flex -to generate an 8-bit scanner, i.e., one which can recognize 8-bit -characters. This flag is only needed for scanners generated using -.B \-Cf -or -.B \-CF, -as otherwise flex defaults to generating an 8-bit scanner anyway. -.IP -See the discussion of -.B \-7 -above for flex's default behavior and the tradeoffs between 7-bit -and 8-bit scanners. -.TP -.B \-+ -specifies that you want flex to generate a C++ -scanner class. See the section on Generating C++ Scanners below for -details. -.TP -.B \-C[aefFmr] -controls the degree of table compression and, more generally, trade-offs -between small scanners and fast scanners. -.IP -.B \-Ca -("align") instructs flex to trade off larger tables in the -generated scanner for faster performance because the elements of -the tables are better aligned for memory access and computation. On some -RISC architectures, fetching and manipulating longwords is more efficient -than with smaller-sized units such as shortwords. This option can -double the size of the tables used by your scanner. -.IP -.B \-Ce -directs -.I flex -to construct -.I equivalence classes, -i.e., sets of characters -which have identical lexical properties (for example, if the only -appearance of digits in the -.I flex -input is in the character class -"[0-9]" then the digits '0', '1', ..., '9' will all be put -in the same equivalence class). Equivalence classes usually give -dramatic reductions in the final table/object file sizes (typically -a factor of 2-5) and are pretty cheap performance-wise (one array -look-up per character scanned). -.IP -.B \-Cf -specifies that the -.I full -scanner tables should be generated - -.I flex -should not compress the -tables by taking advantages of similar transition functions for -different states. -.IP -.B \-CF -specifies that the alternate fast scanner representation (described -above under the -.B \-F -flag) -should be used. This option cannot be used with -.B \-+. -.IP -.B \-Cm -directs -.I flex -to construct -.I meta-equivalence classes, -which are sets of equivalence classes (or characters, if equivalence -classes are not being used) that are commonly used together. Meta-equivalence -classes are often a big win when using compressed tables, but they -have a moderate performance impact (one or two "if" tests and one -array look-up per character scanned). -.IP -.B \-Cr -causes the generated scanner to -.I bypass -use of the standard I/O library (stdio) for input. Instead of calling -.B fread() -or -.B getc(), -the scanner will use the -.B read() -system call, resulting in a performance gain which varies from system -to system, but in general is probably negligible unless you are also using -.B \-Cf -or -.B \-CF. -Using -.B \-Cr -can cause strange behavior if, for example, you read from -.I yyin -using stdio prior to calling the scanner (because the scanner will miss -whatever text your previous reads left in the stdio input buffer). -.IP -.B \-Cr -has no effect if you define -.B YY_INPUT -(see The Generated Scanner above). -.IP -A lone -.B \-C -specifies that the scanner tables should be compressed but neither -equivalence classes nor meta-equivalence classes should be used. -.IP -The options -.B \-Cf -or -.B \-CF -and -.B \-Cm -do not make sense together - there is no opportunity for meta-equivalence -classes if the table is not being compressed. Otherwise the options -may be freely mixed, and are cumulative. -.IP -The default setting is -.B \-Cem, -which specifies that -.I flex -should generate equivalence classes -and meta-equivalence classes. This setting provides the highest -degree of table compression. You can trade off -faster-executing scanners at the cost of larger tables with -the following generally being true: -.nf - - slowest & smallest - -Cem - -Cm - -Ce - -C - -C{f,F}e - -C{f,F} - -C{f,F}a - fastest & largest - -.fi -Note that scanners with the smallest tables are usually generated and -compiled the quickest, so -during development you will usually want to use the default, maximal -compression. -.IP -.B \-Cfe -is often a good compromise between speed and size for production -scanners. -.TP -.B \-ooutput -directs flex to write the scanner to the file -.B output -instead of -.B lex.yy.c. -If you combine -.B \-o -with the -.B \-t -option, then the scanner is written to -.I stdout -but its -.B #line -directives (see the -.B \\-L -option above) refer to the file -.B output. -.TP -.B \-Pprefix -changes the default -.I "yy" -prefix used by -.I flex -for all globally-visible variable and function names to instead be -.I prefix. -For example, -.B \-Pfoo -changes the name of -.B yytext -to -.B footext. -It also changes the name of the default output file from -.B lex.yy.c -to -.B lex.foo.c. -Here are all of the names affected: -.nf - - yy_create_buffer - yy_delete_buffer - yy_flex_debug - yy_init_buffer - yy_flush_buffer - yy_load_buffer_state - yy_switch_to_buffer - yyin - yyleng - yylex - yylineno - yyout - yyrestart - yytext - yywrap - -.fi -(If you are using a C++ scanner, then only -.B yywrap -and -.B yyFlexLexer -are affected.) -Within your scanner itself, you can still refer to the global variables -and functions using either version of their name; but externally, they -have the modified name. -.IP -This option lets you easily link together multiple -.I flex -programs into the same executable. Note, though, that using this -option also renames -.B yywrap(), -so you now -.I must -either -provide your own (appropriately-named) version of the routine for your -scanner, or use -.B %option noyywrap, -as linking with -.B \-lfl -no longer provides one for you by default. -.TP -.B \-Sskeleton_file -overrides the default skeleton file from which -.I flex -constructs its scanners. You'll never need this option unless you are doing -.I flex -maintenance or development. -.PP -.I flex -also provides a mechanism for controlling options within the -scanner specification itself, rather than from the flex command-line. -This is done by including -.B %option -directives in the first section of the scanner specification. -You can specify multiple options with a single -.B %option -directive, and multiple directives in the first section of your flex input -file. -.PP -Most options are given simply as names, optionally preceded by the -word "no" (with no intervening whitespace) to negate their meaning. -A number are equivalent to flex flags or their negation: -.nf - - 7bit -7 option - 8bit -8 option - align -Ca option - backup -b option - batch -B option - c++ -+ option - - caseful or - case-sensitive opposite of -i (default) - - case-insensitive or - caseless -i option - - debug -d option - default opposite of -s option - ecs -Ce option - fast -F option - full -f option - interactive -I option - lex-compat -l option - meta-ecs -Cm option - perf-report -p option - read -Cr option - stdout -t option - verbose -v option - warn opposite of -w option - (use "%option nowarn" for -w) - - array equivalent to "%array" - pointer equivalent to "%pointer" (default) - -.fi -Some -.B %option's -provide features otherwise not available: -.TP -.B always-interactive -instructs flex to generate a scanner which always considers its input -"interactive". Normally, on each new input file the scanner calls -.B isatty() -in an attempt to determine whether -the scanner's input source is interactive and thus should be read a -character at a time. When this option is used, however, then no -such call is made. -.TP -.B main -directs flex to provide a default -.B main() -program for the scanner, which simply calls -.B yylex(). -This option implies -.B noyywrap -(see below). -.TP -.B never-interactive -instructs flex to generate a scanner which never considers its input -"interactive" (again, no call made to -.B isatty()). -This is the opposite of -.B always-interactive. -.TP -.B stack -enables the use of start condition stacks (see Start Conditions above). -.TP -.B stdinit -if set (i.e., -.B %option stdinit) -initializes -.I yyin -and -.I yyout -to -.I stdin -and -.I stdout, -instead of the default of -.I nil. -Some existing -.I lex -programs depend on this behavior, even though it is not compliant with -ANSI C, which does not require -.I stdin -and -.I stdout -to be compile-time constant. -.TP -.B yylineno -directs -.I flex -to generate a scanner that maintains the number of the current line -read from its input in the global variable -.B yylineno. -This option is implied by -.B %option lex-compat. -.TP -.B yywrap -if unset (i.e., -.B %option noyywrap), -makes the scanner not call -.B yywrap() -upon an end-of-file, but simply assume that there are no more -files to scan (until the user points -.I yyin -at a new file and calls -.B yylex() -again). -.PP -.I flex -scans your rule actions to determine whether you use the -.B REJECT -or -.B yymore() -features. The -.B reject -and -.B yymore -options are available to override its decision as to whether you use the -options, either by setting them (e.g., -.B %option reject) -to indicate the feature is indeed used, or -unsetting them to indicate it actually is not used -(e.g., -.B %option noyymore). -.PP -Three options take string-delimited values, offset with '=': -.nf - - %option outfile="ABC" - -.fi -is equivalent to -.B -oABC, -and -.nf - - %option prefix="XYZ" - -.fi -is equivalent to -.B -PXYZ. -Finally, -.nf - - %option yyclass="foo" - -.fi -only applies when generating a C++ scanner ( -.B \-+ -option). It informs -.I flex -that you have derived -.B foo -as a subclass of -.B yyFlexLexer, -so -.I flex -will place your actions in the member function -.B foo::yylex() -instead of -.B yyFlexLexer::yylex(). -It also generates a -.B yyFlexLexer::yylex() -member function that emits a run-time error (by invoking -.B yyFlexLexer::LexerError()) -if called. -See Generating C++ Scanners, below, for additional information. -.PP -A number of options are available for lint purists who want to suppress -the appearance of unneeded routines in the generated scanner. Each of the -following, if unset -(e.g., -.B %option nounput -), results in the corresponding routine not appearing in -the generated scanner: -.nf - - input, unput - yy_push_state, yy_pop_state, yy_top_state - yy_scan_buffer, yy_scan_bytes, yy_scan_string - -.fi -(though -.B yy_push_state() -and friends won't appear anyway unless you use -.B %option stack). -.SH PERFORMANCE CONSIDERATIONS -The main design goal of -.I flex -is that it generate high-performance scanners. It has been optimized -for dealing well with large sets of rules. Aside from the effects on -scanner speed of the table compression -.B \-C -options outlined above, -there are a number of options/actions which degrade performance. These -are, from most expensive to least: -.nf - - REJECT - %option yylineno - arbitrary trailing context - - pattern sets that require backing up - %array - %option interactive - %option always-interactive - - '^' beginning-of-line operator - yymore() - -.fi -with the first three all being quite expensive and the last two -being quite cheap. Note also that -.B unput() -is implemented as a routine call that potentially does quite a bit of -work, while -.B yyless() -is a quite-cheap macro; so if just putting back some excess text you -scanned, use -.B yyless(). -.PP -.B REJECT -should be avoided at all costs when performance is important. -It is a particularly expensive option. -.PP -Getting rid of backing up is messy and often may be an enormous -amount of work for a complicated scanner. In principal, one begins -by using the -.B \-b -flag to generate a -.I lex.backup -file. For example, on the input -.nf - - %% - foo return TOK_KEYWORD; - foobar return TOK_KEYWORD; - -.fi -the file looks like: -.nf - - State #6 is non-accepting - - associated rule line numbers: - 2 3 - out-transitions: [ o ] - jam-transitions: EOF [ \\001-n p-\\177 ] - - State #8 is non-accepting - - associated rule line numbers: - 3 - out-transitions: [ a ] - jam-transitions: EOF [ \\001-` b-\\177 ] - - State #9 is non-accepting - - associated rule line numbers: - 3 - out-transitions: [ r ] - jam-transitions: EOF [ \\001-q s-\\177 ] - - Compressed tables always back up. - -.fi -The first few lines tell us that there's a scanner state in -which it can make a transition on an 'o' but not on any other -character, and that in that state the currently scanned text does not match -any rule. The state occurs when trying to match the rules found -at lines 2 and 3 in the input file. -If the scanner is in that state and then reads -something other than an 'o', it will have to back up to find -a rule which is matched. With -a bit of headscratching one can see that this must be the -state it's in when it has seen "fo". When this has happened, -if anything other than another 'o' is seen, the scanner will -have to back up to simply match the 'f' (by the default rule). -.PP -The comment regarding State #8 indicates there's a problem -when "foob" has been scanned. Indeed, on any character other -than an 'a', the scanner will have to back up to accept "foo". -Similarly, the comment for State #9 concerns when "fooba" has -been scanned and an 'r' does not follow. -.PP -The final comment reminds us that there's no point going to -all the trouble of removing backing up from the rules unless -we're using -.B \-Cf -or -.B \-CF, -since there's no performance gain doing so with compressed scanners. -.PP -The way to remove the backing up is to add "error" rules: -.nf - - %% - foo return TOK_KEYWORD; - foobar return TOK_KEYWORD; - - fooba | - foob | - fo { - /* false alarm, not really a keyword */ - return TOK_ID; - } - -.fi -.PP -Eliminating backing up among a list of keywords can also be -done using a "catch-all" rule: -.nf - - %% - foo return TOK_KEYWORD; - foobar return TOK_KEYWORD; - - [a-z]+ return TOK_ID; - -.fi -This is usually the best solution when appropriate. -.PP -Backing up messages tend to cascade. -With a complicated set of rules it's not uncommon to get hundreds -of messages. If one can decipher them, though, it often -only takes a dozen or so rules to eliminate the backing up (though -it's easy to make a mistake and have an error rule accidentally match -a valid token. A possible future -.I flex -feature will be to automatically add rules to eliminate backing up). -.PP -It's important to keep in mind that you gain the benefits of eliminating -backing up only if you eliminate -.I every -instance of backing up. Leaving just one means you gain nothing. -.PP -.I Variable -trailing context (where both the leading and trailing parts do not have -a fixed length) entails almost the same performance loss as -.B REJECT -(i.e., substantial). So when possible a rule like: -.nf - - %% - mouse|rat/(cat|dog) run(); - -.fi -is better written: -.nf - - %% - mouse/cat|dog run(); - rat/cat|dog run(); - -.fi -or as -.nf - - %% - mouse|rat/cat run(); - mouse|rat/dog run(); - -.fi -Note that here the special '|' action does -.I not -provide any savings, and can even make things worse (see -Deficiencies / Bugs below). -.LP -Another area where the user can increase a scanner's performance -(and one that's easier to implement) arises from the fact that -the longer the tokens matched, the faster the scanner will run. -This is because with long tokens the processing of most input -characters takes place in the (short) inner scanning loop, and -does not often have to go through the additional work of setting up -the scanning environment (e.g., -.B yytext) -for the action. Recall the scanner for C comments: -.nf - - %x comment - %% - int line_num = 1; - - "/*" BEGIN(comment); - - <comment>[^*\\n]* - <comment>"*"+[^*/\\n]* - <comment>\\n ++line_num; - <comment>"*"+"/" BEGIN(INITIAL); - -.fi -This could be sped up by writing it as: -.nf - - %x comment - %% - int line_num = 1; - - "/*" BEGIN(comment); - - <comment>[^*\\n]* - <comment>[^*\\n]*\\n ++line_num; - <comment>"*"+[^*/\\n]* - <comment>"*"+[^*/\\n]*\\n ++line_num; - <comment>"*"+"/" BEGIN(INITIAL); - -.fi -Now instead of each newline requiring the processing of another -action, recognizing the newlines is "distributed" over the other rules -to keep the matched text as long as possible. Note that -.I adding -rules does -.I not -slow down the scanner! The speed of the scanner is independent -of the number of rules or (modulo the considerations given at the -beginning of this section) how complicated the rules are with -regard to operators such as '*' and '|'. -.PP -A final example in speeding up a scanner: suppose you want to scan -through a file containing identifiers and keywords, one per line -and with no other extraneous characters, and recognize all the -keywords. A natural first approach is: -.nf - - %% - asm | - auto | - break | - ... etc ... - volatile | - while /* it's a keyword */ - - .|\\n /* it's not a keyword */ - -.fi -To eliminate the back-tracking, introduce a catch-all rule: -.nf - - %% - asm | - auto | - break | - ... etc ... - volatile | - while /* it's a keyword */ - - [a-z]+ | - .|\\n /* it's not a keyword */ - -.fi -Now, if it's guaranteed that there's exactly one word per line, -then we can reduce the total number of matches by a half by -merging in the recognition of newlines with that of the other -tokens: -.nf - - %% - asm\\n | - auto\\n | - break\\n | - ... etc ... - volatile\\n | - while\\n /* it's a keyword */ - - [a-z]+\\n | - .|\\n /* it's not a keyword */ - -.fi -One has to be careful here, as we have now reintroduced backing up -into the scanner. In particular, while -.I we -know that there will never be any characters in the input stream -other than letters or newlines, -.I flex -can't figure this out, and it will plan for possibly needing to back up -when it has scanned a token like "auto" and then the next character -is something other than a newline or a letter. Previously it would -then just match the "auto" rule and be done, but now it has no "auto" -rule, only a "auto\\n" rule. To eliminate the possibility of backing up, -we could either duplicate all rules but without final newlines, or, -since we never expect to encounter such an input and therefore don't -how it's classified, we can introduce one more catch-all rule, this -one which doesn't include a newline: -.nf - - %% - asm\\n | - auto\\n | - break\\n | - ... etc ... - volatile\\n | - while\\n /* it's a keyword */ - - [a-z]+\\n | - [a-z]+ | - .|\\n /* it's not a keyword */ - -.fi -Compiled with -.B \-Cf, -this is about as fast as one can get a -.I flex -scanner to go for this particular problem. -.PP -A final note: -.I flex -is slow when matching NUL's, particularly when a token contains -multiple NUL's. -It's best to write rules which match -.I short -amounts of text if it's anticipated that the text will often include NUL's. -.PP -Another final note regarding performance: as mentioned above in the section -How the Input is Matched, dynamically resizing -.B yytext -to accommodate huge tokens is a slow process because it presently requires that -the (huge) token be rescanned from the beginning. Thus if performance is -vital, you should attempt to match "large" quantities of text but not -"huge" quantities, where the cutoff between the two is at about 8K -characters/token. -.SH GENERATING C++ SCANNERS -.I flex -provides two different ways to generate scanners for use with C++. The -first way is to simply compile a scanner generated by -.I flex -using a C++ compiler instead of a C compiler. You should not encounter -any compilations errors (please report any you find to the email address -given in the Author section below). You can then use C++ code in your -rule actions instead of C code. Note that the default input source for -your scanner remains -.I yyin, -and default echoing is still done to -.I yyout. -Both of these remain -.I FILE * -variables and not C++ -.I streams. -.PP -You can also use -.I flex -to generate a C++ scanner class, using the -.B \-+ -option (or, equivalently, -.B %option c++), -which is automatically specified if the name of the flex -executable ends in a '+', such as -.I flex++. -When using this option, flex defaults to generating the scanner to the file -.B lex.yy.cc -instead of -.B lex.yy.c. -The generated scanner includes the header file -.I FlexLexer.h, -which defines the interface to two C++ classes. -.PP -The first class, -.B FlexLexer, -provides an abstract base class defining the general scanner class -interface. It provides the following member functions: -.TP -.B const char* YYText() -returns the text of the most recently matched token, the equivalent of -.B yytext. -.TP -.B int YYLeng() -returns the length of the most recently matched token, the equivalent of -.B yyleng. -.TP -.B int lineno() const -returns the current input line number -(see -.B %option yylineno), -or -.B 1 -if -.B %option yylineno -was not used. -.TP -.B void set_debug( int flag ) -sets the debugging flag for the scanner, equivalent to assigning to -.B yy_flex_debug -(see the Options section above). Note that you must build the scanner -using -.B %option debug -to include debugging information in it. -.TP -.B int debug() const -returns the current setting of the debugging flag. -.PP -Also provided are member functions equivalent to -.B yy_switch_to_buffer(), -.B yy_create_buffer() -(though the first argument is an -.B istream* -object pointer and not a -.B FILE*), -.B yy_flush_buffer(), -.B yy_delete_buffer(), -and -.B yyrestart() -(again, the first argument is a -.B istream* -object pointer). -.PP -The second class defined in -.I FlexLexer.h -is -.B yyFlexLexer, -which is derived from -.B FlexLexer. -It defines the following additional member functions: -.TP -.B -yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 ) -constructs a -.B yyFlexLexer -object using the given streams for input and output. If not specified, -the streams default to -.B cin -and -.B cout, -respectively. -.TP -.B virtual int yylex() -performs the same role is -.B yylex() -does for ordinary flex scanners: it scans the input stream, consuming -tokens, until a rule's action returns a value. If you derive a subclass -.B S -from -.B yyFlexLexer -and want to access the member functions and variables of -.B S -inside -.B yylex(), -then you need to use -.B %option yyclass="S" -to inform -.I flex -that you will be using that subclass instead of -.B yyFlexLexer. -In this case, rather than generating -.B yyFlexLexer::yylex(), -.I flex -generates -.B S::yylex() -(and also generates a dummy -.B yyFlexLexer::yylex() -that calls -.B yyFlexLexer::LexerError() -if called). -.TP -.B -virtual void switch_streams(istream* new_in = 0, -.B -ostream* new_out = 0) -reassigns -.B yyin -to -.B new_in -(if non-nil) -and -.B yyout -to -.B new_out -(ditto), deleting the previous input buffer if -.B yyin -is reassigned. -.TP -.B -int yylex( istream* new_in, ostream* new_out = 0 ) -first switches the input streams via -.B switch_streams( new_in, new_out ) -and then returns the value of -.B yylex(). -.PP -In addition, -.B yyFlexLexer -defines the following protected virtual functions which you can redefine -in derived classes to tailor the scanner: -.TP -.B -virtual int LexerInput( char* buf, int max_size ) -reads up to -.B max_size -characters into -.B buf -and returns the number of characters read. To indicate end-of-input, -return 0 characters. Note that "interactive" scanners (see the -.B \-B -and -.B \-I -flags) define the macro -.B YY_INTERACTIVE. -If you redefine -.B LexerInput() -and need to take different actions depending on whether or not -the scanner might be scanning an interactive input source, you can -test for the presence of this name via -.B #ifdef. -.TP -.B -virtual void LexerOutput( const char* buf, int size ) -writes out -.B size -characters from the buffer -.B buf, -which, while NUL-terminated, may also contain "internal" NUL's if -the scanner's rules can match text with NUL's in them. -.TP -.B -virtual void LexerError( const char* msg ) -reports a fatal error message. The default version of this function -writes the message to the stream -.B cerr -and exits. -.PP -Note that a -.B yyFlexLexer -object contains its -.I entire -scanning state. Thus you can use such objects to create reentrant -scanners. You can instantiate multiple instances of the same -.B yyFlexLexer -class, and you can also combine multiple C++ scanner classes together -in the same program using the -.B \-P -option discussed above. -.PP -Finally, note that the -.B %array -feature is not available to C++ scanner classes; you must use -.B %pointer -(the default). -.PP -Here is an example of a simple C++ scanner: -.nf - - // An example of using the flex C++ scanner class. - - %{ - int mylineno = 0; - %} - - string \\"[^\\n"]+\\" - - ws [ \\t]+ - - alpha [A-Za-z] - dig [0-9] - name ({alpha}|{dig}|\\$)({alpha}|{dig}|[_.\\-/$])* - num1 [-+]?{dig}+\\.?([eE][-+]?{dig}+)? - num2 [-+]?{dig}*\\.{dig}+([eE][-+]?{dig}+)? - number {num1}|{num2} - - %% - - {ws} /* skip blanks and tabs */ - - "/*" { - int c; - - while((c = yyinput()) != 0) - { - if(c == '\\n') - ++mylineno; - - else if(c == '*') - { - if((c = yyinput()) == '/') - break; - else - unput(c); - } - } - } - - {number} cout << "number " << YYText() << '\\n'; - - \\n mylineno++; - - {name} cout << "name " << YYText() << '\\n'; - - {string} cout << "string " << YYText() << '\\n'; - - %% - - int main( int /* argc */, char** /* argv */ ) - { - FlexLexer* lexer = new yyFlexLexer; - while(lexer->yylex() != 0) - ; - return 0; - } -.fi -If you want to create multiple (different) lexer classes, you use the -.B \-P -flag (or the -.B prefix= -option) to rename each -.B yyFlexLexer -to some other -.B xxFlexLexer. -You then can include -.B <FlexLexer.h> -in your other sources once per lexer class, first renaming -.B yyFlexLexer -as follows: -.nf - - #undef yyFlexLexer - #define yyFlexLexer xxFlexLexer - #include <FlexLexer.h> - - #undef yyFlexLexer - #define yyFlexLexer zzFlexLexer - #include <FlexLexer.h> - -.fi -if, for example, you used -.B %option prefix="xx" -for one of your scanners and -.B %option prefix="zz" -for the other. -.PP -IMPORTANT: the present form of the scanning class is -.I experimental -and may change considerably between major releases. -.SH INCOMPATIBILITIES WITH LEX AND POSIX -.I flex -is a rewrite of the AT&T Unix -.I lex -tool (the two implementations do not share any code, though), -with some extensions and incompatibilities, both of which -are of concern to those who wish to write scanners acceptable -to either implementation. Flex is fully compliant with the POSIX -.I lex -specification, except that when using -.B %pointer -(the default), a call to -.B unput() -destroys the contents of -.B yytext, -which is counter to the POSIX specification. -.PP -In this section we discuss all of the known areas of incompatibility -between flex, AT&T lex, and the POSIX specification. -.PP -.I flex's -.B \-l -option turns on maximum compatibility with the original AT&T -.I lex -implementation, at the cost of a major loss in the generated scanner's -performance. We note below which incompatibilities can be overcome -using the -.B \-l -option. -.PP -.I flex -is fully compatible with -.I lex -with the following exceptions: -.IP - -The undocumented -.I lex -scanner internal variable -.B yylineno -is not supported unless -.B \-l -or -.B %option yylineno -is used. -.IP -.B yylineno -should be maintained on a per-buffer basis, rather than a per-scanner -(single global variable) basis. -.IP -.B yylineno -is not part of the POSIX specification. -.IP - -The -.B input() -routine is not redefinable, though it may be called to read characters -following whatever has been matched by a rule. If -.B input() -encounters an end-of-file the normal -.B yywrap() -processing is done. A ``real'' end-of-file is returned by -.B input() -as -.I EOF. -.IP -Input is instead controlled by defining the -.B YY_INPUT -macro. -.IP -The -.I flex -restriction that -.B input() -cannot be redefined is in accordance with the POSIX specification, -which simply does not specify any way of controlling the -scanner's input other than by making an initial assignment to -.I yyin. -.IP - -The -.B unput() -routine is not redefinable. This restriction is in accordance with POSIX. -.IP - -.I flex -scanners are not as reentrant as -.I lex -scanners. In particular, if you have an interactive scanner and -an interrupt handler which long-jumps out of the scanner, and -the scanner is subsequently called again, you may get the following -message: -.nf - - fatal flex scanner internal error--end of buffer missed - -.fi -To reenter the scanner, first use -.nf - - yyrestart( yyin ); - -.fi -Note that this call will throw away any buffered input; usually this -isn't a problem with an interactive scanner. -.IP -Also note that flex C++ scanner classes -.I are -reentrant, so if using C++ is an option for you, you should use -them instead. See "Generating C++ Scanners" above for details. -.IP - -.B output() -is not supported. -Output from the -.B ECHO -macro is done to the file-pointer -.I yyout -(default -.I stdout). -.IP -.B output() -is not part of the POSIX specification. -.IP - -.I lex -does not support exclusive start conditions (%x), though they -are in the POSIX specification. -.IP - -When definitions are expanded, -.I flex -encloses them in parentheses. -With lex, the following: -.nf - - NAME [A-Z][A-Z0-9]* - %% - foo{NAME}? printf( "Found it\\n" ); - %% - -.fi -will not match the string "foo" because when the macro -is expanded the rule is equivalent to "foo[A-Z][A-Z0-9]*?" -and the precedence is such that the '?' is associated with -"[A-Z0-9]*". With -.I flex, -the rule will be expanded to -"foo([A-Z][A-Z0-9]*)?" and so the string "foo" will match. -.IP -Note that if the definition begins with -.B ^ -or ends with -.B $ -then it is -.I not -expanded with parentheses, to allow these operators to appear in -definitions without losing their special meanings. But the -.B <s>, /, -and -.B <<EOF>> -operators cannot be used in a -.I flex -definition. -.IP -Using -.B \-l -results in the -.I lex -behavior of no parentheses around the definition. -.IP -The POSIX specification is that the definition be enclosed in parentheses. -.IP - -Some implementations of -.I lex -allow a rule's action to begin on a separate line, if the rule's pattern -has trailing whitespace: -.nf - - %% - foo|bar<space here> - { foobar_action(); } - -.fi -.I flex -does not support this feature. -.IP - -The -.I lex -.B %r -(generate a Ratfor scanner) option is not supported. It is not part -of the POSIX specification. -.IP - -After a call to -.B unput(), -.I yytext -is undefined until the next token is matched, unless the scanner -was built using -.B %array. -This is not the case with -.I lex -or the POSIX specification. The -.B \-l -option does away with this incompatibility. -.IP - -The precedence of the -.B {} -(numeric range) operator is different. -.I lex -interprets "abc{1,3}" as "match one, two, or -three occurrences of 'abc'", whereas -.I flex -interprets it as "match 'ab' -followed by one, two, or three occurrences of 'c'". The latter is -in agreement with the POSIX specification. -.IP - -The precedence of the -.B ^ -operator is different. -.I lex -interprets "^foo|bar" as "match either 'foo' at the beginning of a line, -or 'bar' anywhere", whereas -.I flex -interprets it as "match either 'foo' or 'bar' if they come at the beginning -of a line". The latter is in agreement with the POSIX specification. -.IP - -The special table-size declarations such as -.B %a -supported by -.I lex -are not required by -.I flex -scanners; -.I flex -ignores them. -.IP - -The name -.bd -FLEX_SCANNER -is #define'd so scanners may be written for use with either -.I flex -or -.I lex. -Scanners also include -.B YY_FLEX_MAJOR_VERSION -and -.B YY_FLEX_MINOR_VERSION -indicating which version of -.I flex -generated the scanner -(for example, for the 2.5 release, these defines would be 2 and 5 -respectively). -.PP -The following -.I flex -features are not included in -.I lex -or the POSIX specification: -.nf - - C++ scanners - %option - start condition scopes - start condition stacks - interactive/non-interactive scanners - yy_scan_string() and friends - yyterminate() - yy_set_interactive() - yy_set_bol() - YY_AT_BOL() - <<EOF>> - <*> - YY_DECL - YY_START - YY_USER_ACTION - YY_USER_INIT - #line directives - %{}'s around actions - multiple actions on a line - -.fi -plus almost all of the flex flags. -The last feature in the list refers to the fact that with -.I flex -you can put multiple actions on the same line, separated with -semi-colons, while with -.I lex, -the following -.nf - - foo handle_foo(); ++num_foos_seen; - -.fi -is (rather surprisingly) truncated to -.nf - - foo handle_foo(); - -.fi -.I flex -does not truncate the action. Actions that are not enclosed in -braces are simply terminated at the end of the line. -.SH DIAGNOSTICS -.PP -.I warning, rule cannot be matched -indicates that the given rule -cannot be matched because it follows other rules that will -always match the same text as it. For -example, in the following "foo" cannot be matched because it comes after -an identifier "catch-all" rule: -.nf - - [a-z]+ got_identifier(); - foo got_foo(); - -.fi -Using -.B REJECT -in a scanner suppresses this warning. -.PP -.I warning, -.B \-s -.I -option given but default rule can be matched -means that it is possible (perhaps only in a particular start condition) -that the default rule (match any single character) is the only one -that will match a particular input. Since -.B \-s -was given, presumably this is not intended. -.PP -.I reject_used_but_not_detected undefined -or -.I yymore_used_but_not_detected undefined - -These errors can occur at compile time. They indicate that the -scanner uses -.B REJECT -or -.B yymore() -but that -.I flex -failed to notice the fact, meaning that -.I flex -scanned the first two sections looking for occurrences of these actions -and failed to find any, but somehow you snuck some in (via a #include -file, for example). Use -.B %option reject -or -.B %option yymore -to indicate to flex that you really do use these features. -.PP -.I flex scanner jammed - -a scanner compiled with -.B \-s -has encountered an input string which wasn't matched by -any of its rules. This error can also occur due to internal problems. -.PP -.I token too large, exceeds YYLMAX - -your scanner uses -.B %array -and one of its rules matched a string longer than the -.B YYLMAX -constant (8K bytes by default). You can increase the value by -#define'ing -.B YYLMAX -in the definitions section of your -.I flex -input. -.PP -.I scanner requires \-8 flag to -.I use the character 'x' - -Your scanner specification includes recognizing the 8-bit character -.I 'x' -and you did not specify the \-8 flag, and your scanner defaulted to 7-bit -because you used the -.B \-Cf -or -.B \-CF -table compression options. See the discussion of the -.B \-7 -flag for details. -.PP -.I flex scanner push-back overflow - -you used -.B unput() -to push back so much text that the scanner's buffer could not hold -both the pushed-back text and the current token in -.B yytext. -Ideally the scanner should dynamically resize the buffer in this case, but at -present it does not. -.PP -.I -input buffer overflow, can't enlarge buffer because scanner uses REJECT - -the scanner was working on matching an extremely large token and needed -to expand the input buffer. This doesn't work with scanners that use -.B -REJECT. -.PP -.I -fatal flex scanner internal error--end of buffer missed - -This can occur in an scanner which is reentered after a long-jump -has jumped out (or over) the scanner's activation frame. Before -reentering the scanner, use: -.nf - - yyrestart( yyin ); - -.fi -or, as noted above, switch to using the C++ scanner class. -.PP -.I too many start conditions in <> construct! - -you listed more start conditions in a <> construct than exist (so -you must have listed at least one of them twice). -.SH FILES -.TP -.B \-lfl -library with which scanners must be linked. -.TP -.I lex.yy.c -generated scanner (called -.I lexyy.c -on some systems). -.TP -.I lex.yy.cc -generated C++ scanner class, when using -.B -+. -.TP -.I <FlexLexer.h> -header file defining the C++ scanner base class, -.B FlexLexer, -and its derived class, -.B yyFlexLexer. -.TP -.I flex.skl -skeleton scanner. This file is only used when building flex, not when -flex executes. -.TP -.I lex.backup -backing-up information for -.B \-b -flag (called -.I lex.bck -on some systems). -.SH DEFICIENCIES / BUGS -.PP -Some trailing context -patterns cannot be properly matched and generate -warning messages ("dangerous trailing context"). These are -patterns where the ending of the -first part of the rule matches the beginning of the second -part, such as "zx*/xy*", where the 'x*' matches the 'x' at -the beginning of the trailing context. (Note that the POSIX draft -states that the text matched by such patterns is undefined.) -.PP -For some trailing context rules, parts which are actually fixed-length are -not recognized as such, leading to the abovementioned performance loss. -In particular, parts using '|' or {n} (such as "foo{3}") are always -considered variable-length. -.PP -Combining trailing context with the special '|' action can result in -.I fixed -trailing context being turned into the more expensive -.I variable -trailing context. For example, in the following: -.nf - - %% - abc | - xyz/def - -.fi -.PP -Use of -.B unput() -invalidates yytext and yyleng, unless the -.B %array -directive -or the -.B \-l -option has been used. -.PP -Pattern-matching of NUL's is substantially slower than matching other -characters. -.PP -Dynamic resizing of the input buffer is slow, as it entails rescanning -all the text matched so far by the current (generally huge) token. -.PP -Due to both buffering of input and read-ahead, you cannot intermix -calls to <stdio.h> routines, such as, for example, -.B getchar(), -with -.I flex -rules and expect it to work. Call -.B input() -instead. -.PP -The total table entries listed by the -.B \-v -flag excludes the number of table entries needed to determine -what rule has been matched. The number of entries is equal -to the number of DFA states if the scanner does not use -.B REJECT, -and somewhat greater than the number of states if it does. -.PP -.B REJECT -cannot be used with the -.B \-f -or -.B \-F -options. -.PP -The -.I flex -internal algorithms need documentation. -.SH SEE ALSO -.PP -lex(1), yacc(1), sed(1), awk(1). -.PP -John Levine, Tony Mason, and Doug Brown, -.I Lex & Yacc, -O'Reilly and Associates. Be sure to get the 2nd edition. -.PP -M. E. Lesk and E. Schmidt, -.I LEX \- Lexical Analyzer Generator -.PP -Alfred Aho, Ravi Sethi and Jeffrey Ullman, -.I Compilers: Principles, Techniques and Tools, -Addison-Wesley (1986). Describes the pattern-matching techniques used by -.I flex -(deterministic finite automata). -.SH AUTHOR -Vern Paxson, with the help of many ideas and much inspiration from -Van Jacobson. Original version by Jef Poskanzer. The fast table -representation is a partial implementation of a design done by Van -Jacobson. The implementation was done by Kevin Gong and Vern Paxson. -.PP -Thanks to the many -.I flex -beta-testers, feedbackers, and contributors, especially Francois Pinard, -Casey Leedom, -Robert Abramovitz, -Stan Adermann, Terry Allen, David Barker-Plummer, John Basrai, -Neal Becker, Nelson H.F. Beebe, benson@odi.com, -Karl Berry, Peter A. Bigot, Simon Blanchard, -Keith Bostic, Frederic Brehm, Ian Brockbank, Kin Cho, Nick Christopher, -Brian Clapper, J.T. Conklin, -Jason Coughlin, Bill Cox, Nick Cropper, Dave Curtis, Scott David -Daniels, Chris G. Demetriou, Theo Deraadt, -Mike Donahue, Chuck Doucette, Tom Epperly, Leo Eskin, -Chris Faylor, Chris Flatters, Jon Forrest, Jeffrey Friedl, -Joe Gayda, Kaveh R. Ghazi, Wolfgang Glunz, -Eric Goldman, Christopher M. Gould, Ulrich Grepel, Peer Griebel, -Jan Hajic, Charles Hemphill, NORO Hideo, -Jarkko Hietaniemi, Scott Hofmann, -Jeff Honig, Dana Hudes, Eric Hughes, John Interrante, -Ceriel Jacobs, Michal Jaegermann, Sakari Jalovaara, Jeffrey R. Jones, -Henry Juengst, Klaus Kaempf, Jonathan I. Kamens, Terrence O Kane, -Amir Katz, ken@ken.hilco.com, Kevin B. Kenny, -Steve Kirsch, Winfried Koenig, Marq Kole, Ronald Lamprecht, -Greg Lee, Rohan Lenard, Craig Leres, John Levine, Steve Liddle, -David Loffredo, Mike Long, -Mohamed el Lozy, Brian Madsen, Malte, Joe Marshall, -Bengt Martensson, Chris Metcalf, -Luke Mewburn, Jim Meyering, R. Alexander Milowski, Erik Naggum, -G.T. Nicol, Landon Noll, James Nordby, Marc Nozell, -Richard Ohnemus, Karsten Pahnke, -Sven Panne, Roland Pesch, Walter Pelissero, Gaumond -Pierre, Esmond Pitt, Jef Poskanzer, Joe Rahmeh, Jarmo Raiha, -Frederic Raimbault, Pat Rankin, Rick Richardson, -Kevin Rodgers, Kai Uwe Rommel, Jim Roskind, Alberto Santini, -Andreas Scherer, Darrell Schiebel, Raf Schietekat, -Doug Schmidt, Philippe Schnoebelen, Andreas Schwab, -Larry Schwimmer, Alex Siegel, Eckehard Stolz, Jan-Erik Strvmquist, -Mike Stump, Paul Stuart, Dave Tallman, Ian Lance Taylor, -Chris Thewalt, Richard M. Timoney, Jodi Tsai, -Paul Tuinenga, Gary Weik, Frank Whaley, Gerhard Wilhelms, Kent Williams, Ken -Yap, Ron Zellar, Nathan Zelle, David Zuhn, -and those whose names have slipped my marginal -mail-archiving skills but whose contributions are appreciated all the -same. -.PP -Thanks to Keith Bostic, Jon Forrest, Noah Friedman, -John Gilmore, Craig Leres, John Levine, Bob Mulcahy, G.T. -Nicol, Francois Pinard, Rich Salz, and Richard Stallman for help with various -distribution headaches. -.PP -Thanks to Esmond Pitt and Earle Horton for 8-bit character support; to -Benson Margulies and Fred Burke for C++ support; to Kent Williams and Tom -Epperly for C++ class support; to Ove Ewerlid for support of NUL's; and to -Eric Hughes for support of multiple buffers. -.PP -This work was primarily done when I was with the Real Time Systems Group -at the Lawrence Berkeley Laboratory in Berkeley, CA. Many thanks to all there -for the support I received. -.PP -Send comments to vern@ee.lbl.gov. diff --git a/usr.bin/lex/lib/Makefile b/usr.bin/lex/lib/Makefile deleted file mode 100644 index 406e542a9149..000000000000 --- a/usr.bin/lex/lib/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# $Id$ - -LIB= ln -SRCS= libmain.c libyywrap.c -LINKS= ${LIBDIR}/libln.a ${LIBDIR}/libl.a \ - -.if !defined(NOPROFILE) -LINKS+= ${LIBDIR}/libln_p.a ${LIBDIR}/libl_p.a -.endif - -.if !defined(NOSHARED) -LINKS+= ${LIBDIR}/libln.so.$(SHLIB_MAJOR).$(SHLIB_MINOR) \ - ${LIBDIR}/libl.so.$(SHLIB_MAJOR).$(SHLIB_MINOR) -.endif - -#This is where we get our SHLIB_MAJOR and SHLIB_MINOR -.include "${.CURDIR}/../../../lib/Makefile.inc" - -.include <bsd.lib.mk> - diff --git a/usr.bin/lex/lib/libmain.c b/usr.bin/lex/lib/libmain.c deleted file mode 100644 index 6c43b085fb64..000000000000 --- a/usr.bin/lex/lib/libmain.c +++ /dev/null @@ -1,15 +0,0 @@ -/* libmain - flex run-time support library "main" function */ - -/* $Header: /home/daffy/u0/vern/flex/RCS/libmain.c,v 1.4 95/09/27 12:47:55 vern Exp $ */ - -extern int yylex(); - -int main( argc, argv ) -int argc; -char *argv[]; - { - while ( yylex() != 0 ) - ; - - return 0; - } diff --git a/usr.bin/lex/lib/libyywrap.c b/usr.bin/lex/lib/libyywrap.c deleted file mode 100644 index b18f54e6e8f9..000000000000 --- a/usr.bin/lex/lib/libyywrap.c +++ /dev/null @@ -1,8 +0,0 @@ -/* libyywrap - flex run-time support library "yywrap" function */ - -/* $Header: /home/daffy/u0/vern/flex/RCS/libyywrap.c,v 1.1 93/10/02 15:23:09 vern Exp $ */ - -int yywrap() - { - return 1; - } diff --git a/usr.bin/lex/main.c b/usr.bin/lex/main.c deleted file mode 100644 index 9ca21ff36014..000000000000 --- a/usr.bin/lex/main.c +++ /dev/null @@ -1,1177 +0,0 @@ -/* flex - tool to generate fast lexical analyzers */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef lint -char copyright[] = -"@(#) Copyright (c) 1990 The Regents of the University of California.\n\ - All rights reserved.\n"; -#endif /* not lint */ - -/* $Header: /home/daffy/u0/vern/flex/RCS/main.c,v 2.64 96/05/25 20:42:42 vern Exp $ */ - - -#include "flexdef.h" -#include "version.h" - -static char flex_version[] = FLEX_VERSION; - - -/* declare functions that have forward references */ - -void flexinit PROTO((int, char**)); -void readin PROTO((void)); -void set_up_initial_allocations PROTO((void)); - -#ifdef NEED_ARGV_FIXUP -extern void argv_fixup PROTO((int *, char ***)); -#endif - - -/* these globals are all defined and commented in flexdef.h */ -int printstats, syntaxerror, eofseen, ddebug, trace, nowarn, spprdflt; -int interactive, caseins, lex_compat, do_yylineno, useecs, fulltbl, usemecs; -int fullspd, gen_line_dirs, performance_report, backing_up_report; -int C_plus_plus, long_align, use_read, yytext_is_array, do_yywrap, csize; -int yymore_used, reject, real_reject, continued_action, in_rule; -int yymore_really_used, reject_really_used; -int datapos, dataline, linenum, out_linenum; -FILE *skelfile = NULL; -int skel_ind = 0; -char *action_array; -int action_size, defs1_offset, prolog_offset, action_offset, action_index; -char *infilename = NULL, *outfilename = NULL; -int did_outfilename; -char *prefix, *yyclass; -int do_stdinit, use_stdout; -int onestate[ONE_STACK_SIZE], onesym[ONE_STACK_SIZE]; -int onenext[ONE_STACK_SIZE], onedef[ONE_STACK_SIZE], onesp; -int current_mns, current_max_rules; -int num_rules, num_eof_rules, default_rule, lastnfa; -int *firstst, *lastst, *finalst, *transchar, *trans1, *trans2; -int *accptnum, *assoc_rule, *state_type; -int *rule_type, *rule_linenum, *rule_useful; -int current_state_type; -int variable_trailing_context_rules; -int numtemps, numprots, protprev[MSP], protnext[MSP], prottbl[MSP]; -int protcomst[MSP], firstprot, lastprot, protsave[PROT_SAVE_SIZE]; -int numecs, nextecm[CSIZE + 1], ecgroup[CSIZE + 1], nummecs, tecfwd[CSIZE + 1]; -int tecbck[CSIZE + 1]; -int lastsc, *scset, *scbol, *scxclu, *sceof; -int current_max_scs; -char **scname; -int current_max_dfa_size, current_max_xpairs; -int current_max_template_xpairs, current_max_dfas; -int lastdfa, *nxt, *chk, *tnxt; -int *base, *def, *nultrans, NUL_ec, tblend, firstfree, **dss, *dfasiz; -union dfaacc_union *dfaacc; -int *accsiz, *dhash, numas; -int numsnpairs, jambase, jamstate; -int lastccl, *cclmap, *ccllen, *cclng, cclreuse; -int current_maxccls, current_max_ccl_tbl_size; -Char *ccltbl; -char nmstr[MAXLINE]; -int sectnum, nummt, hshcol, dfaeql, numeps, eps2, num_reallocs; -int tmpuses, totnst, peakpairs, numuniq, numdup, hshsave; -int num_backing_up, bol_needed; -FILE *backing_up_file; -int end_of_buffer_state; -char **input_files; -int num_input_files; - -/* Make sure program_name is initialized so we don't crash if writing - * out an error message before getting the program name from argv[0]. - */ -char *program_name = "flex"; - -#ifndef SHORT_FILE_NAMES -static char *outfile_template = "lex.%s.%s"; -static char *backing_name = "lex.backup"; -#else -static char *outfile_template = "lex%s.%s"; -static char *backing_name = "lex.bck"; -#endif - -#ifdef THINK_C -#include <console.h> -#endif - -#ifdef MS_DOS -extern unsigned _stklen = 16384; -#endif - -static char outfile_path[MAXLINE]; -static int outfile_created = 0; -static char *skelname = NULL; - - -int main( argc, argv ) -int argc; -char **argv; - { - int i; - -#ifdef THINK_C - argc = ccommand( &argv ); -#endif -#ifdef NEED_ARGV_FIXUP - argv_fixup( &argc, &argv ); -#endif - - flexinit( argc, argv ); - - readin(); - - ntod(); - - for ( i = 1; i <= num_rules; ++i ) - if ( ! rule_useful[i] && i != default_rule ) - line_warning( _( "rule cannot be matched" ), - rule_linenum[i] ); - - if ( spprdflt && ! reject && rule_useful[default_rule] ) - line_warning( - _( "-s option given but default rule can be matched" ), - rule_linenum[default_rule] ); - - /* Generate the C state transition tables from the DFA. */ - make_tables(); - - /* Note, flexend does not return. It exits with its argument - * as status. - */ - flexend( 0 ); - - return 0; /* keep compilers/lint happy */ - } - - -/* check_options - check user-specified options */ - -void check_options() - { - int i; - - if ( lex_compat ) - { - if ( C_plus_plus ) - flexerror( _( "Can't use -+ with -l option" ) ); - - if ( fulltbl || fullspd ) - flexerror( _( "Can't use -f or -F with -l option" ) ); - - /* Don't rely on detecting use of yymore() and REJECT, - * just assume they'll be used. - */ - yymore_really_used = reject_really_used = true; - - yytext_is_array = true; - do_yylineno = true; - use_read = false; - } - - if ( do_yylineno ) - /* This should really be "maintain_backup_tables = true" */ - reject_really_used = true; - - if ( csize == unspecified ) - { - if ( (fulltbl || fullspd) && ! useecs ) - csize = DEFAULT_CSIZE; - else - csize = CSIZE; - } - - if ( interactive == unspecified ) - { - if ( fulltbl || fullspd ) - interactive = false; - else - interactive = true; - } - - if ( fulltbl || fullspd ) - { - if ( usemecs ) - flexerror( - _( "-Cf/-CF and -Cm don't make sense together" ) ); - - if ( interactive ) - flexerror( _( "-Cf/-CF and -I are incompatible" ) ); - - if ( lex_compat ) - flexerror( - _( "-Cf/-CF are incompatible with lex-compatibility mode" ) ); - - if ( do_yylineno ) - flexerror( - _( "-Cf/-CF and %option yylineno are incompatible" ) ); - - if ( fulltbl && fullspd ) - flexerror( _( "-Cf and -CF are mutually exclusive" ) ); - } - - if ( C_plus_plus && fullspd ) - flexerror( _( "Can't use -+ with -CF option" ) ); - - if ( C_plus_plus && yytext_is_array ) - { - warn( _( "%array incompatible with -+ option" ) ); - yytext_is_array = false; - } - - if ( useecs ) - { /* Set up doubly-linked equivalence classes. */ - - /* We loop all the way up to csize, since ecgroup[csize] is - * the position used for NUL characters. - */ - ecgroup[1] = NIL; - - for ( i = 2; i <= csize; ++i ) - { - ecgroup[i] = i - 1; - nextecm[i - 1] = i; - } - - nextecm[csize] = NIL; - } - - else - { - /* Put everything in its own equivalence class. */ - for ( i = 1; i <= csize; ++i ) - { - ecgroup[i] = i; - nextecm[i] = BAD_SUBSCRIPT; /* to catch errors */ - } - } - - if ( ! use_stdout ) - { - FILE *prev_stdout; - - if ( ! did_outfilename ) - { - char *suffix; - - if ( C_plus_plus ) - suffix = "cc"; - else - suffix = "c"; - - sprintf( outfile_path, outfile_template, - prefix, suffix ); - - outfilename = outfile_path; - } - - prev_stdout = freopen( outfilename, "w", stdout ); - - if ( prev_stdout == NULL ) - lerrsf( _( "could not create %s" ), outfilename ); - - outfile_created = 1; - } - - if ( skelname && (skelfile = fopen( skelname, "r" )) == NULL ) - lerrsf( _( "can't open skeleton file %s" ), skelname ); - - if ( strcmp( prefix, "yy" ) ) - { -#define GEN_PREFIX(name) out_str3( "#define yy%s %s%s\n", name, prefix, name ) - if ( C_plus_plus ) - GEN_PREFIX( "FlexLexer" ); - else - { - GEN_PREFIX( "_create_buffer" ); - GEN_PREFIX( "_delete_buffer" ); - GEN_PREFIX( "_scan_buffer" ); - GEN_PREFIX( "_scan_string" ); - GEN_PREFIX( "_scan_bytes" ); - GEN_PREFIX( "_flex_debug" ); - GEN_PREFIX( "_init_buffer" ); - GEN_PREFIX( "_flush_buffer" ); - GEN_PREFIX( "_load_buffer_state" ); - GEN_PREFIX( "_switch_to_buffer" ); - GEN_PREFIX( "in" ); - GEN_PREFIX( "leng" ); - GEN_PREFIX( "lex" ); - GEN_PREFIX( "out" ); - GEN_PREFIX( "restart" ); - GEN_PREFIX( "text" ); - - if ( do_yylineno ) - GEN_PREFIX( "lineno" ); - } - - if ( do_yywrap ) - GEN_PREFIX( "wrap" ); - - outn( "" ); - } - - if ( did_outfilename ) - line_directive_out( stdout, 0 ); - - skelout(); - } - - -/* flexend - terminate flex - * - * note - * This routine does not return. - */ - -void flexend( exit_status ) -int exit_status; - - { - int tblsiz; - int unlink(); - - if ( skelfile != NULL ) - { - if ( ferror( skelfile ) ) - lerrsf( _( "input error reading skeleton file %s" ), - skelname ); - - else if ( fclose( skelfile ) ) - lerrsf( _( "error closing skeleton file %s" ), - skelname ); - } - - if ( exit_status != 0 && outfile_created ) - { - if ( ferror( stdout ) ) - lerrsf( _( "error writing output file %s" ), - outfilename ); - - else if ( fclose( stdout ) ) - lerrsf( _( "error closing output file %s" ), - outfilename ); - - else if ( unlink( outfilename ) ) - lerrsf( _( "error deleting output file %s" ), - outfilename ); - } - - if ( backing_up_report && backing_up_file ) - { - if ( num_backing_up == 0 ) - fprintf( backing_up_file, _( "No backing up.\n" ) ); - else if ( fullspd || fulltbl ) - fprintf( backing_up_file, - _( "%d backing up (non-accepting) states.\n" ), - num_backing_up ); - else - fprintf( backing_up_file, - _( "Compressed tables always back up.\n" ) ); - - if ( ferror( backing_up_file ) ) - lerrsf( _( "error writing backup file %s" ), - backing_name ); - - else if ( fclose( backing_up_file ) ) - lerrsf( _( "error closing backup file %s" ), - backing_name ); - } - - if ( printstats ) - { - fprintf( stderr, _( "%s version %s usage statistics:\n" ), - program_name, flex_version ); - - fprintf( stderr, _( " scanner options: -" ) ); - - if ( C_plus_plus ) - putc( '+', stderr ); - if ( backing_up_report ) - putc( 'b', stderr ); - if ( ddebug ) - putc( 'd', stderr ); - if ( caseins ) - putc( 'i', stderr ); - if ( lex_compat ) - putc( 'l', stderr ); - if ( performance_report > 0 ) - putc( 'p', stderr ); - if ( performance_report > 1 ) - putc( 'p', stderr ); - if ( spprdflt ) - putc( 's', stderr ); - if ( use_stdout ) - putc( 't', stderr ); - if ( printstats ) - putc( 'v', stderr ); /* always true! */ - if ( nowarn ) - putc( 'w', stderr ); - if ( interactive == false ) - putc( 'B', stderr ); - if ( interactive == true ) - putc( 'I', stderr ); - if ( ! gen_line_dirs ) - putc( 'L', stderr ); - if ( trace ) - putc( 'T', stderr ); - - if ( csize == unspecified ) - /* We encountered an error fairly early on, so csize - * never got specified. Define it now, to prevent - * bogus table sizes being written out below. - */ - csize = 256; - - if ( csize == 128 ) - putc( '7', stderr ); - else - putc( '8', stderr ); - - fprintf( stderr, " -C" ); - - if ( long_align ) - putc( 'a', stderr ); - if ( fulltbl ) - putc( 'f', stderr ); - if ( fullspd ) - putc( 'F', stderr ); - if ( useecs ) - putc( 'e', stderr ); - if ( usemecs ) - putc( 'm', stderr ); - if ( use_read ) - putc( 'r', stderr ); - - if ( did_outfilename ) - fprintf( stderr, " -o%s", outfilename ); - - if ( skelname ) - fprintf( stderr, " -S%s", skelname ); - - if ( strcmp( prefix, "yy" ) ) - fprintf( stderr, " -P%s", prefix ); - - putc( '\n', stderr ); - - fprintf( stderr, _( " %d/%d NFA states\n" ), - lastnfa, current_mns ); - fprintf( stderr, _( " %d/%d DFA states (%d words)\n" ), - lastdfa, current_max_dfas, totnst ); - fprintf( stderr, _( " %d rules\n" ), - num_rules + num_eof_rules - 1 /* - 1 for def. rule */ ); - - if ( num_backing_up == 0 ) - fprintf( stderr, _( " No backing up\n" ) ); - else if ( fullspd || fulltbl ) - fprintf( stderr, - _( " %d backing-up (non-accepting) states\n" ), - num_backing_up ); - else - fprintf( stderr, - _( " Compressed tables always back-up\n" ) ); - - if ( bol_needed ) - fprintf( stderr, - _( " Beginning-of-line patterns used\n" ) ); - - fprintf( stderr, _( " %d/%d start conditions\n" ), lastsc, - current_max_scs ); - fprintf( stderr, - _( " %d epsilon states, %d double epsilon states\n" ), - numeps, eps2 ); - - if ( lastccl == 0 ) - fprintf( stderr, _( " no character classes\n" ) ); - else - fprintf( stderr, -_( " %d/%d character classes needed %d/%d words of storage, %d reused\n" ), - lastccl, current_maxccls, - cclmap[lastccl] + ccllen[lastccl], - current_max_ccl_tbl_size, cclreuse ); - - fprintf( stderr, _( " %d state/nextstate pairs created\n" ), - numsnpairs ); - fprintf( stderr, _( " %d/%d unique/duplicate transitions\n" ), - numuniq, numdup ); - - if ( fulltbl ) - { - tblsiz = lastdfa * numecs; - fprintf( stderr, _( " %d table entries\n" ), tblsiz ); - } - - else - { - tblsiz = 2 * (lastdfa + numtemps) + 2 * tblend; - - fprintf( stderr, - _( " %d/%d base-def entries created\n" ), - lastdfa + numtemps, current_max_dfas ); - fprintf( stderr, - _( " %d/%d (peak %d) nxt-chk entries created\n" ), - tblend, current_max_xpairs, peakpairs ); - fprintf( stderr, - _( " %d/%d (peak %d) template nxt-chk entries created\n" ), - numtemps * nummecs, - current_max_template_xpairs, - numtemps * numecs ); - fprintf( stderr, _( " %d empty table entries\n" ), - nummt ); - fprintf( stderr, _( " %d protos created\n" ), - numprots ); - fprintf( stderr, - _( " %d templates created, %d uses\n" ), - numtemps, tmpuses ); - } - - if ( useecs ) - { - tblsiz = tblsiz + csize; - fprintf( stderr, - _( " %d/%d equivalence classes created\n" ), - numecs, csize ); - } - - if ( usemecs ) - { - tblsiz = tblsiz + numecs; - fprintf( stderr, - _( " %d/%d meta-equivalence classes created\n" ), - nummecs, csize ); - } - - fprintf( stderr, - _( " %d (%d saved) hash collisions, %d DFAs equal\n" ), - hshcol, hshsave, dfaeql ); - fprintf( stderr, _( " %d sets of reallocations needed\n" ), - num_reallocs ); - fprintf( stderr, _( " %d total table entries needed\n" ), - tblsiz ); - } - - exit( exit_status ); - } - - -/* flexinit - initialize flex */ - -void flexinit( argc, argv ) -int argc; -char **argv; - { - int i, sawcmpflag; - char *arg; - - printstats = syntaxerror = trace = spprdflt = caseins = false; - lex_compat = C_plus_plus = backing_up_report = ddebug = fulltbl = false; - fullspd = long_align = nowarn = yymore_used = continued_action = false; - do_yylineno = yytext_is_array = in_rule = reject = do_stdinit = false; - yymore_really_used = reject_really_used = unspecified; - interactive = csize = unspecified; - do_yywrap = gen_line_dirs = usemecs = useecs = true; - performance_report = 0; - did_outfilename = 0; - prefix = "yy"; - yyclass = 0; - use_read = use_stdout = false; - - sawcmpflag = false; - - /* Initialize dynamic array for holding the rule actions. */ - action_size = 2048; /* default size of action array in bytes */ - action_array = allocate_character_array( action_size ); - defs1_offset = prolog_offset = action_offset = action_index = 0; - action_array[0] = '\0'; - - program_name = argv[0]; - - if ( program_name[0] != '\0' && - program_name[strlen( program_name ) - 1] == '+' ) - C_plus_plus = true; - - /* read flags */ - for ( --argc, ++argv; argc ; --argc, ++argv ) - { - arg = argv[0]; - - if ( arg[0] != '-' || arg[1] == '\0' ) - break; - - if ( arg[1] == '-' ) - { /* --option */ - if ( ! strcmp( arg, "--help" ) ) - arg = "-h"; - - else if ( ! strcmp( arg, "--version" ) ) - arg = "-V"; - - else if ( ! strcmp( arg, "--" ) ) - { /* end of options */ - --argc; - ++argv; - break; - } - } - - for ( i = 1; arg[i] != '\0'; ++i ) - switch ( arg[i] ) - { - case '+': - C_plus_plus = true; - break; - - case 'B': - interactive = false; - break; - - case 'b': - backing_up_report = true; - break; - - case 'c': - break; - - case 'C': - if ( i != 1 ) - flexerror( - _( "-C flag must be given separately" ) ); - - if ( ! sawcmpflag ) - { - useecs = false; - usemecs = false; - fulltbl = false; - sawcmpflag = true; - } - - for ( ++i; arg[i] != '\0'; ++i ) - switch ( arg[i] ) - { - case 'a': - long_align = - true; - break; - - case 'e': - useecs = true; - break; - - case 'F': - fullspd = true; - break; - - case 'f': - fulltbl = true; - break; - - case 'm': - usemecs = true; - break; - - case 'r': - use_read = true; - break; - - default: - lerrif( - _( "unknown -C option '%c'" ), - (int) arg[i] ); - break; - } - - goto get_next_arg; - - case 'd': - ddebug = true; - break; - - case 'f': - useecs = usemecs = false; - use_read = fulltbl = true; - break; - - case 'F': - useecs = usemecs = false; - use_read = fullspd = true; - break; - - case '?': - case 'h': - usage(); - exit( 0 ); - - case 'I': - interactive = true; - break; - - case 'i': - caseins = true; - break; - - case 'l': - lex_compat = true; - break; - - case 'L': - gen_line_dirs = false; - break; - - case 'n': - /* Stupid do-nothing deprecated - * option. - */ - break; - - case 'o': - if ( i != 1 ) - flexerror( - _( "-o flag must be given separately" ) ); - - outfilename = arg + i + 1; - did_outfilename = 1; - goto get_next_arg; - - case 'P': - if ( i != 1 ) - flexerror( - _( "-P flag must be given separately" ) ); - - prefix = arg + i + 1; - goto get_next_arg; - - case 'p': - ++performance_report; - break; - - case 'S': - if ( i != 1 ) - flexerror( - _( "-S flag must be given separately" ) ); - - skelname = arg + i + 1; - goto get_next_arg; - - case 's': - spprdflt = true; - break; - - case 't': - use_stdout = true; - break; - - case 'T': - trace = true; - break; - - case 'v': - printstats = true; - break; - - case 'V': - printf( _( "%s version %s\n" ), - program_name, flex_version ); - exit( 0 ); - - case 'w': - nowarn = true; - break; - - case '7': - csize = 128; - break; - - case '8': - csize = CSIZE; - break; - - default: - fprintf( stderr, - _( "%s: unknown flag '%c'. For usage, try\n\t%s --help\n" ), - program_name, (int) arg[i], - program_name ); - exit( 1 ); - } - - /* Used by -C, -S, -o, and -P flags in lieu of a "continue 2" - * control. - */ - get_next_arg: ; - } - - num_input_files = argc; - input_files = argv; - set_input_file( num_input_files > 0 ? input_files[0] : NULL ); - - lastccl = lastsc = lastdfa = lastnfa = 0; - num_rules = num_eof_rules = default_rule = 0; - numas = numsnpairs = tmpuses = 0; - numecs = numeps = eps2 = num_reallocs = hshcol = dfaeql = totnst = 0; - numuniq = numdup = hshsave = eofseen = datapos = dataline = 0; - num_backing_up = onesp = numprots = 0; - variable_trailing_context_rules = bol_needed = false; - - out_linenum = linenum = sectnum = 1; - firstprot = NIL; - - /* Used in mkprot() so that the first proto goes in slot 1 - * of the proto queue. - */ - lastprot = 1; - - set_up_initial_allocations(); - } - - -/* readin - read in the rules section of the input file(s) */ - -void readin() - { - static char yy_stdinit[] = "FILE *yyin = stdin, *yyout = stdout;"; - static char yy_nostdinit[] = - "FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;"; - - line_directive_out( (FILE *) 0, 1 ); - - if ( yyparse() ) - { - pinpoint_message( _( "fatal parse error" ) ); - flexend( 1 ); - } - - if ( syntaxerror ) - flexend( 1 ); - - if ( backing_up_report ) - { - backing_up_file = fopen( backing_name, "w" ); - if ( backing_up_file == NULL ) - lerrsf( - _( "could not create backing-up info file %s" ), - backing_name ); - } - - else - backing_up_file = NULL; - - if ( yymore_really_used == true ) - yymore_used = true; - else if ( yymore_really_used == false ) - yymore_used = false; - - if ( reject_really_used == true ) - reject = true; - else if ( reject_really_used == false ) - reject = false; - - if ( performance_report > 0 ) - { - if ( lex_compat ) - { - fprintf( stderr, -_( "-l AT&T lex compatibility option entails a large performance penalty\n" ) ); - fprintf( stderr, -_( " and may be the actual source of other reported performance penalties\n" ) ); - } - - else if ( do_yylineno ) - { - fprintf( stderr, - _( "%%option yylineno entails a large performance penalty\n" ) ); - } - - if ( performance_report > 1 ) - { - if ( interactive ) - fprintf( stderr, - _( "-I (interactive) entails a minor performance penalty\n" ) ); - - if ( yymore_used ) - fprintf( stderr, - _( "yymore() entails a minor performance penalty\n" ) ); - } - - if ( reject ) - fprintf( stderr, - _( "REJECT entails a large performance penalty\n" ) ); - - if ( variable_trailing_context_rules ) - fprintf( stderr, -_( "Variable trailing context rules entail a large performance penalty\n" ) ); - } - - if ( reject ) - real_reject = true; - - if ( variable_trailing_context_rules ) - reject = true; - - if ( (fulltbl || fullspd) && reject ) - { - if ( real_reject ) - flexerror( - _( "REJECT cannot be used with -f or -F" ) ); - else if ( do_yylineno ) - flexerror( - _( "%option yylineno cannot be used with -f or -F" ) ); - else - flexerror( - _( "variable trailing context rules cannot be used with -f or -F" ) ); - } - - if ( reject ) - outn( "\n#define YY_USES_REJECT" ); - - if ( ! do_yywrap ) - { - outn( "\n#define yywrap() 1" ); - outn( "#define YY_SKIP_YYWRAP" ); - } - - if ( ddebug ) - outn( "\n#define FLEX_DEBUG" ); - - if ( csize == 256 ) - outn( "typedef unsigned char YY_CHAR;" ); - else - outn( "typedef char YY_CHAR;" ); - - if ( C_plus_plus ) - { - outn( "#define yytext_ptr yytext" ); - - if ( interactive ) - outn( "#define YY_INTERACTIVE" ); - } - - else - { - if ( do_stdinit ) - { - outn( "#ifdef VMS" ); - outn( "#ifndef __VMS_POSIX" ); - outn( yy_nostdinit ); - outn( "#else" ); - outn( yy_stdinit ); - outn( "#endif" ); - outn( "#else" ); - outn( yy_stdinit ); - outn( "#endif" ); - } - - else - outn( yy_nostdinit ); - } - - if ( fullspd ) - outn( "typedef yyconst struct yy_trans_info *yy_state_type;" ); - else if ( ! C_plus_plus ) - outn( "typedef int yy_state_type;" ); - - if ( ddebug ) - outn( "\n#define FLEX_DEBUG" ); - - if ( lex_compat ) - outn( "#define YY_FLEX_LEX_COMPAT" ); - - if ( do_yylineno && ! C_plus_plus ) - { - outn( "extern int yylineno;" ); - outn( "int yylineno = 1;" ); - } - - if ( C_plus_plus ) - { - outn( "\n#include <FlexLexer.h>" ); - - if ( yyclass ) - { - outn( "int yyFlexLexer::yylex()" ); - outn( "\t{" ); - outn( -"\tLexerError( \"yyFlexLexer::yylex invoked but %option yyclass used\" );" ); - outn( "\treturn 0;" ); - outn( "\t}" ); - - out_str( "\n#define YY_DECL int %s::yylex()\n", - yyclass ); - } - } - - else - { - if ( yytext_is_array ) - outn( "extern char yytext[];\n" ); - - else - { - outn( "extern char *yytext;" ); - outn( "#define yytext_ptr yytext" ); - } - - if ( yyclass ) - flexerror( - _( "%option yyclass only meaningful for C++ scanners" ) ); - } - - if ( useecs ) - numecs = cre8ecs( nextecm, ecgroup, csize ); - else - numecs = csize; - - /* Now map the equivalence class for NUL to its expected place. */ - ecgroup[0] = ecgroup[csize]; - NUL_ec = ABS( ecgroup[0] ); - - if ( useecs ) - ccl2ecl(); - } - - -/* set_up_initial_allocations - allocate memory for internal tables */ - -void set_up_initial_allocations() - { - current_mns = INITIAL_MNS; - firstst = allocate_integer_array( current_mns ); - lastst = allocate_integer_array( current_mns ); - finalst = allocate_integer_array( current_mns ); - transchar = allocate_integer_array( current_mns ); - trans1 = allocate_integer_array( current_mns ); - trans2 = allocate_integer_array( current_mns ); - accptnum = allocate_integer_array( current_mns ); - assoc_rule = allocate_integer_array( current_mns ); - state_type = allocate_integer_array( current_mns ); - - current_max_rules = INITIAL_MAX_RULES; - rule_type = allocate_integer_array( current_max_rules ); - rule_linenum = allocate_integer_array( current_max_rules ); - rule_useful = allocate_integer_array( current_max_rules ); - - current_max_scs = INITIAL_MAX_SCS; - scset = allocate_integer_array( current_max_scs ); - scbol = allocate_integer_array( current_max_scs ); - scxclu = allocate_integer_array( current_max_scs ); - sceof = allocate_integer_array( current_max_scs ); - scname = allocate_char_ptr_array( current_max_scs ); - - current_maxccls = INITIAL_MAX_CCLS; - cclmap = allocate_integer_array( current_maxccls ); - ccllen = allocate_integer_array( current_maxccls ); - cclng = allocate_integer_array( current_maxccls ); - - current_max_ccl_tbl_size = INITIAL_MAX_CCL_TBL_SIZE; - ccltbl = allocate_Character_array( current_max_ccl_tbl_size ); - - current_max_dfa_size = INITIAL_MAX_DFA_SIZE; - - current_max_xpairs = INITIAL_MAX_XPAIRS; - nxt = allocate_integer_array( current_max_xpairs ); - chk = allocate_integer_array( current_max_xpairs ); - - current_max_template_xpairs = INITIAL_MAX_TEMPLATE_XPAIRS; - tnxt = allocate_integer_array( current_max_template_xpairs ); - - current_max_dfas = INITIAL_MAX_DFAS; - base = allocate_integer_array( current_max_dfas ); - def = allocate_integer_array( current_max_dfas ); - dfasiz = allocate_integer_array( current_max_dfas ); - accsiz = allocate_integer_array( current_max_dfas ); - dhash = allocate_integer_array( current_max_dfas ); - dss = allocate_int_ptr_array( current_max_dfas ); - dfaacc = allocate_dfaacc_union( current_max_dfas ); - - nultrans = (int *) 0; - } - - -void usage() - { - FILE *f = stdout; - - fprintf( f, -_( "%s [-bcdfhilnpstvwBFILTV78+? -C[aefFmr] -ooutput -Pprefix -Sskeleton]\n" ), - program_name ); - fprintf( f, _( "\t[--help --version] [file ...]\n" ) ); - - fprintf( f, _( "\t-b generate backing-up information to %s\n" ), - backing_name ); - fprintf( f, _( "\t-c do-nothing POSIX option\n" ) ); - fprintf( f, _( "\t-d turn on debug mode in generated scanner\n" ) ); - fprintf( f, _( "\t-f generate fast, large scanner\n" ) ); - fprintf( f, _( "\t-h produce this help message\n" ) ); - fprintf( f, _( "\t-i generate case-insensitive scanner\n" ) ); - fprintf( f, _( "\t-l maximal compatibility with original lex\n" ) ); - fprintf( f, _( "\t-n do-nothing POSIX option\n" ) ); - fprintf( f, _( "\t-p generate performance report to stderr\n" ) ); - fprintf( f, - _( "\t-s suppress default rule to ECHO unmatched text\n" ) ); - - if ( ! did_outfilename ) - { - sprintf( outfile_path, outfile_template, - prefix, C_plus_plus ? "cc" : "c" ); - outfilename = outfile_path; - } - - fprintf( f, - _( "\t-t write generated scanner on stdout instead of %s\n" ), - outfilename ); - - fprintf( f, - _( "\t-v write summary of scanner statistics to f\n" ) ); - fprintf( f, _( "\t-w do not generate warnings\n" ) ); - fprintf( f, _( "\t-B generate batch scanner (opposite of -I)\n" ) ); - fprintf( f, - _( "\t-F use alternative fast scanner representation\n" ) ); - fprintf( f, - _( "\t-I generate interactive scanner (opposite of -B)\n" ) ); - fprintf( f, _( "\t-L suppress #line directives in scanner\n" ) ); - fprintf( f, _( "\t-T %s should run in trace mode\n" ), program_name ); - fprintf( f, _( "\t-V report %s version\n" ), program_name ); - fprintf( f, _( "\t-7 generate 7-bit scanner\n" ) ); - fprintf( f, _( "\t-8 generate 8-bit scanner\n" ) ); - fprintf( f, _( "\t-+ generate C++ scanner class\n" ) ); - fprintf( f, _( "\t-? produce this help message\n" ) ); - fprintf( f, -_( "\t-C specify degree of table compression (default is -Cem):\n" ) ); - fprintf( f, -_( "\t\t-Ca trade off larger tables for better memory alignment\n" ) ); - fprintf( f, _( "\t\t-Ce construct equivalence classes\n" ) ); - fprintf( f, -_( "\t\t-Cf do not compress scanner tables; use -f representation\n" ) ); - fprintf( f, -_( "\t\t-CF do not compress scanner tables; use -F representation\n" ) ); - fprintf( f, _( "\t\t-Cm construct meta-equivalence classes\n" ) ); - fprintf( f, - _( "\t\t-Cr use read() instead of stdio for scanner input\n" ) ); - fprintf( f, _( "\t-o specify output filename\n" ) ); - fprintf( f, _( "\t-P specify scanner prefix other than \"yy\"\n" ) ); - fprintf( f, _( "\t-S specify skeleton file\n" ) ); - fprintf( f, _( "\t--help produce this help message\n" ) ); - fprintf( f, _( "\t--version report %s version\n" ), program_name ); - } diff --git a/usr.bin/lex/misc.c b/usr.bin/lex/misc.c deleted file mode 100644 index 1dd68d7ce738..000000000000 --- a/usr.bin/lex/misc.c +++ /dev/null @@ -1,886 +0,0 @@ -/* misc - miscellaneous flex routines */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* $Header: /home/daffy/u0/vern/flex/RCS/misc.c,v 2.47 95/04/28 11:39:39 vern Exp $ */ - -#include "flexdef.h" - - -void action_define( defname, value ) -char *defname; -int value; - { - char buf[MAXLINE]; - - if ( (int) strlen( defname ) > MAXLINE / 2 ) - { - format_pinpoint_message( _( "name \"%s\" ridiculously long" ), - defname ); - return; - } - - sprintf( buf, "#define %s %d\n", defname, value ); - add_action( buf ); - } - - -void add_action( new_text ) -char *new_text; - { - int len = strlen( new_text ); - - while ( len + action_index >= action_size - 10 /* slop */ ) - { - int new_size = action_size * 2; - - if ( new_size <= 0 ) - /* Increase just a little, to try to avoid overflow - * on 16-bit machines. - */ - action_size += action_size / 8; - else - action_size = new_size; - - action_array = - reallocate_character_array( action_array, action_size ); - } - - strcpy( &action_array[action_index], new_text ); - - action_index += len; - } - - -/* allocate_array - allocate memory for an integer array of the given size */ - -void *allocate_array( size, element_size ) -int size; -size_t element_size; - { - register void *mem; - size_t num_bytes = element_size * size; - - mem = flex_alloc( num_bytes ); - if ( ! mem ) - flexfatal( - _( "memory allocation failed in allocate_array()" ) ); - - return mem; - } - - -/* all_lower - true if a string is all lower-case */ - -int all_lower( str ) -register char *str; - { - while ( *str ) - { - if ( ! isascii( (Char) *str ) || ! islower( *str ) ) - return 0; - ++str; - } - - return 1; - } - - -/* all_upper - true if a string is all upper-case */ - -int all_upper( str ) -register char *str; - { - while ( *str ) - { - if ( ! isascii( (Char) *str ) || ! isupper( *str ) ) - return 0; - ++str; - } - - return 1; - } - - -/* bubble - bubble sort an integer array in increasing order - * - * synopsis - * int v[n], n; - * void bubble( v, n ); - * - * description - * sorts the first n elements of array v and replaces them in - * increasing order. - * - * passed - * v - the array to be sorted - * n - the number of elements of 'v' to be sorted - */ - -void bubble( v, n ) -int v[], n; - { - register int i, j, k; - - for ( i = n; i > 1; --i ) - for ( j = 1; j < i; ++j ) - if ( v[j] > v[j + 1] ) /* compare */ - { - k = v[j]; /* exchange */ - v[j] = v[j + 1]; - v[j + 1] = k; - } - } - - -/* check_char - checks a character to make sure it's within the range - * we're expecting. If not, generates fatal error message - * and exits. - */ - -void check_char( c ) -int c; - { - if ( c >= CSIZE ) - lerrsf( _( "bad character '%s' detected in check_char()" ), - readable_form( c ) ); - - if ( c >= csize ) - lerrsf( - _( "scanner requires -8 flag to use the character %s" ), - readable_form( c ) ); - } - - - -/* clower - replace upper-case letter to lower-case */ - -Char clower( c ) -register int c; - { - return (Char) ((isascii( c ) && isupper( c )) ? tolower( c ) : c); - } - - -/* copy_string - returns a dynamically allocated copy of a string */ - -char *copy_string( str ) -register const char *str; - { - register const char *c1; - register char *c2; - char *copy; - unsigned int size; - - /* find length */ - for ( c1 = str; *c1; ++c1 ) - ; - - size = (c1 - str + 1) * sizeof( char ); - copy = (char *) flex_alloc( size ); - - if ( copy == NULL ) - flexfatal( _( "dynamic memory failure in copy_string()" ) ); - - for ( c2 = copy; (*c2++ = *str++) != 0; ) - ; - - return copy; - } - - -/* copy_unsigned_string - - * returns a dynamically allocated copy of a (potentially) unsigned string - */ - -Char *copy_unsigned_string( str ) -register Char *str; - { - register Char *c; - Char *copy; - - /* find length */ - for ( c = str; *c; ++c ) - ; - - copy = allocate_Character_array( c - str + 1 ); - - for ( c = copy; (*c++ = *str++) != 0; ) - ; - - return copy; - } - - -/* cshell - shell sort a character array in increasing order - * - * synopsis - * - * Char v[n]; - * int n, special_case_0; - * cshell( v, n, special_case_0 ); - * - * description - * Does a shell sort of the first n elements of array v. - * If special_case_0 is true, then any element equal to 0 - * is instead assumed to have infinite weight. - * - * passed - * v - array to be sorted - * n - number of elements of v to be sorted - */ - -void cshell( v, n, special_case_0 ) -Char v[]; -int n, special_case_0; - { - int gap, i, j, jg; - Char k; - - for ( gap = n / 2; gap > 0; gap = gap / 2 ) - for ( i = gap; i < n; ++i ) - for ( j = i - gap; j >= 0; j = j - gap ) - { - jg = j + gap; - - if ( special_case_0 ) - { - if ( v[jg] == 0 ) - break; - - else if ( v[j] != 0 && v[j] <= v[jg] ) - break; - } - - else if ( v[j] <= v[jg] ) - break; - - k = v[j]; - v[j] = v[jg]; - v[jg] = k; - } - } - - -/* dataend - finish up a block of data declarations */ - -void dataend() - { - if ( datapos > 0 ) - dataflush(); - - /* add terminator for initialization; { for vi */ - outn( " } ;\n" ); - - dataline = 0; - datapos = 0; - } - - -/* dataflush - flush generated data statements */ - -void dataflush() - { - outc( '\n' ); - - if ( ++dataline >= NUMDATALINES ) - { - /* Put out a blank line so that the table is grouped into - * large blocks that enable the user to find elements easily. - */ - outc( '\n' ); - dataline = 0; - } - - /* Reset the number of characters written on the current line. */ - datapos = 0; - } - - -/* flexerror - report an error message and terminate */ - -void flexerror( msg ) -const char msg[]; - { - fprintf( stderr, "%s: %s\n", program_name, msg ); - flexend( 1 ); - } - - -/* flexfatal - report a fatal error message and terminate */ - -void flexfatal( msg ) -const char msg[]; - { - fprintf( stderr, _( "%s: fatal internal error, %s\n" ), - program_name, msg ); - exit( 1 ); - } - - -/* htoi - convert a hexadecimal digit string to an integer value */ - -int htoi( str ) -Char str[]; - { - unsigned int result; - - (void) sscanf( (char *) str, "%x", &result ); - - return result; - } - - -/* lerrif - report an error message formatted with one integer argument */ - -void lerrif( msg, arg ) -const char msg[]; -int arg; - { - char errmsg[MAXLINE]; - (void) sprintf( errmsg, msg, arg ); - flexerror( errmsg ); - } - - -/* lerrsf - report an error message formatted with one string argument */ - -void lerrsf( msg, arg ) -const char msg[], arg[]; - { - char errmsg[MAXLINE]; - - (void) sprintf( errmsg, msg, arg ); - flexerror( errmsg ); - } - - -/* line_directive_out - spit out a "#line" statement */ - -void line_directive_out( output_file, do_infile ) -FILE *output_file; -int do_infile; - { - char directive[MAXLINE], filename[MAXLINE]; - char *s1, *s2, *s3; - static char line_fmt[] = "#line %d \"%s\"\n"; - - if ( ! gen_line_dirs ) - return; - - if ( (do_infile && ! infilename) || (! do_infile && ! outfilename) ) - /* don't know the filename to use, skip */ - return; - - s1 = do_infile ? infilename : outfilename; - s2 = filename; - s3 = &filename[sizeof( filename ) - 2]; - - while ( s2 < s3 && *s1 ) - { - if ( *s1 == '\\' ) - /* Escape the '\' */ - *s2++ = '\\'; - - *s2++ = *s1++; - } - - *s2 = '\0'; - - if ( do_infile ) - sprintf( directive, line_fmt, linenum, filename ); - else - { - if ( output_file == stdout ) - /* Account for the line directive itself. */ - ++out_linenum; - - sprintf( directive, line_fmt, out_linenum, filename ); - } - - /* If output_file is nil then we should put the directive in - * the accumulated actions. - */ - if ( output_file ) - { - fputs( directive, output_file ); - } - else - add_action( directive ); - } - - -/* mark_defs1 - mark the current position in the action array as - * representing where the user's section 1 definitions end - * and the prolog begins - */ -void mark_defs1() - { - defs1_offset = 0; - action_array[action_index++] = '\0'; - action_offset = prolog_offset = action_index; - action_array[action_index] = '\0'; - } - - -/* mark_prolog - mark the current position in the action array as - * representing the end of the action prolog - */ -void mark_prolog() - { - action_array[action_index++] = '\0'; - action_offset = action_index; - action_array[action_index] = '\0'; - } - - -/* mk2data - generate a data statement for a two-dimensional array - * - * Generates a data statement initializing the current 2-D array to "value". - */ -void mk2data( value ) -int value; - { - if ( datapos >= NUMDATAITEMS ) - { - outc( ',' ); - dataflush(); - } - - if ( datapos == 0 ) - /* Indent. */ - out( " " ); - - else - outc( ',' ); - - ++datapos; - - out_dec( "%5d", value ); - } - - -/* mkdata - generate a data statement - * - * Generates a data statement initializing the current array element to - * "value". - */ -void mkdata( value ) -int value; - { - if ( datapos >= NUMDATAITEMS ) - { - outc( ',' ); - dataflush(); - } - - if ( datapos == 0 ) - /* Indent. */ - out( " " ); - else - outc( ',' ); - - ++datapos; - - out_dec( "%5d", value ); - } - - -/* myctoi - return the integer represented by a string of digits */ - -int myctoi( array ) -char array[]; - { - int val = 0; - - (void) sscanf( array, "%d", &val ); - - return val; - } - - -/* myesc - return character corresponding to escape sequence */ - -Char myesc( array ) -Char array[]; - { - Char c, esc_char; - - switch ( array[1] ) - { - case 'b': return '\b'; - case 'f': return '\f'; - case 'n': return '\n'; - case 'r': return '\r'; - case 't': return '\t'; - -#if __STDC__ - case 'a': return '\a'; - case 'v': return '\v'; -#else - case 'a': return '\007'; - case 'v': return '\013'; -#endif - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - { /* \<octal> */ - int sptr = 1; - - while ( isascii( array[sptr] ) && - isdigit( array[sptr] ) ) - /* Don't increment inside loop control - * because if isdigit() is a macro it might - * expand into multiple increments ... - */ - ++sptr; - - c = array[sptr]; - array[sptr] = '\0'; - - esc_char = otoi( array + 1 ); - - array[sptr] = c; - - return esc_char; - } - - case 'x': - { /* \x<hex> */ - int sptr = 2; - - while ( isascii( array[sptr] ) && - isxdigit( (char) array[sptr] ) ) - /* Don't increment inside loop control - * because if isdigit() is a macro it might - * expand into multiple increments ... - */ - ++sptr; - - c = array[sptr]; - array[sptr] = '\0'; - - esc_char = htoi( array + 2 ); - - array[sptr] = c; - - return esc_char; - } - - default: - return array[1]; - } - } - - -/* otoi - convert an octal digit string to an integer value */ - -int otoi( str ) -Char str[]; - { - unsigned int result; - - (void) sscanf( (char *) str, "%o", &result ); - return result; - } - - -/* out - various flavors of outputing a (possibly formatted) string for the - * generated scanner, keeping track of the line count. - */ - -void out( str ) -const char str[]; - { - fputs( str, stdout ); - out_line_count( str ); - } - -void out_dec( fmt, n ) -const char fmt[]; -int n; - { - printf( fmt, n ); - out_line_count( fmt ); - } - -void out_dec2( fmt, n1, n2 ) -const char fmt[]; -int n1, n2; - { - printf( fmt, n1, n2 ); - out_line_count( fmt ); - } - -void out_hex( fmt, x ) -const char fmt[]; -unsigned int x; - { - printf( fmt, x ); - out_line_count( fmt ); - } - -void out_line_count( str ) -const char str[]; - { - register int i; - - for ( i = 0; str[i]; ++i ) - if ( str[i] == '\n' ) - ++out_linenum; - } - -void out_str( fmt, str ) -const char fmt[], str[]; - { - printf( fmt, str ); - out_line_count( fmt ); - out_line_count( str ); - } - -void out_str3( fmt, s1, s2, s3 ) -const char fmt[], s1[], s2[], s3[]; - { - printf( fmt, s1, s2, s3 ); - out_line_count( fmt ); - out_line_count( s1 ); - out_line_count( s2 ); - out_line_count( s3 ); - } - -void out_str_dec( fmt, str, n ) -const char fmt[], str[]; -int n; - { - printf( fmt, str, n ); - out_line_count( fmt ); - out_line_count( str ); - } - -void outc( c ) -int c; - { - putc( c, stdout ); - - if ( c == '\n' ) - ++out_linenum; - } - -void outn( str ) -const char str[]; - { - puts( str ); - out_line_count( str ); - ++out_linenum; - } - - -/* readable_form - return the the human-readable form of a character - * - * The returned string is in static storage. - */ - -char *readable_form( c ) -register int c; - { - static char rform[10]; - - if ( (c >= 0 && c < 32) || c >= 127 ) - { - switch ( c ) - { - case '\b': return "\\b"; - case '\f': return "\\f"; - case '\n': return "\\n"; - case '\r': return "\\r"; - case '\t': return "\\t"; - -#if __STDC__ - case '\a': return "\\a"; - case '\v': return "\\v"; -#endif - - default: - (void) sprintf( rform, "\\%.3o", - (unsigned int) c ); - return rform; - } - } - - else if ( c == ' ' ) - return "' '"; - - else - { - rform[0] = c; - rform[1] = '\0'; - - return rform; - } - } - - -/* reallocate_array - increase the size of a dynamic array */ - -void *reallocate_array( array, size, element_size ) -void *array; -int size; -size_t element_size; - { - register void *new_array; - size_t num_bytes = element_size * size; - - new_array = flex_realloc( array, num_bytes ); - if ( ! new_array ) - flexfatal( _( "attempt to increase array size failed" ) ); - - return new_array; - } - - -/* skelout - write out one section of the skeleton file - * - * Description - * Copies skelfile or skel array to stdout until a line beginning with - * "%%" or EOF is found. - */ -void skelout() - { - char buf_storage[MAXLINE]; - char *buf = buf_storage; - int do_copy = 1; - - /* Loop pulling lines either from the skelfile, if we're using - * one, or from the skel[] array. - */ - while ( skelfile ? - (fgets( buf, MAXLINE, skelfile ) != NULL) : - ((buf = (char *) skel[skel_ind++]) != 0) ) - { /* copy from skel array */ - if ( buf[0] == '%' ) - { /* control line */ - switch ( buf[1] ) - { - case '%': - return; - - case '+': - do_copy = C_plus_plus; - break; - - case '-': - do_copy = ! C_plus_plus; - break; - - case '*': - do_copy = 1; - break; - - default: - flexfatal( - _( "bad line in skeleton file" ) ); - } - } - - else if ( do_copy ) - { - if ( skelfile ) - /* Skeleton file reads include final - * newline, skel[] array does not. - */ - out( buf ); - else - outn( buf ); - } - } - } - - -/* transition_struct_out - output a yy_trans_info structure - * - * outputs the yy_trans_info structure with the two elements, element_v and - * element_n. Formats the output with spaces and carriage returns. - */ - -void transition_struct_out( element_v, element_n ) -int element_v, element_n; - { - out_dec2( " {%4d,%4d },", element_v, element_n ); - - datapos += TRANS_STRUCT_PRINT_LENGTH; - - if ( datapos >= 79 - TRANS_STRUCT_PRINT_LENGTH ) - { - outc( '\n' ); - - if ( ++dataline % 10 == 0 ) - outc( '\n' ); - - datapos = 0; - } - } - - -/* The following is only needed when building flex's parser using certain - * broken versions of bison. - */ -void *yy_flex_xmalloc( size ) -int size; - { - void *result = flex_alloc( (size_t) size ); - - if ( ! result ) - flexfatal( - _( "memory allocation failed in yy_flex_xmalloc()" ) ); - - return result; - } - - -/* zero_out - set a region of memory to 0 - * - * Sets region_ptr[0] through region_ptr[size_in_bytes - 1] to zero. - */ - -void zero_out( region_ptr, size_in_bytes ) -char *region_ptr; -size_t size_in_bytes; - { - register char *rp, *rp_end; - - rp = region_ptr; - rp_end = region_ptr + size_in_bytes; - - while ( rp < rp_end ) - *rp++ = 0; - } diff --git a/usr.bin/lex/mkskel.sh b/usr.bin/lex/mkskel.sh deleted file mode 100755 index a03a11aba061..000000000000 --- a/usr.bin/lex/mkskel.sh +++ /dev/null @@ -1,16 +0,0 @@ -#! /bin/sh - -cat <<! -/* File created from flex.skl via mkskel.sh */ - -#include "flexdef.h" - -const char *skel[] = { -! - -sed 's/\\/&&/g' $* | sed 's/"/\\"/g' | sed 's/.*/ "&",/' - -cat <<! - 0 -}; -! diff --git a/usr.bin/lex/scan.l b/usr.bin/lex/scan.l deleted file mode 100644 index 73caab4a7900..000000000000 --- a/usr.bin/lex/scan.l +++ /dev/null @@ -1,710 +0,0 @@ -/* scan.l - scanner for flex input */ - -%{ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* $Header: /home/daffy/u0/vern/flex/RCS/scan.l,v 2.56 95/04/24 12:17:19 vern Exp $ */ - -#include "flexdef.h" -#include "parse.h" - -#define ACTION_ECHO add_action( yytext ) -#define ACTION_IFDEF(def, should_define) \ - { \ - if ( should_define ) \ - action_define( def, 1 ); \ - } - -#define MARK_END_OF_PROLOG mark_prolog(); - -#define YY_DECL \ - int flexscan() - -#define RETURNCHAR \ - yylval = (unsigned char) yytext[0]; \ - return CHAR; - -#define RETURNNAME \ - strcpy( nmstr, yytext ); \ - return NAME; - -#define PUT_BACK_STRING(str, start) \ - for ( i = strlen( str ) - 1; i >= start; --i ) \ - unput((str)[i]) - -#define CHECK_REJECT(str) \ - if ( all_upper( str ) ) \ - reject = true; - -#define CHECK_YYMORE(str) \ - if ( all_lower( str ) ) \ - yymore_used = true; -%} - -%option caseless nodefault outfile="scan.c" stack noyy_top_state -%option nostdinit - -%x SECT2 SECT2PROLOG SECT3 CODEBLOCK PICKUPDEF SC CARETISBOL NUM QUOTE -%x FIRSTCCL CCL ACTION RECOVER COMMENT ACTION_STRING PERCENT_BRACE_ACTION -%x OPTION LINEDIR - -WS [[:blank:]]+ -OPTWS [[:blank:]]* -NOT_WS [^[:blank:]\n] - -NL \r?\n - -NAME ([[:alpha:]_][[:alnum:]_-]*) -NOT_NAME [^[:alpha:]_*\n]+ - -SCNAME {NAME} - -ESCSEQ (\\([^\n]|[0-7]{1,3}|x[[:xdigit:]]{1,2})) - -FIRST_CCL_CHAR ([^\\\n]|{ESCSEQ}) -CCL_CHAR ([^\\\n\]]|{ESCSEQ}) -CCL_EXPR ("[:"[[:alpha:]]+":]") - -LEXOPT [aceknopr] - -%% - static int bracelevel, didadef, indented_code; - static int doing_rule_action = false; - static int option_sense; - - int doing_codeblock = false; - int i; - Char nmdef[MAXLINE], myesc(); - - -<INITIAL>{ - ^{WS} indented_code = true; BEGIN(CODEBLOCK); - ^"/*" ACTION_ECHO; yy_push_state( COMMENT ); - ^#{OPTWS}line{WS} yy_push_state( LINEDIR ); - ^"%s"{NAME}? return SCDECL; - ^"%x"{NAME}? return XSCDECL; - ^"%{".*{NL} { - ++linenum; - line_directive_out( (FILE *) 0, 1 ); - indented_code = false; - BEGIN(CODEBLOCK); - } - - {WS} /* discard */ - - ^"%%".* { - sectnum = 2; - bracelevel = 0; - mark_defs1(); - line_directive_out( (FILE *) 0, 1 ); - BEGIN(SECT2PROLOG); - return SECTEND; - } - - ^"%pointer".*{NL} yytext_is_array = false; ++linenum; - ^"%array".*{NL} yytext_is_array = true; ++linenum; - - ^"%option" BEGIN(OPTION); return OPTION_OP; - - ^"%"{LEXOPT}{OPTWS}[[:digit:]]*{OPTWS}{NL} ++linenum; /* ignore */ - ^"%"{LEXOPT}{WS}.*{NL} ++linenum; /* ignore */ - - ^"%"[^sxaceknopr{}].* synerr( _( "unrecognized '%' directive" ) ); - - ^{NAME} { - strcpy( nmstr, yytext ); - didadef = false; - BEGIN(PICKUPDEF); - } - - {SCNAME} RETURNNAME; - ^{OPTWS}{NL} ++linenum; /* allows blank lines in section 1 */ - {OPTWS}{NL} ACTION_ECHO; ++linenum; /* maybe end of comment line */ -} - - -<COMMENT>{ - "*/" ACTION_ECHO; yy_pop_state(); - "*" ACTION_ECHO; - [^*\n]+ ACTION_ECHO; - [^*\n]*{NL} ++linenum; ACTION_ECHO; -} - -<LINEDIR>{ - \n yy_pop_state(); - [[:digit:]]+ linenum = myctoi( yytext ); - - \"[^"\n]*\" { - flex_free( (void *) infilename ); - infilename = copy_string( yytext + 1 ); - infilename[strlen( infilename ) - 1] = '\0'; - } - . /* ignore spurious characters */ -} - -<CODEBLOCK>{ - ^"%}".*{NL} ++linenum; BEGIN(INITIAL); - - {NAME}|{NOT_NAME}|. ACTION_ECHO; - - {NL} { - ++linenum; - ACTION_ECHO; - if ( indented_code ) - BEGIN(INITIAL); - } -} - - -<PICKUPDEF>{ - {WS} /* separates name and definition */ - - {NOT_WS}.* { - strcpy( (char *) nmdef, yytext ); - - /* Skip trailing whitespace. */ - for ( i = strlen( (char *) nmdef ) - 1; - i >= 0 && (nmdef[i] == ' ' || nmdef[i] == '\t'); - --i ) - ; - - nmdef[i + 1] = '\0'; - - ndinstal( nmstr, nmdef ); - didadef = true; - } - - {NL} { - if ( ! didadef ) - synerr( _( "incomplete name definition" ) ); - BEGIN(INITIAL); - ++linenum; - } -} - - -<OPTION>{ - {NL} ++linenum; BEGIN(INITIAL); - {WS} option_sense = true; - - "=" return '='; - - no option_sense = ! option_sense; - - 7bit csize = option_sense ? 128 : 256; - 8bit csize = option_sense ? 256 : 128; - - align long_align = option_sense; - always-interactive { - action_define( "YY_ALWAYS_INTERACTIVE", option_sense ); - } - array yytext_is_array = option_sense; - backup backing_up_report = option_sense; - batch interactive = ! option_sense; - "c++" C_plus_plus = option_sense; - caseful|case-sensitive caseins = ! option_sense; - caseless|case-insensitive caseins = option_sense; - debug ddebug = option_sense; - default spprdflt = ! option_sense; - ecs useecs = option_sense; - fast { - useecs = usemecs = false; - use_read = fullspd = true; - } - full { - useecs = usemecs = false; - use_read = fulltbl = true; - } - input ACTION_IFDEF("YY_NO_INPUT", ! option_sense); - interactive interactive = option_sense; - lex-compat lex_compat = option_sense; - main { - action_define( "YY_MAIN", option_sense ); - do_yywrap = ! option_sense; - } - meta-ecs usemecs = option_sense; - never-interactive { - action_define( "YY_NEVER_INTERACTIVE", option_sense ); - } - perf-report performance_report += option_sense ? 1 : -1; - pointer yytext_is_array = ! option_sense; - read use_read = option_sense; - reject reject_really_used = option_sense; - stack action_define( "YY_STACK_USED", option_sense ); - stdinit do_stdinit = option_sense; - stdout use_stdout = option_sense; - unput ACTION_IFDEF("YY_NO_UNPUT", ! option_sense); - verbose printstats = option_sense; - warn nowarn = ! option_sense; - yylineno do_yylineno = option_sense; - yymore yymore_really_used = option_sense; - yywrap do_yywrap = option_sense; - - yy_push_state ACTION_IFDEF("YY_NO_PUSH_STATE", ! option_sense); - yy_pop_state ACTION_IFDEF("YY_NO_POP_STATE", ! option_sense); - yy_top_state ACTION_IFDEF("YY_NO_TOP_STATE", ! option_sense); - - yy_scan_buffer ACTION_IFDEF("YY_NO_SCAN_BUFFER", ! option_sense); - yy_scan_bytes ACTION_IFDEF("YY_NO_SCAN_BYTES", ! option_sense); - yy_scan_string ACTION_IFDEF("YY_NO_SCAN_STRING", ! option_sense); - - outfile return OPT_OUTFILE; - prefix return OPT_PREFIX; - yyclass return OPT_YYCLASS; - - \"[^"\n]*\" { - strcpy( nmstr, yytext + 1 ); - nmstr[strlen( nmstr ) - 1] = '\0'; - return NAME; - } - - (([a-mo-z]|n[a-np-z])[[:alpha:]\-+]*)|. { - format_synerr( _( "unrecognized %%option: %s" ), - yytext ); - BEGIN(RECOVER); - } -} - -<RECOVER>.*{NL} ++linenum; BEGIN(INITIAL); - - -<SECT2PROLOG>{ - ^"%{".* ++bracelevel; yyless( 2 ); /* eat only %{ */ - ^"%}".* --bracelevel; yyless( 2 ); /* eat only %} */ - - ^{WS}.* ACTION_ECHO; /* indented code in prolog */ - - ^{NOT_WS}.* { /* non-indented code */ - if ( bracelevel <= 0 ) - { /* not in %{ ... %} */ - yyless( 0 ); /* put it all back */ - yy_set_bol( 1 ); - mark_prolog(); - BEGIN(SECT2); - } - else - ACTION_ECHO; - } - - .* ACTION_ECHO; - {NL} ++linenum; ACTION_ECHO; - - <<EOF>> { - mark_prolog(); - sectnum = 0; - yyterminate(); /* to stop the parser */ - } -} - -<SECT2>{ - ^{OPTWS}{NL} ++linenum; /* allow blank lines in section 2 */ - - ^{OPTWS}"%{" { - indented_code = false; - doing_codeblock = true; - bracelevel = 1; - BEGIN(PERCENT_BRACE_ACTION); - } - - ^{OPTWS}"<" BEGIN(SC); return '<'; - ^{OPTWS}"^" return '^'; - \" BEGIN(QUOTE); return '"'; - "{"/[[:digit:]] BEGIN(NUM); return '{'; - "$"/([[:blank:]]|{NL}) return '$'; - - {WS}"%{" { - bracelevel = 1; - BEGIN(PERCENT_BRACE_ACTION); - - if ( in_rule ) - { - doing_rule_action = true; - in_rule = false; - return '\n'; - } - } - {WS}"|".*{NL} continued_action = true; ++linenum; return '\n'; - - ^{WS}"/*" { - yyless( yyleng - 2 ); /* put back '/', '*' */ - bracelevel = 0; - continued_action = false; - BEGIN(ACTION); - } - - ^{WS} /* allow indented rules */ - - {WS} { - /* This rule is separate from the one below because - * otherwise we get variable trailing context, so - * we can't build the scanner using -{f,F}. - */ - bracelevel = 0; - continued_action = false; - BEGIN(ACTION); - - if ( in_rule ) - { - doing_rule_action = true; - in_rule = false; - return '\n'; - } - } - - {OPTWS}{NL} { - bracelevel = 0; - continued_action = false; - BEGIN(ACTION); - unput( '\n' ); /* so <ACTION> sees it */ - - if ( in_rule ) - { - doing_rule_action = true; - in_rule = false; - return '\n'; - } - } - - ^{OPTWS}"<<EOF>>" | - "<<EOF>>" return EOF_OP; - - ^"%%".* { - sectnum = 3; - BEGIN(SECT3); - yyterminate(); /* to stop the parser */ - } - - "["({FIRST_CCL_CHAR}|{CCL_EXPR})({CCL_CHAR}|{CCL_EXPR})* { - int cclval; - - strcpy( nmstr, yytext ); - - /* Check to see if we've already encountered this - * ccl. - */ - if ( (cclval = ccllookup( (Char *) nmstr )) != 0 ) - { - if ( input() != ']' ) - synerr( _( "bad character class" ) ); - - yylval = cclval; - ++cclreuse; - return PREVCCL; - } - else - { - /* We fudge a bit. We know that this ccl will - * soon be numbered as lastccl + 1 by cclinit. - */ - cclinstal( (Char *) nmstr, lastccl + 1 ); - - /* Push back everything but the leading bracket - * so the ccl can be rescanned. - */ - yyless( 1 ); - - BEGIN(FIRSTCCL); - return '['; - } - } - - "{"{NAME}"}" { - register Char *nmdefptr; - Char *ndlookup(); - - strcpy( nmstr, yytext + 1 ); - nmstr[yyleng - 2] = '\0'; /* chop trailing brace */ - - if ( (nmdefptr = ndlookup( nmstr )) == 0 ) - format_synerr( - _( "undefined definition {%s}" ), - nmstr ); - - else - { /* push back name surrounded by ()'s */ - int len = strlen( (char *) nmdefptr ); - - if ( lex_compat || nmdefptr[0] == '^' || - (len > 0 && nmdefptr[len - 1] == '$') ) - { /* don't use ()'s after all */ - PUT_BACK_STRING((char *) nmdefptr, 0); - - if ( nmdefptr[0] == '^' ) - BEGIN(CARETISBOL); - } - - else - { - unput(')'); - PUT_BACK_STRING((char *) nmdefptr, 0); - unput('('); - } - } - } - - [/|*+?.(){}] return (unsigned char) yytext[0]; - . RETURNCHAR; -} - - -<SC>{ - [,*] return (unsigned char) yytext[0]; - ">" BEGIN(SECT2); return '>'; - ">"/^ BEGIN(CARETISBOL); return '>'; - {SCNAME} RETURNNAME; - . { - format_synerr( _( "bad <start condition>: %s" ), - yytext ); - } -} - -<CARETISBOL>"^" BEGIN(SECT2); return '^'; - - -<QUOTE>{ - [^"\n] RETURNCHAR; - \" BEGIN(SECT2); return '"'; - - {NL} { - synerr( _( "missing quote" ) ); - BEGIN(SECT2); - ++linenum; - return '"'; - } -} - - -<FIRSTCCL>{ - "^"/[^-\]\n] BEGIN(CCL); return '^'; - "^"/("-"|"]") return '^'; - . BEGIN(CCL); RETURNCHAR; -} - -<CCL>{ - -/[^\]\n] return '-'; - [^\]\n] RETURNCHAR; - "]" BEGIN(SECT2); return ']'; - .|{NL} { - synerr( _( "bad character class" ) ); - BEGIN(SECT2); - return ']'; - } -} - -<FIRSTCCL,CCL>{ - "[:alnum:]" BEGIN(CCL); return CCE_ALNUM; - "[:alpha:]" BEGIN(CCL); return CCE_ALPHA; - "[:blank:]" BEGIN(CCL); return CCE_BLANK; - "[:cntrl:]" BEGIN(CCL); return CCE_CNTRL; - "[:digit:]" BEGIN(CCL); return CCE_DIGIT; - "[:graph:]" BEGIN(CCL); return CCE_GRAPH; - "[:lower:]" BEGIN(CCL); return CCE_LOWER; - "[:print:]" BEGIN(CCL); return CCE_PRINT; - "[:punct:]" BEGIN(CCL); return CCE_PUNCT; - "[:space:]" BEGIN(CCL); return CCE_SPACE; - "[:upper:]" BEGIN(CCL); return CCE_UPPER; - "[:xdigit:]" BEGIN(CCL); return CCE_XDIGIT; - {CCL_EXPR} { - format_synerr( - _( "bad character class expression: %s" ), - yytext ); - BEGIN(CCL); return CCE_ALNUM; - } -} - -<NUM>{ - [[:digit:]]+ { - yylval = myctoi( yytext ); - return NUMBER; - } - - "," return ','; - "}" BEGIN(SECT2); return '}'; - - . { - synerr( _( "bad character inside {}'s" ) ); - BEGIN(SECT2); - return '}'; - } - - {NL} { - synerr( _( "missing }" ) ); - BEGIN(SECT2); - ++linenum; - return '}'; - } -} - - -<PERCENT_BRACE_ACTION>{ - {OPTWS}"%}".* bracelevel = 0; - - <ACTION>"/*" ACTION_ECHO; yy_push_state( COMMENT ); - - <CODEBLOCK,ACTION>{ - "reject" { - ACTION_ECHO; - CHECK_REJECT(yytext); - } - "yymore" { - ACTION_ECHO; - CHECK_YYMORE(yytext); - } - } - - {NAME}|{NOT_NAME}|. ACTION_ECHO; - {NL} { - ++linenum; - ACTION_ECHO; - if ( bracelevel == 0 || - (doing_codeblock && indented_code) ) - { - if ( doing_rule_action ) - add_action( "\tYY_BREAK\n" ); - - doing_rule_action = doing_codeblock = false; - BEGIN(SECT2); - } - } -} - - - /* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */ -<ACTION>{ - "{" ACTION_ECHO; ++bracelevel; - "}" ACTION_ECHO; --bracelevel; - [^[:alpha:]_{}"'/\n]+ ACTION_ECHO; - {NAME} ACTION_ECHO; - "'"([^'\\\n]|\\.)*"'" ACTION_ECHO; /* character constant */ - \" ACTION_ECHO; BEGIN(ACTION_STRING); - {NL} { - ++linenum; - ACTION_ECHO; - if ( bracelevel == 0 ) - { - if ( doing_rule_action ) - add_action( "\tYY_BREAK\n" ); - - doing_rule_action = false; - BEGIN(SECT2); - } - } - . ACTION_ECHO; -} - -<ACTION_STRING>{ - [^"\\\n]+ ACTION_ECHO; - \\. ACTION_ECHO; - {NL} ++linenum; ACTION_ECHO; - \" ACTION_ECHO; BEGIN(ACTION); - . ACTION_ECHO; -} - -<COMMENT,ACTION,ACTION_STRING><<EOF>> { - synerr( _( "EOF encountered inside an action" ) ); - yyterminate(); - } - - -<SECT2,QUOTE,FIRSTCCL,CCL>{ESCSEQ} { - yylval = myesc( (Char *) yytext ); - - if ( YY_START == FIRSTCCL ) - BEGIN(CCL); - - return CHAR; - } - - -<SECT3>{ - .*(\n?) ECHO; - <<EOF>> sectnum = 0; yyterminate(); -} - -<*>.|\n format_synerr( _( "bad character: %s" ), yytext ); - -%% - - -int yywrap() - { - if ( --num_input_files > 0 ) - { - set_input_file( *++input_files ); - return 0; - } - - else - return 1; - } - - -/* set_input_file - open the given file (if NULL, stdin) for scanning */ - -void set_input_file( file ) -char *file; - { - if ( file && strcmp( file, "-" ) ) - { - infilename = copy_string( file ); - yyin = fopen( infilename, "r" ); - - if ( yyin == NULL ) - lerrsf( _( "can't open %s" ), file ); - } - - else - { - yyin = stdin; - infilename = copy_string( "<stdin>" ); - } - - linenum = 1; - } - - -/* Wrapper routines for accessing the scanner's malloc routines. */ - -void *flex_alloc( size ) -size_t size; - { - return (void *) malloc( size ); - } - -void *flex_realloc( ptr, size ) -void *ptr; -size_t size; - { - return (void *) realloc( ptr, size ); - } - -void flex_free( ptr ) -void *ptr; - { - if ( ptr ) - free( ptr ); - } diff --git a/usr.bin/lex/skel.c b/usr.bin/lex/skel.c deleted file mode 100644 index 3354600fae25..000000000000 --- a/usr.bin/lex/skel.c +++ /dev/null @@ -1,1548 +0,0 @@ -/* File created from flex.skl via mkskel.sh */ - -#include "flexdef.h" - -const char *skel[] = { - "/* A lexical scanner generated by flex */", - "", - "/* Scanner skeleton version:", - " * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $", - " */", - "", - "#define FLEX_SCANNER", - "#define YY_FLEX_MAJOR_VERSION 2", - "#define YY_FLEX_MINOR_VERSION 5", - "", - "%-", - "#include <stdio.h>", - "%*", - "", - "", - "/* cfront 1.2 defines \"c_plusplus\" instead of \"__cplusplus\" */", - "#ifdef c_plusplus", - "#ifndef __cplusplus", - "#define __cplusplus", - "#endif", - "#endif", - "", - "", - "#ifdef __cplusplus", - "", - "#include <stdlib.h>", - "%+", - "class istream;", - "%*", - "#include <unistd.h>", - "", - "/* Use prototypes in function declarations. */", - "#define YY_USE_PROTOS", - "", - "/* The \"const\" storage-class-modifier is valid. */", - "#define YY_USE_CONST", - "", - "#else /* ! __cplusplus */", - "", - "#if __STDC__", - "", - "#define YY_USE_PROTOS", - "#define YY_USE_CONST", - "", - "#endif /* __STDC__ */", - "#endif /* ! __cplusplus */", - "", - "#ifdef __TURBOC__", - " #pragma warn -rch", - " #pragma warn -use", - "#include <io.h>", - "#include <stdlib.h>", - "#define YY_USE_CONST", - "#define YY_USE_PROTOS", - "#endif", - "", - "#ifdef YY_USE_CONST", - "#define yyconst const", - "#else", - "#define yyconst", - "#endif", - "", - "", - "#ifdef YY_USE_PROTOS", - "#define YY_PROTO(proto) proto", - "#else", - "#define YY_PROTO(proto) ()", - "#endif", - "", - "/* Returned upon end-of-file. */", - "#define YY_NULL 0", - "", - "/* 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)", - "", - "/* 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 yyrestart( yyin )", - "", - "#define YY_END_OF_BUFFER_CHAR 0", - "", - "/* Size of default input buffer. */", - "#define YY_BUF_SIZE 16384", - "", - "typedef struct yy_buffer_state *YY_BUFFER_STATE;", - "", - "extern int yyleng;", - "%-", - "extern FILE *yyin, *yyout;", - "%*", - "", - "#define EOB_ACT_CONTINUE_SCAN 0", - "#define EOB_ACT_END_OF_FILE 1", - "#define EOB_ACT_LAST_MATCH 2", - "", - "/* The funky do-while in the following #define is used to turn the definition", - " * int a single C statement (which needs a semi-colon terminator). This", - " * avoids problems with code like:", - " *", - " * if ( condition_holds )", - " * yyless( 5 );", - " * else", - " * do_something_else();", - " *", - " * Prior to using the do-while the compiler would get upset at the", - " * \"else\" because it interpreted the \"if\" statement as being all", - " * done when it reached the ';' after the yyless() call.", - " */", - "", - "/* Return all but the first 'n' matched characters back to the input stream. */", - "", - "#define yyless(n) \\", - " do \\", - " { \\", - " /* Undo effects of setting up yytext. */ \\", - " *yy_cp = yy_hold_char; \\", - " YY_RESTORE_YY_MORE_OFFSET \\", - " yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \\", - " YY_DO_BEFORE_ACTION; /* set up yytext 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).", - " */", - "typedef unsigned int yy_size_t;", - "", - "", - "struct yy_buffer_state", - " {", - "%-", - " FILE *yy_input_file;", - "%+", - " istream* yy_input_file;", - "%*", - "", - " 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;", - "", - " /* 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 yyrestart()), so that the user can continue scanning by", - " * just pointing yyin at a new input file.", - " */", - "#define YY_BUFFER_EOF_PENDING 2", - " };", - "", - "%- Standard (non-C++) definition", - "static YY_BUFFER_STATE yy_current_buffer = 0;", - "%*", - "", - "/* 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\".", - " */", - "#define YY_CURRENT_BUFFER yy_current_buffer", - "", - "", - "%- Standard (non-C++) definition", - "/* yy_hold_char holds the character lost when yytext is formed. */", - "static char yy_hold_char;", - "", - "static int yy_n_chars; /* number of characters read into yy_ch_buf */", - "", - "", - "int yyleng;", - "", - "/* 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 yywrap()'s to do buffer switches", - " * instead of setting up a fresh yyin. A bit of a hack ...", - " */", - "static int yy_did_buffer_switch_on_eof;", - "", - "void yyrestart YY_PROTO(( FILE *input_file ));", - "", - "void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));", - "void yy_load_buffer_state YY_PROTO(( void ));", - "YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));", - "void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));", - "void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));", - "void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));", - "#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )", - "", - "YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));", - "YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));", - "YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));", - "%*", - "", - "static void *yy_flex_alloc YY_PROTO(( yy_size_t ));", - "static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));", - "static void yy_flex_free YY_PROTO(( void * ));", - "", - "#define yy_new_buffer yy_create_buffer", - "", - "#define yy_set_interactive(is_interactive) \\", - " { \\", - " if ( ! yy_current_buffer ) \\", - " yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \\", - " yy_current_buffer->yy_is_interactive = is_interactive; \\", - " }", - "", - "#define yy_set_bol(at_bol) \\", - " { \\", - " if ( ! yy_current_buffer ) \\", - " yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \\", - " yy_current_buffer->yy_at_bol = at_bol; \\", - " }", - "", - "#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)", - "", - "%% yytext/yyin/yyout/yy_state_type/yylineno etc. def's & init go here", - "", - "%- Standard (non-C++) definition", - "static yy_state_type yy_get_previous_state YY_PROTO(( void ));", - "static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));", - "static int yy_get_next_buffer YY_PROTO(( void ));", - "static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));", - "%*", - "", - "/* Done after the current pattern has been matched and before the", - " * corresponding action - sets up yytext.", - " */", - "#define YY_DO_BEFORE_ACTION \\", - " yytext_ptr = yy_bp; \\", - "%% code to fiddle yytext and yyleng for yymore() goes here", - " yy_hold_char = *yy_cp; \\", - " *yy_cp = '\\0'; \\", - "%% code to copy yytext_ptr to yytext[] goes here, if %array", - " yy_c_buf_p = yy_cp;", - "", - "%% data tables for the DFA and the user's section 1 definitions go here", - "", - "/* Macros after this point can all be overridden by user definitions in", - " * section 1.", - " */", - "", - "#ifndef YY_SKIP_YYWRAP", - "#ifdef __cplusplus", - "extern \"C\" int yywrap YY_PROTO(( void ));", - "#else", - "extern int yywrap YY_PROTO(( void ));", - "#endif", - "#endif", - "", - "%-", - "#ifndef YY_NO_UNPUT", - "static void yyunput YY_PROTO(( int c, char *buf_ptr ));", - "#endif", - "%*", - "", - "#ifndef yytext_ptr", - "static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));", - "#endif", - "", - "#ifdef YY_NEED_STRLEN", - "static int yy_flex_strlen YY_PROTO(( yyconst char * ));", - "#endif", - "", - "#ifndef YY_NO_INPUT", - "%- Standard (non-C++) definition", - "#ifdef __cplusplus", - "static int yyinput YY_PROTO(( void ));", - "#else", - "static int input YY_PROTO(( void ));", - "#endif", - "%*", - "#endif", - "", - "#if YY_STACK_USED", - "static int yy_start_stack_ptr = 0;", - "static int yy_start_stack_depth = 0;", - "static int *yy_start_stack = 0;", - "#ifndef YY_NO_PUSH_STATE", - "static void yy_push_state YY_PROTO(( int new_state ));", - "#endif", - "#ifndef YY_NO_POP_STATE", - "static void yy_pop_state YY_PROTO(( void ));", - "#endif", - "#ifndef YY_NO_TOP_STATE", - "static int yy_top_state YY_PROTO(( void ));", - "#endif", - "", - "#else", - "#define YY_NO_PUSH_STATE 1", - "#define YY_NO_POP_STATE 1", - "#define YY_NO_TOP_STATE 1", - "#endif", - "", - "#ifdef YY_MALLOC_DECL", - "YY_MALLOC_DECL", - "#else", - "#if __STDC__", - "#ifndef __cplusplus", - "#include <stdlib.h>", - "#endif", - "#else", - "/* Just try to get by without declaring the routines. This will fail", - " * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)", - " * or sizeof(void*) != sizeof(int).", - " */", - "#endif", - "#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", - "%- 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( yytext, yyleng, 1, yyout )", - "%+ C++ definition", - "#define ECHO LexerOutput( yytext, yyleng )", - "%*", - "#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) \\", - "%% fread()/read() definition of YY_INPUT goes here unless we're doing C++", - "%+ C++ definition", - " if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \\", - " YY_FATAL_ERROR( \"input in flex scanner failed\" );", - "%*", - "#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", - "%-", - "#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )", - "%+", - "#define YY_FATAL_ERROR(msg) LexerError( msg )", - "%*", - "#endif", - "", - "/* Default declaration of generated scanner - a define so the user can", - " * easily add parameters.", - " */", - "#ifndef YY_DECL", - "%- Standard (non-C++) definition", - "#define YY_DECL int yylex YY_PROTO(( void ))", - "%+ C++ definition", - "#define YY_DECL int yyFlexLexer::yylex()", - "%*", - "#endif", - "", - "/* Code executed at the beginning of each rule, after yytext and yyleng", - " * 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", - "", - "%% YY_RULE_SETUP definition goes here", - "", - "YY_DECL", - " {", - " register yy_state_type yy_current_state;", - " register char *yy_cp, *yy_bp;", - " register int yy_act;", - "", - "%% user's declarations go here", - "", - " if ( yy_init )", - " {", - " yy_init = 0;", - "", - "#ifdef YY_USER_INIT", - " YY_USER_INIT;", - "#endif", - "", - " if ( ! yy_start )", - " yy_start = 1; /* first start state */", - "", - " if ( ! yyin )", - "%-", - " yyin = stdin;", - "%+", - " yyin = &cin;", - "%*", - "", - " if ( ! yyout )", - "%-", - " yyout = stdout;", - "%+", - " yyout = &cout;", - "%*", - "", - " if ( ! yy_current_buffer )", - " yy_current_buffer =", - " yy_create_buffer( yyin, YY_BUF_SIZE );", - "", - " yy_load_buffer_state();", - " }", - "", - " while ( 1 ) /* loops until end-of-file is reached */", - " {", - "%% yymore()-related code goes here", - " yy_cp = yy_c_buf_p;", - "", - " /* Support of yytext. */", - " *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;", - "", - "%% code to set up and find next match goes here", - "", - "yy_find_action:", - "%% code to find the action number goes here", - "", - " YY_DO_BEFORE_ACTION;", - "", - "%% code for yylineno update goes here", - "", - "do_action: /* This label is used only to access EOF actions. */", - "", - "%% debug code goes here", - "", - " switch ( yy_act )", - " { /* beginning of action switch */", - "%% actions go here", - "", - " 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->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 yyin at a new source and called", - " * yylex(). 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->yy_n_chars;", - " yy_current_buffer->yy_input_file = yyin;", - " yy_current_buffer->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->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", - " {", - "%% code to do back-up for compressed tables and set up yy_cp goes here", - " goto yy_find_action;", - " }", - " }", - "", - " else switch ( yy_get_next_buffer() )", - " {", - " case EOB_ACT_END_OF_FILE:", - " {", - " yy_did_buffer_switch_on_eof = 0;", - "", - " if ( yywrap() )", - " {", - " /* Note: because we've taken care in", - " * yy_get_next_buffer() to have set up", - " * yytext, 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->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 yylex */", - "", - "%+", - "yyFlexLexer::yyFlexLexer( istream* arg_yyin, ostream* arg_yyout )", - " {", - " yyin = arg_yyin;", - " yyout = arg_yyout;", - " yy_c_buf_p = 0;", - " yy_init = 1;", - " yy_start = 0;", - " yy_flex_debug = 0;", - " yylineno = 1; // this will only get updated if %option yylineno", - "", - " yy_did_buffer_switch_on_eof = 0;", - "", - " yy_looking_for_trail_begin = 0;", - " yy_more_flag = 0;", - " yy_more_len = 0;", - " yy_more_offset = yy_prev_more_offset = 0;", - "", - " yy_start_stack_ptr = yy_start_stack_depth = 0;", - " yy_start_stack = 0;", - "", - " yy_current_buffer = 0;", - "", - "#ifdef YY_USES_REJECT", - " yy_state_buf = new yy_state_type[YY_BUF_SIZE + 2];", - "#else", - " yy_state_buf = 0;", - "#endif", - " }", - "", - "yyFlexLexer::~yyFlexLexer()", - " {", - " delete yy_state_buf;", - " yy_delete_buffer( yy_current_buffer );", - " }", - "", - "void yyFlexLexer::switch_streams( istream* new_in, ostream* new_out )", - " {", - " if ( new_in )", - " {", - " yy_delete_buffer( yy_current_buffer );", - " yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) );", - " }", - "", - " if ( new_out )", - " yyout = new_out;", - " }", - "", - "#ifdef YY_INTERACTIVE", - "int yyFlexLexer::LexerInput( char* buf, int /* max_size */ )", - "#else", - "int yyFlexLexer::LexerInput( char* buf, int max_size )", - "#endif", - " {", - " if ( yyin->eof() || yyin->fail() )", - " return 0;", - "", - "#ifdef YY_INTERACTIVE", - " yyin->get( buf[0] );", - "", - " if ( yyin->eof() )", - " return 0;", - "", - " if ( yyin->bad() )", - " return -1;", - "", - " return 1;", - "", - "#else", - " (void) yyin->read( buf, max_size );", - "", - " if ( yyin->bad() )", - " return -1;", - " else", - " return yyin->gcount();", - "#endif", - " }", - "", - "void yyFlexLexer::LexerOutput( const char* buf, int size )", - " {", - " (void) yyout->write( buf, size );", - " }", - "%*", - "", - "/* 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", - " */", - "", - "%-", - "static int yy_get_next_buffer()", - "%+", - "int yyFlexLexer::yy_get_next_buffer()", - "%*", - " {", - " register char *dest = yy_current_buffer->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->yy_ch_buf[yy_n_chars + 1] )", - " YY_FATAL_ERROR(", - " \"fatal flex scanner internal error--end of buffer missed\" );", - "", - " if ( yy_current_buffer->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->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->yy_n_chars = yy_n_chars = 0;", - "", - " else", - " {", - " int num_to_read =", - " yy_current_buffer->yy_buf_size - number_to_move - 1;", - "", - " while ( num_to_read <= 0 )", - " { /* Not enough room in the buffer - grow it. */", - "#ifdef YY_USES_REJECT", - " YY_FATAL_ERROR(", - "\"input buffer overflow, can't enlarge buffer because scanner uses REJECT\" );", - "#else", - "", - " /* 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. */", - " yy_flex_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->yy_buf_size -", - " number_to_move - 1;", - "#endif", - " }", - "", - " if ( num_to_read > YY_READ_BUF_SIZE )", - " num_to_read = YY_READ_BUF_SIZE;", - "", - " /* Read in more data. */", - " YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),", - " yy_n_chars, num_to_read );", - "", - " yy_current_buffer->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;", - " yyrestart( yyin );", - " }", - "", - " else", - " {", - " ret_val = EOB_ACT_LAST_MATCH;", - " yy_current_buffer->yy_buffer_status =", - " YY_BUFFER_EOF_PENDING;", - " }", - " }", - "", - " else", - " ret_val = EOB_ACT_CONTINUE_SCAN;", - "", - " yy_n_chars += number_to_move;", - " yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;", - " yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;", - "", - " yytext_ptr = &yy_current_buffer->yy_ch_buf[0];", - "", - " return ret_val;", - " }", - "", - "", - "/* yy_get_previous_state - get the state just before the EOB char was reached */", - "", - "%-", - "static yy_state_type yy_get_previous_state()", - "%+", - "yy_state_type yyFlexLexer::yy_get_previous_state()", - "%*", - " {", - " register yy_state_type yy_current_state;", - " register char *yy_cp;", - "", - "%% code to get the start state into yy_current_state goes here", - "", - " for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )", - " {", - "%% code to find the next state goes here", - " }", - "", - " 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 );", - " */", - "", - "%-", - "#ifdef YY_USE_PROTOS", - "static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )", - "#else", - "static yy_state_type yy_try_NUL_trans( yy_current_state )", - "yy_state_type yy_current_state;", - "#endif", - "%+", - "yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state )", - "%*", - " {", - " register int yy_is_jam;", - "%% code to find the next state, and perhaps do backing up, goes here", - "", - " return yy_is_jam ? 0 : yy_current_state;", - " }", - "", - "", - "%-", - "#ifndef YY_NO_UNPUT", - "#ifdef YY_USE_PROTOS", - "static void yyunput( int c, register char *yy_bp )", - "#else", - "static void yyunput( c, yy_bp )", - "int c;", - "register char *yy_bp;", - "#endif", - "%+", - "void yyFlexLexer::yyunput( int c, register char* yy_bp )", - "%*", - " {", - " register char *yy_cp = yy_c_buf_p;", - "", - " /* undo effects of setting up yytext */", - " *yy_cp = yy_hold_char;", - "", - " if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )", - " { /* need to shift things up to make room */", - " /* +2 for EOB chars. */", - " register int number_to_move = yy_n_chars + 2;", - " register char *dest = &yy_current_buffer->yy_ch_buf[", - " yy_current_buffer->yy_buf_size + 2];", - " register char *source =", - " &yy_current_buffer->yy_ch_buf[number_to_move];", - "", - " while ( source > yy_current_buffer->yy_ch_buf )", - " *--dest = *--source;", - "", - " yy_cp += (int) (dest - source);", - " yy_bp += (int) (dest - source);", - " yy_current_buffer->yy_n_chars =", - " yy_n_chars = yy_current_buffer->yy_buf_size;", - "", - " if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )", - " YY_FATAL_ERROR( \"flex scanner push-back overflow\" );", - " }", - "", - " *--yy_cp = (char) c;", - "", - "%% update yylineno here", - "", - " yytext_ptr = yy_bp;", - " yy_hold_char = *yy_cp;", - " yy_c_buf_p = yy_cp;", - " }", - "%-", - "#endif /* ifndef YY_NO_UNPUT */", - "%*", - "", - "", - "%-", - "#ifdef __cplusplus", - "static int yyinput()", - "#else", - "static int input()", - "#endif", - "%+", - "int yyFlexLexer::yyinput()", - "%*", - " {", - " 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->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. */", - " yyrestart( yyin );", - "", - " /* fall through */", - "", - " case EOB_ACT_END_OF_FILE:", - " {", - " if ( yywrap() )", - " 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 yytext */", - " yy_hold_char = *++yy_c_buf_p;", - "", - "%% update BOL and yylineno", - "", - " return c;", - " }", - "", - "", - "%-", - "#ifdef YY_USE_PROTOS", - "void yyrestart( FILE *input_file )", - "#else", - "void yyrestart( input_file )", - "FILE *input_file;", - "#endif", - "%+", - "void yyFlexLexer::yyrestart( istream* input_file )", - "%*", - " {", - " if ( ! yy_current_buffer )", - " yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );", - "", - " yy_init_buffer( yy_current_buffer, input_file );", - " yy_load_buffer_state();", - " }", - "", - "", - "%-", - "#ifdef YY_USE_PROTOS", - "void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )", - "#else", - "void yy_switch_to_buffer( new_buffer )", - "YY_BUFFER_STATE new_buffer;", - "#endif", - "%+", - "void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )", - "%*", - " {", - " 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->yy_buf_pos = yy_c_buf_p;", - " yy_current_buffer->yy_n_chars = yy_n_chars;", - " }", - "", - " yy_current_buffer = new_buffer;", - " yy_load_buffer_state();", - "", - " /* We don't actually know whether we did this switch during", - " * EOF (yywrap()) processing, but the only time this flag", - " * is looked at is after yywrap() is called, so it's safe", - " * to go ahead and always set it.", - " */", - " yy_did_buffer_switch_on_eof = 1;", - " }", - "", - "", - "%-", - "#ifdef YY_USE_PROTOS", - "void yy_load_buffer_state( void )", - "#else", - "void yy_load_buffer_state()", - "#endif", - "%+", - "void yyFlexLexer::yy_load_buffer_state()", - "%*", - " {", - " yy_n_chars = yy_current_buffer->yy_n_chars;", - " yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;", - " yyin = yy_current_buffer->yy_input_file;", - " yy_hold_char = *yy_c_buf_p;", - " }", - "", - "", - "%-", - "#ifdef YY_USE_PROTOS", - "YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )", - "#else", - "YY_BUFFER_STATE yy_create_buffer( file, size )", - "FILE *file;", - "int size;", - "#endif", - "%+", - "YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( istream* file, int size )", - "%*", - " {", - " YY_BUFFER_STATE b;", - "", - " b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );", - " if ( ! b )", - " YY_FATAL_ERROR( \"out of dynamic memory in yy_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 *) yy_flex_alloc( b->yy_buf_size + 2 );", - " if ( ! b->yy_ch_buf )", - " YY_FATAL_ERROR( \"out of dynamic memory in yy_create_buffer()\" );", - "", - " b->yy_is_our_buffer = 1;", - "", - " yy_init_buffer( b, file );", - "", - " return b;", - " }", - "", - "", - "%-", - "#ifdef YY_USE_PROTOS", - "void yy_delete_buffer( YY_BUFFER_STATE b )", - "#else", - "void yy_delete_buffer( b )", - "YY_BUFFER_STATE b;", - "#endif", - "%+", - "void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b )", - "%*", - " {", - " if ( ! b )", - " return;", - "", - " if ( b == yy_current_buffer )", - " yy_current_buffer = (YY_BUFFER_STATE) 0;", - "", - " if ( b->yy_is_our_buffer )", - " yy_flex_free( (void *) b->yy_ch_buf );", - "", - " yy_flex_free( (void *) b );", - " }", - "", - "", - "%-", - "#ifndef YY_ALWAYS_INTERACTIVE", - "#ifndef YY_NEVER_INTERACTIVE", - "extern int isatty YY_PROTO(( int ));", - "#endif", - "#endif", - "", - "#ifdef YY_USE_PROTOS", - "void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )", - "#else", - "void yy_init_buffer( b, file )", - "YY_BUFFER_STATE b;", - "FILE *file;", - "#endif", - "", - "%+", - "extern \"C\" int isatty YY_PROTO(( int ));", - "void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, istream* file )", - "%*", - "", - " {", - " yy_flush_buffer( b );", - "", - " b->yy_input_file = file;", - " b->yy_fill_buffer = 1;", - "", - "%-", - "#if YY_ALWAYS_INTERACTIVE", - " b->yy_is_interactive = 1;", - "#else", - "#if YY_NEVER_INTERACTIVE", - " b->yy_is_interactive = 0;", - "#else", - " b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;", - "#endif", - "#endif", - "%+", - " b->yy_is_interactive = 0;", - "%*", - " }", - "", - "", - "%-", - "#ifdef YY_USE_PROTOS", - "void yy_flush_buffer( YY_BUFFER_STATE b )", - "#else", - "void yy_flush_buffer( b )", - "YY_BUFFER_STATE b;", - "#endif", - "", - "%+", - "void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b )", - "%*", - " {", - " 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 )", - " yy_load_buffer_state();", - " }", - "%*", - "", - "", - "#ifndef YY_NO_SCAN_BUFFER", - "%-", - "#ifdef YY_USE_PROTOS", - "YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )", - "#else", - "YY_BUFFER_STATE yy_scan_buffer( base, size )", - "char *base;", - "yy_size_t size;", - "#endif", - " {", - " 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) yy_flex_alloc( sizeof( struct yy_buffer_state ) );", - " if ( ! b )", - " YY_FATAL_ERROR( \"out of dynamic memory in yy_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;", - "", - " yy_switch_to_buffer( b );", - "", - " return b;", - " }", - "%*", - "#endif", - "", - "", - "#ifndef YY_NO_SCAN_STRING", - "%-", - "#ifdef YY_USE_PROTOS", - "YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )", - "#else", - "YY_BUFFER_STATE yy_scan_string( yy_str )", - "yyconst char *yy_str;", - "#endif", - " {", - " int len;", - " for ( len = 0; yy_str[len]; ++len )", - " ;", - "", - " return yy_scan_bytes( yy_str, len );", - " }", - "%*", - "#endif", - "", - "", - "#ifndef YY_NO_SCAN_BYTES", - "%-", - "#ifdef YY_USE_PROTOS", - "YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )", - "#else", - "YY_BUFFER_STATE yy_scan_bytes( bytes, len )", - "yyconst char *bytes;", - "int len;", - "#endif", - " {", - " 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 *) yy_flex_alloc( n );", - " if ( ! buf )", - " YY_FATAL_ERROR( \"out of dynamic memory in yy_scan_bytes()\" );", - "", - " for ( i = 0; i < len; ++i )", - " buf[i] = bytes[i];", - "", - " buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;", - "", - " b = yy_scan_buffer( buf, n );", - " if ( ! b )", - " YY_FATAL_ERROR( \"bad buffer in yy_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_NO_PUSH_STATE", - "%-", - "#ifdef YY_USE_PROTOS", - "static void yy_push_state( int new_state )", - "#else", - "static void yy_push_state( new_state )", - "int new_state;", - "#endif", - "%+", - "void yyFlexLexer::yy_push_state( int new_state )", - "%*", - " {", - " if ( yy_start_stack_ptr >= yy_start_stack_depth )", - " {", - " yy_size_t new_size;", - "", - " yy_start_stack_depth += YY_START_STACK_INCR;", - " new_size = yy_start_stack_depth * sizeof( int );", - "", - " if ( ! yy_start_stack )", - " yy_start_stack = (int *) yy_flex_alloc( new_size );", - "", - " else", - " yy_start_stack = (int *) yy_flex_realloc(", - " (void *) yy_start_stack, new_size );", - "", - " if ( ! yy_start_stack )", - " YY_FATAL_ERROR(", - " \"out of memory expanding start-condition stack\" );", - " }", - "", - " yy_start_stack[yy_start_stack_ptr++] = YY_START;", - "", - " BEGIN(new_state);", - " }", - "#endif", - "", - "", - "#ifndef YY_NO_POP_STATE", - "%-", - "static void yy_pop_state()", - "%+", - "void yyFlexLexer::yy_pop_state()", - "%*", - " {", - " if ( --yy_start_stack_ptr < 0 )", - " YY_FATAL_ERROR( \"start-condition stack underflow\" );", - "", - " BEGIN(yy_start_stack[yy_start_stack_ptr]);", - " }", - "#endif", - "", - "", - "#ifndef YY_NO_TOP_STATE", - "%-", - "static int yy_top_state()", - "%+", - "int yyFlexLexer::yy_top_state()", - "%*", - " {", - " return yy_start_stack[yy_start_stack_ptr - 1];", - " }", - "#endif", - "", - "#ifndef YY_EXIT_FAILURE", - "#define YY_EXIT_FAILURE 2", - "#endif", - "", - "%-", - "#ifdef YY_USE_PROTOS", - "static void yy_fatal_error( yyconst char msg[] )", - "#else", - "static void yy_fatal_error( msg )", - "char msg[];", - "#endif", - " {", - " (void) fprintf( stderr, \"%s\\n\", msg );", - " exit( YY_EXIT_FAILURE );", - " }", - "", - "%+", - "", - "void yyFlexLexer::LexerError( yyconst char msg[] )", - " {", - " cerr << msg << '\\n';", - " exit( YY_EXIT_FAILURE );", - " }", - "%*", - "", - "", - "/* Redefine yyless() so it works in section 3 code. */", - "", - "#undef yyless", - "#define yyless(n) \\", - " do \\", - " { \\", - " /* Undo effects of setting up yytext. */ \\", - " yytext[yyleng] = yy_hold_char; \\", - " yy_c_buf_p = yytext + n; \\", - " yy_hold_char = *yy_c_buf_p; \\", - " *yy_c_buf_p = '\\0'; \\", - " yyleng = n; \\", - " } \\", - " while ( 0 )", - "", - "", - "/* Internal utility routines. */", - "", - "#ifndef yytext_ptr", - "#ifdef YY_USE_PROTOS", - "static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )", - "#else", - "static void yy_flex_strncpy( s1, s2, n )", - "char *s1;", - "yyconst char *s2;", - "int n;", - "#endif", - " {", - " register int i;", - " for ( i = 0; i < n; ++i )", - " s1[i] = s2[i];", - " }", - "#endif", - "", - "#ifdef YY_NEED_STRLEN", - "#ifdef YY_USE_PROTOS", - "static int yy_flex_strlen( yyconst char *s )", - "#else", - "static int yy_flex_strlen( s )", - "yyconst char *s;", - "#endif", - " {", - " register int n;", - " for ( n = 0; s[n]; ++n )", - " ;", - "", - " return n;", - " }", - "#endif", - "", - "", - "#ifdef YY_USE_PROTOS", - "static void *yy_flex_alloc( yy_size_t size )", - "#else", - "static void *yy_flex_alloc( size )", - "yy_size_t size;", - "#endif", - " {", - " return (void *) malloc( size );", - " }", - "", - "#ifdef YY_USE_PROTOS", - "static void *yy_flex_realloc( void *ptr, yy_size_t size )", - "#else", - "static void *yy_flex_realloc( ptr, size )", - "void *ptr;", - "yy_size_t size;", - "#endif", - " {", - " /* 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 );", - " }", - "", - "#ifdef YY_USE_PROTOS", - "static void yy_flex_free( void *ptr )", - "#else", - "static void yy_flex_free( ptr )", - "void *ptr;", - "#endif", - " {", - " free( ptr );", - " }", - "", - "#if YY_MAIN", - "int main()", - " {", - " yylex();", - " return 0;", - " }", - "#endif", - 0 -}; diff --git a/usr.bin/lex/sym.c b/usr.bin/lex/sym.c deleted file mode 100644 index 723c85341a87..000000000000 --- a/usr.bin/lex/sym.c +++ /dev/null @@ -1,262 +0,0 @@ -/* sym - symbol table routines */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* $Header: /home/daffy/u0/vern/flex/RCS/sym.c,v 2.19 95/03/04 16:11:04 vern Exp $ */ - -#include "flexdef.h" - - -/* declare functions that have forward references */ - -int hashfunct PROTO((register char[], int)); - - -struct hash_entry *ndtbl[NAME_TABLE_HASH_SIZE]; -struct hash_entry *sctbl[START_COND_HASH_SIZE]; -struct hash_entry *ccltab[CCL_HASH_SIZE]; - -struct hash_entry *findsym(); - - -/* addsym - add symbol and definitions to symbol table - * - * -1 is returned if the symbol already exists, and the change not made. - */ - -int addsym( sym, str_def, int_def, table, table_size ) -register char sym[]; -char *str_def; -int int_def; -hash_table table; -int table_size; - { - int hash_val = hashfunct( sym, table_size ); - register struct hash_entry *sym_entry = table[hash_val]; - register struct hash_entry *new_entry; - register struct hash_entry *successor; - - while ( sym_entry ) - { - if ( ! strcmp( sym, sym_entry->name ) ) - { /* entry already exists */ - return -1; - } - - sym_entry = sym_entry->next; - } - - /* create new entry */ - new_entry = (struct hash_entry *) - flex_alloc( sizeof( struct hash_entry ) ); - - if ( new_entry == NULL ) - flexfatal( _( "symbol table memory allocation failed" ) ); - - if ( (successor = table[hash_val]) != 0 ) - { - new_entry->next = successor; - successor->prev = new_entry; - } - else - new_entry->next = NULL; - - new_entry->prev = NULL; - new_entry->name = sym; - new_entry->str_val = str_def; - new_entry->int_val = int_def; - - table[hash_val] = new_entry; - - return 0; - } - - -/* cclinstal - save the text of a character class */ - -void cclinstal( ccltxt, cclnum ) -Char ccltxt[]; -int cclnum; - { - /* We don't bother checking the return status because we are not - * called unless the symbol is new. - */ - Char *copy_unsigned_string(); - - (void) addsym( (char *) copy_unsigned_string( ccltxt ), - (char *) 0, cclnum, - ccltab, CCL_HASH_SIZE ); - } - - -/* ccllookup - lookup the number associated with character class text - * - * Returns 0 if there's no CCL associated with the text. - */ - -int ccllookup( ccltxt ) -Char ccltxt[]; - { - return findsym( (char *) ccltxt, ccltab, CCL_HASH_SIZE )->int_val; - } - - -/* findsym - find symbol in symbol table */ - -struct hash_entry *findsym( sym, table, table_size ) -register char sym[]; -hash_table table; -int table_size; - { - static struct hash_entry empty_entry = - { - (struct hash_entry *) 0, (struct hash_entry *) 0, - (char *) 0, (char *) 0, 0, - } ; - register struct hash_entry *sym_entry = - table[hashfunct( sym, table_size )]; - - while ( sym_entry ) - { - if ( ! strcmp( sym, sym_entry->name ) ) - return sym_entry; - sym_entry = sym_entry->next; - } - - return &empty_entry; - } - - -/* hashfunct - compute the hash value for "str" and hash size "hash_size" */ - -int hashfunct( str, hash_size ) -register char str[]; -int hash_size; - { - register int hashval; - register int locstr; - - hashval = 0; - locstr = 0; - - while ( str[locstr] ) - { - hashval = (hashval << 1) + (unsigned char) str[locstr++]; - hashval %= hash_size; - } - - return hashval; - } - - -/* ndinstal - install a name definition */ - -void ndinstal( name, definition ) -char name[]; -Char definition[]; - { - char *copy_string(); - Char *copy_unsigned_string(); - - if ( addsym( copy_string( name ), - (char *) copy_unsigned_string( definition ), 0, - ndtbl, NAME_TABLE_HASH_SIZE ) ) - synerr( _( "name defined twice" ) ); - } - - -/* ndlookup - lookup a name definition - * - * Returns a nil pointer if the name definition does not exist. - */ - -Char *ndlookup( nd ) -char nd[]; - { - return (Char *) findsym( nd, ndtbl, NAME_TABLE_HASH_SIZE )->str_val; - } - - -/* scextend - increase the maximum number of start conditions */ - -void scextend() - { - current_max_scs += MAX_SCS_INCREMENT; - - ++num_reallocs; - - scset = reallocate_integer_array( scset, current_max_scs ); - scbol = reallocate_integer_array( scbol, current_max_scs ); - scxclu = reallocate_integer_array( scxclu, current_max_scs ); - sceof = reallocate_integer_array( sceof, current_max_scs ); - scname = reallocate_char_ptr_array( scname, current_max_scs ); - } - - -/* scinstal - make a start condition - * - * NOTE - * The start condition is "exclusive" if xcluflg is true. - */ - -void scinstal( str, xcluflg ) -char str[]; -int xcluflg; - { - char *copy_string(); - - /* Generate start condition definition, for use in BEGIN et al. */ - action_define( str, lastsc ); - - if ( ++lastsc >= current_max_scs ) - scextend(); - - scname[lastsc] = copy_string( str ); - - if ( addsym( scname[lastsc], (char *) 0, lastsc, - sctbl, START_COND_HASH_SIZE ) ) - format_pinpoint_message( - _( "start condition %s declared twice" ), - str ); - - scset[lastsc] = mkstate( SYM_EPSILON ); - scbol[lastsc] = mkstate( SYM_EPSILON ); - scxclu[lastsc] = xcluflg; - sceof[lastsc] = false; - } - - -/* sclookup - lookup the number associated with a start condition - * - * Returns 0 if no such start condition. - */ - -int sclookup( str ) -char str[]; - { - return findsym( str, sctbl, START_COND_HASH_SIZE )->int_val; - } diff --git a/usr.bin/lex/version.h b/usr.bin/lex/version.h deleted file mode 100644 index 623ca12a6d0b..000000000000 --- a/usr.bin/lex/version.h +++ /dev/null @@ -1 +0,0 @@ -#define FLEX_VERSION "2.5.4" diff --git a/usr.bin/lex/yylex.c b/usr.bin/lex/yylex.c deleted file mode 100644 index 17ec1b8700f4..000000000000 --- a/usr.bin/lex/yylex.c +++ /dev/null @@ -1,216 +0,0 @@ -/* yylex - scanner front-end for flex */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Vern Paxson. - * - * The United States Government has rights in this work pursuant - * to contract no. DE-AC03-76SF00098 between the United States - * Department of Energy and the University of California. - * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* $Header: /home/daffy/u0/vern/flex/RCS/yylex.c,v 2.13 95/03/04 16:10:41 vern Exp $ */ - -#include <ctype.h> -#include "flexdef.h" -#include "parse.h" - - -/* yylex - scan for a regular expression token */ - -int yylex() - { - int toktype; - static int beglin = false; - extern char *yytext; - - if ( eofseen ) - toktype = EOF; - else - toktype = flexscan(); - - if ( toktype == EOF || toktype == 0 ) - { - eofseen = 1; - - if ( sectnum == 1 ) - { - synerr( _( "premature EOF" ) ); - sectnum = 2; - toktype = SECTEND; - } - - else - toktype = 0; - } - - if ( trace ) - { - if ( beglin ) - { - fprintf( stderr, "%d\t", num_rules + 1 ); - beglin = 0; - } - - switch ( toktype ) - { - case '<': - case '>': - case '^': - case '$': - case '"': - case '[': - case ']': - case '{': - case '}': - case '|': - case '(': - case ')': - case '-': - case '/': - case '\\': - case '?': - case '.': - case '*': - case '+': - case ',': - (void) putc( toktype, stderr ); - break; - - case '\n': - (void) putc( '\n', stderr ); - - if ( sectnum == 2 ) - beglin = 1; - - break; - - case SCDECL: - fputs( "%s", stderr ); - break; - - case XSCDECL: - fputs( "%x", stderr ); - break; - - case SECTEND: - fputs( "%%\n", stderr ); - - /* We set beglin to be true so we'll start - * writing out numbers as we echo rules. - * flexscan() has already assigned sectnum. - */ - if ( sectnum == 2 ) - beglin = 1; - - break; - - case NAME: - fprintf( stderr, "'%s'", nmstr ); - break; - - case CHAR: - switch ( yylval ) - { - case '<': - case '>': - case '^': - case '$': - case '"': - case '[': - case ']': - case '{': - case '}': - case '|': - case '(': - case ')': - case '-': - case '/': - case '\\': - case '?': - case '.': - case '*': - case '+': - case ',': - fprintf( stderr, "\\%c", - yylval ); - break; - - default: - if ( ! isascii( yylval ) || - ! isprint( yylval ) ) - fprintf( stderr, - "\\%.3o", - (unsigned int) yylval ); - else - (void) putc( yylval, - stderr ); - break; - } - - break; - - case NUMBER: - fprintf( stderr, "%d", yylval ); - break; - - case PREVCCL: - fprintf( stderr, "[%d]", yylval ); - break; - - case EOF_OP: - fprintf( stderr, "<<EOF>>" ); - break; - - case OPTION_OP: - fprintf( stderr, "%s ", yytext ); - break; - - case OPT_OUTFILE: - case OPT_PREFIX: - case CCE_ALNUM: - case CCE_ALPHA: - case CCE_BLANK: - case CCE_CNTRL: - case CCE_DIGIT: - case CCE_GRAPH: - case CCE_LOWER: - case CCE_PRINT: - case CCE_PUNCT: - case CCE_SPACE: - case CCE_UPPER: - case CCE_XDIGIT: - fprintf( stderr, "%s", yytext ); - break; - - case 0: - fprintf( stderr, _( "End Marker\n" ) ); - break; - - default: - fprintf( stderr, - _( "*Something Weird* - tok: %d val: %d\n" ), - toktype, yylval ); - break; - } - } - - return toktype; - } diff --git a/version.h b/version.h new file mode 100644 index 000000000000..b9e5d6c23307 --- /dev/null +++ b/version.h @@ -0,0 +1 @@ +#define FLEX_VERSION VERSION diff --git a/yylex.c b/yylex.c new file mode 100644 index 000000000000..f06e5e6a2659 --- /dev/null +++ b/yylex.c @@ -0,0 +1,211 @@ +/* yylex - scanner front-end for flex */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include <ctype.h> +#include "flexdef.h" +#include "parse.h" + + +/* yylex - scan for a regular expression token */ + +int yylex () +{ + int toktype; + static int beglin = false; + extern char *yytext; + + if (eofseen) + toktype = EOF; + else + toktype = flexscan (); + + if (toktype == EOF || toktype == 0) { + eofseen = 1; + + if (sectnum == 1) { + synerr (_("premature EOF")); + sectnum = 2; + toktype = SECTEND; + } + + else + toktype = 0; + } + + if (trace) { + if (beglin) { + fprintf (stderr, "%d\t", num_rules + 1); + beglin = 0; + } + + switch (toktype) { + case '<': + case '>': + case '^': + case '$': + case '"': + case '[': + case ']': + case '{': + case '}': + case '|': + case '(': + case ')': + case '-': + case '/': + case '\\': + case '?': + case '.': + case '*': + case '+': + case ',': + (void) putc (toktype, stderr); + break; + + case '\n': + (void) putc ('\n', stderr); + + if (sectnum == 2) + beglin = 1; + + break; + + case SCDECL: + fputs ("%s", stderr); + break; + + case XSCDECL: + fputs ("%x", stderr); + break; + + case SECTEND: + fputs ("%%\n", stderr); + + /* We set beglin to be true so we'll start + * writing out numbers as we echo rules. + * flexscan() has already assigned sectnum. + */ + if (sectnum == 2) + beglin = 1; + + break; + + case NAME: + fprintf (stderr, "'%s'", nmstr); + break; + + case CHAR: + switch (yylval) { + case '<': + case '>': + case '^': + case '$': + case '"': + case '[': + case ']': + case '{': + case '}': + case '|': + case '(': + case ')': + case '-': + case '/': + case '\\': + case '?': + case '.': + case '*': + case '+': + case ',': + fprintf (stderr, "\\%c", yylval); + break; + + default: + if (!isascii (yylval) || !isprint (yylval)) + fprintf (stderr, + "\\%.3o", + (unsigned int) yylval); + else + (void) putc (yylval, stderr); + break; + } + + break; + + case NUMBER: + fprintf (stderr, "%d", yylval); + break; + + case PREVCCL: + fprintf (stderr, "[%d]", yylval); + break; + + case EOF_OP: + fprintf (stderr, "<<EOF>>"); + break; + + case OPTION_OP: + fprintf (stderr, "%s ", yytext); + break; + + case OPT_OUTFILE: + case OPT_PREFIX: + case CCE_ALNUM: + case CCE_ALPHA: + case CCE_BLANK: + case CCE_CNTRL: + case CCE_DIGIT: + case CCE_GRAPH: + case CCE_LOWER: + case CCE_PRINT: + case CCE_PUNCT: + case CCE_SPACE: + case CCE_UPPER: + case CCE_XDIGIT: + fprintf (stderr, "%s", yytext); + break; + + case 0: + fprintf (stderr, _("End Marker\n")); + break; + + default: + fprintf (stderr, + _ + ("*Something Weird* - tok: %d val: %d\n"), + toktype, yylval); + break; + } + } + + return toktype; +} |