diff options
author | Ted Unangst <tedu@cvs.openbsd.org> | 2015-11-19 19:43:41 +0000 |
---|---|---|
committer | Ted Unangst <tedu@cvs.openbsd.org> | 2015-11-19 19:43:41 +0000 |
commit | 3ed71134b00d13f674ae555d489ed3f7c262c849 (patch) | |
tree | 5366e49076abb45d59627f9ccce444d886065259 /usr.bin/lex | |
parent | 77d522ada02becf96f1a46c2dfc83c03dc2d48dc (diff) |
Update flex from ancient 2.5.4 to the recent 2.5.39.
This work was all done by Serguey Parkhomovsky. Thanks.
Some changes from upstream:
* Removed autotools cruft/localization/texinfo manual/etc
* Kept the old manpage, as the new manpage is content-free
* Used safe string handling functions and fixed several compiler warnings
* pledge(2). Flex 2.5.39 now forks/execs its filter chains and needs proc
exec in addition to what was previously pledged
* Removed register keyword from all variable declarations
* renamed parse.c, parse.h, scan.c, skel.c with init prefix so compiling
flex outside of obj by accident wouldn't clobber the bootstrap files
* Minor fixes (spelling, accessing buf[strlen(buf) - 1] for zero-length
strings in initscan.c/scan.l, etc) that were already in our tree
This is a huge change, so it's going in the tree code bomb style.
I'm not excited about the growth in complexity (like now running m4
to _post_ process lexers) but hopefully this will be a one time update
and we will now take "ownership" of the code.
Diffstat (limited to 'usr.bin/lex')
45 files changed, 33775 insertions, 7474 deletions
diff --git a/usr.bin/lex/COPYING b/usr.bin/lex/COPYING index fdfcd894b56..684b011026d 100644 --- a/usr.bin/lex/COPYING +++ b/usr.bin/lex/COPYING @@ -2,34 +2,36 @@ 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, 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. +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 diff --git a/usr.bin/lex/ChangeLog b/usr.bin/lex/ChangeLog new file mode 100644 index 00000000000..f5610cd8c0a --- /dev/null +++ b/usr.bin/lex/ChangeLog @@ -0,0 +1,8222 @@ +2014-02-16 Translation Project <coordinator@translationproject.org> + + * po/ru.po: update ru translation from the translation project + +2014-02-14 Will Estes <westes575@gmail.com> + + * NEWS: mention updated da translation in release news + +2014-02-14 Translation Project <coordinator@translationproject.org> + + * po/da.po: update da translation from the translation project + +2014-02-14 Will Estes <westes575@gmail.com> + + * NEWS: mention updated es translation in release news + +2014-02-14 Translation Project <coordinator@translationproject.org> + + * po/es.po: update es translation from the translation project + +2014-02-14 Will Estes <westes575@gmail.com> + + * NEWS: mention updated ko translation in release news + +2014-02-14 Translation Project <coordinator@translationproject.org> + + * po/ko.po: update ko translation from the translation project + +2014-02-14 Will Estes <westes575@gmail.com> + + * NEWS: mention updated ro translation in release news + +2014-02-14 Translation Project <coordinator@translationproject.org> + + * po/ro.po: update ro translation from the translation project + +2014-02-14 Will Estes <westes575@gmail.com> + + * NEWS: mention updated ru translation in release news + +2014-02-14 Translation Project <coordinator@translationproject.org> + + * po/ru.po: update ru translation from the translation project + +2014-02-14 Will Estes <westes575@gmail.com> + + * NEWS: mention updated sv translation in news + +2014-02-14 Translation Project <coordinator@translationproject.org> + + * po/sv.po: update sv translation from the translation project + +2014-02-14 Will Estes <westes575@gmail.com> + + * NEWS: mention updated tr translation in news + +2014-02-14 Translation Project <coordinator@translationproject.org> + + * po/tr.po: update tr translation from the translation project + +2014-02-14 Will Estes <westes575@gmail.com> + + * NEWS: mention updated zh_CN in release news + +2014-02-14 Translation Project <coordinator@translationproject.org> + + * po/zh_CN.po: update zh_CN translation from the translation project + +2014-02-14 Will Estes <westes575@gmail.com> + + * NEWS, po/LINGUAS, po/zh_TW.po, po/zh_tw.po: rename zh_tw + translation to its proper zh_TW name + +2014-02-14 Will Estes <westes575@gmail.com> + + * NEWS: mention updated nl, vi translations in release news + +2014-02-14 Translation Project <coordinator@translationproject.org> + + * po/vi.po: update vi translation from the translation project + +2014-02-14 Translation Project <coordinator@translationproject.org> + + * po/nl.po: update nl translation from the translation project + +2014-02-14 Will Estes <westes575@gmail.com> + + * TODO: remove some unneeded entries from the todo list + +2014-02-13 Will Estes <westes575@gmail.com> + + * doc/Makefile.am: list more generated files in CLEANFILES + +2014-02-13 Will Estes <westes575@gmail.com> + + * doc/flex.xml: remove unmaintained xml documentation + +2014-02-13 Will Estes <westes575@gmail.com> + + * configure.ac: bump AM_GNU_GETTEXT_VERSION to 0.18.1 + +2014-02-13 Will Estes <westes575@gmail.com> + + * README: list new location of flex git repo + +2014-02-13 Will Estes <westes575@gmail.com> + + * po/.gitignore: git ignore generated files from english quoting + variant translations + +2014-02-13 Will Estes <westes575@gmail.com> + + * po/LINGUAS: name english quoting variants correctly + +2014-02-13 Will Estes <westes575@gmail.com> + + * Makefile.am, configure.ac, tools/Makefile.am: removed tools/ + subdirectory from distribution Since it is not possible to rebuild the ChangeLog file without being + in a git working directory of flex, distributing the tools directory + is misleading. In particular, git2cl will always fail. + +2014-02-13 Will Estes <westes575@gmail.com> + + * po/LINGUAS: removed unneeded blank line from translation list + +2014-02-13 Will Estes <westes575@gmail.com> + + * po/LINGUAS: added en quoting variants to translation list + +2014-02-11 Will Estes <westes575@gmail.com> + + * configure.ac: use gnu automake option instead of gnits option + +2014-02-11 Will Estes <westes575@gmail.com> + + * README-alpha: remove README_alpha file since it is no longer + needed + +2014-02-10 Will Estes <westes575@gmail.com> + + * configure.ac: increment version to 2.5.38 + +2013-11-27 Will Estes <westes575@gmail.com> + + * NEWS: flesh out internationalization section of NEWS file; mention + pt_BR translation + +2013-11-27 Translation Project <coordinator@translationproject.org> + + * po/pt_BR.po: update pt_BR translation from the translation project + +2013-10-31 Will Estes <westes575@gmail.com> + + * NEWS: begin listing 2.5.38 version in NEWS; list new sr + translation + +2013-10-31 Will Estes <westes575@gmail.com> + + * po/LINGUAS: list new sr translation in list of translations + +2013-10-31 Will Estes <westes575@gmail.com> + + * po/sr.po: add sr translation from the translation project + +2013-07-02 Till Varoquaux <till.varoquaux@gmail.com> + + * configure.ac, flex.skl, nfa.c, tests/Makefile.am, + tests/test-lineno-trailing/.gitignore, + tests/test-lineno-trailing/Makefile.am, + tests/test-lineno-trailing/scanner.l, + tests/test-lineno-trailing/test.input: Adjust yylineno properly when + rewinding trailing contexts. + +2013-05-28 Will Estes <westes575@gmail.com> + + * Makefile.am: Remove incorrect / in install-exec-hook target + +2013-02-16 Translation Project <coordinators@translationproject.org> + + * po/LINGUAS, po/zh_tw.po: add zh_tw translation from the + translation project + +2012-12-06 Christoph Junghans <ottxor@gentoo.org> + + * Makefile.am, configure.ac: add version information to shared + library Signed-off-by: Will Estes <westes575@gmail.com> + +2012-12-04 Christoph Junghans <ottxor@gentoo.org> + + * .gitignore, Makefile.am, configure.ac, lib/Makefile.am: Build + libfl and libcompat using libtool; resolves #3586814 Signed-off-by: Will Estes <westes575@gmail.com> + +2012-12-04 Translation Project <coordinator@translationproject.org> + + * po/ca.po: update ca translation + +2012-10-31 Hugh Sasse <hgs@dmu.ac.uk> + + * tests/test-extended/Makefile.am, tests/test-quotes/Makefile.am: + use cmp instead of diff in some tests for portability reasons Signed-off-by: Will Estes <westes575@gmail.com> + +2012-10-31 Dennis Clarke <dclarke@blastwave.org> + + * tests/TEMPLATE/Makefile.am, tests/test-alloc-extra/Makefile.am, + tests/test-array-nr/Makefile.am, tests/test-array-r/Makefile.am, + tests/test-basic-nr/Makefile.am, tests/test-basic-r/Makefile.am, + tests/test-bison-nr/Makefile.am, + tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylval/Makefile.am, + tests/test-c++-basic/Makefile.am, + tests/test-c++-multiple-scanners/Makefile.am, + tests/test-c++-yywrap/Makefile.am, tests/test-c-cpp-nr/Makefile.am, + tests/test-c-cpp-r/Makefile.am, tests/test-ccl/Makefile.am, + tests/test-debug-nr/Makefile.am, tests/test-debug-r/Makefile.am, + tests/test-extended/Makefile.am, tests/test-header-nr/Makefile.am, + tests/test-header-r/Makefile.am, + tests/test-include-by-buffer/Makefile.am, + tests/test-include-by-push/Makefile.am, + tests/test-include-by-reentrant/Makefile.am, + tests/test-linedir-r/Makefile.am, tests/test-lineno-nr/Makefile.am, + tests/test-lineno-r/Makefile.am, tests/test-mem-nr/Makefile.am, + tests/test-mem-r/Makefile.am, + tests/test-multiple-scanners-nr/Makefile.am, + tests/test-multiple-scanners-r/Makefile.am, + tests/test-noansi-nr/Makefile.am, tests/test-noansi-r/Makefile.am, + tests/test-posix/Makefile.am, + tests/test-posixly-correct/Makefile.am, + tests/test-prefix-nr/Makefile.am, tests/test-prefix-r/Makefile.am, + tests/test-pthread/Makefile.am, tests/test-quotes/Makefile.am, + tests/test-reject/Makefile.am, tests/test-rescan-nr/Makefile.am, + tests/test-rescan-r/Makefile.am, tests/test-string-nr/Makefile.am, + tests/test-string-r/Makefile.am, tests/test-table-opts/Makefile.am, + tests/test-top/Makefile.am, tests/test-yyextra/Makefile.am: add + CFLAGS and CXXFLAGS options as appropriate to testsuite Makefile.am + files Signed-off-by: Will Estes <westes575@gmail.com> + +2012-10-25 Will Estes <westes575@gmail.com> + + * po/LINGUAS: add hr to list of translations + +2012-10-25 Translation Project <coordinator@translationproject.org> + + * po/hr.po: add hr translation from the translation project + +2012-10-25 Translation Project <coordinator@translationproject.org> + + * po/fr.po: new fr translation project from the translation project + +2012-09-08 Will Estes <westes575@gmail.com> + + * po/LINGUAS: update languages list to include esperanto translation + +2012-09-08 Translation Project <coordinator@translationproject.org> + + * po/eo.po: add eo translation from the translation project + +2012-08-26 Will Estes <westes575@gmail.com> + + * configure.ac: add dist-xz to automake options; resolves #3561837 + +2012-08-26 Will Estes <westes575@gmail.com> + + * autogen.sh, configure.ac: require gettext 0.18; force autoreconf + in autogen.sh; resolves #3561759 Autoconf had trouble finding the shared libraries for gettext. Using + gettext 0.18 fixes that. When updating the gettext version number, autoreconf could fail to + update files, since autopoint would assume the gettext-related files + had been locally modified. Passing --force prevents that from + happening. + +2012-08-15 Will Estes <westes575@gmail.com> + + * Makefile.am: remove README.cvs from dist_doc_DATA in Makefile.am + +2012-08-13 Will Estes <westes575@gmail.com> + + * : commit 9256a268e2a1000cb410766e95487912a7d66d61 Author: Will + Estes <westes575@gmail.com> Date: Mon Aug 13 16:23:35 2012 -0400 + +2012-08-08 Will Estes <westes575@gmail.com> + + * README, README.cvs: append README.cvs contents to README + +2012-08-08 Will Estes <westes575@gmail.com> + + * gen.c: fix m4 error when useecs and nultrans are true; resolves + #1816878 + +2012-08-08 Robert Minsk <rminsk@users.sourceforge.net> + + * flex.skl: put user code after yyguts init; resolves #1744516 Signed-off-by: Will Estes <westes575@gmail.com> + +2012-08-08 Robert Minsk <rminsk@users.sourceforge.net> + + * flex.skl, main.c: do not output yy_nxt to header with %option + full; resolves #1739922 Signed-off-by: Will Estes <westes575@gmail.com> + +2012-08-07 Will Estes <westes575@gmail.com> + + * main.c: let flex decide if yymore and reject are needed in lex + compatible mode This resolves bug #3510440. + +2012-08-06 Translation Project <coordinator@translationproject.org> + + * po/vi.po: new vi translation from the translation project + +2012-08-06 Will Estes <westes575@gmail.com> + + * .gitignore: add more patterns to .gitignore Undersome circumstances, the build process will generate conf.in~, + which we want to ignore. Also, some patch files will apply but not + cleanly and *.orig and *.rej files are generated. We want to ignore + them as well. + +2012-08-06 Will Estes <westes575@gmail.com> + + * configure.ac, configure.in: rename configure.in to configure.ac to + prep for upcoming automake changes + +2012-08-06 Elias Pipping <pipping@users.sourceforge.net> + + * tests/test-bison-yylloc/main.c, tests/test-bison-yylloc/parser.y, + tests/test-bison-yylval/main.c, tests/test-bison-yylval/parser.y: + Fix two tests to pass under bison 2.6 Given that bison is moving forward with the %parse-param instead of + YYPARSE_PARAM syntax, it makes sense to switch over to using the new + style declaration. In particular, this means that flex scanners that + use bison features will now require bison 2.6 or higher. Signed-off-by: Will Estes <westes575@gmail.com> + +2012-08-04 Will Estes <westes575@gmail.com> + + * po/nl.po: new nl translation from the translation project + +2012-08-04 Mike Frysinger <vapier@gentoo.org> + + * flexdef.h: add prototype for lerrsf_fatal to flexdef.h Signed-off-by: Will Estes <westes575@gmail.com> + +2012-08-04 nomis52 <nomis52@users.sourceforge.net> + + * flex.skl, gen.c: Change variable types to silence compiler + warnings; resolves #3552806 Signed-off-by: Will Estes <westes575@gmail.com> + +2012-08-03 Will Estes <westes575@gmail.com> + + * NEWS: update NEWS to reflect changes in 2.5.37 + +2012-08-03 Will Estes <westes575@gmail.com> + + * configure.in: update flex version to 2.5.37 + +2012-08-03 Will Estes <westes575@gmail.com> + + * po/de.po: new de translation from the translation project + +2012-08-02 Will Estes <westes575@gmail.com> + + * po/vi.po: new vi translation from the translation project + +2012-08-02 Will Estes <westes575@gmail.com> + + * po/pl.po: new pl translation from the translation project + +2012-08-02 Will Estes <westes575@gmail.com> + + * po/fi.po: new fi translation from the translation project + +2012-08-02 Will Estes <westes575@gmail.com> + + * Makefile.am: Add -f option to LN_S to create flex++ The autoconf macro LN_S needs -f to successfully install flex++ if + flex++ already exists. Fortunately, ln, ln -s and cp -p, which are + the various forms that LN_S can take all will do the right thing + with a -f argument passed. + +2012-08-02 Will Estes <westes575@gmail.com> + + * Makefile.am, tools/Makefile.am, tools/cvs2cl.pl, + tools/cvsauthors, tools/git2cl: replace cvs2cl with git2cl Add the git2cl script in tools/ and remove the (now unnecessary) + cvs2cl script. Remove tools/cvsauthors since git2cl does not need + that file. Account for all the above in Makefile.am and + tools/Makefile.am + +2012-07-29 Will Estes <wlestes@users.sourceforge.net> + + * tests/.cvsignore, tests/.gitignore, tests/TEMPLATE/.cvsignore, + tests/TEMPLATE/.gitignore, tests/test-alloc-extra/.cvsignore, + tests/test-alloc-extra/.gitignore, tests/test-array-nr/.cvsignore, + tests/test-array-nr/.gitignore, tests/test-array-r/.cvsignore, + tests/test-array-r/.gitignore, tests/test-basic-nr/.cvsignore, + tests/test-basic-nr/.gitignore, tests/test-basic-r/.cvsignore, + tests/test-basic-r/.gitignore, tests/test-bison-nr/.cvsignore, + tests/test-bison-nr/.gitignore, tests/test-bison-yylloc/.cvsignore, + tests/test-bison-yylloc/.gitignore, + tests/test-bison-yylval/.cvsignore, + tests/test-bison-yylval/.gitignore, + tests/test-c++-basic/.cvsignore, tests/test-c++-basic/.gitignore, + tests/test-c++-multiple-scanners/.cvsignore, + tests/test-c++-multiple-scanners/.gitignore, + tests/test-c++-yywrap/.cvsignore, tests/test-c++-yywrap/.gitignore, + tests/test-c-cpp-nr/.cvsignore, tests/test-c-cpp-nr/.gitignore, + tests/test-c-cpp-r/.cvsignore, tests/test-c-cpp-r/.gitignore, + tests/test-ccl/.cvsignore, tests/test-ccl/.gitignore, + tests/test-concatenated-options/.cvsignore, + tests/test-concatenated-options/.gitignore, + tests/test-debug-nr/.cvsignore, tests/test-debug-nr/.gitignore, + tests/test-debug-r/.cvsignore, tests/test-debug-r/.gitignore, + tests/test-extended/.cvsignore, tests/test-extended/.gitignore, + tests/test-header-nr/.cvsignore, tests/test-header-nr/.gitignore, + tests/test-header-r/.cvsignore, tests/test-header-r/.gitignore, + tests/test-include-by-buffer/.cvsignore, + tests/test-include-by-buffer/.gitignore, + tests/test-include-by-push/.cvsignore, + tests/test-include-by-push/.gitignore, + tests/test-include-by-reentrant/.cvsignore, + tests/test-include-by-reentrant/.gitignore, + tests/test-linedir-r/.cvsignore, tests/test-linedir-r/.gitignore, + tests/test-lineno-nr/.cvsignore, tests/test-lineno-nr/.gitignore, + tests/test-lineno-r/.cvsignore, tests/test-lineno-r/.gitignore, + tests/test-mem-nr/.cvsignore, tests/test-mem-nr/.gitignore, + tests/test-mem-r/.cvsignore, tests/test-mem-r/.gitignore, + tests/test-multiple-scanners-nr/.cvsignore, + tests/test-multiple-scanners-nr/.gitignore, + tests/test-multiple-scanners-r/.cvsignore, + tests/test-multiple-scanners-r/.gitignore, + tests/test-noansi-nr/.cvsignore, tests/test-noansi-nr/.gitignore, + tests/test-noansi-r/.cvsignore, tests/test-noansi-r/.gitignore, + tests/test-posix/.cvsignore, tests/test-posix/.gitignore, + tests/test-posixly-correct/.cvsignore, + tests/test-posixly-correct/.gitignore, + tests/test-prefix-nr/.cvsignore, tests/test-prefix-nr/.gitignore, + tests/test-prefix-r/.cvsignore, tests/test-prefix-r/.gitignore, + tests/test-pthread/.cvsignore, tests/test-pthread/.gitignore, + tests/test-quotes/.cvsignore, tests/test-quotes/.gitignore, + tests/test-reject/.cvsignore, tests/test-reject/.gitignore, + tests/test-rescan-nr/.cvsignore, tests/test-rescan-nr/.gitignore, + tests/test-rescan-r/.cvsignore, tests/test-rescan-r/.gitignore, + tests/test-string-nr/.cvsignore, tests/test-string-nr/.gitignore, + tests/test-string-r/.cvsignore, tests/test-string-r/.gitignore, + tests/test-table-opts/.cvsignore, tests/test-table-opts/.gitignore, + tests/test-top/.cvsignore, tests/test-top/.gitignore, + tests/test-yyextra/.cvsignore, tests/test-yyextra/.gitignore: rename + .cvsignore files in tests/ subdirectories to gitignore + +2012-07-23 Will Estes <wlestes@users.sourceforge.net> + + * examples/.cvsignore, examples/fastwc/.cvsignore, + examples/manual/.cvsignore, lib/.cvsignore, tools/.cvsignore: remove + unneeded .cvsignore files + +2012-07-22 Will Estes <wlestes@users.sourceforge.net> + + * .gitignore: add *.o and *.a to top level .gitignore The cvs tree did not need these additions because cvs assumed a lot + of C-style defaults for .cvsignore files. flex builds *.o object + files in the course of compilation and *.a files are built as a part + of the libraries that flex compiles in the build process. + +2012-07-22 Will Estes <wlestes@users.sourceforge.net> + + * .cvsignore, .gitignore, doc/.cvsignore, doc/.gitignore, + m4/.cvsignore, m4/.gitignore, po/.cvsignore, po/.gitignore: rename + .cvsignore files to .gitignore The .cvsignore files from the legacy cvs repository tracked what + files got autogenerated during various stages of the flex build. + Renaming the .cvsignore files to .gitignore lets git do the same + thing. git is better about letting higher level .gitignore files + not-track files in lower level directories. As I work my way through + the test directories, we may add additional .gitignore files from + the old .cvsignore files. The po/ directory has a lot of special files used by gettext, so the + patterns in po/.gitignore look very different. The doc/.gitignore file accounts for what texinfo/makeinfo do, and + so it also has special patterns. The m4 directory is mainly present for autoconf's benefit, but we + have to account for it so make can do the right thing. Hence, + m4/.gitignore says to ignore *.m4, as counterintuitive as that may + seem. + +2012-07-22 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: update NEWS file to note release date of 2.5.36 + +2012-06-23 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: fix call to version in manual + +2012-06-22 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: add missing argument to call to yylex in manual + +2012-04-27 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: lintish cleanup in flex.skl; resolves #2040664 + +2012-04-27 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: add a 7 to the c99 octal pattern; resolves #3518269 + +2012-03-31 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: copyedit; resolves #3513670 + +2012-03-23 Will Estes <wlestes@users.sourceforge.net> + + * buf.c: escape backslashes in #line filenames in %top section; + resolves #3212400; patch submitted by scfc_de + +2012-03-21 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, configure.in, lib/Makefile.am, lib/lib.c, + lib/malloc.c, lib/realloc.c: provide malloc() and realloc() for + systems that do not have satisfactory versions; resolves #1899047 + +2012-03-21 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: install flex++ as a link; resolves bug #2939681 + +2012-03-21 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-bison-nr/Makefile.am, + tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylval/Makefile.am: fix dependencies for make -j in + test suite + +2012-03-19 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: add missing prototypes for yyset_column() and + yyget_column(); resolves #3029024; patch submitted by scfc_de + +2012-03-02 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl, tests/test-reject/scanner.l, + tests/test-table-opts/scanner.l: wrap yy_fatal_error calls + appropriately + +2012-03-02 Will Estes <wlestes@users.sourceforge.net> + + * regex.c: fix overlapping data buffer issue; patch from Tim + Landsheet scfc_de + +2012-03-02 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: better bracket handling in the scanner + +2012-03-02 Will Estes <wlestes@users.sourceforge.net> + + * flexdef.h, main.c, misc.c: Remove unneeded tracking of line/column + output; patch from Tim Landsheet scfc_de + +2012-03-02 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: fix test for m4 to accept an m4 with -P and not jus + tGNU m4; patch from Tim Landsheet scfc_de on sourceforge + +2012-03-02 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: fix order of td_lolen and td_hilen in + documentation; resolves #2913693; patch submitted by Andreas + Gruenbacher <agruen@suse.de> + +2012-03-02 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: correct document of YY_FLUSH_BUFFER; resolves + #1723028 + +2012-02-17 Will Estes <wlestes@users.sourceforge.net> + + * dfa.c, flexdef.h, misc.c, parse.y: speed up things for complex + inputs; resolves #2891390 + +2012-02-17 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: fix ipv6 pattern in manual; update manual copyright + to 2012 + +2012-02-17 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: fremove isatty() declaration; resolves #1984987 + +2012-02-17 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: Add link for RFC 2396 + +2012-02-17 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: resolve #1990170 + +2012-02-17 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: fix documentation to reflect arguments actually used; + bug #2783023 + +2012-02-05 Will Estes <wlestes@users.sourceforge.net> + + * main.c: fix yywrap behavior for reentrant scanners + +2012-02-04 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: Mmention tr translation + +2012-02-04 Will Estes <wlestes@users.sourceforge.net> + + * tables.c: prevent unused stuff from being compiled so as to reduce + warnings + +2012-02-03 Will Estes <wlestes@users.sourceforge.net> + + * buf.c, filter.c, main.c, misc.c, regex.c, scanflags.c: more better + error messages; more better memory handling + +2012-02-03 Will Estes <wlestes@users.sourceforge.net> + + * misc.c: more careful/paranoia + +2012-02-03 Will Estes <wlestes@users.sourceforge.net> + + * scanopt.c: more careful memory allocation in option processing + +2012-02-03 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, configure.in: remove m4/ directory and generally + clean up automake/autoconf inputs + +2012-02-03 Will Estes <wlestes@users.sourceforge.net> + + * lib/.cvsignore: cvsignore files that need that + +2012-02-03 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/da.po, po/es.po, po/ko.po, po/pt_BR.po, po/ro.po, + po/ru.po, po/sv.po, po/tr.po, po/zh_CN.po: check in translations + +2012-02-03 Will Estes <wlestes@users.sourceforge.net> + + * main.c: correct macro definition of yywrap + +2012-02-03 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: Greater specificity in error messages + +2012-02-03 Will Estes <wlestes@users.sourceforge.net> + + * parse.y: improve rule handling at EOF + +2012-02-03 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: include cstdio for definition of EOF in all cases + +2012-02-03 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: suppress warning on unused yyguts_t + +2010-08-13 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/LINGUAS, po/fi.po: new fi translation from the + translation project + +2009-03-31 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: Include version.texi after @setfilename, so that @set values are correctly evaluated. (Start Conditions, Performance, Lex and Posix): Fix some markup errors. (Cxx): Likewise. Also, fix C++ example to actually be compilable. Patch from Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + +2008-12-28 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: remove line break that broke configure + +2008-12-28 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: specify the title on the title page since @settitle + doesn't do that for us; resolves bug #2043491 + +2008-12-28 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, flexdef.h: check for regex.h; resolves bug #2337486 + +2008-07-23 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/ga.po: new ga translation from the translation project + +2008-06-10 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/ca.po: new ca translation + +2008-05-31 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: move ABOUT-NLS back to EXTRA_DIST + +2008-05-31 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: create new dist_doc_DATA; move some EXTRA_DIST files + to new dist_doc_DATA target + +2008-05-31 Will Estes <wlestes@users.sourceforge.net> + + * .cvsignore: ignore more automake generated config.status* files + +2008-05-31 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: flex distribution now built with automake and autoconf + versions ... + +2008-05-31 Will Estes <wlestes@users.sourceforge.net> + + * README.cvs: document GNU auto* version changes for building flex + from cvs + +2008-05-31 Will Estes <wlestes@users.sourceforge.net> + + * .cvsignore, doc/Makefile.am: ignore automake-supplied ylwrap + +2008-05-15 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, flex.skl: clean up types; resolves 1961902 + +2008-05-15 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: update NEWS re manual + +2008-05-15 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: correct eroneous references to 'nowrap' to refer to + 'noyywrap'; resolves bug #1739912 + +2008-05-14 Will Estes <wlestes@users.sourceforge.net> + + * filter.c: call clearerr on stdin before dup2'ing it; resolves bug + #1902612 + +2008-05-14 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: generic updates to NEWS + +2008-05-14 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-pthread/Makefile.am: move library flags in linker + command; resolves patch #1943403; patch submitted by + nullnix@users.sourceforge.net + +2008-05-14 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: use ansi syntax in simple examples; resolves patch + #1909844; patch submitted by Tom Browder, + tbrowder2@users.sourceforge.net + +2008-04-10 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: fix typo in example (from Paolo J. Matos + +2008-04-10 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: move endif to better account for what C99 defines for + integer types (fix from debian project) + +2008-04-10 Will Estes <wlestes@users.sourceforge.net> + + * gen.c: fix another int type to be size_t + +2008-03-30 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/fr.po: new fr translation + +2008-03-30 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: start version 2.5.36 + +2008-02-26 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: add date of release + +2008-02-15 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, parse.y: fix bug that prevented comments from working + properly + +2008-02-12 Will Estes <wlestes@users.sourceforge.net> + + * po/de.po: new de translation + +2008-02-10 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/vi.po: new vi translation + +2008-02-10 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/nl.po: new nl translation + +2008-02-09 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/pl.po: new pl translation + +2008-02-09 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/de.po, po/pt_BR.po: new de, pt_br translations + +2008-02-09 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, flex.skl: generate headers for all functions (resolves bug + #1628314) + +2008-02-09 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, flex.skl: change yy_size_t to be size_t (resolves bug + #1849812) + +2008-02-09 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: start work on version 2.5.35 + +2007-12-12 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: revert NEWS and configure.in to version 2.5.34 + +2007-09-12 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: update version number to 2.5.35 + +2007-09-10 Aaron Stone <sodabrew@users.sourceforge.net> + + * tests/test-alloc-extra/scanner.l: Use %option extra-type. + +2007-09-10 Aaron Stone <sodabrew@users.sourceforge.net> + + * NEWS, doc/flex.texi, flex.skl, flexdef.h, main.c, parse.y, scan.l: + Introduce %option extra-type="your_type *" (resolves bug #1744505). + +2007-08-15 Will Estes <wlestes@users.sourceforge.net> + + * po/nl.po: new nl translations from the translation project + +2007-06-28 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: change release date + +2007-06-28 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: adjustment for prefix classes; patch submitted by Petr + Machata <pmachata@redhat.com> + +2007-06-28 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: NEWS item for yy_init_extra + +2007-06-12 Aaron Stone <sodabrew@users.sourceforge.net> + + * doc/flex.texi: Docs and example for yylex_init_extra. + +2007-06-01 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-alloc-extra/.cvsignore: ignore OUTPUT file in + test-alloc-extra + +2007-06-01 Will Estes <wlestes@users.sourceforge.net> + + * tests/descriptions: add description of concatenated options test + +2007-05-31 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-alloc-extra/.cvsignore: add missing .cvsignore to + test-alloc-extra + +2007-05-31 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 Aaron Stone <sodabrew@users.sourceforge.net> + + * tests/Makefile.am, tests/descriptions, + tests/test-alloc-extra/Makefile.am, + tests/test-alloc-extra/scanner.l, tests/test-alloc-extra/test.input: + Adding test cases for yylex_init_extra. + +2007-05-12 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, tests/test-pthread/scanner.l: fixes to test-pthread + +2007-05-12 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: NEWS item for concatenated options + +2007-05-12 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 Will Estes <wlestes@users.sourceforge.net> + + * scanopt.c: parse multiple short concatenated options; patch + submitted by Petr Machata <pmachata@redhat.com + +2007-05-11 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: remove --force option from autogen.sh; much faster + without it + +2007-05-11 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.34 + +2007-05-08 Aaron Stone <sodabrew@users.sourceforge.net> + + * NEWS, flex.skl: Better checking after yyalloc/yyrealloc (resolves + bug #1595967) + +2007-05-01 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: change title of manual to 'Lexical Analysis with + Flex' + +2007-04-25 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: c++ memory leak plug + +2007-04-23 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 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: fix function definitions for non-ANSI environments (from + Manoj Srivastava from Debian patchset) + +2007-04-23 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: fix c++ memory leak (from Manoj Srivastava from Debian + patchset) + +2007-04-23 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: fix parameter name in comment (patch from Manoj + Srivastava from the debian patchset + +2007-04-23 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: add a size_t cast (patch from Manoj Srivastava from the + debian patchset + +2007-04-16 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-extended/Makefile.am, tests/test-quotes/Makefile.am: + cleanups to handle VPATH builds better; passifies make distcheck + +2007-04-16 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 Will Estes <wlestes@users.sourceforge.net> + + * .cvsignore: add compile and *.tar.bz2 to .cvsignore + +2007-04-14 Will Estes <wlestes@users.sourceforge.net> + + * main.c: add call to setlocale for ctype as per debian patchset + +2007-04-14 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 Will Estes <wlestes@users.sourceforge.net> + + * FlexLexer.h: annotate endifs since they're a bit far from their + opening #if statements + +2007-04-13 Will Estes <wlestes@users.sourceforge.net> + + * flexdef.h, parse.y: refactor and slightly redo alloca testing, + resolves bug #1675899 + +2007-04-13 Will Estes <wlestes@users.sourceforge.net> + + * : 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 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: fix skeleton for reentrant scanners + +2007-04-13 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: remove homegrown tags target; automake does that for + us + +2007-04-12 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: fix skeleton for reentrant scanners, resolves bug + #1694318 + +2007-04-12 Will Estes <wlestes@users.sourceforge.net> + + * FlexLexer.h: declare some const where missing in c++ header file + +2007-04-10 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: corrections to the manual as per suggestions from + flex-help@ + +2007-04-03 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: include author names in online versions of the + manual + +2007-04-03 Will Estes <wlestes@users.sourceforge.net> + + * COPYING: update copyright notice + +2007-04-03 Will Estes <wlestes@users.sourceforge.net> + + * AUTHORS: rearrange and update AUTHORS + +2007-03-29 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: note sf feature request 1658379 in NEWS + +2007-03-29 Will Estes <wlestes@users.sourceforge.net> + + * tools/cvsauthors: add sodabrew to cvsauthors file + +2007-03-29 Aaron Stone <sodabrew@users.sourceforge.net> + + * flex.skl: SourceForge feature request #1658379: Expose YY_BUF_SIZE + in the header file. + +2007-03-07 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, filter.c, flex.skl: apply patches submitted by sodabrew + +2007-03-07 Will Estes <wlestes@users.sourceforge.net> + + * README.cvs: more changes describing building flex from cvs + +2007-03-07 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, README.cvs, README.cvs-snapshot: rename + README.cvs-snapshot to README.cvs + +2007-03-07 Will Estes <wlestes@users.sourceforge.net> + + * README.cvs-snapshot: update to explain where flex cvs lives + +2007-03-07 Will Estes <wlestes@users.sourceforge.net> + + * README, doc/flex.texi: correct how to submit bugs + +2007-02-16 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: clarify NEWS item re man page and pdf manual + +2007-02-14 Will Estes <wlestes@users.sourceforge.net> + + * po/Makevars: update bug address to point to flex-devel instead of + lex-help + +2007-02-13 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 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 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, configure.in: move automake options from Makefile.am + to configure.in + +2007-02-13 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: restore --install option to autogen.sh since --force + does not imply --install + +2007-02-13 Will Estes <wlestes@users.sourceforge.net> + + * tools/cvsauthors: add john43 to cvsauthors file + +2007-02-13 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: call autoreconf with --force instead of --install + +2007-02-13 Will Estes <wlestes@users.sourceforge.net> + + * doc/.cvsignore: remove texinfo.tex from cvs tree + +2007-02-13 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: updates to NEWS file to reflect recent changes + +2007-02-13 Will Estes <wlestes@users.sourceforge.net> + + * doc/Makefile.am: add flex.pdf to EXTRA_DIST + +2007-02-13 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: remove flex.spec + +2007-02-13 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: remove maintainercleanfiles + +2007-02-01 Will Estes <wlestes@users.sourceforge.net> + + * doc/Makefile.am: more changes to build system to distribute man + page + +2007-02-01 Will Estes <wlestes@users.sourceforge.net> + + * doc/Makefile.am: add flex man page to distribution + +2007-02-01 Will Estes <wlestes@users.sourceforge.net> + + * .cvsignore, flex.spec.in: remove flex spec file + +2006-11-17 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/create-test: change create-test script to edit files in + place + +2006-11-09 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-array-nr/Makefile.am, tests/test-array-r/Makefile.am, + tests/test-basic-nr/Makefile.am, tests/test-basic-r/Makefile.am, + tests/test-bison-nr/Makefile.am, + tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylval/Makefile.am, + tests/test-c++-basic/Makefile.am, + tests/test-c++-multiple-scanners/Makefile.am, + tests/test-c++-yywrap/Makefile.am, tests/test-c-cpp-nr/Makefile.am, + tests/test-c-cpp-r/Makefile.am, tests/test-ccl/Makefile.am, + tests/test-debug-nr/Makefile.am, tests/test-debug-r/Makefile.am, + tests/test-extended/Makefile.am, tests/test-header-nr/Makefile.am, + tests/test-header-r/Makefile.am, + tests/test-include-by-buffer/Makefile.am, + tests/test-include-by-push/Makefile.am, + tests/test-include-by-reentrant/Makefile.am, + tests/test-linedir-r/Makefile.am, tests/test-lineno-nr/Makefile.am, + tests/test-lineno-r/Makefile.am, tests/test-mem-nr/Makefile.am, + tests/test-mem-r/Makefile.am, + tests/test-multiple-scanners-nr/Makefile.am, + tests/test-multiple-scanners-r/Makefile.am, + tests/test-noansi-nr/Makefile.am, tests/test-noansi-r/Makefile.am, + tests/test-posix/Makefile.am, + tests/test-posixly-correct/Makefile.am, + tests/test-prefix-nr/Makefile.am, tests/test-prefix-r/Makefile.am, + tests/test-pthread/Makefile.am, tests/test-quotes/Makefile.am, + tests/test-reject/Makefile.am, tests/test-rescan-nr/Makefile.am, + tests/test-rescan-r/Makefile.am, tests/test-string-nr/Makefile.am, + tests/test-string-r/Makefile.am, tests/test-top/Makefile.am, + tests/test-yyextra/Makefile.am: change CLEANFILES to include + instead of just the testname for the executable + +2006-11-09 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: fix typos in manual; resolves bug #1592857 + +2006-11-09 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.am: test names weren't displaying in test + success/failure messages (from #1591672 + +2006-10-30 Will Estes <wlestes@users.sourceforge.net> + + * doc/.cvsignore: add flex.html to .cvsignore in doc directory + +2006-10-22 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: update NEWS file for the work that millaway did + +2006-10-22 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, flex.skl, tests/test-c++-multiple-scanners/main.cpp, + tests/test-c-cpp-nr/scanner.l: memory leak issues in c++ scanner + +2006-10-20 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, 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: add unit test for c++ with yywrap + +2006-10-20 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 Will Estes <wlestes@users.sourceforge.net> + + * doc/flex.texi: add noyywrap option to example; use whitespace to + clarify example + +2006-08-02 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/ca.po, po/vi.po: new translations + +2006-04-11 John Millaway <john43@users.sourceforge.net> + + * tables.c: Casted away signedness to appease -Werror freaks. + +2006-03-28 John Millaway <john43@users.sourceforge.net> + + * ccl.c, doc/flex.texi, flexdef.h, parse.y, scan.l, sym.c, + 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 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi, scan.l, 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 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 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 John Millaway <john43@users.sourceforge.net> + + * dfa.c, doc/flex.texi, flexdef.h, gen.c, main.c, parse.y, scan.l, + scanflags.c, 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 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 John Millaway <john43@users.sourceforge.net> + + * configure.in, doc/flex.texi, scan.l, 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 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi, parse.y: Changed explicit 'A'-'Z' to isupper(), + where correct to do so. Documentation. + +2006-03-24 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Documentation. + +2006-03-24 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Added appendix of patterns to manual. + +2006-03-23 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: . + +2006-03-22 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Documentation. + +2006-03-22 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Documented set difference operator {-}. + +2006-03-22 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 John Millaway <john43@users.sourceforge.net> + + * configure.in, doc/flex.texi, parse.y, scan.l, 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 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-22 John Millaway <john43@users.sourceforge.net> + + * Makefile.am: Removed includedir from AM_CPPFLAGS #1439351. + +2006-03-21 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 John Millaway <john43@users.sourceforge.net> + + * flexdef.h, misc.c, scan.l: Fixed escape in actions. + +2006-03-21 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 John Millaway <john43@users.sourceforge.net> + + * tests/test-table-opts/Makefile.am, + tests/test-table-opts/scanner.l: Removed m4 from test-table-opts + +2006-03-21 John Millaway <john43@users.sourceforge.net> + + * tests/test-reject/Makefile.am, tests/test-reject/scanner.l: + Removed m4 from test-reject + +2006-03-21 John Millaway <john43@users.sourceforge.net> + + * filter.c, flexdef.h, main.c, scan.l: Moved set_input_file to + different file. + +2006-03-21 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-20 John Millaway <john43@users.sourceforge.net> + + * filter.c: Documented filter chain. Removed fdopen. Added no-op + fseek. + +2006-03-13 John Millaway <john43@users.sourceforge.net> + + * gen.c: Fixed another -Wall report. + +2006-03-10 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/vi.po: new vi translation + +2006-03-09 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/ga.po, po/nl.po: new nl, ga translations + +2006-02-21 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-21 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-21 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: remove website directory from configure.in + +2006-02-20 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.33 marks in NEWS and configure.in + +2006-02-20 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: change email address in configure.in to point to + flex-help@sourceforge.net + +2006-02-20 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Documentation. + +2006-02-20 John Millaway <john43@users.sourceforge.net> + + * BUGS: Appended to BUGS file. + +2006-02-18 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 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi, flex.skl: Fixed buffer overflow in reject state + buffer. Corrected documentation on the state buffer. + +2006-02-16 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Reverted num_read from size_t back to int. + +2006-02-15 John Millaway <john43@users.sourceforge.net> + + * Makefile.am, configure.in: Removed reference to RoadMap in + Makefile.am. Added website directory. + +2006-02-15 Will Estes <wlestes@users.sourceforge.net> + + * README, RoadMap: remove RoadMap and reference to it in README + +2006-02-15 John Millaway <john43@users.sourceforge.net> + + * BUGS, README, doc/flex.texi, doc/flex.xml: Eliminated references + to lex.sf.net. + +2006-02-15 John Millaway <john43@users.sourceforge.net> + + * BUGS, flex.skl: Transfered bugs list from lex.sf.net to BUGS file. + +2006-02-15 John Millaway <john43@users.sourceforge.net> + + * tests/test-rescan-nr/.cvsignore, + tests/test-rescan-nr/Makefile.am, tests/test-rescan-nr/scanner.l, + tests/test-rescan-nr/test.input, tests/test-rescan-r/.cvsignore, + tests/test-rescan-r/Makefile.am, tests/test-rescan-r/scanner.l, + tests/test-rescan-r/test.input: Recommit of last commit -- broken + pipe. + +2006-02-15 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 John Millaway <john43@users.sourceforge.net> + + * flex.spec.in: Patched rpm spec file. + +2006-02-14 John Millaway <john43@users.sourceforge.net> + + * configure.in, flexint.h: Added C99 macro for inttypes, just to be + conformant. + +2006-02-14 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 John Millaway <john43@users.sourceforge.net> + + * scan.l: Omitting parens for named rules in trailing context. + +2006-02-14 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 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Removed unused local vars. + +2006-02-14 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Removed certain offending #undefs. + +2006-02-14 John Millaway <john43@users.sourceforge.net> + + * flexint.h: Removed logical and from preprocessor statement. + +2006-02-14 Will Estes <wlestes@users.sourceforge.net> + + * po/nl.po, po/nl.po.1: remove eroneously named nl.po.1; update + nl.po + +2006-02-14 John Millaway <john43@users.sourceforge.net> + + * dfa.c: . + +2006-02-14 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Included <sys/types.h> for serialized tables. + +2006-02-14 John Millaway <john43@users.sourceforge.net> + + * configure.in: Minor patch to call to head in configure script. + +2006-02-14 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Documentation patch. + +2006-02-14 John Millaway <john43@users.sourceforge.net> + + * filter.c, gen.c, libyywrap.c, main.c: Patch for full file system + failure. + +2006-02-13 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Documentation. + +2006-02-13 John Millaway <john43@users.sourceforge.net> + + * main.c: Fixed double-fclose when input file is empty. + +2006-02-10 Will Estes <wlestes@users.sourceforge.net> + + * po/ca.po, po/da.po, po/de.po, po/es.po, po/fr.po, po/ga.po, + po/ko.po, po/nl.po.1, 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: newtranslations + +2005-12-22 John Millaway <john43@users.sourceforge.net> + + * buf.c, main.c: Improvement request 1069716 log vs. log10 + +2005-12-22 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Fixed bug 1257093 yy_init_globals in header file + +2005-04-14 Will Estes <wlestes@users.sourceforge.net> + + * po/nl.po: new nl translation + +2005-04-07 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/LINGUAS, po/nl.po, po/vi.po: new nl and vi translations + +2004-07-20 Will Estes <wlestes@users.sourceforge.net> + + * filter.c: correct improper stdin assignment + +2004-05-22 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/tr.po: new tr translation + +2004-05-12 Will Estes <wlestes@users.sourceforge.net> + + * .cvsignore, .indent.pro: .cvsignore and .indent.pro got missed in + the import to sourceforge; replace them + +2004-05-11 Will Estes <wlestes@users.sourceforge.net> + + * po/fr.po: new fr translation + +2004-05-03 Will Estes <wlestes@users.sourceforge.net> + + * po/LINGUAS: polish is pl, not po + +2004-03-22 Will Estes <wlestes@users.sourceforge.net> + + * po/sv.po: yet another sweedish update + +2004-03-19 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/sv.po: new sv translation + +2003-12-11 John Millaway <john43@users.sourceforge.net> + + * 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-09 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: added 3 faqs + +2003-11-24 Will Estes <wlestes@users.sourceforge.net> + + * po/ro.po: new ro translation + +2003-11-07 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/fr.po: new french translation + +2003-11-07 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/ca.po: new catalan translation from the translation + project + +2003-11-07 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/LINGUAS, po/ga.po: new Irish translation + +2003-08-25 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/LINGUAS, po/ro.po: add romanian translation + +2003-07-16 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: flex_*int* type fixes + +2003-07-16 Will Estes <wlestes@users.sourceforge.net> + + * tools/cvsauthors: change wlestes email address + +2003-07-16 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: undef yytext_ptr has some bad side effects + +2003-07-07 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi: Documented m4 incompatibility with lex. + +2003-05-21 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: upgrade to gettext 0.12 + +2003-05-20 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl, gen.c: patches from manoj via sourceforge + +2003-05-20 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 Will Estes <wlestes@users.sourceforge.net> + + * doc/.cvsignore: cvs should ignore flex.pdf and flex.ps + +2003-04-25 John Millaway <john43@users.sourceforge.net> + + * TODO: Added yylineno bugs to TODO list. + +2003-04-03 John Millaway <john43@users.sourceforge.net> + + * doc/flex.xml: Docbook. + +2003-04-03 John Millaway <john43@users.sourceforge.net> + + * doc/flex.xml: xml now validates. + +2003-04-02 John Millaway <john43@users.sourceforge.net> + + * doc/flex.xml: Began conversion to DocBook. + +2003-04-01 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.31 + +2003-04-01 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: remove --enable-maintainer-mode configure option + +2003-04-01 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: remove AM_MAINTAINER_MODE + +2003-04-01 John Millaway <john43@users.sourceforge.net> + + * flex.skl, flexdef.h, main.c, misc.c, scan.l: Renamed some internal + variables. + +2003-03-31 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: yylineno is now per-buffer in reentrant scanners + +2003-03-31 John Millaway <john43@users.sourceforge.net> + + * TODO: Added TODO item. + +2003-03-30 John Millaway <john43@users.sourceforge.net> + + * flex.skl, gen.c: yylineno is per-buffer in the reentrant scanner. + support for yycolumn exists, but is not yet developed. + +2003-03-28 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Minor documentation. + +2003-03-28 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: added %top directive + +2003-03-27 John Millaway <john43@users.sourceforge.net> + + * buf.c, configure.in, doc/flex.texi, flexdef.h, main.c, scan.l, + 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-27 John Millaway <john43@users.sourceforge.net> + + * TODO, doc/flex.texi: Documented the m4 dependency. + +2003-03-26 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, flexdef.h: check for sys/wait.h since we use wait(2) + +2003-03-26 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 Will Estes <wlestes@users.sourceforge.net> + + * TODO: assign tasks due before major release can happen; remove + --enable-maintainer-mode entry + +2003-03-26 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: only rebuild the ChangeLog if we're inside a cvs + working directory + +2003-03-26 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, tools/.cvsignore, tools/Makefile.am: add tools/ + subdirectory to distribution + +2003-03-26 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 Will Estes <wlestes@users.sourceforge.net> + + * doc/Makefile.am: clean up flex.texi processing leftovers with + cleanfiles + +2003-03-26 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-linedir-r/Makefile.am: an awk script wasn't included in + the distribution + +2003-03-26 John Millaway <john43@users.sourceforge.net> + + * 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-26 John Millaway <john43@users.sourceforge.net> + + * TODO: Removed items from TODO list. + +2003-03-26 John Millaway <john43@users.sourceforge.net> + + * 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-26 John Millaway <john43@users.sourceforge.net> + + * 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 Will Estes <wlestes@users.sourceforge.net> + + * TODO, doc/Makefile.am: remove maintainer-mode conditional around + rebuilding of manpage + +2003-03-25 Will Estes <wlestes@users.sourceforge.net> + + * README: mention doc/ for user documentation + +2003-03-25 Will Estes <wlestes@users.sourceforge.net> + + * TODO: rework distribution items + +2003-03-25 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: mention m4 processing + +2003-03-25 Will Estes <wlestes@users.sourceforge.net> + + * tests/README: update instructions for running test suite + +2003-03-25 Will Estes <wlestes@users.sourceforge.net> + + * FlexLexer.h, Makefile.am, TODO, buf.c, configure.in, + doc/flex.texi, filter.c, flex.skl, flexdef.h, gen.c, main.c, + misc.c, options.c, options.h, regex.c, scan.l, sym.c, + 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-24 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi, flex.skl, flexdef.h, gen.c, main.c, options.c, + options.h, scan.l: Option ansi-definitions. Option ansi-prototypes. + Cleaned up some of header. Documented bison-locations. + +2003-03-24 John Millaway <john43@users.sourceforge.net> + + * scan.l: Escaped m4 macros in scan.l which would cause + bootstrapping issues. + +2003-03-21 John Millaway <john43@users.sourceforge.net> + + * doc/flex.texi, flex.skl, main.c: Cleaning up the skel. + +2003-03-20 Will Estes <wlestes@users.sourceforge.net> + + * TODO: we want to move the contents of to.do/Wishlist to top level + TODO + +2003-03-20 John Millaway <john43@users.sourceforge.net> + + * to.do/Wish-List: Assessment of every item in Wish-List. + +2003-03-19 John Millaway <john43@users.sourceforge.net> + + * main.c: Fixed allocation of slightly more memory than needed. + +2003-03-19 John Millaway <john43@users.sourceforge.net> + + * TODO, buf.c, configure.in, flex.skl, flexdef.h, main.c, sym.c: + Start conditions now generated in a single place. + +2003-03-19 Will Estes <wlestes@users.sourceforge.net> + + * TODO: cosmetic changes to TODO list + +2003-03-19 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Cleaned up warnings so multiple headers could coincide. + +2003-03-19 John Millaway <john43@users.sourceforge.net> + + * TODO, flex.skl, main.c: Moved prefixes to m4. + +2003-03-19 John Millaway <john43@users.sourceforge.net> + + * FlexLexer.h, filter.c, flex.skl, flexdef.h, main.c, misc.c, + regex.c: Removed Paxson/Berkeley copyright restriction from filter.c + and regex.c. Inline documentation of much of the generated API. + Line directives now fixed for header and stdin/stdout. Blank lines + squeezed from generated scanner. + +2003-03-18 John Millaway <john43@users.sourceforge.net> + + * filter.c, flexdef.h, main.c, regex.c: Fixed #line directives. + +2003-03-17 John Millaway <john43@users.sourceforge.net> + + * Makefile.am, filter.c, flexdef.h, regex.c: Added regex.c for + regex-related code. Worked on fixing line directives;incomplete. + +2003-03-14 John Millaway <john43@users.sourceforge.net> + + * TODO: Added some TODOs. + +2003-03-14 John Millaway <john43@users.sourceforge.net> + + * flexdef.h, main.c, options.c, options.h, scan.l, + tests/test-bison-nr/scanner.l, tests/test-bison-yylloc/scanner.l: + Bison bridge was simplified to rely less on bison output. New + option bison-locations. + +2003-03-14 John Millaway <john43@users.sourceforge.net> + + * filter.c, flex.skl, flexdef.h, gen.c, main.c, scan.l, + tests/test-reject/scanner.l: Filters are now direct children of main + process. Header file now generated through m4. + +2003-03-14 John Millaway <john43@users.sourceforge.net> + + * buf.c, filter.c, flexdef.h, main.c, misc.c: Added internal filter + ability. Deleted various unused variables. + +2003-03-14 John Millaway <john43@users.sourceforge.net> + + * main.c, tests/test-table-opts/scanner.l: Keeping tests up to date + with m4 changes. Proper wait for all children. + +2003-03-14 John Millaway <john43@users.sourceforge.net> + + * flex.skl, tests/test-table-opts/scanner.l: Moved test-tables to + m4. + +2003-03-14 John Millaway <john43@users.sourceforge.net> + + * flex.skl, main.c, options.c: Moved bison bridge code to m4. + +2003-03-13 John Millaway <john43@users.sourceforge.net> + + * flex.skl, gen.c, main.c, scan.l: Moved YY_USE_LINENO to m4. + +2003-03-13 John Millaway <john43@users.sourceforge.net> + + * buf.c, flexdef.h, scan.l: Added function buf_m4_undefine. + +2003-03-13 John Millaway <john43@users.sourceforge.net> + + * flex.skl, main.c, scan.l: Replaced YY_ALWAYS_INTERACTIVE with m4. + Replaced YY_NEVER_INTERACTIVE with m4. + +2003-03-13 John Millaway <john43@users.sourceforge.net> + + * flex.skl, main.c: Moved YY_TEXT_IS_ARRAY to m4. + +2003-03-12 John Millaway <john43@users.sourceforge.net> + + * flex.skl, gen.c, main.c, tests/test-reject/scanner.l: Renaming + macros from YY_* to M4_YY_* where appropriate. + +2003-03-12 John Millaway <john43@users.sourceforge.net> + + * flex.skl, tests/test-reject/scanner.l, + tests/test-table-opts/scanner.l: Now using local variable "yyg" + instead of lengthly YY_G expansion. + +2003-03-12 John Millaway <john43@users.sourceforge.net> + + * buf.c, filter.c, flex.skl, flexdef.h, main.c, misc.c, options.c, + options.h, scan.l, tests/test-reject/scanner.l: More m4 macro + conversions. Added debugging option --preproc-level=NUM. + +2003-03-11 John Millaway <john43@users.sourceforge.net> + + * Makefile.am, buf.c, flex.skl, flexdef.h, gen.c, main.c, misc.c, + scan.l: Replaced many CPP macros with m4 equivalents. + +2003-03-10 John Millaway <john43@users.sourceforge.net> + + * Makefile.am, filter.c, flex.skl, flexdef.h, main.c, misc.c: Added + filter.c Added filter.c rules to Makefile.am Added filter prototypes + to flexdef.h Flex now filters output through m4. + +2003-03-05 Will Estes <wlestes@users.sourceforge.net> + + * doc/.cvsignore, texinfo.tex: move texinfo.tex to doc/ + +2003-03-05 Will Estes <wlestes@users.sourceforge.net> + + * TODO: update TODO + +2003-03-05 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.29 + +2003-03-04 John Millaway <john43@users.sourceforge.net> + + * FlexLexer.h, flex.skl: Added growable buffer stack to C++ scanner + as well. yyensure_buffer_stack is now static. + +2003-03-02 John Millaway <john43@users.sourceforge.net> + + * flex.skl, misc.c: Removed awkward %push %pop syntax from skeleton. + +2003-03-02 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Renamed YY_CURRENT_BUFFER_FAST to + YY_CURRENT_BUFFER_LVALUE to better reflect its purpose. + +2003-02-28 John Millaway <john43@users.sourceforge.net> + + * NEWS: made entry on input buffer stacks. + +2003-02-28 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 John Millaway <john43@users.sourceforge.net> + + * TODO, doc/flex.texi, flex.skl, gen.c, main.c: 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 John Millaway <john43@users.sourceforge.net> + + * main.c: Removed some symbols from the undef list. They are needed + for multiple headers to coexist. + +2003-02-27 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, NEWS, configure.in, doc/.cvsignore, doc/Makefile.am, + doc/flex.texi, flex.texi: move flex.texi and flex.1 to new doc/ + subdirectory + +2003-02-27 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: namespace cleanups + +2003-02-26 John Millaway <john43@users.sourceforge.net> + + * main.c: Added a few macros to the undef list. + +2003-02-26 John Millaway <john43@users.sourceforge.net> + + * main.c: Put the undef macros in an array. + +2003-02-12 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.28 + +2003-02-10 Will Estes <wlestes@users.sourceforge.net> + + * README, TODO, configure.in, flex.texi: update documentation to + reflect the sourceforge move + +2003-02-06 Will Estes <wlestes@users.sourceforge.net> + + * TODO: update according to current thinking + +2003-02-06 Will Estes <wlestes@users.sourceforge.net> + + * TODO: mcvs reviewed + +2003-02-06 Will Estes <wlestes@users.sourceforge.net> + + * TODO: sourceforge migration tasks + +2003-02-04 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 John Millaway <john43@users.sourceforge.net> + + * scan.l: Flex now warns if always-interactive is specified with + fast or full. + +2003-01-31 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: switch to using cvs2cl.pl to generate the ChangeLog + +2003-01-31 Will Estes <wlestes@users.sourceforge.net> + + * tools/cvs2cl.pl, tools/cvsauthors: we're going to be switching how + we handle our ChangeLog + +2003-01-29 John Millaway <john43@users.sourceforge.net> + + * gen.c, misc.c: Fixed trailing slash bug in YY_INPUT macro def. + +2003-01-29 Will Estes <wlestes@users.sourceforge.net> + + * README.cvs-snapshot: upgrade texinfo to 4.3d + +2003-01-29 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.27 + +2003-01-21 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: flex now works with recent bison versions + +2003-01-18 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Check for YYLTYPE_IS_DECLARED. This fixes bison-bridge + with latest bison. + +2003-01-15 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/pt_BR.po: new pt_br translation + +2003-01-14 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.26 + +2003-01-14 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-12 John Millaway <john43@users.sourceforge.net> + + * tables_shared.h: Fixed table deserialization bug on big-endian + archs. Patch sent from Bryce Nichols <bryce@bnichols.org>. + +2003-01-10 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: catch news up + +2003-01-09 John Millaway <john43@users.sourceforge.net> + + * tests/test-mem-nr/scanner.l, tests/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 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Changed type of yyleng from size_t to int. This fixes + bug in PostgreSQL compilation. + +2003-01-09 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: catch news up + +2003-01-09 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: more c++ fixes + +2003-01-09 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, configure.in, flex.spec.in: add a spec file + +2003-01-09 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: type cast to pacify c++ compilers; patch from Bruce + Lilly <blilly@erols.com> + +2003-01-08 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: new es translation + +2003-01-08 Will Estes <wlestes@users.sourceforge.net> + + * po/es.po: new spanish translation + +2002-12-19 John Millaway <john43@users.sourceforge.net> + + * gen.c: Fixed bug where YY_G(0) sometimes occurs (created by my + previous commit.) + +2002-12-17 John Millaway <john43@users.sourceforge.net> + + * 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: update NEWS + +2002-12-17 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Documented new behavior with character ranges. + +2002-12-16 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * ccl.c, flexdef.h: Added utility functions to deal with character + case. + +2002-12-09 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: we don't really need int64 anyway + +2002-12-09 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: apparently some lints are happier with fllthrough + without a space + +2002-12-02 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.25 + +2002-12-02 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: enclose flex.1 target in MAINTERNER_MODE + +2002-12-02 Will Estes <wlestes@users.sourceforge.net> + + * po/pt_BR.po: new pt_br translation + +2002-12-01 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Indexed some more faqs. + +2002-11-29 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Fixed bug in SECOND yyless definition where argument was + not enclosed in parentheses. + +2002-11-29 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Fixed bug in yyless definition where argument was not + enclosed in parentheses. + +2002-11-27 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: flex uses flex_int*_t types + +2002-11-27 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: integer types for non-C99 systems flexint.h + +2002-11-27 John Millaway <john43@users.sourceforge.net> + + * 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 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 Will Estes <wlestes@users.sourceforge.net> + + * config.rpath: remove config.rpath + +2002-11-27 Will Estes <wlestes@users.sourceforge.net> + + * README-alpha: just list location of betas + +2002-11-26 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: __STDC_VERSION__ needs an L suffix + +2002-11-26 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/LINGUAS, po/pt_BR.po: new pt_br translation from the + translation project + +2002-11-25 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: include inttypes.h for folks who really are C99 + +2002-11-25 Will Estes <wlestes@users.sourceforge.net> + + * TODO: fix a typo + +2002-11-25 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.24 + +2002-11-23 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: try to make sure we have GNU m4 + +2002-11-23 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-c++-multiple-scanners/Makefile.am: include + tests/test-c++-multipl-scanners/test.input + +2002-11-23 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: more portability fixes + +2002-11-23 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: update NEWS + +2002-11-22 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * flex.texi: renamed some faqs. + +2002-11-22 Will Estes <wlestes@users.sourceforge.net> + + * AUTHORS: update wording about authorship + +2002-11-17 John Millaway <john43@users.sourceforge.net> + + * parse.y: Removed space before line num in error messages to look + more like gcc's errors. + +2002-11-06 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/tr.po: new turkish translation from the translation + project + +2002-10-28 Will Estes <wlestes@users.sourceforge.net> + + * gen.c: applied c++ from lilypond folks for std:: reasons + +2002-10-25 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: proofreading + +2002-10-24 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: proofreading + +2002-10-22 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 Will Estes <wlestes@users.sourceforge.net> + + * TODO: c++ rants + +2002-10-22 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: more proofreading + +2002-10-22 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: include intent.pro; indent target is MAINTAINER_MODE + conditional + +2002-10-22 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 John Millaway <john43@users.sourceforge.net> + + * tables.c: Added a missing function prototype. + +2002-10-21 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.23 + +2002-10-21 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: update NEWS on recent changes + +2002-10-21 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: use sys/types.h and not inttypes.h + +2002-10-21 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: check for limits.h + +2002-10-21 Will Estes <wlestes@users.sourceforge.net> + + * TODO: update TODO on recent suggestions + +2002-10-21 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: titlepage and contents + +2002-10-21 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: typo + +2002-10-21 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-21 John Millaway <john43@users.sourceforge.net> + + * flex.texi: typo. + +2002-10-18 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: report the current version info that flex provides + +2002-10-18 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: FLEX_BETA defined if flex is beta + +2002-10-16 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: if we're doing c++, then we can't use long long + +2002-10-14 Will Estes <wlestes@users.sourceforge.net> + + * TODO: update TODO on several things + +2002-10-11 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: more proofreading + +2002-10-11 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am, tests/test-array-nr/Makefile.am, + tests/test-array-r/Makefile.am, tests/test-basic-nr/Makefile.am, + tests/test-basic-r/Makefile.am, tests/test-bison-nr/Makefile.am, + tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylval/Makefile.am, + tests/test-c++-basic/Makefile.am, + tests/test-c++-multiple-scanners/Makefile.am, + tests/test-c-cpp-nr/Makefile.am, tests/test-c-cpp-r/Makefile.am, + tests/test-debug-nr/Makefile.am, tests/test-debug-r/Makefile.am, + tests/test-header-nr/Makefile.am, tests/test-header-r/Makefile.am, + tests/test-include-by-buffer/Makefile.am, + tests/test-include-by-reentrant/Makefile.am, + tests/test-lineno-nr/Makefile.am, tests/test-lineno-r/Makefile.am, + tests/test-mem-nr/Makefile.am, tests/test-mem-r/Makefile.am, + tests/test-multiple-scanners-nr/Makefile.am, + tests/test-multiple-scanners-r/Makefile.am, + tests/test-posix/Makefile.am, + tests/test-posixly-correct/Makefile.am, + tests/test-prefix-nr/Makefile.am, tests/test-prefix-r/Makefile.am, + tests/test-pthread/Makefile.am, tests/test-reject/Makefile.am, + tests/test-string-nr/Makefile.am, tests/test-string-r/Makefile.am, + tests/test-table-opts/Makefile.am, tests/test-yyextra/Makefile.am: + remove BISON assignment as per suggestion from Akim Demaille + +2002-10-11 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, configure.in: remove intl from dist + +2002-10-11 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: we use maintainer mode now + +2002-10-11 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: include create-test + +2002-10-11 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.am: use dist_noinst_scripts as per email from Akim + Demaille + +2002-10-10 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Documentation. + +2002-10-10 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.22; portability fixes and attn to + the test suite + +2002-10-10 Will Estes <wlestes@users.sourceforge.net> + + * flexint.h: ok, this seems to work + +2002-10-10 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am, tests/test-bison-nr/Makefile.am, + tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylval/Makefile.am, + tests/test-header-nr/Makefile.am, tests/test-header-r/Makefile.am, + tests/test-multiple-scanners-nr/Makefile.am, + tests/test-multiple-scanners-r/Makefile.am: use builddir in tests + that need it in their include path + +2002-10-10 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am: replace the last instance + +2002-10-10 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 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 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, flex.skl, flexdef.h: current swipe at header magic; + int types be damned + +2002-10-08 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: change version constant info to reflect change to flex.skl + +2002-10-08 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: remove README-alpha option; add definitions for + FLEX_{MAJOR,MINOR,SUBMINOR}_VERSION + +2002-10-07 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 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: we check for {u,}int*_t types; maybe this will + simplify things + +2002-10-07 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: more test suite cleanups + +2002-10-07 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-c++-multiple-scanners/Makefile.am: we don't use header + files... + +2002-10-07 Will Estes <wlestes@users.sourceforge.net> + + * flexdef.h: remove include of malloc.h + +2002-10-04 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: more editing; remove examples index; merge examples + into concept index + +2002-10-04 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 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: yesterday's proofreading + +2002-10-02 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: proofread some more + +2002-10-02 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: proofread edit begins + +2002-10-01 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-array-nr/Makefile.am, tests/test-array-r/Makefile.am, + tests/test-basic-nr/Makefile.am, tests/test-basic-r/Makefile.am, + tests/test-bison-nr/Makefile.am, + tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylval/Makefile.am, + tests/test-c++-basic/Makefile.am, tests/test-c-cpp-nr/Makefile.am, + tests/test-c-cpp-r/Makefile.am, tests/test-debug-nr/Makefile.am, + tests/test-debug-r/Makefile.am, tests/test-header-nr/Makefile.am, + tests/test-header-r/Makefile.am, + tests/test-include-by-buffer/Makefile.am, + tests/test-include-by-reentrant/Makefile.am, + tests/test-lineno-nr/Makefile.am, tests/test-lineno-r/Makefile.am, + tests/test-mem-nr/Makefile.am, tests/test-mem-r/Makefile.am, + tests/test-multiple-scanners-nr/Makefile.am, + tests/test-multiple-scanners-r/Makefile.am, + tests/test-posix/Makefile.am, + tests/test-posixly-correct/Makefile.am, + tests/test-prefix-nr/Makefile.am, tests/test-prefix-r/Makefile.am, + tests/test-pthread/Makefile.am, tests/test-reject/Makefile.am, + tests/test-string-nr/Makefile.am, tests/test-string-r/Makefile.am, + tests/test-table-opts/Makefile.am, tests/test-yyextra/Makefile.am: + we used INCLUDES in another place in the Makefile.am files in the + test suite + +2002-09-27 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-array-nr/Makefile.am, tests/test-array-r/Makefile.am, + tests/test-basic-nr/Makefile.am, tests/test-basic-r/Makefile.am, + tests/test-bison-nr/Makefile.am, + tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylval/Makefile.am, + tests/test-c++-basic/Makefile.am, tests/test-c-cpp-nr/Makefile.am, + tests/test-c-cpp-r/Makefile.am, tests/test-debug-nr/Makefile.am, + tests/test-debug-r/Makefile.am, tests/test-header-nr/Makefile.am, + tests/test-header-r/Makefile.am, + tests/test-include-by-buffer/Makefile.am, + tests/test-include-by-reentrant/Makefile.am, + tests/test-lineno-nr/Makefile.am, tests/test-lineno-r/Makefile.am, + tests/test-mem-nr/Makefile.am, tests/test-mem-r/Makefile.am, + tests/test-multiple-scanners-nr/Makefile.am, + tests/test-multiple-scanners-r/Makefile.am, + tests/test-posix/Makefile.am, + tests/test-posixly-correct/Makefile.am, + tests/test-prefix-nr/Makefile.am, tests/test-prefix-r/Makefile.am, + tests/test-pthread/Makefile.am, tests/test-reject/Makefile.am, + tests/test-string-nr/Makefile.am, tests/test-string-r/Makefile.am, + tests/test-table-opts/Makefile.am, tests/test-yyextra/Makefile.am: + oops, I typed that last s/// command to perl way wrong + +2002-09-27 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am, tests/test-array-nr/Makefile.am, + tests/test-array-r/Makefile.am, tests/test-basic-nr/Makefile.am, + tests/test-basic-r/Makefile.am, tests/test-bison-nr/Makefile.am, + tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylval/Makefile.am, + tests/test-c++-basic/Makefile.am, tests/test-c-cpp-nr/Makefile.am, + tests/test-c-cpp-r/Makefile.am, tests/test-debug-nr/Makefile.am, + tests/test-debug-r/Makefile.am, tests/test-header-nr/Makefile.am, + tests/test-header-r/Makefile.am, + tests/test-include-by-buffer/Makefile.am, + tests/test-include-by-reentrant/Makefile.am, + tests/test-lineno-nr/Makefile.am, tests/test-lineno-r/Makefile.am, + tests/test-mem-nr/Makefile.am, tests/test-mem-r/Makefile.am, + tests/test-multiple-scanners-nr/Makefile.am, + tests/test-multiple-scanners-r/Makefile.am, + tests/test-posix/Makefile.am, + tests/test-posixly-correct/Makefile.am, + tests/test-prefix-nr/Makefile.am, tests/test-prefix-r/Makefile.am, + tests/test-pthread/Makefile.am, tests/test-reject/Makefile.am, + tests/test-string-nr/Makefile.am, tests/test-string-r/Makefile.am, + tests/test-table-opts/Makefile.am, tests/test-yyextra/Makefile.am: + use AM_CPPFLAGS instead of INCLUDES; write -I with no space after it + for broken compilers + +2002-09-27 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: INCLUDES is obsolete; use AM_CPPFLAGS instead + +2002-09-27 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: apparently, AM_CONFIG_HEADER is obsolete + +2002-09-27 Will Estes <wlestes@users.sourceforge.net> + + * TODO: integrate test suite into automake + +2002-09-27 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 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: use autoreconf instead of calling individual utilities + separately + +2002-09-27 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: check for c++ compiler + +2002-09-27 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: re-organize according to suggested layout in + autoconf manual + +2002-09-26 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, NEWS, configure.in: update automake to 1.7 and + autoconf to 2.54 + +2002-09-26 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: use AM_YFLAGS since YFLAGS is a user variable + +2002-09-25 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 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 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.am, tests/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 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am: not all compilers support '-I dir' so + we write '-Idir' instead + +2002-09-23 Will Estes <wlestes@users.sourceforge.net> + + * TODO: reorganize faq entries; proofread the manual + +2002-09-23 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: move c++ experimental warning to top of cxx node + +2002-09-20 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: new smarter skeleton/scanner generation + +2002-09-20 John Millaway <john43@users.sourceforge.net> + + * flex.skl, misc.c: bison-bridge skel handled via %if/%endif pairs. + +2002-09-19 John Millaway <john43@users.sourceforge.net> + + * flex.skl, misc.c: reentrant skel handled via %if/%endif pairs. + +2002-09-19 John Millaway <john43@users.sourceforge.net> + + * flex.skl, misc.c: skeleton uses %push/%pop to keep skelout() scope + sane. skel commands are omitted unless --debug enabled. + +2002-09-19 John Millaway <john43@users.sourceforge.net> + + * flex.skl, main.c, misc.c, tables.h: Added %push and %pop + operations to skel processing. + +2002-09-17 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: flex 2.5.21 + +2002-09-17 John Millaway <john43@users.sourceforge.net> + + * tests/test-reject/Makefile.am: minor fixup for dist. + +2002-09-16 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.20 + +2002-09-16 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: correct typo + +2002-09-16 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: note the new tables functionality + +2002-09-16 John Millaway <john43@users.sourceforge.net> + + * tests/test-multiple-scanners-r/.cvsignore, + tests/test-multiple-scanners-r/Makefile.am: Fixed `clean' target and + .cvsignore. + +2002-09-16 John Millaway <john43@users.sourceforge.net> + + * 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 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 John Millaway <john43@users.sourceforge.net> + + * TODO, flex.texi: Created user API for tables deserialization. + Documented API and --tables-* options in manual. + +2002-09-15 John Millaway <john43@users.sourceforge.net> + + * flex.skl, tests/test-table-opts/scanner.l: Tables deserialization + uses yyalloc/yyfree. Changed yytables_load to yytables_fload. + +2002-09-15 John Millaway <john43@users.sourceforge.net> + + * tests/test-bison-nr/.cvsignore: minor upkeep. + +2002-09-15 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Categorized and indexed scanner options in manual. + +2002-09-15 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Initialization of reject vars and %array vars in + reentrant scanner. + +2002-09-13 John Millaway <john43@users.sourceforge.net> + + * TODO, configure.in, devel/tables.pl, dfa.c, flex.skl, flex.texi, + gen.c, tables.c, tables_shared.c, tables_shared.h, + 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: millaway has been very busy + +2002-09-13 John Millaway <john43@users.sourceforge.net> + + * flex.skl, tests/test-table-opts/Makefile.am, + tests/test-table-opts/scanner.l: Added test for multiple tables in + one file. + +2002-09-13 John Millaway <john43@users.sourceforge.net> + + * tests/test-bison-nr/.cvsignore: forgot to add .cvsignore on last + commit. + +2002-09-13 John Millaway <john43@users.sourceforge.net> + + * tests/test-bison-nr/Makefile.am, tests/test-bison-nr/main.c, + tests/test-bison-nr/parser.y, tests/test-bison-nr/scanner.l, + tests/test-bison-nr/test.input: Added test-bison-bridge. + +2002-09-13 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * flex.texi: documentation of tabels api in manual + +2002-09-12 John Millaway <john43@users.sourceforge.net> + + * TODO, tables.c: Renamed *_fwrite to *_write to reflect writer + abstraction. + +2002-09-11 John Millaway <john43@users.sourceforge.net> + + * devel/tables.pl: Added perl script to read/dump serialized tables + in devel/ + +2002-09-11 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/de.po: new de translation from the translation project + +2002-09-11 John Millaway <john43@users.sourceforge.net> + + * flex.skl: yytbl_load now checks tables set by name. Localized var + scaope in yytbl_load. + +2002-09-10 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.am: make clean before make test + +2002-09-09 John Millaway <john43@users.sourceforge.net> + + * TODO, flex.skl: Fixed deserialization of --fast tables. + +2002-09-09 Will Estes <wlestes@users.sourceforge.net> + + * TODO: fix typo; remove the yylineo entry + +2002-09-09 John Millaway <john43@users.sourceforge.net> + + * TODO, buf.c, devel/dump-tables.pl, 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, 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: flex has better internal diagnostics + +2002-09-09 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, flexdef.h: test for presence of __func__ and + compensate if absent + +2002-09-09 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: include the intl/ subdirectory when searching for + include files + +2002-09-09 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/ru.po, po/sv.po: new sv, ru translations from the + translation project + +2002-09-07 John Millaway <john43@users.sourceforge.net> + + * flex.skl, misc.c: Changed cryptic skeleton markers to readable + form. + +2002-09-07 John Millaway <john43@users.sourceforge.net> + + * 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, po/ca.po: new ca translation + +2002-09-06 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: new fr translation + +2002-09-06 Will Estes <wlestes@users.sourceforge.net> + + * po/fr.po: new french translation from the translation project + +2002-09-05 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: c99 function defs by default + +2002-09-05 John Millaway <john43@users.sourceforge.net> + + * flexdef.h, tables.c: Added flex_die macro. May need some autoconf + massaging. Added thorough error checking in tables code. + +2002-09-05 John Millaway <john43@users.sourceforge.net> + + * flex.skl, flex.texi: Flex generates C99 defs now. Documented the + above change in manual. + +2002-09-05 John Millaway <john43@users.sourceforge.net> + + * tests/test-table-opts/.cvsignore, + tests/test-table-opts/Makefile.am: Added serialization test to + table-opts test. + +2002-09-05 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: oops, i made a typo + +2002-09-05 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.19 + +2002-09-05 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: use FLEX_EXIT(), not exit() + +2002-09-05 John Millaway <john43@users.sourceforge.net> + + * devel/00EXTRACT-ALL-SYMS.sh, devel/README, devel/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 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: s/exit(1)/exit(EXIT_FAILURE) + +2002-09-05 John Millaway <john43@users.sourceforge.net> + + * dfa.c, gen.c: Tables are now generated with %option + tables-file=FILE. + +2002-09-05 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: catch up on a few things + +2002-09-05 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 John Millaway <john43@users.sourceforge.net> + + * flex.texi, main.c, options.c, options.h: Changed option 'header' + to 'header-file'. 'header' still works, though. + +2002-09-05 John Millaway <john43@users.sourceforge.net> + + * flex.texi, flexdef.h, gen.c, main.c, options.c, options.h, + scan.l, tables.c: Tons more work on tables. + +2002-09-05 John Millaway <john43@users.sourceforge.net> + + * flexdef.h, gen.c, tables.c, tables_shared.h: Lots of work on + tables serialization code. + +2002-09-04 Will Estes <wlestes@users.sourceforge.net> + + * README.cvs-snapshot: mention GNU indent + +2002-09-04 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: remove the word after from the version line + +2002-09-03 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.18 + +2002-09-03 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: catch up on the NEWS + +2002-09-03 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 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 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: fixed bug whereby bison was reported missing even + when it was found + +2002-09-02 John Millaway <john43@users.sourceforge.net> + + * tables.c: In-code documentation. + +2002-09-02 John Millaway <john43@users.sourceforge.net> + + * flexdef.h: Forgot to indent before previous commit. + +2002-09-02 John Millaway <john43@users.sourceforge.net> + + * flexdef.h: Added known integer limits if undefined. + +2002-08-29 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: version 2.5.17 + +2002-08-29 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: more portability fixes; new version number + +2002-08-29 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 Will Estes <wlestes@users.sourceforge.net> + + * dfa.c: eat a blank line + +2002-08-29 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: new config.{sub,guess} files; mention that we use indent on + flex + +2002-08-28 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: warn if no indent found; version 2.5.16 + +2002-08-28 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: catch up on recent changes; version 2.5.16 + +2002-08-27 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 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: touch up the indent targeet; it's ready for + production use now + +2002-08-27 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: test for GNU indent; reorder the tests somewhat + +2002-08-23 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: automake is smarter about autoconf's versioning + scheme + +2002-08-23 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: catch NEWS up on what we've been doing + +2002-08-22 Will Estes <wlestes@users.sourceforge.net> + + * flexdef.h: do some more conditional including for folks without + standard systems + +2002-08-22 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-c++-basic/Makefile.am: use CXX to link the test scanner + here + +2002-08-22 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Documentation. + +2002-08-22 John Millaway <john43@users.sourceforge.net> + + * Makefile.am: Created 'indent' target and added .indent.pro. + +2002-08-22 John Millaway <john43@users.sourceforge.net> + + * tests/test-array-nr/Makefile.am, tests/test-array-r/Makefile.am, + tests/test-basic-nr/Makefile.am, tests/test-basic-r/Makefile.am, + tests/test-c-cpp-nr/Makefile.am: Fixed missing 'make clean' files. + +2002-08-22 John Millaway <john43@users.sourceforge.net> + + * tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylval/Makefile.am: fixed missing 'clean' file. + +2002-08-22 John Millaway <john43@users.sourceforge.net> + + * 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 Will Estes <wlestes@users.sourceforge.net> + + * README: official releases are being hosted by Vern + +2002-08-21 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.am, tests/test-c++-basic/.cvsignore, + tests/test-c++-basic/Makefile.am, tests/test-c++-basic/scanner.l, + tests/test-c++-basic/test.input: add test-c++-basic + +2002-08-21 John Millaway <john43@users.sourceforge.net> + + * gen.c, nfa.c: More tabels work. + +2002-08-21 John Millaway <john43@users.sourceforge.net> + + * flexdef.h, gen.c, tables.c, tables_shared.h: More work on tables. + +2002-08-20 John Millaway <john43@users.sourceforge.net> + + * dfa.c: Cleaned up macros that took no ';'. + +2002-08-20 John Millaway <john43@users.sourceforge.net> + + * scanopt.c: Fixed oddball '=-'. + +2002-08-20 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * tables.c: More work on tables code. + +2002-08-20 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, NEWS, configure.in: we're using m4 so have configure + test for it + +2002-08-20 John Millaway <john43@users.sourceforge.net> + + * Makefile.am, tables.c: Added tables.c and rebuilt dependencies. + +2002-08-20 John Millaway <john43@users.sourceforge.net> + + * TODO, flex.texi: Dicussed prototypes and header in manual. + +2002-08-19 John Millaway <john43@users.sourceforge.net> + + * Makefile.am, configure.in, flex.skl, flexdef.h, tables_shared.h: + More work on tables serialization. + +2002-08-19 John Millaway <john43@users.sourceforge.net> + + * Makefile.am, mkskel.sh: Skeleton is now passed through m4 (before + dist is built). + +2002-08-19 Will Estes <wlestes@users.sourceforge.net> + + * po/LINGUAS, po/zh_CN.po: add zh_cn translation from the + translation project + +2002-08-19 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: millaway's done a lot of things which need to be mentioned + in NEWS + +2002-08-18 John Millaway <john43@users.sourceforge.net> + + * main.c: Removed #undef of start conditions. + +2002-08-17 John Millaway <john43@users.sourceforge.net> + + * TODO: todo list + +2002-08-17 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * flex.skl, flex.texi: Working on tables API. + +2002-08-16 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * flex.skl, flex.texi, misc.c: Prelimary work on tables API. + +2002-08-16 John Millaway <john43@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am, tests/test-array-nr/Makefile.am, + tests/test-array-r/Makefile.am, tests/test-basic-nr/Makefile.am, + tests/test-basic-r/Makefile.am, + tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylval/Makefile.am, + tests/test-c-cpp-nr/Makefile.am, tests/test-c-cpp-r/Makefile.am, + tests/test-debug-nr/Makefile.am, tests/test-debug-r/Makefile.am, + tests/test-header-nr/Makefile.am, tests/test-header-r/Makefile.am, + tests/test-include-by-buffer/Makefile.am, + tests/test-include-by-reentrant/Makefile.am, + tests/test-lineno-nr/Makefile.am, tests/test-lineno-r/Makefile.am, + tests/test-mem-nr/Makefile.am, tests/test-mem-r/Makefile.am, + tests/test-multiple-scanners-nr/Makefile.am, + tests/test-multiple-scanners-r/Makefile.am, + tests/test-posix/Makefile.am, + tests/test-posixly-correct/Makefile.am, + tests/test-prefix-nr/Makefile.am, tests/test-prefix-r/Makefile.am, + tests/test-pthread/Makefile.am, tests/test-string-nr/Makefile.am, + tests/test-string-r/Makefile.am, tests/test-table-opts/Makefile.am, + tests/test-yyextra/Makefile.am: Tests now respect CFLAGS, CPPFLAGS, + etc.. + +2002-08-16 John Millaway <john43@users.sourceforge.net> + + * tests/test-basic-nr/scanner.l, tests/test-basic-r/scanner.l, + tests/test-lineno-nr/scanner.l, tests/test-lineno-r/scanner.l: Got + rid of flex -s warnings in tests. + +2002-08-16 John Millaway <john43@users.sourceforge.net> + + * Makefile.am: Updated dependencies list. + +2002-08-15 John Millaway <john43@users.sourceforge.net> + + * main.c: Fixed seg fault bug in ecs. + +2002-08-15 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-c-cpp-nr/.cvsignore, tests/test-c-cpp-r/.cvsignore: + ignore .cpp files since we generate them instead of .c + +2002-08-15 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: version 2.5.14 + +2002-08-15 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: c-as-c++ tests reworked + +2002-08-15 John Millaway <john43@users.sourceforge.net> + + * tests/test-c-cpp-nr/Makefile.am, tests/test-c-cpp-nr/scanner.l, + tests/test-c-cpp-r/Makefile.am, tests/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 Will Estes <wlestes@users.sourceforge.net> + + * main.c: conditionally include <locale.h>; include config.h as well + +2002-08-15 Will Estes <wlestes@users.sourceforge.net> + + * configure.in, flex.skl: only include <cunistd> if we have it + +2002-08-15 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: portability fixes; added missing punctuation; de translation + now included + +2002-08-15 Will Estes <wlestes@users.sourceforge.net> + + * po/LINGUAS: we also translate to german + +2002-08-15 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: require automake at least 1.6 + +2002-08-15 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.13 + +2002-08-14 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: reverted away from the @copying as it breaks the info + reader + +2002-08-14 John Millaway <john43@users.sourceforge.net> + + * flex.texi, flexdef.h, main.c, misc.c: Start condition prefixes + attempts to adjust to user preferences. + +2002-08-13 John Millaway <john43@users.sourceforge.net> + + * main.c: Include start condition symbols in header. + +2002-08-13 John Millaway <john43@users.sourceforge.net> + + * flexdef.h, main.c: Omit user code and tables from generated header + file. + +2002-08-13 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: printf fix and yylex_init reports errors + +2002-08-12 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Updated manual for %option header. + +2002-08-12 John Millaway <john43@users.sourceforge.net> + + * flex.skl, flex.texi, gen.c: Fixed type mismatch in printf. + yylex_init now reports errors. + +2002-08-10 John Millaway <john43@users.sourceforge.net> + + * dfa.c, main.c: Added alignment flag for future use. + +2002-08-10 John Millaway <john43@users.sourceforge.net> + + * tests/test-table-opts/.cvsignore, + tests/test-table-opts/Makefile.am: Added options to test-table-opts + +2002-08-10 John Millaway <john43@users.sourceforge.net> + + * 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 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: more faq editing; corrected mistyped nodenames + +2002-08-09 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: fix typo which propogates out to generated scanners + +2002-08-09 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: edited a few more faqs + +2002-08-09 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, faq.texi: remove faq.texi as it's included in + flex.texi + +2002-08-08 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: a few more faq edits; remove faq-89 + +2002-08-08 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: cite, not site + +2002-08-08 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: and get the faq included + +2002-08-08 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: fix some grammer/typography in the top node and add a + detailed menu + +2002-08-08 Will Estes <wlestes@users.sourceforge.net> + + * TODO: we've updated gettext + +2002-08-08 Will Estes <wlestes@users.sourceforge.net> + + * po/.cvsignore: we need to ignore a few more gettext files + +2002-08-08 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.12 + +2002-08-08 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: mention gettext; document the non-need for bison/flex in the + build process + +2002-08-08 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, configure.in: include intl in the distribution and in + the build process + +2002-08-08 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: builddir in help2man call needed @-signs around it + +2002-08-08 Will Estes <wlestes@users.sourceforge.net> + + * po/.cvsignore: we can ignore Makefile.in.in + +2002-08-08 Will Estes <wlestes@users.sourceforge.net> + + * m4/.cvsignore, m4/Makefile.am: oops, too hasty on deleting this + directory, sigh + +2002-08-08 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 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 Will Estes <wlestes@users.sourceforge.net> + + * TODO: we need to index the faq entries + +2002-08-07 Will Estes <wlestes@users.sourceforge.net> + + * faq.texi: proofed "Why do flex scanners call fileno if it is not + ANSI compatible?" + +2002-08-07 Will Estes <wlestes@users.sourceforge.net> + + * faq.texi: proofed "How do I expand \ escape sequences in C-style + quoted strings?" + +2002-08-07 Will Estes <wlestes@users.sourceforge.net> + + * README: changes to README to align with GNU coding standards + +2002-08-06 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: help2man should look in builddir for the flex binary + +2002-08-02 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Fixed yyunput prototype. + +2002-08-01 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: new fr translation from the translation project + +2002-08-01 Will Estes <wlestes@users.sourceforge.net> + + * po/fr.po: new fr.po translation from the translation project + +2002-08-01 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: yylineno performance hit is fixed + +2002-07-31 John Millaway <john43@users.sourceforge.net> + + * TODO, flex.texi: Updated docs on yylineno. + +2002-07-31 Will Estes <wlestes@users.sourceforge.net> + + * TODO: discuss yylineno performance + +2002-07-31 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: forgot to say what the date was that we made the release + +2002-07-31 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: version 2.5.11 + +2002-07-31 Will Estes <wlestes@users.sourceforge.net> + + * faq.texi: fixed a menu entry and related problems + +2002-07-31 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: someday, maybe we can use autopoint + +2002-07-31 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: we need to include texinfo.tex now + +2002-07-31 Will Estes <wlestes@users.sourceforge.net> + + * texinfo.tex: add texinfo.tex + +2002-07-30 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 Will Estes <wlestes@users.sourceforge.net> + + * TODO: faqs need work + +2002-07-30 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, TODO: prototypes get airtime these days + +2002-07-28 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Added some comments. + +2002-07-28 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Fixed bug where yyless did not consider yylineno. + +2002-07-28 John Millaway <john43@users.sourceforge.net> + + * scan.l: Fixed bug I created in previous commit. + +2002-07-28 John Millaway <john43@users.sourceforge.net> + + * scan.l: Don't wrap ()s around {NAMEDEFS} at the end of a rule. + +2002-07-27 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * 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-25 John Millaway <john43@users.sourceforge.net> + + * 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: dist-bzip2 and rename yy_globals and yy_globals_t + +2002-07-24 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: version 2.5.10 + +2002-07-24 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 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * Makefile.am: typo in tags target + +2002-07-22 John Millaway <john43@users.sourceforge.net> + + * Makefile.am: Removed erroneous $(srcdir) from help2man target. + +2002-07-22 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, configure.in: it's version 2.5.9 now + +2002-07-22 Will Estes <wlestes@users.sourceforge.net> + + * po/.cvsignore: updated gettext to 0.11.3 + +2002-07-22 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 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh, configure.in: rollback on configure.in and autogen.sh + because autpoint is broken + +2002-07-22 Will Estes <wlestes@users.sourceforge.net> + + * po/ru.po: new russian translation from translation project + +2002-07-19 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 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: we're preparing for autopoint + +2002-07-17 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Updated manual. + +2002-07-17 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: update the NEWS file for lots of things millaway has done + +2002-07-17 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * faq.texi, flex.texi: Worked on mem mgmt sect of manual. + +2002-07-15 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: allow blank lines and continuations in more places + +2002-07-12 Will Estes <wlestes@users.sourceforge.net> + + * TODO: millaway finished the faqs directory + +2002-07-12 Will Estes <wlestes@users.sourceforge.net> + + * TODO: removed items as per email from millaway + +2002-07-12 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * main.c, scan.l: Fixed POSIXLY_CORRECT detection in scanner. + +2002-07-11 John Millaway <john43@users.sourceforge.net> + + * faq.texi: More work on faq. + +2002-07-11 John Millaway <john43@users.sourceforge.net> + + * faq.texi: Moved all faqs into manual -- but did not evaluate them + yet. Removed the old faq files. + +2002-07-10 John Millaway <john43@users.sourceforge.net> + + * main.c: Removed duplicate definition of FLEX_DEBUG. gcc doesn't + care, but other compilers might. + +2002-07-10 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Wrote some more about memory mgmt in the manual. + +2002-07-10 John Millaway <john43@users.sourceforge.net> + + * flex.texi: flex.texi now works with install-info. + +2002-07-10 Will Estes <wlestes@users.sourceforge.net> + + * TODO: added items as per email from millaway + +2002-07-10 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: after we release a version, we have to keep the version + number in NEWS current + +2002-07-10 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Memory functions are no longer static. + +2002-07-09 John Millaway <john43@users.sourceforge.net> + + * tests/test-mem-nr/test.input: Added a missing input file for + test-mem-nr/ + +2002-07-09 John Millaway <john43@users.sourceforge.net> + + * tests/test-mem-nr/.cvsignore, tests/test-mem-nr/Makefile.am, + tests/test-mem-nr/scanner.l, tests/test-mem-r/.cvsignore, + tests/test-mem-r/Makefile.am, tests/test-mem-r/scanner.l, + tests/test-mem-r/test.input: Added tests for overriding memory. + +2002-07-09 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Added sections in manual for memory management. + +2002-07-09 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: noted more user visible changes + +2002-07-09 John Millaway <john43@users.sourceforge.net> + + * 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: new POSIXLY_CORRECT and new ru translation + +2002-07-09 Will Estes <wlestes@users.sourceforge.net> + + * po/ru.po: new ru translation from the translation project + +2002-07-09 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Made note of set/get debug in docs. + +2002-07-09 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * main.c: Check POSIXLY_CORRECT env variable. + +2002-07-09 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Added prototypes for the get/set debug functions. + +2002-07-09 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * tests/create-test: create-test script now modifies .cvsignore + +2002-07-09 John Millaway <john43@users.sourceforge.net> + + * tests/create-test: Improved the error checking. + +2002-07-03 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 Will Estes <wlestes@users.sourceforge.net> + + * faq.texi: ~ is an active character, so we'll just use the word + 'about' + +2002-07-02 John Millaway <john43@users.sourceforge.net> + + * Makefile.am: Fixed typo. + +2002-07-02 John Millaway <john43@users.sourceforge.net> + + * faq.texi: Added a faq. + +2002-06-28 John Millaway <john43@users.sourceforge.net> + + * Makefile.am: Added 'tags' target -- something I should have done + long ago. + +2002-06-28 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: note the copyright messages in tests/ + +2002-06-25 John Millaway <john43@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am, tests/TEMPLATE/parser.y, + tests/TEMPLATE/scanner.l, tests/test-array-nr/Makefile.am, + tests/test-array-nr/scanner.l, tests/test-array-r/Makefile.am, + tests/test-array-r/scanner.l, tests/test-basic-nr/Makefile.am, + tests/test-basic-nr/scanner.l, tests/test-basic-r/Makefile.am, + tests/test-basic-r/scanner.l, tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylloc/main.c, tests/test-bison-yylloc/parser.y, + tests/test-bison-yylloc/scanner.l, + tests/test-bison-yylval/Makefile.am, + tests/test-bison-yylval/main.c, tests/test-bison-yylval/parser.y, + tests/test-bison-yylval/scanner.l, tests/test-c-cpp-nr/Makefile.am, + tests/test-c-cpp-nr/scanner.l, tests/test-c-cpp-r/Makefile.am, + tests/test-c-cpp-r/scanner.l, tests/test-header-nr/Makefile.am, + tests/test-header-nr/main.c, tests/test-header-nr/scanner.l, + tests/test-header-r/Makefile.am, tests/test-header-r/main.c, + tests/test-header-r/scanner.l, + tests/test-include-by-buffer/Makefile.am, + tests/test-include-by-buffer/scanner.l, + tests/test-include-by-reentrant/Makefile.am, + tests/test-include-by-reentrant/scanner.l, + tests/test-lineno-nr/Makefile.am, tests/test-lineno-nr/scanner.l, + tests/test-lineno-r/Makefile.am, tests/test-lineno-r/scanner.l, + tests/test-multiple-scanners-nr/Makefile.am, + tests/test-multiple-scanners-nr/main.c, + tests/test-multiple-scanners-nr/scanner-1.l, + tests/test-multiple-scanners-nr/scanner-2.l, + tests/test-multiple-scanners-r/Makefile.am, + tests/test-multiple-scanners-r/main.c, + tests/test-multiple-scanners-r/scanner-1.l, + tests/test-multiple-scanners-r/scanner-2.l, + tests/test-prefix-nr/Makefile.am, tests/test-prefix-nr/scanner.l, + tests/test-prefix-r/Makefile.am, tests/test-prefix-r/scanner.l, + tests/test-pthread/Makefile.am, tests/test-pthread/scanner.l, + tests/test-string-nr/Makefile.am, tests/test-string-nr/scanner.l, + tests/test-string-r/Makefile.am, tests/test-string-r/scanner.l, + tests/test-yyextra/Makefile.am, tests/test-yyextra/scanner.l: + Prepended explicit license to all test-*/ sources. + +2002-06-25 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 Will Estes <wlestes@users.sourceforge.net> + + * TODO: add bootstrapper to the todo list + +2002-06-19 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: new version number + +2002-06-19 Will Estes <wlestes@users.sourceforge.net> + + * TODO: update TODO list + +2002-06-19 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 Will Estes <wlestes@users.sourceforge.net> + + * README-alpha: made code quality warning more explicit; gave url + for cvs and beta flex + +2002-05-23 John Millaway <john43@users.sourceforge.net> + + * gen.c: Fixed bug where omission of user section 3 caused unmatched + #ifdef's in generated code. + +2002-05-20 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: configure.in requires at least autoconf 2.50 + +2002-05-13 John Millaway <john43@users.sourceforge.net> + + * Makefile.am: Updated my email address. + +2002-05-10 John Millaway <john43@users.sourceforge.net> + + * flexdef.h, misc.c: chomp'd lines when reading external skel file. + +2002-05-07 Will Estes <wlestes@users.sourceforge.net> + + * po/sv.po: new sweedish translation from the translation project + +2002-04-29 Will Estes <wlestes@users.sourceforge.net> + + * po/ca.po: new catalan translation from the translation project + +2002-04-29 Will Estes <wlestes@users.sourceforge.net> + + * po/es.po: new spanish translation from the translation project + +2002-04-25 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 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: note that the lex matching of abc{1,3} is the posix + behavior + +2002-04-23 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: new version 2.5.7; use autoconf versioning info + +2002-04-23 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: note changes in 2.5.7 + +2002-04-23 Will Estes <wlestes@users.sourceforge.net> + + * main.c: conditional compile gettext initialization + +2002-04-22 Will Estes <wlestes@users.sourceforge.net> + + * po/de.po: new german translation from the translation project + +2002-04-19 John Millaway <john43@users.sourceforge.net> + + * tests/test-include-by-reentrant/Makefile.am: Fixed command line + for test-include-by-reentrant/Makefile.am + +2002-04-19 John Millaway <john43@users.sourceforge.net> + + * tests/Makefile.am, tests/TEMPLATE/Makefile.am, + tests/test-array-nr/Makefile.am, tests/test-array-r/Makefile.am, + tests/test-basic-nr/Makefile.am, tests/test-basic-r/Makefile.am, + tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylval/Makefile.am, + tests/test-c-cpp-nr/Makefile.am, tests/test-c-cpp-r/Makefile.am, + tests/test-header-nr/Makefile.am, tests/test-header-r/Makefile.am, + tests/test-include-by-buffer/Makefile.am, + tests/test-include-by-reentrant/Makefile.am, + tests/test-lineno-nr/Makefile.am, tests/test-lineno-r/Makefile.am, + tests/test-multiple-scanners-nr/Makefile.am, + tests/test-multiple-scanners-r/Makefile.am, + tests/test-prefix-nr/Makefile.am, tests/test-prefix-r/Makefile.am, + tests/test-pthread/Makefile.am, tests/test-string-nr/Makefile.am, + tests/test-string-r/Makefile.am, tests/test-yyextra/Makefile.am: + Added -I . to compiler search path in tests (so it finds the + generated parser.h). + +2002-04-19 John Millaway <john43@users.sourceforge.net> + + * flexdef.h, misc.c, parse.y, sym.c: Applied 'const' to a few more + char*, where appropriate. + +2002-04-19 John Millaway <john43@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am, tests/test-array-nr/Makefile.am, + tests/test-array-r/Makefile.am, tests/test-basic-nr/Makefile.am, + tests/test-basic-r/Makefile.am, + tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylval/Makefile.am, + tests/test-c-cpp-nr/Makefile.am, tests/test-c-cpp-r/Makefile.am, + tests/test-header-nr/Makefile.am, tests/test-header-r/Makefile.am, + tests/test-include-by-buffer/Makefile.am, + tests/test-include-by-reentrant/Makefile.am, + tests/test-lineno-nr/Makefile.am, tests/test-lineno-r/Makefile.am, + tests/test-multiple-scanners-nr/Makefile.am, + tests/test-multiple-scanners-r/Makefile.am, + tests/test-prefix-nr/Makefile.am, tests/test-prefix-r/Makefile.am, + tests/test-pthread/Makefile.am, tests/test-string-nr/Makefile.am, + tests/test-string-r/Makefile.am, tests/test-yyextra/Makefile.am: + Added top_builddir to -I path. Changed $(srcdir)/$(testname) to + ./$(testname) in 'make test' rule. + +2002-04-19 John Millaway <john43@users.sourceforge.net> + + * flexdef.h, gen.c, misc.c: Changed 'char[]' to 'const char*' + wherever in conflicted with gettext. + +2002-04-19 Will Estes <wlestes@users.sourceforge.net> + + * po/fr.po, po/sv.po: new files from translation after 2.5.6 beta + release + +2002-04-18 John Millaway <john43@users.sourceforge.net> + + * tests/test-lineno-r/Makefile.am: Fixed minor typo/cut and paste + error. + +2002-04-18 John Millaway <john43@users.sourceforge.net> + + * configure.in: Added yylineno test. + +2002-04-18 John Millaway <john43@users.sourceforge.net> + + * tests/Makefile.am: Added yylineno tests. + +2002-04-18 John Millaway <john43@users.sourceforge.net> + + * tests/test-lineno-nr/.cvsignore, + tests/test-lineno-nr/Makefile.am, tests/test-lineno-nr/scanner.l, + tests/test-lineno-nr/test.input, tests/test-lineno-r/.cvsignore, + tests/test-lineno-r/Makefile.am, tests/test-lineno-r/scanner.l, + tests/test-lineno-r/test.input: Created yylineno tests. + +2002-04-15 John Millaway <john43@users.sourceforge.net> + + * scanopt.c: Applied gettext macros to error messages from scanopt. + +2002-04-15 John Millaway <john43@users.sourceforge.net> + + * 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-bison-yylloc/Makefile.am, + tests/test-header-nr/Makefile.am, tests/test-header-r/Makefile.am: + we missed a few main.c files in the distribution + +2002-04-15 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 Will Estes <wlestes@users.sourceforge.net> + + * TODO: make sure all gettext modules use gettext translation + facilities + +2002-04-14 John Millaway <john43@users.sourceforge.net> + + * faq.texi: Converted faqs 34-41 to texinfo. + +2002-04-14 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * flexdef.h: defined FLEX_EXIT macro to call longjmp on errors. + +2002-04-13 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * scanopt.c: Fixed minor typo in error message + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-header-nr/Makefile.am, + tests/test-header-r/Makefile.am, + tests/test-multiple-scanners-nr/Makefile.am, + tests/test-multiple-scanners-r/Makefile.am, + tests/test-pthread/Makefile.am, tests/test-string-nr/Makefile.am, + tests/test-string-r/Makefile.am, tests/test-yyextra/Makefile.am: + removed eroneous files listed in EXTRA_DIST + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-yyextra/.cvsignore: ignore Makefile.in + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-string-r/.cvsignore: it's Makefile.in, not makefile.in + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-yyextra/Makefile.am, tests/test-yyextra/Makefile.in: + put test-yyextra under automake + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-string-r/Makefile.am, tests/test-string-r/Makefile.in: + put test-string-r under automake + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-string-nr/.cvsignore, tests/test-string-r/.cvsignore: + we can ignore Makefile.in + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-string-nr/Makefile.am, + tests/test-string-nr/Makefile.in: put test-string-nr under automake + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-pthread/.cvsignore: ignore Makefile.in + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-pthread/Makefile.am, tests/test-pthread/Makefile.in: + put test-pthread under automake + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-prefix-r/Makefile.am, tests/test-prefix-r/Makefile.in: + put test-prefix-r under automake + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-prefix-nr/.cvsignore, tests/test-prefix-r/.cvsignore: + we can ignore Makefile.in + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-prefix-nr/Makefile.am, + tests/test-prefix-nr/Makefile.in: put test-prefix-nr under automake + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-multiple-scanners-r/Makefile.am, + tests/test-multiple-scanners-r/Makefile.in: put + test-multiple-scanners-r under automake + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-multiple-scanners-nr/.cvsignore, + tests/test-multiple-scanners-r/.cvsignore: we can ignore Makefile.in + now + +2002-04-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-multiple-scanners-nr/Makefile.am, + tests/test-multiple-scanners-nr/Makefile.in: put + test-multiple-scanners-nr under automake + +2002-04-11 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-c-cpp-nr/Makefile.am, tests/test-c-cpp-r/Makefile.am: + we didn't need parser.y + +2002-04-11 Will Estes <wlestes@users.sourceforge.net> + + * TODO: work done on the test suite; remove relevant entries from + TODO + +2002-04-10 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-include-by-reentrant/.cvsignore, + tests/test-include-by-reentrant/Makefile.am, + tests/test-include-by-reentrant/Makefile.in: put + test-include-by-reentrant under automake + +2002-04-09 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-include-by-buffer/Makefile.am, + tests/test-include-by-buffer/Makefile.in: test-include-by-buffer now + under automake control + +2002-04-09 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-header-r/.cvsignore, tests/test-header-r/Makefile.am, + tests/test-header-r/Makefile.in: put test-header-r under automake + +2002-04-09 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-header-nr/Makefile.am: add dependencies for main.o and + scaner.h + +2002-04-09 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am: We may want to have LFLAGS readily + available + +2002-04-09 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-header-nr/Makefile.am, + tests/test-header-nr/Makefile.in: put test-header-nr under automake + +2002-04-09 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am: oops, we need to clean objects too + +2002-04-09 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/Makefile.am, tests/test-array-nr/Makefile.am, + tests/test-array-r/Makefile.am, tests/test-basic-nr/Makefile.am, + tests/test-basic-r/Makefile.am, + tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylval/Makefile.am, + tests/test-c-cpp-nr/Makefile.am, tests/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 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-array-nr/.cvsignore, tests/test-array-r/.cvsignore, + tests/test-basic-nr/.cvsignore, tests/test-basic-r/.cvsignore, + tests/test-bison-yylval/.cvsignore, tests/test-c-cpp-nr/.cvsignore, + tests/test-c-cpp-r/.cvsignore: we can ignore some Makefile.in + +2002-04-08 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-bison-yylval/Makefile.am, + tests/test-bison-yylval/Makefile.in: adding automake support + +2002-04-08 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-bison-yylloc/.cvsignore, + tests/test-bison-yylloc/Makefile.am: tuned Makefile.am to build + correctly; ignore Makefile.in now + +2002-04-08 Will Estes <wlestes@users.sourceforge.net> + + * tests/configure.in: test suite changes + +2002-04-08 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh, configure.in, tests/.cvsignore, tests/Makefile.am, + tests/Makefile.in, tests/README, tests/TEMPLATE/.cvsignore, + tests/TEMPLATE/Makefile.am, tests/TEMPLATE/Makefile.in, + tests/configure.in, tests/create-test, tests/create-test.pl, + tests/test-array-nr/Makefile.am, tests/test-array-nr/Makefile.in, + tests/test-array-r/Makefile.am, tests/test-array-r/Makefile.in, + tests/test-basic-nr/Makefile.am, tests/test-basic-nr/Makefile.in, + tests/test-basic-r/Makefile.am, tests/test-basic-r/Makefile.in, + tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylloc/Makefile.in, + tests/test-c-cpp-nr/Makefile.am, tests/test-c-cpp-nr/Makefile.in, + tests/test-c-cpp-r/Makefile.am, tests/test-c-cpp-r/Makefile.in: test + suite changes + +2002-04-05 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Corrected error in manual regarding return type for + yy_scan_{string,buffer,bytes}. + +2002-04-05 Will Estes <wlestes@users.sourceforge.net> + + * po/de.po: new german translations from the translation project + +2002-04-03 Will Estes <wlestes@users.sourceforge.net> + + * po/es.po: new spanish translations + +2002-04-01 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 Will Estes <wlestes@users.sourceforge.net> + + * main.c: fix typo in comment + +2002-03-31 John Millaway <john43@users.sourceforge.net> + + * main.c: Documented the header file kludge, (in anticipation of + buffering Section 1.) + +2002-03-31 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Created appendix "Makefiles and Flex" in the manual. + +2002-03-30 John Millaway <john43@users.sourceforge.net> + + * flex.texi: updating manual. + +2002-03-29 Will Estes <wlestes@users.sourceforge.net> + + * po/POTFILES.in: we want parse.y, not parse.c + +2002-03-29 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Indexing the manual (75% done). + +2002-03-29 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: unlisted intermediate flex/yacc-created files + +2002-03-29 Will Estes <wlestes@users.sourceforge.net> + + * TODO: millaway has done more work + +2002-03-29 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 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: fine tune flex.1 some more + +2002-03-29 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, configure.in: generalize the manpage a bit and tell + autofoo about help2man + +2002-03-29 Will Estes <wlestes@users.sourceforge.net> + + * po/da.po: new danish from translation project robot + +2002-03-28 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Indexing the manual -- it's only half done. + +2002-03-28 John Millaway <john43@users.sourceforge.net> + + * flex.texi: flex manual now uses automake's versioning info. + +2002-03-28 John Millaway <john43@users.sourceforge.net> + + * README.cvs-snapshot: Mentioned requirements for gettext and + help2man. + +2002-03-28 John Millaway <john43@users.sourceforge.net> + + * 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 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 Will Estes <wlestes@users.sourceforge.net> + + * README.cvs-snapshot: edited millaway's initial draft + +2002-03-27 John Millaway <john43@users.sourceforge.net> + + * README.cvs-snapshot: Created file. + +2002-03-27 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Fixed case of node names in flex.texi. + +2002-03-24 Will Estes <wlestes@users.sourceforge.net> + + * TODO: lex- and yacc- generated files + +2002-03-24 Will Estes <wlestes@users.sourceforge.net> + + * po/fr.po: new french + +2002-03-18 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: ending periods in news items removed; mention nounistd + options + +2002-03-18 Will Estes <wlestes@users.sourceforge.net> + + * po/sv.po: updated sweedish translations + +2002-03-18 Will Estes <wlestes@users.sourceforge.net> + + * po/de.po: german translation + +2002-03-18 John Millaway <john43@users.sourceforge.net> + + * 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 Will Estes <wlestes@users.sourceforge.net> + + * po/tr.po: new turkish translation + +2002-03-15 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: mention included translations + +2002-03-15 Will Estes <wlestes@users.sourceforge.net> + + * TODO: we've done the gettext thing, but sometime we should get + 0.11.1 + +2002-03-15 Will Estes <wlestes@users.sourceforge.net> + + * po/ca.po: new catalan translation + +2002-03-14 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Added section on format of comments. + +2002-03-14 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Split format chapter into sections. + +2002-03-14 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Removed explicit pointers in node definitions. + +2002-03-14 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: unistd.h can be problematic + +2002-03-14 Will Estes <wlestes@users.sourceforge.net> + + * tests/README: editing changes to README + +2002-03-13 Will Estes <wlestes@users.sourceforge.net> + + * po/POTFILES.in: scan.l, not scan.c because gettext gets confused + +2002-03-13 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: gettext cruft + +2002-03-13 Will Estes <wlestes@users.sourceforge.net> + + * tests/descriptions: separate out test descriptions + +2002-03-13 Will Estes <wlestes@users.sourceforge.net> + + * po/LINGUAS: french and korean dont crash now + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * po/fr.po, po/ko.po: remove duplicate messages as per advice from + Jordi Mallach <jordi@debian.org> + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * gettext.h: yes, more gettext cruft + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * ABOUT-NLS, config.rpath, 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: this + is gettext cruft + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: gettext and autofoo are now involved + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am, autogen.sh, configure.in, flexdef.h, main.c: mostly, + changes for gettext + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * po/ca.po, po/da.po, po/es.po, po/ru.po, po/sv.po, po/tr.po: these + sure change a lot + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * TODO: note about cvs documentation + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * po/LINGUAS: we now have turkish + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * po/tr.po: updated translations, i think + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * po/ca.po, po/da.po, po/es.po, po/fr.po, po/ko.po, po/ru.po, + po/sv.po, po/tr.po: ok, maybe we do keep these things? + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * README-alpha: README-alpha for those bad-hair days + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * m4/.cvsignore, m4/Makefile.am: ok,now we kinda have a m4/ subdir + for gettext + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * po/.cvsignore, po/LINGUAS, po/Makevars, po/POTFILES.in, po/da.po, + po/es.po, po/fr.po, po/ko.po, po/ru.po, po/sv.po: now, we have a po/ + subdirectory for gettext. i hope you're happy + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * po/ca.po: removing po files, maybe + +2002-03-12 Will Estes <wlestes@users.sourceforge.net> + + * tests/.cvsignore: ignore autom4te.cache + +2002-03-11 Will Estes <wlestes@users.sourceforge.net> + + * po/ca.po, po/da.po, po/es.po, po/fr.po, po/ko.po, po/ru.po, + po/sv.po: po files from debian + +2002-03-08 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 Will Estes <wlestes@users.sourceforge.net> + + * README: eliminate to.do and faqs from the README file + +2002-03-06 Will Estes <wlestes@users.sourceforge.net> + + * TODO: more notes on tests/ + +2002-03-06 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 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: we want to generate Makefiles in some more + subdirectories; automake will like this + +2002-03-06 Will Estes <wlestes@users.sourceforge.net> + + * TODO: notes on subdirectories + +2002-03-05 Will Estes <wlestes@users.sourceforge.net> + + * examples/.cvsignore, examples/Makefile.am: now examples/ fits into + automake + +2002-03-05 Will Estes <wlestes@users.sourceforge.net> + + * examples/fastwc/.cvsignore, examples/fastwc/Makefile.am: + examples/fastwc now fits into automake + +2002-03-05 Will Estes <wlestes@users.sourceforge.net> + + * examples/manual/.cvsignore, examples/manual/Makefile.am, + examples/manual/Makefile.examples, examples/manual/README: + examples/manual directory now fits into automake + +2002-03-05 Will Estes <wlestes@users.sourceforge.net> + + * examples/manual/Makefile: renamed Makefile to Makefile.examples + for automake's sake + +2002-03-04 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: add parse.c and scan.c to built_sources + +2002-02-24 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * tests/Makefile.in: Converted test script to portable /bin/sh. + +2002-02-22 John Millaway <john43@users.sourceforge.net> + + * tests/test-bison-yylloc/Makefile.in: Added some spaces in shell + scripts for portability. + +2002-02-22 John Millaway <john43@users.sourceforge.net> + + * tests/create-test.pl: Fixed #! line for portability. + +2002-02-22 John Millaway <john43@users.sourceforge.net> + + * tests/test-bison-yylloc/Makefile.in: Fixed return status code on + bison-lloc test. + +2002-02-21 John Millaway <john43@users.sourceforge.net> + + * tests/create-test.pl: Added script to auto-create tests. Probably + overkill. + +2002-02-21 John Millaway <john43@users.sourceforge.net> + + * 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 John Millaway <john43@users.sourceforge.net> + + * tests/README, tests/TEMPLATE/Makefile.in, tests/configure.in, + tests/test-c-cpp-nr/.cvsignore, tests/test-c-cpp-nr/Makefile.in, + tests/test-c-cpp-nr/scanner.l, tests/test-c-cpp-nr/test.input, + tests/test-c-cpp-r/.cvsignore, tests/test-c-cpp-r/Makefile.in, + tests/test-c-cpp-r/scanner.l, tests/test-c-cpp-r/test.input: Added + test-c-cpp-nr and test-c-cpp-r. + +2002-02-16 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Added missing #endif. + +2002-02-07 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/.cvsignore, tests/test-array-nr/.cvsignore, + tests/test-array-r/.cvsignore, tests/test-basic-nr/.cvsignore, + tests/test-basic-r/.cvsignore, tests/test-bison-yylloc/.cvsignore, + tests/test-bison-yylval/.cvsignore, + tests/test-header-nr/.cvsignore, tests/test-header-r/.cvsignore, + tests/test-include-by-buffer/.cvsignore, + tests/test-include-by-reentrant/.cvsignore, + tests/test-multiple-scanners-nr/.cvsignore, + tests/test-multiple-scanners-r/.cvsignore, + tests/test-prefix-nr/.cvsignore, tests/test-prefix-r/.cvsignore, + tests/test-pthread/.cvsignore, tests/test-string-nr/.cvsignore, + tests/test-string-r/.cvsignore, tests/test-yyextra/.cvsignore: add + OUTPUT to .cvsignore files in test directories; it's also in the + template directory + +2002-02-06 Will Estes <wlestes@users.sourceforge.net> + + * gen.c: fix interrupted reads and freads; from the debian package + maintainer + +2002-02-06 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/configure.in: add more output files to account for new tests + +2002-01-03 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-array-nr/.cvsignore, tests/test-array-nr/Makefile.in, + tests/test-array-nr/scanner.l, tests/test-array-nr/test.input: add + this test + +2002-01-03 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-array-r/.cvsignore, tests/test-array-r/Makefile.in, + tests/test-array-r/scanner.l, tests/test-array-r/test.input: add + this test suite + +2001-11-20 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl, main.c: millaway: Fixed yytext_ptr when using %array in + reentrant scanner + +2001-11-20 Will Estes <wlestes@users.sourceforge.net> + + * buf.c: oops, forgot this one line + +2001-11-14 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-header-r/.cvsignore, tests/test-header-r/Makefile.in, + tests/test-header-r/main.c, tests/test-header-r/scanner.l, + tests/test-header-r/test.input: and more fallout + +2001-11-14 Will Estes <wlestes@users.sourceforge.net> + + * TODO, flex.skl, flex.texi, flexdef.h, main.c, misc.c, + tests/README, tests/TEMPLATE/Makefile.in, tests/configure.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 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-bison-yylloc/main.c, tests/test-bison-yylval/main.c, + tests/test-header-nr/.cvsignore, tests/test-header-nr/Makefile.in, + tests/test-header-nr/main.c, tests/test-header-nr/scanner.l, + tests/test-header-nr/test.input, + tests/test-multiple-scanners-nr/.cvsignore, + tests/test-multiple-scanners-nr/Makefile.in, + tests/test-multiple-scanners-nr/main.c, + tests/test-multiple-scanners-nr/scanner-1.l, + tests/test-multiple-scanners-nr/scanner-2.l, + tests/test-multiple-scanners-r/.cvsignore, + tests/test-multiple-scanners-r/Makefile.in, + tests/test-multiple-scanners-r/main.c, + tests/test-multiple-scanners-r/scanner-1.l, + tests/test-multiple-scanners-r/scanner-2.l: a big batch from + millaway + +2001-10-26 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: now NEWS has forgotten about the _r variables + +2001-10-26 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 Will Estes <wlestes@users.sourceforge.net> + + * main.c, options.c, options.h: more from millaway + +2001-10-22 Will Estes <wlestes@users.sourceforge.net> + + * main.c, options.c, options.h: the last checkin was broken; + millaway fixed it + +2001-10-22 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl, flex.texi, 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 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: flex.skl should come up in C mode + +2001-10-21 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: apparently, isatty and c++ need help getting along (from + octave) + +2001-10-19 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: document new options and new option handling + +2001-10-19 Will Estes <wlestes@users.sourceforge.net> + + * TODO: tell emacs that TODO is a text/outline mode file + +2001-10-19 Will Estes <wlestes@users.sourceforge.net> + + * TODO: we have new long options; we need to document that + +2001-10-19 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: tell emacs that NEWS is text/outline mode + +2001-10-19 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: oops, lost a line somewhere in the merge process on + millaway's work + +2001-10-17 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-09-22 Will Estes <wlestes@users.sourceforge.net> + + * main.c: Fixed typo in options display + +2001-09-20 Will Estes <wlestes@users.sourceforge.net> + + * main.c: reentrant and non-reentrant scanners share the same yywrap + MACRO. millaway + +2001-09-20 Will Estes <wlestes@users.sourceforge.net> + + * TODO: clarify item on comments in lexical files + +2001-09-20 Will Estes <wlestes@users.sourceforge.net> + + * NEWS, scan.l: now flex recognizes \r as an eol character + +2001-09-20 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: specify cvsroot so automake distcheck works + +2001-09-19 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: tex has lost its mind; we remove parentheses to + compensate + +2001-09-19 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: now that c++ is better supported, let's mention it as a news + item + +2001-09-19 Will Estes <wlestes@users.sourceforge.net> + + * examples/fastwc/wc1.l, examples/fastwc/wc2.l, + examples/fastwc/wc3.l, examples/fastwc/wc4.l, + examples/fastwc/wc5.l, flex.skl, main.c: commit the backwash from + the branch merges + +2001-09-19 Will Estes <wlestes@users.sourceforge.net> + + * FlexLexer.h, examples/testxxLexer.l, flex.skl: made preliminary + c++ fixes; the intent is to make it work with recent c++ compilers + +2001-08-26 Will Estes <wlestes@users.sourceforge.net> + + * main.c: remove argv_fixup; fix typo in error message; changes from + millaway's branch + +2001-08-24 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: mention no more c++ comments in c scanners + +2001-08-21 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Changed // comments to /* */ comments in skeleton. + +2001-08-19 John Millaway <john43@users.sourceforge.net> + + * flex.texi: Changed @var to @code everywhere. + +2001-08-16 Will Estes <wlestes@users.sourceforge.net> + + * to.do/flex.rmail: more mail + +2001-08-16 Will Estes <wlestes@users.sourceforge.net> + + * TODO: the manual now has its own section; we're not adding + comments either + +2001-08-04 John Millaway <john43@users.sourceforge.net> + + * tests/Makefile.in, tests/README, tests/TEMPLATE/Makefile.in, + tests/test-basic-nr/Makefile.in, tests/test-basic-r/Makefile.in, + tests/test-bison-yylloc/Makefile.in, + tests/test-bison-yylval/Makefile.in, + tests/test-include-by-buffer/Makefile.in, + tests/test-include-by-reentrant/Makefile.in, + tests/test-prefix-nr/Makefile.in, tests/test-prefix-r/Makefile.in, + tests/test-pthread/Makefile.in, tests/test-string-nr/Makefile.in, + tests/test-string-r/Makefile.in, tests/test-yyextra/Makefile.in: + Cleaned up the output of the tests. + +2001-08-03 Will Estes <wlestes@users.sourceforge.net> + + * TODO: note jason's thoughts on having a manpage + +2001-08-03 Will Estes <wlestes@users.sourceforge.net> + + * TODO: note millaway's assignment and tests to be under flex + license + +2001-08-01 John Millaway <john43@users.sourceforge.net> + + * 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 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: fake automake into believing that ChangeLog already + exists + +2001-08-01 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: millaway needs to be covered in the ChangeLog + +2001-08-01 Will Estes <wlestes@users.sourceforge.net> + + * version.h: automake is supplying version info now so we just pick + it up + +2001-08-01 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: forgot braces on @copyright + +2001-08-01 John Millaway <john43@users.sourceforge.net> + + * flex.skl: Added missing argument to yy_flex_free. + +2001-08-01 Will Estes <wlestes@users.sourceforge.net> + + * AUTHORS: john millaway wrote the reentrant C support + +2001-08-01 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: add license node to the manual + +2001-08-01 Will Estes <wlestes@users.sourceforge.net> + + * TODO: c++ ideas + +2001-07-31 Will Estes <wlestes@users.sourceforge.net> + + * parse.y: error messages will now show up the way that emacs likes + them + +2001-07-31 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: oops, left in an extra backslash + +2001-07-31 Will Estes <wlestes@users.sourceforge.net> + + * TODO: flex.texi is here; clarify tests/ rewrite issue + +2001-07-31 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: hey, we have texinfo, not man + +2001-07-31 Will Estes <wlestes@users.sourceforge.net> + + * flex.1: no more manpage + +2001-07-31 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 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: the namual now compiles; hurray + +2001-07-31 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: first attempt at including the tests/ directory via + automake, dist-hook target added + +2001-07-31 Will Estes <wlestes@users.sourceforge.net> + + * tests/.cvsignore: ignore config.cache in tests/ directory + +2001-07-31 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 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: more corrections to the manual; the end is in site + +2001-07-30 Will Estes <wlestes@users.sourceforge.net> + + * TODO: auto-generated backup? + +2001-07-27 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: today's tinkering on the manual + +2001-07-27 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: if we want flex.1 we have to say so in EXTRA_DIST + +2001-07-27 Will Estes <wlestes@users.sourceforge.net> + + * TODO: note future issues with flex.texi + +2001-07-27 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: include flex.1 as it's the only working documentation + for now + +2001-07-27 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: rearrange to work with automake on building the + ChangeLog + +2001-07-27 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: automake is unhappy if we specify the outfile + +2001-07-26 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: more conversions/corrections + +2001-07-26 Will Estes <wlestes@users.sourceforge.net> + + * README: we removed misc/ so we don't mention it any more + +2001-07-25 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: begin the manual conversion to texinfo; yes, it's + broken right now + +2001-07-25 Will Estes <wlestes@users.sourceforge.net> + + * AUTHORS, THANKS: copy in manual author and thanks info + +2001-07-25 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: how to fake the ChangeLog into showing up in the + distribution + +2001-07-25 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: add YFLAGS so parse.h gets made + +2001-07-24 Will Estes <wlestes@users.sourceforge.net> + + * examples/fastwc/README, examples/fastwc/mywc.c, + examples/fastwc/wc1.l, examples/fastwc/wc2.l, + examples/fastwc/wc3.l, examples/fastwc/wc4.l, examples/fastwc/wc5.l: + re-add these files + +2001-07-24 Will Estes <wlestes@users.sourceforge.net> + + * TODO: reflect recent doings + +2001-07-24 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.in: what with automake, we don't need Makefile.in any + more + +2001-07-24 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: more rearranging for automake + +2001-07-24 Will Estes <wlestes@users.sourceforge.net> + + * to.do/flex.rmail: more mail came in + +2001-07-24 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: adjust to automake's idea of the world + +2001-07-24 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 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: rearrange for better order; add automake support as a news + item + +2001-07-24 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: copyright notice on Makefile.am; document some -D + switches (are they still usable?) + +2001-07-24 Will Estes <wlestes@users.sourceforge.net> + + * TODO: add lex-replacement issue + +2001-07-24 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: add EXTRA_DIST + +2001-07-23 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: we need to do the same thing in each directory + +2001-07-23 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: introduce automake into the macro calls + +2001-07-23 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 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.am: bin_PROGRAMS and lib_LIBRARIES + +2001-07-23 Will Estes <wlestes@users.sourceforge.net> + + * to.do/streams.mail: streams.mail has moved here + +2001-07-23 Will Estes <wlestes@users.sourceforge.net> + + * TODO: add xref for teximanual + +2001-07-19 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 Will Estes <wlestes@users.sourceforge.net> + + * TODO: we want gettext + +2001-06-24 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: include c++ STD fixes from quanstro@quanstro.net + +2001-06-24 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 Will Estes <wlestes@users.sourceforge.net> + + * TODO: remove parse.[ch] from make clean target; repackage + distribution (not rework) + +2001-06-19 Will Estes <wlestes@users.sourceforge.net> + + * TODO: add memory api and reworking of flex.skl reworking + +2001-06-18 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: remove extraneous notice from flex.skl + +2001-06-18 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: patch memory leak as per millaway + +2001-06-17 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 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/.cvsignore, tests/test-basic-nr/.cvsignore, + tests/test-basic-r/.cvsignore, tests/test-bison-yylloc/.cvsignore, + tests/test-bison-yylval/.cvsignore, + tests/test-include-by-buffer/.cvsignore, + tests/test-include-by-reentrant/.cvsignore, + tests/test-prefix-nr/.cvsignore, tests/test-prefix-r/.cvsignore, + tests/test-pthread/.cvsignore, tests/test-string-nr/.cvsignore, + tests/test-string-r/.cvsignore, tests/test-yyextra/.cvsignore: + adding .cvsignore files for existing tests/ subdirectories + +2001-06-17 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/TEMPLATE/cvsignore: create template for .cvsignore + +2001-06-17 Will Estes <wlestes@users.sourceforge.net> + + * TODO: reorganize for logical reasons; test suite now seems to run + out of the box + +2001-06-17 Will Estes <wlestes@users.sourceforge.net> + + * tests/.cvsignore: we dont want the Makefile either + +2001-06-17 Will Estes <wlestes@users.sourceforge.net> + + * tests/test-prefix-nr/test.input, tests/test-prefix-r/test.input: + test.input was supposed to be here + +2001-06-17 Will Estes <wlestes@users.sourceforge.net> + + * tests/.cvsignore: add autoconf legacy files to be ignored + +2001-06-17 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: clarify usage instructions; prepare tests/ as well + +2001-06-17 Will Estes <wlestes@users.sourceforge.net> + + * tests/.cvsignore: . cvsignore for tests/ subdirectory + +2001-06-17 Will Estes <wlestes@users.sourceforge.net> + + * FlexLexer.h: tell emacs that FlexLexer.h is c++ + +2001-06-17 Will Estes <wlestes@users.sourceforge.net> + + * scan.l: tell emacs scan.l is in C mode + +2001-06-17 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: added punctuation + +2001-06-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 Will Estes <wlestes@users.sourceforge.net> + + * to.do/flex.rmail: add bill fenlason's emails + +2001-06-15 Will Estes <wlestes@users.sourceforge.net> + + * COPYING: make changes as per Theo De Raadt; remove tabs + +2001-06-08 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl: save errno as per Theo de Raadt + +2001-06-07 Will Estes <wlestes@users.sourceforge.net> + + * flex.1: correct hyphenation as per openbsd tree + +2001-06-05 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 Will Estes <wlestes@users.sourceforge.net> + + * flex.skl, gen.c: commit john millaway's YY_G wrapper corrections + +2001-05-21 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.in: remove || exit calls + +2001-05-21 Will Estes <wlestes@users.sourceforge.net> + + * gen.c: complete john millaway's reentrant patch + +2001-05-21 Will Estes <wlestes@users.sourceforge.net> + + * to.do/flex.rmail: more flex messages in the queue + +2001-05-18 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 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.in: remove || exit from testing loop + +2001-05-18 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.in: tell make about the tests directory and its + associated targets + +2001-05-18 Will Estes <wlestes@users.sourceforge.net> + + * TODO: rethink the todo list + +2001-05-18 Will Estes <wlestes@users.sourceforge.net> + + * flex.1: describe reentrant api changes + +2001-05-18 Will Estes <wlestes@users.sourceforge.net> + + * TODO: mention work needed for tests/ + +2001-05-18 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: tell auto* about the test directory + +2001-05-18 Will Estes <wlestes@users.sourceforge.net> + + * README: make punctuation uniform, mention the new tests/ directory + +2001-05-18 Will Estes <wlestes@users.sourceforge.net> + + * NEWS: reformat items; cut out old items and move them to ONEWS + +2001-05-18 Will Estes <wlestes@users.sourceforge.net> + + * ONEWS: move old NEWS items to ONEWS + +2001-05-18 Will Estes <wlestes@users.sourceforge.net> + + * tests/Makefile.in, tests/README, tests/TEMPLATE/Makefile.in, + tests/TEMPLATE/parser.y, tests/TEMPLATE/scanner.l, + tests/TEMPLATE/test.input, tests/configure.in, + tests/test-basic-nr/Makefile.in, tests/test-basic-nr/scanner.l, + tests/test-basic-nr/test.input, tests/test-basic-r/Makefile.in, + tests/test-basic-r/scanner.l, tests/test-basic-r/test.input, + tests/test-bison-yylloc/Makefile.in, + tests/test-bison-yylloc/parser.y, + tests/test-bison-yylloc/scanner.l, + tests/test-bison-yylloc/test.input, + tests/test-bison-yylval/Makefile.in, + tests/test-bison-yylval/parser.y, + tests/test-bison-yylval/scanner.l, + tests/test-bison-yylval/test.input, + tests/test-include-by-buffer/Makefile.in, + tests/test-include-by-buffer/scanner.l, + tests/test-include-by-buffer/test-1.input, + tests/test-include-by-buffer/test-2.input, + tests/test-include-by-buffer/test-3.input, + tests/test-include-by-reentrant/Makefile.in, + tests/test-include-by-reentrant/scanner.l, + tests/test-include-by-reentrant/test-1.input, + tests/test-include-by-reentrant/test-2.input, + tests/test-include-by-reentrant/test-3.input, + tests/test-prefix-nr/Makefile.in, tests/test-prefix-nr/README, + tests/test-prefix-nr/scanner.l, tests/test-prefix-r/Makefile.in, + tests/test-prefix-r/README, tests/test-prefix-r/scanner.l, + tests/test-pthread/Makefile.in, tests/test-pthread/scanner.l, + tests/test-pthread/test-1.input, tests/test-pthread/test-2.input, + tests/test-pthread/test-3.input, tests/test-pthread/test-4.input, + tests/test-pthread/test-5.input, tests/test-string-nr/Makefile.in, + tests/test-string-nr/scanner.l, tests/test-string-r/Makefile.in, + tests/test-string-r/scanner.l, tests/test-yyextra/Makefile.in, + tests/test-yyextra/scanner.l, tests/test-yyextra/test.input: add + john millaway's test directory + +2001-05-04 Will Estes <wlestes@users.sourceforge.net> + + * to.do/flex.rmail: more mail in flex.rmail + +2001-05-03 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 Will Estes <wlestes@users.sourceforge.net> + + * README: mention RoadMap + +2001-05-01 Will Estes <wlestes@users.sourceforge.net> + + * examples/README, examples/debflex.awk, 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, + examples/testxxLexer.l, 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 Will Estes <wlestes@users.sourceforge.net> + + * README: mention misc/ directory + +2001-05-01 Will Estes <wlestes@users.sourceforge.net> + + * version.h: version is 2.5.5b + +2001-05-01 Will Estes <wlestes@users.sourceforge.net> + + * Makefile.in: remove header from top; add rule to generate + initscan.c just in case + +2001-05-01 Will Estes <wlestes@users.sourceforge.net> + + * configure.in: dont check for initscan.c; check for scan.l instead + +2001-05-01 Will Estes <wlestes@users.sourceforge.net> + + * RoadMap: list of source files + +2001-05-01 Will Estes <wlestes@users.sourceforge.net> + + * README: rewrite README to reflect changes in layout of directories + +2001-05-01 Will Estes <wlestes@users.sourceforge.net> + + * AUTHORS, THANKS, TODO: initial attempt at the files + +2001-05-01 Will Estes <wlestes@users.sourceforge.net> + + * COPYING: add 2001 copyright notice + +2001-05-01 Will Estes <wlestes@users.sourceforge.net> + + * autogen.sh: initial attempt at a bootstrap script for developers + +2001-05-01 Will Estes <wlestes@users.sourceforge.net> + + * flex.texi: texinfo manual, old contributed version + +2000-08-21 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: fixed some bugs in examples of [[:...:]] ccls + +2000-08-21 Vern Paxson <vern@ee.lbl.gov> + + * version.h: version shipped to Dick King + +2000-08-21 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: explicit include of iostream.h + +2000-08-21 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: if a newline is seen in <ACTION_STRING>, assume it + terminates the string. + +2000-08-21 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, sym.c: moved symbol table definitions from flexdef.h + into sym.c + +2000-08-21 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: fixed underallocation for accset + +1997-06-27 Vern Paxson <vern@ee.lbl.gov> + + * COPYING: revised for rms + +1997-06-23 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: fixed memory leak + +1997-06-23 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: input() doesn't destroy yytext + +1997-06-23 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: wrapped with extern "C++" + +1996-12-13 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: use delete [] for yy_state_buf + +1996-10-29 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: fixed %option noinput + +1996-10-29 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: free(char*) fix ... Sigh ... + +1996-10-11 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: bug fix for yymore()/yylineno interaction + +1996-10-11 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: fixed memory leak + +1996-09-10 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: release 2.5.4 + +1996-09-10 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: more stuff for distclean + +1996-09-10 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: "str" -> "yy_str" + +1996-09-10 Vern Paxson <vern@ee.lbl.gov> + + * version.h: 2.5.4 + +1996-07-02 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: (attempted) fix for input() crossing a file boundary + +1996-05-29 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: don't do Acorn diffs + +1996-05-29 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: some minor additions for 2.5.3 + +1996-05-29 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, version.h: 2.5.3 + +1996-05-25 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: initialize yy_more_offset etc. for yyFlexLexer class + +1996-05-25 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: niggling cosmetic tweak + +1996-05-25 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: bug fixes for yymore (especially with %array) + +1996-05-25 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: yymore + %array tweaks + +1996-05-25 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: added yy_{,prev_}more_offset + +1996-05-25 Vern Paxson <vern@ee.lbl.gov> + + * main.c: removed decl of unused library function + +1996-05-25 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: snapshot of cscope yymore fixes, prior to switching + yymore-on-%array approach + +1995-12-18 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: don't stack states on NUL-transitions that are jams + +1995-09-27 Vern Paxson <vern@ee.lbl.gov> + + * libmain.c: fixed re Esmond Pitt's ancient suggestion + +1995-04-28 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: ANSI C / Solaris tweak + +1995-04-24 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: credits + +1995-04-24 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: multiple FlexLexer.h includes + +1995-04-24 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: fix multiple inclusions + +1995-04-24 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: lint tweak + +1995-04-24 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: typo fixed + +1995-04-24 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: credits update + +1995-04-24 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: (char*) cast for realloc + +1995-04-24 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: (char*) tweak + +1995-04-21 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: VMS update for 2.5.2 + +1995-04-21 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: clarify when 8-bit scanners are created by default, + vs. 7-bit + +1995-04-21 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: reworked alloca() chud, from Francois + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, version.h: 2.5.2 + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: 2.5.2 update + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c, main.c: const -> yyconst + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: fixed some old libfl.a references + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: some (but not all) of Francois' tweaks + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: tweaks from Francois + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: yy_delete_buffer allows nil buffer pointer + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * main.c: do_stdinit now defaults to false + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: remove first default for yylex(new_in, new_out) + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: rearrange some definitions; fix YY_NO_UNPUT + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: more alloca() bullshit + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: octal escape sequence must have just digits 0-7 + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: '-' means stdin octal escape sequence must just be digits + 0-7 + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * main.c: -- terminates options + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: added dataflush() prototype + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: move dataflush, otoi prototypes into flexdef.h + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, gen.c: const -> yyconst + +1995-04-20 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: fixed bug in needing yy_cp for -Cf w/ backing up + +1995-03-28 Vern Paxson <vern@ee.lbl.gov> + + * README, flex.1: Stan Adermann credit + +1995-03-27 Vern Paxson <vern@ee.lbl.gov> + + * README: beta-tester update + +1995-03-27 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, version.h: 2.5.1 + +1995-03-27 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: update date for 2.5.1 release, some feedbacker credits + +1995-03-27 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: fixed lint problem with declaring yy_cp unnecessarily + +1995-03-27 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: {}'s around full-table initializations + +1995-03-21 Vern Paxson <vern@ee.lbl.gov> + + * README: for version 2.5 + +1995-03-21 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: added note regarding yylineno should be maintained on a + per-buffer basis + +1995-03-21 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: new C++ member functions + +1995-03-21 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, flex.1: 2.5.0.8 update + +1995-03-21 Vern Paxson <vern@ee.lbl.gov> + + * main.c: rename yylineno if -P + +1995-03-20 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: do_yylineno MARKER_DIFFERENCE depends on MAXIMUM_MNS + +1995-03-20 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: removed redundant skel.c from DISTFILES + +1995-03-20 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: debug(), setdebug(), lineno() + +1995-03-20 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: %option yylineno support + +1995-03-20 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: read up to newline for interactive reads, rather than one + char + +1995-03-20 Vern Paxson <vern@ee.lbl.gov> + + * main.c, scan.l: added %option yylineno + +1995-03-18 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: added do_yylineno + +1995-03-06 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, flex.1: 2.5.0.7 + +1995-03-05 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: realclean -> maintainer-clean + +1995-03-05 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added yy_flush_buffer + +1995-03-05 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: added yy_flush_buffer + +1995-03-05 Vern Paxson <vern@ee.lbl.gov> + + * main.c: prefix support for yy_flush_buffer + +1995-03-05 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: added %option yyclass + +1995-03-05 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, main.c, scan.l: added yyclass + +1995-03-05 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: Added switch_streams + +1995-03-05 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: added switch_streams + +1995-03-05 Vern Paxson <vern@ee.lbl.gov> + + * main.c: don't rename yy_flex_debug for C++ + +1995-03-05 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: yy_flex_debug extern only if not C++ + +1995-03-05 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: added yy_flex_debug member variable + +1995-03-05 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: yyFlexLexer initialization of yy_flex_debug + +1995-03-04 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, main.c: VMS POSIX stuff + +1995-03-04 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: moved position of yy_init = 0 + +1995-03-04 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: added YY_EXIT_FAILURE + +1995-03-04 Vern Paxson <vern@ee.lbl.gov> + + * main.c: removed VMS-specific exit + +1995-03-04 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c, flexdef.h, gen.c, main.c, misc.c, nfa.c, scan.l, sym.c, + yylex.c: internationalization aids + +1995-03-04 Vern Paxson <vern@ee.lbl.gov> + + * main.c: do yy_flex_debug prefix for both C++ and C + +1995-02-06 Vern Paxson <vern@ee.lbl.gov> + + * main.c: fixed program_name tweak again + +1995-01-11 Vern Paxson <vern@ee.lbl.gov> + + * main.c: oops, fixed program_name tweak + +1995-01-11 Vern Paxson <vern@ee.lbl.gov> + + * main.c: program_name is "flex" if argv[0] nil + +1995-01-10 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.5.0.5 + +1995-01-10 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Documented YY_NUM_RULES + +1995-01-10 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: added formatted man page to MISC + +1995-01-10 Vern Paxson <vern@ee.lbl.gov> + + * main.c: help messages to stdout + +1995-01-09 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Added YY_NUM_RULES + +1995-01-09 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: better fix for #pragma problem + +1995-01-09 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: better fix for #pragma portability problem + +1995-01-09 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: "# line" -> #line + +1995-01-09 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, flexdef.h: comment out Turbo C #pragma's + +1995-01-09 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: reset linenum on new file + +1995-01-09 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: isatty() extern + +1995-01-09 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, flex.1: 2.5.0.4 + +1995-01-09 Vern Paxson <vern@ee.lbl.gov> + + * main.c: long options, VMS tweaks + +1995-01-09 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added parse.c, parse.h for dist MISC directory + +1995-01-09 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: some "const" cleansing + +1995-01-09 Vern Paxson <vern@ee.lbl.gov> + + * mkskel.sh: skel[] is now const + +1995-01-09 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: some const cleansing + +1995-01-09 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: #line in section 1 + +1995-01-05 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: preen + +1994-12-29 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: config.h from conf.in + +1994-12-29 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: for VMS, delete -> remove + +1994-12-29 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: config.h.in -> conf.in rm config.h on distclean + +1994-12-29 Vern Paxson <vern@ee.lbl.gov> + + * main.c: stdinit tweaks + +1994-12-29 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: added nostdinit + +1994-12-28 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: added MS-DOS note for 2.5.0.2 + +1994-12-28 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: typos, tweaks + +1994-12-28 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: removed flexdoc + +1994-12-28 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: flexdoc/flex merge + +1994-12-28 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: typos + +1994-12-28 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: typo + +1994-12-28 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: 2.5 update + +1994-12-28 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.5.0.2 + +1994-12-28 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: fixed sense of %option main implying %option noyywrap + +1994-12-28 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 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: prior to 2.5 update + +1994-12-17 Vern Paxson <vern@ee.lbl.gov> + + * main.c: C++/-P fixes + +1994-12-17 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: -P fixes constructor, destructor moved to flex.skl + +1994-12-17 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: YY_SKIP_YYWRAP yyFlexLexer constructor, destructor + +1994-12-15 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: formatting + +1994-12-15 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: fixed bug in adjusting yytext before backing up + +1994-12-10 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: switched scanner itself over to [:xxx:] + +1994-12-10 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: added YY_FLEX_VERSION + +1994-12-10 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed CCL-match pattern for [:whatever:] + +1994-12-10 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: treat [:upper:] as [:lower:] if -i + +1994-12-06 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.5.0.1 + +1994-12-06 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, gen.c: input() maintains BOL + +1994-12-06 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: check size of buffer in yy_scan_buffer + +1994-12-06 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: added %option main, fixed missing %* + +1994-12-06 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: added ccl exprs + +1994-12-06 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: added ccl exprs, %option main + +1994-12-06 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: added %options, ccl exprs + +1994-12-05 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: undid previous change + +1994-12-04 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Makefile.in from srcdir + +1994-12-04 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: added skel.c to DISTFILES + +1994-12-04 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: added YYSTATE alias + +1994-12-04 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: NL is now \r?\n + +1994-12-04 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: use cerr for C++ diagnostics + +1994-12-03 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: undid YY_UNIX_NEWLINE + +1994-12-03 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: STDC_HEADERS to check for stdlib + +1994-12-03 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: AC_STDC_HEADERS -> AC_HEADER_STDC + +1994-12-03 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: \n -> '\012' + +1994-12-03 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added YY_UNIX_NEWLINE + +1994-12-03 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: BOL changes + +1994-12-03 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: fixed bug with caseins but not ecs + +1994-12-03 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: BOL changes some casts for Turbo C + +1994-12-03 Vern Paxson <vern@ee.lbl.gov> + + * main.c: messages identify filenames + +1994-12-03 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Increase slowly if realloc double overflows + +1994-12-03 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: YY_RULE_SETUP + +1994-12-03 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Added yy_XX_state %option's Added yy_set_bol + +1994-11-29 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: don't remove ~ files + +1994-11-24 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: get CFLAGS from autoconf + +1994-11-24 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 Vern Paxson <vern@ee.lbl.gov> + + * version.h: 2.5.0 + +1994-11-24 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added do_stdinit + +1994-11-24 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: Added yy_delete_buffer() in destructor + +1994-11-24 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 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Added do_stdinit, Think C hacks + +1994-11-24 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Added %options for input, always-interactive, + never-interactive, yy_scan_{buffer,bytes,string} + +1994-11-05 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: size_t #ifdef's for not compiling some statics + +1994-11-05 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: $(FLEX) config.h + +1994-11-05 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: config.h, size_t, malloc.h, sys/types.h + +1994-11-05 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: config.h, size_t + +1994-11-05 Vern Paxson <vern@ee.lbl.gov> + + * main.c: yywrap option, no stdin/out init for VMS, mundane tweaks + +1994-11-05 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: alloca, lint tweaks + +1994-11-05 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: %option yywrap size_t tweaks + +1994-11-05 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: size_t tweaks + +1994-11-05 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: size_t, STDC tweaks + +1994-11-05 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added yy_scan_{buffer,bytes,string}, plus tweaks + +1994-10-12 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: made stack code conditional on "stack" option + +1994-10-12 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: added use of "stack" %option + +1994-08-03 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Fixed fencepost in call to yy_flex_strncpy + +1994-07-25 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: yy_eof_status -> yy_buffer_status + +1994-07-25 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: yy_flex_strcpy -> yy_flex_strncpy minor prototype tweak + +1994-07-25 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 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: No YY_USER_ACTION if continued action + +1994-03-16 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added fix for 8-bit chars returned by input() + +1994-03-16 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Move definition of yy_flex_strcpy to come after #define + of yytext_ptr + +1994-01-08 Vern Paxson <vern@ee.lbl.gov> + + * mkskel.sh: flex.skel -> flex.skl + +1994-01-08 Vern Paxson <vern@ee.lbl.gov> + + * mkskel.sh: Initial revision + +1993-12-29 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Fixed scan.c target so "make" detects flex failure + +1993-12-27 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Added %option's + +1993-12-27 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Nuked FLEX_FLAGS that are now done using %option + +1993-12-27 Vern Paxson <vern@ee.lbl.gov> + + * parse.y, scan.l: %option + +1993-12-27 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Reworked for %option + +1993-12-27 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added "unspecified", globals for %option + +1993-12-27 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: start condition #define's go to action file + +1993-12-27 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added action_define() + +1993-12-27 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Minor consolidation using scon scopes etc + +1993-12-27 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Modified to use scon scopes + +1993-12-27 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: indented rules + +1993-12-26 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Added scon_stk stuff, format_warn + +1993-12-26 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added format_warn + +1993-12-26 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Working checkpoint prior to adding <scon>{ stuff + +1993-12-26 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, main.c: Added in_rule, deleted actvsc + +1993-12-26 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added doubling of '\'s in filenames + +1993-12-26 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Added in_rule, doing_rule_action + +1993-12-26 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: Removed actvsc + +1993-12-23 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: -ooutput #line directives credits + +1993-12-23 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Fixsed sense of test for %array + +1993-12-23 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.5.0 snapshot for Craig + +1993-12-23 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Added beginnings of <SCON>{ ... } + +1993-12-23 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Simplified scanning {}'s + +1993-12-20 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added <stdlib.h> + +1993-12-17 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: prototypes for alloc/string routines + +1993-12-17 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: alloc, string routines internal + +1993-12-17 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Nuked lib{string,alloc}.c, added dependency of + yylex.o on parse.h + +1993-12-17 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: Check for string.h + +1993-12-17 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Use autoconf for string/strings.h yy_flex_XXX -> + flex_XXX + +1993-12-17 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Added flex_XXX -> yy_flex_XXX wrappers + +1993-12-17 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c, misc.c, sym.c: yy_flex_XXX -> flex_XXX + +1993-12-17 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: No more WHITESPACE token + +1993-12-16 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h, flex.skl: Added yy_top_state() + +1993-12-16 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: simplified comment-scanning using push/pop states + +1993-12-16 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: removed crufty WHITESPACE token, some uses of '\n' token + +1993-12-15 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: start stack, extern "C++" moved + +1993-12-15 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: Bug fix for -CF + +1993-12-15 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, misc.c: alloc routines take unsigned + +1993-12-15 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: start-state stacks, alloc routines take unsigned + +1993-12-15 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, misc.c: bracket -CF table elements + +1993-12-13 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Do #bytes computation in {re,}allocate_array() only once + +1993-12-11 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, flexdef.h, gen.c, main.c, misc.c, scan.l, sym.c: + yy_str*() -> str*() + +1993-12-11 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 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: lint tweak + +1993-12-11 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Expanded on extern "C++" news item + +1993-12-11 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.4.5 + +1993-12-11 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added yy_fill_buffer + +1993-12-11 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: is_interactive -> yy_is_interactive + +1993-12-11 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Updated credits + +1993-12-11 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Fixed typo in "uninstall" target + +1993-12-11 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Updated comment regarding 0-based vs. 1-based arrays for + -CF. + +1993-12-11 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: Initialize dfaacc[0] for -CF representation Fixed minor + memory leak + +1993-12-11 Vern Paxson <vern@ee.lbl.gov> + + * main.c: #include "FlexLexer.h" -> <FlexLexer.h> + +1993-12-11 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: Added extern "C++" wrapper + +1993-12-09 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Detect REJECT etc. before generating YY_USES_REJECT! + +1993-12-09 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Fixed bug in interactive reads where char is unsigned + +1993-12-09 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Fixed bug in treating '$' as variable trailing context + +1993-12-09 Vern Paxson <vern@ee.lbl.gov> + + * version.h: 2.4.5 + +1993-12-07 Vern Paxson <vern@ee.lbl.gov> + + * README: pretester update + +1993-12-07 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.4.4 + +1993-12-07 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: LexError(), C++ experiment warning, credits + +1993-12-07 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed 8-bit bug + +1993-12-07 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, gen.c: Fixed nasty 8-bit bugs + +1993-12-07 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 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h, flex.skl: Support for yyFlexLexer::LexerError + +1993-12-06 Vern Paxson <vern@ee.lbl.gov> + + * version.h: 2.4.4 + +1993-12-05 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: credits update + +1993-12-05 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: very minor "install" tweaks + +1993-12-05 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, nfa.c: YY_USER_ACTION generated now for each case in + action switch + +1993-12-04 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Fixed bug in pointing yyin at a new file and resuming + scanning + +1993-12-03 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Added note regarding g++ 2.5.X + +1993-12-03 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: updated credits + +1993-12-03 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: ranlib addition for 2.4.3 + +1993-12-03 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Minor tweak to last change + +1993-12-03 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: run ranlib on libfl.a + +1993-12-03 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Hopefully last update prior to 2.4.3 + +1993-12-03 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, gen.c, misc.c, sym.c: lint tweaks + +1993-12-03 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added exec_prefix + +1993-12-03 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: credit update + +1993-12-03 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: lint tweak + +1993-12-03 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: FlexLexer.h fixed for separate inclusion + +1993-12-03 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h, flex.skl, main.c: mods so FlexLexer.h can be included + separately + +1993-12-03 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: -F incompatible with -+ + +1993-12-02 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Elaborated comments for 2.4.3 + +1993-12-02 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.4.3 + +1993-12-02 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Updated message regarding missing libfl.a routines Added + thanks to Noah Friedman + +1993-12-02 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 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, flexdef.h, gen.c, main.c, misc.c, scan.l, sym.c: Use + yy_strXXX() routines instead of <string.h> + +1993-12-01 Vern Paxson <vern@ee.lbl.gov> + + * version.h: 2.4.3 + +1993-12-01 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, misc.c: yy_flex_xmalloc() moved to misc.c + +1993-12-01 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Fixed bug in yy_fatal_error() + +1993-12-01 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: ... and remove plain tar file after compression + +1993-12-01 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.4.2 + +1993-12-01 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Produce both compress'd and gzip'd distribution tar + files + +1993-12-01 Vern Paxson <vern@ee.lbl.gov> + + * version.h: Release 2.4.2 + +1993-11-30 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: -a -> -Ca + +1993-11-30 Vern Paxson <vern@ee.lbl.gov> + + * README: described configuration files in manifest + +1993-11-30 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 Vern Paxson <vern@ee.lbl.gov> + + * README: Credit to 2.4 pre-testers. + +1993-11-30 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Fixed nasty bug in short/long decl decision + +1993-11-30 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Lowered MAX_SHORT out of increased general paranoia. + Added yy_flex_xmalloc() proto + +1993-11-30 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Fixed very minor typo in -v output + +1993-11-30 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Removed vestigal cast to (char) in isupper() call + +1993-11-30 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added casts to unsigned Char for isascii() calls + +1993-11-30 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Added #ifdef chud for alloca() + +1993-11-30 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added alloca + +1993-11-30 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: Add AC_ALLOCA if using bison + +1993-11-29 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added intermediate file going scan.l -> scan.c + +1993-11-29 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 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 Vern Paxson <vern@ee.lbl.gov> + + * gen.c, main.c: Fixed YYLMAX headaches + +1993-11-29 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Documented that buffer can't grow if REJECT used + +1993-11-29 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added parse.{c,h} to dist files + +1993-11-29 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 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: Fixed ANSI-C glitch with '%' operator + +1993-11-29 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed mis-definition of ndlookup() + +1993-11-29 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.4 -> 2.4.1 + +1993-11-29 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added install.sh, mkinstalldirs to distribution files + +1993-11-29 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Added Nathan Zelle, "promoted" Francois + +1993-11-29 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: only "realclean" removes flex dist depends on flex + +1993-11-29 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h, misc.c: myctoi takes char[] instead of Char[] + +1993-11-28 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: -a -> -Ca all_lower, all_upper -> work on char* + +1993-11-28 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added -Ca to bigcheck + +1993-11-28 Vern Paxson <vern@ee.lbl.gov> + + * main.c: -a -> -Ca; fixed help output + +1993-11-28 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c, flex.1: -a -> -Ca + +1993-11-28 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: all_lower, all_upper work on char* + +1993-11-28 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed some casts now that yytext is always char* and never + unsigned char* + +1993-11-28 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Francois' tweaks + +1993-11-28 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: AC_LN_S, AC_STDC_HEADERS (but not AC_ALLOCA) + +1993-11-27 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: fixed typo + +1993-11-27 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Don't remove dist directory + +1993-11-27 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Include liballoc.c in lint targets + +1993-11-27 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: lint tweak + +1993-11-27 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Added -l compression to bigcheck + +1993-11-27 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: permission tweaking for "dist" + +1993-11-27 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: more "dist" tweaks + +1993-11-27 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 Vern Paxson <vern@ee.lbl.gov> + + * version.h: 2.4.1 + +1993-11-27 Vern Paxson <vern@ee.lbl.gov> + + * README: Revised as per Francois Pinard + +1993-11-27 Vern Paxson <vern@ee.lbl.gov> + + * COPYING: flex.skel -> flex.skl + +1993-11-27 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Updated date of 2.4 release + +1993-11-27 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Removed manual & nroff output from distribution + +1993-11-27 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.4.1 release + +1993-11-27 Vern Paxson <vern@ee.lbl.gov> + + * configure.in: Initial revision + +1993-11-27 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Merge w/ 2.4.1 changes added "dist2" target + +1993-11-26 Vern Paxson <vern@ee.lbl.gov> + + * Makefile.in: Initial revision + +1993-11-26 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Removed #ifndef FILE protection from include of stdio + +1993-11-26 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Added Francois Pinard to distribution headache helpers + +1993-11-26 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 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Added YY_INTERACTIVE. + +1993-11-26 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Put definitions inside ()'s so we can test -l option for + "make bigcheck" + +1993-11-26 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Documented YY_INTERACTIVE. + +1993-11-26 Vern Paxson <vern@ee.lbl.gov> + + * flex.1, flex.skl, flexdef.h, gen.c, main.c, parse.y, scan.l: -l + lex compatibility flag + +1993-11-20 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Support for read()/fread() section 1 definitions precede + default macro definitions + +1993-11-20 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added use_read global + +1993-11-20 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Cleaner definition for yymore() Fixed string broken across + multiple lines + +1993-11-20 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Added -Cr + +1993-11-20 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: K&R declaration for check_char() + +1993-11-20 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Documented -Cr + +1993-11-20 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: No need to #undef before redefining prior to -Cr + documentation + +1993-11-10 Vern Paxson <vern@ee.lbl.gov> + + * README: Heavily massaged for 2.4 + +1993-11-10 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Added Landon Noll to thanks. + +1993-11-10 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.4 release + +1993-11-10 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: 2.4 documentation + +1993-11-10 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 Vern Paxson <vern@ee.lbl.gov> + + * version.h: updated date for 2.4.0 :-( + +1993-10-10 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: Whitespace tweaking + +1993-10-10 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Use DEFAULT_CSIZE only if not using equivalence classes. + +1993-10-10 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Checkpoint prior to final 2.4 update + +1993-10-04 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Raw 2.4 changes + +1993-10-04 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: osfcn.h -> unistd.h + +1993-10-04 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added "static" to definition of yy_fatal_error as well + as fwd decl. + +1993-10-04 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added yy_fatal_error function. + +1993-10-03 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, gen.c: Got rid of (char *) casts of yytext, no longer + needed. + +1993-10-03 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: YY_CHAR -> char added YYText(), YYLeng() + +1993-10-03 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, gen.c: Minimized use of YY_CHAR + +1993-10-03 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Added "flex++" feature Minimized use of YY_CHAR + +1993-10-02 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Clarified help message for -S + +1993-10-02 Vern Paxson <vern@ee.lbl.gov> + + * libyywrap.c, version.h: Initial revision + +1993-10-02 Vern Paxson <vern@ee.lbl.gov> + + * main.c: If -+ used, output to lex.yy.cc + +1993-10-02 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h, flex.skl: Switched from FILE*'s to stream's + +1993-10-02 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added expand_nxt_chk() extern. + +1993-10-02 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added dynamic buffer growing. Added yyless() for + section 3. + +1993-10-02 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c, flexdef.h, gen.c, main.c: Added -a option for long-align. + +1993-10-02 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: formfeed no longer considered whitespace + +1993-09-21 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Nuked FILENAMESIZE + +1993-09-21 Vern Paxson <vern@ee.lbl.gov> + + * main.c: yyflexlexer.h -> FlexLexer.h minor portability tweak + +1993-09-21 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Added start condition to EOF trace output + +1993-09-21 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added YY_START changed yyFlexLexer to define yylex() + +1993-09-21 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Minor portability tweaks + +1993-09-21 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: Split into two classes, one fully abstract. yylex() + no longer abstract in yyFlexLexer + +1993-09-21 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: PC lint tweak + +1993-09-21 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: YYSTYPE #define'd to int + +1993-09-21 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: minor lint tweak + +1993-09-16 Vern Paxson <vern@ee.lbl.gov> + + * FlexLexer.h: Initial revision + +1993-09-16 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Delete prototypes for Unix system calls. + +1993-09-16 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c, dfa.c, ecs.c, gen.c, main.c, misc.c, nfa.c, parse.y, + scan.l, sym.c, tblcmp.c, yylex.c: nuked static RCS string + +1993-09-16 Vern Paxson <vern@ee.lbl.gov> + + * main.c: %array not allowed with C++ scanners + +1993-09-16 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 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added C_plus_plus flag. + +1993-08-25 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: First version of C/C++ skeleton + +1993-08-25 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 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 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added %+/%-/%* to skelout() + +1993-08-25 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: EOF in section 2 prolog leads to section 0, not section 3 + +1993-08-25 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 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: yy_nxt table should be "const" + +1993-08-24 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Removed a lot of #ifdef chud "backtracking" -> "backing + up" + +1993-08-24 Vern Paxson <vern@ee.lbl.gov> + + * main.c: "backtracking" -> "backing up" got rid of time reports + +1993-08-24 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 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: isascii() moved to flexdef.h nuked flex_gettime() + +1993-08-24 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed bug with empty section 2 + +1993-08-24 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: Chucked definition of isascii() + +1993-08-24 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 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: "backtracking" -> "backing up" + +1993-07-09 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Fixed to not generate extra EOF's after reading one. + +1993-07-05 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Spit out definition of YY_CHAR early + +1993-07-05 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Some rearranging to make sure things get declared in the + right order + +1993-07-05 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: Some comment fixes as per Wilhelms + +1993-07-05 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Nuked #undef of yywrap, now that it's a function + +1993-07-05 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Fixed bug with Z-a character classes as per Wilhelms + +1993-07-05 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: added check_char call in mkstate() to prevent bad xtion + chars + +1993-07-05 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Fixed some reallocation bugs, etc. as per Wilhelms + +1993-07-05 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added check_char(), readable_form() + +1993-07-05 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 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: Wilhems bug fixes. + +1993-07-05 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c, misc.c: Added check_char() + +1993-06-12 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Changed to use yy_flex_alloc() and friends + +1993-06-12 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Added -P flag + +1993-06-12 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed bug in lex % directives + +1993-06-12 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Modified to use yy_flex_alloc() and friends + +1993-06-12 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: Modified to use yy_flex_alloc() + +1993-06-12 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 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: Got rid of code needed for %t + +1993-04-14 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 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Fixed bug in description of backtracking + +1993-04-05 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.3.8 + +1993-04-05 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, main.c: %array support + +1993-04-05 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added non-STDC clause for '\a' + +1993-04-05 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Fixed subtle problems regarding '*'s in comments + %pointer/%array match entire lines + +1993-04-05 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Added %array support + +1993-02-06 Vern Paxson <vern@ee.lbl.gov> + + * README: Finally updated email addr + +1993-02-06 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Mostly .LP -> .PP + +1993-02-06 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: [no log message] + +1993-02-06 Vern Paxson <vern@ee.lbl.gov> + + * main.c, scan.l: A lot of tweaks ... + +1993-02-06 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: reallocate_character_array -> reallocate_Character_array + +1993-02-06 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Bug/lint fixes Modified to work with "action" array instead + of temp file + +1993-02-06 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: Fixed bug in 8-bit hashing + +1993-02-06 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 Vern Paxson <vern@ee.lbl.gov> + + * ecs.c: Remove %t cruft + +1993-02-06 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Beginning of %pointer/%array support + +1993-02-06 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 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 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added internal "action" array, internal skeleton, + zero_out() in lieu of bzero + +1993-02-06 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: Fixed a bunch of fencepost errors in increasing tables. + +1993-02-06 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: -Wall fix + +1991-03-28 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Fixed out-of-bounds access bug; patch #7 for release 2.3 + +1991-03-28 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Patch #7 for 2.3 + +1990-10-23 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: fixed missing "rule_type" entry for end-of-buffer action + +1990-08-29 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Fixed yymore() but in not resetting yy_more_len + +1990-08-29 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Patch #6 for 2.3 + +1990-08-16 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Patch #5 + +1990-08-14 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: fixed comment in myesc() + +1990-08-14 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: fixed date in patch #4 + +1990-08-14 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: patch #4 + +1990-08-14 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: fixed hexadecimal escapes; added is_hex_digit() + +1990-08-03 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Patch #3 + +1990-08-03 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, flexdef.h: changed to include <stddef.h> for __GNUC__ + +1990-08-02 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.3 patch #2 + +1990-08-02 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Another try at getting the malloc() definitions correct; + this time for g++, too + +1990-08-02 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl, flexdef.h: fixed to declare malloc() and free() by hand + if __GNUC__ + +1990-07-28 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Changed to get malloc definition in identical fashion + to that used by flex.skel + +1990-06-28 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: [no log message] + +1990-06-28 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 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 Vern Paxson <vern@ee.lbl.gov> + + * README: Changed prolog to reflect 2.3 release. + +1990-05-26 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 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Added DONT_HAVE_STDLIB_H and declarations of malloc() + +1990-05-26 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.3 changes + +1990-05-26 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 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 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: Added macro definition for isascii() if not already + present + +1990-05-26 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 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 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 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c, tblcmp.c: declared void functions as such added prototypes + for forward references + +1990-05-26 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 Vern Paxson <vern@ee.lbl.gov> + + * libmain.c: Added declaration of arguments made yylex() a function + +1990-05-26 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 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 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 Vern Paxson <vern@ee.lbl.gov> + + * ecs.c: declared void functions as such declared void functions as + such + +1990-05-26 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: prototypes for forward references declared void functions + as such + +1990-05-26 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: Declared void functions as such + +1990-04-12 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: added fix for allowing yy_switch_to_buffer() in yywrap() + +1990-04-03 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: patch #3 - -I fix + +1990-03-30 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Changed generation of archaic "continue" to "goto + yy_find_action" + +1990-03-27 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Patch #2 changes + +1990-03-27 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: fixed fencepost errors with yy_buf_size and detecting + NUL's + +1990-03-26 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: [no log message] + +1990-03-26 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: g++ tweaks + +1990-03-23 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: Changes for Patch #1. + +1990-03-23 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: fix for g++ + +1990-03-23 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: minor typos and formatting changes. Removed BITNET + address. + +1990-03-23 Vern Paxson <vern@ee.lbl.gov> + + * README: nuked BITNET address. + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * README: 2.2 README + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: USG alias. + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added USG alias for SYS_V + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * : [no log message] + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Tweaks for lint and C++ + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: -ll => -lfl + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: 2.2 changes + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Changed to use YY_BUFFER_STATE everywhere. + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: [no log message] + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: "associated rules" changed to "associated rule line + numbers". + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: cast added to malloc() call to keep lint happy. + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: Fixed handling of premature EOF's. + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: Removed declaration of malloc() + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: Removed malloc() declaration. Added detection of EOF in + actions. + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Rules rewritten so '/' and '$' parsed correctly. + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: Corrected line numbers for continued actions. + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Removed declarations of malloc() and realloc(). + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * main.c: Summary of generation flags. Minor -8 tweaks. + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: full support for -d + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: defines for malloc() and realloc() conditional defines + for abs(), min(), and max() + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Many multiple-buffer additions. + +1990-03-20 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: -8 tweaks. + +1990-03-19 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Proto hacks. NUL hacks. Debugging hacks. C++ hacks. + +1990-03-16 Vern Paxson <vern@ee.lbl.gov> + + * : RCS won't let me unedit! gets "Missing access list" + +1990-03-16 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: Minor tweaks for NUL's. + +1990-03-16 Vern Paxson <vern@ee.lbl.gov> + + * : no changes -- had checked out for testing smaller read buffer + sizes + +1990-03-16 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: hack for NUL's. + +1990-03-16 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Hack to cshell for NUL's. + +1990-03-16 Vern Paxson <vern@ee.lbl.gov> + + * main.c: NUL's. -8 + +1990-03-16 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: NUL's. + +1990-03-16 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: NUL's. 8-bit chars. + +1990-03-16 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: NUL's; indenting + +1990-03-16 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: more thrashing around with NUL's + +1990-03-16 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: removed NUL hack + +1990-03-14 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: Added <<EOF>> token + +1990-03-14 Vern Paxson <vern@ee.lbl.gov> + + * ecs.c, flexdef.h: Tweaks for NUL chars. + +1990-03-14 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 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: Tweaks for handling NUL's. + +1990-02-28 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: [no log message] + +1990-02-28 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 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: [no log message] + +1990-02-28 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: [no log message] + +1990-02-26 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: [no log message] + +1990-02-25 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: [no log message] + +1990-02-25 Vern Paxson <vern@ee.lbl.gov> + + * flex.1: Initial revision + +1990-01-16 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Restored EOB accepting list for REJECT. Second try at 2.2 + Release. + +1990-01-16 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Added missing ',' in error message. 2.2 Release, second + try. + +1990-01-16 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: 8-bit char support. 2.2 Release. + +1990-01-15 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 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 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Removed unused EOB_accepting_list array. 2.2 Release. + +1990-01-15 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 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: 8-bit char support. Error-message pinpointing. 2.2 + Release. + +1990-01-15 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 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: Unsigned char support. 2.2 Release. + +1990-01-15 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: Removed redundant test. 2.2 Release. + +1990-01-15 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: Unsigned char support. \x support. 2.2 Release. + +1990-01-15 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: 8-bit char support. 2.2 Release. + +1990-01-15 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 Vern Paxson <vern@ee.lbl.gov> + + * ecs.c: %t support. 8-bit/unsigned char support. 2.2 Release. + +1990-01-15 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: %t hacks. minor cosmetics. 2.2 Relase. + +1990-01-15 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: Changes for unsigned/8-bit chars. 2.2 Release. + +1990-01-10 Vern Paxson <vern@ee.lbl.gov> + + * libmain.c: Initial revision + +1989-12-30 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: removed gratuitous trailing context code + +1989-12-30 Vern Paxson <vern@ee.lbl.gov> + + * main.c: made -c<compression flags> case-sensitive + +1989-12-30 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: unput() bug fix + +1989-12-30 Vern Paxson <vern@ee.lbl.gov> + + * README: [no log message] + +1989-06-20 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 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: made trailing context combined with '|' warning always + come out + +1989-06-20 Vern Paxson <vern@ee.lbl.gov> + + * README: [no log message] + +1989-06-20 Vern Paxson <vern@ee.lbl.gov> + + * COPYING: Initial revision + +1989-06-20 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, README, main.c: [no log message] + +1989-06-20 Vern Paxson <vern@ee.lbl.gov> + + * README: [no log message] + +1989-06-20 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, README, main.c: [no log message] + +1989-06-20 Vern Paxson <vern@ee.lbl.gov> + + * : Beta release + +1989-06-20 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, main.c: [no log message] + +1989-06-20 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 Vern Paxson <vern@ee.lbl.gov> + + * README: [no log message] + +1989-05-25 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: fixsed bug with -I and backtracking + +1989-05-25 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Cleaned up forward declarations of yyunput() and input() + +1989-05-25 Vern Paxson <vern@ee.lbl.gov> + + * parse.y: Split copyright string. + +1989-05-25 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: Split copyright string. Added check for empty machine in + dupmachine(). + +1989-05-25 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c, dfa.c, ecs.c, gen.c, main.c, misc.c, scan.l, sym.c, + tblcmp.c, yylex.c: Split copyright string into two to avoid tempting + fate with \<newline> sequences ... + +1989-05-24 Vern Paxson <vern@ee.lbl.gov> + + * README: updated for 2nd release Beta test added RCS header + +1989-05-24 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: removed static char copyright + +1989-05-24 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added BSD copyright notice. Removed + FAST_SKELETON_FILE. + +1989-05-24 Vern Paxson <vern@ee.lbl.gov> + + * main.c: added BSD copyright notice. Removed references to + FAST_SKELETON_FILE. + +1989-05-24 Vern Paxson <vern@ee.lbl.gov> + + * ecs.c, gen.c, nfa.c: Added BSD copyright notice + +1989-05-24 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c, dfa.c, misc.c, parse.y, scan.l, sym.c, tblcmp.c, yylex.c: + added BSD copyright notice + +1989-05-24 Vern Paxson <vern@ee.lbl.gov> + + * flex.skl: Initial revision + +1989-05-19 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: renamed accnum to num_rules + +1989-05-19 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: moved table generation code to gen.c moved ntod() to + dfa.c + +1989-05-19 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: the most piddling format change imaginable + +1989-05-19 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 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c, parse.y: changes for variable trailing context + +1989-05-19 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: added all_lower() and all_upper() + +1989-05-19 Vern Paxson <vern@ee.lbl.gov> + + * main.c: added checking for features being Really used + backtracking, performance reports misc. cleanup + +1989-05-19 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: major overhaul for merged skeleton + +1989-05-19 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: a zillion changes/additions/cleanups + +1989-05-19 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: added backtrack report added checking for dangerous + trailing context considerable minor cleanup + +1989-05-19 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: list_character_set() modified to take a FILE to write to + ... + +1989-05-19 Vern Paxson <vern@ee.lbl.gov> + + * README: updated for beta release + +1988-11-25 Vern Paxson <vern@ee.lbl.gov> + + * main.c: added -p flag generation of #define's for scanner + +1988-11-25 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: Added END_OF_BUFFER_ACTION and bol_needed + +1988-11-25 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: added ntod() + +1988-05-09 Vern Paxson <vern@ee.lbl.gov> + + * gen.c: Initial revision + +1988-05-08 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: RCS header changed display style of non-printings from ^x + to \0xx + +1988-05-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 Vern Paxson <vern@ee.lbl.gov> + + * sym.c: RCS header changed "entry" to "sym_entry" to avoid conflict + with old keyword + +1988-05-08 Vern Paxson <vern@ee.lbl.gov> + + * scan.l: RCS header removed \^ from ESCSEQ + +1988-05-08 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 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: RCS ident yy_cp, yy_bp support name shortenings assoc_rule + support + +1988-05-08 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 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 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 Vern Paxson <vern@ee.lbl.gov> + + * ecs.c: added RCS id added PROCFLG to avoid assumption of signed + char's + +1988-05-08 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 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: Added list_character_set() + +1988-05-07 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: added RCS id + +1988-04-10 Vern Paxson <vern@ee.lbl.gov> + + * README: minor tweaks + +1988-04-10 Vern Paxson <vern@ee.lbl.gov> + + * README: forgot sh flex.shar + +1988-04-10 Vern Paxson <vern@ee.lbl.gov> + + * README: final tweaking + +1988-04-10 Vern Paxson <vern@ee.lbl.gov> + + * tblcmp.c: removed minor lint fluff + +1988-04-10 Vern Paxson <vern@ee.lbl.gov> + + * NEWS: [no log message] + +1988-04-10 Vern Paxson <vern@ee.lbl.gov> + + * NEWS, README: Initial revision + +1988-04-10 Vern Paxson <vern@ee.lbl.gov> + + * yylex.c: added identifying comment. changed to include "parse.h" + instead of "y.tab.h" + +1988-04-10 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 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 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 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 Vern Paxson <vern@ee.lbl.gov> + + * nfa.c: changed name from flexnfa.c -> nfa.c corrected some typos. + +1988-04-10 Vern Paxson <vern@ee.lbl.gov> + + * misc.c: changed name from flexmisc.c -> misc.c + +1988-04-10 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 Vern Paxson <vern@ee.lbl.gov> + + * flexdef.h: fixed typos, enhanced symbol table definition. + +1988-04-10 Vern Paxson <vern@ee.lbl.gov> + + * ecs.c: changed name from flexecs.c to ecs.c + +1988-04-10 Vern Paxson <vern@ee.lbl.gov> + + * dfa.c: changed name from flexdfa.c to dfa.c + +1988-04-10 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c: changed name from flexccl.c -> ccl.c + +1988-02-13 Vern Paxson <vern@ee.lbl.gov> + + * ccl.c, dfa.c, ecs.c, flexdef.h, main.c, misc.c, nfa.c, parse.y, + scan.l, sym.c, tblcmp.c, yylex.c: Beta Release. + +1987-11-08 Vern Paxson <vern@ee.lbl.gov> + + * Initial revision + diff --git a/usr.bin/lex/FlexLexer.h b/usr.bin/lex/FlexLexer.h index 3fd7f63c16c..43ec39031e9 100644 --- a/usr.bin/lex/FlexLexer.h +++ b/usr.bin/lex/FlexLexer.h @@ -1,9 +1,10 @@ -/* $OpenBSD: FlexLexer.h,v 1.6 2004/02/03 21:20:17 espie Exp $ */ +/* $OpenBSD: FlexLexer.h,v 1.7 2015/11/19 19:43:40 tedu Exp $ */ -// $Header: /cvs/OpenBSD/src/usr.bin/lex/FlexLexer.h,v 1.6 2004/02/03 21:20:17 espie Exp $ +// $Header: /cvs/OpenBSD/src/usr.bin/lex/FlexLexer.h,v 1.7 2015/11/19 19:43:40 tedu 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. @@ -11,24 +12,24 @@ // This code is derived from software contributed to Berkeley by // Kent Williams and Tom Epperly. // -// 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. +// 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, @@ -51,9 +52,13 @@ // Never included before - need to define base class. #define __FLEX_LEXER_H - #include <iostream> +# ifndef FLEX_STD +# define FLEX_STD std:: +# endif + extern "C++" { + struct yy_buffer_state; typedef int yy_state_type; @@ -61,20 +66,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( std::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( std::istream* s ) = 0; + virtual void yyrestart( FLEX_STD istream* s ) = 0; virtual int yylex() = 0; // Call yylex with new input/output sources. - int yylex( std::istream* new_in, std::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(); @@ -82,8 +87,8 @@ public: // Switch to new input/output streams. A nil stream pointer // indicates "keep the current one". - virtual void switch_streams( std::istream* new_in = 0, - std::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; } @@ -98,29 +103,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( std::istream* arg_yyin = 0, std::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( std::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( std::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( std::istream* new_in, std::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 ); @@ -131,7 +142,7 @@ protected: int yyinput(); void yy_load_buffer_state(); - void yy_init_buffer( struct yy_buffer_state* b, std::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; @@ -146,10 +157,8 @@ protected: yy_state_type yy_try_NUL_trans( yy_state_type current_state ); int yy_get_next_buffer(); - std::istream* yyin; // input source for default LexerInput - std::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; @@ -167,6 +176,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()). @@ -189,4 +204,7 @@ protected: int yy_prev_more_offset; }; -#endif +} + +#endif // yyFlexLexer || ! yyFlexLexerOnce + diff --git a/usr.bin/lex/Makefile b/usr.bin/lex/Makefile index c524e7c28a1..1c2f3905878 100644 --- a/usr.bin/lex/Makefile +++ b/usr.bin/lex/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.11 2013/06/18 17:38:46 robert Exp $ +# $OpenBSD: Makefile,v 1.12 2015/11/19 19:43:40 tedu Exp $ # # 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 @@ -11,33 +11,37 @@ # # To bootstrap lex, cp initscan.c to scan.c and run make. -PROG= lex -CFLAGS+=-I. -I${.CURDIR} -SRCS= ccl.c dfa.c ecs.c gen.c main.c misc.c nfa.c parse.c sym.c tblcmp.c \ - yylex.c -OBJS+= scan.o skel.o -CLEANFILES+=parse.c parse.h scan.c skel.c y.tab.c y.tab.h -LDADD= -ll -DPADD= ${LIBL} +PROG= lex +CFLAGS+=-I. -I${.CURDIR} -DHAVE_CONFIG_H +SRCS= buf.c ccl.c dfa.c ecs.c filter.c gen.c main.c misc.c \ + nfa.c options.c parse.y regex.c scan.l scanflags.c \ + scanopt.c skel.c sym.c tables.c tables_shared.c \ + tblcmp.c yylex.c -MAN = flex.1 - -LINKS= ${BINDIR}/lex ${BINDIR}/flex \ - ${BINDIR}/lex ${BINDIR}/flex++ -MLINKS= flex.1 lex.1 flex.1 flex++.1 +CLEANFILES+=skel.c parse.h +LDADD+=-lm -parse.h parse.c: parse.y - ${YACC} -d ${.ALLSRC} - mv y.tab.c parse.c - mv y.tab.h parse.h +MAN = flex.1 -skel.c: flex.skl mkskel.sh - sh ${.CURDIR}/mkskel.sh ${.CURDIR}/flex.skl > skel.c +LINKS= ${BINDIR}/lex ${BINDIR}/flex \ + ${BINDIR}/lex ${BINDIR}/flex++ +MLINKS= flex.1 lex.1 -scan.c: scan.l - flex -t -p ${.CURDIR}/scan.l > scan.c +VERSION="2.5.39" -scan.o: parse.c +# Our yacc is too old to compile parse.y; use bootstrapped parse.c instead +parse.h parse.c: parse.y + cp ${.CURDIR}/initparse.c parse.c + cp ${.CURDIR}/initparse.h parse.h + +skel.c: flex.skl mkskel.sh flexint.h tables_shared.h + sed -e 's/m4_/m4postproc_/g' -e 's/m4preproc_/m4_/g' \ + ${.CURDIR}/flex.skl | m4 -I${.CURDIR} -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 -e 's/m4postproc_/m4_/g' | \ + sh ${.CURDIR}/mkskel.sh > ${.TARGET} includes: .if !exists(${DESTDIR}/usr/include/g++) diff --git a/usr.bin/lex/NEWS b/usr.bin/lex/NEWS new file mode 100644 index 00000000000..aa30e43ddad --- /dev/null +++ b/usr.bin/lex/NEWS @@ -0,0 +1,532 @@ +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. + +* flex version 2.5.39 + +** no user visible changes in this release + +* version 2.5.38 released 2014-02-14 + +** internationalization + +*** add sr translation from the translation project + +*** update da, es, ko, nl, pt_BR, ro, ru, sv, tr, vi, zh_CN translations from the translation project + +*** rename zh_tw to its proper zh_TW name + +* version 2.5.37 released 2012-08-03 + +** Import flex into git. See + git://flex.git.sourceforge.net/gitroot/flex/flex. + +** Fix make install target to not fail when the flex++ program is + already installed + +** New translations from the translation project: de, fi, pl, vi + +* version 2.5.36 released 2012-07-20 + +** various portability fixes that quiet compiler warnings on 64-bit + hosts + +** various manual fixes, including correcting the name of a %option and + updating some simple examples to use ANSI C syntax + +** various bug fixes that prevent certain error conditions from + persisting when they should not persist + +** improvements to the test suite so it behaves better when linking + compiled files + +** new translations from the translation project: ca, da, es, fi, fr, + ga, ko, pt_br, ro, ru, sv, tr, zh_cn + +** the flex distribution is now built with automake 1.10.1 and automake + 2.61 + +* 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/ONEWS b/usr.bin/lex/ONEWS new file mode 100644 index 00000000000..33415772185 --- /dev/null +++ b/usr.bin/lex/ONEWS @@ -0,0 +1,1233 @@ +Changes between release 2.5.4 (11Sep96) and release 2.5.3: + + - Fixed a bug introduced in 2.5.3 that blew it when a call + to input() occurred at the end of an input file. + + - Fixed scanner skeleton so the example in the man page of + scanning strings using exclusive start conditions works. + + - Minor Makefile tweaks. + + +Changes between release 2.5.3 (29May96) and release 2.5.2: + + - Some serious bugs in yymore() have been fixed. In particular, + when using AT&T-lex-compatibility or %array, you can intermix + calls to input(), unput(), and yymore(). (This still doesn't + work for %pointer, and isn't likely to in the future.) + + - A bug in handling NUL's in the input stream of scanners using + REJECT has been fixed. + + - The default main() in libfl.a now repeatedly calls yylex() until + it returns 0, rather than just calling it once. + + - Minor tweak for Windows NT Makefile, MISC/NT/Makefile. + + +Changes between release 2.5.2 (25Apr95) and release 2.5.1: + + - The --prefix configuration option now works. + + - A bug that completely broke the "-Cf" table compression + option has been fixed. + + - A major headache involving "const" declarators and Solaris + systems has been fixed. + + - An octal escape sequence in a flex regular expression must + now contain only the digits 0-7. + + - You can now use "--" on the flex command line to mark the + end of flex options. + + - You can now specify the filename '-' as a synonym for stdin. + + - By default, the scanners generated by flex no longer + statically initialize yyin and yyout to stdin and stdout. + This change is necessary because in some ANSI environments, + stdin and stdout are not compile-time constant. You can + force the initialization using "%option stdinit" in the first + section of your flex input. + + - "%option nounput" now correctly omits the unput() routine + from the output. + + - "make clean" now removes config.log, config.cache, and the + flex binary. The fact that it removes the flex binary means + you should take care if making changes to scan.l, to make + sure you don't wind up in a bootstrap problem. + + - In general, the Makefile has been reworked somewhat (thanks + to Francois Pinard) for added flexibility - more changes will + follow in subsequent releases. + + - The .texi and .info files in MISC/texinfo/ have been updated, + thanks also to Francois Pinard. + + - The FlexLexer::yylex(istream* new_in, ostream* new_out) method + now does not have a default for the first argument, to disambiguate + it from FlexLexer::yylex(). + + - A bug in destructing a FlexLexer object before doing any scanning + with it has been fixed. + + - A problem with including FlexLexer.h multiple times has been fixed. + + - The alloca() chud necessary to accommodate bison has grown + even uglier, but hopefully more correct. + + - A portability tweak has been added to accommodate compilers that + use char* generic pointers. + + - EBCDIC contact information in the file MISC/EBCDIC has been updated. + + - An OS/2 Makefile and config.h for flex 2.5 is now available in + MISC/OS2/, contributed by Kai Uwe Rommel. + + - The descrip.mms file for building flex under VMS has been updated, + thanks to Pat Rankin. + + - The notes on building flex for the Amiga have been updated for + flex 2.5, contributed by Andreas Scherer. + + +Changes between release 2.5.1 (28Mar95) and release 2.4.7: + + - A new concept of "start condition" scope has been introduced. + 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'; + + As indicated in this example, rules inside start condition scopes + (and any rule, actually, other than the first) can be indented, + to better show the extent of the scope. + + Start condition scopes may be nested. + + - The new %option directive can be used in the first section of + a flex scanner to control scanner-generation options. Most + options are given simply as names, optionally preceded by the + word "no" (with no intervening whitespace) to negate their + meaning. Some are equivalent to flex flags, so putting them + in your scanner source is equivalent to always specifying + the flag (%option's take precedence over flags): + + 7bit -7 option + 8bit -8 option + align -Ca option + backup -b option + batch -B option + c++ -+ option + caseful opposite of -i option (caseful is the default); + case-sensitive same as above + caseless -i option; + case-insensitive same as above + 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 (so use "%option nowarn" for -w) + + array equivalent to "%array" + pointer equivalent to "%pointer" (default) + + Some provide new features: + + always-interactive generate a scanner which always + considers its input "interactive" (no call to isatty() + will be made when the scanner runs) + main supply a main program for the scanner, which + simply calls yylex(). Implies %option noyywrap. + never-interactive generate a scanner which never + considers its input "interactive" (no call to isatty() + will be made when the scanner runs) + stack if set, enable start condition stacks (see below) + stdinit if unset ("%option nostdinit"), initialize yyin + and yyout statically to nil FILE* pointers, instead + of stdin and stdout + yylineno if set, keep track of the current line + number in global yylineno (this option is expensive + in terms of performance). The line number is available + to C++ scanning objects via the new member function + lineno(). + yywrap if unset ("%option noyywrap"), scanner does not + call yywrap() upon EOF but simply assumes there + are no more files to scan + + Flex scans your rule actions to determine whether you use the + REJECT or yymore features (this is not new). Two %options can be + used to override its decision, either by setting them to indicate + the feature is indeed used, or unsetting them to indicate it + actually is not used: + + reject + yymore + + Three %option's take string-delimited values, offset with '=': + + outfile="<name>" equivalent to -o<name> + prefix="<name>" equivalent to -P<name> + yyclass="<name>" set the name of the C++ scanning class + (see below) + + A number of %option's are available for lint purists who + want to suppress the appearance of unneeded routines in + the generated scanner. Each of the following, if unset, + 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 + + You can specify multiple options with a single %option directive, + and multiple directives in the first section of your flex input file. + + - The new function: + + YY_BUFFER_STATE yy_scan_string( const char *str ) + + returns a YY_BUFFER_STATE (which also becomes the current input + buffer) for scanning the given string, which occurs starting + with the next call to yylex(). The string must be NUL-terminated. + A related function: + + YY_BUFFER_STATE yy_scan_bytes( const char *bytes, int len ) + + creates a buffer for scanning "len" bytes (including possibly NUL's) + starting at location "bytes". + + Note that both of these functions create and scan a *copy* of + the string/bytes. (This may be desirable, since yylex() modifies + the contents of the buffer it is scanning.) You can avoid the + copy by using: + + 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 (these 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, yy_scan_buffer returns a + nil pointer instead of creating a new input buffer. + + The type yy_size_t is an integral type to which you can cast + an integer expression reflecting the size of the buffer. + + - Three new routines are available for manipulating stacks of + start conditions: + + void yy_push_state( int new_state ) + + pushes the current start condition onto the top of the stack + and BEGIN's "new_state" (recall that start condition names are + also integers). + + void yy_pop_state() + + pops the top of the stack and BEGIN's to it, and + + 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 + is aborted. + + To use start condition stacks, your scanner must include + a "%option stack" directive. + + - flex now supports POSIX character class expressions. These + are expressions enclosed inside "[:" and ":]" delimiters (which + themselves must appear between the '[' and ']' of a character + class; other elements may occur inside the character class, too). + The expressions flex recognizes 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 isXXX function (for example, [:alnum:] designates + those characters for which isalnum() returns true - i.e., any + alphabetic or numeric). 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] + + If your scanner is case-insensitive (-i flag), then [:upper:] + and [:lower:] are equivalent to [:alpha:]. + + - The promised rewrite of the C++ FlexLexer class has not yet + been done. Support for FlexLexer is limited at the moment to + fixing show-stopper bugs, so, for example, the new functions + yy_scan_string() & friends are not available to FlexLexer + objects. + + - The new 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 flex.1). 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". + + yy_set_interactive() must be invoked prior to beginning to + scan the buffer. + + - The new 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 (non-zero macro argument; makes '^' anchored + rules active) or not at the beginning of a line (zero argument, + '^' rules inactive). + + - Related to this change, the mechanism for determining when a scan is + starting at the beginning of a line has changed. It used to be + that '^' was active iff the character prior to that at which the + scan started was a newline. The mechanism now is that '^' is + active iff the last token ended in a newline (or the last call to + input() returned a newline). For most users, the difference in + mechanisms is negligible. Where it will make a difference, + however, is if unput() or yyless() is used to alter the input + stream. When in doubt, use yy_set_bol(). + + - The new beginning-of-line mechanism involved changing some fairly + twisted code, so it may have introduced bugs - beware ... + + - The macro YY_AT_BOL() returns true if the next token scanned from + the current buffer will have '^' rules active, false otherwise. + + - The new function + + void yy_flush_buffer( struct yy_buffer_state* b ) + + flushes the contents of the current buffer (i.e., next time + the scanner attempts to match a token using b as the current + buffer, it will begin by invoking YY_INPUT to fill the buffer). + This routine is also available to C++ scanners (unlike some + of the other new routines). + + The related macro + + YY_FLUSH_BUFFER + + flushes the contents of the current buffer. + + - A new "-ooutput" option writes the generated scanner to "output". + If used with -t, the scanner is still written to stdout, but + its internal #line directives (see previous item) use "output". + + - Flex now generates #line directives relating the code it + produces to the output file; this means that error messages + in the flex-generated code should be correctly pinpointed. + + - When generating #line directives, filenames with embedded '\'s + have those characters escaped (i.e., turned into '\\'). This + feature helps with reporting filenames for some MS-DOS and OS/2 + systems. + + - The FlexLexer class includes two new public member functions: + + virtual void switch_streams( istream* new_in = 0, + ostream* new_out = 0 ) + + reassigns yyin to new_in (if non-nil) and yyout to new_out + (ditto), deleting the previous input buffer if yyin is + reassigned. It is used by: + + int yylex( istream* new_in = 0, ostream* new_out = 0 ) + + which first calls switch_streams() and then returns the value + of calling yylex(). + + - C++ scanners now have yy_flex_debug as a member variable of + FlexLexer rather than a global, and member functions for testing + and setting it. + + - When generating a C++ scanning class, you can now use + + %option yyclass="foo" + + to inform flex that you have derived "foo" 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 generates a + run-time error if called (by invoking yyFlexLexer::LexerError()). + This feature is necessary if your subclass "foo" introduces some + additional member functions or variables that you need to access + from yylex(). + + - Current texinfo files in MISC/texinfo, contributed by Francois + Pinard. + + - You can now change the name "flex" to something else (e.g., "lex") + by redefining $(FLEX) in the Makefile. + + - Two bugs (one serious) that could cause "bigcheck" to fail have + been fixed. + + - A number of portability/configuration changes have been made + for easier portability. + + - You can use "YYSTATE" in your scanner as an alias for YY_START + (for AT&T lex compatibility). + + - input() now maintains yylineno. + + - input() no longer trashes yytext. + + - interactive scanners now read characters in YY_INPUT up to a + newline, a large performance gain. + + - C++ scanner objects now work with the -P option. You include + <FlexLexer.h> once per scanner - see comments in <FlexLexer.h> + (or flex.1) for details. + + - C++ FlexLexer objects now use the "cerr" stream to report -d output + instead of stdio. + + - The -c flag now has its full glorious POSIX interpretation (do + nothing), rather than being interpreted as an old-style -C flag. + + - Scanners generated by flex now include two #define's giving + the major and minor version numbers (YY_FLEX_MAJOR_VERSION, + YY_FLEX_MINOR_VERSION). These can then be tested to see + whether certain flex features are available. + + - Scanners generated using -l lex compatibility now have the symbol + YY_FLEX_LEX_COMPAT #define'd. + + - When initializing (i.e., yy_init is non-zero on entry to yylex()), + generated scanners now set yy_init to zero before executing + YY_USER_INIT. This means that you can set yy_init back to a + non-zero value in YY_USER_INIT if you need the scanner to be + reinitialized on the next call. + + - You can now use "#line" directives in the first section of your + scanner specification. + + - When generating full-table scanners (-Cf), flex now puts braces + around each row of the 2-d array initialization, to silence warnings + on over-zealous compilers. + + - Improved support for MS-DOS. The flex sources have been successfully + built, unmodified, for Borland 4.02 (all that's required is a + Borland Makefile and config.h file, which are supplied in + MISC/Borland - contributed by Terrence O Kane). + + - Improved support for Macintosh using Think C - the sources should + build for this platform "out of the box". Contributed by Scott + Hofmann. + + - Improved support for VMS, in MISC/VMS/, contributed by Pat Rankin. + + - Support for the Amiga, in MISC/Amiga/, contributed by Andreas + Scherer. Note that the contributed files were developed for + flex 2.4 and have not been tested with flex 2.5. + + - Some notes on support for the NeXT, in MISC/NeXT, contributed + by Raf Schietekat. + + - The MISC/ directory now includes a preformatted version of flex.1 + in flex.man, and pre-yacc'd versions of parse.y in parse.{c,h}. + + - The flex.1 and flexdoc.1 manual pages have been merged. There + is now just one document, flex.1, which includes an overview + at the beginning to help you find the section you need. + + - Documentation now clarifies that start conditions persist across + switches to new input files or different input buffers. If you + want to e.g., return to INITIAL, you must explicitly do so. + + - The "Performance Considerations" section of the manual has been + updated. + + - Documented the "yy_act" variable, which when YY_USER_ACTION is + invoked holds the number of the matched rule, and added an + example of using yy_act to profile how often each rule is matched. + + - Added YY_NUM_RULES, a definition that gives the total number + of rules in the file, including the default rule (even if you + use -s). + + - Documentation now clarifies that you can pass a nil FILE* pointer + to yy_create_buffer() or yyrestart() if you've arrange YY_INPUT + to not need yyin. + + - Documentation now clarifies that YY_BUFFER_STATE is a pointer to + an opaque "struct yy_buffer_state". + + - Documentation now stresses that you gain the benefits of removing + backing-up states only if you remove *all* of them. + + - Documentation now points out that traditional lex allows you + to put the action on a separate line from the rule pattern if + the pattern has trailing whitespace (ugh!), but flex doesn't + support this. + + - A broken example in documentation of the difference between + inclusive and exclusive start conditions is now fixed. + + - Usage (-h) report now goes to stdout. + + - Version (-V) info now goes to stdout. + + - More #ifdef chud has been added to the parser in attempt to + deal with bison's use of alloca(). + + - "make clean" no longer deletes emacs backup files (*~). + + - Some memory leaks have been fixed. + + - A bug was fixed in which dynamically-expanded buffers were + reallocated a couple of bytes too small. + + - A bug was fixed which could cause flex to read and write beyond + the end of the input buffer. + + - -S will not be going away. + + +Changes between release 2.4.7 (03Aug94) and release 2.4.6: + + - Fixed serious bug in reading multiple files. + + - Fixed bug in scanning NUL's. + + - Fixed bug in input() returning 8-bit characters. + + - Fixed bug in matching text with embedded NUL's when + using %array or lex compatibility. + + - Fixed multiple invocations of YY_USER_ACTION when using '|' + continuation action. + + - Minor prototyping fixes. + +Changes between release 2.4.6 (04Jan94) and release 2.4.5: + + - Linking with -lfl no longer required if your program includes + its own yywrap() and main() functions. (This change will cause + problems if you have a non-ANSI compiler on a system for which + sizeof(int) != sizeof(void*) or sizeof(int) != sizeof(size_t).) + + - The use of 'extern "C++"' in FlexLexer.h has been modified to + get around an incompatibility with g++'s header files. + +Changes between release 2.4.5 (11Dec93) and release 2.4.4: + + - Fixed bug breaking C++ scanners that use REJECT or variable + trailing context. + + - Fixed serious input problem for interactive scanners on + systems for which char is unsigned. + + - Fixed bug in incorrectly treating '$' operator as variable + trailing context. + + - Fixed bug in -CF table representation that could lead to + corrupt tables. + + - Fixed fairly benign memory leak. + + - Added `extern "C++"' wrapper to FlexLexer.h header. This + should overcome the g++ 2.5.X problems mentioned in the + NEWS for release 2.4.3. + + - Changed #include of FlexLexer.h to use <> instead of "". + + - Added feature to control whether the scanner attempts to + refill the input buffer once it's exhausted. This feature + will be documented in the 2.5 release. + + +Changes between release 2.4.4 (07Dec93) and release 2.4.3: + + - Fixed two serious bugs in scanning 8-bit characters. + + - Fixed bug in YY_USER_ACTION that caused it to be executed + inappropriately (on the scanner's own internal actions, and + with incorrect yytext/yyleng values). + + - Fixed bug in pointing yyin at a new file and resuming scanning. + + - Portability fix regarding min/max/abs macros conflicting with + function definitions in standard header files. + + - Added a virtual LexerError() method to the C++ yyFlexLexer class + for reporting error messages instead of always using cerr. + + - Added warning in flexdoc that the C++ scanning class is presently + experimental and subject to considerable change between major + releases. + + +Changes between release 2.4.3 (03Dec93) and release 2.4.2: + + - Fixed bug causing fatal scanner messages to fail to print. + + - Fixed things so FlexLexer.h can be included in other C++ + sources. One side-effect of this change is that -+ and -CF + are now incompatible. + + - libfl.a now supplies private versions of the the <string.h>/ + <strings.h> string routines needed by flex and the scanners + it generates, to enhance portability to some BSD systems. + + - More robust solution to 2.4.2's flexfatal() bug fix. + + - Added ranlib of installed libfl.a. + + - Some lint tweaks. + + - NOTE: problems have been encountered attempting to build flex + C++ scanners using g++ version 2.5.X. The problem is due to an + unfortunate heuristic in g++ 2.5.X that attempts to discern between + C and C++ headers. Because FlexLexer.h is installed (by default) + in /usr/local/include and not /usr/local/lib/g++-include, g++ 2.5.X + decides that it's a C header :-(. So if you have problems, install + the header in /usr/local/lib/g++-include instead. + + +Changes between release 2.4.2 (01Dec93) and release 2.4.1: + + - Fixed bug in libfl.a referring to non-existent "flexfatal" function. + + - Modified to produce both compress'd and gzip'd tar files for + distributions (you probably don't care about this change!). + + +Changes between release 2.4.1 (30Nov93) and release 2.3.8: + + - The new '-+' flag instructs flex to generate a C++ scanner class + (thanks to Kent Williams). flex writes an implementation of the + class defined in FlexLexer.h to lex.yy.cc. You may include + multiple scanner classes in your program using the -P flag. Note + that the scanner class also provides a mechanism for creating + reentrant scanners. The scanner class uses C++ streams for I/O + instead of FILE*'s (thanks to Tom Epperly). If the flex executable's + name ends in '+' then the '-+' flag is automatically on, so creating + a symlink or copy of "flex" to "flex++" results in a version of + flex that can be used exclusively for C++ scanners. + + Note that without the '-+' flag, flex-generated scanners can still + be compiled using C++ compilers, though they use FILE*'s for I/O + instead of streams. + + See the "GENERATING C++ SCANNERS" section of flexdoc for details. + + - The new '-l' flag turns on maximum AT&T lex compatibility. In + particular, -l includes support for "yylineno" and makes yytext + be an array instead of a pointer. It does not, however, do away + with all incompatibilities. See the "INCOMPATIBILITIES WITH LEX + AND POSIX" section of flexdoc for details. + + - The new '-P' option specifies a prefix to use other than "yy" + for the scanner's globally-visible variables, and for the + "lex.yy.c" filename. Using -P you can link together multiple + flex scanners in the same executable. + + - The distribution includes a "texinfo" version of flexdoc.1, + contributed by Roland Pesch (thanks also to Marq Kole, who + contributed another version). It has not been brought up to + date, but reflects version 2.3. See MISC/flex.texinfo. + + The flex distribution will soon include G.T. Nicol's flex + manual; he is presently bringing it up-to-date for version 2.4. + + - yywrap() is now a function, and you now *must* link flex scanners + with libfl.a. + + - Site-configuration is now done via an autoconf-generated + "configure" script contributed by Francois Pinard. + + - Scanners now use fread() (or getc(), if interactive) and not + read() for input. A new "table compression" option, -Cr, + overrides this change and causes the scanner to use read() + (because read() is a bit faster than fread()). -f and -F + are now equivalent to -Cfr and -CFr; i.e., they imply the + -Cr option. + + - In the blessed name of POSIX compliance, flex supports "%array" + and "%pointer" directives in the definitions (first) section of + the scanner specification. The former specifies that yytext + should be an array (of size YYLMAX), the latter, that it should + be a pointer. The array version of yytext is universally slower + than the pointer version, but has the advantage that its contents + remain unmodified across calls to input() and unput() (the pointer + version of yytext is, still, trashed by such calls). + + "%array" cannot be used with the '-+' C++ scanner class option. + + - The new '-Ca' option directs flex to trade off memory for + natural alignment when generating a scanner's tables. In + particular, table entries that would otherwise be "short" + become "long". + + - The new '-h' option produces a summary of the flex flags. + + - The new '-V' option reports the flex version number and exits. + + - The new scanner macro YY_START returns an integer value + corresponding to the current start condition. You can return + to that start condition by passing the value to a subsequent + "BEGIN" action. You also can implement "start condition stacks" + by storing the values in an integer stack. + + - You can now redefine macros such as YY_INPUT by just #define'ing + them to some other value in the first section of the flex input; + no need to first #undef them. + + - flex now generates warnings for rules that can't be matched. + These warnings can be turned off using the new '-w' flag. If + your scanner uses REJECT then you will not get these warnings. + + - If you specify the '-s' flag but the default rule can be matched, + flex now generates a warning. + + - "yyleng" is now a global, and may be modified by the user (though + doing so and then using yymore() will yield weird results). + + - Name definitions in the first section of a scanner specification + can now include a leading '^' or trailing '$' operator. In this + case, the definition is *not* pushed back inside of parentheses. + + - Scanners with compressed tables are now "interactive" (-I option) + by default. You can suppress this attribute (which makes them + run slightly slower) using the new '-B' flag. + + - Flex now generates 8-bit scanners by default, unless you use the + -Cf or -CF compression options (-Cfe and -CFe result in 8-bit + scanners). You can force it to generate a 7-bit scanner using + the new '-7' flag. You can build flex to generate 8-bit scanners + for -Cf and -CF, too, by adding -DDEFAULT_CSIZE=256 to CFLAGS + in the Makefile. + + - You no longer need to call the scanner routine yyrestart() to + inform the scanner that you have switched to a new file after + having seen an EOF on the current input file. Instead, just + point yyin at the new file and continue scanning. + + - You no longer need to invoke YY_NEW_FILE in an <<EOF>> action + to indicate you wish to continue scanning. Simply point yyin + at a new file. + + - A leading '#' no longer introduces a comment in a flex input. + + - flex no longer considers formfeed ('\f') a whitespace character. + + - %t, I'm happy to report, has been nuked. + + - The '-p' option may be given twice ('-pp') to instruct flex to + report minor performance problems as well as major ones. + + - The '-v' verbose output no longer includes start/finish time + information. + + - Newlines in flex inputs can optionally include leading or + trailing carriage-returns ('\r'), in support of several PC/Mac + run-time libraries that automatically include these. + + - A start condition of the form "<*>" makes the following rule + active in every start condition, whether exclusive or inclusive. + + - The following items have been corrected in the flex documentation: + + - '-C' table compression options *are* cumulative. + + - You may modify yytext but not lengthen it by appending + characters to the end. Modifying its final character + will affect '^' anchoring for the next rule matched + if the character is changed to or from a newline. + + - The term "backtracking" has been renamed "backing up", + since it is a one-time repositioning and not a repeated + search. What used to be the "lex.backtrack" file is now + "lex.backup". + + - Unindented "/* ... */" comments are allowed in the first + flex input section, but not in the second. + + - yyless() can only be used in the flex input source, not + externally. + + - You can use "yyrestart(yyin)" to throw away the + current contents of the input buffer. + + - To write high-speed scanners, attempt to match as much + text as possible with each rule. See MISC/fastwc/README + for more information. + + - Using the beginning-of-line operator ('^') is fairly + cheap. Using unput() is expensive. Using yyless() is + cheap. + + - An example of scanning strings with embedded escape + sequences has been added. + + - The example of backing-up in flexdoc was erroneous; it + has been corrected. + + - A flex scanner's internal buffer now dynamically grows if needed + to match large tokens. Note that growing the buffer presently + requires rescanning the (large) token, so consuming a lot of + text this way is a slow process. Also note that presently the + buffer does *not* grow if you unput() more text than can fit + into the buffer. + + - The MISC/ directory has been reorganized; see MISC/README for + details. + + - yyless() can now be used in the third (user action) section + of a scanner specification, thanks to Ceriel Jacobs. yyless() + remains a macro and cannot be used outside of the scanner source. + + - The skeleton file is no longer opened at run-time, but instead + compiled into a large string array (thanks to John Gilmore and + friends at Cygnus). You can still use the -S flag to point flex + at a different skeleton file. + + - flex no longer uses a temporary file to store the scanner's + actions. + + - A number of changes have been made to decrease porting headaches. + In particular, flex no longer uses memset() or ctime(), and + provides a single simple mechanism for dealing with C compilers + that still define malloc() as returning char* instead of void*. + + - Flex now detects if the scanner specification requires the -8 flag + but the flag was not given or on by default. + + - A number of table-expansion fencepost bugs have been fixed, + making flex more robust for generating large scanners. + + - flex more consistently identifies the location of errors in + its input. + + - YY_USER_ACTION is now invoked only for "real" actions, not for + internal actions used by the scanner for things like filling + the buffer or handling EOF. + + - The rule "[^]]" now matches any character other than a ']'; + formerly it matched any character at all followed by a ']'. + This change was made for compatibility with AT&T lex. + + - A large number of miscellaneous bugs have been found and fixed + thanks to Gerhard Wilhelms. + + - The source code has been heavily reformatted, making patches + relative to previous flex releases no longer accurate. + + +Changes between 2.3 Patch #8 (21Feb93) and 2.3 Patch #7: + + - Fixed bugs in dynamic memory allocation leading to grievous + fencepost problems when generating large scanners. + - Fixed bug causing infinite loops on character classes with 8-bit + characters in them. + - Fixed bug in matching repetitions with a lower bound of 0. + - Fixed bug in scanning NUL characters using an "interactive" scanner. + - Fixed bug in using yymore() at the end of a file. + - Fixed bug in misrecognizing rules with variable trailing context. + - Fixed bug compiling flex on Suns using gcc 2. + - Fixed bug in not recognizing that input files with the character + ASCII 128 in them require the -8 flag. + - Fixed bug that could cause an infinite loop writing out + error messages. + - Fixed bug in not recognizing old-style lex % declarations if + followed by a tab instead of a space. + - Fixed potential crash when flex terminated early (usually due + to a bad flag) and the -v flag had been given. + - Added some missing declarations of void functions. + - Changed to only use '\a' for __STDC__ compilers. + - Updated mailing addresses. + + +Changes between 2.3 Patch #7 (28Mar91) and 2.3 Patch #6: + + - Fixed out-of-bounds array access that caused bad tables + to be produced on machines where the bad reference happened + to yield a 1. This caused problems installing or running + flex on some Suns, in particular. + + +Changes between 2.3 Patch #6 (29Aug90) and 2.3 Patch #5: + + - Fixed a serious bug in yymore() which basically made it + completely broken. Thanks goes to Jean Christophe of + the Nethack development team for finding the problem + and passing along the fix. + + +Changes between 2.3 Patch #5 (16Aug90) and 2.3 Patch #4: + + - An up-to-date version of initscan.c so "make test" will + work after applying the previous patches + + +Changes between 2.3 Patch #4 (14Aug90) and 2.3 Patch #3: + + - Fixed bug in hexadecimal escapes which allowed only digits, + not letters, in escapes + - Fixed bug in previous "Changes" file! + + +Changes between 2.3 Patch #3 (03Aug90) and 2.3 Patch #2: + + - Correction to patch #2 for gcc compilation; thanks goes to + Paul Eggert for catching this. + + +Changes between 2.3 Patch #2 (02Aug90) and original 2.3 release: + + - Fixed (hopefully) headaches involving declaring malloc() + and free() for gcc, which defines __STDC__ but (often) doesn't + come with the standard include files such as <stdlib.h>. + Reordered #ifdef maze in the scanner skeleton in the hope of + getting the declarations right for cfront and g++, too. + + - Note that this patch supercedes patch #1 for release 2.3, + which was never announced but was available briefly for + anonymous ftp. + + +Changes between 2.3 (full) release of 28Jun90 and 2.2 (alpha) release: + +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 + *all* start conditions which haven't already had <<EOF>> actions + given. To specify an end-of-file action for just the initial + state, use <INITIAL><<EOF>>. + + - -d debug output is now contigent on the global yy_flex_debug + being set to a non-zero value, which it is by default. + + - A new macro, YY_USER_INIT, is provided for the user to specify + initialization action to be taken on the first call to the + scanner. This action is done before the scanner does its + own initialization. + + - yy_new_buffer() has been added as an alias for yy_create_buffer() + + - Comments beginning with '#' and extending to the end of the line + now work, but have been deprecated (in anticipation of making + flex recognize #line directives). + + - The funky restrictions on when semi-colons could follow the + YY_NEW_FILE and yyless macros have been removed. They now + behave identically to functions. + + - A bug in the sample redefinition of YY_INPUT in the documentation + has been corrected. + + - A bug in the sample simple tokener in the documentation has + been corrected. + + - The documentation on the incompatibilities between flex and + lex has been reordered so that the discussion of yylineno + and input() come first, as it's anticipated that these will + be the most common source of headaches. + + +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 + beginning of a line", whereas lex interprets it as "match either + a 'foo' at the beginning of a line, or a 'bar' anywhere". + + - flex initializes the global "yyin" on the first call to the + scanner, while lex initializes it at compile-time. + + - yy_switch_to_buffer() can be used in the yywrap() macro/routine. + + - flex scanners do not use stdio for their input, and hence when + writing an interactive scanner one must explictly call fflush() + after writing out a prompt. + + - flex scanner can be made reentrant (after a fashion) by using + "yyrestart( yyin );". This is useful for interactive scanners + which have interrupt handlers that long-jump out of the scanner. + + - a defense of why yylineno is not supported is included, along + with a suggestion on how to convert scanners which rely on it. + + +Other changes: + + - Prototypes and proper declarations of void routines have + been added to the flex source code, courtesy of Kevin B. Kenny. + + - Routines dealing with memory allocation now use void* pointers + instead of char* - see Makefile for porting implications. + + - Error-checking is now done when flex closes a file. + + - Various lint tweaks were added to reduce the number of gripes. + + - Makefile has been further parameterized to aid in porting. + + - Support for SCO Unix added. + + - Flex now sports the latest & greatest UC copyright notice + (which is only slightly different from the previous one). + + - A note has been added to flexdoc.1 mentioning work in progress + on modifying flex to generate straight C code rather than a + table-driven automaton, with an email address of whom to contact + if you are working along similar lines. + + +Changes between 2.2 Patch #3 (30Mar90) and 2.2 Patch #2: + + - fixed bug which caused -I scanners to bomb + + +Changes between 2.2 Patch #2 (27Mar90) and 2.2 Patch #1: + + - fixed bug writing past end of input buffer in yyunput() + - fixed bug detecting NUL's at the end of a buffer + + +Changes between 2.2 Patch #1 (23Mar90) and 2.2 (alpha) release: + + - Makefile fixes: definition of MAKE variable for systems + which don't have it; installation of flexdoc.1 along with + flex.1; fixed two bugs which could cause "bigtest" to fail. + + - flex.skel fix for compiling with g++. + + - README and flexdoc.1 no longer list an out-of-date BITNET address + for contacting me. + + - minor typos and formatting changes to flex.1 and flexdoc.1. + + +Changes between 2.2 (alpha) release of March '90 and previous release: + +User-visible: + + - Full user documentation now available. + + - Support for 8-bit scanners. + + - Scanners now accept NUL's. + + - A facility has been added for dealing with multiple + input buffers. + + - Two manual entries now. One which fully describes flex + (rather than just its differences from lex), and the + other for quick(er) reference. + + - A number of changes to bring flex closer into compliance + with the latest POSIX lex draft: + + %t support + flex now accepts multiple input files and concatenates + them together to form its input + previous -c (compress) flag renamed -C + do-nothing -c and -n flags added + Any indented code or code within %{}'s in section 2 is + now copied to the output + + - yyleng is now a bona fide global integer. + + - -d debug information now gives the line number of the + matched rule instead of which number rule it was from + the beginning of the file. + + - -v output now includes a summary of the flags used to generate + the scanner. + + - unput() and yyrestart() are now globally callable. + + - yyrestart() no longer closes the previous value of yyin. + + - C++ support; generated scanners can be compiled with C++ compiler. + + - Primitive -lfl library added, containing default main() + which calls yylex(). A number of routines currently living + in the scanner skeleton will probably migrate to here + in the future (in particular, yywrap() will probably cease + to be a macro and instead be a function in the -lfl library). + + - Hexadecimal (\x) escape sequences added. + + - Support for MS-DOS, VMS, and Turbo-C integrated. + + - The %used/%unused operators have been deprecated. They + may go away soon. + + +Other changes: + + - Makefile enhanced for easier testing and installation. + - The parser has been tweaked to detect some erroneous + constructions which previously were missed. + - Scanner input buffer overflow is now detected. + - Bugs with missing "const" declarations fixed. + - Out-of-date Minix/Atari patches provided. + - Scanners no longer require printf() unless FLEX_DEBUG is being used. + - A subtle input() bug has been fixed. + - Line numbers for "continued action" rules (those following + the special '|' action) are now correct. + - unput() bug fixed; had been causing problems porting flex to VMS. + - yymore() handling rewritten to fix bug with interaction + between yymore() and trailing context. + - EOF in actions now generates an error message. + - Bug involving -CFe and generating equivalence classes fixed. + - Bug which made -CF be treated as -Cf fixed. + - Support for SysV tmpnam() added. + - Unused #define's for scanner no longer generated. + - Error messages which are associated with a particular input + line are now all identified with their input line in standard + format. + - % directives which are valid to lex but not to flex are + now ignored instead of generating warnings. + - -DSYS_V flag can now also be specified -DUSG for System V + compilation. + + +Changes between 2.1 beta-test release of June '89 and previous release: + +User-visible: + + - -p flag generates a performance report to stderr. The report + consists of comments regarding features of the scanner rules + which result in slower scanners. + + - -b flag generates backtracking information to lex.backtrack. + This is a list of scanner states which require backtracking + and the characters on which they do so. By adding rules + one can remove backtracking states. If all backtracking states + are eliminated, the generated scanner will run faster. + Backtracking is not yet documented in the manual entry. + + - Variable trailing context now works, i.e., one can have + rules like "(foo)*/[ \t]*bletch". Some trailing context + patterns still cannot be properly matched and generate + error messages. 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. Lex won't get these + patterns right either. + + - Faster scanners. + + - 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). See manual entry for example. + + - The -r (reject used) flag is gone. flex now scans the input + for occurrences of the string "REJECT" to determine if the + action is needed. It tries to be intelligent about this but + can be fooled. One can force the presence or absence of + REJECT by adding a line in the first section of the form + "%used REJECT" or "%unused REJECT". + + - yymore() has been implemented. Similarly to REJECT, flex + detects the use of yymore(), which can be overridden using + "%used" or "%unused". + + - Patterns like "x{0,3}" now work (i.e., with lower-limit == 0). + + - Removed '\^x' for ctrl-x misfeature. + + - Added '\a' and '\v' escape sequences. + + - \<digits> now works for octal escape sequences; previously + \0<digits> was required. + + - Better error reporting; line numbers are associated with rules. + + - yyleng is a macro; it cannot be accessed outside of the + scanner source file. + + - yytext and yyleng should not be modified within a flex action. + + - Generated scanners #define the name FLEX_SCANNER. + + - Rules are internally separated by YY_BREAK in lex.yy.c rather + than break, to allow redefinition. + + - The macro YY_USER_ACTION can be redefined to provide an action + which is always executed prior to the matched rule's action. + + - yyrestart() is a new action which can be used to restart + the scanner after it has seen an end-of-file (a "real" one, + that is, one for which yywrap() returned non-zero). It takes + a FILE* argument indicating a new file to scan and sets + things up so that a subsequent call to yylex() will start + scanning that file. + + - Internal scanner names all preceded by "yy_" + + - lex.yy.c is deleted if errors are encountered during processing. + + - Comments may be put in the first section of the input by preceding + them with '#'. + + + +Other changes: + + - Some portability-related bugs fixed, in particular for machines + with unsigned characters or sizeof( int* ) != sizeof( int ). + Also, tweaks for VMS and Microsoft C (MS-DOS), and identifiers all + trimmed to be 31 or fewer characters. Shortened file names + for dinosaur OS's. Checks for allocating > 64K memory + on 16 bit'ers. Amiga tweaks. Compiles using gcc on a Sun-3. + - Compressed and fast scanner skeletons merged. + - Skeleton header files done away with. + - Generated scanner uses prototypes and "const" for __STDC__. + - -DSV flag is now -DSYS_V for System V compilation. + - Removed all references to FTL language. + - Software now covered by BSD Copyright. + - flex will replace lex in subsequent BSD releases. diff --git a/usr.bin/lex/README b/usr.bin/lex/README new file mode 100644 index 00000000000..8906709ef41 --- /dev/null +++ b/usr.bin/lex/README @@ -0,0 +1,113 @@ +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 for +flex at: + +http://sourceforge.net/tracker/?group_id=97492&atid=618177 + +The flex codebase is kept in git at: + +https://github.com/westes/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 + +Find information on subscribing to the mailing lists at: + +http://sourceforge.net/mail/?group_id=97492 + +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. + +You need the following tools to build flex from the maintainer's +repository: + +compiler suite - flex is built with gcc +bash, or a good Bourne-style shell +m4 - m4 -p needs to work; GNU m4 and a few others are suitable +GNU bison; to generate parse.c from parse.y +autoconf 2.69; for handling the build system +automake 1.12.2; for Makefile generation +gettext 0.18; fori18n support +help2man 1.36; to generate the flex man page +tar, gzip, etc.; for packaging of the source distribution +GNU texinfo 498; to build and test the flex manual +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. + +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. + + diff --git a/usr.bin/lex/VERSION b/usr.bin/lex/VERSION deleted file mode 100644 index c1e55be514d..00000000000 --- a/usr.bin/lex/VERSION +++ /dev/null @@ -1,2 +0,0 @@ -A complete flex-2.5.4 distribution is available from ftp.ee.lbl.gov -or prep.ai.mit.edu diff --git a/usr.bin/lex/buf.c b/usr.bin/lex/buf.c new file mode 100644 index 00000000000..89c6cc9d81d --- /dev/null +++ b/usr.bin/lex/buf.c @@ -0,0 +1,277 @@ +/* $OpenBSD: buf.c,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* 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); + if (!t) + flexfatal (_("Allocation of buffer to print string failed")); + 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) +{ + const char *src; + char *dst, *t; + size_t tsz; + + t = flex_alloc (tsz = strlen ("#line \"\"\n") + /* constant parts */ + 2 * strlen (filename) + /* filename with possibly all backslashes escaped */ + (int) (1 + log10 (abs (lineno))) + /* line number */ + 1); /* NUL */ + if (!t) + flexfatal (_("Allocation of buffer for line directive failed")); + for (dst = t + snprintf (t, tsz, "#line %d \"", lineno), src = filename; *src; *dst++ = *src++) + if (*src == '\\') /* escape backslashes */ + *dst++ = '\\'; + *dst++ = '"'; + *dst++ = '\n'; + *dst = '\0'; + 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); + if (!str) + flexfatal (_("Allocation of buffer for m4 def failed")); + + 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); + if (!str) + flexfatal (_("Allocation of buffer for m4 undef failed")); + + 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/usr.bin/lex/ccl.c b/usr.bin/lex/ccl.c index 5226940320f..628edcac6ab 100644 --- a/usr.bin/lex/ccl.c +++ b/usr.bin/lex/ccl.c @@ -1,94 +1,210 @@ -/* $OpenBSD: ccl.c,v 1.6 2003/06/04 17:34:44 millert Exp $ */ +/* $OpenBSD: ccl.c,v 1.7 2015/11/19 19:43:40 tedu Exp $ */ /* 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, 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. - */ +/* 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. */ -/* $Header: /cvs/OpenBSD/src/usr.bin/lex/ccl.c,v 1.6 2003/06/04 17:34:44 millert Exp $ */ +/* 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; +void ccladd (cclp, ch) + int cclp; + int ch; +{ + int ind, len, newpos, i; - check_char( ch ); + 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 ) + 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 ) - { + 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 ); - } + 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) +{ + int i; + + putc ('[', file); + + for (i = 0; i < csize; ++i) { + if (ccl_contains(cclp, i)){ + 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 ) - { +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 ); - } + 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 ) + if (lastccl == 1) /* we're making the first ccl */ cclmap[lastccl] = 0; @@ -98,22 +214,25 @@ int cclinit() * 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]; + 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; - { +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 @@ -123,34 +242,71 @@ int cclp; * has a non-zero value in the cset array. */ -void list_character_set( file, cset ) -FILE *file; -int cset[]; - { +void list_character_set (file, cset) + FILE *file; + int cset[]; +{ int i; - putc( '[', file ); + putc ('[', file); - for ( i = 0; i < csize; ++i ) - { - if ( cset[i] ) - { + for (i = 0; i < csize; ++i) { + if (cset[i]) { int start_char = i; - putc( ' ', file ); + putc (' ', file); - fputs( readable_form( i ), file ); + fputs (readable_form (i), file); - while ( ++i < csize && cset[i] ) - ; + while (++i < csize && cset[i]) ; - if ( i - 1 > start_char ) + if (i - 1 > start_char) /* this was a run */ - fprintf( file, "-%s", readable_form( i - 1 ) ); + fprintf (file, "-%s", + readable_form (i - 1)); - putc( ' ', file ); - } + putc (' ', file); } + } + + 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/usr.bin/lex/config.h b/usr.bin/lex/config.h index ec878e4daea..14d25ab8d67 100644 --- a/usr.bin/lex/config.h +++ b/usr.bin/lex/config.h @@ -1,28 +1,224 @@ -/* $OpenBSD: config.h,v 1.3 1996/10/26 21:50:30 tholo Exp $ */ +/* $OpenBSD: config.h,v 1.4 2015/11/19 19:43:40 tedu Exp $ */ -/* config.h. Generated automatically by configure. */ -/* $Header: /cvs/OpenBSD/src/usr.bin/lex/config.h,v 1.3 1996/10/26 21:50:30 tholo Exp $ */ +/* config.h. Generated from conf.in by configure. */ +/* conf.in. Generated from configure.ac by autoheader. */ -/* Define to empty if the keyword does not work. */ -/* #undef const */ +/* 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 `unsigned' if <sys/types.h> doesn't define. */ -/* #undef size_t */ +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ -/* Define if you have the ANSI C header files. */ -#define STDC_HEADERS 1 +/* 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. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix). + */ +/* #undef HAVE_ALLOCA_H */ + +/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the + CoreFoundation framework. */ +/* #undef HAVE_CFLOCALECOPYCURRENT */ + +/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in + the CoreFoundation framework. */ +/* #undef HAVE_CFPREFERENCESCOPYAPPVALUE */ + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +/* #undef HAVE_DCGETTEXT */ + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the `dup2' function. */ +#define HAVE_DUP2 1 + +/* Define to 1 if you have the `fork' function. */ +#define HAVE_FORK 1 + +/* Define if the GNU gettext() function is already present or preinstalled. */ +/* #undef HAVE_GETTEXT */ + +/* Define if you have the iconv() function and it works. */ +#define HAVE_ICONV 1 + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `isascii' function. */ +#define HAVE_ISASCII 1 + +/* 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). */ +#define HAVE_LIBM 1 + +/* pthread library */ +#define HAVE_LIBPTHREAD 1 + +/* Define to 1 if you have the <limits.h> header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the <locale.h> header file. */ +#define HAVE_LOCALE_H 1 + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#define HAVE_MALLOC 1 + +/* Define to 1 if you have the <malloc.h> header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the <memory.h> header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `memset' function. */ +#define HAVE_MEMSET 1 + +/* Define to 1 if you have the <netinet/in.h> header file. */ +#define HAVE_NETINET_IN_H 1 + +/* Define to 1 if you have the `pow' function. */ +#define HAVE_POW 1 + +/* Define to 1 if you have the <pthread.h> header file. */ +#define HAVE_PTHREAD_H 1 + +/* Define to 1 if your system has a GNU libc compatible `realloc' function, + and to 0 otherwise. */ +#define HAVE_REALLOC 1 + +/* Define to 1 if you have the `regcomp' function. */ +#define HAVE_REGCOMP 1 + +/* Define to 1 if you have the <regex.h> header file. */ +#define HAVE_REGEX_H 1 + +/* Define to 1 if you have the `setlocale' function. */ +#define HAVE_SETLOCALE 1 + +/* Define to 1 if stdbool.h conforms to C99. */ +#define HAVE_STDBOOL_H 1 + +/* Define to 1 if you have the <stddef.h> header file. */ +#define HAVE_STDDEF_H 1 -/* Define if you have the <malloc.h> header file. */ -/* #undef HAVE_MALLOC_H */ +/* Define to 1 if you have the <stdint.h> header file. */ +#define HAVE_STDINT_H 1 -/* Define if you have the <string.h> header file. */ +/* Define to 1 if you have the <stdlib.h> header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the <strings.h> header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ #define HAVE_STRING_H 1 -/* Define if you have the <sys/types.h> header file. */ +/* Define to 1 if you have the `strtol' function. */ +#define HAVE_STRTOL 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/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 to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `vfork' function. */ +#define HAVE_VFORK 1 + +/* Define to 1 if you have the <vfork.h> header file. */ +/* #undef HAVE_VFORK_H */ + +/* Define to 1 if `fork' works. */ +#define HAVE_WORKING_FORK 1 + +/* Define to 1 if `vfork' works. */ +#define HAVE_WORKING_VFORK 1 + +/* Define to 1 if the system has the type `_Bool'. */ +#define HAVE__BOOL 1 + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Define to the m4 executable name. */ +#define M4 "/usr/bin/m4" + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "flex" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "flex-help@lists.sourceforge.net" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "the fast lexical analyser generator" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "the fast lexical analyser generator 2.5.39" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "flex" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "2.5.39" + +/* 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 runtime. + 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. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION "2.5.39" + +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +#define YYTEXT_POINTER 1 + +/* 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 int' if <sys/types.h> does not define. */ +/* #undef size_t */ -/* Define if platform-specific command line handling is necessary. */ -/* #undef NEED_ARGV_FIXUP */ +/* Define as `fork' if `vfork' does not work. */ +/* #undef vfork */ diff --git a/usr.bin/lex/dfa.c b/usr.bin/lex/dfa.c index ba3e62f1525..316a36bc6de 100644 --- a/usr.bin/lex/dfa.c +++ b/usr.bin/lex/dfa.c @@ -1,49 +1,45 @@ -/* $OpenBSD: dfa.c,v 1.6 2003/06/04 17:34:44 millert Exp $ */ +/* $OpenBSD: dfa.c,v 1.7 2015/11/19 19:43:40 tedu Exp $ */ /* 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, 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. - */ +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ -/* $Header: /cvs/OpenBSD/src/usr.bin/lex/dfa.c,v 1.6 2003/06/04 17:34:44 millert 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 @@ -55,32 +51,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 @@ -105,42 +98,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; +{ 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]; int type = state_type[ns]; 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 @@ -150,46 +139,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; +{ int i, j; 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) { 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 ); + qsort (&rule_set [1], num_associated_rules, sizeof (rule_set [1]), intcmp); - fprintf( file, _( " associated rule line numbers:" ) ); + fprintf (file, _(" associated rule line numbers:")); - for ( i = 1; i <= num_associated_rules; ++i ) - { - if ( i % 8 == 1 ) - putc( '\n', file ); + for (i = 1; i <= num_associated_rules; ++i) { + if (i % 8 == 1) + putc ('\n', file); - fprintf( file, "\t%d", rule_set[i] ); - } - - putc( '\n', file ); + fprintf (file, "\t%d", rule_set[i]); } + putc ('\n', file); +} + /* dump_transitions - list the transitions associated with a DFA state * @@ -202,33 +189,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[]; +{ 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 @@ -251,146 +237,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; +{ 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 @@ -399,16 +380,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 @@ -417,11 +401,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 @@ -431,22 +418,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 @@ -480,50 +465,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. */ @@ -536,72 +517,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; @@ -609,53 +623,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. @@ -663,87 +678,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 ) - { - 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 ) - { - outn( " {" ); + if (fulltbl) { + + /* 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. */ @@ -751,41 +768,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 * @@ -797,129 +822,119 @@ 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; 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 ); + qsort (&sns [1], numstates, sizeof (sns [1]), intcmp); 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) + qsort (&sns [1], numstates, sizeof (sns [1]), intcmp); - 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. + * match in the event of ties will work. */ - bubble( accset, nacc ); + qsort (&accset [1], nacc, sizeof (accset [1]), intcmp); - 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 @@ -929,85 +944,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 @@ -1017,86 +1022,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/usr.bin/lex/ecs.c b/usr.bin/lex/ecs.c index 7dfb5423eee..569b445e36f 100644 --- a/usr.bin/lex/ecs.c +++ b/usr.bin/lex/ecs.c @@ -1,50 +1,48 @@ -/* $OpenBSD: ecs.c,v 1.6 2003/06/04 17:34:44 millert Exp $ */ +/* $OpenBSD: ecs.c,v 1.7 2015/11/19 19:43:40 tedu Exp $ */ /* 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, 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. - */ +/* 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: /cvs/OpenBSD/src/usr.bin/lex/ecs.c,v 1.6 2003/06/04 17:34:44 millert 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 @@ -55,21 +53,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 @@ -80,10 +76,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; @@ -92,16 +88,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 @@ -119,12 +114,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 @@ -133,11 +128,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]; @@ -145,22 +139,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) { 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 @@ -176,8 +167,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. @@ -185,48 +176,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/usr.bin/lex/filter.c b/usr.bin/lex/filter.c new file mode 100644 index 00000000000..7b099e0f993 --- /dev/null +++ b/usr.bin/lex/filter.c @@ -0,0 +1,446 @@ +/* $OpenBSD: filter.c,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* 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)); + if (!f) + flexerror (_("flex_alloc failed (f) in filter_create_ext")); + 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)); + if (!f->argv) + flexerror (_("flex_alloc failed (f->argv) in filter_create_ext")); + 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)); + if (!f) + flexerror (_("flex_alloc failed in filter_create_int")); + 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]; + int r; + const int readsz = 512; + char *buf; + + + /* 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]); +clearerr(stdin); + 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)); + lerrsf_fatal ( _("exec of %s failed"), + chain->argv[0]); + } + + 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); + if (!buf) + flexerror (_("flex_alloc failed in filter_tee_header")); + 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); + if (!buf) + flexerror (_("flex_alloc failed in filter_fix_linedirs")); + + 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/usr.bin/lex/flex.skl b/usr.bin/lex/flex.skl index 36d29dca5d5..8ec1e687733 100644 --- a/usr.bin/lex/flex.skl +++ b/usr.bin/lex/flex.skl @@ -1,165 +1,558 @@ -/* $OpenBSD: flex.skl,v 1.12 2013/11/04 17:03:32 millert Exp $ */ - +/* $OpenBSD: flex.skl,v 1.13 2015/11/19 19:43:40 tedu Exp $ */ + +%# -*-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 */ -/* Scanner skeleton version: - * $Header: /cvs/OpenBSD/src/usr.bin/lex/flex.skl,v 1.12 2013/11/04 17:03:32 millert Exp $ - */ +%# 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 2 -#define YY_FLEX_MINOR_VERSION 5 - -%- +#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 <cerrno> -%* +#include <stdlib.h> +%endif +%if-tables-serialization +#include <sys/types.h> +#include <netinet/in.h> +%endif +/* end standard C headers. */ -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus -#endif -#endif +%if-c-or-c++ +m4preproc_include(`flexint.h') +%endif +%if-c++-only +/* begin standard C++ headers. */ +#include <iostream> +#include <errno.h> +#include <cstdlib> +#include <cstdio> +#include <cstring> +/* end standard C++ headers. */ +%endif #ifdef __cplusplus -#include <stdlib.h> -%+ -#include <iosfwd> -%* -#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 */ -#ifdef __STDC__ +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) -#define YY_USE_PROTOS #define YY_USE_CONST -#endif /* __STDC__ */ +#endif /* defined (__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 - +%# 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]]) +%# Perform a noop access on yyguts to prevent unused variable complains +m4_define( [[M4_YY_NOOP_GUTS_VAR]], [[(void)yyg]]) +%# 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( [[M4_YY_NOOP_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_start = 1 + 2 * +#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_start - 1) / 2) +#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 ) +#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 + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif -extern int yyleng; -%- +%if-not-reentrant +extern yy_size_t 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 - -/* 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. */ - +]]) + +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_LINENO_REWIND_TO(dst) \ + do {\ + const char *p;\ + for ( p = yy_cp-1; p >= (dst); --p)\ + if ( *p == '\n' )\ + --yylineno;\ + }while(0) + ]], + [[ + #define YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) + ]]) +]]) + +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. */ \ - *yy_cp = yy_hold_char; \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = YY_G(yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ - yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + 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 ) +]]) -#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; - +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#define unput(c) yyunput( c, YY_G(yytext_ptr) M4_YY_CALL_LAST_ARG ) +]]) +#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 */ @@ -172,7 +565,7 @@ struct yy_buffer_state /* Number of characters read into yy_ch_buf, not including EOB * characters. */ - int yy_n_chars; + yy_size_t 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 @@ -193,12 +586,18 @@ struct yy_buffer_state */ 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 @@ -212,96 +611,410 @@ struct yy_buffer_state * 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; -%* - +#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 yy_current_buffer +#define YY_CURRENT_BUFFER_LVALUE YY_G(yy_buffer_stack)[YY_G(yy_buffer_stack_top)] +]]) +%if-c-only Standard (non-C++) definition -%- 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; +static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ +yy_size_t 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_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 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 * )); - +%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, yy_size_t 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 ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_is_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 ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_at_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) +]]) -#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) +%% [1.0] yytext/yyin/yyout/yy_state_type/yylineno etc. def's & init go here -%% yytext/yyin/yyout/yy_state_type/yylineno etc. def's & init go here +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +%% [1.5] DFA +]]) -%- 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[] )); -%* +%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 \ - yytext_ptr = yy_bp; \ -%% code to fiddle yytext and yyleng for yymore() goes here - yy_hold_char = *yy_cp; \ + 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'; \ -%% 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 +%% [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; + yy_size_t yy_n_chars; + yy_size_t 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]],, +[[ +yy_size_t 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 ); +]]) + +m4_ifdef( [[M4_YY_REENTRANT]], +[[ +m4_ifdef( [[M4_YY_NO_GET_COLUMN]],, +[[ +int yyget_column M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); +]]) +]]) + +m4_ifdef( [[M4_YY_REENTRANT]], +[[ +m4_ifdef( [[M4_YY_NO_SET_COLUMN]],, +[[ +void yyset_column M4_YY_PARAMS( int column_no 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. @@ -309,101 +1022,120 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus -extern "C" int yywrap YY_PROTO(( void )); +extern "C" int yywrap M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); #else -extern int yywrap YY_PROTO(( void )); +extern int yywrap M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); #endif #endif -%- -#ifndef YY_NO_UNPUT -static void yyunput YY_PROTO(( int c, char *buf_ptr )); -#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 YY_PROTO(( char *, yyconst char *, int )); +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 YY_PROTO(( yyconst char * )); +static int yy_flex_strlen M4_YY_PARAMS( yyconst char * M4_YY_PROTO_LAST_ARG); #endif #ifndef YY_NO_INPUT -%- Standard (non-C++) definition +%if-c-only Standard (non-C++) definition +%not-for-header #ifdef __cplusplus -static int yyinput YY_PROTO(( void )); +static int yyinput M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG ); #else -static int input YY_PROTO(( void )); -#endif -%* -#endif - -#if defined(YY_STACK_USED) && 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 -#ifdef __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 +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 -%- Standard (non-C++) definition +%if-c-only Standard (non-C++) definition /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) -%+ C++ definition +#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) +%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) \ -%% fread()/read() definition of YY_INPUT goes here unless we're doing C++ -%+ C++ definition +%% [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. @@ -411,139 +1143,261 @@ YY_MALLOC_DECL #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 -%- -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -%+ +%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 -%- Standard (non-C++) definition -#define YY_DECL int yylex YY_PROTO(( void )) -%+ C++ definition +#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 +#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 +]]) -%% YY_RULE_SETUP definition goes here +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; - -%% user's declarations go here - - if ( yy_init ) +{ + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + 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; + ]]) +]]) + +m4_ifdef( [[M4_YY_BISON_LVAL]], +[[ + yylval = yylval_param; +]]) + +m4_ifdef( [[<M4_YY_BISON_LLOC>]], +[[ + yylloc = yylloc_param; +]]) + + if ( !YY_G(yy_init) ) { - yy_init = 0; + YY_G(yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif - if ( ! yy_start ) - yy_start = 1; /* first start state */ +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; -%+ - yyin = &std::cin; -%* +%endif +%if-c++-only + yyin = & std::cin; +%endif if ( ! yyout ) -%- +%if-c-only yyout = stdout; -%+ - yyout = &std::cout; -%* - - if ( ! yy_current_buffer ) - yy_current_buffer = - yy_create_buffer( yyin, YY_BUF_SIZE ); +%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(); + yy_load_buffer_state( M4_YY_CALL_ONLY_ARG ); } + { +%% [7.0] user's declarations go here + while ( 1 ) /* loops until end-of-file is reached */ { -%% yymore()-related code goes here - yy_cp = yy_c_buf_p; +%% [8.0] yymore()-related code goes here + yy_cp = YY_G(yy_c_buf_p); /* Support of yytext. */ - *yy_cp = yy_hold_char; + *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; -%% code to set up and find next match goes here +%% [9.0] code to set up and find next match goes here yy_find_action: -%% code to find the action number goes here +%% [10.0] code to find the action number goes here YY_DO_BEFORE_ACTION; -%% code for yylineno update goes here +%% [11.0] code for yylineno update goes here do_action: /* This label is used only to access EOF actions. */ -%% debug code goes here +%% [12.0] debug code goes here switch ( yy_act ) { /* beginning of action switch */ -%% actions go here +%% [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 - yytext_ptr) - 1; + 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_hold_char; + *yy_cp = YY_G(yy_hold_char); YY_RESTORE_YY_MORE_OFFSET - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + 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 + * 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; + 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 @@ -553,13 +1407,13 @@ do_action: /* This label is used only to access EOF actions. */ * 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] ) + 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_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + YY_G(yy_c_buf_p) = YY_G(yytext_ptr) + yy_amount_of_matched_text; - yy_current_state = yy_get_previous_state(); + 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 @@ -570,32 +1424,32 @@ do_action: /* This label is used only to access EOF actions. */ * will run more slowly). */ - yy_next_state = yy_try_NUL_trans( yy_current_state ); + yy_next_state = yy_try_NUL_trans( yy_current_state M4_YY_CALL_LAST_ARG); - yy_bp = yytext_ptr + YY_MORE_ADJ; + yy_bp = YY_G(yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ - yy_cp = ++yy_c_buf_p; + yy_cp = ++YY_G(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 +%% [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() ) + else switch ( yy_get_next_buffer( M4_YY_CALL_ONLY_ARG ) ) { case EOB_ACT_END_OF_FILE: { - yy_did_buffer_switch_on_eof = 0; + YY_G(yy_did_buffer_switch_on_eof) = 0; - if ( yywrap() ) + if ( yywrap( M4_YY_CALL_ONLY_ARG ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up @@ -606,7 +1460,7 @@ do_action: /* This label is used only to access EOF actions. */ * YY_NULL, it'll still work - another * YY_NULL will get returned. */ - yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + YY_G(yy_c_buf_p) = YY_G(yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; @@ -614,30 +1468,30 @@ do_action: /* This label is used only to access EOF actions. */ else { - if ( ! yy_did_buffer_switch_on_eof ) + if ( ! YY_G(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_G(yy_c_buf_p) = + YY_G(yytext_ptr) + yy_amount_of_matched_text; - yy_current_state = yy_get_previous_state(); + yy_current_state = yy_get_previous_state( M4_YY_CALL_ONLY_ARG ); - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; + 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_c_buf_p = - &yy_current_buffer->yy_ch_buf[yy_n_chars]; + 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(); + yy_current_state = yy_get_previous_state( M4_YY_CALL_ONLY_ARG ); - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; + yy_cp = YY_G(yy_c_buf_p); + yy_bp = YY_G(yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; @@ -648,15 +1502,20 @@ do_action: /* This label is used only to access EOF actions. */ "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ - } /* end of yylex */ + } /* end of user's declarations */ +} /* 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 = 1; + yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno @@ -669,41 +1528,52 @@ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; - yy_start_stack = 0; + yy_start_stack = NULL; - yy_current_buffer = 0; + yy_buffer_stack = 0; + yy_buffer_stack_top = 0; + yy_buffer_stack_max = 0; -#ifdef YY_USES_REJECT - yy_state_buf = new yy_state_type[YY_BUF_SIZE + 2]; -#else + +m4_ifdef( [[M4_YY_USES_REJECT]], +[[ + yy_state_buf = new yy_state_type[YY_STATE_BUF_SIZE]; +]], +[[ yy_state_buf = 0; -#endif - } +]]) +} +/* The contents of this function are C++ specific, so the YY_G macro is not used. + */ yyFlexLexer::~yyFlexLexer() - { - delete yy_state_buf; - yy_delete_buffer( yy_current_buffer ); - } - +{ + 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 ); - yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); + 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; @@ -726,14 +1596,17 @@ int yyFlexLexer::LexerInput( char* buf, int max_size ) 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: @@ -741,25 +1614,26 @@ void yyFlexLexer::LexerOutput( const char* buf, int size ) * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ - -%- -static int yy_get_next_buffer YY_PROTO(( void )) -%+ -int yyFlexLexer::yy_get_next_buffer YY_PROTO(( void )) -%* - { - register char *dest = yy_current_buffer->yy_ch_buf; - register char *source = yytext_ptr; - register int number_to_move, i; +%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(); + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = YY_G(yytext_ptr); + int number_to_move, i; int ret_val; - if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + 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->yy_fill_buffer == 0 ) + 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 ) + 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. @@ -779,38 +1653,39 @@ int yyFlexLexer::yy_get_next_buffer YY_PROTO(( void )) /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + 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->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + 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->yy_n_chars = yy_n_chars = 0; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = YY_G(yy_n_chars) = 0; else { - int num_to_read = - yy_current_buffer->yy_buf_size - number_to_move - 1; + yy_size_t num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ -#ifdef YY_USES_REJECT +m4_ifdef( [[M4_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; + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = - (int) (yy_c_buf_p - b->yy_ch_buf); + (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; + yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; @@ -819,8 +1694,8 @@ int yyFlexLexer::yy_get_next_buffer YY_PROTO(( void )) 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 ); + 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. */ @@ -830,35 +1705,35 @@ int yyFlexLexer::yy_get_next_buffer YY_PROTO(( void )) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); - yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + YY_G(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; - num_to_read = yy_current_buffer->yy_buf_size - + num_to_read = YY_CURRENT_BUFFER_LVALUE->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_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + YY_G(yy_n_chars), num_to_read ); - yy_current_buffer->yy_n_chars = yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = YY_G(yy_n_chars); } - if ( yy_n_chars == 0 ) + if ( YY_G(yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin ); + yyrestart( yyin M4_YY_CALL_LAST_ARG); } else { ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_buffer_status = + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } @@ -866,36 +1741,48 @@ int yyFlexLexer::yy_get_next_buffer YY_PROTO(( void )) 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; + 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_get_previous_state - get the state just before the EOB char was reached */ + YY_G(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; -%- -static yy_state_type yy_get_previous_state YY_PROTO(( void )) -%+ -yy_state_type yyFlexLexer::yy_get_previous_state YY_PROTO(( void )) -%* - { - register yy_state_type yy_current_state; - register char *yy_cp; + return ret_val; +} +]]) -%% code to get the start state into yy_current_state goes here +/* yy_get_previous_state - get the state just before the EOB char was reached */ - for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) +%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 +{ + yy_state_type yy_current_state; + 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 ) { -%% code to find the next state goes here +%% [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 @@ -903,108 +1790,112 @@ yy_state_type yyFlexLexer::yy_get_previous_state YY_PROTO(( void )) * 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 - +%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 +{ + 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 + + M4_YY_NOOP_GUTS_VAR(); 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; +%if-c-only +m4_ifdef( [[M4_YY_NO_UNPUT]],, +[[ + static void yyunput YYFARGS2( int,c, char *,yy_bp) +%endif +%if-c++-only + void yyFlexLexer::yyunput( int c, char* yy_bp) +%endif +{ + 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_hold_char; + *yy_cp = YY_G(yy_hold_char); - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + 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->yy_ch_buf[ - yy_current_buffer->yy_buf_size + 2]; - register char *source = - &yy_current_buffer->yy_ch_buf[number_to_move]; + yy_size_t number_to_move = YY_G(yy_n_chars) + 2; + char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; - while ( source > yy_current_buffer->yy_ch_buf ) + while ( source > YY_CURRENT_BUFFER_LVALUE->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; + 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->yy_ch_buf + 2 ) + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->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 */ -%* - - -%- +%% [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 YY_PROTO(( void )) + static int yyinput YYFARGS0(void) #else -static int input YY_PROTO(( void )) + static int input YYFARGS0(void) #endif -%+ -int yyFlexLexer::yyinput() -%* - { + +%endif +%if-c++-only + int yyFlexLexer::yyinput() +%endif +{ int c; + M4_YY_DECL_GUTS_VAR(); - *yy_c_buf_p = yy_hold_char; + *YY_G(yy_c_buf_p) = YY_G(yy_hold_char); - if ( *yy_c_buf_p == YY_END_OF_BUFFER_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_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + 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_c_buf_p = '\0'; + *YY_G(yy_c_buf_p) = '\0'; else { /* need more input */ - int offset = yy_c_buf_p - yytext_ptr; - ++yy_c_buf_p; + yy_size_t offset = YY_G(yy_c_buf_p) - YY_G(yytext_ptr); + ++YY_G(yy_c_buf_p); - switch ( yy_get_next_buffer() ) + switch ( yy_get_next_buffer( M4_YY_CALL_ONLY_ARG ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() @@ -1018,129 +1909,140 @@ int yyFlexLexer::yyinput() */ /* Reset buffer status. */ - yyrestart( yyin ); + yyrestart( yyin M4_YY_CALL_LAST_ARG); - /* fall through */ + /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { - if ( yywrap() ) + if ( yywrap( M4_YY_CALL_ONLY_ARG ) ) return EOF; - if ( ! yy_did_buffer_switch_on_eof ) + if ( ! YY_G(yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus - return yyinput(); + return yyinput(M4_YY_CALL_ONLY_ARG); #else - return input(); + return input(M4_YY_CALL_ONLY_ARG); #endif } case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext_ptr + offset; + YY_G(yy_c_buf_p) = YY_G(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; + 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); -%% update BOL and yylineno +%% [19.0] update BOL and yylineno return c; - } -%- +} +%if-c-only #endif /* ifndef YY_NO_INPUT */ -%* - - -%- -#ifdef YY_USE_PROTOS -void yyrestart( FILE *input_file ) -#else -void yyrestart( input_file ) -FILE *input_file; -#endif -%+ -void yyFlexLexer::yyrestart( std::istream* input_file ) -%* - { - if ( ! yy_current_buffer ) - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); +%endif - yy_init_buffer( yy_current_buffer, input_file ); - yy_load_buffer_state(); +/** 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 ); +} -%- -#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 ) +/** 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 ) + 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_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 = new_buffer; - yy_load_buffer_state(); + 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_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( std::istream* file, int size ) -%* - { + 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) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + 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()" ); @@ -1149,99 +2051,105 @@ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int 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 ); + 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 ); + 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(); -%- -#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_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) - yy_flex_free( (void *) b->yy_ch_buf ); + yyfree( (void *) b->yy_ch_buf M4_YY_CALL_LAST_ARG ); - yy_flex_free( (void *) b ); - } - - -%- -#ifndef YY_ALWAYS_INTERACTIVE -#ifndef YY_NEVER_INTERACTIVE -#include <unistd.h> -#endif -#endif + yyfree( (void *) b M4_YY_CALL_LAST_ARG ); +} -#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, std::istream* file ) -%* - - { +/* 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 ); + yy_flush_buffer( b M4_YY_CALL_LAST_ARG); b->yy_input_file = file; b->yy_fill_buffer = 1; -%- -#if defined(YY_ALWAYS_INTERACTIVE) && YY_ALWAYS_INTERACTIVE + /* 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; -#else -#if defined(YY_NEVER_INTERACTIVE) && YY_NEVER_INTERACTIVE - b->yy_is_interactive = 0; -#else - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; -#endif -#endif -%+ +]], +[[ + 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; - } - - -%- -#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 ) -%* - { +/** 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; @@ -1259,23 +2167,151 @@ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; - if ( b == yy_current_buffer ) - yy_load_buffer_state(); + 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 -#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 - { +%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 +{ + yy_size_t 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 || @@ -1283,7 +2319,7 @@ yy_size_t size; /* They forgot to leave room for the EOB's. */ return 0; - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + 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()" ); @@ -1297,60 +2333,65 @@ yy_size_t size; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; - yy_switch_to_buffer( b ); + yy_switch_to_buffer( b M4_YY_CALL_LAST_ARG ); 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 - { +} +%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 yybytes the byte buffer to scan + * @param _yybytes_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, yy_size_t ,_yybytes_len) +{ YY_BUFFER_STATE b; char *buf; yy_size_t n; - int i; + yy_size_t i; + m4_dnl M4_YY_DECL_GUTS_VAR(); /* Get memory for full buffer, including space for trailing EOB's. */ - n = len + 2; - buf = (char *) yy_flex_alloc( n ); + 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 < len; ++i ) - buf[i] = bytes[i]; + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - b = yy_scan_buffer( buf, n ); + b = yy_scan_buffer( buf, n M4_YY_CALL_LAST_ARG); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); @@ -1360,100 +2401,98 @@ int len; 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 ) +} +%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_start_stack_depth += YY_START_STACK_INCR; - new_size = yy_start_stack_depth * sizeof( int ); + YY_G(yy_start_stack_depth) += YY_START_STACK_INCR; + new_size = YY_G(yy_start_stack_depth) * sizeof( int ); - if ( ! yy_start_stack ) - yy_start_stack = (int *) yy_flex_alloc( new_size ); + if ( ! YY_G(yy_start_stack) ) + YY_G(yy_start_stack) = (int *) yyalloc( new_size M4_YY_CALL_LAST_ARG ); else - yy_start_stack = (int *) yy_flex_realloc( - (void *) yy_start_stack, new_size ); + YY_G(yy_start_stack) = (int *) yyrealloc( + (void *) YY_G(yy_start_stack), new_size M4_YY_CALL_LAST_ARG ); - if ( ! yy_start_stack ) - YY_FATAL_ERROR( - "out of memory expanding start-condition stack" ); + if ( ! YY_G(yy_start_stack) ) + YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } - yy_start_stack[yy_start_stack_ptr++] = YY_START; + YY_G(yy_start_stack)[YY_G(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); - } -#endif - - -#ifndef YY_NO_POP_STATE -%- -static void yy_pop_state YY_PROTO(( void )) -%+ -void yyFlexLexer::yy_pop_state YY_PROTO(( void )) -%* - { - if ( --yy_start_stack_ptr < 0 ) +} +]]) + + +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_start_stack[yy_start_stack_ptr]); - } -#endif - - -#ifndef YY_NO_TOP_STATE -%- -static int yy_top_state YY_PROTO(( void )) -%+ -int yyFlexLexer::yy_top_state YY_PROTO(( void )) -%* - { - return yy_start_stack[yy_start_stack_ptr - 1]; - } -#endif + 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 -%- -#ifdef YY_USE_PROTOS -static void yy_fatal_error( yyconst char msg[] ) -#else -static void yy_fatal_error( msg ) -char msg[]; -#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[] ) - { - std::cerr << msg << '\n'; +{ + M4_YY_DECL_GUTS_VAR(); + std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); - } -%* - +} +%endif /* Redefine yyless() so it works in section 3 code. */ @@ -1462,68 +2501,501 @@ void yyFlexLexer::LexerError( yyconst char msg[] ) 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; \ + 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 ) -/* Internal utility routines. */ -#ifndef yytext_ptr -#ifdef YY_USE_PROTOS -static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +/* 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 + */ +yy_size_t 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" ); + ]]) + 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" ); + ]]) + 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 -static void yy_flex_strncpy( s1, s2, n ) -char *s1; -yyconst char *s2; -int n; + yyin = (FILE *) 0; + yyout = (FILE *) 0; #endif - { - register int i; + + /* 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) +{ + int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; - } +} #endif +]]) +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ #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; +static int yy_flex_strlen YYFARGS1( yyconst char *,s) +{ + 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 - { +m4_ifdef( [[M4_YY_NO_FLEX_ALLOC]],, +[[ +void *yyalloc YYFARGS1( yy_size_t ,size) +{ 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 - { +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 @@ -1532,22 +3004,446 @@ yy_size_t size; * 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 defined(YY_MAIN) && YY_MAIN -int main() - { +} +]]) + +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. */ + 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. */ + 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. */ + 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. */ + 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" ); + }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" ); + }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" ); + }else + ((flex_int8_t *) v)[0] = (flex_int8_t) t32; + break; + default: + YY_FATAL_ERROR( "invalid dmap->dm_sz for struct" ); /* TODO: not fatal. */ + 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. */ + 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" ); + }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" ); + }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" ); + }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" ); + }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. */ + 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; - } -#endif +} +]]) + +%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/usr.bin/lex/flexdef.h index 21d04030ccf..7a0ef646522 100644 --- a/usr.bin/lex/flexdef.h +++ b/usr.bin/lex/flexdef.h @@ -1,83 +1,112 @@ -/* $OpenBSD: flexdef.h,v 1.8 2015/10/10 05:47:54 deraadt Exp $ */ +/* $OpenBSD: flexdef.h,v 1.9 2015/11/19 19:43:40 tedu Exp $ */ /* 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, 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. - */ +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ -/* @(#) $Header: /cvs/OpenBSD/src/usr.bin/lex/flexdef.h,v 1.8 2015/10/10 05:47:54 deraadt 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. */ + +/* 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. */ -#include "config.h" +/* 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. */ -#ifdef __TURBOC__ -#define HAVE_STRING_H 1 -#define MS_DOS 1 -#ifndef __STDC__ -#define __STDC__ 1 +/* 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 FLEXDEF_H +#define FLEXDEF_H 1 + +#ifdef HAVE_CONFIG_H +#include <config.h> #endif - #pragma warn -pro - #pragma warn -rch - #pragma warn -use - #pragma warn -aus - #pragma warn -par - #pragma warn -pia + +/* 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 HAVE_STRING_H +#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 -#include <strings.h> +#define assert(Pred) #endif -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> +#ifdef HAVE_LIMITS_H +#include <limits.h> #endif - -#ifdef STDC_HEADERS -#include <stdlib.h> +#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 -#ifdef HAVE_MALLOC_H -#include <malloc.h> +#define bool int +#define true 1 +#define false 0 #endif +#ifdef HAVE_REGEX_H +#include <regex.h> #endif - - -/* As an aid for the internationalization patch to flex, which - * is maintained outside this distribution for copyright reasons. - */ -#define _(String) (String) +#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 @@ -89,7 +118,7 @@ #endif #ifndef PROTO -#ifdef __STDC__ +#if defined(__STDC__) #define PROTO(proto) proto #else #define PROTO(proto) () @@ -127,12 +156,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. */ @@ -198,10 +223,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 @@ -219,15 +244,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 @@ -243,7 +269,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: @@ -255,7 +281,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. */ @@ -297,7 +323,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 @@ -323,30 +349,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 @@ -357,8 +359,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 @@ -372,6 +374,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(). @@ -393,10 +398,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; @@ -409,7 +417,6 @@ extern int yymore_really_used, reject_really_used; * dataline - number of contiguous lines of data in current data * statement. Used to generate readable -f output * linenum - current input line number - * out_linenum - current output line number * skelfile - the skeleton file * skel - compiled-in skeleton array * skel_ind - index into "skel" array, if skelfile is nil @@ -417,6 +424,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 @@ -424,7 +432,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 @@ -436,13 +444,13 @@ extern int yymore_really_used, reject_really_used; * to "action_array" */ -extern int datapos, dataline, linenum, out_linenum; +extern int datapos, dataline, 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; @@ -466,6 +474,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 @@ -492,13 +501,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(). @@ -609,12 +623,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; @@ -661,12 +675,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 ) ) @@ -674,6 +688,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 * ) ) @@ -718,340 +738,490 @@ 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 ((char *)); /* True if a string is all upper case. */ -extern int all_upper PROTO((register char *)); +extern int all_upper PROTO ((char *)); -/* Bubble sort an integer array. */ -extern void bubble PROTO((int [], int)); +/* Compare two integers for use by qsort. */ +extern int intcmp PROTO ((const void *, const void *)); /* 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 ((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 ((Char *)); -/* Shell sort a character array. */ -extern void cshell PROTO((Char [], int, int)); +/* Compare two characters for use by qsort with '\0' sorting last. */ +extern int cclcmp PROTO ((const void *, const void *)); /* 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 *)); + +/* Like lerrsf, but also exit after displaying message. */ +extern void lerrsf_fatal 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_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 ((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/usr.bin/lex/flexint.h b/usr.bin/lex/flexint.h new file mode 100644 index 00000000000..aa761347506 --- /dev/null +++ b/usr.bin/lex/flexint.h @@ -0,0 +1,65 @@ +/* $OpenBSD: flexint.h,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* 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; + +/* 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 /* ! C99 */ + +#endif /* ! FLEXINT_H */ diff --git a/usr.bin/lex/gen.c b/usr.bin/lex/gen.c index 3f1f86dfdd4..e7af1658439 100644 --- a/usr.bin/lex/gen.c +++ b/usr.bin/lex/gen.c @@ -1,52 +1,51 @@ -/* $OpenBSD: gen.c,v 1.11 2004/02/03 21:20:17 espie Exp $ */ +/* $OpenBSD: gen.c,v 1.12 2015/11/19 19:43:40 tedu Exp $ */ /* 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, 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. - */ +/* 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. */ -/* $Header: /cvs/OpenBSD/src/usr.bin/lex/gen.c,v 1.11 2004/02/03 21:20:17 espie Exp $ */ +/* 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((char [], char [])); -void indent_puts PROTO((char [])); +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 */ +static int indent_level = 0; /* each level is 8 spaces */ #define indent_up() (++indent_level) #define indent_down() (--indent_level) @@ -57,94 +56,292 @@ static int indent_level = 0; /* each level is 8 spaces */ * 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"; +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() - { +void do_indent () +{ int i = indent_level * 8; - while ( i >= 8 ) - { - outc( '\t' ); + while (i >= 8) { + outc ('\t'); i -= 8; - } + } - while ( i > 0 ) - { - outc( ' ' ); + 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 ) +void gen_backing_up () +{ + if (reject || num_backing_up == 0) return; - if ( fullspd ) - indent_puts( "if ( yy_current_state[-1].yy_nxt )" ); + if (fullspd) + indent_puts ("if ( yy_current_state[-1].yy_nxt )"); else - indent_puts( "if ( yy_accept[yy_current_state] )" ); + 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(); - } + 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 ) +void gen_bu_action () +{ + if (reject || num_backing_up == 0) return; - set_indent( 3 ); + 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;" ); + 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_last_accepting_cpos + 1;" ); + 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_last_accepting_cpos;" ); + indent_puts ("yy_cp = YY_G(yy_last_accepting_cpos);"); - indent_puts( "yy_current_state = yy_last_accepting_state;" ); - indent_puts( "goto yy_find_action;" ); - outc( '\n' ); + 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) +{ + 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. + */ - set_indent( 0 ); + 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() - { +void genctbl () +{ int i; - int end_of_buffer_action = num_rules + 1; + 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( " {" ); + 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 @@ -164,16 +361,16 @@ void genctbl() * there's room for jam entries for other characters. */ - while ( tblend + 2 >= current_max_xpairs ) - expand_nxt_chk(); + while (tblend + 2 >= current_max_xpairs) + expand_nxt_chk (); - while ( lastdfa + 1 >= current_max_dfas ) - increase_max_dfas(); + 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 */ + chk[tblend + 2] = 1; /* anything but EOB */ /* So that "make test" won't show arb. differences. */ nxt[tblend + 2] = 0; @@ -181,291 +378,353 @@ void genctbl() /* 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]; + 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 ); + 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] == ACTION_POSITION) + transition_struct_out (0, nxt[i]); - else if ( chk[i] > numecs || chk[i] == 0 ) - transition_struct_out( 0, 0 ); /* unused slot */ + 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]) ); - } + 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] ); + transition_struct_out (chk[tblend + 1], nxt[tblend + 1]); + transition_struct_out (chk[tblend + 2], nxt[tblend + 2]); - outn( " };\n" ); + if (gentables) + 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 */ + 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. */ - for ( i = 0; i <= lastsc * 2; ++i ) - out_dec( " &yy_transition[%d],\n", base[i] ); +struct yytbl_data *mkecstbl (void) +{ + 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; - dataend(); + tbl->td_data = tdata = + (flex_int32_t *) calloc (tbl->td_lolen, sizeof (flex_int32_t)); - if ( useecs ) - genecs(); + 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() - { +void genecs () +{ int i, j; - int numrows; + int numrows; - out_str_dec( C_int_decl, "yy_ec", csize ); + out_str_dec (get_int32_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] ); - } + for (i = 1; i < csize; ++i) { + ecgroup[i] = ABS (ecgroup[i]); + mkdata (ecgroup[i]); + } - dataend(); + dataend (); - if ( trace ) - { - fputs( _( "\n\nEquivalence Classes:\n\n" ), stderr ); + 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] ); + 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 ); + 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 ) - { +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_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;" ); + 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);"); } - else - { + 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_full_match = yy_cp;" ); - indent_puts( "break;" ); - indent_puts( "}" ); - indent_down(); - } + 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 ("}"); + indent_down (); - indent_puts( "--yy_cp;" ); + 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 ("yy_current_state = *--YY_G(yy_state_ptr);"); + indent_puts ("YY_G(yy_lp) = yy_accept[yy_current_state];"); - indent_puts( "}" ); + indent_puts ("}"); - indent_down(); - } + indent_down (); + } - else - { /* compressed */ - indent_puts( "yy_act = yy_accept[yy_current_state];" ); + else { /* compressed */ + indent_puts ("yy_act = yy_accept[yy_current_state];"); - if ( interactive && ! reject ) - { + 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(); - } + 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) +{ + 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) { + 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() - { +void genftbl () +{ int i; - int end_of_buffer_action = num_rules + 1; + int end_of_buffer_action = num_rules + 1; - out_str_dec( long_align ? C_long_decl : C_short_decl, - "yy_accept", lastdfa + 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 ) - { + for (i = 1; i <= lastdfa; ++i) { int anum = dfaacc[i].dfaacc_state; - mkdata( anum ); + mkdata (anum); - if ( trace && anum ) - fprintf( stderr, _( "state # %d accepts: [%d]\n" ), - i, anum ); - } + if (trace && anum) + fprintf (stderr, _("state # %d accepts: [%d]\n"), + i, anum); + } - dataend(); + dataend (); - if ( useecs ) - genecs(); + 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 ); +void gen_next_compressed_state (char_map) + char *char_map; +{ + indent_put2s ("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(); + 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];" ); + 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 ) - { + 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 @@ -473,328 +732,332 @@ char *char_map; * about erroneously looking up the meta-equivalence * class twice */ - do_indent(); + do_indent (); /* lastdfa + 2 is the beginning of the templates */ - out_dec( "if ( yy_current_state >= %d )\n", lastdfa + 2 ); + 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_up (); + indent_puts ("yy_c = yy_meta[(unsigned int) yy_c];"); + indent_down (); + } - indent_puts( "}" ); - indent_down(); + indent_puts ("}"); + indent_down (); - indent_puts( -"yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];" ); - } + 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() - { +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' ); - } + char *char_map = useecs ? + "yy_ec[YY_SC_TO_UI(*yy_cp)] " : "YY_SC_TO_UI(*yy_cp)"; - indent_puts( "++yy_cp;" ); + char *char_map_2 = useecs ? + "yy_ec[YY_SC_TO_UI(*++yy_cp)] " : "YY_SC_TO_UI(*++yy_cp)"; - if ( num_backing_up > 0 ) - /* { for vi */ - indent_puts( "}" ); + 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_down(); + indent_up (); - outc( '\n' ); - indent_puts( "yy_current_state = -yy_current_state;" ); + if (num_backing_up > 0) { + indent_puts ("{"); + gen_backing_up (); + outc ('\n'); } - 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_puts ("++yy_cp;"); - indent_down(); /* { for vi */ - indent_puts( "}" ); + 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 + ("yyconst struct yy_trans_info *yy_trans_info;\n"); + indent_puts ("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 ("}"); } - else - { /* compressed */ - indent_puts( "do" ); + indent_down (); + indent_puts ("}"); + } + + else { /* compressed */ + indent_puts ("do"); + + indent_up (); + indent_puts ("{"); - indent_up(); - indent_puts( "{" ); /* } for vi */ + gen_next_state (false); - gen_next_state( false ); + indent_puts ("++yy_cp;"); - indent_puts( "++yy_cp;" ); - /* { for vi */ - indent_puts( "}" ); - indent_down(); + indent_puts ("}"); + indent_down (); - do_indent(); + do_indent (); - if ( interactive ) - out_dec( "while ( yy_base[yy_current_state] != %d );\n", - jambase ); + if (interactive) + out_dec ("while ( yy_base[yy_current_state] != %d );\n", jambase); else - out_dec( "while ( yy_current_state != %d );\n", - jamstate ); + out_dec ("while ( yy_current_state != %d );\n", + jamstate); - if ( ! reject && ! interactive ) - { + 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;" ); - } + 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 ) - (void) snprintf( char_map, sizeof char_map, - "(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : %d)", - NUL_ec ); +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 - (void) snprintf( char_map, sizeof char_map, - "(*yy_cp ? YY_SC_TO_UI(*yy_cp) : %d)", NUL_ec ); - } + snprintf (char_map, sizeof(char_map), + "(*yy_cp ? YY_SC_TO_UI(*yy_cp) : %d)", + NUL_ec); + } else - strlcpy( char_map, useecs ? - "yy_ec[YY_SC_TO_UI(*yy_cp)]" : "YY_SC_TO_UI(*yy_cp)", - sizeof char_map ); + strlcpy (char_map, useecs ? + "yy_ec[YY_SC_TO_UI(*yy_cp)] " : "YY_SC_TO_UI(*yy_cp)", + sizeof char_map ); - if ( worry_about_NULs && nultrans ) - { - if ( ! fulltbl && ! fullspd ) + if (worry_about_NULs && nultrans) { + if (!fulltbl && !fullspd) /* Compressed tables back up *before* they match. */ - gen_backing_up(); + gen_backing_up (); - indent_puts( "if ( *yy_cp )" ); - indent_up(); - indent_puts( "{" ); /* } for vi */ - } + indent_puts ("if ( *yy_cp )"); + indent_up (); + indent_puts ("{"); + } - if ( fulltbl ) - indent_put2s( - "yy_current_state = yy_nxt[yy_current_state][%s];", - char_map ); + 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 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(); - } + gen_next_compressed_state (char_map); - if ( fullspd || fulltbl ) - gen_backing_up(); + if (worry_about_NULs && nultrans) { - if ( reject ) - indent_puts( "*yy_state_ptr++ = yy_current_state;" ); + 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() */ +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); + int need_backing_up = (num_backing_up > 0 && !reject); - if ( need_backing_up && (! nultrans || fullspd || fulltbl) ) + 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;" ); + indent_puts ("char *yy_cp = YY_G(yy_c_buf_p);"); - outc( '\n' ); + outc ('\n'); - if ( nultrans ) - { - indent_puts( - "yy_current_state = yy_NUL_trans[yy_current_state];" ); - indent_puts( "yy_is_jam = (yy_current_state == 0);" ); - } + 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 (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 ); + else if (fullspd) { + do_indent (); + out_dec ("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 + ("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);" ); - } + indent_puts + ("yy_is_jam = (yy_trans_info->yy_verify != yy_c);"); + } - else - { - char NUL_ec_str[20]; + else { + char NUL_ec_str[20]; - (void) snprintf( NUL_ec_str, sizeof NUL_ec_str, "%d", NUL_ec ); - gen_next_compressed_state( NUL_ec_str ); + 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 ); + do_indent (); + out_dec ("yy_is_jam = (yy_current_state == %d);\n", + jamstate); - if ( reject ) - { + 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(); - } + 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(); - } + 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];" ); +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_start;" ); + else { + indent_puts ("yy_current_state = YY_G(yy_start);"); - if ( bol_needed ) - indent_puts( "yy_current_state += YY_AT_BOL();" ); + if (bol_needed) + indent_puts ("yy_current_state += YY_AT_BOL();"); - if ( reject ) - { + if (reject) { /* Set up for storing up states. */ - indent_puts( "yy_state_ptr = yy_state_buf;" ); - indent_puts( "*yy_state_ptr++ = yy_current_state;" ); - } + 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; - - acc_array = allocate_integer_array( current_max_dfas ); +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", @@ -804,91 +1067,113 @@ void gentabs() */ ++num_backing_up; - if ( reject ) - { + 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]; + 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 ) - { + 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 ) - { + if (accsiz[i] != 0) { accset = dfaacc[i].dfaacc_set; nacc = accsiz[i]; - if ( trace ) - fprintf( stderr, - _( "state # %d accepts: " ), - i ); + if (trace) + fprintf (stderr, + _("state # %d accepts: "), + i); - for ( k = 1; k <= nacc; ++k ) - { - int accnum = accset[k]; + 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 ) - { + 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 ); + mkdata (accnum); + yyacclist_data[yyacclist_curr++] = accnum; - if ( trace ) - { - fprintf( stderr, "[%d]", - accset[k] ); + if (trace) { + fprintf (stderr, "[%d]", + accset[k]); - if ( k < nacc ) - fputs( ", ", stderr ); + if (k < nacc) + fputs (", ", + stderr); else - putc( '\n', stderr ); - } + putc ('\n', + stderr); } } } + } /* add accepting number for the "jam" state */ acc_array[i] = j; - dataend(); - } + 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; + else { + dfaacc[end_of_buffer_state].dfaacc_state = + end_of_buffer_action; - for ( i = 1; i <= lastdfa; ++i ) + 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 @@ -900,7 +1185,7 @@ void gentabs() */ k = lastdfa + 2; - if ( reject ) + 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 @@ -908,240 +1193,391 @@ void gentabs() */ ++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] ); - } + 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] ); + mkdata (acc_array[i]); + yyacc_data[yyacc_curr++] = acc_array[i]; - if ( reject ) + if (reject) { /* Add "cap" for the list. */ - mkdata( acc_array[i] ); + mkdata (acc_array[i]); + yyacc_data[yyacc_curr++] = acc_array[i]; + } - dataend(); + 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; - if ( useecs ) - genecs(); + 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 ) - { + 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]); + } - 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(); + 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; - 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 ) - { + /* 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) { int d = def[i]; - if ( base[i] == JAMSTATE ) + if (base[i] == JAMSTATE) base[i] = jambase; - if ( d == JAMSTATE ) + if (d == JAMSTATE) def[i] = jamstate; - else if ( d < 0 ) - { + else if (d < 0) { /* Template reference. */ ++tmpuses; def[i] = lastdfa - d + 1; - } - - mkdata( base[i] ); } + mkdata (base[i]); + yybase_data[yybase_curr++] = base[i]; + } + /* Generate jam state's base index. */ - mkdata( base[i] ); + mkdata (base[i]); + yybase_data[yybase_curr++] = base[i]; - for ( ++i /* skip jam state */; i <= total_states; ++i ) - { - mkdata( base[i] ); + for (++i /* skip jam state */ ; i <= total_states; ++i) { + mkdata (base[i]); + yybase_data[yybase_curr++] = base[i]; def[i] = jamstate; - } + } - dataend(); + 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 */ - 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] ); + /* Begin generating yy_nxt */ + out_str_dec ((total_states >= INT16_MAX || long_align) ? + get_int32_decl () : get_int16_decl (), "yy_nxt", + tblend + 1); - dataend(); + 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"); - out_str_dec( (total_states >= MAX_SHORT || long_align) ? - C_long_decl : C_short_decl, - "yy_nxt", tblend + 1 ); + 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 ) - { + 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 ) + 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 ); + mkdata (nxt[i]); + yynxt_data[i] = nxt[i]; + } - for ( i = 1; i <= tblend; ++i ) - { - if ( chk[i] == 0 ) + 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] ); - } + mkdata (chk[i]); + yychk_data[i] = chk[i]; + } - dataend(); - free(acc_array); + 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 ) -char fmt[], arg[]; - { - do_indent(); - out_str( fmt, arg ); - outn( "" ); - } +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 ) -char str[]; - { - do_indent(); - outn( str ); - } +void indent_puts (str) + const char *str; +{ + do_indent (); + outn (str); +} /* make_tables - generate transition tables and finishes generating output file */ -void make_tables() - { +void make_tables () +{ int i; - int did_eof_rule = false; + int did_eof_rule = false; + struct yytbl_data *yynultrans_tbl; + - skelout(); + skelout (); /* %% [2.0] - break point in skel */ /* First, take care of YY_DO_BEFORE_ACTION depending on yymore * being used. */ - set_indent( 1 ); + set_indent (1); - if ( yymore_used && ! yytext_is_array ) - { - indent_puts( "yytext_ptr -= yy_more_len; \\" ); - indent_puts( "yyleng = (int) (yy_cp - yytext_ptr); \\" ); - } + 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 = (int) (yy_cp - yy_bp); \\" ); + indent_puts ("yyleng = (size_t) (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 ) \\" ); + 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_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 ); \\" ); - } + 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); - set_indent( 0 ); + skelout (); /* %% [4.0] - break point in skel */ - skelout(); + /* 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 ); + out_dec ("#define YY_NUM_RULES %d\n", num_rules); + out_dec ("#define YY_END_OF_BUFFER %d\n", num_rules + 1); - if ( fullspd ) - { + 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;" ); + 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 @@ -1151,484 +1587,585 @@ void make_tables() * for that state. */ - indent_put2s( "%s yy_nxt;", trans_offset_type ); - indent_puts( "};" ); - indent_down(); - } + 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(); - else if ( fulltbl ) - genftbl(); + 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(); + 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 ) - { - indent_puts( - "static yy_state_type yy_last_accepting_state;" ); - indent_puts( - "static char *yy_last_accepting_cpos;\n" ); - } + 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 ) - { - 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] ); + 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]; } - - 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" ); + else { + mkdata (nultrans[i]); + yynultrans_data[i] = nultrans[i]; } + } - 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(); + 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 ( 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 (!C_plus_plus && !reentrant) { + indent_puts ("extern int yy_flex_debug;"); + indent_put2s ("int yy_flex_debug = %s;\n", + ddebug ? "1" : "0"); + } - 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;" ); - } + 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 (); + } - 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 ); - } + 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;"); + } - 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 */ \\" ); + 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;"); } - outn( "++yy_lp; \\" ); - outn( "goto find_rule; \\" ); - /* { for vi */ - outn( "}" ); + 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); } - 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" ); + 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 */ \\"); } - 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;" ); - } - } + outn ("++YY_G(yy_lp); \\"); + outn ("goto find_rule; \\"); + + outn ("}"); + outn ("]])\n"); + } - 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 { + 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 - { - 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 if (!reentrant) { + indent_puts + ("static int yy_more_flag = 0;"); + indent_puts + ("static int yy_more_len = 0;"); } } - 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 (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 (); } - - 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;" ); + 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"); } + } - out( &action_array[defs1_offset] ); - - line_directive_out( stdout, 0 ); + 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"); + } - skelout(); + 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;"); + } + } - 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 { + if(! reentrant) + outn ("char *yytext;"); + } + } - 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\" );" ); - } + 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}\\"); } - 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(); + else { + outn ("\tif ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \\"); + outn ("\t\t{ \\"); + outn ("\t\tint c = '*'; \\"); + outn ("\t\tsize_t 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}\\"); } - indent_puts( "YY_USER_ACTION" ); - indent_down(); + } + + 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(); + skelout (); /* %% [7.0] - break point in skel */ /* Copy prolog to output file. */ - out( &action_array[prolog_offset] ); + out (&action_array[prolog_offset]); - line_directive_out( stdout, 0 ); + line_directive_out (stdout, 0); - skelout(); + skelout (); /* %% [8.0] - break point in skel */ - set_indent( 2 ); + 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(); - } + 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(); + skelout (); /* %% [9.0] - break point in skel */ - gen_start_state(); + 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(); + 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 ("yy_size_t 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\","); - 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 ? - "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 %d (\\\"%s\\\")\\n\"," ); - - indent_puts( - " yy_rule_linenum[yy_act], yytext );" ); - } + indent_puts + (" (long)yy_rule_linenum[yy_act], yytext );"); + } - indent_down(); + indent_down (); - do_indent(); - out_dec( "else if ( yy_act == %d )\n", num_rules ); - indent_up(); + 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 );" ); - } + 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(); + indent_down (); - do_indent(); - out_dec( "else if ( yy_act == %d )\n", num_rules + 1 ); - indent_up(); + 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_puts (C_plus_plus ? + "std::cerr << \"--(end of buffer or a NUL)\\n\";" : + "fprintf( stderr, \"--(end of buffer or a NUL)\\n\" );"); - indent_down(); + indent_down (); - do_indent(); - outn( "else" ); - indent_up(); + 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 );" ); - } + 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_down (); - indent_puts( "}" ); - indent_down(); - } + indent_puts ("}"); + indent_down (); + } /* Copy actions to output file. */ - skelout(); - indent_up(); - gen_bu_action(); - out( &action_array[action_offset] ); + skelout (); /* %% [13.0] - break point in skel */ + indent_up (); + gen_bu_action (); + out (&action_array[action_offset]); - line_directive_out( stdout, 0 ); + 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] ); + 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(); } + 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 ); + skelout (); /* %% [14.0] - break point in skel */ + set_indent (4); - if ( fullspd || fulltbl ) - indent_puts( "yy_cp = yy_c_buf_p;" ); + if (fullspd || fulltbl) + indent_puts ("yy_cp = YY_G(yy_c_buf_p);"); - else - { /* compressed table */ - if ( ! reject && ! interactive ) - { + 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;" ); - } + 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_c_buf_p;" ); - } + indent_puts ("yy_cp = YY_G(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(); - } + 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); - skelout(); + 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->yy_at_bol = (c == '\\n');" ); - if ( do_yylineno ) - { - indent_puts( "if ( yy_current_buffer->yy_at_bol )" ); - indent_up(); - indent_puts( "++yylineno;" ); - indent_down(); - } + 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( "++yylineno;" ); - indent_down(); - } + else if (do_yylineno) { + indent_puts ("if ( c == '\\n' )"); + indent_up (); + indent_puts ("M4_YY_INCR_LINENO();"); + indent_down (); + } - skelout(); + skelout (); /* Copy remainder of input to output. */ - line_directive_out( stdout, 1 ); + line_directive_out (stdout, 1); - if ( sectnum == 3 ) - (void) flexscan(); /* copy remainder of input to output */ + if (sectnum == 3) { + OUT_BEGIN_CODE (); + (void) flexscan (); /* copy remainder of input to output */ + OUT_END_CODE (); } +} diff --git a/usr.bin/lex/gettext.h b/usr.bin/lex/gettext.h new file mode 100644 index 00000000000..a4322379a5d --- /dev/null +++ b/usr.bin/lex/gettext.h @@ -0,0 +1,61 @@ +/* $OpenBSD: gettext.h,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* 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/usr.bin/lex/initparse.c b/usr.bin/lex/initparse.c new file mode 100644 index 00000000000..c7c457b9648 --- /dev/null +++ b/usr.bin/lex/initparse.c @@ -0,0 +1,3223 @@ +/* $OpenBSD: initparse.c,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* A Bison parser, made by GNU Bison 2.5. */ + +/* Bison implementation for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.5" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Copy the first part of user declarations. */ + +/* Line 268 of yacc.c */ +#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 + + + +/* Line 268 of yacc.c */ +#line 155 "parse.c" + +/* 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 + + +/* 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_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + +/* Copy the second part of user declarations. */ + + +/* Line 343 of yacc.c */ +#line 291 "parse.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int yyi) +#else +static int +YYID (yyi) + int yyi; +#endif +{ + return yyi; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include <alloca.h> /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include <malloc.h> /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +# define YYCOPY_NEEDED 1 + +/* 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_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* 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 yytype_uint8 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 yytype_uint16 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 yytype_int8 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 yytype_uint16 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, 742, + 752, 755, 758, 773, 774, 775, 780, 782, 789, 849, + 867, 875, 883, 884, 885, 886, 887, 888, 889, 894, + 895, 896, 897, 898, 904, 905, 906, 907, 908, 909, + 910, 911, 912, 913, 914, 920, 928, 944 +}; +#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 yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 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 yytype_uint8 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 yytype_uint8 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 reduction number in state STATE-NUM. + Performed when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 3, 0, 0, 1, 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 yytype_int8 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 yytype_int16 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 yytype_int16 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 YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -27 +static const yytype_int16 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 +}; + +#define yypact_value_is_default(yystate) \ + ((yystate) == (-52)) + +#define yytable_value_is_error(yytable_value) \ + YYID (0) + +static const yytype_int8 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 yytype_uint8 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. However, + YYFAIL appears to be in use. Nevertheless, it is formally deprecated + in Bison 2.4.2's NEWS entry, where a plan to phase it out is + discussed. */ + +#define YYFAIL goto yyerrlab +#if defined YYFAIL + /* This is here to suppress warnings from the GCC cpp's + -Wunused-macros. Normally we don't worry about that warning, but + some users do, and we want to make it easy for users to remove + YYFAIL uses, which will produce warnings from Bison 2.5. */ +#endif + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* This macro is provided for backward compatibility. */ + +#ifndef YY_LOCATION_PRINT +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +#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 (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +#else +static void +yy_reduce_print (yyvsp, yyrule) + YYSTYPE *yyvsp; + int yyrule; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message + about the unexpected token YYTOKEN for the state stack whose top is + YYSSP. + + Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is + not large enough to hold the message. In that case, also set + *YYMSG_ALLOC to the required number of bytes. Return 2 if the + required number of bytes is too large to store. */ +static int +yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, + yytype_int16 *yyssp, int yytoken) +{ + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + /* Internationalized format string. */ + const char *yyformat = 0; + /* Arguments of yyformat. */ + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + /* Number of reported tokens (one for the "unexpected", one per + "expected"). */ + int yycount = 0; + + /* There are many possibilities here to consider: + - Assume YYFAIL is not used. It's too flawed to consider. See + <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html> + for details. YYERROR is fine as it does not invoke this + function. + - If this state is a consistent state with a default action, then + the only way this function was invoked is if the default action + is an error action. In that case, don't check for expected + tokens because there are none. + - The only way there can be no lookahead present (in yychar) is if + this state is a consistent state with a default action. Thus, + detecting the absence of a lookahead is sufficient to determine + that there is no unexpected or expected token to report. In that + case, just report a simple "syntax error". + - Don't assume there isn't a lookahead just because this state is a + consistent state with a default action. There might have been a + previous inconsistent state, consistent state with a non-default + action, or user semantic action that manipulated yychar. + - Of course, the expected token list depends on states to have + correct lookahead information, and it depends on the parser not + to perform extra reductions after fetching a lookahead from the + scanner and before detecting a syntax error. Thus, state merging + (from LALR or IELR) and default reductions corrupt the expected + token list. However, the list is correct for canonical LR with + one exception: it will still contain any token that will not be + accepted due to an error action in a later state. + */ + if (yytoken != YYEMPTY) + { + int yyn = yypact[*yyssp]; + yyarg[yycount++] = yytname[yytoken]; + if (!yypact_value_is_default (yyn)) + { + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. In other words, skip the first -YYN actions for + this state because they are default actions. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yyx; + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR + && !yytable_value_is_error (yytable[yyx + yyn])) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + if (! (yysize <= yysize1 + && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + } + } + + switch (yycount) + { +# define YYCASE_(N, S) \ + case N: \ + yyformat = S; \ + break + YYCASE_(0, YY_("syntax error")); + YYCASE_(1, YY_("syntax error, unexpected %s")); + YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); + YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); + YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); + YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); +# undef YYCASE_ + } + + yysize1 = yysize + yystrlen (yyformat); + if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + + if (*yymsg_alloc < yysize) + { + *yymsg_alloc = 2 * yysize; + if (! (yysize <= *yymsg_alloc + && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) + *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; + return 1; + } + + /* 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 = *yyformat) != '\0') + if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyformat += 2; + } + else + { + yyp++; + yyformat++; + } + } + return 0; +} +#endif /* YYERROR_VERBOSE */ + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + YYUSE (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 lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + `yyss': related to states. + `yyvs': related to semantic values. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yytoken = 0; + yyss = yyssa; + yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + 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; + yytype_int16 *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; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, 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)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead 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 (yytable_value_is_error (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + 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 1806 of yacc.c */ +#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 1806 of yacc.c */ +#line 148 "parse.y" + { /* initialize for processing rules */ + + /* Create default DFA start condition. */ + scinstal( "INITIAL", false ); + } + break; + + case 7: + +/* Line 1806 of yacc.c */ +#line 159 "parse.y" + { synerr( _("unknown error processing section 1") ); } + break; + + case 8: + +/* Line 1806 of yacc.c */ +#line 163 "parse.y" + { + check_options(); + scon_stk = allocate_integer_array( lastsc + 1 ); + scon_stk_ptr = 0; + } + break; + + case 9: + +/* Line 1806 of yacc.c */ +#line 171 "parse.y" + { xcluflg = false; } + break; + + case 10: + +/* Line 1806 of yacc.c */ +#line 174 "parse.y" + { xcluflg = true; } + break; + + case 11: + +/* Line 1806 of yacc.c */ +#line 178 "parse.y" + { scinstal( nmstr, xcluflg ); } + break; + + case 12: + +/* Line 1806 of yacc.c */ +#line 181 "parse.y" + { scinstal( nmstr, xcluflg ); } + break; + + case 13: + +/* Line 1806 of yacc.c */ +#line 184 "parse.y" + { synerr( _("bad start condition list") ); } + break; + + case 17: + +/* Line 1806 of yacc.c */ +#line 195 "parse.y" + { + outfilename = copy_string( nmstr ); + did_outfilename = 1; + } + break; + + case 18: + +/* Line 1806 of yacc.c */ +#line 200 "parse.y" + { extra_type = copy_string( nmstr ); } + break; + + case 19: + +/* Line 1806 of yacc.c */ +#line 202 "parse.y" + { prefix = copy_string( nmstr ); } + break; + + case 20: + +/* Line 1806 of yacc.c */ +#line 204 "parse.y" + { yyclass = copy_string( nmstr ); } + break; + + case 21: + +/* Line 1806 of yacc.c */ +#line 206 "parse.y" + { headerfilename = copy_string( nmstr ); } + break; + + case 22: + +/* Line 1806 of yacc.c */ +#line 208 "parse.y" + { tablesext = true; tablesfilename = copy_string( nmstr ); } + break; + + case 23: + +/* Line 1806 of yacc.c */ +#line 212 "parse.y" + { scon_stk_ptr = (yyvsp[(2) - (5)]); } + break; + + case 24: + +/* Line 1806 of yacc.c */ +#line 214 "parse.y" + { scon_stk_ptr = (yyvsp[(2) - (5)]); } + break; + + case 26: + +/* Line 1806 of yacc.c */ +#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 1806 of yacc.c */ +#line 232 "parse.y" + { + pat = (yyvsp[(2) - (2)]); + 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 1806 of yacc.c */ +#line 268 "parse.y" + { + pat = (yyvsp[(1) - (1)]); + 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 1806 of yacc.c */ +#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 1806 of yacc.c */ +#line 315 "parse.y" + { synerr( _("unrecognized rule") ); } + break; + + case 31: + +/* Line 1806 of yacc.c */ +#line 319 "parse.y" + { (yyval) = scon_stk_ptr; } + break; + + case 32: + +/* Line 1806 of yacc.c */ +#line 323 "parse.y" + { (yyval) = (yyvsp[(2) - (4)]); } + break; + + case 33: + +/* Line 1806 of yacc.c */ +#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 1806 of yacc.c */ +#line 343 "parse.y" + { (yyval) = scon_stk_ptr; } + break; + + case 37: + +/* Line 1806 of yacc.c */ +#line 351 "parse.y" + { synerr( _("bad start condition list") ); } + break; + + case 38: + +/* Line 1806 of yacc.c */ +#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 1806 of yacc.c */ +#line 378 "parse.y" + { + if ( transchar[lastst[(yyvsp[(2) - (2)])]] != SYM_EPSILON ) + /* Provide final transition \now/ so it + * will be marked as a trailing context + * state. + */ + (yyvsp[(2) - (2)]) = link_machines( (yyvsp[(2) - (2)]), + mkstate( SYM_EPSILON ) ); + + mark_beginning_as_normal( (yyvsp[(2) - (2)]) ); + 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) - (2)]), + num_rules | YY_TRAILING_HEAD_MASK ); + variable_trail_rule = true; + } + + else + trailcnt = rulelen; + + (yyval) = link_machines( (yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]) ); + } + break; + + case 40: + +/* Line 1806 of yacc.c */ +#line 434 "parse.y" + { synerr( _("trailing context used twice") ); } + break; + + case 41: + +/* Line 1806 of yacc.c */ +#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) - (2)]), + num_rules | YY_TRAILING_HEAD_MASK ); + variable_trail_rule = true; + } + + trlcontxt = true; + + eps = mkstate( SYM_EPSILON ); + (yyval) = link_machines( (yyvsp[(1) - (2)]), + link_machines( eps, mkstate( '\n' ) ) ); + } + break; + + case 42: + +/* Line 1806 of yacc.c */ +#line 480 "parse.y" + { + (yyval) = (yyvsp[(1) - (1)]); + + 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 1806 of yacc.c */ +#line 498 "parse.y" + { + varlength = true; + (yyval) = mkor( (yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]) ); + } + break; + + case 44: + +/* Line 1806 of yacc.c */ +#line 504 "parse.y" + { (yyval) = (yyvsp[(1) - (1)]); } + break; + + case 45: + +/* Line 1806 of yacc.c */ +#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) - (2)]); + } + break; + + case 46: + +/* Line 1806 of yacc.c */ +#line 536 "parse.y" + { + /* This is where concatenation of adjacent patterns + * gets done. + */ + (yyval) = link_machines( (yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]) ); + } + break; + + case 47: + +/* Line 1806 of yacc.c */ +#line 544 "parse.y" + { (yyval) = (yyvsp[(1) - (1)]); } + break; + + case 48: + +/* Line 1806 of yacc.c */ +#line 547 "parse.y" + { + varlength = true; + + if ( (yyvsp[(3) - (6)]) > (yyvsp[(5) - (6)]) || (yyvsp[(3) - (6)]) < 0 ) + { + synerr( _("bad iteration values") ); + (yyval) = (yyvsp[(1) - (6)]); + } + else + { + if ( (yyvsp[(3) - (6)]) == 0 ) + { + if ( (yyvsp[(5) - (6)]) <= 0 ) + { + synerr( + _("bad iteration values") ); + (yyval) = (yyvsp[(1) - (6)]); + } + else + (yyval) = mkopt( + mkrep( (yyvsp[(1) - (6)]), 1, (yyvsp[(5) - (6)]) ) ); + } + else + (yyval) = mkrep( (yyvsp[(1) - (6)]), (yyvsp[(3) - (6)]), (yyvsp[(5) - (6)]) ); + } + } + break; + + case 49: + +/* Line 1806 of yacc.c */ +#line 575 "parse.y" + { + varlength = true; + + if ( (yyvsp[(3) - (5)]) <= 0 ) + { + synerr( _("iteration value must be positive") ); + (yyval) = (yyvsp[(1) - (5)]); + } + + else + (yyval) = mkrep( (yyvsp[(1) - (5)]), (yyvsp[(3) - (5)]), INFINITE_REPEAT ); + } + break; + + case 50: + +/* Line 1806 of yacc.c */ +#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[(3) - (4)]) <= 0 ) + { + synerr( _("iteration value must be positive") + ); + (yyval) = (yyvsp[(1) - (4)]); + } + + else + (yyval) = link_machines( (yyvsp[(1) - (4)]), + copysingl( (yyvsp[(1) - (4)]), (yyvsp[(3) - (4)]) - 1 ) ); + } + break; + + case 51: + +/* Line 1806 of yacc.c */ +#line 611 "parse.y" + { + varlength = true; + + (yyval) = mkclos( (yyvsp[(1) - (2)]) ); + } + break; + + case 52: + +/* Line 1806 of yacc.c */ +#line 618 "parse.y" + { + varlength = true; + (yyval) = mkposcl( (yyvsp[(1) - (2)]) ); + } + break; + + case 53: + +/* Line 1806 of yacc.c */ +#line 624 "parse.y" + { + varlength = true; + (yyval) = mkopt( (yyvsp[(1) - (2)]) ); + } + break; + + case 54: + +/* Line 1806 of yacc.c */ +#line 630 "parse.y" + { + varlength = true; + + if ( (yyvsp[(3) - (6)]) > (yyvsp[(5) - (6)]) || (yyvsp[(3) - (6)]) < 0 ) + { + synerr( _("bad iteration values") ); + (yyval) = (yyvsp[(1) - (6)]); + } + else + { + if ( (yyvsp[(3) - (6)]) == 0 ) + { + if ( (yyvsp[(5) - (6)]) <= 0 ) + { + synerr( + _("bad iteration values") ); + (yyval) = (yyvsp[(1) - (6)]); + } + else + (yyval) = mkopt( + mkrep( (yyvsp[(1) - (6)]), 1, (yyvsp[(5) - (6)]) ) ); + } + else + (yyval) = mkrep( (yyvsp[(1) - (6)]), (yyvsp[(3) - (6)]), (yyvsp[(5) - (6)]) ); + } + } + break; + + case 55: + +/* Line 1806 of yacc.c */ +#line 658 "parse.y" + { + varlength = true; + + if ( (yyvsp[(3) - (5)]) <= 0 ) + { + synerr( _("iteration value must be positive") ); + (yyval) = (yyvsp[(1) - (5)]); + } + + else + (yyval) = mkrep( (yyvsp[(1) - (5)]), (yyvsp[(3) - (5)]), INFINITE_REPEAT ); + } + break; + + case 56: + +/* Line 1806 of yacc.c */ +#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[(3) - (4)]) <= 0 ) + { + synerr( _("iteration value must be positive") ); + (yyval) = (yyvsp[(1) - (4)]); + } + + else + (yyval) = link_machines( (yyvsp[(1) - (4)]), + copysingl( (yyvsp[(1) - (4)]), (yyvsp[(3) - (4)]) - 1 ) ); + } + break; + + case 57: + +/* Line 1806 of yacc.c */ +#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 1806 of yacc.c */ +#line 725 "parse.y" + { + /* Sort characters for fast searching. + */ + qsort( ccltbl + cclmap[(yyvsp[(1) - (1)])], ccllen[(yyvsp[(1) - (1)])], sizeof (*ccltbl), cclcmp ); + + if ( useecs ) + mkeccl( ccltbl + cclmap[(yyvsp[(1) - (1)])], ccllen[(yyvsp[(1) - (1)])], + nextecm, ecgroup, csize, csize ); + + ++rulelen; + + if (ccl_has_nl[(yyvsp[(1) - (1)])]) + rule_has_nl[num_rules] = true; + + (yyval) = mkstate( -(yyvsp[(1) - (1)]) ); + } + break; + + case 59: + +/* Line 1806 of yacc.c */ +#line 743 "parse.y" + { + ++rulelen; + + if (ccl_has_nl[(yyvsp[(1) - (1)])]) + rule_has_nl[num_rules] = true; + + (yyval) = mkstate( -(yyvsp[(1) - (1)]) ); + } + break; + + case 60: + +/* Line 1806 of yacc.c */ +#line 753 "parse.y" + { (yyval) = (yyvsp[(2) - (3)]); } + break; + + case 61: + +/* Line 1806 of yacc.c */ +#line 756 "parse.y" + { (yyval) = (yyvsp[(2) - (3)]); } + break; + + case 62: + +/* Line 1806 of yacc.c */ +#line 759 "parse.y" + { + ++rulelen; + + if ((yyvsp[(1) - (1)]) == nlch) + rule_has_nl[num_rules] = true; + + if (sf_case_ins() && has_case((yyvsp[(1) - (1)]))) + /* create an alternation, as in (a|A) */ + (yyval) = mkor (mkstate((yyvsp[(1) - (1)])), mkstate(reverse_case((yyvsp[(1) - (1)])))); + else + (yyval) = mkstate( (yyvsp[(1) - (1)]) ); + } + break; + + case 63: + +/* Line 1806 of yacc.c */ +#line 773 "parse.y" + { (yyval) = ccl_set_diff ((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)])); } + break; + + case 64: + +/* Line 1806 of yacc.c */ +#line 774 "parse.y" + { (yyval) = ccl_set_union ((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)])); } + break; + + case 66: + +/* Line 1806 of yacc.c */ +#line 780 "parse.y" + { (yyval) = (yyvsp[(2) - (3)]); } + break; + + case 67: + +/* Line 1806 of yacc.c */ +#line 783 "parse.y" + { + cclnegate( (yyvsp[(3) - (4)]) ); + (yyval) = (yyvsp[(3) - (4)]); + } + break; + + case 68: + +/* Line 1806 of yacc.c */ +#line 790 "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) - (4)])) != has_case ((yyvsp[(4) - (4)])) + || (has_case ((yyvsp[(2) - (4)])) && (b_islower ((yyvsp[(2) - (4)])) != b_islower ((yyvsp[(4) - (4)])))) + || (has_case ((yyvsp[(2) - (4)])) && (b_isupper ((yyvsp[(2) - (4)])) != b_isupper ((yyvsp[(4) - (4)]))))) + format_warn3 ( + _("the character range [%c-%c] is ambiguous in a case-insensitive scanner"), + (yyvsp[(2) - (4)]), (yyvsp[(4) - (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 ((yyvsp[(2) - (4)])) && !has_case ((yyvsp[(4) - (4)])) && !range_covers_case ((yyvsp[(2) - (4)]), (yyvsp[(4) - (4)]))) + format_warn3 ( + _("the character range [%c-%c] is ambiguous in a case-insensitive scanner"), + (yyvsp[(2) - (4)]), (yyvsp[(4) - (4)])); + } + + if ( (yyvsp[(2) - (4)]) > (yyvsp[(4) - (4)]) ) + synerr( _("negative range in character class") ); + + else + { + for ( i = (yyvsp[(2) - (4)]); i <= (yyvsp[(4) - (4)]); ++i ) + ccladd( (yyvsp[(1) - (4)]), i ); + + /* Keep track if this ccl is staying in + * alphabetical order. + */ + cclsorted = cclsorted && ((yyvsp[(2) - (4)]) > lastchar); + lastchar = (yyvsp[(4) - (4)]); + + /* Do it again for upper/lowercase */ + if (sf_case_ins() && has_case((yyvsp[(2) - (4)])) && has_case((yyvsp[(4) - (4)]))){ + (yyvsp[(2) - (4)]) = reverse_case ((yyvsp[(2) - (4)])); + (yyvsp[(4) - (4)]) = reverse_case ((yyvsp[(4) - (4)])); + + for ( i = (yyvsp[(2) - (4)]); i <= (yyvsp[(4) - (4)]); ++i ) + ccladd( (yyvsp[(1) - (4)]), i ); + + cclsorted = cclsorted && ((yyvsp[(2) - (4)]) > lastchar); + lastchar = (yyvsp[(4) - (4)]); + } + + } + + (yyval) = (yyvsp[(1) - (4)]); + } + break; + + case 69: + +/* Line 1806 of yacc.c */ +#line 850 "parse.y" + { + ccladd( (yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]) ); + cclsorted = cclsorted && ((yyvsp[(2) - (2)]) > lastchar); + lastchar = (yyvsp[(2) - (2)]); + + /* Do it again for upper/lowercase */ + if (sf_case_ins() && has_case((yyvsp[(2) - (2)]))){ + (yyvsp[(2) - (2)]) = reverse_case ((yyvsp[(2) - (2)])); + ccladd ((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)])); + + cclsorted = cclsorted && ((yyvsp[(2) - (2)]) > lastchar); + lastchar = (yyvsp[(2) - (2)]); + } + + (yyval) = (yyvsp[(1) - (2)]); + } + break; + + case 70: + +/* Line 1806 of yacc.c */ +#line 868 "parse.y" + { + /* Too hard to properly maintain cclsorted. */ + cclsorted = false; + (yyval) = (yyvsp[(1) - (2)]); + } + break; + + case 71: + +/* Line 1806 of yacc.c */ +#line 875 "parse.y" + { + cclsorted = true; + lastchar = 0; + currccl = (yyval) = cclinit(); + } + break; + + case 72: + +/* Line 1806 of yacc.c */ +#line 883 "parse.y" + { CCL_EXPR(isalnum); } + break; + + case 73: + +/* Line 1806 of yacc.c */ +#line 884 "parse.y" + { CCL_EXPR(isalpha); } + break; + + case 74: + +/* Line 1806 of yacc.c */ +#line 885 "parse.y" + { CCL_EXPR(IS_BLANK); } + break; + + case 75: + +/* Line 1806 of yacc.c */ +#line 886 "parse.y" + { CCL_EXPR(iscntrl); } + break; + + case 76: + +/* Line 1806 of yacc.c */ +#line 887 "parse.y" + { CCL_EXPR(isdigit); } + break; + + case 77: + +/* Line 1806 of yacc.c */ +#line 888 "parse.y" + { CCL_EXPR(isgraph); } + break; + + case 78: + +/* Line 1806 of yacc.c */ +#line 889 "parse.y" + { + CCL_EXPR(islower); + if (sf_case_ins()) + CCL_EXPR(isupper); + } + break; + + case 79: + +/* Line 1806 of yacc.c */ +#line 894 "parse.y" + { CCL_EXPR(isprint); } + break; + + case 80: + +/* Line 1806 of yacc.c */ +#line 895 "parse.y" + { CCL_EXPR(ispunct); } + break; + + case 81: + +/* Line 1806 of yacc.c */ +#line 896 "parse.y" + { CCL_EXPR(isspace); } + break; + + case 82: + +/* Line 1806 of yacc.c */ +#line 897 "parse.y" + { CCL_EXPR(isxdigit); } + break; + + case 83: + +/* Line 1806 of yacc.c */ +#line 898 "parse.y" + { + CCL_EXPR(isupper); + if (sf_case_ins()) + CCL_EXPR(islower); + } + break; + + case 84: + +/* Line 1806 of yacc.c */ +#line 904 "parse.y" + { CCL_NEG_EXPR(isalnum); } + break; + + case 85: + +/* Line 1806 of yacc.c */ +#line 905 "parse.y" + { CCL_NEG_EXPR(isalpha); } + break; + + case 86: + +/* Line 1806 of yacc.c */ +#line 906 "parse.y" + { CCL_NEG_EXPR(IS_BLANK); } + break; + + case 87: + +/* Line 1806 of yacc.c */ +#line 907 "parse.y" + { CCL_NEG_EXPR(iscntrl); } + break; + + case 88: + +/* Line 1806 of yacc.c */ +#line 908 "parse.y" + { CCL_NEG_EXPR(isdigit); } + break; + + case 89: + +/* Line 1806 of yacc.c */ +#line 909 "parse.y" + { CCL_NEG_EXPR(isgraph); } + break; + + case 90: + +/* Line 1806 of yacc.c */ +#line 910 "parse.y" + { CCL_NEG_EXPR(isprint); } + break; + + case 91: + +/* Line 1806 of yacc.c */ +#line 911 "parse.y" + { CCL_NEG_EXPR(ispunct); } + break; + + case 92: + +/* Line 1806 of yacc.c */ +#line 912 "parse.y" + { CCL_NEG_EXPR(isspace); } + break; + + case 93: + +/* Line 1806 of yacc.c */ +#line 913 "parse.y" + { CCL_NEG_EXPR(isxdigit); } + break; + + case 94: + +/* Line 1806 of yacc.c */ +#line 914 "parse.y" + { + if ( sf_case_ins() ) + warn(_("[:^lower:] is ambiguous in case insensitive scanner")); + else + CCL_NEG_EXPR(islower); + } + break; + + case 95: + +/* Line 1806 of yacc.c */ +#line 920 "parse.y" + { + if ( sf_case_ins() ) + warn(_("[:^upper:] ambiguous in case insensitive scanner")); + else + CCL_NEG_EXPR(isupper); + } + break; + + case 96: + +/* Line 1806 of yacc.c */ +#line 929 "parse.y" + { + if ( (yyvsp[(2) - (2)]) == nlch ) + rule_has_nl[num_rules] = true; + + ++rulelen; + + if (sf_case_ins() && has_case((yyvsp[(2) - (2)]))) + (yyval) = mkor (mkstate((yyvsp[(2) - (2)])), mkstate(reverse_case((yyvsp[(2) - (2)])))); + else + (yyval) = mkstate ((yyvsp[(2) - (2)])); + + (yyval) = link_machines( (yyvsp[(1) - (2)]), (yyval)); + } + break; + + case 97: + +/* Line 1806 of yacc.c */ +#line 944 "parse.y" + { (yyval) = mkstate( SYM_EPSILON ); } + break; + + + +/* Line 1806 of yacc.c */ +#line 2847 "parse.c" + default: break; + } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + 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: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); + + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (YY_("syntax error")); +#else +# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ + yyssp, yytoken) + { + char const *yymsgp = YY_("syntax error"); + int yysyntax_error_status; + yysyntax_error_status = YYSYNTAX_ERROR; + if (yysyntax_error_status == 0) + yymsgp = yymsg; + else if (yysyntax_error_status == 1) + { + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); + if (!yymsg) + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + yysyntax_error_status = 2; + } + else + { + yysyntax_error_status = YYSYNTAX_ERROR; + yymsgp = yymsg; + } + } + yyerror (yymsgp); + if (yysyntax_error_status == 2) + goto yyexhaustedlab; + } +# undef YYSYNTAX_ERROR +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead 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 lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + 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 (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + *++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; + +#if !defined(yyoverflow) || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + } + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + + +/* Line 2067 of yacc.c */ +#line 947 "parse.y" + + + +/* build_eof_action - build the "<<EOF>>" action for the active start + * conditions + */ + +void build_eof_action() + { + 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; + + if (previous_continued_action /* && previous action was regular */) + add_action("YY_RULE_SETUP\n"); + + 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/usr.bin/lex/initparse.h b/usr.bin/lex/initparse.h new file mode 100644 index 00000000000..9eb10df852a --- /dev/null +++ b/usr.bin/lex/initparse.h @@ -0,0 +1,148 @@ +/* $OpenBSD: initparse.h,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* A Bison parser, made by GNU Bison 2.5. */ + +/* Bison interface for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + 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_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + +extern YYSTYPE yylval; + + diff --git a/usr.bin/lex/initscan.c b/usr.bin/lex/initscan.c index a88c7631231..e7ede080592 100644 --- a/usr.bin/lex/initscan.c +++ b/usr.bin/lex/initscan.c @@ -1,70 +1,114 @@ -/* $OpenBSD: initscan.c,v 1.14 2013/11/04 17:03:32 millert Exp $ */ +/* $OpenBSD: initscan.c,v 1.15 2015/11/19 19:43:40 tedu Exp $ */ -#line 2 "scan.c" -/* A lexical scanner generated by flex */ +#line 3 "scan.c" -/* Scanner skeleton version: - * $Header: /cvs/OpenBSD/src/usr.bin/lex/initscan.c,v 1.14 2013/11/04 17:03:32 millert Exp $ - */ +#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 37 +#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. */ -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus -#endif +/* 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; + +/* 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 -#ifdef __cplusplus +#endif /* ! C99 */ -#include <stdlib.h> -#include <unistd.h> +#endif /* ! FLEXINT_H */ -/* Use prototypes in function declarations. */ -#define YY_USE_PROTOS +#ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ -#ifdef __STDC__ +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) -#define YY_USE_PROTOS #define YY_USE_CONST -#endif /* __STDC__ */ +#endif /* defined (__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 @@ -79,71 +123,71 @@ * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ -#define BEGIN yy_start = 1 + 2 * +#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 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_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 + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +extern yy_size_t yyleng; -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 YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) + +/* 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; \ + 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 + n - YY_MORE_ADJ; \ + (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 ) - -/* 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; - +#define unput(c) yyunput( c, (yytext_ptr) ) +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; @@ -159,7 +203,7 @@ struct yy_buffer_state /* Number of characters read into yy_ch_buf, not including EOB * characters. */ - int yy_n_chars; + yy_size_t 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 @@ -180,12 +224,16 @@ struct yy_buffer_state */ 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 @@ -199,28 +247,38 @@ struct yy_buffer_state * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ -static YY_BUFFER_STATE yy_current_buffer = 0; +/* 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_current_buffer +#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; +static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ +yy_size_t 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_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 @@ -228,169 +286,373 @@ static int yy_start = 0; /* start state number */ */ static int yy_did_buffer_switch_on_eof; -void yyrestart YY_PROTO(( FILE *input_file )); +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 ); -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 ) +static void yyensure_buffer_stack (void ); +static void yy_load_buffer_state (void ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); -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 )); +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) -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 * )); +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,yy_size_t 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 ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_is_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 ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_at_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->yy_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 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[] )); +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; \ - yyleng = (int) (yy_cp - yy_bp); \ - yy_hold_char = *yy_cp; \ + (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; + (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 + } ; -#define YY_NUM_RULES 165 -#define YY_END_OF_BUFFER 166 -static yyconst short int yy_accept[769] = +static yyconst flex_int16_t yy_accept[1108] = { 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 + 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 int yy_ec[256] = +static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, + 4, 4, 5, 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, 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, @@ -407,880 +669,1250 @@ static yyconst int yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst int yy_meta[59] = +static yyconst flex_int32_t yy_meta[85] = { 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 + 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 short int yy_base[858] = +static yyconst flex_int16_t yy_base[1201] = { 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 + 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 short int yy_def[858] = +static yyconst flex_int16_t yy_def[1201] = { 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 + 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 short int yy_nxt[2775] = +static yyconst flex_int16_t yy_nxt[4060] = { 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, + 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, 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, + 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, 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, + 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, 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, + 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, 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 + 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 short int yy_chk[2775] = +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, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 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, 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, + 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, 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, + 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, 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, + 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, 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 + 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 } ; -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 +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" -#define INITIAL 0 -/* scan.l - scanner for flex input */ +/* 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. - * - * 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. - */ +/* 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. */ -/* $Header: /cvs/OpenBSD/src/usr.bin/lex/initscan.c,v 1.14 2013/11/04 17:03:32 millert Exp $ */ +/* 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) \ @@ -1289,6 +1921,17 @@ char *yytext; 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 \ @@ -1299,7 +1942,15 @@ char *yytext; return CHAR; #define RETURNNAME \ + if(yyleng < MAXLINE) \ + { \ strlcpy( nmstr, yytext, sizeof nmstr ); \ + } \ + else \ + { \ + synerr(_("Input line too long\n")); \ + FLEX_EXIT(EXIT_FAILURE); \ + } \ return NAME; #define PUT_BACK_STRING(str, start) \ @@ -1313,8 +1964,21 @@ char *yytext; #define CHECK_YYMORE(str) \ if ( all_lower( str ) ) \ yymore_used = true; -#define YY_STACK_USED 1 -#define YY_NO_TOP_STATE 1 + +#define YY_USER_INIT \ + if ( getenv("POSIXLY_CORRECT") ) \ + posix_compat = true; + + + + + + + + +#line 1979 "scan.c" + +#define INITIAL 0 #define SECT2 1 #define SECT2PROLOG 2 #define SECT3 3 @@ -1324,7 +1988,6 @@ char *yytext; #define CARETISBOL 7 #define NUM 8 #define QUOTE 9 - #define FIRSTCCL 10 #define CCL 11 #define ACTION 12 @@ -1332,11 +1995,56 @@ char *yytext; #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 ); -#line 1333 "scan.c" +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 ); + +yy_size_t 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. @@ -1344,79 +2052,51 @@ char *yytext; #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus -extern "C" int yywrap YY_PROTO(( void )); +extern "C" int yywrap (void ); #else -extern int yywrap YY_PROTO(( void )); -#endif +extern int yywrap (void ); #endif - -#ifndef YY_NO_UNPUT -static void yyunput YY_PROTO(( int c, char *buf_ptr )); #endif + static void yyunput (int c,char *buf_ptr ); + #ifndef yytext_ptr -static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen YY_PROTO(( yyconst char * )); +static int yy_flex_strlen (yyconst char * ); #endif -#if defined(YY_NO_INPUT) && YY_NO_INPUT -#ifdef __cplusplus -static int yyinput YY_PROTO(( void )); -#else -static int input YY_PROTO(( void )); -#endif -#endif - -#ifdef 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 +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput (void ); #else -#define YY_NO_PUSH_STATE 1 -#define YY_NO_POP_STATE 1 -#define YY_NO_TOP_STATE 1 +static int input (void ); #endif -#ifdef YY_MALLOC_DECL -YY_MALLOC_DECL -#else -#ifdef __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 + 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 (void) fwrite( yytext, yyleng, 1, yyout ) +#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, @@ -1424,9 +2104,10 @@ YY_MALLOC_DECL */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ - if ( yy_current_buffer->yy_is_interactive ) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ - int c = '*', n; \ + int c = '*'; \ + size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ @@ -1436,9 +2117,22 @@ YY_MALLOC_DECL 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" ); + 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();" - @@ -1459,12 +2153,18 @@ YY_MALLOC_DECL #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 int yylex YY_PROTO(( void )) -#endif +#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. @@ -1480,39 +2180,34 @@ YY_MALLOC_DECL #define YY_RULE_SETUP \ if ( yyleng > 0 ) \ - yy_current_buffer->yy_at_bol = \ + 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 - { +{ yy_state_type yy_current_state; char *yy_cp, *yy_bp; 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 ) + + if ( !(yy_init) ) { - yy_init = 0; + (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif - if ( ! yy_start ) - yy_start = 1; /* first start state */ + /* 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; @@ -1520,100 +2215,124 @@ YY_DECL if ( ! yyout ) yyout = stdout; - if ( ! yy_current_buffer ) - yy_current_buffer = - yy_create_buffer( yyin, YY_BUF_SIZE ); + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } - yy_load_buffer_state(); + yy_load_buffer_state( ); } + { +#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 2239 "scan.c" + while ( 1 ) /* loops until end-of-file is reached */ { - yy_cp = yy_c_buf_p; + (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_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_start); yy_current_state += YY_AT_BOL(); + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + yy_match: do { - 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; - } + 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 >= 769 ) + 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] != 2716 ); + while ( yy_base[yy_current_state] != 3975 ); 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_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 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" +#line 142 "scan.l" indented_code = true; BEGIN(CODEBLOCK); YY_BREAK case 2: YY_RULE_SETUP -#line 106 "scan.l" +#line 143 "scan.l" ACTION_ECHO; yy_push_state( COMMENT ); YY_BREAK case 3: YY_RULE_SETUP -#line 107 "scan.l" +#line 144 "scan.l" yy_push_state( LINEDIR ); YY_BREAK case 4: YY_RULE_SETUP -#line 108 "scan.l" +#line 145 "scan.l" return SCDECL; YY_BREAK case 5: YY_RULE_SETUP -#line 109 "scan.l" +#line 146 "scan.l" return XSCDECL; YY_BREAK case 6: +/* rule 6 can match eol */ YY_RULE_SETUP -#line 110 "scan.l" +#line 147 "scan.l" { ++linenum; line_directive_out( (FILE *) 0, 1 ); @@ -1622,13 +2341,30 @@ YY_RULE_SETUP } YY_BREAK case 7: +/* rule 7 can match eol */ YY_RULE_SETUP -#line 117 "scan.l" -/* discard */ +#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 119 "scan.l" +#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; @@ -1638,123 +2374,206 @@ YY_RULE_SETUP return SECTEND; } YY_BREAK -case 9: +case 11: +/* rule 11 can match eol */ YY_RULE_SETUP -#line 128 "scan.l" +#line 174 "scan.l" yytext_is_array = false; ++linenum; YY_BREAK -case 10: +case 12: +/* rule 12 can match eol */ YY_RULE_SETUP -#line 129 "scan.l" +#line 175 "scan.l" yytext_is_array = true; ++linenum; YY_BREAK -case 11: +case 13: YY_RULE_SETUP -#line 131 "scan.l" +#line 177 "scan.l" BEGIN(OPTION); return OPTION_OP; YY_BREAK -case 12: +case 14: +/* rule 14 can match eol */ YY_RULE_SETUP -#line 133 "scan.l" +#line 179 "scan.l" ++linenum; /* ignore */ YY_BREAK -case 13: +case 15: +/* rule 15 can match eol */ YY_RULE_SETUP -#line 134 "scan.l" +#line 180 "scan.l" ++linenum; /* ignore */ YY_BREAK -case 14: +/* xgettext: no-c-format */ +case 16: +/* rule 16 can match eol */ YY_RULE_SETUP -#line 136 "scan.l" +#line 183 "scan.l" synerr( _( "unrecognized '%' directive" ) ); YY_BREAK -case 15: +case 17: YY_RULE_SETUP -#line 138 "scan.l" +#line 185 "scan.l" { + if(yyleng < MAXLINE) + { strlcpy( nmstr, yytext, sizeof nmstr ); + } + else + { + synerr( _("Definition name too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } + didadef = false; BEGIN(PICKUPDEF); } YY_BREAK -case 16: +case 18: YY_RULE_SETUP -#line 144 "scan.l" +#line 200 "scan.l" RETURNNAME; YY_BREAK -case 17: +case 19: +/* rule 19 can match eol */ YY_RULE_SETUP -#line 145 "scan.l" +#line 201 "scan.l" ++linenum; /* allows blank lines in section 1 */ YY_BREAK -case 18: +case 20: +/* rule 20 can match eol */ YY_RULE_SETUP -#line 146 "scan.l" +#line 202 "scan.l" ACTION_ECHO; ++linenum; /* maybe end of comment line */ YY_BREAK -case 19: +case 21: YY_RULE_SETUP -#line 151 "scan.l" +#line 207 "scan.l" ACTION_ECHO; yy_pop_state(); YY_BREAK -case 20: +case 22: YY_RULE_SETUP -#line 152 "scan.l" +#line 208 "scan.l" ACTION_ECHO; YY_BREAK -case 21: +case 23: YY_RULE_SETUP -#line 153 "scan.l" +#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 22: +case 26: +/* rule 26 can match eol */ YY_RULE_SETUP -#line 154 "scan.l" +#line 212 "scan.l" ++linenum; ACTION_ECHO; YY_BREAK -case 23: +/* This is the same as COMMENT, but is discarded rather than output. */ +case 27: YY_RULE_SETUP -#line 158 "scan.l" +#line 217 "scan.l" yy_pop_state(); YY_BREAK -case 24: +case 28: +YY_RULE_SETUP +#line 218 "scan.l" +; + YY_BREAK +case 29: YY_RULE_SETUP -#line 159 "scan.l" +#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 25: +case 36: YY_RULE_SETUP -#line 161 "scan.l" +#line 233 "scan.l" { flex_free( (void *) infilename ); infilename = copy_string( yytext + 1 ); infilename[strlen( infilename ) - 1] = '\0'; } YY_BREAK -case 26: +case 37: YY_RULE_SETUP -#line 166 "scan.l" +#line 238 "scan.l" /* ignore spurious characters */ YY_BREAK -case 27: +case 38: +/* rule 38 can match eol */ YY_RULE_SETUP -#line 170 "scan.l" +#line 242 "scan.l" ++linenum; BEGIN(INITIAL); YY_BREAK -case 28: +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 172 "scan.l" +#line 246 "scan.l" ACTION_ECHO; YY_BREAK -case 29: +case 42: +/* rule 42 can match eol */ YY_RULE_SETUP -#line 174 "scan.l" +#line 248 "scan.l" { ++linenum; ACTION_ECHO; @@ -1764,17 +2583,79 @@ YY_RULE_SETUP YY_BREAK -case 30: +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 184 "scan.l" +#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 31: +case 50: YY_RULE_SETUP -#line 186 "scan.l" +#line 293 "scan.l" { + if(yyleng < MAXLINE) + { strlcpy( (char *) nmdef, yytext, sizeof nmdef ); - + } + else + { + format_synerr( _("Definition value for {%s} too long\n"), nmstr); + FLEX_EXIT(EXIT_FAILURE); + } /* Skip trailing whitespace. */ for ( i = strlen( (char *) nmdef ) - 1; i >= 0 && (nmdef[i] == ' ' || nmdef[i] == '\t'); @@ -1787,9 +2668,10 @@ YY_RULE_SETUP didadef = true; } YY_BREAK -case 32: +case 51: +/* rule 51 can match eol */ YY_RULE_SETUP -#line 201 "scan.l" +#line 315 "scan.l" { if ( ! didadef ) synerr( _( "incomplete name definition" ) ); @@ -1799,267 +2681,436 @@ YY_RULE_SETUP YY_BREAK -case 33: +case 52: +/* rule 52 can match eol */ YY_RULE_SETUP -#line 211 "scan.l" +#line 325 "scan.l" ++linenum; BEGIN(INITIAL); YY_BREAK -case 34: +case 53: YY_RULE_SETUP -#line 212 "scan.l" +#line 326 "scan.l" option_sense = true; YY_BREAK -case 35: +case 54: YY_RULE_SETUP -#line 214 "scan.l" +#line 328 "scan.l" return '='; YY_BREAK -case 36: +case 55: YY_RULE_SETUP -#line 216 "scan.l" +#line 330 "scan.l" option_sense = ! option_sense; YY_BREAK -case 37: +case 56: YY_RULE_SETUP -#line 218 "scan.l" +#line 332 "scan.l" csize = option_sense ? 128 : 256; YY_BREAK -case 38: +case 57: YY_RULE_SETUP -#line 219 "scan.l" +#line 333 "scan.l" csize = option_sense ? 256 : 128; YY_BREAK -case 39: +case 58: YY_RULE_SETUP -#line 221 "scan.l" +#line 335 "scan.l" long_align = option_sense; YY_BREAK -case 40: +case 59: YY_RULE_SETUP -#line 222 "scan.l" +#line 336 "scan.l" { - action_define( "YY_ALWAYS_INTERACTIVE", option_sense ); + ACTION_M4_IFDEF( "M4""_YY_ALWAYS_INTERACTIVE", option_sense ); + interactive = option_sense; } YY_BREAK -case 41: +case 60: YY_RULE_SETUP -#line 225 "scan.l" +#line 340 "scan.l" yytext_is_array = option_sense; YY_BREAK -case 42: +case 61: YY_RULE_SETUP -#line 226 "scan.l" +#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 43: +case 64: YY_RULE_SETUP -#line 227 "scan.l" +#line 344 "scan.l" interactive = ! option_sense; YY_BREAK -case 44: +case 65: YY_RULE_SETUP -#line 228 "scan.l" +#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 45: +case 68: YY_RULE_SETUP -#line 229 "scan.l" -caseins = ! option_sense; +#line 350 "scan.l" +sf_set_case_ins(!option_sense); YY_BREAK -case 46: +case 69: YY_RULE_SETUP -#line 230 "scan.l" -caseins = option_sense; +#line 351 "scan.l" +sf_set_case_ins(option_sense); YY_BREAK -case 47: +case 70: YY_RULE_SETUP -#line 231 "scan.l" +#line 352 "scan.l" ddebug = option_sense; YY_BREAK -case 48: +case 71: YY_RULE_SETUP -#line 232 "scan.l" +#line 353 "scan.l" spprdflt = ! option_sense; YY_BREAK -case 49: +case 72: YY_RULE_SETUP -#line 233 "scan.l" +#line 354 "scan.l" useecs = option_sense; YY_BREAK -case 50: +case 73: YY_RULE_SETUP -#line 234 "scan.l" +#line 355 "scan.l" { useecs = usemecs = false; use_read = fullspd = true; } YY_BREAK -case 51: +case 74: YY_RULE_SETUP -#line 238 "scan.l" +#line 359 "scan.l" { useecs = usemecs = false; use_read = fulltbl = true; } YY_BREAK -case 52: +case 75: YY_RULE_SETUP -#line 242 "scan.l" +#line 363 "scan.l" ACTION_IFDEF("YY_NO_INPUT", ! option_sense); YY_BREAK -case 53: +case 76: YY_RULE_SETUP -#line 243 "scan.l" +#line 364 "scan.l" interactive = option_sense; YY_BREAK -case 54: +case 77: YY_RULE_SETUP -#line 244 "scan.l" +#line 365 "scan.l" lex_compat = option_sense; YY_BREAK -case 55: +case 78: YY_RULE_SETUP -#line 245 "scan.l" +#line 366 "scan.l" +posix_compat = option_sense; + YY_BREAK +case 79: +YY_RULE_SETUP +#line 367 "scan.l" { - action_define( "YY_MAIN", option_sense ); - do_yywrap = ! option_sense; + ACTION_M4_IFDEF( "M4""_YY_MAIN", option_sense); + /* Override yywrap */ + if( option_sense == true ) + do_yywrap = false; } YY_BREAK -case 56: +case 80: YY_RULE_SETUP -#line 249 "scan.l" +#line 373 "scan.l" usemecs = option_sense; YY_BREAK -case 57: +case 81: YY_RULE_SETUP -#line 250 "scan.l" +#line 374 "scan.l" { - action_define( "YY_NEVER_INTERACTIVE", option_sense ); + ACTION_M4_IFDEF( "M4""_YY_NEVER_INTERACTIVE", option_sense ); + interactive = !option_sense; } YY_BREAK -case 58: +case 82: YY_RULE_SETUP -#line 253 "scan.l" +#line 378 "scan.l" performance_report += option_sense ? 1 : -1; YY_BREAK -case 59: +case 83: YY_RULE_SETUP -#line 254 "scan.l" +#line 379 "scan.l" yytext_is_array = ! option_sense; YY_BREAK -case 60: +case 84: YY_RULE_SETUP -#line 255 "scan.l" +#line 380 "scan.l" use_read = option_sense; YY_BREAK -case 61: +case 85: YY_RULE_SETUP -#line 256 "scan.l" +#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 62: +case 87: YY_RULE_SETUP -#line 257 "scan.l" -action_define( "YY_STACK_USED", option_sense ); +#line 383 "scan.l" +ACTION_M4_IFDEF( "M4""_YY_STACK_USED", option_sense ); YY_BREAK -case 63: +case 88: YY_RULE_SETUP -#line 258 "scan.l" +#line 384 "scan.l" do_stdinit = option_sense; YY_BREAK -case 64: +case 89: YY_RULE_SETUP -#line 259 "scan.l" +#line 385 "scan.l" use_stdout = option_sense; YY_BREAK -case 65: +case 90: YY_RULE_SETUP -#line 260 "scan.l" -ACTION_IFDEF("YY_NO_UNPUT", ! option_sense); +#line 386 "scan.l" +ACTION_IFDEF("YY_NO_UNISTD_H", ! option_sense); YY_BREAK -case 66: +case 91: YY_RULE_SETUP -#line 261 "scan.l" +#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 67: +case 93: YY_RULE_SETUP -#line 262 "scan.l" +#line 389 "scan.l" nowarn = ! option_sense; YY_BREAK -case 68: +case 94: YY_RULE_SETUP -#line 263 "scan.l" -do_yylineno = option_sense; +#line 390 "scan.l" +do_yylineno = option_sense; ACTION_M4_IFDEF("M4""_YY_USE_LINENO", option_sense); YY_BREAK -case 69: +case 95: YY_RULE_SETUP -#line 264 "scan.l" +#line 391 "scan.l" yymore_really_used = option_sense; YY_BREAK -case 70: +case 96: YY_RULE_SETUP -#line 265 "scan.l" +#line 392 "scan.l" do_yywrap = option_sense; YY_BREAK -case 71: +case 97: YY_RULE_SETUP -#line 267 "scan.l" -ACTION_IFDEF("YY_NO_PUSH_STATE", ! option_sense); +#line 394 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_PUSH_STATE", ! option_sense); YY_BREAK -case 72: +case 98: YY_RULE_SETUP -#line 268 "scan.l" -ACTION_IFDEF("YY_NO_POP_STATE", ! option_sense); +#line 395 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_POP_STATE", ! option_sense); YY_BREAK -case 73: +case 99: YY_RULE_SETUP -#line 269 "scan.l" -ACTION_IFDEF("YY_NO_TOP_STATE", ! option_sense); +#line 396 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_TOP_STATE", ! option_sense); YY_BREAK -case 74: +case 100: YY_RULE_SETUP -#line 271 "scan.l" -ACTION_IFDEF("YY_NO_SCAN_BUFFER", ! option_sense); +#line 398 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BUFFER", ! option_sense); YY_BREAK -case 75: +case 101: YY_RULE_SETUP -#line 272 "scan.l" -ACTION_IFDEF("YY_NO_SCAN_BYTES", ! option_sense); +#line 399 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BYTES", ! option_sense); YY_BREAK -case 76: +case 102: YY_RULE_SETUP -#line 273 "scan.l" -ACTION_IFDEF("YY_NO_SCAN_STRING", ! option_sense); +#line 400 "scan.l" +ACTION_M4_IFDEF("M4""_YY_NO_SCAN_STRING", ! option_sense); YY_BREAK -case 77: +case 103: YY_RULE_SETUP -#line 275 "scan.l" +#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 78: +case 124: YY_RULE_SETUP -#line 276 "scan.l" +#line 425 "scan.l" return OPT_PREFIX; YY_BREAK -case 79: +case 125: YY_RULE_SETUP -#line 277 "scan.l" +#line 426 "scan.l" return OPT_YYCLASS; YY_BREAK -case 80: +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 279 "scan.l" +#line 436 "scan.l" { + if(yyleng-1 < MAXLINE) + { strlcpy( nmstr, yytext + 1, sizeof nmstr ); - if (nmstr[strlen(nmstr) - 1] == '"') - nmstr[strlen(nmstr) - 1] = '\0'; + } + else + { + synerr( _("Option line too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } + if (nmstr[strlen( nmstr ) - 1] == '"') + nmstr[strlen( nmstr ) - 1] = '\0'; return NAME; } YY_BREAK -case 81: +case 130: YY_RULE_SETUP -#line 285 "scan.l" +#line 450 "scan.l" { format_synerr( _( "unrecognized %%option: %s" ), yytext ); @@ -2067,30 +3118,31 @@ YY_RULE_SETUP } YY_BREAK -case 82: +case 131: +/* rule 131 can match eol */ YY_RULE_SETUP -#line 292 "scan.l" +#line 457 "scan.l" ++linenum; BEGIN(INITIAL); YY_BREAK -case 83: +case 132: YY_RULE_SETUP -#line 296 "scan.l" +#line 461 "scan.l" ++bracelevel; yyless( 2 ); /* eat only %{ */ YY_BREAK -case 84: +case 133: YY_RULE_SETUP -#line 297 "scan.l" +#line 462 "scan.l" --bracelevel; yyless( 2 ); /* eat only %} */ YY_BREAK -case 85: +case 134: YY_RULE_SETUP -#line 299 "scan.l" +#line 464 "scan.l" ACTION_ECHO; /* indented code in prolog */ YY_BREAK -case 86: +case 135: YY_RULE_SETUP -#line 301 "scan.l" +#line 466 "scan.l" { /* non-indented code */ if ( bracelevel <= 0 ) { /* not in %{ ... %} */ @@ -2103,18 +3155,19 @@ YY_RULE_SETUP ACTION_ECHO; } YY_BREAK -case 87: +case 136: YY_RULE_SETUP -#line 313 "scan.l" +#line 478 "scan.l" ACTION_ECHO; YY_BREAK -case 88: +case 137: +/* rule 137 can match eol */ YY_RULE_SETUP -#line 314 "scan.l" +#line 479 "scan.l" ++linenum; ACTION_ECHO; YY_BREAK case YY_STATE_EOF(SECT2PROLOG): -#line 316 "scan.l" +#line 481 "scan.l" { mark_prolog(); sectnum = 0; @@ -2123,14 +3176,15 @@ case YY_STATE_EOF(SECT2PROLOG): YY_BREAK -case 89: +case 138: +/* rule 138 can match eol */ YY_RULE_SETUP -#line 324 "scan.l" +#line 489 "scan.l" ++linenum; /* allow blank lines in section 2 */ YY_BREAK -case 90: +case 139: YY_RULE_SETUP -#line 326 "scan.l" +#line 491 "scan.l" { indented_code = false; doing_codeblock = true; @@ -2138,40 +3192,53 @@ YY_RULE_SETUP BEGIN(PERCENT_BRACE_ACTION); } YY_BREAK -case 91: +case 140: YY_RULE_SETUP -#line 333 "scan.l" -BEGIN(SC); return '<'; +#line 498 "scan.l" +{ + /* Allow "<" to appear in (?x) patterns. */ + if (!sf_skip_ws()) + BEGIN(SC); + return '<'; + } YY_BREAK -case 92: +case 141: YY_RULE_SETUP -#line 334 "scan.l" +#line 504 "scan.l" return '^'; YY_BREAK -case 93: +case 142: YY_RULE_SETUP -#line 335 "scan.l" +#line 505 "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; +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 336 "scan.l" -BEGIN(NUM); return '{'; +#line 506 "scan.l" +{ + BEGIN(NUM); + if ( lex_compat || posix_compat ) + return BEGIN_REPEAT_POSIX; + else + return BEGIN_REPEAT_FLEX; + } YY_BREAK -case 95: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp = yy_bp + 1; +case 144: +/* rule 144 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ +YY_LINENO_REWIND_TO(yy_bp + 1); +(yy_c_buf_p) = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP -#line 337 "scan.l" +#line 513 "scan.l" return '$'; YY_BREAK -case 96: +case 145: YY_RULE_SETUP -#line 339 "scan.l" +#line 515 "scan.l" { bracelevel = 1; BEGIN(PERCENT_BRACE_ACTION); @@ -2184,91 +3251,138 @@ YY_RULE_SETUP } } YY_BREAK -case 97: +case 146: +/* rule 146 can match eol */ YY_RULE_SETUP -#line 350 "scan.l" -continued_action = true; ++linenum; return '\n'; +#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 98: +case 147: YY_RULE_SETUP -#line 352 "scan.l" +#line 541 "scan.l" { - yyless( yyleng - 2 ); /* put back '/', '*' */ - bracelevel = 0; - continued_action = false; - BEGIN(ACTION); + + 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 99: +case 148: YY_RULE_SETUP -#line 359 "scan.l" -/* allow indented rules */ +#line 555 "scan.l" +/* allow indented rules */ ; YY_BREAK -case 100: +case 149: YY_RULE_SETUP -#line 361 "scan.l" +#line 557 "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'; - } + 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 101: +case 150: +/* rule 150 can match eol */ YY_RULE_SETUP -#line 378 "scan.l" +#line 579 "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'; - } + 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 102: -#line 393 "scan.l" -case 103: +case 151: +#line 600 "scan.l" +case 152: YY_RULE_SETUP -#line 393 "scan.l" +#line 600 "scan.l" return EOF_OP; YY_BREAK -case 104: +case 153: YY_RULE_SETUP -#line 395 "scan.l" +#line 602 "scan.l" { sectnum = 3; BEGIN(SECT3); + outn("/* Begin user sect3 */"); yyterminate(); /* to stop the parser */ } YY_BREAK -case 105: +case 154: YY_RULE_SETUP -#line 401 "scan.l" +#line 609 "scan.l" { int cclval; + if(yyleng < MAXLINE) + { strlcpy( nmstr, yytext, sizeof nmstr ); + } + else + { + synerr( _("Input line too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } /* Check to see if we've already encountered this * ccl. */ - if ( (cclval = ccllookup( (Char *) nmstr )) != 0 ) + 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" ) ); @@ -2294,15 +3408,41 @@ YY_RULE_SETUP } } YY_BREAK -case 106: +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 435 "scan.l" +#line 663 "scan.l" { Char *nmdefptr; - Char *ndlookup(); + int end_is_ws, end_ch; + end_ch = yytext[yyleng-1]; + end_is_ws = end_ch != '}' ? 1 : 0; + + if(yyleng-1 < MAXLINE) + { strlcpy( nmstr, yytext + 1, sizeof nmstr ); - nmstr[yyleng - 2] = '\0'; /* chop trailing brace */ + } + 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( @@ -2312,9 +3452,12 @@ YY_RULE_SETUP 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] == '$') ) + (len > 0 && nmdefptr[len - 1] == '$') + || (end_is_ws && trlcontxt && !sf_skip_ws())) { /* don't use ()'s after all */ PUT_BACK_STRING((char *) nmdefptr, 0); @@ -2331,69 +3474,126 @@ YY_RULE_SETUP } } YY_BREAK -case 107: +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 469 "scan.l" +#line 743 "scan.l" return (unsigned char) yytext[0]; YY_BREAK -case 108: +case 164: YY_RULE_SETUP -#line 470 "scan.l" +#line 744 "scan.l" RETURNCHAR; YY_BREAK -case 109: +case 165: +/* rule 165 can match eol */ YY_RULE_SETUP -#line 475 "scan.l" +#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 110: +case 167: YY_RULE_SETUP -#line 476 "scan.l" +#line 751 "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; +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 477 "scan.l" +#line 752 "scan.l" BEGIN(CARETISBOL); return '>'; YY_BREAK -case 112: +case 169: YY_RULE_SETUP -#line 478 "scan.l" +#line 753 "scan.l" RETURNNAME; YY_BREAK -case 113: +case 170: YY_RULE_SETUP -#line 479 "scan.l" +#line 754 "scan.l" { format_synerr( _( "bad <start condition>: %s" ), yytext ); } YY_BREAK -case 114: +case 171: YY_RULE_SETUP -#line 485 "scan.l" +#line 760 "scan.l" BEGIN(SECT2); return '^'; YY_BREAK -case 115: +case 172: YY_RULE_SETUP -#line 489 "scan.l" +#line 764 "scan.l" RETURNCHAR; YY_BREAK -case 116: +case 173: YY_RULE_SETUP -#line 490 "scan.l" +#line 765 "scan.l" BEGIN(SECT2); return '"'; YY_BREAK -case 117: +case 174: +/* rule 174 can match eol */ YY_RULE_SETUP -#line 492 "scan.l" +#line 767 "scan.l" { synerr( _( "missing quote" ) ); BEGIN(SECT2); @@ -2403,50 +3603,100 @@ YY_RULE_SETUP YY_BREAK -case 118: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp = yy_bp + 1; +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 502 "scan.l" +#line 790 "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; +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 503 "scan.l" +#line 791 "scan.l" return '^'; YY_BREAK -case 120: +case 186: YY_RULE_SETUP -#line 504 "scan.l" +#line 792 "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; +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 508 "scan.l" +#line 796 "scan.l" return '-'; YY_BREAK -case 122: +case 188: YY_RULE_SETUP -#line 509 "scan.l" +#line 797 "scan.l" RETURNCHAR; YY_BREAK -case 123: +case 189: YY_RULE_SETUP -#line 510 "scan.l" +#line 798 "scan.l" BEGIN(SECT2); return ']'; YY_BREAK -case 124: +case 190: +/* rule 190 can match eol */ YY_RULE_SETUP -#line 511 "scan.l" +#line 799 "scan.l" { synerr( _( "bad character class" ) ); BEGIN(SECT2); @@ -2455,69 +3705,129 @@ YY_RULE_SETUP YY_BREAK -case 125: +case 191: YY_RULE_SETUP -#line 519 "scan.l" +#line 807 "scan.l" BEGIN(CCL); return CCE_ALNUM; YY_BREAK -case 126: +case 192: YY_RULE_SETUP -#line 520 "scan.l" +#line 808 "scan.l" BEGIN(CCL); return CCE_ALPHA; YY_BREAK -case 127: +case 193: YY_RULE_SETUP -#line 521 "scan.l" +#line 809 "scan.l" BEGIN(CCL); return CCE_BLANK; YY_BREAK -case 128: +case 194: YY_RULE_SETUP -#line 522 "scan.l" +#line 810 "scan.l" BEGIN(CCL); return CCE_CNTRL; YY_BREAK -case 129: +case 195: YY_RULE_SETUP -#line 523 "scan.l" +#line 811 "scan.l" BEGIN(CCL); return CCE_DIGIT; YY_BREAK -case 130: +case 196: YY_RULE_SETUP -#line 524 "scan.l" +#line 812 "scan.l" BEGIN(CCL); return CCE_GRAPH; YY_BREAK -case 131: +case 197: YY_RULE_SETUP -#line 525 "scan.l" +#line 813 "scan.l" BEGIN(CCL); return CCE_LOWER; YY_BREAK -case 132: +case 198: YY_RULE_SETUP -#line 526 "scan.l" +#line 814 "scan.l" BEGIN(CCL); return CCE_PRINT; YY_BREAK -case 133: +case 199: YY_RULE_SETUP -#line 527 "scan.l" +#line 815 "scan.l" BEGIN(CCL); return CCE_PUNCT; YY_BREAK -case 134: +case 200: YY_RULE_SETUP -#line 528 "scan.l" +#line 816 "scan.l" BEGIN(CCL); return CCE_SPACE; YY_BREAK -case 135: +case 201: YY_RULE_SETUP -#line 529 "scan.l" +#line 817 "scan.l" BEGIN(CCL); return CCE_UPPER; YY_BREAK -case 136: +case 202: YY_RULE_SETUP -#line 530 "scan.l" +#line 818 "scan.l" BEGIN(CCL); return CCE_XDIGIT; YY_BREAK -case 137: +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 531 "scan.l" +#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" ), @@ -2527,36 +3837,43 @@ YY_RULE_SETUP YY_BREAK -case 138: +case 216: YY_RULE_SETUP -#line 540 "scan.l" +#line 841 "scan.l" { yylval = myctoi( yytext ); return NUMBER; } YY_BREAK -case 139: +case 217: YY_RULE_SETUP -#line 545 "scan.l" +#line 846 "scan.l" return ','; YY_BREAK -case 140: +case 218: YY_RULE_SETUP -#line 546 "scan.l" -BEGIN(SECT2); return '}'; +#line 847 "scan.l" +{ + BEGIN(SECT2); + if ( lex_compat || posix_compat ) + return END_REPEAT_POSIX; + else + return END_REPEAT_FLEX; + } YY_BREAK -case 141: +case 219: YY_RULE_SETUP -#line 548 "scan.l" +#line 855 "scan.l" { synerr( _( "bad character inside {}'s" ) ); BEGIN(SECT2); return '}'; } YY_BREAK -case 142: +case 220: +/* rule 220 can match eol */ YY_RULE_SETUP -#line 554 "scan.l" +#line 861 "scan.l" { synerr( _( "missing }" ) ); BEGIN(SECT2); @@ -2566,42 +3883,53 @@ YY_RULE_SETUP YY_BREAK -case 143: +case 221: YY_RULE_SETUP -#line 564 "scan.l" +#line 871 "scan.l" bracelevel = 0; YY_BREAK -case 144: +case 222: YY_RULE_SETUP -#line 566 "scan.l" +#line 873 "scan.l" ACTION_ECHO; yy_push_state( COMMENT ); YY_BREAK -case 145: +case 223: YY_RULE_SETUP -#line 569 "scan.l" +#line 876 "scan.l" { ACTION_ECHO; CHECK_REJECT(yytext); } YY_BREAK -case 146: +case 224: YY_RULE_SETUP -#line 573 "scan.l" +#line 880 "scan.l" { ACTION_ECHO; CHECK_YYMORE(yytext); } YY_BREAK -case 147: +case 225: YY_RULE_SETUP -#line 579 "scan.l" +#line 886 "scan.l" +ACTION_ECHO_QSTART; + 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 148: +case 228: +/* rule 228 can match eol */ YY_RULE_SETUP -#line 580 "scan.l" +#line 889 "scan.l" { ++linenum; ACTION_ECHO; @@ -2619,39 +3947,55 @@ YY_RULE_SETUP /* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */ -case 149: +case 229: YY_RULE_SETUP -#line 598 "scan.l" +#line 907 "scan.l" ACTION_ECHO; ++bracelevel; YY_BREAK -case 150: +case 230: YY_RULE_SETUP -#line 599 "scan.l" +#line 908 "scan.l" ACTION_ECHO; --bracelevel; YY_BREAK -case 151: +case 231: YY_RULE_SETUP -#line 600 "scan.l" +#line 909 "scan.l" +ACTION_ECHO_QSTART; + 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 152: +case 234: YY_RULE_SETUP -#line 601 "scan.l" +#line 912 "scan.l" ACTION_ECHO; YY_BREAK -case 153: +case 235: YY_RULE_SETUP -#line 602 "scan.l" +#line 913 "scan.l" +ACTION_ECHO; + YY_BREAK +case 236: +YY_RULE_SETUP +#line 914 "scan.l" ACTION_ECHO; /* character constant */ YY_BREAK -case 154: +case 237: YY_RULE_SETUP -#line 603 "scan.l" +#line 915 "scan.l" ACTION_ECHO; BEGIN(ACTION_STRING); YY_BREAK -case 155: +case 238: +/* rule 238 can match eol */ YY_RULE_SETUP -#line 604 "scan.l" +#line 916 "scan.l" { ++linenum; ACTION_ECHO; @@ -2665,51 +4009,62 @@ YY_RULE_SETUP } } YY_BREAK -case 156: +case 239: YY_RULE_SETUP -#line 616 "scan.l" +#line 928 "scan.l" ACTION_ECHO; YY_BREAK -case 157: +case 240: YY_RULE_SETUP -#line 620 "scan.l" +#line 932 "scan.l" ACTION_ECHO; YY_BREAK -case 158: +case 241: YY_RULE_SETUP -#line 621 "scan.l" +#line 933 "scan.l" ACTION_ECHO; YY_BREAK -case 159: +case 242: +/* rule 242 can match eol */ YY_RULE_SETUP -#line 622 "scan.l" -++linenum; ACTION_ECHO; +#line 934 "scan.l" +++linenum; ACTION_ECHO; BEGIN(ACTION); YY_BREAK -case 160: +case 243: YY_RULE_SETUP -#line 623 "scan.l" +#line 935 "scan.l" ACTION_ECHO; BEGIN(ACTION); YY_BREAK -case 161: +case 244: YY_RULE_SETUP -#line 624 "scan.l" +#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 627 "scan.l" +#line 939 "scan.l" { synerr( _( "EOF encountered inside an action" ) ); yyterminate(); } YY_BREAK -case 162: +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 633 "scan.l" +#line 949 "scan.l" { yylval = myesc( (Char *) yytext ); @@ -2720,66 +4075,84 @@ YY_RULE_SETUP } YY_BREAK -case 163: +case 246: YY_RULE_SETUP -#line 644 "scan.l" +#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 645 "scan.l" +#line 964 "scan.l" sectnum = 0; yyterminate(); YY_BREAK -case 164: +case 250: +/* rule 250 can match eol */ YY_RULE_SETUP -#line 648 "scan.l" +#line 967 "scan.l" format_synerr( _( "bad character: %s" ), yytext ); YY_BREAK -case 165: +case 251: YY_RULE_SETUP -#line 650 "scan.l" +#line 969 "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(); +#line 4115 "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; + 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_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + 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 + * 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; + (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 @@ -2789,13 +4162,13 @@ case YY_STATE_EOF(LINEDIR): * 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] ) + 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_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; - yy_current_state = yy_get_previous_state(); + yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have @@ -2808,30 +4181,30 @@ case YY_STATE_EOF(LINEDIR): yy_next_state = yy_try_NUL_trans( yy_current_state ); - yy_bp = yytext_ptr + YY_MORE_ADJ; + yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ - yy_cp = ++yy_c_buf_p; + yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { - yy_cp = yy_c_buf_p; + yy_cp = (yy_c_buf_p); goto yy_find_action; } } - else switch ( yy_get_next_buffer() ) + else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { - yy_did_buffer_switch_on_eof = 0; + (yy_did_buffer_switch_on_eof) = 0; - if ( yywrap() ) + if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up @@ -2842,7 +4215,7 @@ case YY_STATE_EOF(LINEDIR): * YY_NULL, it'll still work - another * YY_NULL will get returned. */ - yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; @@ -2850,30 +4223,30 @@ case YY_STATE_EOF(LINEDIR): else { - if ( ! yy_did_buffer_switch_on_eof ) + 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_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; - yy_current_state = yy_get_previous_state(); + yy_current_state = yy_get_previous_state( ); - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; + 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_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; - yy_current_state = yy_get_previous_state(); + yy_current_state = yy_get_previous_state( ); - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; @@ -2884,8 +4257,8 @@ case YY_STATE_EOF(LINEDIR): "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ - } /* end of yylex */ - + } /* end of user's declarations */ +} /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * @@ -2894,21 +4267,20 @@ case YY_STATE_EOF(LINEDIR): * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ - -static int yy_get_next_buffer YY_PROTO(( void )) - { - char *dest = yy_current_buffer->yy_ch_buf; - char *source = yytext_ptr; +static int yy_get_next_buffer (void) +{ + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = (yytext_ptr); int number_to_move, i; int ret_val; - if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + 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->yy_fill_buffer == 0 ) + 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 ) + 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. @@ -2928,86 +4300,52 @@ static int yy_get_next_buffer YY_PROTO(( void )) /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + 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 ) + 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->yy_n_chars = yy_n_chars = 0; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { - int num_to_read = - yy_current_buffer->yy_buf_size - number_to_move - 1; + yy_size_t num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ -#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_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); - yy_current_buffer->yy_n_chars = yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } - if ( yy_n_chars == 0 ) + if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin ); + yyrestart(yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_buffer_status = + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } @@ -3015,153 +4353,141 @@ static int yy_get_next_buffer YY_PROTO(( void )) 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; + 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()" ); + } - yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + (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; - return ret_val; - } + (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 YY_PROTO(( void )) - { + static yy_state_type yy_get_previous_state (void) +{ yy_state_type yy_current_state; char *yy_cp; - - yy_current_state = yy_start; + + 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 ) + (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 ) { 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 ) + 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 ); */ - -#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 - { + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ int yy_is_jam; - char *yy_cp = yy_c_buf_p; - + 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 ) + 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 == 768); - - return yy_is_jam ? 0 : yy_current_state; - } + 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; +} -#ifndef YY_NO_UNPUT -#ifdef YY_USE_PROTOS -static void yyunput( int c, char *yy_bp ) -#else -static void yyunput( c, yy_bp ) -int c; -char *yy_bp; -#endif - { - char *yy_cp = yy_c_buf_p; + static void yyunput (int c, char * yy_bp ) +{ + char *yy_cp; + + yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ - *yy_cp = yy_hold_char; + *yy_cp = (yy_hold_char); - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ - int number_to_move = yy_n_chars + 2; - char *dest = &yy_current_buffer->yy_ch_buf[ - yy_current_buffer->yy_buf_size + 2]; + yy_size_t number_to_move = (yy_n_chars) + 2; + char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; char *source = - &yy_current_buffer->yy_ch_buf[number_to_move]; + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; - while ( source > yy_current_buffer->yy_ch_buf ) + while ( source > YY_CURRENT_BUFFER_LVALUE->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; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + 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; +} - yytext_ptr = yy_bp; - yy_hold_char = *yy_cp; - yy_c_buf_p = yy_cp; - } -#endif /* ifndef YY_NO_UNPUT */ - - +#ifndef YY_NO_INPUT #ifdef __cplusplus -static int yyinput YY_PROTO(( void )) + static int yyinput (void) #else -static int input YY_PROTO(( void )) + static int input (void) #endif - { - int c; - *yy_c_buf_p = yy_hold_char; +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); - if ( *yy_c_buf_p == YY_END_OF_BUFFER_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] ) + 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'; + *(yy_c_buf_p) = '\0'; else { /* need more input */ - int offset = yy_c_buf_p - yytext_ptr; - ++yy_c_buf_p; + yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); - switch ( yy_get_next_buffer() ) + switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() @@ -3175,16 +4501,16 @@ static int input YY_PROTO(( void )) */ /* Reset buffer status. */ - yyrestart( yyin ); + yyrestart(yyin ); - /* fall through */ + /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { - if ( yywrap() ) + if ( yywrap( ) ) return EOF; - if ( ! yy_did_buffer_switch_on_eof ) + if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); @@ -3194,91 +4520,94 @@ static int input YY_PROTO(( void )) } case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext_ptr + offset; + (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; + 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'); + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); return c; - } +} +#endif /* ifndef YY_NO_INPUT */ - -#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(); +/** 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( ); +} -#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 ) +/** 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 ) + 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_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 = new_buffer; - yy_load_buffer_state(); + 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; - } - - -#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; - } - + (yy_did_buffer_switch_on_eof) = 1; +} -#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 - { +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) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); @@ -3287,80 +4616,71 @@ int 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 ); + 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 ); + 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 - { +/** 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 ) - yy_current_buffer = (YY_BUFFER_STATE) 0; + 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 ) - 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 + yyfree((void *) b->yy_ch_buf ); -#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 + yyfree((void *) b ); +} +/* 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 ) - { - yy_flush_buffer( b ); +{ + int oerrno = errno; + + yy_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; -#if defined(YY_ALWAYS_INTERACTIVE) && YY_ALWAYS_INTERACTIVE - b->yy_is_interactive = 1; -#else -#if defined(YY_NEVER_INTERACTIVE) && 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 ) + /* 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; @@ -3377,29 +4697,125 @@ YY_BUFFER_STATE b; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; - if ( b == yy_current_buffer ) - yy_load_buffer_state(); + 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) +{ + yy_size_t 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; + } -#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 ((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) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); @@ -3413,56 +4829,51 @@ yy_size_t size; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; - yy_switch_to_buffer( b ); + 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 - { +/** 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 yybytes the byte buffer to scan + * @param _yybytes_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, yy_size_t _yybytes_len ) +{ YY_BUFFER_STATE b; char *buf; yy_size_t n; - int i; - + yy_size_t i; + /* Get memory for full buffer, including space for trailing EOB's. */ - n = len + 2; - buf = (char *) yy_flex_alloc( n ); + 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 < len; ++i ) - buf[i] = bytes[i]; + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - b = yy_scan_buffer( buf, n ); + b = yy_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); @@ -3472,78 +4883,49 @@ int len; 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 ) + 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 ); + (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 ); + if ( ! (yy_start_stack) ) + (yy_start_stack) = (int *) yyalloc(new_size ); else - yy_start_stack = (int *) yy_flex_realloc( - (void *) yy_start_stack, new_size ); + (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" ); + if ( ! (yy_start_stack) ) + YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } - yy_start_stack[yy_start_stack_ptr++] = YY_START; + (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); - } -#endif +} - -#ifndef YY_NO_POP_STATE -static void yy_pop_state YY_PROTO(( void )) - { - if ( --yy_start_stack_ptr < 0 ) + 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]); - } -#endif - - -#ifndef YY_NO_TOP_STATE -static int yy_top_state YY_PROTO(( void )) - { - return yy_start_stack[yy_start_stack_ptr - 1]; - } -#endif + BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); +} #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 ); +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. */ @@ -3552,68 +4934,193 @@ char msg[]; 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; \ + 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. */ -/* Internal utility routines. */ +/** Get the current line number. + * + */ +int yyget_lineno (void) +{ + + return yylineno; +} -#ifndef yytext_ptr -#ifdef YY_USE_PROTOS -static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +/** 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. + * + */ +yy_size_t 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 -static void yy_flex_strncpy( s1, s2, n ) -char *s1; -yyconst char *s2; -int n; + 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 ) +{ 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 - { +static int yy_flex_strlen (yyconst char * s ) +{ 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 - { +void *yyalloc (yy_size_t size ) +{ 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 - { +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 @@ -3622,26 +5129,17 @@ yy_size_t size; * 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 ); - } +void yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 969 "scan.l" -#if defined(YY_MAIN) && YY_MAIN -int main() - { - yylex(); - return 0; - } -#endif -#line 650 "scan.l" @@ -3703,3 +5201,4 @@ void *ptr; if ( ptr ) free( ptr ); } + diff --git a/usr.bin/lex/initskel.c b/usr.bin/lex/initskel.c new file mode 100644 index 00000000000..2316ae6c294 --- /dev/null +++ b/usr.bin/lex/initskel.c @@ -0,0 +1,3732 @@ +/* $OpenBSD: initskel.c,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* 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 39", + "#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;", + "", + "/* 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 /* ! C99 */", + "", + "#endif /* ! FLEXINT_H */", + "", + "%endif", + "", + "%if-c++-only", + "/* begin standard C++ headers. */", + "#include <iostream> ", + "#include <errno.h>", + "#include <cstdlib>", + "#include <cstdio>", + "#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]])", + "%# Perform a noop access on yyguts to prevent unused variable complains", + "m4_define( [[M4_YY_NOOP_GUTS_VAR]], [[(void)yyg]])", + "%# 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( [[M4_YY_NOOP_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", + "", + "#ifndef YY_TYPEDEF_YY_SIZE_T", + "#define YY_TYPEDEF_YY_SIZE_T", + "typedef size_t yy_size_t;", + "#endif", + "", + "%if-not-reentrant", + "extern yy_size_t 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_LINENO_REWIND_TO(dst) \\", + " do {\\", + " const char *p;\\", + " for ( p = yy_cp-1; p >= (dst); --p)\\", + " if ( *p == '\\n' )\\", + " --yylineno;\\", + " }while(0)", + " ]],", + " [[", + " #define YY_LESS_LINENO(n)", + " #define YY_LINENO_REWIND_TO(ptr)", + " ]])", + "]])", + "", + "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_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.", + " */", + " yy_size_t 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 yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */", + "yy_size_t 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, yy_size_t 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", + "", + "m4_ifdef( [[M4_YY_NOT_IN_HEADER]],", + "[[", + "%% [1.5] DFA", + "]])", + "", + "%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;", + " yy_size_t yy_n_chars;", + " yy_size_t 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]],,", + "[[", + "yy_size_t 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 );", + "]])", + "", + "m4_ifdef( [[M4_YY_REENTRANT]],", + "[[", + "m4_ifdef( [[M4_YY_NO_GET_COLUMN]],,", + "[[", + "int yyget_column M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );", + "]])", + "]])", + "", + "m4_ifdef( [[M4_YY_REENTRANT]],", + "[[", + "m4_ifdef( [[M4_YY_NO_SET_COLUMN]],,", + "[[", + "void yyset_column M4_YY_PARAMS( int column_no 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 do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)", + "%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", + "{", + " yy_state_type yy_current_state;", + " char *yy_cp, *yy_bp;", + " 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;", + " ]])", + "]])", + "", + "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 );", + " }", + "", + " {", + "%% [7.0] user's declarations go here", + "", + " 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 user's declarations */", + "} /* 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();", + " char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;", + " char *source = YY_G(yytext_ptr);", + " 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", + " {", + " yy_size_t num_to_read =", + " YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;", + "", + " while ( num_to_read <= 0 )", + " { /* Not enough room in the buffer - grow it. */", + "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_LVALUE;", + "", + " int yy_c_buf_p_offset =", + " (int) (YY_G(yy_c_buf_p) - b->yy_ch_buf);", + "", + " if ( b->yy_is_our_buffer )", + " {", + " yy_size_t 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), 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", + "{", + " yy_state_type yy_current_state;", + " 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", + "{", + " 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", + "", + " M4_YY_NOOP_GUTS_VAR();", + " return yy_is_jam ? 0 : yy_current_state;", + "}", + "", + "", + "%if-c-only", + "m4_ifdef( [[M4_YY_NO_UNPUT]],,", + "[[", + " static void yyunput YYFARGS2( int,c, char *,yy_bp)", + "%endif", + "%if-c++-only", + " void yyFlexLexer::yyunput( int c, char* yy_bp)", + "%endif", + "{", + " 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. */", + " yy_size_t number_to_move = YY_G(yy_n_chars) + 2;", + " char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[", + " YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];", + " 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 */", + " yy_size_t 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 );", + "}", + "", + "", + "/* 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", + "{", + " yy_size_t 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 yybytes the byte buffer to scan", + " * @param _yybytes_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, yy_size_t ,_yybytes_len)", + "{", + " YY_BUFFER_STATE b;", + " char *buf;", + " yy_size_t n;", + " yy_size_t 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", + " */", + "yy_size_t 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\" );", + " ]])", + " 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\" );", + " ]])", + " 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)", + "{", + " 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)", + "{", + " 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. */", + " 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. */", + " 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. */", + " 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. */", + " 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\" );", + " }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\" );", + " }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\" );", + " }else", + " ((flex_int8_t *) v)[0] = (flex_int8_t) t32;", + " break;", + " default:", + " YY_FATAL_ERROR( \"invalid dmap->dm_sz for struct\" ); /* TODO: not fatal. */", + " 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. */", + " 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\" );", + " }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\" );", + " }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\" );", + " }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\" );", + " }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. */", + " 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/usr.bin/lex/libmain.c b/usr.bin/lex/libmain.c index 417155f2b0d..37bc4ee1347 100644 --- a/usr.bin/lex/libmain.c +++ b/usr.bin/lex/libmain.c @@ -1,19 +1,35 @@ -/* $OpenBSD: libmain.c,v 1.7 2012/12/05 23:20:25 deraadt Exp $ */ +/* $OpenBSD: libmain.c,v 1.8 2015/11/19 19:43:40 tedu Exp $ */ /* libmain - flex run-time support library "main" function */ -/* $Header: /cvs/OpenBSD/src/usr.bin/lex/libmain.c,v 1.7 2012/12/05 23:20:25 deraadt Exp $ */ +/* 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: */ -int yylex(void); -int main(int, char **); +/* 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. */ -/* ARGSUSED */ -int -main(int argc, char *argv[]) +/* 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) - ; + while (yylex () != 0) ; return 0; } diff --git a/usr.bin/lex/libyywrap.c b/usr.bin/lex/libyywrap.c index 3c42a6d6c3a..f359c95ee5d 100644 --- a/usr.bin/lex/libyywrap.c +++ b/usr.bin/lex/libyywrap.c @@ -1,13 +1,29 @@ -/* $OpenBSD: libyywrap.c,v 1.7 2012/12/05 23:20:25 deraadt Exp $ */ +/* $OpenBSD: libyywrap.c,v 1.8 2015/11/19 19:43:40 tedu Exp $ */ /* libyywrap - flex run-time support library "yywrap" function */ -/* $Header: /cvs/OpenBSD/src/usr.bin/lex/libyywrap.c,v 1.7 2012/12/05 23:20:25 deraadt Exp $ */ +/* This file is part of flex. */ -int yywrap(void); +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ -int -yywrap(void) +/* 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/usr.bin/lex/main.c b/usr.bin/lex/main.c index ce8e98cfa83..05e3f267e72 100644 --- a/usr.bin/lex/main.c +++ b/usr.bin/lex/main.c @@ -1,354 +1,496 @@ -/* $OpenBSD: main.c,v 1.15 2015/10/10 05:47:54 deraadt Exp $ */ +/* $OpenBSD: main.c,v 1.16 2015/11/19 19:43:40 tedu Exp $ */ /* 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, 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. - */ +/* 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: /cvs/OpenBSD/src/usr.bin/lex/main.c,v 1.15 2015/10/10 05:47:54 deraadt 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" #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)); - -#ifdef NEED_ARGV_FIXUP -extern void argv_fixup PROTO((int *, char ***)); -#endif +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, 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; +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; +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; +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"; +char *program_name = "flex"; #ifndef SHORT_FILE_NAMES -static const char outfile_template[] = "lex.%s.%s"; -static const char backing_name[] = "lex.backup"; +static const char *outfile_template = "lex.%s.%s"; +static const char *backing_name = "lex.backup"; +static const char *tablesfile_template = "lex.%s.tables"; #else -static const char outfile_template[] = "lex%s.%s"; -static const char backing_name[] = "lex.bck"; -#endif - -#ifdef THINK_C -#include <console.h> +static const char *outfile_template = "lex%s.%s"; +static const char *backing_name = "lex.bck"; +static const 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; - - -int main( argc, argv ) -int argc; -char **argv; - { - int i; - - if (pledge("stdio rpath wpath cpath", NULL) == -1) - { - fprintf( stderr, _( "%s: pledge\n" ), - program_name); - exit(1); - } - -#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] ); +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 (); + + skelout (); + /* %% [1.5] DFA */ + 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(); + make_tables (); /* Note, flexend does not return. It exits with its argument * as status. */ - flexend( 0 ); + 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 0; + if (pledge("stdio rpath wpath cpath proc exec", NULL) == -1) + { + fprintf( stderr, _( "%s: pledge\n"), + program_name); + exit(1); } + return flex_main (argc, argv); +} /* check_options - check user-specified options */ -void check_options() - { - int i; +void check_options () +{ + int i; + const char * m4 = NULL; - if ( lex_compat ) - { - if ( C_plus_plus ) - flexerror( _( "Can't use -+ with -l option" ) ); + 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 (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; + if (reentrant || bison_bridge_lval) + flexerror (_ + ("Can't use --reentrant or --bison-bridge with -l option")); yytext_is_array = true; do_yylineno = true; use_read = false; - } + } + - if ( do_yylineno ) +#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 ) + if (csize == unspecified) { + if ((fulltbl || fullspd) && !useecs) csize = DEFAULT_CSIZE; else csize = CSIZE; - } + } - if ( interactive == unspecified ) - { - if ( fulltbl || fullspd ) + 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 (fulltbl || fullspd) { + if (usemecs) + flexerror (_ + ("-Cf/-CF and -Cm don't make sense together")); - if ( interactive ) - flexerror( _( "-Cf/-CF and -I are incompatible" ) ); + if (interactive) + flexerror (_("-Cf/-CF and -I are incompatible")); - if ( lex_compat ) - flexerror( - _( "-Cf/-CF are incompatible with lex-compatibility mode" ) ); + 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 (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 && fullspd) + flexerror (_("Can't use -+ with -CF option")); - if ( C_plus_plus && yytext_is_array ) - { - warn( _( "%array incompatible with -+ 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. */ + + 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 ) - { + for (i = 2; i <= csize; ++i) { ecgroup[i] = i - 1; nextecm[i - 1] = i; - } + } nextecm[csize] = NIL; - } + } - else - { + else { /* Put everything in its own equivalence class. */ - for ( i = 1; i <= csize; ++i ) - { + for (i = 1; i <= csize; ++i) { ecgroup[i] = i; nextecm[i] = BAD_SUBSCRIPT; /* to catch errors */ - } } + } - if ( ! use_stdout ) - { - FILE *prev_stdout; + if (!ansi_func_defs) + buf_m4_define( &m4defs_buf, "M4_YY_NO_ANSI_FUNC_DEFS", NULL); - if ( ! did_outfilename ) - { - char *suffix; + if (!ansi_func_protos) + buf_m4_define( &m4defs_buf, "M4_YY_NO_ANSI_FUNC_PROTOS", NULL); - if ( C_plus_plus ) + 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 ); + snprintf (outfile_path, sizeof(outfile_path), outfile_template, + prefix, suffix); outfilename = outfile_path; - } + } - prev_stdout = freopen( outfilename, "w", stdout ); + prev_stdout = freopen (outfilename, "w+", stdout); - if ( prev_stdout == NULL ) - lerrsf( _( "could not create %s" ), outfilename ); + 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" ); - } + /* 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; - if ( do_yywrap ) - GEN_PREFIX( "wrap" ); - outn( "" ); + /* 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 ( did_outfilename ) - line_directive_out( stdout, 0 ); + if ((tablesout = fopen (tablesfilename, "w")) == NULL) + lerrsf (_("could not create %s"), tablesfilename); + if (pname) + free (pname); + tablesfilename = 0; + + yytbl_writer_init (&tableswr, tablesout); - skelout(); + 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); + if (!str) + flexfatal(_("allocation of macro definition failed")); + 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 * @@ -356,494 +498,958 @@ void check_options() * This routine does not return. */ -void flexend( exit_status ) -int exit_status; +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 ); - } +{ + static int called_before = -1; /* prevent infinite recursion. */ + int tblsiz; - if ( exit_status != 0 && outfile_created ) - { - if ( ferror( stdout ) ) - lerrsf( _( "error writing output file %s" ), - outfilename ); + if (++called_before) + FLEX_EXIT (exit_status); - else if ( fclose( stdout ) ) - lerrsf( _( "error closing output file %s" ), - outfilename ); + if (skelfile != NULL) { + if (ferror (skelfile)) + lerrsf (_("input error reading skeleton file %s"), + skelname); - else if ( unlink( outfilename ) ) - lerrsf( _( "error deleting output file %s" ), - outfilename ); + 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]); } - 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 ); + 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" ) ); + fprintf (backing_up_file, + _("Compressed tables always back up.\n")); - if ( ferror( backing_up_file ) ) - lerrsf( _( "error writing backup file %s" ), - backing_name ); + 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 ); - } + 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 ) + 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 ); + 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 ); + 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" ) ); + 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 ) - { + 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 ); - } + fprintf (stderr, _(" %d table entries\n"), + tblsiz); + } - else - { + 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 ); - } + 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 ) - { + if (useecs) { tblsiz = tblsiz + csize; - fprintf( stderr, - _( " %d/%d equivalence classes created\n" ), - numecs, csize ); - } + fprintf (stderr, + _ + (" %d/%d equivalence classes created\n"), + numecs, csize); + } - if ( usemecs ) - { + 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 ); + fprintf (stderr, + _ + (" %d/%d meta-equivalence classes created\n"), + nummecs, csize); } - exit( exit_status ); + 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; - char *arg; +/* flexinit - initialize flex */ - 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; +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 ); + action_array = allocate_character_array (action_size); defs1_offset = prolog_offset = action_offset = action_index = 0; action_array[0] = '\0'; - program_name = argv[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 */ - if ( program_name[0] != '\0' && - program_name[strlen( program_name ) - 1] == '+' ) + { + 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 */ - for ( --argc, ++argv; argc ; --argc, ++argv ) - { - arg = argv[0]; + 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 ( arg[0] != '-' || arg[1] == '\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; - if ( arg[1] == '-' ) - { /* --option */ - if ( ! strcmp( arg, "--help" ) ) - arg = "-h"; + case OPT_BACKUP: + backing_up_report = true; + break; - else if ( ! strcmp( arg, "--version" ) ) - arg = "-V"; + case OPT_DONOTHING: + break; - else if ( ! strcmp( arg, "--" ) ) - { /* end of options */ - --argc; - ++argv; - break; - } + case OPT_COMPRESSION: + if (!sawcmpflag) { + useecs = false; + usemecs = false; + fulltbl = false; + sawcmpflag = true; } - for ( i = 1; arg[i] != '\0'; ++i ) - switch ( arg[i] ) - { - case '+': - C_plus_plus = true; + for (i = 0; arg && arg[i] != '\0'; i++) + switch (arg[i]) { + case 'a': + long_align = true; break; - case 'B': - interactive = false; + case 'e': + useecs = true; break; - case 'b': - backing_up_report = true; + case 'F': + fullspd = true; break; - case 'c': + case 'f': + fulltbl = true; 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; + case 'm': + usemecs = true; break; - case 'f': - useecs = usemecs = false; - use_read = fulltbl = true; + case 'r': + use_read = true; break; - case 'F': - useecs = usemecs = false; - use_read = fullspd = true; + default: + lerrif (_ + ("unknown -C option '%c'"), + (int) arg[i]); break; + } + break; - case '?': - case 'h': - usage(); - exit( 0 ); + case OPT_DEBUG: + ddebug = true; + break; - case 'I': - interactive = true; - break; + case OPT_NO_DEBUG: + ddebug = false; + break; - case 'i': - caseins = true; - break; + case OPT_FULL: + useecs = usemecs = false; + use_read = fulltbl = true; + break; - case 'l': - lex_compat = true; - break; + case OPT_FAST: + useecs = usemecs = false; + use_read = fullspd = true; + break; - case 'L': - gen_line_dirs = false; - break; + case OPT_HELP: + usage (); + FLEX_EXIT (0); - case 'n': - /* Stupid do-nothing deprecated - * option. - */ - break; + case OPT_INTERACTIVE: + interactive = true; + break; - case 'o': - if ( i != 1 ) - flexerror( - _( "-o flag must be given separately" ) ); + case OPT_CASE_INSENSITIVE: + sf_set_case_ins(true); + break; - outfilename = arg + i + 1; - did_outfilename = 1; - goto get_next_arg; + case OPT_LEX_COMPAT: + lex_compat = true; + break; - case 'P': - if ( i != 1 ) - flexerror( - _( "-P flag must be given separately" ) ); + case OPT_POSIX_COMPAT: + posix_compat = true; + break; - prefix = arg + i + 1; - goto get_next_arg; + case OPT_PREPROC_LEVEL: + preproc_level = strtol(arg,NULL,0); + break; - case 'p': - ++performance_report; - break; + case OPT_MAIN: + buf_strdefine (&userdef_buf, "YY_MAIN", "1"); + do_yywrap = false; + break; - case 'S': - if ( i != 1 ) - flexerror( - _( "-S flag must be given separately" ) ); + case OPT_NO_MAIN: + buf_strdefine (&userdef_buf, "YY_MAIN", "0"); + break; - skelname = arg + i + 1; - goto get_next_arg; + case OPT_NO_LINE: + gen_line_dirs = false; + break; - case 's': - spprdflt = true; - break; + case OPT_OUTFILE: + outfilename = arg; + did_outfilename = 1; + break; - case 't': - use_stdout = true; - break; + case OPT_PREFIX: + prefix = arg; + break; - case 'T': - trace = true; - break; + case OPT_PERF_REPORT: + ++performance_report; + break; - case 'v': - printstats = true; - break; + case OPT_BISON_BRIDGE: + bison_bridge_lval = true; + break; - case 'V': - printf( _( "%s version %s\n" ), - program_name, flex_version ); - exit( 0 ); + case OPT_BISON_BRIDGE_LOCATIONS: + bison_bridge_lval = bison_bridge_lloc = true; + break; - case 'w': - nowarn = true; - break; + case OPT_REENTRANT: + reentrant = true; + break; - case '7': - csize = 128; - break; + case OPT_NO_REENTRANT: + reentrant = false; + break; - case '8': - csize = CSIZE; - break; + case OPT_SKEL: + skelname = arg; + 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 ); + 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; - /* Used by -C, -S, -o, and -P flags in lieu of a "continue 2" - * control. - */ - get_next_arg: ; - } + 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; - num_input_files = argc; - input_files = argv; - set_input_file( num_input_files > 0 ? input_files[0] : NULL ); + 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; + 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; + linenum = sectnum = 1; firstprot = NIL; /* Used in mkprot() so that the first proto goes in slot 1 @@ -851,334 +1457,410 @@ char **argv; */ lastprot = 1; - set_up_initial_allocations(); - } + set_up_initial_allocations (); +} /* readin - read in the rules section of the input file(s) */ -void readin() - { +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 ); + line_directive_out ((FILE *) 0, 1); - if ( yyparse() ) - { - pinpoint_message( _( "fatal parse error" ) ); - flexend( 1 ); - } + if (yyparse ()) { + pinpoint_message (_("fatal parse error")); + flexend (1); + } - if ( syntaxerror ) - 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 ( 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 ); - } + 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 ) + if (yymore_really_used == true) yymore_used = true; - else if ( yymore_really_used == false ) + else if (yymore_really_used == false) yymore_used = false; - if ( reject_really_used == true ) + if (reject_really_used == true) reject = true; - else if ( reject_really_used == false ) + 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" ) ); - } + 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" ) ); - } + 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 (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 (yymore_used) + fprintf (stderr, + _ + ("yymore() entails a minor performance penalty\n")); + } - if ( reject ) - fprintf( stderr, - _( "REJECT entails a large 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 (variable_trailing_context_rules) + fprintf (stderr, + _ + ("Variable trailing context rules entail a large performance penalty\n")); + } - if ( reject ) + if (reject) real_reject = true; - if ( variable_trailing_context_rules ) + 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" ) ); + 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 ) - outn( "\n#define YY_USES_REJECT" ); + flexerror (_ + ("variable trailing context rules cannot be used with -f or -F")); + } - if ( ! do_yywrap ) - { - outn( "\n#define yywrap() 1" ); - outn( "#define YY_SKIP_YYWRAP" ); - } + if (reject){ + out_m4_define( "M4_YY_USES_REJECT", NULL); + //outn ("\n#define YY_USES_REJECT"); + } + + if (!do_yywrap) { + if (!C_plus_plus) + if (reentrant) + outn ("\n#define yywrap(yyscanner) 1"); + else + outn ("\n#define yywrap() 1"); + outn ("#define YY_SKIP_YYWRAP"); + } - if ( ddebug ) - outn( "\n#define FLEX_DEBUG" ); + if (ddebug) + outn ("\n#define FLEX_DEBUG"); - if ( csize == 256 ) - outn( "typedef unsigned char YY_CHAR;" ); + OUT_BEGIN_CODE (); + if (csize == 256) + outn ("typedef unsigned char YY_CHAR;"); else - outn( "typedef char YY_CHAR;" ); - - if ( C_plus_plus ) - { - outn( "#define yytext_ptr yytext" ); + outn ("typedef char YY_CHAR;"); + OUT_END_CODE (); - if ( interactive ) - outn( "#define YY_INTERACTIVE" ); - } + if (C_plus_plus) { + outn ("#define yytext_ptr yytext"); - 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" ); - } + if (interactive) + outn ("#define YY_INTERACTIVE"); + } - else - outn( yy_nostdinit ); + 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"); } - if ( fullspd ) - outn( "typedef yyconst struct yy_trans_info *yy_state_type;" ); - else if ( ! C_plus_plus ) - outn( "typedef int yy_state_type;" ); + else { + if(!reentrant) + outn (yy_nostdinit); + } + OUT_END_CODE (); + } - if ( ddebug ) - outn( "\n#define FLEX_DEBUG" ); + 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 ( lex_compat ) - outn( "#define YY_FLEX_LEX_COMPAT" ); + if (C_plus_plus) { + outn ("\n#include <FlexLexer.h>"); - if ( do_yylineno && ! C_plus_plus ) - { - outn( "extern int yylineno;" ); - outn( "int yylineno = 1;" ); + if (!do_yywrap) { + outn("\nint yyFlexLexer::yywrap() { return 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}"); - 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 ); - } + out_str ("\n#define YY_DECL int %s::yylex()\n", + yyclass); } + } - else - { - if ( yytext_is_array ) - outn( "extern char yytext[];\n" ); + else { - else - { - outn( "extern char *yytext;" ); - outn( "#define yytext_ptr yytext" ); + /* 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 ); + 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] ); + NUL_ec = ABS (ecgroup[0]); - if ( useecs ) - ccl2ecl(); - } + if (useecs) + ccl2ecl (); +} /* set_up_initial_allocations - allocate memory for internal tables */ -void set_up_initial_allocations() - { +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 ); + 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_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 ); + 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 ); + 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 ); + 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 ); + 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 ); + 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 ); + 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 [-bdfhilnpstvwBFILTV78+? -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-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 ) - { - snprintf( outfile_path, sizeof outfile_path, outfile_template, - prefix, C_plus_plus ? "cc" : "c" ); +} + + +/* 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, - _( "\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 ); } + + 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" + " -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/usr.bin/lex/misc.c b/usr.bin/lex/misc.c index 40797f57448..0dddc3aace7 100644 --- a/usr.bin/lex/misc.c +++ b/usr.bin/lex/misc.c @@ -1,71 +1,151 @@ -/* $OpenBSD: misc.c,v 1.14 2015/10/15 05:57:09 mmcc Exp $ */ +/* $OpenBSD: misc.c,v 1.15 2015/11/19 19:43:40 tedu Exp $ */ /* 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, 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. - */ +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ -/* $Header: /cvs/OpenBSD/src/usr.bin/lex/misc.c,v 1.14 2015/10/15 05:57:09 mmcc 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. */ + +/* 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. */ -void action_define( defname, value ) -char *defname; -int value; - { - char buf[MAXLINE]; +/* 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 ( (int) strlen( defname ) > MAXLINE / 2 ) - { - format_pinpoint_message( _( "name \"%s\" ridiculously long" ), - defname ); +#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); + if (!sko_stack) + flexfatal(_("allocation of sko_stack failed")); + 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!"); - snprintf( buf, sizeof buf, "#define %s %d\n", defname, value ); - add_action( buf ); + 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); +} -void add_action( new_text ) -char *new_text; - { - int len = strlen( new_text ); +/* 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; + while (len + action_index >= action_size - 10 /* slop */ ) { + int new_size = action_size * 2; - if ( new_size <= 0 ) + if (new_size <= 0) /* Increase just a little, to try to avoid overflow * on 16-bit machines. */ @@ -74,95 +154,71 @@ char *new_text; action_size = new_size; action_array = - reallocate_character_array( action_array, action_size ); - } + reallocate_character_array (action_array, + action_size); + } - strlcpy( &action_array[action_index], new_text, + strlcpy ( &action_array[action_index], new_text, action_size - action_index ); 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; - { +void *allocate_array (size, element_size) + int size; + size_t element_size; +{ void *mem; - size_t num_bytes = element_size * size; + size_t num_bytes = element_size * size; - mem = flex_alloc( num_bytes ); - if ( ! mem ) - flexfatal( - _( "memory allocation failed in allocate_array()" ) ); + 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 ) -char *str; - { - while ( *str ) - { - if ( ! isascii( (Char) *str ) || ! islower( (Char) *str ) ) +int all_lower (str) + char *str; +{ + while (*str) { + if (!isascii ((Char) * str) || !islower ((Char) * str)) return 0; ++str; - } + } return 1; - } +} /* all_upper - true if a string is all upper-case */ -int all_upper( str ) -char *str; - { - while ( *str ) - { - if ( ! isascii( (Char) *str ) || ! isupper( (Char) *str ) ) +int all_upper (str) + char *str; +{ + while (*str) { + if (!isascii ((Char) * str) || !isupper ((Char) * 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 - */ +/* intcmp - compares two integers for use by qsort. */ -void bubble( v, n ) -int v[], n; - { - 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; - } - } +int intcmp (const void *a, const void *b) +{ + return *(const int *) a - *(const int *) b; +} /* check_char - checks a character to make sure it's within the range @@ -170,328 +226,304 @@ int v[], n; * 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 ) ); - } +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 ) -int c; - { - return (Char) ((isascii( c ) && isupper( c )) ? tolower( c ) : c); - } +Char clower (c) + 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 ) -const char *str; - { +char *copy_string (str) + const char *str; +{ const char *c1; char *c2; - char *copy; + char *copy; unsigned int size; /* find length */ - for ( c1 = str; *c1; ++c1 ) - ; + for (c1 = str; *c1; ++c1) ; + + size = (c1 - str + 1) * sizeof (char); - size = (c1 - str + 1) * sizeof( char ); - copy = (char *) flex_alloc( size ); + copy = (char *) flex_alloc (size); - if ( copy == NULL ) - flexfatal( _( "dynamic memory failure in copy_string()" ) ); + if (copy == NULL) + flexfatal (_("dynamic memory failure in copy_string()")); - for ( c2 = copy; (*c2++ = *str++) != 0; ) - ; + 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 ) -Char *str; - { +Char *copy_unsigned_string (str) + Char *str; +{ Char *c; - Char *copy; + Char *copy; /* find length */ - for ( c = str; *c; ++c ) - ; + for (c = str; *c; ++c) ; - copy = allocate_Character_array( c - str + 1 ); + copy = allocate_Character_array (c - str + 1); - for ( c = copy; (*c++ = *str++) != 0; ) - ; + 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 - */ +/* cclcmp - compares two characters for use by qsort with '\0' sorting last. */ -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; - } - } +int cclcmp (const void *a, const void *b) +{ + if (!*(const Char *) a) + return 1; + else + if (!*(const Char *) b) + return - 1; + else + return *(const Char *) a - *(const Char *) b; +} /* dataend - finish up a block of data declarations */ -void dataend() - { - if ( datapos > 0 ) - dataflush(); +void dataend () +{ + /* short circuit any output */ + if (gentables) { - /* add terminator for initialization; { for vi */ - outn( " } ;\n" ); + 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' ); +void dataflush () +{ + /* short circuit any output */ + if (!gentables) + return; + + outc ('\n'); - if ( ++dataline >= NUMDATALINES ) - { + 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' ); + 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 ); - } +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 ); - } +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[]; - { +int htoi (str) + Char str[]; +{ unsigned int result; - (void) sscanf( (char *) str, "%x", &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) snprintf( errmsg, sizeof errmsg, msg, arg ); - flexerror( errmsg ); - } +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]; +void lerrsf (msg, arg) + const char *msg, arg[]; +{ + char errmsg[MAXLINE]; - (void) snprintf( errmsg, sizeof errmsg, msg, arg ); - flexerror( errmsg ); - } + snprintf (errmsg, sizeof(errmsg)-1, msg, arg); + errmsg[sizeof(errmsg)-1] = 0; /* ensure NULL termination */ + flexerror (errmsg); +} + + +/* lerrsf_fatal - as lerrsf, but call flexfatal */ + +void lerrsf_fatal (msg, arg) + const char *msg, arg[]; +{ + char errmsg[MAXLINE]; + + snprintf (errmsg, sizeof(errmsg)-1, msg, arg); + errmsg[sizeof(errmsg)-1] = 0; /* ensure NULL termination */ + flexfatal (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"; +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 ) + 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 : "M4_YY_OUTFILE_NAME"; - s1 = do_infile ? infilename : outfilename; + if (do_infile && !s1) + s1 = "<stdin>"; + s2 = filename; - s3 = &filename[sizeof( filename ) - 2]; + s3 = &filename[sizeof (filename) - 2]; - while ( s2 < s3 && *s1 ) - { - if ( *s1 == '\\' ) + 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 (do_infile) + snprintf (directive, sizeof(directive), line_fmt, linenum, filename); + else { + snprintf (directive, sizeof(directive), line_fmt, 0, 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 ); + 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() - { +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() - { +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(); - } +void mk2data (value) + int value; +{ + /* short circuit any output */ + if (!gentables) + return; - if ( datapos == 0 ) + if (datapos >= NUMDATAITEMS) { + outc (','); + dataflush (); + } + + if (datapos == 0) /* Indent. */ - out( " " ); + out (" "); else - outc( ',' ); + outc (','); ++datapos; - out_dec( "%5d", value ); - } + out_dec ("%5d", value); +} /* mkdata - generate a data statement @@ -499,76 +531,87 @@ int value; * Generates a data statement initializing the current array element to * "value". */ -void mkdata( value ) -int value; - { - if ( datapos >= NUMDATAITEMS ) - { - outc( ',' ); - dataflush(); - } +void mkdata (value) + int value; +{ + /* short circuit any output */ + if (!gentables) + return; - if ( datapos == 0 ) + if (datapos >= NUMDATAITEMS) { + outc (','); + dataflush (); + } + + if (datapos == 0) /* Indent. */ - out( " " ); + out (" "); else - outc( ',' ); + outc (','); ++datapos; - out_dec( "%5d", value ); - } + out_dec ("%5d", value); +} /* myctoi - return the integer represented by a string of digits */ -int myctoi( array ) -char array[]; - { - int val = 0; +int myctoi (array) + const char *array; +{ + int val = 0; - (void) sscanf( array, "%d", &val ); + (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'; - -#ifdef __STDC__ - case 'a': return '\a'; - case 'v': return '\v'; +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'; + 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] ) ) + 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 ... @@ -578,19 +621,19 @@ Char array[]; c = array[sptr]; array[sptr] = '\0'; - esc_char = otoi( array + 1 ); + esc_char = otoi (array + 1); array[sptr] = c; return esc_char; - } + } - case 'x': - { /* \x<hex> */ - int sptr = 2; + case 'x': + { /* \x<hex> */ + int sptr = 2; - while ( isascii( array[sptr] ) && - isxdigit( array[sptr] ) ) + while (isascii (array[sptr]) && + isxdigit (array[sptr])) /* Don't increment inside loop control * because if isdigit() is a macro it might * expand into multiple increments ... @@ -600,119 +643,104 @@ Char array[]; c = array[sptr]; array[sptr] = '\0'; - esc_char = htoi( array + 2 ); + esc_char = htoi (array + 2); array[sptr] = c; return esc_char; - } - - default: - return array[1]; } + + default: + return array[1]; } +} /* otoi - convert an octal digit string to an integer value */ -int otoi( str ) -Char str[]; - { +int otoi (str) + Char str[]; +{ unsigned int result; - (void) sscanf( (char *) str, "%o", &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[]; - { - 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; - } +void out (str) + const char *str; +{ + fputs (str, stdout); +} + +void out_dec (fmt, n) + const char *fmt; + int n; +{ + fprintf (stdout, fmt, n); +} + +void out_dec2 (fmt, n1, n2) + const char *fmt; + int n1, n2; +{ + fprintf (stdout, fmt, n1, n2); +} + +void out_hex (fmt, x) + const char *fmt; + unsigned int x; +{ + fprintf (stdout, fmt, x); +} + +void out_str (fmt, str) + const char *fmt, str[]; +{ + fprintf (stdout,fmt, str); +} + +void out_str3 (fmt, s1, s2, s3) + const char *fmt, s1[], s2[], s3[]; +{ + fprintf (stdout,fmt, s1, s2, s3); +} + +void out_str_dec (fmt, str, n) + const char *fmt, str[]; + int n; +{ + fprintf (stdout,fmt, str, n); +} + +void outc (c) + int c; +{ + fputc (c, stdout); +} + +void outn (str) + const char *str; +{ + fputs (str,stdout); + fputc('\n',stdout); +} + +/** 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 human-readable form of a character @@ -720,62 +748,65 @@ const char str[]; * The returned string is in static storage. */ -char *readable_form( c ) -int c; - { +char *readable_form (c) + 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"; - -#ifdef __STDC__ - case '\a': return "\\a"; - case '\v': return "\\v"; + 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: - (void) snprintf( rform, sizeof rform, - "\\%.3o", (unsigned int) c ); - return rform; - } + default: + snprintf (rform, sizeof(rform), "\\%.3o", (unsigned int) c); + return rform; } + } - else if ( c == ' ' ) + else if (c == ' ') return "' '"; - else - { + 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; - { +void *reallocate_array (array, size, element_size) + void *array; + int size; + size_t element_size; +{ void *new_array; - size_t num_bytes = element_size * size; + size_t num_bytes = element_size * size; - new_array = flex_realloc( array, num_bytes ); - if ( ! new_array ) - flexfatal( _( "attempt to increase array size failed" ) ); + 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 @@ -784,56 +815,129 @@ size_t element_size; * 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; +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) ) - { /* 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" ) ); - } + 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); } - else if ( do_copy ) - { - if ( skelfile ) - /* Skeleton file reads include final - * newline, skel[] array does not. - */ - out( buf ); - else - outn( 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 @@ -842,39 +946,43 @@ void skelout() * 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 ); +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 (datapos >= 79 - TRANS_STRUCT_PRINT_LENGTH) { + outc ('\n'); - if ( ++dataline % 10 == 0 ) - 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 ); +void *yy_flex_xmalloc (size) + int size; +{ + void *result = flex_alloc ((size_t) size); - if ( ! result ) - flexfatal( - _( "memory allocation failed in yy_flex_xmalloc()" ) ); + if (!result) + flexfatal (_ + ("memory allocation failed in yy_flex_xmalloc()")); return result; - } +} /* zero_out - set a region of memory to 0 @@ -882,15 +990,37 @@ int size; * 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; - { +void zero_out (region_ptr, size_in_bytes) + char *region_ptr; + size_t size_in_bytes; +{ char *rp, *rp_end; rp = region_ptr; rp_end = region_ptr + size_in_bytes; - while ( rp < rp_end ) + 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/usr.bin/lex/mkskel.sh b/usr.bin/lex/mkskel.sh index 59f1a53808a..9a8b02e1fed 100644 --- a/usr.bin/lex/mkskel.sh +++ b/usr.bin/lex/mkskel.sh @@ -1,6 +1,26 @@ #! /bin/sh -# $OpenBSD: mkskel.sh,v 1.2 1996/06/26 05:35:39 deraadt Exp $ +# $OpenBSD: mkskel.sh,v 1.3 2015/11/19 19:43:40 tedu Exp $ +# 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 */ @@ -10,7 +30,7 @@ cat <<! const char *skel[] = { ! -sed 's/\\/&&/g' $* | sed 's/"/\\"/g' | sed 's/.*/ "&",/' +sed 's/\\/&&/g' | sed 's/"/\\"/g' | sed 's/.*/ "&",/' cat <<! 0 diff --git a/usr.bin/lex/nfa.c b/usr.bin/lex/nfa.c index bbf3d8d6bf7..f92f7fa9b86 100644 --- a/usr.bin/lex/nfa.c +++ b/usr.bin/lex/nfa.c @@ -1,47 +1,45 @@ -/* $OpenBSD: nfa.c,v 1.9 2003/06/04 17:34:44 millert Exp $ */ +/* $OpenBSD: nfa.c,v 1.10 2015/11/19 19:43:40 tedu Exp $ */ /* 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, 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. - */ +/* 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: /cvs/OpenBSD/src/usr.bin/lex/nfa.c,v 1.9 2003/06/04 17:34:44 millert 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 @@ -49,25 +47,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 @@ -81,31 +79,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" @@ -114,26 +113,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 * @@ -152,32 +150,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; @@ -187,7 +183,7 @@ int mach; lastst[init] = lastst[mach] + state_offset; return init; - } +} /* finish_rule - finish up the processing for a rule @@ -202,12 +198,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. @@ -217,70 +214,88 @@ 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]; - snprintf( action_text, sizeof 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 ) - { - snprintf( action_text, sizeof action_text, - "%s = %s + %d;\n", - scanner_cp, scanner_bp, headcnt ); - add_action( action_text ); + 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) { + if (rule_has_nl[num_rules]) { + snprintf (action_text, sizeof(action_text), + "YY_LINENO_REWIND_TO(%s + %d);\n", scanner_bp, headcnt); + add_action (action_text); } + 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 ); + else { + if (rule_has_nl[num_rules]) { + snprintf (action_text, sizeof(action_text), + "YY_LINENO_REWIND_TO(yy_cp - %d);\n", trailcnt); + add_action (action_text); } - add_action( - "YY_DO_BEFORE_ACTION; /* set up yytext again */\n" ); + 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 @@ -299,25 +314,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 @@ -327,36 +341,32 @@ int first, last; * The "beginning" states are the epsilon closure of the first state */ -void mark_beginning_as_normal( mach ) -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; +void mark_beginning_as_normal (mach) + 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; - default: - flexerror( - _( "bad state type in mark_beginning_as_normal()" ) ); - break; + 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 @@ -373,24 +383,24 @@ 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 @@ -401,11 +411,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 @@ -422,28 +432,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 @@ -460,56 +469,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 @@ -520,24 +525,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 @@ -549,39 +552,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 ) ) ); - } - - else - { - tail = mkstate( SYM_EPSILON ); + if (ub == INFINITE_REPEAT) { + copy = dupmachine (mach); + mach = link_machines (mach, + link_machines (base_mach, + mkclos (copy))); + } - for ( i = lb; i < ub; ++i ) - { - copy = dupmachine( mach ); - tail = mkopt( link_machines( copy, tail ) ); - } + else { + tail = mkstate (SYM_EPSILON); - 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 * @@ -599,30 +602,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; @@ -643,28 +647,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 @@ -677,42 +679,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/usr.bin/lex/options.c b/usr.bin/lex/options.c new file mode 100644 index 00000000000..3c6f1a01523 --- /dev/null +++ b/usr.bin/lex/options.c @@ -0,0 +1,282 @@ +/* $OpenBSD: options.c,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* 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/usr.bin/lex/options.h b/usr.bin/lex/options.h new file mode 100644 index 00000000000..49dd97383f5 --- /dev/null +++ b/usr.bin/lex/options.h @@ -0,0 +1,136 @@ +/* $OpenBSD: options.h,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* 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/usr.bin/lex/parse.y b/usr.bin/lex/parse.y index 76440edc2f5..090f0d4fb19 100644 --- a/usr.bin/lex/parse.y +++ b/usr.bin/lex/parse.y @@ -1,106 +1,107 @@ -/* $OpenBSD: parse.y,v 1.8 2003/06/04 17:34:44 millert Exp $ */ +/* $OpenBSD: parse.y,v 1.9 2015/11/19 19:43:40 tedu Exp $ */ /* 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. - * - * 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. +%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. * - * 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: /cvs/OpenBSD/src/usr.bin/lex/parse.y,v 1.8 2003/06/04 17:34:44 millert 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') @@ -130,7 +131,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 ); @@ -157,7 +158,7 @@ sect1 : sect1 startconddecl namelist1 | sect1 options | | error - { synerr( "unknown error processing section 1" ); } + { synerr( _("unknown error processing section 1") ); } ; sect1end : SECTEND @@ -182,7 +183,7 @@ namelist1 : namelist1 NAME { scinstal( nmstr, xcluflg ); } | error - { synerr( "bad start condition list" ); } + { synerr( _("bad start condition list") ); } ; options : OPTION_OP optionlist @@ -197,10 +198,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' @@ -227,7 +234,7 @@ flexrule : '^' rule { pat = $2; finish_rule( pat, variable_trail_rule, - headcnt, trailcnt ); + headcnt, trailcnt , previous_continued_action); if ( scon_stk_ptr > 0 ) { @@ -263,7 +270,7 @@ flexrule : '^' rule { pat = $1; finish_rule( pat, variable_trail_rule, - headcnt, trailcnt ); + headcnt, trailcnt , previous_continued_action); if ( scon_stk_ptr > 0 ) { @@ -307,7 +314,7 @@ flexrule : '^' rule } | error - { synerr( "unrecognized rule" ); } + { synerr( _("unrecognized rule") ); } ; scon_stk_ptr : @@ -343,7 +350,7 @@ namelist2 : namelist2 ',' sconname | sconname | error - { synerr( "bad start condition list" ); } + { synerr( _("bad start condition list") ); } ; sconname : NAME @@ -399,6 +406,7 @@ rule : re2 re /* Mark as variable. */ varlength = true; headcnt = 0; + } if ( lex_compat || (varlength && headcnt == 0) ) @@ -425,7 +433,7 @@ rule : re2 re } | re2 re '$' - { synerr( "trailing context used twice" ); } + { synerr( _("trailing context used twice") ); } | re '$' { @@ -438,7 +446,7 @@ rule : re2 re if ( trlcontxt ) { - synerr( "trailing context used twice" ); + synerr( _("trailing context used twice") ); $$ = mkstate( SYM_EPSILON ); } @@ -507,7 +515,7 @@ re2 : re '/' */ if ( trlcontxt ) - synerr( "trailing context used twice" ); + synerr( _("trailing context used twice") ); else trlcontxt = true; @@ -536,6 +544,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 '*' @@ -557,13 +628,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 @@ -573,7 +644,7 @@ singleton : singleton '*' if ( $5 <= 0 ) { synerr( - "bad iteration values" ); + _("bad iteration values") ); $$ = $1; } else @@ -585,21 +656,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 @@ -609,7 +680,7 @@ singleton : singleton '*' if ( $3 <= 0 ) { - synerr( "iteration value must be positive" ); + synerr( _("iteration value must be positive") ); $$ = $1; } @@ -623,31 +694,40 @@ 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 ); + + /* Create the (?s:'.') character class. */ + cclany = cclinit(); + cclnegate( cclany ); - if ( useecs ) - mkeccl( ccltbl + cclmap[anyccl], - ccllen[anyccl], nextecm, - ecgroup, csize, csize ); + 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. + /* Sort characters for fast searching. */ - cshell( ccltbl + cclmap[$1], ccllen[$1], true ); + qsort( ccltbl + cclmap[$1], ccllen[$1], sizeof (*ccltbl), cclcmp ); if ( useecs ) mkeccl( ccltbl + cclmap[$1], ccllen[$1], @@ -655,6 +735,9 @@ singleton : singleton '*' ++rulelen; + if (ccl_has_nl[$1]) + rule_has_nl[num_rules] = true; + $$ = mkstate( -$1 ); } @@ -662,6 +745,9 @@ singleton : singleton '*' { ++rulelen; + if (ccl_has_nl[$1]) + rule_has_nl[num_rules] = true; + $$ = mkstate( -$1 ); } @@ -675,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 ']' { @@ -694,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 { @@ -715,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; @@ -722,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; } @@ -746,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_NEG_EXPR(islower); + } + | CCE_NEG_UPPER { + if ( sf_case_ins() ) + warn(_("[:^upper:] ambiguous in case insensitive scanner")); else - CCL_EXPR(isupper) + 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, $$); } | @@ -788,7 +955,7 @@ string : string CHAR void build_eof_action() { - register int i; + int i; char action_text[MAXLINE]; for ( i = 1; i <= scon_stk_ptr; ++i ) @@ -801,8 +968,11 @@ void build_eof_action() else { sceof[scon_stk[i]] = true; - snprintf( action_text, sizeof action_text, - "case YY_STATE_EOF(%s):\n", + + if (previous_continued_action /* && previous action was regular */) + add_action("YY_RULE_SETUP\n"); + + snprintf( action_text, sizeof(action_text), "case YY_STATE_EOF(%s):\n", scname[scon_stk[i]] ); add_action( action_text ); } @@ -823,11 +993,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) snprintf( errmsg, sizeof errmsg, msg, arg ); + (void) snprintf( errmsg, sizeof(errmsg), msg, arg ); synerr( errmsg ); } @@ -835,7 +1005,7 @@ char msg[], arg[]; /* synerr - report a syntax error */ void synerr( str ) -char str[]; +const char *str; { syntaxerror = true; pinpoint_message( str ); @@ -845,11 +1015,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) snprintf( warn_msg, sizeof warn_msg, msg, arg ); + snprintf( warn_msg, sizeof(warn_msg), msg, arg ); warn( warn_msg ); } @@ -857,7 +1027,7 @@ char msg[], arg[]; /* warn - report a warning, unless -w was given */ void warn( str ) -char str[]; +const char *str; { line_warning( str, linenum ); } @@ -867,11 +1037,11 @@ char str[]; */ void format_pinpoint_message( msg, arg ) -char msg[], arg[]; +const char *msg, arg[]; { char errmsg[MAXLINE]; - (void) snprintf( errmsg, sizeof errmsg, msg, arg ); + snprintf( errmsg, sizeof(errmsg), msg, arg ); pinpoint_message( errmsg ); } @@ -879,7 +1049,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 ); } @@ -888,14 +1058,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 ) { - snprintf( warning, sizeof warning, "warning, %s", str ); + snprintf( warning, sizeof(warning), "warning, %s", str ); line_pinpoint( warning, line ); } } @@ -904,10 +1074,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 ); } @@ -916,6 +1086,6 @@ int line; */ void yyerror( msg ) -char msg[]; +const char *msg; { } diff --git a/usr.bin/lex/regex.c b/usr.bin/lex/regex.c new file mode 100644 index 00000000000..4144231b416 --- /dev/null +++ b/usr.bin/lex/regex.c @@ -0,0 +1,174 @@ +/* $OpenBSD: regex.c,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/** 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, *rxerr; + + errbuf = (char*)flex_alloc(errbuf_sz *sizeof(char)); + if (!errbuf) + flexfatal(_("Unable to allocate buffer to report regcomp")); + rxerr = (char*)flex_alloc(errbuf_sz *sizeof(char)); + if (!rxerr) + flexfatal(_("Unable to allocate buffer for regerror")); + regerror (err, preg, rxerr, errbuf_sz); + snprintf (errbuf, errbuf_sz, "regcomp for \"%s\" failed: %s", regex, rxerr); + + flexfatal (errbuf); + free(errbuf); + free(rxerr); + } +} + +/** 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)); + if (!str) + flexfatal(_("Unable to allocate a copy of the match")); + 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/usr.bin/lex/scan.l b/usr.bin/lex/scan.l index 8f0fa2d2789..6c84a80f73c 100644 --- a/usr.bin/lex/scan.l +++ b/usr.bin/lex/scan.l @@ -1,43 +1,44 @@ -/* $OpenBSD: scan.l,v 1.9 2006/12/06 05:03:29 ray Exp $ */ +/* $OpenBSD: scan.l,v 1.10 2015/11/19 19:43:40 tedu Exp $ */ -/* scan.l - scanner for flex input */ +/* 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. - * - * 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: /cvs/OpenBSD/src/usr.bin/lex/scan.l,v 1.9 2006/12/06 05:03:29 ray Exp $ */ +/* 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) \ @@ -46,6 +47,17 @@ 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 \ @@ -56,7 +68,15 @@ return CHAR; #define RETURNNAME \ - strlcpy( nmstr, yytext, sizeof nmstr); \ + if(yyleng < MAXLINE) \ + { \ + strlcpy( nmstr, yytext, sizeof nmstr ); \ + } \ + else \ + { \ + synerr(_("Input line too long\n")); \ + FLEX_EXIT(EXIT_FAILURE); \ + } \ return NAME; #define PUT_BACK_STRING(str, start) \ @@ -70,18 +90,27 @@ #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 outfile="scan.c" stack noyy_top_state +%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 +%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:]\n] +NOT_WS [^[:blank:]\r\n] NL \r?\n @@ -94,18 +123,21 @@ ESCSEQ (\\([^\n]|[0-7]{1,3}|x[[:xdigit:]]{1,2})) FIRST_CCL_CHAR ([^\\\n]|{ESCSEQ}) CCL_CHAR ([^\\\n\]]|{ESCSEQ}) -CCL_EXPR ("[:"[[:alpha:]]+":]") +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; - Char nmdef[MAXLINE], myesc(); + int i, brace_depth=0, brace_start_line=0; + Char nmdef[MAXLINE]; <INITIAL>{ @@ -120,6 +152,15 @@ LEXOPT [aceknopr] 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 */ @@ -140,10 +181,20 @@ LEXOPT [aceknopr] ^"%"{LEXOPT}{OPTWS}[[:digit:]]*{OPTWS}{NL} ++linenum; /* ignore */ ^"%"{LEXOPT}{WS}.*{NL} ++linenum; /* ignore */ + /* xgettext: no-c-format */ ^"%"[^sxaceknopr{}].* synerr( _( "unrecognized '%' directive" ) ); ^{NAME} { + if(yyleng < MAXLINE) + { strlcpy( nmstr, yytext, sizeof nmstr ); + } + else + { + synerr( _("Definition name too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } + didadef = false; BEGIN(PICKUPDEF); } @@ -157,8 +208,24 @@ LEXOPT [aceknopr] <COMMENT>{ "*/" ACTION_ECHO; yy_pop_state(); "*" ACTION_ECHO; - [^*\n]+ ACTION_ECHO; - [^*\n]*{NL} ++linenum; 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>{ @@ -176,7 +243,9 @@ LEXOPT [aceknopr] <CODEBLOCK>{ ^"%}".*{NL} ++linenum; BEGIN(INITIAL); - {NAME}|{NOT_NAME}|. ACTION_ECHO; + {M4QSTART} ACTION_ECHO_QSTART; + {M4QEND} ACTION_ECHO_QEND; + . ACTION_ECHO; {NL} { ++linenum; @@ -186,13 +255,53 @@ LEXOPT [aceknopr] } } +<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}.* { - strlcpy( (char *) nmdef, yytext, sizeof nmdef); - + {NOT_WS}[^\r\n]* { + if(yyleng < MAXLINE) + { + strlcpy( (char *) nmdef, yytext, sizeof nmdef ); + } + else + { + format_synerr( _("Definition value for {%s} too long\n"), nmstr); + FLEX_EXIT(EXIT_FAILURE); + } /* Skip trailing whitespace. */ for ( i = strlen( (char *) nmdef ) - 1; i >= 0 && (nmdef[i] == ' ' || nmdef[i] == '\t'); @@ -227,14 +336,21 @@ LEXOPT [aceknopr] align long_align = option_sense; always-interactive { - action_define( "YY_ALWAYS_INTERACTIVE", option_sense ); + 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 caseins = ! option_sense; - caseless|case-insensitive caseins = 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; @@ -249,44 +365,88 @@ LEXOPT [aceknopr] 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_define( "YY_MAIN", option_sense ); - do_yywrap = ! option_sense; + 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_define( "YY_NEVER_INTERACTIVE", option_sense ); + 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_define( "YY_STACK_USED", option_sense ); + stack ACTION_M4_IFDEF( "M4""_YY_STACK_USED", option_sense ); stdinit do_stdinit = option_sense; stdout use_stdout = option_sense; - unput ACTION_IFDEF("YY_NO_UNPUT", ! 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; + 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_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); - + 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]*\" { - strlcpy( nmstr, yytext + 1, sizeof nmstr); - if (nmstr[strlen(nmstr) - 1] == '"') - nmstr[strlen(nmstr) - 1] = '\0'; + if(yyleng-1 < MAXLINE) + { + strlcpy( nmstr, yytext + 1, sizeof nmstr ); + } + else + { + synerr( _("Option line too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } + if (nmstr[strlen( nmstr ) - 1] == '"') + nmstr[strlen( nmstr ) - 1] = '\0'; return NAME; } @@ -318,7 +478,7 @@ LEXOPT [aceknopr] ACTION_ECHO; } - .* ACTION_ECHO; + . ACTION_ECHO; {NL} ++linenum; ACTION_ECHO; <<EOF>> { @@ -338,10 +498,21 @@ LEXOPT [aceknopr] BEGIN(PERCENT_BRACE_ACTION); } - ^{OPTWS}"<" BEGIN(SC); return '<'; + ^{OPTWS}"<" { + /* Allow "<" to appear in (?x) patterns. */ + if (!sf_skip_ws()) + BEGIN(SC); + return '<'; + } ^{OPTWS}"^" return '^'; \" BEGIN(QUOTE); return '"'; - "{"/[[:digit:]] BEGIN(NUM); return '{'; + "{"/[[:digit:]] { + BEGIN(NUM); + if ( lex_compat || posix_compat ) + return BEGIN_REPEAT_POSIX; + else + return BEGIN_REPEAT_FLEX; + } "$"/([[:blank:]]|{NL}) return '$'; {WS}"%{" { @@ -355,46 +526,77 @@ LEXOPT [aceknopr] return '\n'; } } - {WS}"|".*{NL} continued_action = true; ++linenum; 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}"/*" { - yyless( yyleng - 2 ); /* put back '/', '*' */ - bracelevel = 0; - continued_action = false; - BEGIN(ACTION); + + 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} /* 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'; - } + 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} { - 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'; - } + 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>>" | @@ -403,18 +605,32 @@ LEXOPT [aceknopr] ^"%%".* { sectnum = 3; BEGIN(SECT3); + outn("/* Begin user sect3 */"); yyterminate(); /* to stop the parser */ } "["({FIRST_CCL_CHAR}|{CCL_EXPR})({CCL_CHAR}|{CCL_EXPR})* { int cclval; - strlcpy( nmstr, yytext, sizeof nmstr); + if(yyleng < MAXLINE) + { + strlcpy( nmstr, yytext, sizeof nmstr ); + } + else + { + synerr( _("Input line too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } /* Check to see if we've already encountered this * ccl. */ - if ( (cclval = ccllookup( (Char *) nmstr )) != 0 ) + 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" ) ); @@ -439,13 +655,31 @@ LEXOPT [aceknopr] return '['; } } + "{-}" return CCL_OP_DIFF; + "{+}" return CCL_OP_UNION; - "{"{NAME}"}" { - register Char *nmdefptr; - Char *ndlookup(); + /* Check for :space: at the end of the rule so we don't + * wrap the expanded regex in '(' ')' -- breaking trailing + * context. + */ + "{"{NAME}"}"[[:space:]]? { + Char *nmdefptr; + int end_is_ws, end_ch; + + end_ch = yytext[yyleng-1]; + end_is_ws = end_ch != '}' ? 1 : 0; + + if(yyleng-1 < MAXLINE) + { strlcpy( nmstr, yytext + 1, sizeof nmstr ); - nmstr[yyleng - 2] = '\0'; /* chop trailing brace */ + } + 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( @@ -455,9 +689,12 @@ LEXOPT [aceknopr] 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] == '$') ) + (len > 0 && nmdefptr[len - 1] == '$') + || (end_is_ws && trlcontxt && !sf_skip_ws())) { /* don't use ()'s after all */ PUT_BACK_STRING((char *) nmdefptr, 0); @@ -474,12 +711,45 @@ LEXOPT [aceknopr] } } + "/*" { + 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 '>'; @@ -505,6 +775,19 @@ LEXOPT [aceknopr] } } +<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 '^'; @@ -536,6 +819,19 @@ LEXOPT [aceknopr] "[: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" ), @@ -551,7 +847,13 @@ LEXOPT [aceknopr] } "," return ','; - "}" BEGIN(SECT2); return '}'; + "}" { + BEGIN(SECT2); + if ( lex_compat || posix_compat ) + return END_REPEAT_POSIX; + else + return END_REPEAT_FLEX; + } . { synerr( _( "bad character inside {}'s" ) ); @@ -584,7 +886,9 @@ LEXOPT [aceknopr] } } - {NAME}|{NOT_NAME}|. ACTION_ECHO; + {M4QSTART} ACTION_ECHO_QSTART; + {M4QEND} ACTION_ECHO_QEND; + . ACTION_ECHO; {NL} { ++linenum; ACTION_ECHO; @@ -605,7 +909,10 @@ LEXOPT [aceknopr] <ACTION>{ "{" ACTION_ECHO; ++bracelevel; "}" ACTION_ECHO; --bracelevel; - [^[:alpha:]_{}"'/\n]+ ACTION_ECHO; + {M4QSTART} ACTION_ECHO_QSTART; + {M4QEND} ACTION_ECHO_QEND; + [^[:alpha:]_{}"'/\n\[\]]+ ACTION_ECHO; + [\[\]] ACTION_ECHO; {NAME} ACTION_ECHO; "'"([^'\\\n]|\\.)*"'" ACTION_ECHO; /* character constant */ \" ACTION_ECHO; BEGIN(ACTION_STRING); @@ -627,16 +934,20 @@ LEXOPT [aceknopr] <ACTION_STRING>{ [^"\\\n]+ ACTION_ECHO; \\. ACTION_ECHO; - {NL} ++linenum; ACTION_ECHO; + {NL} ++linenum; ACTION_ECHO; BEGIN(ACTION); \" ACTION_ECHO; BEGIN(ACTION); . ACTION_ECHO; } -<COMMENT,ACTION,ACTION_STRING><<EOF>> { +<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 ); @@ -649,7 +960,10 @@ LEXOPT [aceknopr] <SECT3>{ - .*(\n?) ECHO; + {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(); } diff --git a/usr.bin/lex/scanflags.c b/usr.bin/lex/scanflags.c new file mode 100644 index 00000000000..a39beb50d89 --- /dev/null +++ b/usr.bin/lex/scanflags.c @@ -0,0 +1,71 @@ +/* $OpenBSD: scanflags.c,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* 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)); + if (!_sf_stk) + lerrsf_fatal(_("Unable to allocate %ld of stack"), + (void *)sizeof(scanflags_t)); + _sf_stk[_sf_top_ix] = 0; +} + +/* vim:set expandtab cindent tabstop=4 softtabstop=4 shiftwidth=4 textwidth=0: */ diff --git a/usr.bin/lex/scanopt.c b/usr.bin/lex/scanopt.c new file mode 100644 index 00000000000..55b464664f4 --- /dev/null +++ b/usr.bin/lex/scanopt.c @@ -0,0 +1,875 @@ +/* $OpenBSD: scanopt.c,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* 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 = (const Char *)(opt->opt_fmt + 2); + s->has_long = 1; + } + else { + pname = (const Char *)(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 ((Char)(*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", + (int)(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/usr.bin/lex/scanopt.h b/usr.bin/lex/scanopt.h new file mode 100644 index 00000000000..523a4e557ab --- /dev/null +++ b/usr.bin/lex/scanopt.h @@ -0,0 +1,134 @@ +/* $OpenBSD: scanopt.h,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* 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/usr.bin/lex/sym.c b/usr.bin/lex/sym.c index 9a9f3b1bb91..0a9e08491ec 100644 --- a/usr.bin/lex/sym.c +++ b/usr.bin/lex/sym.c @@ -1,53 +1,72 @@ -/* $OpenBSD: sym.c,v 1.6 2003/06/04 17:34:44 millert Exp $ */ +/* $OpenBSD: sym.c,v 1.7 2015/11/19 19:43:40 tedu Exp $ */ /* 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, 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. - */ +/* 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. */ -/* $Header: /cvs/OpenBSD/src/usr.bin/lex/sym.c,v 1.6 2003/06/04 17:34:44 millert Exp $ */ +/* 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 + */ -/* declare functions that have forward references */ +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 -int hashfunct PROTO((char[], int)); +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]; -struct hash_entry *ndtbl[NAME_TABLE_HASH_SIZE]; -struct hash_entry *sctbl[START_COND_HASH_SIZE]; -struct hash_entry *ccltab[CCL_HASH_SIZE]; +/* declare functions that have forward references */ + +static int addsym PROTO ((char[], char *, int, hash_table, int)); +static struct hash_entry *findsym PROTO ((const char *sym, + hash_table table, -struct hash_entry *findsym(); + int table_size)); +static int hashfunct PROTO ((const char *, int)); /* addsym - add symbol and definitions to symbol table @@ -55,40 +74,37 @@ struct hash_entry *findsym(); * -1 is returned if the symbol already exists, and the change not made. */ -int addsym( sym, str_def, int_def, table, table_size ) -char sym[]; -char *str_def; -int int_def; -hash_table table; -int table_size; - { - int hash_val = hashfunct( sym, table_size ); +static int addsym (sym, str_def, int_def, table, table_size) + char sym[]; + char *str_def; + int int_def; + hash_table table; + int table_size; +{ + int hash_val = hashfunct (sym, table_size); struct hash_entry *sym_entry = table[hash_val]; struct hash_entry *new_entry; struct hash_entry *successor; - while ( sym_entry ) - { - if ( ! strcmp( sym, sym_entry->name ) ) - { /* entry already exists */ + 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 ) ); + flex_alloc (sizeof (struct hash_entry)); - if ( new_entry == NULL ) - flexfatal( _( "symbol table memory allocation failed" ) ); + if (new_entry == NULL) + flexfatal (_("symbol table memory allocation failed")); - if ( (successor = table[hash_val]) != 0 ) - { + if ((successor = table[hash_val]) != 0) { new_entry->next = successor; successor->prev = new_entry; - } + } else new_entry->next = NULL; @@ -100,24 +116,22 @@ int table_size; table[hash_val] = new_entry; return 0; - } +} /* cclinstal - save the text of a character class */ -void cclinstal( ccltxt, cclnum ) -Char ccltxt[]; -int cclnum; - { +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 ); - } + (void) addsym ((char *) copy_unsigned_string (ccltxt), + (char *) 0, cclnum, ccltab, CCL_HASH_SIZE); +} /* ccllookup - lookup the number associated with character class text @@ -125,75 +139,70 @@ int cclnum; * 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; - } +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 ) -char sym[]; -hash_table table; -int table_size; - { - static struct hash_entry empty_entry = - { +static struct hash_entry *findsym (sym, table, table_size) + 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, - } ; + }; struct hash_entry *sym_entry = - table[hashfunct( sym, table_size )]; - while ( sym_entry ) - { - if ( ! strcmp( sym, sym_entry->name ) ) + 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; } + return &empty_entry; +} /* hashfunct - compute the hash value for "str" and hash size "hash_size" */ -int hashfunct( str, hash_size ) -char str[]; -int hash_size; - { +static int hashfunct (str, hash_size) + const char *str; + int hash_size; +{ int hashval; int locstr; hashval = 0; locstr = 0; - while ( str[locstr] ) - { + 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" ) ); - } +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 @@ -201,27 +210,27 @@ Char 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; - } +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() - { +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 ); - } + 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 @@ -230,31 +239,27 @@ void scextend() * 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 ); +void scinstal (str, xcluflg) + const char *str; + int xcluflg; +{ - if ( ++lastsc >= current_max_scs ) - scextend(); + if (++lastsc >= current_max_scs) + scextend (); - scname[lastsc] = copy_string( str ); + 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 ); + 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 ); + 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 @@ -262,8 +267,8 @@ int xcluflg; * Returns 0 if no such start condition. */ -int sclookup( str ) -char str[]; - { - return findsym( str, sctbl, START_COND_HASH_SIZE )->int_val; - } +int sclookup (str) + const char *str; +{ + return findsym (str, sctbl, START_COND_HASH_SIZE)->int_val; +} diff --git a/usr.bin/lex/tables.c b/usr.bin/lex/tables.c new file mode 100644 index 00000000000..d0322138494 --- /dev/null +++ b/usr.bin/lex/tables.c @@ -0,0 +1,504 @@ +/* $OpenBSD: tables.c,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* 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); +/* XXX Not used +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; +} + + +/* XXX Not Used */ +#if 0 +/** 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; +} +#endif /* Not used */ + +/** 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/usr.bin/lex/tables.h b/usr.bin/lex/tables.h new file mode 100644 index 00000000000..b398b8bafcd --- /dev/null +++ b/usr.bin/lex/tables.h @@ -0,0 +1,87 @@ +/* $OpenBSD: tables.h,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* 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/usr.bin/lex/tables_shared.c b/usr.bin/lex/tables_shared.c new file mode 100644 index 00000000000..2f3ea46cdf8 --- /dev/null +++ b/usr.bin/lex/tables_shared.c @@ -0,0 +1,72 @@ +/* $OpenBSD: tables_shared.c,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +#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/usr.bin/lex/tables_shared.h b/usr.bin/lex/tables_shared.h new file mode 100644 index 00000000000..216fb470572 --- /dev/null +++ b/usr.bin/lex/tables_shared.h @@ -0,0 +1,146 @@ +/* $OpenBSD: tables_shared.h,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +#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/usr.bin/lex/tblcmp.c index f206019a256..7d5e60503ac 100644 --- a/usr.bin/lex/tblcmp.c +++ b/usr.bin/lex/tblcmp.c @@ -1,50 +1,48 @@ -/* $OpenBSD: tblcmp.c,v 1.6 2003/06/04 17:34:44 millert Exp $ */ +/* $OpenBSD: tblcmp.c,v 1.7 2015/11/19 19:43:40 tedu Exp $ */ /* 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, 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. - */ +/* 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. */ -/* $Header: /cvs/OpenBSD/src/usr.bin/lex/tblcmp.c,v 1.6 2003/06/04 17:34:44 millert Exp $ */ +/* 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((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 ((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 @@ -82,11 +80,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 @@ -104,35 +102,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 @@ -141,13 +136,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, @@ -155,58 +149,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 @@ -218,10 +209,10 @@ int state[], statenum, totaltrans, comstate, comfreq; * following call will do nothing. */ - mv2front( minprot ); - } + mv2front (minprot); } } +} /* cmptmps - compress template table entries @@ -232,62 +223,56 @@ int state[], statenum, totaltrans, comstate, comfreq; * classes. */ -void cmptmps() - { - int tmpstorage[CSIZE + 1]; +void cmptmps () +{ + int tmpstorage[CSIZE + 1]; 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[] @@ -297,28 +282,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 () +{ 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 @@ -340,9 +326,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. */ @@ -353,19 +339,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 @@ -374,21 +359,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 @@ -398,19 +380,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) @@ -420,18 +402,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 @@ -439,18 +421,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 () +{ 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. @@ -458,39 +441,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; @@ -499,7 +480,7 @@ void mkdeftbl() tblend += numecs; ++numtemps; - } +} /* mkentry - create base/def and nxt/chk entries for transition array @@ -521,46 +502,42 @@ void mkdeftbl() * state array. */ -void mkentry( state, numchars, statenum, deflink, totaltrans ) -int *state; -int numchars, statenum, deflink, totaltrans; - { +void mkentry (state, numchars, statenum, deflink, totaltrans) + int *state; + int numchars, statenum, deflink, totaltrans; +{ 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 @@ -572,131 +549,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; @@ -706,21 +673,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; @@ -733,60 +700,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 @@ -796,12 +761,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; +{ int i; 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; @@ -821,16 +786,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 @@ -840,21 +804,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 @@ -871,24 +834,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[]; +{ int i, *sp = state, *ep = ext, *protp; 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/version.h b/usr.bin/lex/version.h index abe28b14d45..dca5b65d437 100644 --- a/usr.bin/lex/version.h +++ b/usr.bin/lex/version.h @@ -1,3 +1,3 @@ -/* $OpenBSD: version.h,v 1.4 1996/12/10 22:22:03 millert Exp $ */ +/* $OpenBSD: version.h,v 1.5 2015/11/19 19:43:40 tedu Exp $ */ -#define FLEX_VERSION "2.5.4" +#define FLEX_VERSION VERSION diff --git a/usr.bin/lex/yylex.c b/usr.bin/lex/yylex.c index dd32bf438c2..e50dea258de 100644 --- a/usr.bin/lex/yylex.c +++ b/usr.bin/lex/yylex.c @@ -1,39 +1,37 @@ -/* $OpenBSD: yylex.c,v 1.5 2003/06/04 17:34:44 millert Exp $ */ +/* $OpenBSD: yylex.c,v 1.6 2015/11/19 19:43:40 tedu Exp $ */ /* 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, 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: /cvs/OpenBSD/src/usr.bin/lex/yylex.c,v 1.5 2003/06/04 17:34:44 millert Exp $ */ +/* 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" @@ -42,42 +40,94 @@ /* yylex - scan for a regular expression token */ -int yylex() - { - int toktype; +int yylex () +{ + int toktype; static int beglin = false; extern char *yytext; - if ( eofseen ) + if (eofseen) toktype = EOF; else - toktype = flexscan(); + toktype = flexscan (); - if ( toktype == EOF || toktype == 0 ) - { + if (toktype == EOF || toktype == 0) { eofseen = 1; - if ( sectnum == 1 ) - { - synerr( _( "premature EOF" ) ); + if (sectnum == 1) { + synerr (_("premature EOF")); sectnum = 2; toktype = SECTEND; - } + } else toktype = 0; - } + } - if ( trace ) - { - if ( beglin ) - { - fprintf( stderr, "%d\t", num_rules + 1 ); + 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; - switch ( toktype ) - { + break; + + case NAME: + fprintf (stderr, "'%s'", nmstr); + break; + + case CHAR: + switch (yylval) { case '<': case '>': case '^': @@ -98,126 +148,66 @@ int yylex() 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" ) ); + fprintf (stderr, "\\%c", yylval); break; default: - fprintf( stderr, - _( "*Something Weird* - tok: %d val: %d\n" ), - toktype, yylval ); + 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; - } +} |